@tbox.cn/app-template-agent 0.8.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 (63) hide show
  1. package/AGENTS.md +88 -33
  2. package/ENV.md +9 -9
  3. package/README.md +6 -5
  4. package/apps/client/index.html +2 -2
  5. package/apps/client/package.json +2 -2
  6. package/apps/client/src/app.tsx +1 -1
  7. package/apps/client/src/cards/registry.ts +1 -1
  8. package/apps/client/src/main.tsx +1 -1
  9. package/apps/client/src/modules.ts +1 -1
  10. package/apps/client/src/platform/AgentChatApp.tsx +6 -5
  11. package/apps/client/src/platform/agent-runtime.ts +2 -2
  12. package/apps/client/src/store/chat.ts +2 -2
  13. package/apps/client/vite.config.ts +1 -3
  14. package/apps/server/package.json +2 -4
  15. package/apps/server/src/app-tools.ts +1 -1
  16. package/apps/server/src/app.ts +86 -18
  17. package/apps/server/src/cli/collect-registry.ts +1 -1
  18. package/apps/server/src/cli/plugin-doctor.ts +1 -1
  19. package/apps/server/src/cli/plugin-inspect.ts +1 -1
  20. package/apps/server/src/config/integration.ts +1 -1
  21. package/apps/server/src/dev.ts +2 -2
  22. package/apps/server/src/index.ts +1 -1
  23. package/apps/server/src/intent-routes.ts +1 -1
  24. package/apps/server/src/modules.ts +2 -2
  25. package/apps/server/src/pre-tools.ts +2 -2
  26. package/apps/server/src/tools/clock.ts +2 -2
  27. package/apps/server/src/tools/translate.ts +2 -2
  28. package/apps/server/tests/agent-prompt.test.ts +4 -4
  29. package/apps/server/tests/cards-registry.test.ts +1 -1
  30. package/apps/server/tests/intent-dispatcher.test.ts +1 -1
  31. package/apps/server/tests/tool-runtime.test.ts +2 -2
  32. package/package.json +3 -3
  33. package/packages/agent-ui-kit/package.json +2 -2
  34. package/packages/agent-ui-kit/src/ChatPage.tsx +1 -1
  35. package/packages/agent-ui-kit/src/chat-config.ts +1 -1
  36. package/packages/agent-ui-kit/src/components/ActionBar/DebugButton.tsx +1 -1
  37. package/packages/agent-ui-kit/src/components/ActionBar/index.tsx +2 -4
  38. package/packages/agent-ui-kit/src/components/CardRenderer.tsx +1 -1
  39. package/packages/agent-ui-kit/src/components/ChatInput/index.test.tsx +1 -1
  40. package/packages/agent-ui-kit/src/components/ChatInput/index.tsx +1 -1
  41. package/packages/agent-ui-kit/src/components/ChatInput/voice/useVoicePress.ts +2 -2
  42. package/packages/agent-ui-kit/src/components/MessageBubble/index.tsx +1 -3
  43. package/packages/agent-ui-kit/src/components/QuickCommands/index.test.tsx +1 -1
  44. package/packages/agent-ui-kit/src/components/ToolCallBlock/detail.test.ts +1 -1
  45. package/packages/agent-ui-kit/src/components/ToolCallBlock/detail.ts +1 -1
  46. package/packages/agent-ui-kit/src/hooks/useMediaUpload.ts +2 -2
  47. package/packages/agent-ui-kit/src/hooks/useTTSAutoPlay.ts +2 -2
  48. package/packages/agent-ui-kit/src/store-context.tsx +1 -1
  49. package/packages/agent-ui-kit/src/types.ts +2 -2
  50. package/packages/agent-ui-kit/src/utils/haptics.test.ts +1 -1
  51. package/packages/agent-ui-kit/src/utils/haptics.ts +1 -1
  52. package/packages/agent-ui-kit/src/utils/tool-call-display.test.ts +15 -15
  53. package/packages/agent-ui-kit/src/utils/tool-call-display.ts +1 -1
  54. package/packages/provider-custom/AGENTS.md +47 -21
  55. package/packages/provider-custom/README.md +1 -1
  56. package/packages/provider-custom/package.json +3 -2
  57. package/packages/provider-custom/src/server/index.ts +15 -12
  58. package/packages/provider-custom/tbox.module.json +8 -8
  59. package/pnpm-lock.template.yaml +114 -87
  60. package/pnpm-workspace.template.yaml +8 -4
  61. package/profiles/mall/TEMPLATE.md +42 -0
  62. package/profiles/mall.json +3 -2
  63. 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 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`)管理:`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
