@tbox.cn/app-template-agent 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/AGENTS.md +88 -33
  2. package/ENV.md +5 -4
  3. package/README.md +2 -1
  4. package/apps/client/package.json +2 -2
  5. package/apps/client/src/app.tsx +1 -1
  6. package/apps/client/src/cards/registry.ts +1 -1
  7. package/apps/client/src/main.tsx +1 -1
  8. package/apps/client/src/modules.ts +1 -1
  9. package/apps/client/src/platform/AgentChatApp.tsx +2 -2
  10. package/apps/client/src/platform/agent-runtime.ts +2 -2
  11. package/apps/client/src/store/chat.ts +2 -2
  12. package/apps/client/vite.config.ts +1 -3
  13. package/apps/server/package.json +2 -2
  14. package/apps/server/src/app-tools.ts +1 -1
  15. package/apps/server/src/app.ts +13 -6
  16. package/apps/server/src/cli/collect-registry.ts +1 -1
  17. package/apps/server/src/cli/plugin-doctor.ts +1 -1
  18. package/apps/server/src/cli/plugin-inspect.ts +1 -1
  19. package/apps/server/src/config/integration.ts +1 -1
  20. package/apps/server/src/dev.ts +2 -2
  21. package/apps/server/src/index.ts +1 -1
  22. package/apps/server/src/intent-routes.ts +1 -1
  23. package/apps/server/src/modules.ts +2 -2
  24. package/apps/server/src/pre-tools.ts +2 -2
  25. package/apps/server/src/tools/clock.ts +2 -2
  26. package/apps/server/src/tools/translate.ts +2 -2
  27. package/apps/server/tests/agent-prompt.test.ts +1 -1
  28. package/apps/server/tests/cards-registry.test.ts +1 -1
  29. package/apps/server/tests/intent-dispatcher.test.ts +1 -1
  30. package/apps/server/tests/tool-runtime.test.ts +1 -1
  31. package/package.json +3 -3
  32. package/packages/agent-ui-kit/package.json +2 -2
  33. package/packages/agent-ui-kit/src/ChatPage.tsx +1 -1
  34. package/packages/agent-ui-kit/src/chat-config.ts +1 -1
  35. package/packages/agent-ui-kit/src/components/ActionBar/DebugButton.tsx +1 -1
  36. package/packages/agent-ui-kit/src/components/ActionBar/index.tsx +2 -2
  37. package/packages/agent-ui-kit/src/components/CardRenderer.tsx +1 -1
  38. package/packages/agent-ui-kit/src/components/ChatInput/index.test.tsx +1 -1
  39. package/packages/agent-ui-kit/src/components/ChatInput/index.tsx +1 -1
  40. package/packages/agent-ui-kit/src/components/ChatInput/voice/useVoicePress.ts +2 -2
  41. package/packages/agent-ui-kit/src/components/MessageBubble/index.tsx +1 -1
  42. package/packages/agent-ui-kit/src/components/QuickCommands/index.test.tsx +1 -1
  43. package/packages/agent-ui-kit/src/components/ToolCallBlock/detail.test.ts +1 -1
  44. package/packages/agent-ui-kit/src/components/ToolCallBlock/detail.ts +1 -1
  45. package/packages/agent-ui-kit/src/hooks/useMediaUpload.ts +2 -2
  46. package/packages/agent-ui-kit/src/hooks/useTTSAutoPlay.ts +2 -2
  47. package/packages/agent-ui-kit/src/store-context.tsx +1 -1
  48. package/packages/agent-ui-kit/src/types.ts +2 -2
  49. package/packages/agent-ui-kit/src/utils/haptics.test.ts +1 -1
  50. package/packages/agent-ui-kit/src/utils/haptics.ts +1 -1
  51. package/packages/agent-ui-kit/src/utils/tool-call-display.test.ts +1 -1
  52. package/packages/agent-ui-kit/src/utils/tool-call-display.ts +1 -1
  53. package/packages/provider-custom/AGENTS.md +47 -21
  54. package/packages/provider-custom/README.md +1 -1
  55. package/packages/provider-custom/package.json +3 -2
  56. package/packages/provider-custom/src/server/index.ts +15 -12
  57. package/packages/provider-custom/tbox.module.json +8 -8
  58. package/pnpm-lock.template.yaml +108 -53
  59. package/pnpm-workspace.template.yaml +7 -3
  60. package/profiles/mall/TEMPLATE.md +42 -0
  61. package/profiles/mall.json +3 -2
  62. package/apps/client/src/shims/node-stub.ts +0 -14
package/AGENTS.md CHANGED
@@ -1,15 +1,6 @@
1
1
  # AGENTS.md
2
2
 
3
- template-agent 是多包 pnpm workspace:`apps/` 薄组装端 + `packages/` 模块。客户端同时运行在浏览器和支付宝小程序 web-view 壳中。
4
-
5
- > **唯一模板(W4 单一模板统一化)**:缺省出厂 = 空装配(chat 形态);商圈形态经 `profiles/mall.json` 画像加装
6
- > (`tbox-app create --profile mall`:mall-core/mall-home + 六业务模块 + config 叠加)。历史 base/mall 双生约定退役。
7
-
8
- > **工作区上下文(发布态消费,005 v0.4.0)**:仓库内本目录是**根 workspace 成员子树**(无独立 `pnpm-workspace.yaml`),
9
- > 平台引用 `catalog:` + 根 `pnpm-workspace.yaml` `overrides: workspace:*` 回指根 `packages/` 真源;`pnpm` 命令在根上下文执行。
10
- > `tbox-app create` 从模板源(目录或 pack tgz)展开生成应用——**不拼接平台真源**:生成应用 `packages/` 仅业务/local 模块,
11
- > 平台包以 `catalog:` 引用,验证态经注入 overrides(`file:` 本地 tgz)、生产态经 registry 安装;`pnpm-workspace.yaml` 由
12
- > `pnpm-workspace.template.yaml` 改名生成。
3
+ 本应用是多包 pnpm workspace:`apps/` 薄组装端 + `packages/` 模块。客户端同时运行在浏览器和支付宝小程序 web-view 壳中;缺省为空装配(chat 形态),商圈形态为创建期 `--profile mall` 画像加装产物(应用内以已装模块为准)。
13
4
 
