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 workspace | chat:<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 | 必有 enum | candidate / 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: string | sourceId 指向候选或修正 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]。
| 表 | 字段、主键与可空列 | 谁读取 / 写入 |
|---|---|---|
users | PK id;唯一 email;password_hash、email_verified、staff、webauthn_user_id、可空 terms_accepted_at、created_at;verified / staff 的 SQL 默认值为 0,staff 在注册时按邀请码路径设置 | 账户服务注册、验证、登录与恢复;session 返回自身公开字段,不返回 password hash |
sessions | PK token_hash;user_id、remember、expires_at | 服务端按 cookie token 的 hash 查询、创建、续期和删除;不接受客户端 userId 作为登录证明 |
otps | PK (email,purpose);code_hash、expires_at、attempts、sent_at | 注册 / 恢复服务发码与验证;客户端提交 code,不读取存储的 hash |
tenants | PK id;name、created_at | 当前账户创建 workspace;只列 membership 对应的 tenant |
memberships | PK (user_id,tenant_id);role | 服务端创建 owner membership,选 tenant 时检查 membership;当前收藏与 Chat 不按 tenant 共用 |
passkeys | PK id;user_id、唯一 credential_id、public_key、counter、transports、webauthn_user_id、created_at | 已登录用户注册自己的 credential;认证服务验证并更新 counter;session 只返回 passkey ID / 创建时间 |
webauthn_challenges | PK id;kind、可空 email / user_id、challenge、expires_at | 服务端发出与一次性消费;也保存 captcha 的 answer hash,不返回该 hash |
runtime_resources | PK (kind,resource_id);user_id、created_at | App 将 Runtime 返回的 session / asset / version 归到账户;冲突插入忽略,不能改已有 owner |
rate_hits | rate_key、hit_at;按二者建 index,无单独 PK | 认证服务限流计数,非收藏记录 |
invites | PK id;唯一 code_hash;可空 created_by、used_at、used_by_email;created_at、use_count、use_limit(初始 0 / 10) | 账户服务按创建者列出 / 创建,注册时消费;客户端摘要不返回 code hash |
kv | PK 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