LYNCA.AIFoundation 原文返回
原文档案

LYNCA_APP_STORAGE_AND_ACL.md

06_TAXONOMY_AND_DATA/LYNCA_APP_STORAGE_AND_ACL.md

GitHub Foundation10月1日 08:3458a4880

lynca-app 收藏存储与 ACL 映射

核对日期:2026-09-30。依据本地 lynca-app clone 的实际代码,commit 为 fd4380731a341d8d93fcc2fb0f55b107d477e89b;下列源码链接固定到该版本,所引文件与工作区内容一致。本文补齐 D3 的实现映射,记录已有存储与权限,不设计新表、不运行 migration,也不宣称已验证线上数据库。

规范与合同正本仍在 Linear,代码在 GitHub;OCS 提供语义与实现之间的导航。业务对象先读 Ontology、CSM 和 Workflow State Machines。本页的账户资源归属不等于实物所有权、持有人或交易转移证明。

存储位置与键

[lib/accountStore.ts][account-store] 选择后端:配置 LYNCA_ACCOUNT_DATABASE_URL 时用 PostgreSQL;部署环境缺少专用数据库配置时返回 unavailable,不回退到本地 SQLite。非部署环境还可用 DATABASE_URL / POSTGRES_URL;无数据库 URL 时使用 SQLite,路径为 LYNCA_ACCOUNT_SQLITE_PATH 或 .data/lynca-account.sqlite。这些是源码选择规则,实际运行后端待补。下表列出本次收藏与账户映射涉及的键,不是全部运营告警 KV 的清单。

PostgreSQL 表在 lynca_account schema,SQLite 表名不带 schema;两者都有 kv(k, v, updated_at)。k = kind + ":" + id,v 是文本,JSON 内容由业务代码序列化,updated_at 是服务器毫秒时间。数据库不单独为每个藏品建表,也没有把下列 JSON 字段展开为 SQL 列。见 [lib/accountPostgresStore.ts][account-postgres]。

实体 / 用途kv.k 或存储位置格式与隔离单位
收藏索引private_collection_v1:<userId>{version: 1, items: CollectionRecord[]};账户独立
藏品生命记录collectible_life_v1:<userId>{version: 1, items: CollectibleLife[]};账户独立,按 Studio session 找记录
显式偏好记忆collector_preferences_v1:<userId>{version: 1, items: CollectorMemory[]};账户独立
Chat workspacechat:<userId>{version: 2, currentId, threads};账户独立
Chat 浏览器缓存lynca-chat-session-v1:<userId>同一 workspace;chatStorageForUser 包装 Storage 接口。无 userId 时 helper 不加后缀,不能把客户端缓存当服务端 ACL
回答反馈private_chat_feedback_v1:<userId>/<threadId>{version: 1, items: ChatFeedback[]};账户和 thread 双重限定
Studio 身份回执缓存studio-identity:<studioSessionId>IdentifyReceipt JSON,另有进程内 Map;键本身不含账户,读取调用方先检查 session 归属
查价缓存card-market:v9:<hash>hash 为 [userId, query] JSON 的 SHA-256;值为 {at, snapshot}
邀请码缓存invite-code:<userId>邀请码文本;供同一账户重取其未用完的邀请码,不是藏品数据

收藏、生命记录、偏好和反馈使用数据库 compare-and-swap(CAS)更新整个 JSON 文档,最多重试 8 次。损坏的 v1 文档报 saved_work_unavailable,不以空文档覆盖;每条业务记录另有 revision。Chat workspace 使用同一 CAS 并合并内容,损坏的已有文档不覆盖。来源:[collectionStore.ts][collection-store]、[collectibleLife.ts][life]、[chatFeedback.ts][feedback]、[accountService.ts][account-service]。

以下“必有”指当前代码创建的记录必有该字段;“可空”指字段保留但值可为 null;“可省略”指类型中的 ?。创建请求可选不代表存储字段可省略。旧记录的兼容读法另列,时间值除另注外均为毫秒数字。

收藏索引:CollectionRecord

字段定义见 [collectionTypes.ts][collection-types],创建、校验与更新见 [collectionStore.ts][collection-store]。