14
5
  ## 工程结构
15
6
 
@@ -17,10 +8,8 @@ template-agent 是多包 pnpm workspace:`apps/` 薄组装端 + `packages/` 模
17
8
  |---|---|
18
9
  | `apps/server` | Express + WS 装配入口,HTTP 路由,TTS 代理;业务工具/卡片由模块自注册(自注册闭环) |
19
10
  | `apps/client` | React/Vite 装配入口,业务页面/组件/adapters/bridge(家页 MallHome 由 mall-home 模块经 home 槽供给) |
20
- | `packages/` | 模块目录(空装配起点:`tbox-app new module <name>` 或 `module add` 生成 `@app/<id>` 成员;根 workspace 内平台真源在根 `packages/`) |
21
-
22
- > **画像供能(017 家族)**:mall 形态 = profiles/mall.json 声明的模块序列(mall-core 域装配 + mall-home 家页 + 六业务模块)
23
- > + profiles/mall/config 叠加;公共能力(协议/机制/配置链)沉淀 SDK/CLI——新增通用能力先落 SDK/kit 再被模板/模块消费。
11
+ | `packages/` | 模块目录(`tbox-app new module <name>` 或 `module add` 生成 `@app/<id>` 成员;出厂预装 `provider-custom`(自定义 API 实施落点)、`agent-ui-kit`(组件库)与 `contracts-mall` shim) |
12
+ | `profiles/` | 创建期画像(`--profile` 加装计划;应用内不再消费,可忽略) |
24
13
 
25
14
  ## 模块开发(双端自注册闭环,逐行同构)
26
15
 
@@ -60,29 +49,95 @@ apps/client/src/cards/registry.ts # 卡片注册表快照(CardType
60
49
  apps/server/src/index.ts # 服务端入口(HTTP + WS + Vite middleware + createServerContext + createEngineFromContext)
61
50
  apps/server/src/modules.ts # 服务端模块装配(registerAll)
62
51
  apps/server/src/module-ports.ts # 模块 ports 动态装配(LinkedPanel/bumpin 数据源;契约派生 + 漂移守卫)
63
- packages/app-sdk/src/server/chat-engine.ts # ChatEngine 工厂
64
- packages/app-sdk/src/server/context.ts # ServerContext(注册表聚合 + createServerContext)
65
- packages/app-sdk/src/server/build-engine.ts # createEngineFromContext / createSdkToolRuntime(出卡 capture 在 engine 构造期包装,见 tool-cards.ts)
66
- packages/app-sdk/src/client/chat-store.ts # ChatStore 工厂
67
- packages/contracts/src/ # 跨端类型契约
52
+ packages/provider-custom/src/server/index.ts # 自定义 API adapter 实施落点(步骤见该包 AGENTS.md)
68
53
  config/ # chat/model/plugin 配置
69
54
  ```
70
55
 
71
- ## 常用命令
56
+ ## 运行与验证(平台沙箱)
57
+
58
+ 应用构建与运行在平台沙箱中,启动/停止/重启由平台负责——不要运行 `pnpm dev`、`pnpm start`
59
+ 等长驻进程命令(沙箱规则 `config/rules/no-persistent-process.md`);`scripts/` 下生命周期
60
+ 脚本(prepare/dev/start/stop/build)同样由平台调用。你只改代码与配置,用一次性命令验证:
72
61
 
73
62
  ```sh
74
- pnpm install
75
- pnpm dev # 单进程 localhost:8000(API + WS + 页面 + HMR)
63
+ pnpm install # 会话开始时 node_modules 缺失先装
76
64
  pnpm typecheck
77
65
  pnpm test
78
66
  pnpm build
79
- pnpm verify # typecheck + test + build + verify:generated
80
- pnpm verify:generated # 装配一致 + 锚点完整 + 无裸露 import
81
- pnpm plugin:doctor
67
+ pnpm verify # typecheck + test + lint + build + verify:generated + check:inspector
68
+ pnpm verify:generated # 装配一致 + 锚点完整 + 无裸露 import
69
+ pnpm plugin:doctor # 插件排障
82
70
  pnpm plugin:inspect <pluginId> <toolId>
