{
  "name": "official",
  "title": "官方原版 opencode 包级 DAG (v1.18.35)",
  "version_note": "基于官方源码 v1.18.35，36 workspace 包",
  "nodes": [
    {
      "id": "oc-ui",
      "name": "@opencode-ai/ui",
      "short": "ui",
      "group": "G9-UI组件",
      "group_name": "G9-UI组件",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "SolidJS UI 组件库。src/components/ 含 50+ 基础组件（button/avatar/dialog/context-menu/diff-changes/icon 等，每个 .tsx 配套 .css 与 .stories.tsx），基于 @kobalte/core 无障碍原语；exports 将 ./components/*.tsx 直接映射为组件子路径（package.json:37）。同时提供 hooks（use-filtered-list）、context（dialog/file/i18n/marked/worker-pool）、theme 主题系统、i18n 词典、v2 新一代组件目录及 storybook 脚手架（src/storybook/scaffold.tsx）。",
      "provides": [
        "50+ 基础 UI 组件（按钮/对话框/下拉/悬浮卡/图标等）",
        "Markdown 渲染管线（marked.tsx + worker-pool + shiki 流式高亮）",
        "Theme 主题解析与上下文（theme/index.ts、theme/context.tsx）",
        "i18n 多语言词典与 plural 规则（i18n/en.ts、context/i18n.tsx）",
        "File/Dialog/WorkerPool 等全局 context",
        "图标集：provider/file/app 三类 sprite（provider-icons/types.ts 等）"
      ],
      "key_modules": [
        "components/index.ts(x): 组件汇总导出（经 exports 映射到各 .tsx）",
        "components/diff-changes.tsx: 差异变更展示组件",
        "context/marked.tsx: markdown 解析 Provider（marked + shiki 流式）",
        "context/worker-pool.tsx: Web Worker 池",
        "hooks/use-filtered-list.tsx: 模糊搜索列表 hook",
        "theme/resolve.ts: 主题变体解析（被 desktop 复用）",
        "storybook/scaffold.tsx: storybook 预览脚手架"
      ],
      "why_design": "将跨 app/session-ui/enterprise 复用的无头基础组件与渲染原语独立成库，保证视觉一致性与按需导入（sideEffects 仅 css）。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-function",
      "name": "@opencode-ai/function",
      "short": "function",
      "group": "G13-边缘服务",
      "group_name": "G13-边缘服务",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Cloudflare Workers 上的会话分享同步服务。src/api.ts:15-114 定义 SyncServer Durable Object：WebSocket 订阅连接（fetch 握手 101 + ctx.acceptWebSocket，api.ts:20-37）、publish 将 session/info|message|part 变更写入 R2 Bucket 并广播给订阅者（api.ts:45-66）、share/assertSecret/clear 管理分享密钥与数据清理；Hono 路由提供 /share_create、/share_delete、/share_sync 等端点（api.ts:116-150）。",
      "provides": [
        "Durable Object 实时同步（WebSocket 广播 session 变更）",
        "R2 持久化分享数据（publish 写入 Bucket，api.ts:55）",
        "分享密钥管理（share/assertSecret，api.ts:68-92）",
        "Hono HTTP API（share_create/share_delete/share_sync）",
        "GitHub App 认证（@octokit/auth-app 依赖）"
      ],
      "key_modules": [
        "api.ts: 全部逻辑（SyncServer DO + Hono 路由）"
      ],
      "why_design": "作为云端分享的后端同步服务，利用 Cloudflare Durable Object 的 WebSocket 能力实现跨客户端实时会话同步，与 function 名（FaaS 云端函数）对应。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-client",
      "name": "@opencode-ai/client",
      "short": "client",
      "group": "G3-客户端",
      "group_name": "G3-客户端",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "面向 Web/桌面的客户端库。src/contract.ts:1-17 复用 protocol 的 makeDefaultApi 定义 ClientApi 与 Location/SessionLocation 中间件，并声明 groupNames/endpointNames 映射（src/contract.ts:19-51）；src/index.ts:1-2 从 generated/ 导出类型化客户端；src/generated/ 与 src/generated-effect/ 由 script/build.ts 依据 contract 生成（普通 + Effect 两版），src/effect.ts:3-25 转出 schema 数据类型并保证不 import core/server（文件头注释 src/effect.ts:1-2）。",
      "provides": [
        "客户端 Api 契约（基于 protocol 默认 Api，packages/client/src/contract.ts:14-17）",
        "生成的普通客户端（packages/client/src/generated/client.ts）",
        "生成的 Effect 客户端（packages/client/src/generated-effect/client.ts）",
        "类型 re-export 与错误类型（packages/client/src/effect.ts:4-25、generated/client-error.ts）",
        "group/endpoint 名称映射（packages/client/src/contract.ts:19-51）"
      ],
      "key_modules": [
        "contract.ts: 客户端契约与名称映射",
        "index.ts: 统一出口",
        "effect.ts: Effect 风格客户端与类型转出",
        "generated/client.ts: 生成的 HTTP 客户端",
        "generated-effect/client.ts: 生成的 Effect 客户端",
        "generated/types.ts: 生成类型"
      ],
      "why_design": "面向 app/web 前端生成类型安全的 HTTP 客户端，并通过协议层复用服务端同款端点契约；强调不得反向依赖 core/server（src/effect.ts:1-2），保持客户端纯净。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-httpapi-codegen",
      "name": "@opencode-ai/httpapi-codegen",
      "short": "httpapi-codegen",
      "group": "G14-工具",
      "group_name": "G14-工具",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "构建期源代码生成工具。compile(Api) 反射一个权威 HttpApi 共享契约；emitPromise/emitEffect/emitEffectImported 独立产出客户；write(output,dir) 经 prettier 格式化后落盘。Effect 客户经 effect/unstable/httpapi 解码域值；Promise 客户零 Effect 直接 fetch。",
      "provides": "从 HttpApi+Effect Schema 契约生成领域化客户端 TS 源码：类型化输入、解包 {data:A}、void/stream 映射、统一 ClientError、operations 元数据。",
      "key_modules": [],
      "why_design": "把 HTTP 客户端生成从 OpenCode Core 解耦成私有独立包，测试即规范；契约作为唯一共享源，Promise 与 Effect 双投影解耦；manifest 防重复生成破坏。",
      "why_modified": "",
      "how_use": "定义 HttpApi 契约→compile 得 Contract→选 emitPromise 或 emitEffect→write 到目录。产物头部注明 Generated by @opencode-ai/httpapi-codegen. Do not edit.",
      "how_scenario": "@opencode-ai/client 在服务器契约一改时重新生成 src/generated；app/session-ui/sdk-next 消费该 client 做远端与内嵌调用。",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-app",
      "name": "@opencode-ai/app",
      "short": "app",
      "group": "G10-应用",
      "group_name": "G10-应用",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "OpenCode 桌面/Web 前端的 SolidJS 主应用。src/app.tsx 组装全部 Provider（Server/SDK/ServerSync/Settings/Tabs/Command 等约 20 个 context，app.tsx:41-66）并注册 Session/Home/NewSession/Legacy 等路由；src/entry.tsx:5-11 通过 render 挂载 AppInterface 与 PlatformProvider；src/index.ts:1-30 导出 AppBaseProviders、AppInterface 及全部 context hooks（useServer/useSettings/useTabs 等）。桌面专属能力（desktop-menu.ts、updater.ts、wsl/ 目录）以子路径导出供 desktop 包复用。",
      "provides": [
        "AppInterface 与 AppBaseProviders 根组件（SolidJS 应用壳）",
        "Server/SDK/ServerSync/Tabs/Settings/Command 等全套全局 context",
        "Session 会话页、Home 主页、NewSession 页、布局（新旧两套）页面",
        "WSL 服务器探测/管理类型与桌面菜单、更新器（updater.ts）",
        "i18n 中英双语词典与 locale 规范化（i18n/、context/language.tsx）",
        "draft-store 草稿持久化与 file-picker 常量（utils/draft-store.ts:30）"
      ],
      "key_modules": [
        "app.tsx: 根组件，装配 20+ Provider 与全部路由",
        "entry.tsx: 浏览器挂载入口（render + PlatformProvider）",
        "context/server.ts: ServerConnection 连接管理与 server-sdk/server-sync",
        "pages/session/index.ts: 会话页与 SessionRouteErrorBoundary",
        "pages/home/index.tsx: 新主页（NewHome）",
        "wsl/types.ts + wsl/context.tsx: WSL 发行版探测与服务器上下文",
        "updater.ts: 应用更新状态机（UpdaterState）",
        "index.ts: 公共导出面（contexts/hooks/常量/类型）"
      ],
      "why_design": "作为 UI 应用壳层，将 session-ui/ui 的无状态组件与 server/core 的业务逻辑粘合为完整应用，同时为 desktop 提供可复用的桌面子模块（菜单/更新/WSL）出口。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① titlebar-tab-nav.tsx 会话 tab 加右键上下文菜单(MenuV2)：重命名/关闭 tab，与 TabPreviewPopover 联动。② dialog-connect-provider.tsx desktop 平台在 Console device auth(v1) 时给 opencode provider URL 追加 client_id=opencode-desktop。③ message-timeline.tsx saveTitleEditor 空编辑守卫；onBlur 改为保存标题；onKeyDown 跳过 IME 输入。④ open-in-app-v2.tsx 图标 20px。⑤ 新增 e2e/regression/session-rename.spec.ts。"
    },
    {
      "id": "oc-protocol",
      "name": "@opencode-ai/protocol",
      "short": "protocol",
      "group": "G2-通信协议",
      "group_name": "G2-通信协议",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "通信协议层。src/api.ts:26-86 用 effect/unstable/httpapi 定义 OpenCode HttpApi 结构：注册 Health/Location/Agent/Session/Message/Model/Provider/Integration/Credential/Permission/FS/Command/Skill/Event/Pty/Question/Reference/ProjectCopy 共 18 个 Group（src/api.ts:38-55），并挂 Authorization/SchemaError 中间件（src/api.ts:63-64）。src/errors.ts:3-40 定义带 httpApiStatus 的 TaggedError（400/401/409/503 等）。src/groups/* 按资源定义端点与契约，middleware/authorization.ts:4-6 定义 Authorization 服务。",
      "provides": [
        "OpenCode HttpApi 协议定义（packages/protocol/src/api.ts:37-55）",
        "18 个资源端点组（packages/protocol/src/groups/*）",
        "统一错误契约（httpApiStatus 标注，packages/protocol/src/errors.ts:3-40）",
        "Authorization/SchemaError 中间件契约（packages/protocol/src/middleware/）",
        "OpenAPI 注解（packages/protocol/src/api.ts:56-62）"
      ],
      "key_modules": [
        "api.ts: HttpApi 结构与 makeDefaultApi",
        "errors.ts: 错误类型体系",
        "groups/session.ts: 会话端点组",
        "groups/event.ts: 事件端点组",
        "groups/fs.ts: 文件系统端点组",
        "middleware/authorization.ts: 鉴权契约",
        "middleware/schema-error.ts: schema 错误映射"
      ],
      "why_design": "协议与实现分离：protocol 只声明端点/中间件/错误的契约（server 注入具体服务身份，见 src/api.ts:25 注释），使 server、client、cli 对同一协议的不同实现方共享同一类型面。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-storybook",
      "name": "@opencode-ai/storybook",
      "short": "storybook",
      "group": "G11-文档站点",
      "group_name": "G11-文档站点",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "UI 组件开发文档站。.storybook/main.ts:13-29 用 storybook-solidjs-vite 定义框架并聚合 ui/session-ui/app 三包的 stories（stories glob 指向 ../../ui、../../session-ui、../../app/src）；同时用 mocks 目录对 app 的 context（local/file/prompt/layout/sdk/sync 等 15+ 个）做 SolidJS router 替换与 context mock（main.ts:36-50），使 app 组件能在 Storybook 中独立渲染；preview.tsx 提供全局预览配置。",
      "provides": [
        "聚合 ui/session-ui/app 三包组件的 Storybook 开发环境",
        "app context 全套 mock（main.ts:37-50 别名替换）",
        "Playground CSS 与主题工具插件（playground-css-plugin.ts、theme-tool.ts）"
      ],
      "key_modules": [
        ".storybook/main.ts: Storybook 配置与 context mock 别名",
        ".storybook/preview.tsx: 全局预览装饰器",
        ".storybook/mocks/: app context 模拟实现",
        ".storybook/playground-css-plugin.ts: 自定义 vite 插件",
        ".storybook/theme-tool.ts: 主题调试工具"
      ],
      "why_design": "为组件库提供隔离的开发/审查环境，通过 mock 掉 app 的副作用 context 使跨包组件可以独立预览与回归测试。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-session-ui",
      "name": "@opencode-ai/session-ui",
      "short": "session-ui",
      "group": "G9-UI组件",
      "group_name": "G9-UI组件",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "会话级 UI 组件集，介于基础组件库与完整应用之间。src/components/ 提供 SessionTurn、SessionReview、MessagePart、message-file、session-diff、line-comment 等会话渲染组件，并含 markdown 流式渲染整套管线（markdown-stream.ts + markdown-worker.ts + markdown-cache.tsx，用 Worker 实现增量渲染）；src/pierre/ 提供 file-find/file-selection/diff-selection/media 等代码交互原语；src/context/data.tsx 提供会话数据 Provider（被 enterprise share 页复用）。",
      "provides": [
        "SessionTurn/SessionReview 会话轮次与评审组件",
        "MessagePart/message-file/session-diff 消息部件与差异展示",
        "Markdown 流式渲染管线（worker + stream + cache，markdown-stream.ts:12）",
        "文件查找/选择/差异选择交互原语（pierre/ 目录）",
        "会话数据 context（context/data.tsx）",
        "PromptInput v2 输入框（v2/components/prompt-input/）"
      ],
      "key_modules": [
        "components/session-turn.tsx: 单个会话轮次渲染",
        "components/session-review.tsx: 会话评审视图",
        "components/markdown-stream.ts: 流式 markdown 增量处理",
        "components/markdown-worker.ts: markdown 渲染 Web Worker",
        "components/message-part.tsx: 消息部件分发渲染",
        "components/session-diff.ts: 会话差异计算",
        "pierre/index.ts: 代码交互原语出口",
        "context/data.tsx: 会话数据 Provider"
      ],
      "why_design": "把会话级渲染（消息/轮次/评审/markdown 流）从 app 中剥离，使 app 与 enterprise 共享同一套会话表达，避免重复实现。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-console-function",
      "name": "@opencode-ai/console-function",
      "short": "console-function",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Cloudflare Workers 端边函数集：auth.ts 是 OpenAuth issuer（GitHub/Google 登录 + Cloudflare KV 存储，签发 account/user subject），log-processor.ts 是 tail 处理器，把 Zen/Go 网关的请求日志转发到 Honeycomb 与数据湖，stat.ts 提供 TPS 限流统计查询端点。src/auth.ts:44 用 @openauthjs/openauth 构建 OAuth issuer，src/log-processor.ts:5 解析 _metric: 前缀日志聚合指标。",
      "provides": [
        "OAuth 登录 issuer：GitHub/Google provider + Cloudflare KV 会话存储（src/auth.ts:44）",
        "Subjects 定义：account/user 两级认证主体（src/auth.ts:25）",
        "网关日志采集：tail 事件 → Honeycomb batch + lake ingest（src/log-processor.ts:5）",
        "TPS 限流统计查询：按模型 id 聚合 30 分钟窗口 qualify/unqualify（src/stat.ts:7）"
      ],
      "key_modules": [
        "auth.ts:42 - OpenAuth issuer 默认导出，配置 GitHub/Google 与 KV storage",
        "log-processor.ts:5 - tail() 处理 Zen/Go 请求日志并转发 Honeycomb/数据湖",
        "stat.ts:7 - fetch() 处理 POST ids 查询 TPS 限流统计"
      ],
      "why_design": "独立于 app 的 Cloudflare Workers 入口：认证服务与日志/统计边函数需要各自独立的 worker 部署，无法打进 Console 主应用。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-console-app",
      "name": "@opencode-ai/console-app",
      "short": "console-app",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Console 主站前端（SolidStart/SSR + Nitro on Cloudflare），包含营销落地页、认证回调、workspace 管理（billing/keys/members/settings/usage）、Zen 与 Go 两个 LLM API 网关，以及到 docs/stats/bench 的代理路由。src/app.tsx 挂载路由与 i18n，src/routes/zen/v1/chat/completions.ts 走统一 handler 做鉴权/计费/限流后转发到上游 provider，src/lib/stats-proxy.ts 反向代理 stats.opencode.ai。",
      "provides": [
        "营销/下载/企业页与多语言 i18n（20 语言，src/i18n/）",
        "OpenAuth 认证与 session 处理（src/routes/auth/、src/context/auth.ts）",
        "workspace 控制台：billing 充值、API key、成员、用量图表（src/routes/workspace/[id]/）",
        "Zen 网关：OpenAI/Anthropic/Google 兼容 API + key/IP 限流 + 用量计费（src/routes/zen/）",
        "Go 网关（轻量版 zen，src/routes/zen/go/）",
        "Stripe webhook、honeycomb webhook、enterprise lead 提交",
        "docs/stats/bench 站点反向代理（src/routes/docs/、src/routes/data/）"
      ],
      "key_modules": [
        "app.tsx:1 - SolidStart 应用根，挂 Router/FileRoutes/i18n/LanguageProvider",
        "routes/zen/util/handler.ts:1 - Zen/Go 网关统一处理器：鉴权、计费扣减、限流、provider 转发",
        "routes/zen/v1/chat/completions.ts:5 - OpenAI 兼容 completions 端点封装 handler",
        "lib/stats-proxy.ts:7 - 反向代理 stats.opencode.ai 并注入 locale 头与缓存头",
        "routes/stripe/webhook.ts:2 - Stripe 支付事件处理（充值/Lite/Black 订阅）",
        "context/auth.ts:1 - 请求级认证与 Actor 注入（session→user/workspace）",
        "routes/docs/[...path].ts:5 - docs.opencode.ai 代理并设置 locale cookie",
        "routes/workspace/[id]/usage/graph-section.tsx - 用量可视化（chart.js）"
      ],
      "why_design": "Console 是 opencode 的 SaaS 前端：既承担官网/营销/文档分发，也承载用户工作区管理与 Zen/Go 付费 LLM 网关，是 console-core 领域逻辑的界面与入口层。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① 新增 lib/inference-proxy.ts：/zen/v1/* 及 google generateContent 按 KeyTable→WorkspaceTable(provider, migratedAt) 转发到 ConsoleMigration.inferenceUrl 的由 provider 派生 /custom/conn_* 路径。② zen/v1/models.ts GET 走 proxyModels() 代理。③ zen/util/handler.ts full modelList 时先试 proxyInference(含 503 降级)。④ 新增 routes/zen/util/trainingConsent.ts。⑤ 新增 api/support/actions/reset-quota.ts。⑥ lib/stats-proxy.ts 加 Cache API。⑦ lib/request-country.ts 新增 muse-spark-1.3-contributor(-free) 限区。⑧ context/auth.ts getActor 内联 WorkspaceTable.migrated_at，已迁移工作区 redirect 到新 Console。⑨ go/index.tsx 重写：新增 Muse Spark 1.3 Contributor/Hy4 preview/Omen Alpha。⑩ billing reload-section 包 withActor。"
    },
    {
      "id": "oc-console-support",
      "name": "@opencode-ai/console-support",
      "short": "console-support",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "面向支持/客服的内部工具站（SolidStart SSR）。核心功能是用户数据 lookup：src/lib/lookup.ts 按 wrk_/key_/sk-/email 标识查询 workspace、billing、usage、订阅与禁用模型等全量数据，src/routes/lookup.tsx 展示查询结果，src/routes/index.tsx 提供查询表单。全部逻辑直接复用 console-core 的 schema 与 domain。",
      "provides": [
        "按 email/workspace id/API key 查询用户全量数据（src/lib/lookup.ts:41）",
        "workspace 详情：users/billing/go/payments/usage/disabledModels 分节（src/lib/lookup.ts:30）",
        "查询表单与结果展示页面（src/routes/index.tsx、src/routes/lookup.tsx）",
        "复用 console-core 数据库 schema 与 Black/Lite/Subscription 领域逻辑"
      ],
      "key_modules": [
        "lib/lookup.ts:41 - 核心 lookup 逻辑：标识解析 + 多表聚合查询",
        "routes/index.tsx:3 - 查询入口表单页",
        "routes/lookup.tsx:1 - 查询结果展示页"
      ],
      "why_design": "为内部客服提供只读审计工具，复用 console-core 数据层，避免暴露在生产 Console 前端中。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-console-mail",
      "name": "@opencode-ai/console-mail",
      "short": "console-mail",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "邮件模板包：无 src/，全部为 emails/ 下的 jsx-email 模板与共享组件/样式。emails/templates/InviteEmail.tsx 是唯一业务模板（workspace 邀请邮件），被 console-core 的 User 邀请逻辑动态 import 渲染（console/core/src/user.ts:142）。包 exports 映射到 ./emails/templates/*，纯前端渲染无服务逻辑。",
      "provides": [
        "InviteEmail 邀请邮件模板（React/jsx-email，emails/templates/InviteEmail.tsx:26）",
        "共享邮件组件与内联样式（emails/components.tsx、emails/styles.ts）",
        "静态邮件资源：字体 woff2/logo/箭头图（emails/templates/static/）",
        "本地预览命令（email preview emails/templates）"
      ],
      "key_modules": [
        "emails/templates/InviteEmail.tsx:26 - 邀请邮件主模板（inviter/workspaceName/URL 参数化）",
        "emails/components.tsx:1 - 复用邮件 UI 组件（Text/Fonts/Title/A/Span）",
        "emails/styles.ts:1 - 邮件内联样式常量"
      ],
      "why_design": "将邮件模板与业务代码解耦，供 console-core 按需动态 import（避免 React 依赖进入 core 主包），同时独立可预览开发。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-console-core",
      "name": "@opencode-ai/console-core",
      "short": "console-core",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Console 后端领域层：基于 drizzle-orm + PlanetScale 的数据库访问、Actor 权限上下文、以及 Account/User/Workspace/Key/Billing/Subscription/Model/Provider 等 CRUD 与计费逻辑。src/drizzle/index.ts 封装事务与上下文，src/account.ts 处理账号创建/删除（含级联清理 key、coupon、auth），src/workspace.ts 创建 workspace 并默认生成管理员与 API key，src/billing.ts 对接 Stripe 做 credits 充值。",
      "provides": [
        "Database 封装：PlanetScale drizzle 客户端 + 事务/上下文（src/drizzle/index.ts:36）",
        "Actor 权限上下文：请求用户/角色/workspace 断言（src/actor.ts）",
        "账号生命周期：create/remove/fromID，删除级联清理（src/account.ts:13,27）",
        "workspace 创建与成员管理（src/workspace.ts:17）",
        "API Key 管理与角色隔离（src/key.ts:11）",
        "Stripe 计费：credits 充值/订阅/用量计费（src/billing.ts:22,29）",
        "模型/Provider 目录与 ZenData 模型成本定义（src/model.ts）",
        "订阅限额：free/lite/black 阶梯（src/subscription.ts:7）",
        "全量 drizzle schema SQL（src/schema/*.sql.ts，account/auth/billing/key/model/provider/referral/user/workspace/ip/benchmark）",
        "邀请邮件渲染（动态 import console-mail，src/user.ts:142）"
      ],
      "key_modules": [
        "drizzle/index.ts:11 - Database 命名空间：客户端、事务、Context 集成",
        "account.ts:13 - 账号创建/删除（含 key/coupon/auth 级联）",
        "workspace.ts:13 - workspace 创建，默认 admin 用户 + 默认 API key",
        "billing.ts:22 - Stripe credits 计费与余额查询",
        "key.ts:11 - API key 列表/创建，按角色过滤",
        "model.ts:10 - ZenData：模型成本、provider、限流配置 schema",
        "user.ts:16 - 用户 CRUD 与邮件邀请",
        "subscription.ts:7 - free/lite/black 订阅限额定义"
      ],
      "why_design": "将 Console 的业务领域逻辑从 app（前端/网关）与 function（worker）中独立出来，供 app、support、function 三方复用，避免数据库 schema 与计费逻辑重复实现。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① 新增 src/quota.ts：Quota.reset 事务清零 lite/subscription 用量计数。② schema/workspace.sql.ts WorkspaceTable 加 migrated_at 列。③ 新增迁移 20260903161929_parched_patriot。"
    },
    {
      "id": "oc-console-resource",
      "name": "@opencode-ai/console-resource",
      "short": "console-resource",
      "group": "G16-Console",
      "group_name": "G16-Console",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "SST 资源访问抽象层，无 src/ 目录（文件在包根）。通过 Proxy 按运行环境暴露 Resource：resource.cloudflare.ts 在 Worker 内从 env.SST_RESOURCE_* 读取链接资源，resource.node.ts 在 Node 下回退到 sst 包并对 KV/Bucket 提供客户端实现。src/… 实际为 resource.cloudflare.ts:4 与 resource.node.ts:9 两个入口，按 exports production/import 条件切换。",
      "provides": [
        "统一 Resource 代理：读取 SST 链接的 secrets/KV/数据库配置（resource.cloudflare.ts:4）",
        "Node 环境回退：KV get/put/delete/list、Bucket no-op、Cloudflare API 客户端（resource.node.ts:9）",
        "条件导出：Cloudflare 与 Node 运行时的资源读取差异屏蔽（package.json exports）"
      ],
      "key_modules": [
        "resource.cloudflare.ts:4 - Worker 运行时 env 读取 Proxy（SST_RESOURCE_*）",
        "resource.node.ts:9 - Node/本地运行时 sst Resource 回退 + KV/Bucket 模拟"
      ],
      "why_design": "让 app/core/function 在 Cloudflare Worker 与本地 Node 两种环境共享同一套资源访问代码，隐藏 SST 环境差异。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-slack",
      "name": "@opencode-ai/slack",
      "short": "slack",
      "group": "G18-集成",
      "group_name": "G18-集成",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Slack 机器人集成（@slack/bolt Socket Mode）。src/index.ts 创建 opencode 服务端实例（createOpencode）与 Slack App，按 channel+thread 键复用 session：首次消息创建 opencode session 并分享链接，后续消息走 session.prompt；同时订阅 message.part.updated 事件把 tool 完成状态回贴到 thread（src/index.ts:24-51）。",
      "provides": [
        "Slack Socket Mode 机器人（src/index.ts:4）",
        "每 thread 独立 opencode session 的创建/复用（src/index.ts:22,70-101）",
        "会话分享链接回帖（src/index.ts:96）",
        "tool 执行状态回帖（message.part.updated 订阅，src/index.ts:24-51）",
        "/test 命令与错误兜底回复（src/index.ts:138）"
      ],
      "key_modules": [
        "index.ts:1 - Slack App + opencode 服务端初始化",
        "index.ts:24 - 事件订阅循环：tool 状态 → thread 回帖",
        "index.ts:58 - 消息处理：session 创建/复用 + prompt 调用",
        "index.ts:96 - 会话分享 URL 发布"
      ],
      "why_design": "让用户直接在 Slack 线程内驱动 opencode agent，把聊天线程映射为独立 session；作为独立部署的集成入口，复用 @opencode-ai/sdk 而非内嵌实现。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-desktop",
      "name": "@opencode-ai/desktop",
      "short": "desktop",
      "group": "G10-应用",
      "group_name": "G10-应用",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Electron 桌面壳。src/main/index.ts:15-51 聚合应用生命周期：spawnLocalServer 拉起本地 sidecar 服务、registerIpcHandlers 注册 IPC、createMenu 构建原生菜单、setupAutoUpdater 自动更新、WSL sidecar 管理（wsl/servers.ts）、migrate 数据迁移与 store 清理；src/preload 暴露安全的桥接 API；src/renderer 复用 @opencode-ai/app 渲染 Web UI（renderer/cli.ts:7 通过 window.api.installCli 安装 CLI）。",
      "provides": [
        "Electron 主进程：窗口/菜单/托盘/深链（main/windows.ts、main/menu.ts）",
        "本地 sidecar server 生命周期管理（main/server.ts spawnLocalServer）",
        "IPC 桥与 preload 安全 API（preload/index.ts）",
        "自动更新（main/updater.ts + electron-updater）",
        "WSL 发行版内服务器编排（wsl/）",
        "背景 CLI 与原生翻译注入（background-cli.ts、native-translations.ts）"
      ],
      "key_modules": [
        "main/index.ts: 主进程入口（生命周期/窗口/服务编排）",
        "main/server.ts: sidecar 本地服务器拉起与监听",
        "main/ipc.ts: IPC handler 注册",
        "main/updater.ts: 自动更新控制器",
        "preload/index.ts: 渲染进程安全桥",
        "renderer/index.tsx: 渲染进程入口",
        "wsl/servers.ts: WSL 服务器控制器"
      ],
      "why_design": "为 Web UI 提供原生桌面能力（本地服务托管/更新/菜单/WSL），是独立于 @opencode-ai/app 的 Electron 分发层。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-web",
      "name": "@opencode-ai/web",
      "short": "web",
      "group": "G11-文档站点",
      "group_name": "G11-文档站点",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "基于 Astro + Starlight 的文档与分享站点。src/pages/s/[id].astro:2-8 渲染会话分享页（Share.tsx 消费 opencode/session 类型，通过 API URL 拉取分享数据）；src/pages/[...slug].md.ts:19-34 提供 docs 内容 API（按 slug 返回 markdown 文档）；src/content/docs/ 含多语言（en/zh/ar/bs/de/...）文档与代码示例（大量引用 @opencode-ai/plugin 与 @opencode-ai/sdk 的用法）。devDependencies 引用 opencode 包（opencode: workspace:*）。",
      "provides": [
        "会话分享查看页（s/[id].astro + components/Share.tsx）",
        "docs 文档 API 端点（pages/[...slug].md.ts:19）",
        "Starlight 多语言文档站（content.config.ts + i18n/）",
        "分享 WebSocket 连接状态 UI（Share.tsx:15 status 机）"
      ],
      "key_modules": [
        "pages/s/[id].astro: 分享页 SSR 模板",
        "components/Share.tsx: 分享会话渲染组件",
        "components/share/part.tsx: 分享消息部件渲染",
        "pages/[...slug].md.ts: 文档 markdown API",
        "content.config.ts: Astro content 集合配置"
      ],
      "why_design": "独立部署的文档+分享前端，与桌面 app 完全解耦，仅通过 API URL 消费后端数据，作为云端分享生态的展示层。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① docs/go.mdx 新增 Muse Spark 1.3 Contributor/Hy4 preview/Omen Alpha 的定价/限区/请求数/训练约定，新增 'Where can I use it?' 章节、x-opencode-session 头说明。② providers.mdx 移除 Azure 模型发现描述(改纯资源名)，新增 Eden AI provider。"
    },
    {
      "id": "oc-codemode",
      "name": "@opencode-ai/codemode",
      "short": "codemode",
      "group": "G12-沙箱",
      "group_name": "G12-沙箱",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Code Mode 沙箱：基于 schema 描述的受限代码执行（package.json:5 描述）。src/interpreter/runtime.ts:1-3 用 acorn 解析 + typescript transpileModule 在受限解释器中执行 JS 子集，工具调用经 src/tool-runtime.ts 注入 host tools 并受 ExecutionLimits（超时/最大工具调用数/输出字节，src/codemode.ts:10-17）约束。src/openapi/ 提供从 OpenAPI spec 生成工具的运行时（src/openapi/index.ts），src/stdlib/ 提供 JS 子集标准库（string/number/date/collections 等 14 模块）。",
      "provides": [
        "受限 JS 解释器与 AST 执行（packages/codemode/src/interpreter/runtime.ts:1）",
        "工具调用沙箱运行时（packages/codemode/src/tool-runtime.ts）",
        "执行资源限制：timeout/maxToolCalls/maxOutputBytes（packages/codemode/src/codemode.ts:10-17）",
        "OpenAPI 工具生成器（packages/codemode/src/openapi/index.ts、spec.ts）",
        "JS 子集标准库（packages/codemode/src/stdlib/*）",
        "工具 schema 编解码（packages/codemode/src/tool-schema.ts）"
      ],
      "key_modules": [
        "codemode.ts: 顶层 API 与限制类型",
        "interpreter/runtime.ts: 沙箱解释器",
        "tool-runtime.ts: 工具调度运行时",
        "tool.ts: 工具定义模型",
        "tool-schema.ts: 工具 schema 编解码",
        "openapi/index.ts: OpenAPI→工具 转换",
        "stdlib/string.ts: 标准库模块"
      ],
      "why_design": "为 LLM 提供可审计、受限、确定性的代码执行环境（Effect-native），并支持基于 schema 描述的工具集，避免开放 shell 的安全风险（被 opencode 的 tool/code-mode.ts 桥接使用）。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-stats-app",
      "name": "@opencode-ai/stats-app",
      "short": "stats-app",
      "group": "G17-Stats",
      "group_name": "G17-Stats",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "OpenCode Stats 公共数据站点（SolidStart，Cloudflare preset，app.config.ts:1）。首页通过 @opencode-ai/stats-core/domain/home 拉取并渲染使用量排行榜、模型/Provider 对比、geo 分布与市场数据（src/routes/index.tsx:10-41），另有 compare 对比页与 [lab]/[model] 实验页，配合 d3-geo/topojson 世界地图。src/routes/stats-cache.ts 统一设置 CDN 缓存头。",
      "provides": [
        "统计首页：排行榜/用量趋势/Geo 地图/缓存命中率（src/routes/index.tsx）",
        "模型对比页（src/routes/compare/[firstFamily]/[secondFamily].tsx）",
        "模型实验室单模型页（src/routes/[lab]/[model].tsx）",
        "CDN 缓存控制与 Vary locale 处理（src/routes/stats-cache.ts:5）",
        "API：health/newsletter（src/routes/api/）",
        "多语言 i18n（20 语言）与 sitemap"
      ],
      "key_modules": [
        "routes/index.tsx:1 - 首页聚合视图：排行榜/geo/对比卡片",
        "routes/compare/[firstFamily]/[secondFamily].tsx:1 - 双模型族对比页",
        "routes/stats-cache.ts:5 - 缓存头与 Vary 注入",
        "routes/model-catalog.ts:1 - 模型目录加载/匹配",
        "routes/geo-map.ts:1 - d3 世界地图路径与标记",
        "stats-runtime.ts:3 - Effect 运行时桥接（runPromise）",
        "routes/stats-shell.tsx:1 - 页面骨架/主题/Header/Footer"
      ],
      "why_design": "独立的公共数据站（stats.opencode.ai），与 Console 分离部署；展示 opencode 生态模型使用统计，靠 stats-core 提供领域数据。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① model-catalog.ts 新增 isProviderlessLab/isKnownCatalogLab。② model-compare-detail.tsx 等适配 stealth 模型不显示 provider、country 扁平化、market share 图改进。"
    },
    {
      "id": "oc-stats-server",
      "name": "@opencode-ai/stats-server",
      "short": "stats-server",
      "group": "G17-Stats",
      "group_name": "G17-Stats",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Stats 后端 Node HTTP 服务（Effect HttpRouter + Bun，Dockerfile 部署）。src/server.ts 用 NodeHttpServer 启动 3000 端口服务并注入 Ingest 层，src/router.ts 暴露 GET /health、/ready 与 POST / 数据摄取端点（Bearer 鉴权 + 并发信号量限流），src/ingest.ts 将事件批处理写入 AWS Firehose，src/stat-sync.ts 是每小时 Athena 同步 daemon。",
      "provides": [
        "摄取端点 POST /：事件批收 + Firehose 写入（src/router.ts:25、src/ingest.ts:38）",
        "健康检查 GET /health 与 /ready（含优雅停机判定，src/router.ts:23-24）",
        "Bearer 鉴权（timingSafeEqual，src/router.ts:56）",
        "每小时统计同步 daemon（src/stat-sync.ts:13）",
        "Docker 化部署（Dockerfile:1，turbo prune + bun install）"
      ],
      "key_modules": [
        "server.ts:12 - NodeHttpServer + Effect 组合启动",
        "router.ts:16 - 路由注册：health/ready/ingest",
        "ingest.ts:32 - Ingest Service：事件路由 + Firehose 批量写入",
        "stat-sync.ts:13 - 每小时 Athena 同步 daemon（全量/增量交替）",
        "shutdown.ts:1 - 优雅停机信号处理"
      ],
      "why_design": "作为摄取网关承接 Console function 的 lake 事件流，并独立承载统计同步 daemon；与 app 站点、core 领域解耦。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-stats-core",
      "name": "@opencode-ai/stats-core",
      "short": "stats-core",
      "group": "G17-Stats",
      "group_name": "G17-Stats",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Stats 后端核心（Effect + drizzle + PlanetScale）。src/athena.ts 封装 AWS Athena 查询服务（StartQuery/轮询/取结果），src/database.ts 提供 Effect 风格 DatabaseConfig/DrizzleClient，src/domain/ 下按 model/provider/geo/home/inference 分域定义聚合类型与查询，src/stat-sync.ts 实现 Athena → 数据库的增量/全量同步管线。src/index.ts 聚合导出全部命名空间。",
      "provides": [
        "Athena 查询服务：执行/轮询/分页取数（src/athena.ts:45）",
        "Effect 化数据库层：PlanetScale drizzle + schema + 迁移（src/database.ts:24,40）",
        "统计领域模型：StatBaseAggregate 聚合结构与 grain day/week（src/domain/stat.ts:6）",
        "Model/Provider/Geo 统计仓库与 upsert（src/domain/model.ts 等）",
        "首页聚合查询（getStatsHomeData，src/domain/home.ts:9）",
        "统计同步管线：Athena 查询 → 聚合 → 写入（src/stat-sync.ts:23）",
        "App 配置（stage/publicUrl）与运行时（src/config.ts、src/runtime.ts）"
      ],
      "key_modules": [
        "index.ts:1 - 命名空间聚合导出（Athena/Database/Domain/Runtime）",
        "athena.ts:45 - AWS Athena Effect 服务（重试/超时封装）",
        "database.ts:24 - DatabaseConfig/DrizzleClient Effect Layer",
        "domain/stat.ts:6 - 聚合统计结构与字段定义",
        "domain/home.ts:9 - 首页统计聚合查询类型",
        "stat-sync.ts:23 - Athena→DB 同步（incremental/full pass）",
        "runtime.ts:12 - ManagedRuntime 组装（AppConfig+DB+repos）"
      ],
      "why_design": "按 stats 独立生态划分：core 承载 Effect 领域服务与数据访问，供 app 查询、server 同步、Lambda 入口三方复用，README 明确 Runtime/DB/domain 全部在 core。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① domain/home.ts country 类型改为扁平 CountryEntry[]；新增进程内查询缓存(QUERY_CACHE_TTL_MS=5min, MAX_ENTRIES=256)。② database/schema.ts geoStat 新增复合索引。③ domain/inference.ts STEALTH_MODELS 归为 'unknown' provider。④ model-normalization.ts 新增 STEALTH_MODELS(omen-alpha)、MODEL_NAME_ALIASES 补 deepseek-v4-flash-0731。"
    },
    {
      "id": "oc-llm",
      "name": "@opencode-ai/llm",
      "short": "llm",
      "group": "G5-LLM请求层",
      "group_name": "G5-LLM请求层",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "LLM 请求/协议层。src/index.ts:1-28 导出 LLMClient/Auth/Provider/Tool/ToolRuntime；核心 LLM 门面 src/llm.ts:45-48 提供 generate/stream 等请求方法。src/route/client.ts:29-49 定义 Route 结构（provider+protocol+endpoint+auth+transport）与 RequestExecutor；src/route/transport/http.ts、websocket.ts 实现 HTTP/WS 传输。内置 8 个 provider（src/providers/：anthropic、openai、google、azure、amazon-bedrock、openrouter 等，package.json:17-28）与 6 个协议适配（src/protocols/：anthropic-messages、openai-chat、openai-responses、gemini、bedrock-converse，package.json:29-35）。",
      "provides": [
        "统一 LLM 客户端门面 generate/stream（packages/llm/src/llm.ts:45）",
        "Route 路由抽象：endpoint/auth/transport/body schema（packages/llm/src/route/client.ts:36-48）",
        "HTTP 与 WebSocket 传输层（packages/llm/src/route/transport/http.ts、websocket.ts）",
        "多提供商适配：OpenAI/Anthropic/Google/Azure/Bedrock/OpenRouter/xAI 等（packages/llm/src/providers/）",
        "多协议编解码：chat/responses/messages/gemini/bedrock（packages/llm/src/protocols/）",
        "Tool 定义与执行运行时（packages/llm/src/tool.ts、tool-runtime.ts）",
        "上下文溢出检测（packages/llm/src/provider-error.ts:4）"
      ],
      "key_modules": [
        "llm.ts: 高层请求门面",
        "route/client.ts: Route 抽象与客户端服务",
        "route/executor.ts: 请求执行器",
        "route/transport/http.ts + websocket.ts: 双传输",
        "providers/index.ts: 提供商注册表",
        "protocols/shared.ts: 协议共享逻辑",
        "tool.ts: Tool 定义模型",
        "schema/events.ts: LLM 事件 schema"
      ],
      "why_design": "将多提供商/多协议的请求差异隔离在路由与协议适配层之下，向上提供单一 LLM 门面，支持 HTTP/WS 双通道并可被 http-recorder 录制回放（llm devDependency 依赖 recorder）。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-plugin",
      "name": "@opencode-ai/plugin",
      "short": "plugin",
      "group": "G7-插件SDK",
      "group_name": "G7-插件SDK",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "插件 SDK。src/index.ts:20-80 定义 Plugin/PluginInput/Config/Hooks 等公共类型，基于 @opencode-ai/sdk 客户端访问服务；src/tool.ts:3-20 定义 ToolContext/ToolResult。提供 v2 双运行时：effect 版（src/v2/effect/：plugin/context/agent/command/skill/catalog/integration/filesystem/event 等 14 模块）与 promise 版（src/v2/promise/），并含 TUI 插件类型（src/tui.ts:1-40 基于 @opentui）。",
      "provides": [
        "插件公共类型与 Hooks 契约（packages/plugin/src/index.ts:20-80）",
        "工具 API：ToolContext/ToolDefinition/ToolResult（packages/plugin/src/tool.ts:3-20）",
        "Effect 原生 v2 插件 API：agent/command/skill/catalog/integration 注册（packages/plugin/src/v2/effect/plugin.ts）",
        "Promise 风格 v2 插件 API（packages/plugin/src/v2/promise/index.ts）",
        "TUI 插件接口（基于 @opentui，packages/plugin/src/tui.ts:19-33）",
        "shell 工具封装（packages/plugin/src/shell.ts）"
      ],
      "key_modules": [
        "index.ts: Plugin/PluginInput/Hooks 公共契约",
        "tool.ts: 工具定义与上下文类型",
        "tui.ts: TUI 插件接口",
        "v2/effect/plugin.ts: Effect 版插件定义",
        "v2/effect/integration.ts: 集成/认证注册",
        "v2/promise/index.ts: Promise 版插件 API",
        "shell.ts: Shell 封装"
      ],
      "why_design": "作为第三方扩展的稳定 SDK 面（发布到 npm，files 只含 dist），把 opencode 对插件的实现细节隔离在 core 内部，对外只暴露类型化、版本化的注册 API。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-tui",
      "name": "@opencode-ai/tui",
      "short": "tui",
      "group": "G8-终端UI",
      "group_name": "G8-终端UI",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "终端 UI 应用。src/index.tsx:1 导出 run/TuiInput；src/app.tsx:1-50 用 @opentui/solid 渲染整棵组件树（SDK/Data/Location/Theme/Clipboard 等 Provider 与 Session 路由），构建在 @opencode-ai/sdk/v2 客户端之上（src/context/sdk.tsx:1）。src/plugin/runtime.tsx 加载 @opencode-ai/plugin/tui 插件，feature-plugins/ 内含 diff-viewer/notifications/which-key/sidebar 等内置插件（src/feature-plugins/builtins.ts:1）。",
      "provides": [
        "终端渲染运行时（src/app.tsx:1，基于 @opentui/solid）",
        "会话交互 UI：输入/补全/历史/frecency（src/component/prompt/*）",
        "对话框系统：模型/agent/主题/会话列表等 20+（src/component/dialog-*.tsx）",
        "内置 TUI 插件：diff-viewer/通知/which-key/侧栏（src/feature-plugins/builtins.ts）",
        "多 Context Provider：sdk/data/sync/theme/clipboard（src/context/*）",
        "V2 SDK 数据层接入（src/context/data.tsx、sdk.tsx）"
      ],
      "key_modules": [
        "index.tsx: run() 入口",
        "app.tsx: 应用壳与 Provider 树",
        "context/sdk.tsx: SDK 客户端接入",
        "plugin/runtime.tsx: TUI 插件运行时",
        "component/prompt/index.tsx: 输入区",
        "feature-plugins/system/diff-viewer.tsx: 差异查看器",
        "routes/session/index.tsx: 会话路由视图"
      ],
      "why_design": "将终端交互封装为独立可复用包，经 opencode 的 cli/tui/layer.ts 加载，同时支持 TUI 插件扩展（@opencode-ai/plugin/tui），使 CLI 与桌面端共用交互逻辑。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① 全量界面文案 unicode 省略号替换('...'→'…')。② 使用 @opentui/solid 的 Dynamic 替代 solid-js/web。③ prompt 无 session 时加 <text/> fallback。"
    },
    {
      "id": "oc-schema",
      "name": "@opencode-ai/schema",
      "short": "schema",
      "group": "G1-数据模型",
      "group_name": "G1-数据模型",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "纯类型/数据模型包，仅依赖 effect（package.json:14-16）。以 Effect Schema 定义全部领域类型：Session/SessionInput/SessionMessage（src/session*.ts）、Event 与 Durable 事件清单（src/event.ts、event-manifest.ts、durable-event-manifest.ts）、Provider/Model（src/provider.ts、model.ts）、Permission、Prompt、Agent 等 40+ 模型。src/index.ts:1-28 统一 re-export；src/schema.ts:3-10 提供 AbsolutePath/RelativePath/DateTimeUtc 等基础 branded schema。",
      "provides": [
        "领域数据模型：Session/Message/Event/Permission/Provider/Model 等（packages/schema/src/index.ts:1-28）",
        "Effect Schema 编解码与校验基础（packages/schema/src/schema.ts:3-30）",
        "事件定义清单：Event/EventManifest/Durable（packages/schema/src/event.ts、durable-event-manifest.ts）",
        "V1 兼容模型（packages/schema/src/v1/session.ts、question.ts、permission.ts）"
      ],
      "key_modules": [
        "index.ts: 全量模型统一出口",
        "schema.ts: 基础 branded schema（路径/时间/整数）",
        "event.ts: 事件定义与 ID",
        "session.ts + session-input.ts + session-message.ts: 会话三大模型",
        "provider.ts + model.ts: 提供商与模型模型",
        "permission.ts: 权限规则 schema",
        "durable-event-manifest.ts: 持久事件清单",
        "v1/session.ts: 旧版会话兼容模型"
      ],
      "why_design": "作为依赖链最底层的单一事实源，所有包共享同一套 Effect Schema 数据契约，保证类型与运行时校验一致，避免跨包重复定义与 drift。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-cli",
      "name": "@opencode-ai/cli",
      "short": "cli",
      "group": "G10-应用",
      "group_name": "G10-应用",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "OpenCode 2.0 CLI 入口（bin: lildax）。src/index.ts:10-32 用 Effect 构建命令运行时：Runtime.handlers 将 Commands 映射到懒加载 handler（api/debug/migrate/service/serve）；commands/commands.ts:6-8 用 effect CLI 声明命令树；framework/runtime.ts:58-59 执行 Command.run；services/daemon.ts 提供后台守护进程服务。命令处理依赖 @opencode-ai/core 的 AppNodeBuilder 与 @opencode-ai/server 路由（serve.ts:2-10）。",
      "provides": [
        "opencode 命令树（api/debug/migrate/service/serve，commands.ts:9-50）",
        "Effect 驱动的命令运行时与懒加载 handler（framework/runtime.ts:58）",
        "后台 daemon 服务管理（services/daemon.ts）",
        "TUI 入口（tui.ts 导入 @opencode-ai/tui 运行）",
        "版本/渠道识别（bin/lildax.cjs 打包）"
      ],
      "key_modules": [
        "index.ts: CLI 运行时装配入口",
        "commands/commands.ts: 命令树规格定义",
        "commands/handlers/serve.ts: 启动 v2 API 服务器",
        "commands/handlers/service/*: 后台服务管理命令",
        "framework/runtime.ts: Effect 命令运行框架",
        "framework/spec.ts: 命令规格 DSL",
        "services/daemon.ts: 守护进程层"
      ],
      "why_design": "作为 v2 时代的命令行入口，复用 effect CLI 生态以类型安全方式声明命令，并将实际逻辑委托给 core/server/tui 包。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-effect-drizzle-sqlite",
      "name": "@opencode-ai/effect-drizzle-sqlite",
      "short": "effect-drizzle-sqlite",
      "group": "G15-存储适配",
      "group_name": "G15-存储适配",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Drizzle ORM 的 Effect 适配层。src/effect-sqlite/driver.ts:15-60 定义 EffectSQLiteDatabase 与 make()，通过 drizzle 的 SQLiteAsyncDialect + EffectSQLiteSession 把 Drizzle 查询桥接到任意 Effect SqlClient（注释明示可配 @effect/sql-sqlite-node/bun，driver.ts:30-46）；session.ts:35-49 实现 prepareQuery 与 Effect 化事务会话；sqlite-core/effect/ 提供 select/insert/update/delete/raw/count 全套 Effect 化查询构建器；migrator.ts 提供迁移执行。",
      "provides": [
        "EffectSQLiteDatabase 工厂（make()，driver.ts:49）",
        "Drizzle↔Effect 会话桥接（EffectSQLiteSession，session.ts:35）",
        "sqlite-core 全套 Effect 查询构建器（sqlite-core/effect/ 10 个文件）",
        "迁移执行器（effect-sqlite/migrator.ts）",
        "EffectCache/EffectLogger 默认 Layer（driver.ts:28）"
      ],
      "key_modules": [
        "effect-sqlite/driver.ts: 数据库工厂与配置",
        "effect-sqlite/session.ts: Effect 会话/查询准备",
        "effect-sqlite/migrator.ts: 迁移",
        "sqlite-core/effect/db.ts: 数据库基类",
        "sqlite-core/effect/query.ts: 查询构建器基类",
        "index.ts: 公共导出面"
      ],
      "why_design": "让 Drizzle 类型安全的 schema 查询能在 Effect 生态（SqlClient/Stream/Layer）中运行，供核心存储层使用且依赖可注入、可测试。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-opencode",
      "name": "opencode",
      "short": "opencode",
      "group": "G19-主入口",
      "group_name": "G19-主入口",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "主应用/CLI 入口。src/index.ts:45 用 yargs 装配 run/serve/tui/agent/acp 等全部子命令；src/cli/tui/layer.ts:1 经 @opencode-ai/tui 拉起终端 UI；src/server/server.ts:4-13 组装 Node HTTP/WebSocket 服务器与 HttpApi 路由。会话编排由 src/session/processor.ts:26-27 驱动（回退 LLM、工具调度），工具清单在 src/tool/registry.ts:4-16 注册（read/edit/shell/glob/grep/webfetch 等 20+ 内置工具）。",
      "provides": [
        "CLI 入口：yargs 子命令体系（run/serve/tui/agent/acp/github 等 20+ 命令，packages/opencode/src/index.ts:45）",
        "HTTP/SSE/WebSocket 服务器实例（packages/opencode/src/server/server.ts:27-30）",
        "会话处理器：消息输入→LLM 请求→工具执行的编排循环（packages/opencode/src/session/processor.ts:32）",
        "内置工具集：read/write/edit/shell/glob/grep/task/webfetch 等（packages/opencode/src/tool/registry.ts:4）",
        "Session 状态机、compaction/retry/summary/reminders 生命周期（packages/opencode/src/session/*）",
        "插件宿主：加载外部 plugin 与 provider 扩展（packages/opencode/src/plugin/index.ts:8）",
        "Code Mode 工具桥接（packages/opencode/src/tool/code-mode.ts:4）"
      ],
      "key_modules": [
        "index.ts: CLI yargs 入口与子命令注册",
        "cli/cmd/serve.ts: serve 命令装配服务器",
        "server/server.ts: Node HTTP+WebSocket 监听器",
        "session/processor.ts: 会话消息处理主循环",
        "tool/registry.ts: 内置工具注册表",
        "session/llm/native-request.ts: LLM 请求构造与 native 协议",
        "plugin/index.ts: 外部插件加载与 provider 钩子",
        "tool/code-mode.ts: CodeMode 沙箱工具适配"
      ],
      "why_design": "作为可分发 CLI 二进制（bin/opencode）聚合所有上层能力，把核心服务、LLM、TUI、协议编排成终端可执行产品，同时保持与 server 分离以便 web/desktop 前端复用同一套服务。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① provider/transform.ts 新增 anthropicBindsThinking() + anthropicBlockBinding()：对 Claude 5.1+（Fable 5.1/Mythos 5.1）注入 thinking blockBinding(prefixMismatchBehavior:'drop_block')，供 opencode 重渲染前缀时降级不报错；Mythos 5.1 明确跳过；支持 options.blockBinding===false 配置级 opt-out；覆盖 @ai-sdk/anthropic、google-vertex/anthropic、bedrock(reasoningConfig) 三通道。② plugin/azure.ts 大幅简化：移除 discoverAzureModels/订阅列表/resource selection 弹窗/accounts 枚举，AzureAuthPlugin 不再读 azureProfile.json，仅保留资源名 prompt + az CLI token。③ provider/provider.ts chunkTimeout/headerTimeout 默认 300_000、可配 false；SSE reader.cancel 错误吞掉。④ session/processor.ts 记录 provider 丢弃的 thinking block(inputTransformations) 警告。⑤ session/tools.ts 修复工具调用日志 time.start 错误重置。⑥ tool/apply_patch.ts 空 movePath 不再展开。⑦ plugin/openai/codex.ts GPT 版本过滤改按 major/minor 比较。⑧ plugin/github-copilot/copilot.ts 新增 X-Interaction-Id=sessionID 头。⑨ 依赖升级 @ai-sdk/amazon-bedrock 4.0.158→4.0.166、@ai-sdk/anthropic 3.0.82→3.0.111、gitlab-ai-provider 6.12.1→6.13.0。"
    },
    {
      "id": "oc-enterprise",
      "name": "@opencode-ai/enterprise",
      "short": "enterprise",
      "group": "G10-应用",
      "group_name": "G10-应用",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "基于 SolidStart 的企业版/云端分享服务。src/app.tsx:1-14 用 @opencode-ai/ui 的 Provider（Marked/Dialog/I18n）搭建 SSR 应用根并做 locale 检测；src/routes/api/[...path].ts:1-30 用 Hono + hono-openapi 定义 OpenAPI 文档与 /share 创建端点（zod schema，经 core/share.ts 与 sst Resource 持久化）；routes/share/[shareID].tsx 用 @opencode-ai/session-ui 的 SessionTurn/SessionReview/MessageNav 渲染只读分享会话；core/storage.ts 提供基于 R2 的存储。",
      "provides": [
        "Hono OpenAPI /api 端点（/share 创建、文档，routes/api/[...path].ts:20-27）",
        "只读分享会话页面（routes/share/[shareID].tsx，复用 session-ui 组件）",
        "R2 对象存储封装（core/storage.ts）",
        "SSR 应用根与多语言检测（app.tsx:58 detectLocale）",
        "cloudflare 部署目标支持（build:cloudflare script）"
      ],
      "key_modules": [
        "app.tsx: SolidStart 应用根与 i18n bridge",
        "routes/api/[...path].ts: OpenAPI 分享 API",
        "routes/share/[shareID].tsx: 分享会话只读页",
        "core/share.ts: 分享逻辑（sdk/v2 模型）",
        "core/storage.ts: 存储层",
        "entry-server.tsx: SSR 服务端入口"
      ],
      "why_design": "作为云端托管的企业分享服务，复用 ui/session-ui 渲染能力与 core/sdk 数据模型，通过 SolidStart SSR 提供公开只读分享体验。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-server",
      "name": "@opencode-ai/server",
      "short": "server",
      "group": "G4-服务端",
      "group_name": "G4-服务端",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "HTTP/SSE 服务器实现层。src/api.ts:5-8 用 @opencode-ai/protocol/api 的 makeDefaultApi 装配 HttpApi，并注入 LocationMiddleware/SessionLocationMiddleware 具体中间件；src/routes.ts:1-13 把 core 的各类服务（SessionV2/SessionExecution/LocationServiceMap/Database/ToolOutputStore 等）装配为 Effect Layer；src/handlers.ts:1-40 合并 19 个 handler（session/message/agent/model/provider/fs/event/pty 等），每个 handler 将 HTTP 请求桥接到 core 领域服务。",
      "provides": [
        "HttpApi 装配与中间件注入（packages/server/src/api.ts:5-8）",
        "19 个资源 handler（packages/server/src/handlers.ts:21-40）",
        "core 服务到 HTTP 层的 Effect Layer 桥接（packages/server/src/routes.ts:1-13）",
        "授权/会话定位中间件（packages/server/src/middleware/authorization.ts、session-location.ts）",
        "CORS 与 auth 基础（packages/server/src/cors.ts、auth.ts）"
      ],
      "key_modules": [
        "api.ts: Api 装配（复用 protocol 默认 Api）",
        "routes.ts: 服务 Layer 组装",
        "handlers.ts: handler 聚合",
        "handlers/session.ts: 会话端点实现",
        "handlers/event.ts: SSE 事件端点",
        "middleware/authorization.ts: 鉴权中间件",
        "middleware/session-location.ts: 会话目录解析"
      ],
      "why_design": "把 Effect HttpApi 与 core 领域服务粘合为可运行的 HTTP 服务（不依赖 CLI），使 opencode 主程序、sdk createOpencodeServer 与其他宿主都能复用同一套服务端装配。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-sdk",
      "name": "@opencode-ai/sdk",
      "short": "sdk",
      "group": "G3-客户端",
      "group_name": "G3-客户端",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "官方 JS 客户端 SDK（packages/sdk/js/）。src/index.ts:1-21 导出 client/server 并通过 createOpencode 同启；src/client.ts:33-50 createOpencodeClient 基于 @hey-api 生成的 gen/sdk.gen.ts（v2 版 src/v2/gen/sdk.gen.ts:7077 class OpencodeClient）并注入 directory header 重写；src/server.ts:22-40 createOpencodeServer 用 cross-spawn 拉起 opencode serve 子进程并等待监听。v2 子目录提供新一代 client/server/data 导出（src/v2/index.ts:1-23）。",
      "provides": [
        "类型化 HTTP 客户端 createOpencodeClient（packages/sdk/js/src/client.ts:33）",
        "服务端启动助手 createOpencodeServer（spawn opencode serve，packages/sdk/js/src/server.ts:22）",
        "一体化 createOpencode（packages/sdk/js/src/index.ts:8-21）",
        "V2 代客户端/服务端 API（packages/sdk/js/src/v2/client.ts、server.ts）",
        "从 openapi.json 生成的完整类型与 SDK（packages/sdk/js/src/v2/gen/sdk.gen.ts）"
      ],
      "key_modules": [
        "client.ts: 客户端工厂与 header 注入",
        "server.ts: 子进程服务启动器",
        "process.ts: 子进程停止/信号处理",
        "error-interceptor.ts: 客户端错误包装",
        "v2/client.ts: V2 客户端",
        "v2/gen/sdk.gen.ts: 生成的完整 SDK 类",
        "v2/gen/client/*.gen.ts: 生成的 HTTP 核心"
      ],
      "why_design": "对外发布（npm 包）的官方 SDK，将 opencode 内部 server 的 openapi.json 编译为类型安全的客户端，同时提供进程级 server 托管，供第三方应用与 plugin 使用。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① sdk/js/src/v2/gen/types.gen.ts ProviderConfig.chunkTimeout 类型由 number|undefined 改为 number|false。② sdk/openapi.json 同步 chunkTimeout anyOf(integer|boolean false)。"
    },
    {
      "id": "oc-sdk-next",
      "name": "@opencode-ai/sdk-next",
      "short": "sdk-next",
      "group": "G3-客户端",
      "group_name": "G3-客户端",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "Effect 原生的进程内 OpenCode host SDK（过渡包，替代生成式 @opencode-ai/sdk）。src/opencode.ts 的 create() 用 AppNodeBuilder 构建 ApplicationTools/PermissionSaved 上下文，把 server 的 createEmbeddedRoutes 编译成 Web handler 并注入内存 fetch，客户端由此在进程内执行全部路由而无需监听端口/网络 I/O。src/index.ts 聚合 OpenCode 与 Tool 模块并再导出 client 的 Effect 类型。",
      "provides": [
        "进程内 OpenCode host：OpenCode.create()（src/opencode.ts:10）",
        "内存路由执行：Server router → Web handler → fetch（src/opencode.ts:20-38）",
        "本地工具注册 tools.register（走 ApplicationTools 服务，src/opencode.ts:41）",
        "DI Layer：OpenCode.layer/Service（src/opencode.ts:47,49）",
        "Tool 门面：Failure/RegistrationError/make 再导出（src/tool.ts:1）",
        "Effect client 类型再导出（ClientError/Session/Model 等，src/index.ts:4）"
      ],
      "key_modules": [
        "opencode.ts:10 - create()：构建上下文、编译内嵌路由、返回 client+tools",
        "index.ts:1 - 模块聚合与 client/effect 类型再导出",
        "tool.ts:1 - Tool 模块再导出（core/tool）"
      ],
      "why_design": "README 明示：作为 sdk 的过渡替代，让嵌入式应用无需网络即可获得完整 host 能力，保留 sdk 的注册/工具语义并转为 Effect-native。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-core",
      "name": "@opencode-ai/core",
      "short": "core",
      "group": "G6-核心服务",
      "group_name": "G6-核心服务",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "核心服务层（无根 index.ts，按子路径导出，package.json:18-23 暴露 effect/layer-node、session/runner 等）。实现数据库（src/database/sqlite.ts，drizzle ORM）、会话执行（src/session/runner/index.ts:20-28 从已记录历史执行一次续跑）、配置解析（src/config/* 覆盖 agent/command/mcp/lsp/formatter）、权限策略（src/permission.ts）、事件流（src/event.ts，基于 PubSub/Queue）、文件系统与搜索（src/filesystem/*，含 ripgrep 封装 src/ripgrep.ts:5）。Effect 运行时层见 src/effect/layer-node.ts 与 app-node-builder.ts。",
      "provides": [
        "SQLite 持久化：drizzle schema/迁移（packages/core/src/database/sqlite.ts、migration.ts）",
        "Session 执行引擎（packages/core/src/session/runner/index.ts:19-28）",
        "配置系统：agent/command/mcp/lsp/formatter/plugin 解析（packages/core/src/config/*）",
        "权限与策略引擎（packages/core/src/permission.ts:5、policy.ts）",
        "事件总线与持久化事件（packages/core/src/event.ts:3）",
        "文件系统/ripgrep 搜索/文件监听（packages/core/src/filesystem/*、ripgrep.ts）",
        "Effect 服务层组装（packages/core/src/effect/layer-node.ts、app-node-builder.ts）",
        "Provider/Model/Catalog/集成认证 领域服务（packages/core/src/provider.ts、catalog.ts、integration.ts）"
      ],
      "key_modules": [
        "session/runner/index.ts: 会话续跑执行器（单次 continuation）",
        "database/sqlite.ts + schema.sql.ts: SQLite 表结构与访问",
        "config/agent.ts: Agent 配置模型",
        "permission.ts: 权限规则评估",
        "event.ts: 事件流与持久化",
        "effect/layer-node.ts: Node 运行时 Effect Layer 组装",
        "tool/registry.ts: 核心工具注册表（供 opencode 复用）",
        "filesystem/fff.*.ts: 文件快速查找（Bun/Node 双实现）"
      ],
      "why_design": "把会话/存储/配置/权限等可复用领域逻辑从 CLI 与 HTTP 层抽离为纯 Effect 服务，供 opencode 主程序、server 包及测试直接注入依赖，实现平台无关的核心（bun/node 双实现见 package.json imports 的 #sqlite/#pty/#fff）。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.25 → v1.18.30",
      "what_changed": "① src/aisdk.ts SSE reader.cancel 错误吞掉。② src/v1/config/provider.ts Info 里 headerTimeout/chunkTimeout schema 改为 Union(PositiveInt, Literal(false))，描述明确 default 300000 与 'Set to false to disable'。③ 依赖同 opencode 包升级(bedrock/anthropic/gitlab-ai-provider)。"
    },
    {
      "id": "oc-http-recorder",
      "name": "@opencode-ai/http-recorder",
      "short": "http-recorder",
      "group": "G14-工具",
      "group_name": "G14-工具",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "HTTP 录制/回放工具（package.json:5 描述：Record and replay Effect HTTP client traffic with deterministic cassettes）。src/effect.ts:16-25 提供带录制能力的 HttpClient Layer；src/recorder.ts:11-18 resolveAutoMode 决定 record/replay/passthrough 模式（CI 强制 replay）；src/cassette.ts 实现 cassette 文件存储；src/redactor.ts 负责敏感信息脱敏；src/websocket.ts:10-31 支持 WebSocket 录制回放。",
      "provides": [
        "HTTP 客户端录制层（packages/http-recorder/src/effect.ts:16-25）",
        "cassette 录制文件格式与存储（packages/http-recorder/src/cassette.ts）",
        "自动模式：record/replay/passthrough（packages/http-recorder/src/recorder.ts:11-18）",
        "请求匹配（packages/http-recorder/src/matching.ts）",
        "敏感信息脱敏（packages/http-recorder/src/redactor.ts）",
        "WebSocket 录制回放（packages/http-recorder/src/websocket.ts:10-31）"
      ],
      "key_modules": [
        "effect.ts: HttpClient Layer 封装",
        "recorder.ts: 模式决策与回放状态",
        "cassette.ts: cassette 服务",
        "redactor.ts: 脱敏器",
        "matching.ts: 请求匹配",
        "websocket.ts: WebSocket 录制",
        "schema.ts: 交互 schema"
      ],
      "why_design": "作为测试基础设施：让 LLM 请求与 HTTP 流量可确定性回放（VCR 模式），保证 CI 中测试不依赖网络与真实 token 计费；被 core/llm 的测试与开发流程引用。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-script",
      "name": "@opencode-ai/script",
      "short": "script",
      "group": "G14-工具",
      "group_name": "G14-工具",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "构建/发布脚本共享工具包。src/index.ts:5-76 读取仓库根 package.json 校验 bun 版本（semver.satisfies 检查，index.ts:16-18）、按环境变量/分支/registry 计算发布 channel（latest/preview）与 version（含 +1 patch 逻辑，index.ts:34-48）、从 .github/TEAM_MEMBERS 加载团队成员名单（index.ts:50-58），最终导出 Script 对象（channel/version/preview/release/team）供发布流水线使用。",
      "provides": [
        "发布版本计算（channel/version/preview，基于 env/分支/npm registry）",
        "Bun 版本校验（强制 ^packageManager 版本，index.ts:16）",
        "团队成员名单加载（.github/TEAM_MEMBERS 解析，index.ts:50）"
      ],
      "key_modules": [
        "index.ts: 全部逻辑（版本/channel/team 计算）"
      ],
      "why_design": "将发布流程共用的版本决策逻辑从 CI 脚本中抽离为可 import 的库，保证多个发布任务（channel 判断、bump 语义）行为一致。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    },
    {
      "id": "oc-effect-sqlite-node",
      "name": "@opencode-ai/effect-sqlite-node",
      "short": "effect-sqlite-node",
      "group": "G15-存储适配",
      "group_name": "G15-存储适配",
      "kind": "package",
      "layer": 0,
      "layer_type": "package",
      "implementation": "基于 Node 内置 node:sqlite 的 Effect SqlClient 实现。src/index.ts:49-161 make() 用 DatabaseSync 建立同步连接（WAL 模式、外键约束，index.ts:59-70）、实现 execute/executeRaw/executeValues/executeUnprepared 全套 SqlClient 接口并挂载 Semaphore(1) 串行化（index.ts:132-134）；classifySqliteError 做错误归类（index.ts:15,80-82）；layer() 将 client 同时注册为 SqliteClient 与泛型 Client.SqlClient（index.ts:163-168），并注入 Reactivity.layer。",
      "provides": [
        "Effect SqlClient 的 SQLite 实现（node:sqlite DatabaseSync）",
        "WAL/外键/只读/扩展加载等连接配置（SqliteClientConfig，index.ts:32-43）",
        "Layer 装配（SqliteClient + Client.SqlClient 双注册，index.ts:163）",
        "SQL 错误分类与 Effect 化（classifySqliteError）",
        "BigInt 安全读取与 stream 占位（setReadBigInts，index.ts:75）"
      ],
      "key_modules": [
        "index.ts: make/layer/连接实现全量逻辑"
      ],
      "why_design": "为 opencode 核心提供零原生编译依赖的 Effect 化 SQLite 驱动（复用 node 内置 sqlite），与 @effect/sql-sqlite-node 定位一致但归属仓库自有实现。",
      "why_modified": "",
      "how_use": "",
      "how_scenario": "",
      "version_delta": "v1.18.14 → v1.18.35",
      "what_changed": ""
    }
  ],
  "edges": [
    {
      "from": "oc-app",
      "to": "oc-client",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/client",
      "evidence_example": "packages/app/src/utils/server-health.ts:4",
      "import_refs": 1
    },
    {
      "from": "oc-app",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-app",
      "to": "oc-schema",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/schema",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-app",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-app",
      "to": "oc-session-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/session-ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-app",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/app/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-cli",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/cli/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-cli",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/cli/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-cli",
      "to": "oc-server",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/cli/package.json dependencies.@opencode-ai/server",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-cli",
      "to": "oc-tui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/cli/package.json dependencies.@opencode-ai/tui",
      "evidence_example": "packages/cli/src/tui.ts:1",
      "import_refs": 1
    },
    {
      "from": "oc-client",
      "to": "oc-schema",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/client/package.json dependencies.@opencode-ai/schema",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-client",
      "to": "oc-protocol",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/client/package.json dependencies.@opencode-ai/protocol",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-app",
      "to": "oc-console-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-app/package.json dependencies.@opencode-ai/console-core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-app",
      "to": "oc-console-mail",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-app/package.json dependencies.@opencode-ai/console-mail",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-app",
      "to": "oc-console-resource",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-app/package.json dependencies.@opencode-ai/console-resource",
      "evidence_example": "packages/console/app/src/component/email-signup.tsx:2",
      "import_refs": 19
    },
    {
      "from": "oc-console-app",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-app/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-core",
      "to": "oc-console-mail",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-core/package.json dependencies.@opencode-ai/console-mail",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-core",
      "to": "oc-console-resource",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-core/package.json dependencies.@opencode-ai/console-resource",
      "evidence_example": "packages/console/core/src/aws.ts:2",
      "import_refs": 7
    },
    {
      "from": "oc-console-function",
      "to": "oc-console-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-function/package.json dependencies.@opencode-ai/console-core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-console-function",
      "to": "oc-console-resource",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-function/package.json dependencies.@opencode-ai/console-resource",
      "evidence_example": "packages/console/function/src/auth.ts:13",
      "import_refs": 2
    },
    {
      "from": "oc-console-support",
      "to": "oc-console-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/console-support/package.json dependencies.@opencode-ai/console-core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-core",
      "to": "oc-effect-drizzle-sqlite",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/core/package.json dependencies.@opencode-ai/effect-drizzle-sqlite",
      "evidence_example": "packages/core/src/database/database.ts:3",
      "import_refs": 3
    },
    {
      "from": "oc-core",
      "to": "oc-effect-sqlite-node",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/core/package.json dependencies.@opencode-ai/effect-sqlite-node",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-core",
      "to": "oc-llm",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/core/package.json dependencies.@opencode-ai/llm",
      "evidence_example": "packages/core/src/tool-output-store.ts:11",
      "import_refs": 21
    },
    {
      "from": "oc-core",
      "to": "oc-schema",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/core/package.json dependencies.@opencode-ai/schema",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-core",
      "to": "oc-plugin",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/core/package.json dependencies.@opencode-ai/plugin",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-enterprise",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/enterprise/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-enterprise",
      "to": "oc-session-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/enterprise/package.json dependencies.@opencode-ai/session-ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-enterprise",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/enterprise/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-llm",
      "to": "oc-schema",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/llm/package.json dependencies.@opencode-ai/schema",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-plugin",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/plugin/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "packages/plugin/src/index.ts:12",
      "import_refs": 1
    },
    {
      "from": "oc-protocol",
      "to": "oc-schema",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/protocol/package.json dependencies.@opencode-ai/schema",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-sdk-next",
      "to": "oc-client",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/sdk-next/package.json dependencies.@opencode-ai/client",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-sdk-next",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/sdk-next/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-sdk-next",
      "to": "oc-server",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/sdk-next/package.json dependencies.@opencode-ai/server",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-server",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/server/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-server",
      "to": "oc-protocol",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/server/package.json dependencies.@opencode-ai/protocol",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-session-ui",
      "to": "oc-client",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/session-ui/package.json dependencies.@opencode-ai/client",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-session-ui",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/session-ui/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-session-ui",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/session-ui/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-session-ui",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/session-ui/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-slack",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/slack/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "packages/slack/src/index.ts:2",
      "import_refs": 1
    },
    {
      "from": "oc-stats-app",
      "to": "oc-stats-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/stats-app/package.json dependencies.@opencode-ai/stats-core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-stats-app",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/stats-app/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-stats-server",
      "to": "oc-stats-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/stats-server/package.json dependencies.@opencode-ai/stats-core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-tui",
      "to": "oc-core",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/tui/package.json dependencies.@opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-tui",
      "to": "oc-plugin",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/tui/package.json dependencies.@opencode-ai/plugin",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-tui",
      "to": "oc-sdk",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/tui/package.json dependencies.@opencode-ai/sdk",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-tui",
      "to": "oc-ui",
      "mechanism": "workspace-dep",
      "evidence": "@opencode-ai/tui/package.json dependencies.@opencode-ai/ui",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-desktop",
      "to": "oc-app",
      "mechanism": "import",
      "evidence": "packages/desktop/src/renderer/index.tsx:17",
      "evidence_example": "",
      "import_refs": 2
    },
    {
      "from": "oc-opencode",
      "to": "oc-core",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-llm",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-plugin",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-protocol",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-schema",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-sdk",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-server",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-tui",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-codemode",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-http-recorder",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 opencode",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-core",
      "to": "oc-http-recorder",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/core",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-desktop",
      "to": "oc-ui",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/desktop",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-cli",
      "to": "oc-script",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/cli",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-enterprise",
      "to": "oc-sdk",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/enterprise",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-storybook",
      "to": "oc-ui",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/storybook",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-storybook",
      "to": "oc-session-ui",
      "mechanism": "semantic-dep",
      "evidence": "stage-01 @opencode-ai/storybook",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-opencode",
      "to": "oc-script",
      "mechanism": "workspace-dep",
      "evidence": "v1.18.25 workspace dep",
      "evidence_example": "",
      "import_refs": 0
    },
    {
      "from": "oc-httpapi-codegen",
      "to": "oc-client",
      "mechanism": "workspace-dep",
      "evidence": "client depends on httpapi-codegen",
      "evidence_example": "",
      "import_refs": 0
    }
  ],
  "groups": [
    "G9-UI组件",
    "G13-边缘服务",
    "G3-客户端",
    "G14-工具",
    "G10-应用",
    "G2-通信协议",
    "G11-文档站点",
    "G16-Console",
    "G18-集成",
    "G12-沙箱",
    "G17-Stats",
    "G5-LLM请求层",
    "G7-插件SDK",
    "G8-终端UI",
    "G1-数据模型",
    "G15-存储适配",
    "G19-主入口",
    "G4-服务端",
    "G6-核心服务"
  ],
  "stats": {
    "nodes": 36,
    "edges": 68,
    "layers": 0,
    "groups": 19,
    "has_cycle": false,
    "modified_pkgs": 0,
    "external_nodes": 0
  }
}