@@ -6,9 +6,9 @@
6
6
 
7
7
  - **本地开发**:shell export 注入(每次新终端需重新执行;见文末命令块)。生成应用请直接 shell export 或平台配置。
8
8
  - **生产**:建议在 tbox 平台页面上配置环境变量(平台托管 env,密钥不进代码仓库、不进 git)。
9
- 生产部署必须 `NODE_ENV=production`(dev-login 强制关闭 + JWT 密钥链 fail-fast 的依据)。
9
+ 生产部署必须 `NODE_ENV=production`(JWT 密钥链 fail-fast + real hardening 的依据)。
10
10
  入口分离后 dist 恒静态供给(vite dev 仅存在于源码 `src/dev.ts` 本地开发入口);`NODE_ENV` 不再决定
11
- 客户端供给形态——测试环境可用 `node dist/index.js`(不设 NODE_ENV)获得「静态产物 + dev-login」。
11
+ 客户端供给形态——测试环境可用 `node dist/index.js`(不设 NODE_ENV)获得「静态产物 + 开发档登录语义」。
12
12
  - 以下变量缺失时服务可启动,但对话/会话/上传链路会 503。
13
13
 
14
14
  ## 默认商圈(integrations v4)
@@ -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? }`)。
@@ -115,13 +116,12 @@ dev/src 与 prod/dist bundle 形态恒等):
115
116
  | `TBOX_LLM_CONN_BIND` | per-session 连接绑定旋钮(缺省 on;`=off` 关闭——LLM fetch 回退全局连接池。连接=网关缓存池路由单位:per-session 单连接(120s keep-alive)钉死集群分配,保活跨 run 提升前缀缓存命中;排障时可关) |
116
117
  | `TBOX_LLM_COOKIE_AFFINITY` | 网关 cookie 亲和旋钮(缺省 on;`=off` 关闭——不回传网关 set-cookie。回传激活 LB 粘性:连接重建后恢复原集群的通道;best-effort) |
117
118
 
118
- ## 统一鉴权(006)
119
+ ## 统一鉴权
119
120
 
120
121
  | 变量 | 说明 |
121
122
  |---|---|
122
123
  | `AUTH_TOKEN_SECRET` | 自有 JWT 密钥(≥32 字节随机串),生产由平台注入。006 鉴权与 011 模块动作授权(action-grant)共用统一密钥链:未配置回退 `TBOX_API_KEY`(须 ≥32 字节)→ dev 临时随机;prod 整链空则 fail-fast(拒绝启动)。011 另有 `ACTION_TOKEN_SECRET` 覆盖档。本地一般无需设置 |
123
124
  | `AUTH_MODE` | `required`(默认,缺失 token 一律 401)/ `optional`(缺失 token → 匿名,写通道仍拒绝) |
124
- | `AUTH_DEV_LOGIN_DISABLED` | 非生产环境需关闭 dev-login 时设 `true`(dev-login 非 production 默认开启,生产强制关闭) |
125
125
  | `AUTH_TOKEN_TTL_MS` | token 有效期(毫秒,默认 2h) |
126
126
  | `AUTH_TOKEN_ISSUER` | token issuer(默认 `agent`;如需 mall 独立身份可显式设 `agent-mall`) |
127
127
  | `AUTH_EMBED_EXTERNAL_TOKEN` | 是否把外部原始 token 内嵌进自有 JWT(external claim,默认 `true`;`false` 则上游调用需另取) |
@@ -144,7 +144,7 @@ dev/src 与 prod/dist bundle 形态恒等):
144
144
  (上游 Token 寿命未知;自有 JWT 过期即重登换新)。
145
145
  - ⚠️ 与 `VITE_AUTH_PROVIDER=external` **互斥**:设 external 走 `AUTH_EXTERNAL_*` HMAC 转发旁路,
146
146
  换码器被 platform 路由绕过,两者勿同时启用。
147
- - 裸跑(无登录槽配置):无换码器注册 → 内置 alipay(未配 → 503)或 dev-login,匿名降级属预期行为。
147
+ - 裸跑(无登录槽配置):无换码器注册 → 内置 alipay(未配 → 503)或 browser 轴 guest(内置换码器 allowsGuestLogin),匿名降级属预期行为。
148
148
  - 跨 mall 切换(URL `mallId` 变更)由 SDK `scopeKey` 守卫自动清 token 重登,无需手工登出。
149
149
 
150
150
  ## 客户端(Vite 注入)
@@ -189,7 +189,7 @@ export MALL_HOME_DEV_SERVICES=true
189
189
 
190
190
  # tbox-app dev 配置面
191
191
 
192
- - `TBOX_CONFIG_DIR`:dev 命令注入的配置目录覆盖(real-env 档位绝对路径);未设时使用默认 `config/`。
192
+ - `TBOX_CONFIG_DIR`:dev 命令注入的配置目录覆盖(preset `configDir` / `--config-dir` 旗标显式指定的目录绝对路径——config 恒显式);未设时使用默认 `config/`。
193
193
  覆盖面含 `llm_provider.json`(`modelName`/`thinking`):注入时 LLM 装配读档位目录文件,
194
194
  其 `modelName` 优先于 `APP_AI_MODEL_NAME`;档目录缺该文件 → 链式回退 env(config-dir 独占
195
195
  注入语义:缺文件 = 显式不指定,不落回模板默认 config)。
package/README.md CHANGED
@@ -35,15 +35,16 @@ tbox-app module doctor # 26 条结构校验
35
35
  > 依赖链说明(007):`@tbox.cn/app-sdk` 新增 dependencies `@tbox-dev-js/sdk`(平台能力客户端)、`@ai-sdk/openai-compatible`(LLM)——
36
36
  > 生成应用 install 时由 pnpm 自动解析(`@tbox-dev-js/sdk` 已发布 npm;内网/离线环境需 registry 镜像或 store 缓存兜底)。
37
37
 
38
- > 🔐 鉴权(006):非 production 默认开启 dev-login(浏览器 H5 测试登录,开箱即用);
39
- > 生产部署必须 `NODE_ENV=production`(dev-login 强制关闭)。非生产环境如需关闭设
40
- > `AUTH_DEV_LOGIN_DISABLED=true`。
38
+ > 🔐 鉴权(统一登录):登录面 = `POST /api/auth/login`(`method:'code'|'browser'` 判别);
39
+ > 浏览器档位(guest/mock/off/auto)经换码器 `browserLoginMode` 能力口治理(登录槽 config,
40
+ > 支持 `${VAR:-default}` 展开经 env 分档);生产部署必须 `NODE_ENV=production`。
41
41
 
42
42
  ## 工程结构
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)
@@ -175,7 +176,7 @@ definePreTool(findStoreTool, {
175
176
  | `getToolRequestContext` / `requireToolRequestContext` | `@tbox.cn/app-sdk/server` | 工具 execute 第二参读取运行上下文(fail-soft / 缺失抛 AUTH_FORBIDDEN;上下文统一化) |
176
177
  | `createToolExecContext(reqCtx)` | `@tbox.cn/app-sdk/server` | 测试/直调助手:构造工具 execute 第二参(散键与引擎同构) |
177
178
  | `createPlatformAdapters(session, overrides)` | `@tbox.cn/app-sdk/client` | 自定义 ASR/TTS/upload/feedback 实现(contracts 接口,UI 零改动) |
178
- | `createAuthClient({ loginPlatform, devUser })` | `@tbox.cn/app-sdk/client` | 客户端登录配置(`main.tsx`/`platform/agent-runtime.ts`);**应用级单例**——重复调用幂等返回首建实例,首建选项生效 |
179
+ | `createAuthClient({ loginPlatform, scopeKey })` | `@tbox.cn/app-sdk/client` | 客户端登录配置(`main.tsx`/`platform/agent-runtime.ts`);**应用级单例**——重复调用幂等返回首建实例,首建选项生效 |
179
180
  | `configureRuntime({ apiBaseUrl })` | `@tbox.cn/app-sdk/client` | API/WS 地址注入(`main.tsx`;对应 `VITE_API_URL`) |
180
181
  | bridge 透传 | `@tbox.cn/app-sdk/client` 的 `callJsapi` | 业务新能力(扫码/导航/分享等,壳子补 JSAPI 白名单) |
181
182
 
@@ -26,8 +26,8 @@
26
26
  window.addEventListener('orientationchange', setRootFontSize);
27
27
  })();
28
28
  </script>
29
- <!-- 品牌标题真源 = 主题包 brand.js(出厂 theme-tbox 同值兜底;换主题随 brand.js 覆盖,此处不做品牌配置锚) -->
30
- <title>商圈搭子</title>
29
+ <!-- 出厂标题 = 此处静态值(theme-tbox brand.js 出厂不覆写标题);租户主题经其 brand.js 运行时覆写 document.title -->
30
+ <title>AI 助手</title>
31
31
  <!-- 平台微调(inspector) runtime:由 server 提供 GET /__vs_inspector__.js;dev 下经 Vite 代理到 server。-->
32
32
  <script src="/__vs_inspector__.js" defer></script>
33
33
  </head>
@@ -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';
@@ -17,15 +17,16 @@ export default function AgentChatApp() {
17
17
  useEffect(() => {
18
18
  authClient
19
19
  .ensureAuth()
20
- .then((auth) => platformApi.getTboxSession(auth.identity.userId))
20
+ // 会话 β 收口:身份恒取 token(服务端 401/403),userId 不再上行
21
+ .then(() => platformApi.getTboxSession())
21
22
  .then(setSession)
22
23
  .catch((err) => appLogger.error('tbox session init failed:', err));
23
24
  }, []);
24
25
 
25
26
  const refreshSession = useCallback(async (): Promise<AdapterContextValue> => {
26
27
  platformApi.clearTboxSession();
27
- const auth = await authClient.refreshAuth();
28
- const data = await platformApi.getTboxSession(auth.identity.userId, true);
28
+ await authClient.refreshAuth();
29
+ const data = await platformApi.getTboxSession(true);
29
30
  setSession(data);
30
31
  return { tts, ...createPlatformAdapters(data, { tts }), refreshSession };
31
32
  }, [tts]);
@@ -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,17 +12,15 @@
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
- "cors": "catalog:",
20
18
  "express": "catalog:",
21
19
  "zod": "catalog:",
22
- "@app/provider-custom": "workspace:*"
20
+ "@app/provider-custom": "workspace:*",
21
+ "@tbox.cn/app-agent-sdk-server": "catalog:"
23
22
  },
24
23
  "devDependencies": {
25
- "@types/cors": "catalog:",
26
24
  "@types/express": "catalog:",
27
25
  "@types/node": "catalog:",
28
26
  "tsx": "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