83
71
  ```
84
72
 
85
- starter 文档:`tbox-app starter --type agent-mall`;可用类型:`tbox-app starter --list`。在沙箱中使用 `tbox-app create . --name <app-name> --source @tbox.cn/app-template-agent --profile mall` 原地初始化(缺省不带 --profile = 空装配 chat 形态),应用模板的 `AGENTS.md` 会覆盖 starter seed。模块安装/装配由 `tbox-app` CLI(`@tbox.cn/app-cli`)管理:`new <module|provider|theme> <name>`(应用内脚手架)/ `module add --mode local|codegen|sdk --source <路径|tgz|registry包> / remove / list / sync / diff / doctor / update / publish`。add/remove/sync 后需 `pnpm install`。未安装 CLI 时:`pnpm add -g @tbox.cn/app-cli`(registry 安装)。
73
+ 环境变量与配置面(`config/`)见 `ENV.md`。
74
+
75
+ ## tbox-app CLI(模块与装配管理)
76
+
77
+ CLI 免安装,命令均经 `npx --yes @tbox.cn/app-cli <cmd>` 运行(下表简写 `tbox-app`;完整
78
+ 命令面 `tbox-app --help`)。add/remove/sync 后需 `pnpm install`:
79
+
80
+ | 命令 | 用途 |
81
+ |---|---|
82
+ | `module add <pkg> --mode codegen --source <pkg\|路径\|tgz>` | 安装模块(codegen 展开 / local 本地目录 / sdk registry 安装) |
83
+ | `module remove <id>` | 卸载模块(见「删除模块」) |
84
+ | `module list` / `sync` / `diff` / `doctor` | 已装清单 / 增量装配 / 漂移对比 / 结构校验 |
85
+ | `module update <module>` | 升级模块(codegen → 3-way merge) |
86
+ | `new <module\|provider\|theme> <name>` | 应用内脚手架(生成 `packages/<id>` 并完成装配) |
87
+ | `provider use / bind / unbind / unuse` | 集成绑定(写 `config/integrations.json`;仅字符串厂商——自定义 API 声明直接编辑该文件;bind/use 整槽覆盖既有 provider,含内联声明) |
88
+ | `theme use <id>` / `theme list` | 主题接线 / 状态 |
89
+ | `starter --list` / `starter --type <type>` | starter 文档查询(商圈模块清单见 `--type agent-mall`) |
90
+
91
+ ## 自定义服务集成(provider-custom)
92
+
93
+ 自定义 API = 服务的真实后端由你自己对接:声明住在 `config/integrations.json`,adapter
94
+ 代码住在 `packages/provider-custom/`。服务后端三选一:Mock(演示数据,装 provider-mock
95
+ 即用)/ 自定义 API(你自己的后端接口——本节流程)/ 服务商集成(官方 provider 包,
96
+ `module add` + `provider bind`)。收到「为某服务/模块/应用接入自定义 API」(或「对接
97
+ 我的 API」等同义说法)的请求时按四步走:
98
+
99
+ 1. **说明并收集信息**:目标不在已装模块服务槽词汇内 → 说明未装该模块,引导
100
+ `module add` 或 `new module`,不进入后续步骤。在词汇内 → 简要说明目标——服务 = 槽
101
+ 展示名与描述 + Port 能力(消费模块 `src/server/ports.ts`(或 `ports/` 目录)或
102
+ `@app/contracts-mall`);模块 = `tbox.module.json` `declare.owns` 清单逐个一句
103
+ (`*.snapshot` 聚合槽在清单内,数据随底层服务派生——落声明时跳过);应用 = 已装业务模块服务清单概览
104
+ (空装配 chat 形态无业务服务,不适用)。再向用户收集:API 地址、认证方式(密钥值经
105
+ 平台凭据引用,不进 prompt/代码/配置明文)、可选连接参数。用户已给出的不重复问。
106
+ 未实施前调用报 `PROVIDER_NOT_IMPLEMENTED` 属预期中间态。
107
+ 2. **落声明**:目标槽已有内联声明则跳过;否则直接编辑 `config/integrations.json`
108
+ (CLI provider 命令仅支持字符串厂商)按下表范围写入槽级声明(`{ provider,
109
+ credentialType, configSchema? }` + implementation 字面量,仅槽级合法;provider 名自定
110
+ 语义化短标识,同一后端的多服务共用同一 provider 名——单键注册,见
111
+ `packages/provider-custom/AGENTS.md`;凭据接线见同文件):
112
+
113
+ | 维度 | 声明范围 | 共享连接参数落点 |
114
+ |---|---|---|
115
+ | 指定服务 | `services.<slot>` 单槽 | 槽/实例级 `config` |
116
+ | 指定模块 | 模块 `declare.owns` 全部服务槽(snapshot 除外) | `modules[<install id>].config` |
117
+ | 应用 | 已装业务模块 owns 并集(空装配不适用) | root `config` |
118
+
119
+ 3. **实施 adapter**:按 `packages/provider-custom/AGENTS.md` 实施(注册键 implementation
120
+ 段 = `'inline'`)。
121
+ 4. **验收**:`pnpm typecheck && pnpm build` 通过 + `npx --yes @tbox.cn/app-cli module
122
+ doctor`;平台重启后该服务的调用不再报 `PROVIDER_NOT_IMPLEMENTED`(resolveService
123
+ 惰性——调用时观测;doctor 对通配槽凭据不设防,运行时判据为最终裁判)。
124
+
125
+ ## 删除模块
126
+
127
+ 模块装卸一律走 CLI——不要手动删 `packages/<id>` 目录或改装配锚点区:
128
+
129
+ ```sh
130
+ npx --yes @tbox.cn/app-cli module list # 确认模块 id(= packages/ 目录名)
131
+ npx --yes @tbox.cn/app-cli module remove <id>
132
+ pnpm install
133
+ ```
134
+
135
+ - `remove` 自动完成:删包(或恢复 `contracts-mall` SDK shim)+ 清锚点装配 + 清理集成绑定
136
+ 死项 + doctor 复查。
137
+ - 被其他模块 required 依赖时会阻止并列出依赖方:先删依赖方;`--force` 仅确认知情时使用。
138
+ - 删除后跑 `pnpm typecheck`:`CardType` 随装配自动收缩,残留消费方会编译报错——按报错
139
+ 清理引用后 `pnpm verify` 收尾。
140
+ - 提示「contracts-mall 已无依赖者」时可再 `module remove contracts-mall` 恢复 SDK shim。
86
141
 
87
142
  ## 平台基础设施
88
143
 
@@ -96,17 +151,17 @@ starter 文档:`tbox-app starter --type agent-mall`;可用类型:`tbox-app
96
151
 
97
152
  ## 双运行时与插件
98
153
 
99
- - 原生能力统一走 `@tbox.cn/app-sdk/client` 的 `createPlatformAdapters()`(ASR/TTS/upload/feedback;007 下沉);业务/UI 不直接判断支付宝壳。
100
- - API/WS 地址由 `@tbox.cn/app-sdk/client` 的 `configureRuntime({ apiBaseUrl })` 注入(`main.tsx`),不得硬编码 host;不直接读 `import.meta.env` 之外的环境(H1)。
154
+ - 原生能力统一走 `@tbox.cn/app-sdk/client` 的 `createPlatformAdapters()`(ASR/TTS/upload/feedback);业务/UI 不直接判断支付宝壳。
155
+ - API/WS 地址由 `@tbox.cn/app-sdk/client` 的 `configureRuntime({ apiBaseUrl })` 注入(`main.tsx`),不得硬编码 host;不直接读 `import.meta.env` 之外的环境。
101
156
  - **不直接 import `@tbox-dev-js/sdk`(全禁)**——平台能力(auth/会话/TTS/LLM/插件/能力适配器/协议客户端)一律经 `@tbox.cn/app-sdk` 公开 API。