字段存储要求创建输入、默认值与含义
id必有 string服务器 UUID,不接受客户端指定
studioSessionId必有 string创建必填,先验证当前账户拥有该 session;创建后不可 PATCH
title必有 string创建可省略,默认「未命名藏品」;非空,最多 240 字符。是用户命名,不是已确认身份
tags必有 string[]创建可省略,默认 [];最多 20 项,每项非空且最多 40 字符,去重
notes必有 string创建可省略,默认 "";最多 4,000 字符,可空字符串
archived必有 boolean创建为 false;DELETE 收藏实际写 true,保留记录,可 PATCH 解除归档
chatThreadId可空 string创建可省略,默认 null;只做资源 ID 格式检查,没有检查 thread 是否存在
selectedDeliveryVersionIds必有 string[]创建为 [],最多 12 个不重复 ID;交付版本由 service 验证
selectedDeliveryVersionId可空 string旧客户端兼容字段,等于上方数组最后一项或 null;旧文档只有单值时读成数组,不改 revision、不做 migration
metadataSource必有常量"user_declared";收藏索引的文字不是实物证据
revision必有 number初始 1,PATCH / 归档需 expectedRevision 正整数且与当前值相同,成功后加 1
createdAt、updatedAt必有 number服务器生成;创建同值,修改只更新 updatedAt

同一账户、同一 studioSessionId 重复创建返回已有索引;每账户最多 2,000 条。列表按 updatedAt 倒序,包含已归档记录。详情和修改还会校验 Studio session 归属,列表只是读取该账户自己的 JSON。

交付选择在 [collectionService.ts][collection-service] 核对当前 Runtime session 的版本:必须 approved、kept 或列在 kept_versions。新版本替换与其 source_asset_ids 重叠的已有选择,保留其他原图面的选择;缺少旧 lineage 不推断重叠。单值和数组不能同时提交。CollectionDetail 的 session 可为 null;Runtime 不可用时可带 runtimeUnavailable: true,并保留账户记录;collectible 是生命记录投影,旧索引可没有。

藏品生命记录:CollectibleLife

[collectibleLife.ts][life] 保存候选、修正、证据、媒体引用和记忆;[collectibleIdentity.ts][identity] 计算当前身份。每账户最多 2,000 条,同一账户按 studioSessionId 复用一条记录。

字段存储要求含义与初始值
id必有 string服务器 UUID
stage必有 enumcandidate / model / digital_asset;读时依据修正与接受时间重新计算
studioSessionId必有 string创建及写操作校验账户归属
collectionId、chatThreadId可空 string初始 null;关联索引 / 会话。collectionId 已绑定后遇到不同值报 context_mismatch;这些 JSON 引用不是数据库外键
candidates、corrections、evidence、media、memory必有数组初始 [];子记录字段见下表
representationAcceptedAt可空 number初始 null,只有用户接受当前表示时写入;旧记录缺失时读为 null
revision、createdAt、updatedAt必有 number初始 revision 1;变化时 revision 加 1。修正 / 接受使用生命记录的 expectedRevision,不是收藏索引的 revision

所有子记录都有必有 id: string(服务器 UUID)和 recordedAt: number。其余字段如下;可空字段仍保留键。

子实体其他字段与要求来源与容量
CollectibleCandidate必有 source: "listing_identify"、claims: Record<string,string>、unresolved: string[]、reviewRequired: boolean、state: string;runId、title 可空来自识别回执,保留历史候选,最多 20 条;title 最多 240,claims 最多 24 项,键最多 80 / 值最多 240 字符,排除 title;unresolved 最多 24 项
CollectibleCorrection必有 field: string、value: string人工修正,field 非空最多 80,value 最多 500,可空字符串;最多 40 条;不删除原候选
CollectibleEvidence必有 kind: "listing_candidate" / "user_correction"、field: string、value: string、sourceId: stringsourceId 指向候选或修正 ID,最多 80 条;不是图像字节,也不自行证明真伪
CollectibleMediaRef必有 role: "original" / "generated" / "revision"、runtimeId: string;parentRuntimeId 可空原图指向 asset,生成 / 修订指向 version;有 parent 的版本记为 revision。按 runtimeId 去重,最多 48 条;session 观察到上限停止追加,显式写入到上限报错
CollectibleMemoryEvent必有 kind: "conversation" / "user_story" / "correction" / "recognition"、ref: string、text: string、becomesTruth: false最多 80 条;故事 / 对话文字截至 500 字符。收藏名、notes、tags 与 thread 关联可留下事件,但不成为身份事实