102
157
  - 平台"插件"页添加插件时只改 `config/plugins.json`。应用代码不复制插件鉴权、参数注入、runtime ID 或 SDK 客户端。
103
- - 插件结果出卡时按 `packages/contracts/src/cards.ts` 注册 schema,在模块包内注册 adapter 和 client 组件。
158
+ - 插件结果出卡时按 `@tbox.cn/app-contracts` 的 cards schema 注册,在模块包内注册 adapter 和 client 组件。
104
159
 
105
- ## web-view 样式约定(014,POC 沉淀)
160
+ ## web-view 样式约定
106
161
 
107
162
  客户端同时跑浏览器与支付宝小程序 web-view 壳(组件挂载于 H5 视口,非小程序原生渲染),样式遵守:
108
163
 
109
- 0. **视觉体系 = mall-vis 蓝系**(视觉真源:仓库 `docs/reference/templates.md`——换肤面四级级联/域色矩阵 member 金 · parking 藏蓝 · sg 蓝 · promotion 红/UI 模式);视觉值只住 kit tokens / 模块域变量块 / 素材变量消费三层(品牌视觉经主题包覆写——出厂接线 `@tbox.cn/app-theme-tbox` 三行,见 `apps/client/src/main.tsx`),平台 token 名字零增减。
164
+ 0. **视觉体系 = mall-vis 蓝系**(换肤面四级级联;域色矩阵 member 金 · parking 藏蓝 · sg 蓝 · promotion 红/UI 模式);视觉值只住 kit tokens / 模块域变量块 / 素材变量消费三层(品牌视觉经主题包覆写——出厂接线 `@tbox.cn/app-theme-tbox` 三行,见 `apps/client/src/main.tsx`),平台 token 名字零增减。
110
165
  1. **长度单位 PX 大写**(如 `800PX`)——web-view 内联字体放大:小写 `px` 被浏览器 rem 缩放改写,大写跳过改写保持视觉尺寸。
111
166
  2. **flex 子项设 `flex-shrink: 0`**——壳内内容宽度不定,防元素被压缩变形。
112
167
  3. **滚动容器隐藏滚动条**(`::-webkit-scrollbar { display: none }`)——web-view 无原生滚动条,出现即破相。
@@ -115,6 +170,6 @@ starter 文档:`tbox-app starter --type agent-mall`;可用类型:`tbox-app
115
170
  ## 工程边界(check-workspace 校验)
116
171
 
117
172
  - `packages/*` 业务包必须有 `tbox.module.json`;SDK/契约(`app-sdk` / `contracts*` / `shared`)豁免。
118
- - `scripts/` 下所有文件保持可执行位(git 100755;CLI create 后 chmod 兜底);双模板 scripts 文件集合镜像全等(guard-workspace R4)。
173
+ - `scripts/` 下所有文件保持可执行位(git 100755;CLI create 后 chmod 兜底)。
119
174
  - 装配文件不得裸 import(全部 import 行在锚区内);模块包不得 import SDK/契约内部路径(仅公开入口 `@tbox.cn/app-sdk{/server,/client,/platform}` 与 `@tbox.cn/app-contracts`)。
120
- - 构建序列单源 = 根 `build` / `build:client` script(守卫经 `check` 组合注入);`build.sh` 只管环境 + install + 委托——新守卫改 `check` 组合,不改 build.sh;零依赖守卫恒可 install 前(`check:workspace` 已占此位)。
175
+ - 构建序列单源 = 根 `build` / `build:client` script;`scripts/build.sh` 只管环境 + install + 委托(平台调用)。
package/ENV.md CHANGED
@@ -23,8 +23,9 @@
23
23
  无 `instances` 键 = 无参考表(动态形态);env 未注入 → 占位 fail-fast 显性暴露。
24
24
  - 注入形态:mallId-only(miniAppId 尽力回填——root config `miniAppId` 优先、参考表
25
25
  attributes 兜底;双缺仍注入,不阻断默认商圈)。URL 显式参数 `?mallId=` 优先级更高。
26
- - 本地 mock 链:`tbox-app module add` 装 provider-mock → 生成器派生零拓扑 integrations.json →
27
- 裸跑免 mallId 全局会话或任意 `?mallId=` 均可演示。零拓扑形态下 provider-mock 于 register 期
26
+ - 本地 mock 链:`tbox-app module add` 装 provider-mock(0.5.0 极简零配置——开箱免集成配置;
27
+ 动态配置验证面 → provider-mocktest,内部档 `pnpm dev mall-mocktest`)→ 生成器派生零拓扑
28
+ integrations.json → 裸跑免 mallId 全局会话或任意 `?mallId=` 均可演示。零拓扑形态下 provider-mock 于 register 期
28
29
  声明隐式默认单实例(mall-demo / 星河 Mock 小镇)——无 URL 参数访问时默认商圈回显照常生效
29
30
  (显式 instances/defaultInstanceId 恒赢,声明仅兜底)。
30
31
 
@@ -58,7 +59,7 @@ dev/src 与 prod/dist bundle 形态恒等):
58
59
  provider+implementation 从最特异层整组继承(instance > slot > domain > root),组内
59
60
  implementation 缺席经 catalog 派生;部署拓扑 = 顶层 `instances` 注册表 + `defaultInstanceId`;
60
61
  槽 `instances` 键缺席 = 通配激活)。模板不内置——`tbox-app module add` 装入 local 供给
61
- (provider-mock)时由 CLI mock 绑定生成器自动派生零拓扑形态(root.provider + 全 local 槽
62
+ (provider-mock / provider-mocktest——local 供给双包同语义)时由 CLI mock 绑定生成器自动派生零拓扑形态(root.provider + 全 local 槽
62
63
  空对象);真厂商绑定经 `tbox-app provider use/bind` 或 `--config-dir` 真实素材注入。
63
64
  - `config/integrations.json` 顶层 `modules` 节:模块资源绑定(键 = 模块 install id,如
64
65
  `module-customer-service`;`resources.<resourceId> = { type: 'knowledge', datasetId | ref, topK?, scoreThreshold? }`)。
@@ -188,7 +189,7 @@ export MALL_HOME_DEV_SERVICES=true
188
189
 
189
190
  # tbox-app dev 配置面
190
191
 
191
- - `TBOX_CONFIG_DIR`:dev 命令注入的配置目录覆盖(real-env 档位绝对路径);未设时使用默认 `config/`。
192
+ - `TBOX_CONFIG_DIR`:dev 命令注入的配置目录覆盖(preset `configDir` / `--config-dir` 旗标显式指定的目录绝对路径——config 恒显式);未设时使用默认 `config/`。
192
193
  覆盖面含 `llm_provider.json`(`modelName`/`thinking`):注入时 LLM 装配读档位目录文件,
193
194
  其 `modelName` 优先于 `APP_AI_MODEL_NAME`;档目录缺该文件 → 链式回退 env(config-dir 独占
194
195
  注入语义:缺文件 = 显式不指定,不落回模板默认 config)。
package/README.md CHANGED
@@ -43,7 +43,8 @@ tbox-app module doctor # 26 条结构校验
43
43
 
44
44
  ```text
45
45
  template-agent/
46
- profiles/ 模板画像(mall.json 加装计划 + config 叠加;create --profile 消费)
46
+ profiles/ 模板画像(mall.json 加装计划 + config 叠加 + rootFiles 根文件 TEMPLATE.md;
47
+ create --profile 消费——根文件落地应用根)
47
48
  apps/
48
49
  client/ React/Vite 装配端(业务页面/组件/hooks/样式;平台能力经 @tbox.cn/app-sdk/client)
49
50
  server/ Express + WS 装配端(~120 行装配:auth 中间件 + 模块挂载 + 平台路由面/TTS/WS)
@@ -11,7 +11,6 @@
11
11
  "test": "vitest run"
12
12
  },
13
13
  "dependencies": {
14
- "@tbox.cn/app-sdk": "catalog:",
15
14
  "@tbox.cn/app-contracts": "catalog:",
16
15
  "@tbox.cn/app-theme-tbox": "catalog:",
17
16
  "react": "catalog:",
@@ -19,7 +18,8 @@
19
18
  "zustand": "catalog:",
20
19
  "@app/provider-custom": "workspace:*",
21
20
  "@app/agent-ui-kit": "workspace:*",
22
- "@app/contracts-mall": "workspace:*"
21
+ "@app/contracts-mall": "workspace:*",
22
+ "@tbox.cn/app-agent-sdk-client": "catalog:"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "catalog:",
@@ -11,7 +11,7 @@ const CARD_PREVIEW_PATH = '/_tbox/card-preview';
11
11
  const DevCardPreview = import.meta.env.DEV
12
12
  ? lazy(async () => {
13
13
  const [{ CardPreviewPage }, { CARD_REGISTRY }, { authClient }] = await Promise.all([
14
- import('@tbox.cn/app-sdk/client/card-preview'),
14
+ import('@tbox.cn/app-agent-sdk-client/client/card-preview'),
15
15
  import('@/cards/registry'),
16
16
  import('@/platform/agent-runtime'),
17
17
  ]);
@@ -11,7 +11,7 @@
11
11
  * - CLIENT_SLOTS = 槽注册表(home 槽由模块注册)。
12
12
  */
13
13
  import type { CardComponent, TboxCardPayload } from '@tbox.cn/app-contracts';
14
- import { createClientContext } from '@tbox.cn/app-sdk/client';
14
+ import { createClientContext } from '@tbox.cn/app-agent-sdk-client';
15
15
  import { registerAll, type CardType } from '../modules';
16
16
 
17
17
  /** 组装端单例:注册全部模块客户端能力(模块加载期执行一次;注册幂等告警) */
@@ -1,6 +1,6 @@
1
1
  import { StrictMode } from 'react';
2
2
  import { createRoot } from 'react-dom/client';
3
- import { configureRuntime, createLogger, installGlobalErrorReporting } from '@tbox.cn/app-sdk/client';
3
+ import { configureRuntime, createLogger, installGlobalErrorReporting } from '@tbox.cn/app-agent-sdk-client';
4
4
  import App from './app';
5
5
  import { configureChatConfigDefaults } from '@app/agent-ui-kit';
6
6
  import '@app/agent-ui-kit/theme/global.less';
@@ -5,7 +5,7 @@
5
5
  * 锚点区:@tbox:imports-begin/end(模块 import 行)+ @tbox:register-begin/end(模块数组)
6
6
  * CLI 行为:增量插入/删除模块行,保留非标行。
7
7
  */
8
- import type { ClientContext, InferModuleCards } from '@tbox.cn/app-sdk/client';
8
+ import type { ClientContext, InferModuleCards } from '@tbox.cn/app-agent-sdk-client';
9
9
 
10
10
  // @tbox:imports-begin
11
11
  // 其余能力经 `tbox-app module add` 扩展(shopping-guide/member 等商圈模块;mall-home 经 profiles/mall)
@@ -1,9 +1,9 @@
1
- import { createLogger } from '@tbox.cn/app-sdk/client';
1
+ import { createLogger } from '@tbox.cn/app-agent-sdk-client';
2
2
 
3
3
  const appLogger = createLogger('AgentChatApp');
4
4
 
5
5
  import { useCallback, useEffect, useMemo, useState } from 'react';
6
- import { AdapterProvider, createPlatformAdapters, type AdapterContextValue } from '@tbox.cn/app-sdk/client';
6
+ import { AdapterProvider, createPlatformAdapters, type AdapterContextValue } from '@tbox.cn/app-agent-sdk-client';
7
7
  import type { TboxSessionData } from '@tbox.cn/app-contracts';