候选记录使用固定 source 标签,不等于所有回执都由服务端直接从 Listing 获取:当前 [/api/account/collectible][route-collectible] 接受通过结构检查的客户端 identifyReceipt,Studio messages 也可接收该回执。它们仍是候选,不能据标签升级为原图事实;[studioIdentityProxy.ts][identity-proxy] 的回执缓存与 [listingIdentifyReceipt.ts][receipt] 的格式另读。

当前身份从最后一个候选开始,依次应用人工修正;修正值为空时清除对应 claim(title 变 null),原候选继续保留。被修正的字段从当前 unresolved 列表中移出;ResolvedCollectibleIdentity 是计算结果,不另存一套表,字段为 stage、可空 title、claims、unresolved、correctedFields、可空 candidateId。

有接受时间则 stage 为 digital_asset,否则有修正为 model,其余为 candidate。接受要求尚未接受、至少一个候选或修正、至少一条 evidence;不要求所有 unresolved 消失,也不把聊天记忆、生成图或接受动作当成实物确权、真伪或评级证明。

显式偏好与对话

CollectorMemory

字段来自 [collectionTypes.ts][collection-types],授权与撤回逻辑来自 [collectionStore.ts][collection-store]。

字段要求与含义
id、revision、createdAt、updatedAt必有;UUID、初始 revision 1、服务器时间
text必有 string;创建必填非空,最多 500 字符;撤回后清为 ""
scope必有 chat / studio / both;创建必填
source、consent必有常量 user_preference、explicit;创建与修改请求必须 consent: true
consentedAt必有 number;创建 / 修改时记录明确同意时间
revokedAt可空 number;初始 null,撤回时写时间,保留标记,不能 PATCH 恢复

最多 100 条未撤回偏好。修改 / 撤回要 expectedRevision;DELETE 不要求重新 consent。读取列表保留撤回标记;实际注入 Chat / Studio 只取未撤回且 scope 匹配的条目,最多取前 8 条。来源:[collectorContext.ts][collector-context]。偏好只指导表达与呈现,不改卡片事实;它不同于生命记录里的 memory 数组。

ChatWorkspace 与 ChatThread

[chatSessionStore.ts][chat-store] 同时用于浏览器缓存与账户服务端合并。Workspace 必有 version: 2、currentId: string、threads: ChatThread[];旧 {version: 1, messages} 读取为 v2,不做数据库 migration。

ChatThread 字段要求与含义
id、title、updatedAt、messages类型必有 string、string、number、unknown[];messages 保留原消息结构,不在此发明新的 message schema
deletedAt可省略 number;删除标记;没有 undelete,跨端合并不能恢复被删消息
context可省略;内部 studioSessionId、collectionId、collectibleTitle 都是可省略 string,存引用与显示名,不存原图字节
draft、pinned可省略 string / boolean
contextUpdatedAt、draftUpdatedAt、pinnedUpdatedAt可省略 number;分别决定各字段合并时的新旧

当前 parser 只过滤有 string ID 与消息数组的 threads,不做全部类型字段的逐项 schema 校验;账户写入还要求 updatedAt 为有限数、输入和合并后 JSON 各不超过 1,500,000 字符。消息按 ID 追加与合并较完整的 stream 版本;deleted tombstone 优先,合并时清除消息、title、draft、context 和 pin。此格式不提供恢复删除的动作。

保存 Chat context 与收藏 chatThreadId 不等于已验证关联对象的所有权。实际使用 collectionId / studioSessionId 构建模型上下文时,App 服务端重新按登录账户读取并验证,拒绝不匹配的 collection 与 session;客户端不能提供可信私人事实。见 [collectorContext.ts][collector-context] 和 [app/api/runtime/chat/route.ts][runtime-chat]。

回答反馈与查价缓存

[chatFeedbackTypes.ts][feedback-types] 的记录必有 threadId、messageId、rating(helpful / not_helpful / null)、note、revision、createdAt、updatedAt。新增请求需 expectedRevision: 0,修改需当前 revision,相同内容幂等返回已有记录;note 输入可省略、最多 1,000 字符,rating 清为 null 时 note 清空。必须是本账户未删除的 thread,message 必须是已存的 assistant 消息。反馈不是收藏事实,也不是保存偏好的同意。见 [chatFeedback.ts][feedback]。