8
8
  import IndexPage from '@/pages/index/index';
9
9
  import { authClient, platformApi } from './agent-runtime';
@@ -1,9 +1,9 @@
1
1
  /**
2
- * 平台运行时装配(client 平台轴,已下沉 @tbox.cn/app-sdk/client)。
2
+ * 平台运行时装配(client 平台轴,已下沉 @tbox.cn/app-agent-sdk-client)。
3
3
  * 模板唯一的 SDK 单例持有点:authClient(鉴权)+ platformApi(能力凭证/会话/历史)。
4
4
  * 环境值(VITE_API_URL / VITE_AUTH_PROVIDER)由 main.tsx 经 configureRuntime / 选项注入(H1)。
5
5
  */
6
- import { createAuthClient, createPlatformApi } from '@tbox.cn/app-sdk/client';
6
+ import { createAuthClient, createPlatformApi } from '@tbox.cn/app-agent-sdk-client';
7
7
  // 读源归位 TIER1(W1-①):mall-scope-url 契约助手(search-only 语义;壳 URL 改写层契约见包注释)
8
8
  import { readMallIdFromUrl } from '@app/contracts-mall';
9
9
 
@@ -10,8 +10,8 @@ import {
10
10
  getLocation,
11
11
  configureHelloContext,
12
12
  subscribeSessionUpgradeDrain,
13
- } from '@tbox.cn/app-sdk/client';
14
- import type { CoreChatState } from '@tbox.cn/app-sdk/client';
13
+ } from '@tbox.cn/app-agent-sdk-client';
14
+ import type { CoreChatState } from '@tbox.cn/app-agent-sdk-client';
15
15
  import { toast } from '@app/agent-ui-kit';
16
16
  import { readMallIdFromUrl, readMiniAppIdFromUrl } from '@app/contracts-mall';
17
17
  import { authClient, platformApi } from '@/platform/agent-runtime';
@@ -7,7 +7,7 @@ import { resolve } from 'node:path';
7
7
  import { pathToFileURL } from 'node:url';
8
8
  // 平台微调配套 babel plugin(随 @tbox.cn/app-sdk 分发):给每个 JSX 注入 data-code-inspect-*
9
9
  // 源码位置属性,供 inspector runtime(/__vs_inspector__.js) 点选元素→定位源码。仅 dev 启用(见下)。
10
- import codeInspectPlugin from '@tbox.cn/app-sdk/platform/code-inspect';
10
+ import codeInspectPlugin from '@tbox.cn/app-agent-sdk-client/platform/code-inspect';
11
11
 
12
12
  const pxToRemPlugin = pxToRem({
13
13
  rootValue: 100,
@@ -48,8 +48,6 @@ export default defineConfig(async ({ command }) => {
48
48
  resolve: {
49
49
  alias: {
50
50
  '@': resolve(__dirname, 'src'),
51
- fs: resolve(__dirname, 'src/shims/node-stub.ts'),
52
- path: resolve(__dirname, 'src/shims/node-stub.ts'),
53
51
  },
54
52
  // dev 域 React 单实例(G1/G2 防线):双 dev 入口经本文件合并生效(middleware
55
53
  // dev 加载本文件且 command==='serve');build 恒不继承——产物位稳定性。
@@ -12,13 +12,13 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@tbox.cn/agent-plugin": "catalog:",
15
- "@tbox.cn/app-sdk": "catalog:",
16
15
  "@tbox.cn/app-contracts": "catalog:",
17
16
  "@app/contracts-mall": "workspace:*",
18
17
  "@tbox-dev-js/sdk": "catalog:",
19
18
  "express": "catalog:",
20
19
  "zod": "catalog:",
21
- "@app/provider-custom": "workspace:*"
20
+ "@app/provider-custom": "workspace:*",
21
+ "@tbox.cn/app-agent-sdk-server": "catalog:"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/express": "catalog:",
@@ -1,4 +1,4 @@
1
- import type { ServerContext } from '@tbox.cn/app-sdk/server';
1
+ import type { ServerContext } from '@tbox.cn/app-agent-sdk-server';
2
2
  import { translateTool } from './tools/translate.js';
3
3
  import { clockTool } from './tools/clock.js';
4
4
 
@@ -10,8 +10,8 @@ import path from 'path';
10
10
  import { existsSync } from 'node:fs';
11
11
  import { fileURLToPath } from 'url';
12
12
  import { registerAll } from './modules.js';
13
- // ===== 模板日志(@tbox.cn/app-sdk/server createLogger:本地时间 + LEVEL + [tag] + req/conv 尾缀) =====
14
- import { createLogger } from '@tbox.cn/app-sdk/server';
13
+ // ===== 模板日志(@tbox.cn/app-agent-sdk-server createLogger:本地时间 + LEVEL + [tag] + req/conv 尾缀) =====
14
+ import { createLogger } from '@tbox.cn/app-agent-sdk-server';
15
15
  const serverLogger = createLogger('server');
16
16
  const authLogger = createLogger('AUTH');
17
17
  const skillLogger = createLogger('SKILL');
@@ -24,6 +24,7 @@ import {
24
24
  createEngineFromContext,
25
25
  createIntegrationsRegistry,
26
26
  loadProviderCatalog,
27
+ buildOwnershipMap,
27
28
  tboxTraceExporter,
28
29
  extractImageUrls,
29
30
  TBOX_FILE_URL_PREFIX,
@@ -45,8 +46,8 @@ import {
45
46
  loadAgentPromptConfig,
46
47
  toWsChatConfig,
47
48
  installTboxDev,
48
- } from '@tbox.cn/app-sdk/server';
49
- import { installInspector } from '@tbox.cn/app-sdk/platform';
49
+ } from '@tbox.cn/app-agent-sdk-server';
50
+ import { installInspector } from '@tbox.cn/app-agent-sdk-server/platform';
50
51
  import { registerAppTools } from './app-tools.js';
51
52
  import { APP_PRE_TOOLS } from './pre-tools.js';
52
53
  import { INTENT_ROUTES, createAppIntentDispatcher } from './intent-routes.js';
@@ -65,7 +66,7 @@ import {
65
66
  createAuthStrategyRegistry,
66
67
  createEnvironmentSecretProvider,
67
68
  attachCardActionTokens,
68
- } from '@tbox.cn/app-sdk/server';
69
+ } from '@tbox.cn/app-agent-sdk-server';
69
70
 
70
71
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
71
72
 
@@ -114,7 +115,7 @@ const memory = {
114
115
  // 模板无条件透传——读取一次,改文件需重启生效)
115
116
  const AGENT_PROMPT = loadAgentPromptConfig(CONFIG_DIR);
116
117
 
117
- // 平台能力装配(003/006 平台轴,已下沉 @tbox.cn/app-sdk/server)
118
+ // 平台能力装配(003/006 平台轴,已下沉 @tbox.cn/app-agent-sdk-server)
118
119
  // 011 L1 + F2/F3 + W3-1:装配序 integrations → authStrategies → auth → catalog → ctx——
119
120
  // v4:部署拓扑并入 integrations.json(单文件真源);域投影/校验(deployment 语义)迁
120
121
  // module-mall-core(ctx.domainAssemblies 惰性查表——auth 构造先于装配,动态判定经闭包后补)。
@@ -155,6 +156,10 @@ function appRoot(): string {
155
156
 
156
157
  const providerCatalog = loadProviderCatalog(appRoot());
157
158
 
159
+ // integrations v6 所有权模型:服务归属表(service → moduleId,declare.owns 聚合单源)——
160
+ // modules[owner] 级绑定/配置求值的显式注入参(缺注入 + 文件含 modules 绑定 → fail-visible)
161
+ const ownershipMap = buildOwnershipMap(appRoot());
162
+
158
163
  // provider 拆包 F2/F3:integrations 槽位解析轴(config/integrations.json 存在即生效;
159
164
  // 缺席 → undefined,模块槽解析与换码链 fail-fast 显性暴露——旧 ProviderRegistry 链已拆除)
160
165
  // instanceIdOf 注入 mall 语义(W3-1:沿域装配查表——mallId 派生归 module-mall-core)
@@ -163,6 +168,8 @@ const integrations = integrationsConfig
163
168
  integrations: integrationsConfig.config,
164
169
  // catalog 真源 = 应用根 .tbox/app.json(上方无条件装载)
165
170
  catalog: providerCatalog,
171
+ // v6:归属表显式参(装配五行 → 六行)
172
+ ownerOf: ownershipMap,
166
173
  authStrategies,
167
174
  secretProvider: createEnvironmentSecretProvider({
168
175
  source: process.env as Record<string, string | undefined>,
@@ -1,4 +1,4 @@
1
- import { createServerContext } from '@tbox.cn/app-sdk/server';
1
+ import { createServerContext } from '@tbox.cn/app-agent-sdk-server';
2
2
  import type { ToolCardBinding } from '@tbox.cn/agent-plugin/cards';
3
3
  import { registerAll } from '../modules.js';
4
4
  import { registerAppTools } from '../app-tools.js';
@@ -3,7 +3,7 @@ import {
3
3
  type PluginDiagnostic,
4
4
  } from '@tbox.cn/agent-plugin/doctor';
5
5
  import { loadMastraPluginTools } from '@tbox.cn/agent-plugin/mastra';
6
- import { createPluginIntegration } from '@tbox.cn/app-sdk/server';
6
+ import { createPluginIntegration } from '@tbox.cn/app-agent-sdk-server';
7
7
 
8
8
  import { collectRegistryState } from './collect-registry.js';
9
9
 
@@ -2,7 +2,7 @@ import { inspectPluginTool } from '@tbox.cn/agent-plugin/inspect';
2
2
  // 豁免:CLI 诊断工具(plugin:inspect)直接调 @tbox-dev-js/sdk 的 TboxPluginClient 做运行时检查,
3
3
  // 非应用运行时平台能力路径(007 铁律针对平台能力调用;诊断工具保持直连)
4
4
  import { TboxPluginClient } from '@tbox-dev-js/sdk';
5
- import { createPluginIntegration } from '@tbox.cn/app-sdk/server';
5
+ import { createPluginIntegration } from '@tbox.cn/app-agent-sdk-server';
6
6
 
7
7
  import { collectRegistryState } from './collect-registry.js';
8
8
 
@@ -14,7 +14,7 @@
14
14
  import { existsSync, readFileSync } from 'node:fs';
15
15
  import path from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
- import { expandEnvVars, parseIntegrationsConfig } from '@tbox.cn/app-sdk/server';
17
+ import { expandEnvVars, parseIntegrationsConfig } from '@tbox.cn/app-agent-sdk-server';
18
18
  import type { IntegrationsConfig } from '@tbox.cn/app-contracts';
19
19
 
20
20
  // 默认路径 = 应用根 config/integrations.json。双态锚点探测(bundle 打平后 import.meta.url 层级漂移):
@@ -8,8 +8,8 @@ import path from 'path';
8
8
  import { readFile } from 'node:fs/promises';
9
9
  import { fileURLToPath } from 'url';
10
10
  import { createServer as createViteServer } from 'vite';
11
- import { injectScript, isReady } from '@tbox.cn/app-sdk/platform';
12
- import { createLogger } from '@tbox.cn/app-sdk/server';
11
+ import { injectScript, isReady } from '@tbox.cn/app-agent-sdk-server/platform';
12
+ import { createLogger } from '@tbox.cn/app-agent-sdk-server';
13
13
  import { app, registerUpgradeDelegate, start } from './app.js';
14
14
 
15
15
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -7,7 +7,7 @@ import path from 'path';
7
7
  import { existsSync } from 'node:fs';
8
8
  import { fileURLToPath } from 'url';
9
9
  import express from 'express';
10
- import { createLogger } from '@tbox.cn/app-sdk/server';
10
+ import { createLogger } from '@tbox.cn/app-agent-sdk-server';
11
11
  import { app, start } from './app.js';
12
12
 
13
13
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -1,4 +1,4 @@
1
- import type { IntentRoute, HandlerResult, ServerContext } from '@tbox.cn/app-sdk/server';
1
+ import type { IntentRoute, HandlerResult, ServerContext } from '@tbox.cn/app-agent-sdk-server';
2
2
 
3
3
  /**
4
4
  * 业务意图表(B21:intent-framework hybrid 接线——SDK 框架 + 源码意图表,003 §3.3)。
@@ -5,11 +5,11 @@
5
5
  * 锚点区:@tbox:imports-begin/end(模块 import 行)+ @tbox:register-begin/end(模块数组)
6
6
  * CLI 行为:增量插入/删除模块行,保留非标行。
7
7
  */
8
- import type { ServerContext, InferModuleCards } from '@tbox.cn/app-sdk/server';
8
+ import type { ServerContext, InferModuleCards } from '@tbox.cn/app-agent-sdk-server';
9
9
 
10
10
  // @tbox:imports-begin
11
11
  // SDK 装配框架(非模块行,CLI 增量维护保留非标行)
12
- import { registerServerModules } from '@tbox.cn/app-sdk/server';
12
+ import { registerServerModules } from '@tbox.cn/app-agent-sdk-server';
13
13
  import { serverModule as providerCustom } from '@app/provider-custom/server';
14
14
  // @tbox:imports-end
15
15
 
@@ -1,5 +1,5 @@
1
- // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-sdk/server 的 definePreTool 入口(单例铁律)
2
- import { definePreTool } from '@tbox.cn/app-sdk/server';
1
+ // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-agent-sdk-server 的 definePreTool 入口(单例铁律)
2
+ import { definePreTool } from '@tbox.cn/app-agent-sdk-server';
3
3
  import { clockTool } from './tools/clock.js';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-sdk/server 的 createTool 入口(单例铁律)
2
- import { createTool } from '@tbox.cn/app-sdk/server';
1
+ // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-agent-sdk-server 的 createTool 入口(单例铁律)
2
+ import { createTool } from '@tbox.cn/app-agent-sdk-server';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-sdk/server 的 createTool 入口(单例铁律)
2
- import { createTool } from '@tbox.cn/app-sdk/server';
1
+ // 铁律:不直接 import @mastra/core,经 @tbox.cn/app-agent-sdk-server 的 createTool 入口(单例铁律)
2
+ import { createTool } from '@tbox.cn/app-agent-sdk-server';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { loadAgentPromptConfig } from '@tbox.cn/app-sdk/server';
2
+ import { loadAgentPromptConfig } from '@tbox.cn/app-agent-sdk-server';
3
3
  import { existsSync } from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
@@ -3,7 +3,7 @@
3
3
  // cards 字段运行期声明,registry 仅余 cardType 注册与 dataSchema 校验职责。
4
4
  import { describe, it, expect } from 'vitest';
5
5
  import { diagnosePlugins } from '@tbox.cn/agent-plugin/doctor';
6
- import { createServerContext, createPluginIntegration } from '@tbox.cn/app-sdk/server';
6
+ import { createServerContext, createPluginIntegration } from '@tbox.cn/app-agent-sdk-server';
7
7
  import { registerAll } from '../src/modules.js';
8
8
 
9
9
  describe('工具 / 卡片 registry 一致性(自注册闭环)', () => {
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { createServerContext } from '@tbox.cn/app-sdk/server';
2
+ import { createServerContext } from '@tbox.cn/app-agent-sdk-server';
3
3
  import type { RequestContext } from '@tbox.cn/app-contracts';
4
4
  import { createAppIntentDispatcher } from '../src/intent-routes.js';
5
5
 
@@ -5,7 +5,7 @@ import {
5
5
  createEngineFromContext,
6
6
  createInMemoryMemoryStore,
7
7
  resolveMemoryStore,
8
- } from '@tbox.cn/app-sdk/server';
8
+ } from '@tbox.cn/app-agent-sdk-server';
9
9
  import { registerAll } from '../src/modules.js';
10
10
  import { translateTool } from '../src/tools/translate.js';
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tbox.cn/app-template-agent",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "tbox AI Agent 全栈模板(多包 pnpm workspace):apps/client + apps/server。唯一模板(W4 单一模板统一化:缺省空装配 chat 形态;mall 能力经 profiles/mall 加装),能力经 tbox-app module add 模块扩展(shopping-guide/member 等)。",
5
5
  "engines": {
6
6
  "node": ">=24.0.0 <25.0.0"
@@ -32,11 +32,11 @@
32
32
  "LICENSE"
33
33
  ],
34
34
  "devDependencies": {
35
- "@tbox.cn/app-sdk": "0.20.0",
36
35
  "eslint": "9.39.5",
37
36
  "typescript-eslint": "8.67.0",
38
37
  "eslint-plugin-react-hooks": "5.2.0",
39
- "vite": "6.4.3"
38
+ "vite": "6.4.3",
39
+ "@tbox.cn/app-sdk-server": "0.21.0"
40
40
  },
41
41
  "license": "MIT",
42
42
  "publishConfig": {
@@ -27,13 +27,13 @@
27
27
  "LICENSE"
28
28
  ],
29
29
  "dependencies": {
30
- "@tbox.cn/app-sdk": "catalog:",
31
30
  "@tbox.cn/app-contracts": "catalog:",
32
31
  "@phosphor-icons/react": "catalog:",
33
32
  "antd-mobile": "catalog:",
34
33
  "react-markdown": "catalog:",
35
34
  "remark-gfm": "catalog:",
36
- "zustand": "catalog:"
35
+ "zustand": "catalog:",
36
+ "@tbox.cn/app-agent-sdk-client": "catalog:"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": "catalog:",