查价缓存键由 [cardMarketCache.ts][market-cache] 绑定 userId 和完整 query。值必有 at 与 snapshot;snapshot 字段由 [cardMarket.ts][market-types] 定义:必有 ok、query、可空 title、currency: "USD"、sourceName、searchUrl、soldSearchUrl、jumps、windows(d7 / d30)、asking、可空 lastSold、sources,detail 可省略。窗口存 days、count、可空 low / median / high 和 points;来源保留名称、标签、URL、可空价格与日期、币种和 kind。成功缓存 20 分钟、失败缓存 5 分钟;它是查价结果缓存,不改身份、品相或所有权。见 [/api/account/card-market][route-market]。

账户表与归属

两种后端的字段对应同一 AccountStore API;PostgreSQL 时间 / counter 等数值多用 BIGINT,SQLite 用 INTEGER。SQL 可空列在表中列出,其他字段按当前创建类型必有;没有另加数据库外键约束,实体关联由服务端流程检查。完整列、唯一约束与现有初始化代码见 [accountStore.ts][account-store]、[accountPostgresStore.ts][account-postgres]。

表字段、主键与可空列谁读取 / 写入
usersPK id;唯一 email;password_hash、email_verified、staff、webauthn_user_id、可空 terms_accepted_at、created_at;verified / staff 的 SQL 默认值为 0,staff 在注册时按邀请码路径设置账户服务注册、验证、登录与恢复;session 返回自身公开字段,不返回 password hash
sessionsPK token_hash;user_id、remember、expires_at服务端按 cookie token 的 hash 查询、创建、续期和删除;不接受客户端 userId 作为登录证明
otpsPK (email,purpose);code_hash、expires_at、attempts、sent_at注册 / 恢复服务发码与验证;客户端提交 code,不读取存储的 hash
tenantsPK id;name、created_at当前账户创建 workspace;只列 membership 对应的 tenant
membershipsPK (user_id,tenant_id);role服务端创建 owner membership,选 tenant 时检查 membership;当前收藏与 Chat 不按 tenant 共用
passkeysPK id;user_id、唯一 credential_id、public_key、counter、transports、webauthn_user_id、created_at已登录用户注册自己的 credential;认证服务验证并更新 counter;session 只返回 passkey ID / 创建时间
webauthn_challengesPK id;kind、可空 email / user_id、challenge、expires_at服务端发出与一次性消费;也保存 captcha 的 answer hash,不返回该 hash
runtime_resourcesPK (kind,resource_id);user_id、created_atApp 将 Runtime 返回的 session / asset / version 归到账户;冲突插入忽略,不能改已有 owner
rate_hitsrate_key、hit_at;按二者建 index,无单独 PK认证服务限流计数,非收藏记录
invitesPK id;唯一 code_hash;可空 created_by、used_at、used_by_email;created_at、use_count、use_limit(初始 0 / 10)账户服务按创建者列出 / 创建,注册时消费;客户端摘要不返回 code hash
kvPK k;v、updated_at服务端按上方 namespace 读写,存储 helper 本身不判断 actor,路由与 service 必须先确定账户 / 资源归属

用户首次完成注册验证时创建个人 tenant 与 owner membership;普通密码登录和 passkey 登录要求 email verified。读取已有 session 检查 token hash、有效期和用户存在,不另把 staff 或 tenant role 作为收藏管理员权限。cookie 为 HttpOnly / SameSite=Lax,部署环境 Secure;session、tenant 和 proof cookie 的实现见 [accountSession.ts][account-session],账户返回字段与认证流程见 [accountService.ts][account-service];captcha 与 passkey 细节见 [accountCaptcha.ts][captcha] 和 [accountWebauthn.ts][webauthn]。

ACL 与实际入口

收藏、生命记录、偏好、反馈及 Chat 存取先由有效账户 cookie 决定 userId;请求中的 x-lynca-expected-account-id 仅用于检测旧 tab 账户切换,若提供且不匹配返回 409,不能代替 cookie。未登录返回 401,账户后端不可用时相关 account handler 返回 503,账户 JSON 响应为 private, no-store。该 header 检查用于 collection handler、Chat、card-market、session 等入口,不是所有 account routes 的统一前置条件。来源:[accountAccess.ts][account-access]、[accountHttp.ts][account-http]、[collectionHttp.ts][collection-http]。

入口(均在 /api/account 下)当前读写与授权检查
[GET /collection、POST /collection][route-collections]当前账户列表 / 创建;创建要求已拥有 Studio session,并建立生命记录
[GET /collection/[id]、PATCH、DELETE][route-collection]当前账户 JSON 内查 ID,再验 session 归属;PATCH 要收藏 revision,DELETE 归档而非物理删除
[POST /collection/[id]/identity][route-collection-identity]先取本账户收藏,修正对应生命记录;使用生命记录 revision
[POST /collectible][route-collectible]已有 session 的 owner 可读取 / 建立生命记录、记候选、修正或接受;三种 mutation 同次最多一种;修正 / 接受要生命记录 revision
[GET /memories、POST /memories][route-memories];[PATCH /memories/[id]、DELETE][route-memory]当前账户列表 / 明确同意创建与修改 / 撤回;修改与撤回要 memory revision
[GET /chat、PUT /chat][route-chat]当前账户 workspace 读取 / 合并;不允许指定别人的 userId
[GET /chat/feedback、PUT /chat/feedback][route-feedback]再验本账户未删 thread;写入再验已存 assistant message 与反馈 revision
[POST /card-market][route-market]当前账户生成查询并使用绑定其 userId 的缓存;请求不授予收藏读取权
[GET /session][route-session]返回当前账户、其 memberships / passkey 摘要;remembered session 续期;不返回认证存储字段
[GET /tenants、POST /tenants][route-tenants];[POST /tenants/select][route-tenant-select]只列本人 membership;创建后 owner 为本人;选择非 membership tenant 返回 403,不改变收藏 / Chat 的 userId 分区
[GET /invites、POST /invites][route-invites]当前账户读取本人创建的摘要 / 生成或重取邀请码;不授予收藏读取权;这组 route 未使用 expected-account header 检查
[GET /captcha、POST /captcha][route-captcha]不需已登录 session,返回 challenge ID / 图片;不返回答案存储 hash
[POST /register][route-register];[POST /verify][route-verify];[POST /verify/resend][route-resend]注册需密码规则、captcha 和有效邀请码;注册确认需 OTP 与 terms 同意,才标 verified 并建 session;重发验证 captcha / 限流,不是私有数据读取入口
[POST /sign-in][route-sign-in];[POST /sign-out][route-sign-out]密码校验、verified、失败次数触发 captcha / 限流;退出检查同源与账户切换,删除当前 session 并清 cookie
[POST /recover/start][route-recover-start];[POST /recover/complete][route-recover-complete]发起恢复需 captcha / 限流;完成需有效 recover OTP 与新密码规则,更新密码并删除该用户所有 sessions,不读取收藏
[POST /passkey/register/begin][route-key-register-begin];[POST /passkey/register/finish][route-key-register-finish]已登录本人注册;完成检查 challenge 绑定同一 user、RP / origin 与 user verification,写 credential
[POST /passkey/auth/begin][route-key-auth-begin];[POST /passkey/auth/finish][route-key-auth-finish]可在登录前开始,完成验证一次性 challenge、credential、RP / origin、user verification 与 verified 用户,再建 session

Studio 媒体还有独立资源 gate:runtime_resources.kind 为 studio_session、studio_asset、studio_version。[studioAccess.ts][studio-access] 从 Runtime 回应登记资源;[app/api/runtime/studio/[...path]/route.ts][runtime-studio] 只暴露 allowlist,按当前账户检查 session / image 路径并过滤 session 列表。已保存收藏读 session 时,service 再核对 Runtime 返回的 session ID,并逐项确认 asset / version 仍归本人;取得 ID 本身不授予访问权。当前 App 路径没有 tenant member、staff、Jarvis 或 LocalBrain 读取他人私有收藏的 override,也没有账户间 transfer / share API。

媒体、metadata 与尚未实现的业务对象

App 的 durable 收藏文档保存 Runtime ID 与 lineage,不复制原图、生成图或 validation pixels。App 从 Studio 读取的 StudioSession / Asset / ImageVersion 是 Runtime 投影;具体字段见 [studioTypes.ts][studio-types],不是 kv 内另一个完整 session 存档。

  • Asset 必有 asset_id、original_filename、holder、view、image_url,summary 可空。
  • ImageVersion 必有 version_id、可空 parent_version_id、representation、evidence_class、model、可空 disclaimer、validation_status、created_at、image_url、approved;presentation、source_state、output_standard、derivation_class、validation_findings、kept、source_view、source_asset_ids、automatic_correction、source_pixel_preservation 可省略。
  • StudioMetadata 必有 field、value、source(original / original_observation / tentative_observation / user_declared);asset_id、asset_ids、scope: "photograph"、visibly_supported、record_id、created_at、superseded_by、supersedes 可省略。created_at 为 Runtime string,不能当成 App 的毫秒时间。

front / back 来自对应原图的 view / inspection 与 source_asset_ids,不由上传顺序或生成图猜测。style_references 与 original evidence 分开;客户端回执、故事、偏好与生成图都不能提升为 visibly supported 原图事实。模型上下文过滤已 superseded metadata,并在 Runtime 不可用时仅保留用户声明、标 sourceState: "unknown";不生成缺失实物证据。见 [collectorContext.ts][collector-context]。

在本次核对的 App account schema、收藏 / 生命 types 和全部账户 routes 中,没有独立实物 ownership transfer、送评 submission、送评事件 / 通知表或对应操作入口。CollectibleLife.stage 是数字表示状态,不是送评流程;memory 也不是送评 archive。Ontology 与 workflow 的长期定义保持原义,不能把概念流程或这几张账户表写成已经上线的送评 / 实物确权能力。其他系统的实际存储与线上读回仍待补,不据此推断全公司都没有这些能力。

[account-store]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountStore.ts [account-postgres]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountPostgresStore.ts [account-service]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountService.ts [account-access]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountAccess.ts [account-http]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountHttp.ts [account-session]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountSession.ts [collection-http]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectionHttp.ts [collection-types]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectionTypes.ts [collection-store]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectionStore.ts [collection-service]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectionService.ts [life]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectibleLife.ts [identity]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectibleIdentity.ts [chat-store]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/chatSessionStore.ts [feedback-types]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/chatFeedbackTypes.ts [feedback]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/chatFeedback.ts [identity-proxy]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/studioIdentityProxy.ts [receipt]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/listingIdentifyReceipt.ts [collector-context]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/collectorContext.ts [studio-access]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/studioAccess.ts [studio-types]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/studioTypes.ts [captcha]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountCaptcha.ts [webauthn]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/accountWebauthn.ts [market-cache]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/cardMarketCache.ts [market-types]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/lib/cardMarket.ts [runtime-chat]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/runtime/chat/route.ts [runtime-studio]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/runtime/studio/%5B...path%5D/route.ts [route-collections]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/collection/route.ts [route-collection]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/collection/%5Bid%5D/route.ts [route-collection-identity]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/collection/%5Bid%5D/identity/route.ts [route-collectible]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/collectible/route.ts [route-memories]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/memories/route.ts [route-memory]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/memories/%5Bid%5D/route.ts [route-chat]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/chat/route.ts [route-feedback]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/chat/feedback/route.ts [route-market]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/card-market/route.ts [route-session]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/session/route.ts [route-tenants]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/tenants/route.ts [route-tenant-select]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/tenants/select/route.ts [route-invites]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/invites/route.ts [route-captcha]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/captcha/route.ts [route-register]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/register/route.ts [route-verify]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/verify/route.ts [route-resend]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/verify/resend/route.ts [route-sign-in]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/sign-in/route.ts [route-sign-out]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/sign-out/route.ts [route-recover-start]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/recover/start/route.ts [route-recover-complete]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/recover/complete/route.ts [route-key-register-begin]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/passkey/register/begin/route.ts [route-key-register-finish]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/passkey/register/finish/route.ts [route-key-auth-begin]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/passkey/auth/begin/route.ts [route-key-auth-finish]: https://github.com/LYNCA-OS/lynca-app/blob/fd4380731a341d8d93fcc2fb0f55b107d477e89b/app/api/account/passkey/auth/finish/route.ts