@tbox.cn/app-template-agent 0.10.14 → 0.10.16

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.
package/.tbox/app.json CHANGED
@@ -11,9 +11,9 @@
11
11
  {
12
12
  "id": "agent-ui-kit",
13
13
  "package": "@tbox.cn/app-agent-ui-kit",
14
- "version": "0.1.0",
14
+ "version": "0.1.1",
15
15
  "mode": "codegen",
16
- "baseVersion": "0.1.0",
16
+ "baseVersion": "0.1.1",
17
17
  "kind": "ui-kit"
18
18
  }
19
19
  ],
@@ -0,0 +1,6 @@
1
+ [
2
+ {
3
+ "platform": "alipay",
4
+ "source": "@tbox.cn/app-miniapp-container-alipay@0.2.3"
5
+ }
6
+ ]
package/ENV.md CHANGED
@@ -28,6 +28,10 @@
28
28
  integrations.json → 裸跑免 mallId 全局会话或任意 `?mallId=` 均可演示。零拓扑形态下 provider-mock 于 register 期
29
29
  声明隐式默认单实例(mall-demo / 星河 Mock 小镇)——无 URL 参数访问时默认商圈回显照常生效
30
30
  (显式 instances/defaultInstanceId 恒赢,声明仅兜底)。
31
+ - 登录轴同兜底(2026-10-12):壳内 code 登录无 mallId 时,换码器经同一 `defaultInstanceId`
32
+ (零拓扑 mock 档 = 隐式 mall-demo)换发随机访客身份——壳内与 WS 轴/浏览器轴同源同值,
33
+ 三轴免 mallId 开箱一致。显式 `"defaultInstanceId": null` 关闭兜底(壳内登录 503
34
+ `AUTH_SCOPE_REQUIRED`,指向补配置或入口带 `?mallId=`)。
31
35
 
32
36
  ## URL 参数契约(mall 接入)
33
37
 
@@ -141,13 +145,16 @@ dev/src 与 prod/dist bundle 形态恒等):
141
145
  `my.getAuthCode` → `/api/auth/login` → 换码器注册表按登录 context 的 mallId 路由:命中某厂商
142
146
  登录槽实例 → 该厂商换码器出马;未命中 mall 由兜底厂商接管(F2 注册制,机制详见 docs/reference/providers.md):
143
147
 
144
- - 前提:登录槽实例的 provider 必须装配对应 provider 包(漏装 → 登录落内置 alipay,
145
- 未配凭据 503 局部降级);实例 config 的厂商 appId 字段已配(漏配 → 该 mall 503,字段名见各 provider 包)。
148
+ - 前提:登录槽实例的 provider 必须装配对应 provider 包(漏装 → 登录落内置 alipay
149
+ ——未配凭据时 guest 降级 + AUTH warn 日志可观测,配置后走真实换码);实例 config 的厂商
150
+ appId 字段已配(漏配 → 该 mall 503,字段名见各 provider 包)。
146
151
  - 登录双形态与复合凭证语义由各 provider 包承载;`AUTH_TOKEN_TTL_MS` 保守建议 ≤2h
147
152
  (上游 Token 寿命未知;自有 JWT 过期即重登换新)。
148
153
  - ⚠️ 与 `VITE_AUTH_PROVIDER=external` **互斥**:设 external 走 `AUTH_EXTERNAL_*` HMAC 转发旁路,
149
154
  换码器被 platform 路由绕过,两者勿同时启用。
150
- - 裸跑(无登录槽配置):无换码器注册 → 内置 alipay(未配 → 503)或 browser 轴 guest(内置换码器 allowsGuestLogin),匿名降级属预期行为。
155
+ - 裸跑(无登录槽配置):无换码器注册 → 内置 alipay/weapp;未配 env → **200 guest 降级**
156
+ (Fix D——内置换码器声明 allowsGuestLogin,`[AUTH] login failed (downgraded to guest)` warn
157
+ 可观测;意图真实支付宝登录却恒 guest 时查该日志)或 browser 轴 guest,匿名降级属预期行为。
151
158
  - 跨 mall 切换(URL `mallId` 变更)由 SDK `scopeKey` 守卫自动清 token 重登,无需手工登出。
152
159
 
153
160
  ## 客户端(Vite 注入)
package/README.md CHANGED
@@ -4,11 +4,15 @@ tbox AI Agent 全栈模板(npm 包名 `@tbox.cn/app-template-agent`,唯一
4
4
  缺省出厂 = 空装配(chat 形态);**商圈形态经 `profiles/mall` 画像加装**(`tbox-app create --profile mall`:mall-core + 六业务模块 + 商圈配置叠加)。
5
5
  客户端同时支持浏览器和支付宝小程序 web-view;平台能力(鉴权/会话/TTS/ASR/上传/反馈)经 `@tbox.cn/app-sdk` 统一提供(007 下沉)。
6
6
 
7
+ 创建应用时默认生成 `apps/miniapp-container-alipay`,容器计划见 `.tbox/miniapp-containers.json`。使用前配置小程序 AppId 和 H5 地址;重复创建保留已登记的容器。
8
+
9
+ `pnpm dev` 始终启动原有 H5/server;容器已安装且 PATH 中有 `minidev` 时同时启动容器,否则跳过。容器异常退出不影响 H5/server,Ctrl+C 统一停止本次启动的进程。
10
+
7
11
  ## 快速开始
8
12
 
9
13
  ```sh
10
14
  pnpm install
11
- pnpm dev # 单进程 http://localhost:8000(API + WS + 页面 + HMR)
15
+ pnpm dev # H5/server + 可选 minidev 小程序容器
12
16
  pnpm verify # typecheck + test + build
13
17
  ```
14
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tbox.cn/app-template-agent",
3
- "version": "0.10.14",
3
+ "version": "0.10.16",
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"
@@ -37,14 +37,14 @@
37
37
  "typescript-eslint": "8.67.0",
38
38
  "eslint-plugin-react-hooks": "5.2.0",
39
39
  "vite": "6.4.3",
40
- "@tbox.cn/app-sdk-server": "0.24.1"
40
+ "@tbox.cn/app-sdk-server": "0.25.0"
41
41
  },
42
42
  "license": "MIT",
43
43
  "publishConfig": {
44
44
  "access": "public"
45
45
  },
46
46
  "scripts": {
47
- "dev": "pnpm --filter ./apps/server dev",
47
+ "dev": "node scripts/dev.mjs",
48
48
  "build": "pnpm check && pnpm --filter ./apps/server build && pnpm --filter ./apps/client build",
49
49
  "build:client": "pnpm check && pnpm --filter ./apps/client build",
50
50
  "typecheck": "pnpm -r --filter \"./{apps,packages}/*\" typecheck",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@app/agent-ui-kit",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "Agent 对话壳 UI 组件包(源码发布,单一模板统一化 W2-1):ChatPage/壳组件族/主题 tokens。",
6
6
  "exports": {
@@ -16,23 +16,26 @@ catalogs:
16
16
  specifier: 0.1.0
17
17
  version: 0.1.0
18
18
  '@tbox.cn/app-agent-sdk-client':
19
- specifier: 0.1.5
20
- version: 0.1.5
19
+ specifier: 0.1.6
20
+ version: 0.1.6
21
21
  '@tbox.cn/app-agent-sdk-server':
22
- specifier: 0.2.2
23
- version: 0.2.2
22
+ specifier: 0.2.3
23
+ version: 0.2.3
24
24
  '@tbox.cn/app-contracts':
25
- specifier: 0.12.4
26
- version: 0.12.4
25
+ specifier: 0.13.0
26
+ version: 0.13.0
27
27
  '@tbox.cn/app-contracts-mall':
28
- specifier: 0.12.5
29
- version: 0.12.5
28
+ specifier: 0.13.0
29
+ version: 0.13.0
30
+ '@tbox.cn/app-sdk-client':
31
+ specifier: 0.21.3
32
+ version: 0.21.3
30
33
  '@tbox.cn/app-sdk-server':
31
- specifier: 0.24.1
32
- version: 0.24.1
34
+ specifier: 0.25.0
35
+ version: 0.25.0
33
36
  '@tbox.cn/app-theme-tbox':
34
- specifier: 0.1.3
35
- version: 0.1.3
37
+ specifier: 0.1.4
38
+ version: 0.1.4
36
39
  '@types/express':
37
40
  specifier: 4.17.25
38
41
  version: 4.17.25
@@ -115,7 +118,7 @@ importers:
115
118
  devDependencies:
116
119
  '@tbox.cn/app-sdk-server':
117
120
  specifier: 'catalog:'
118
- version: 0.24.1
121
+ version: 0.25.0
119
122
  eslint:
120
123
  specifier: 'catalog:'
121
124
  version: 9.39.5
@@ -142,13 +145,13 @@ importers:
142
145
  version: link:../../packages/provider-custom
143
146
  '@tbox.cn/app-agent-sdk-client':
144
147
  specifier: 'catalog:'
145
- version: 0.1.5(@types/react@18.3.31)
148
+ version: 0.1.6(@types/react@18.3.31)
146
149
  '@tbox.cn/app-contracts':
147
150
  specifier: 'catalog:'
148
- version: 0.12.4
151
+ version: 0.13.0
149
152
  '@tbox.cn/app-theme-tbox':
150
153
  specifier: 'catalog:'
151
- version: 0.1.3
154
+ version: 0.1.4
152
155
  react:
153
156
  specifier: 'catalog:'
154
157
  version: 18.3.1
@@ -190,6 +193,24 @@ importers:
190
193
  specifier: 'catalog:'
191
194
  version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@6.4.3(@types/node@24.13.3)(less@4.8.1)(tsx@4.23.11))
192
195
 
196
+ apps/miniapp-container-alipay:
197
+ devDependencies:
198
+ '@mini-types/alipay':
199
+ specifier: ^3.0.14
200
+ version: 3.0.14
201
+ '@tbox.cn/app-sdk-client':
202
+ specifier: 'catalog:'
203
+ version: 0.21.3
204
+ '@tbox.cn/app-sdk-server':
205
+ specifier: 'catalog:'
206
+ version: 0.25.0
207
+ typescript:
208
+ specifier: 'catalog:'
209
+ version: 5.9.3
210
+ vitest:
211
+ specifier: 'catalog:'
212
+ version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(happy-dom@20.11.2)(vite@6.4.3(@types/node@24.13.3)(less@4.8.1)(tsx@4.23.11))
213
+
193
214
  apps/server:
194
215
  dependencies:
195
216
  '@app/contracts-mall':
@@ -206,10 +227,10 @@ importers:
206
227
  version: 0.1.0(@mastra/core@1.59.0(ai@6.0.246(zod@3.25.76))(express@4.22.2)(rxjs@7.8.1)(zod@3.25.76))(@tbox-dev-js/sdk@0.1.18)(zod@3.25.76)
207
228
  '@tbox.cn/app-agent-sdk-server':
208
229
  specifier: 'catalog:'
209
- version: 0.2.2(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
230
+ version: 0.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
210
231
  '@tbox.cn/app-contracts':
211
232
  specifier: 'catalog:'
212
- version: 0.12.4
233
+ version: 0.13.0
213
234
  express:
214
235
  specifier: 'catalog:'
215
236
  version: 4.22.2
@@ -246,10 +267,10 @@ importers:
246
267
  version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
247
268
  '@tbox.cn/app-agent-sdk-client':
248
269
  specifier: 'catalog:'
249
- version: 0.1.5(@types/react@18.3.31)
270
+ version: 0.1.6(@types/react@18.3.31)
250
271
  '@tbox.cn/app-contracts':
251
272
  specifier: 'catalog:'
252
- version: 0.12.4
273
+ version: 0.13.0
253
274
  antd-mobile:
254
275
  specifier: 'catalog:'
255
276
  version: 5.42.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -298,7 +319,7 @@ importers:
298
319
  dependencies:
299
320
  '@tbox.cn/app-contracts-mall':
300
321
  specifier: 'catalog:'
301
- version: 0.12.5
322
+ version: 0.13.0
302
323
  devDependencies:
303
324
  '@types/node':
304
325
  specifier: 24.13.3
@@ -314,13 +335,13 @@ importers:
314
335
  dependencies:
315
336
  '@tbox.cn/app-agent-sdk-client':
316
337
  specifier: 'catalog:'
317
- version: 0.1.5(@types/react@18.3.31)
338
+ version: 0.1.6(@types/react@18.3.31)
318
339
  '@tbox.cn/app-agent-sdk-server':
319
340
  specifier: 'catalog:'
320
- version: 0.2.2(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
341
+ version: 0.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
321
342
  '@tbox.cn/app-contracts':
322
343
  specifier: 'catalog:'
323
- version: 0.12.4
344
+ version: 0.13.0
324
345
  devDependencies:
325
346
  '@types/node':
326
347
  specifier: 24.13.3
@@ -1101,6 +1122,15 @@ packages:
1101
1122
  peerDependencies:
1102
1123
  zod: ^3.25.0 || ^4.0.0
1103
1124
 
1125
+ '@mini-types/alipay@3.0.14':
1126
+ resolution: {integrity: sha512-FakzSsKvybtWlEIVTIRlr89kuQFn+XY86Ho9VUFFaKLplhW6Wx8FUxTDE7IzV7B9rT8DP/Icy637vUHlXPsw1g==}
1127
+
1128
+ '@mini-types/global@3.0.14':
1129
+ resolution: {integrity: sha512-St2ucFRfKRskposOqV/9iNJTKn1MbyqDypQiy/0DaVJjEm2MFi82RJjX9sBz1uWhQIqzu741PgTjGSy7L/Qj9g==}
1130
+
1131
+ '@mini-types/my@3.0.14':
1132
+ resolution: {integrity: sha512-aEgmM+rbEvEzTvqltCFRAg/h6KKs14M1y+FrOkz+hn2EyNpOVPesUzTjbRhSiFFsE3WdfBh54lHNYBahAmHq7w==}
1133
+
1104
1134
  '@modelcontextprotocol/core@2.0.0':
1105
1135
  resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==}
1106
1136
  engines: {node: '>=20'}
@@ -1335,40 +1365,40 @@ packages:
1335
1365
  '@tbox-dev-js/sdk': '>=0.1.18 <0.2.0'
1336
1366
  zod: '>=3.24.0 <4.0.0'
1337
1367
 
1338
- '@tbox.cn/app-agent-sdk-client@0.1.5':
1339
- resolution: {integrity: sha512-eunRWrlweqk0EX99OYTiGS4KAAWOGfQcVDuG6UAiQDPh10Gwz/qMEGZ1uPTB9EFQOHd5eYwR5U5g5nEfnRfcsA==}
1368
+ '@tbox.cn/app-agent-sdk-client@0.1.6':
1369
+ resolution: {integrity: sha512-/dCthY+JEccMPGafALYkhPRDRBPHSzPklNfXw63XQqhU7yrvqgeyuOXFrhkSYU5ZFzupZErUndXpiZz/zzJVug==}
1340
1370
  engines: {node: '>=20.0.0'}
1341
1371
 
1342
- '@tbox.cn/app-agent-sdk-server@0.2.2':
1343
- resolution: {integrity: sha512-MYXnGWbbyaubtFIvYP3yOw/+gMvCWaPqu+k6j1eH58qvq+tylFab9t32ckhQ955r2BJaoAa4gPc1FeI9dAX1ZA==}
1372
+ '@tbox.cn/app-agent-sdk-server@0.2.3':
1373
+ resolution: {integrity: sha512-EeSXpW1Aoy85Z9ZXCKSlziGhxyBeQCWQDRuLdkg7ReVKthNXfFKcAiIiaZIQkSjoZB1OL3Qlg8xl2cLqiXZxHA==}
1344
1374
  engines: {node: '>=20.0.0'}
1345
1375
 
1346
- '@tbox.cn/app-contracts-mall@0.12.5':
1347
- resolution: {integrity: sha512-bQLfzd/iVpnwqDCVsVOY4avZuc6rA34AuXJYRup7FdZiRh/XcRLyC0AIPsTUwphDMpkiMmynDUymNJo9GUH++A==}
1376
+ '@tbox.cn/app-contracts-mall@0.13.0':
1377
+ resolution: {integrity: sha512-EzLRs93WoHbqYI9MZV555ru14jTYnUILhClFisJXd3vlXTpHw9T1annSaa4IpkHepsX6AmCT5FxwvRUZcZ6T3A==}
1348
1378
  engines: {node: '>=20.0.0'}
1349
1379
 
1350
- '@tbox.cn/app-contracts@0.12.4':
1351
- resolution: {integrity: sha512-ukIpgL1pCKQmWzhHiqREKB5FeVmHqFWMdN5qwzrwwFheZHWGPwhZMxsputr9uOGZeOYXs3yRbKQPMbqUNemMAw==}
1380
+ '@tbox.cn/app-contracts@0.13.0':
1381
+ resolution: {integrity: sha512-8sqP/23MoUlbTX9enFNotP5bu7XKFfigDUJ6sEn1Ff2a0rRlSTWzLWmDv9lP70cfZMPjh4MHoLKFoukr8QPvMA==}
1352
1382
  engines: {node: '>=20.0.0'}
1353
1383
 
1354
- '@tbox.cn/app-sdk-client@0.21.2':
1355
- resolution: {integrity: sha512-ApJGzaTXNLKEzg6Gx85OjKsI2ZbtciMDAxRU712rdFxGKIp0pPaNCKhmXJSzhGdsh2Jf5F+PoZY4LXtCSrKNiQ==}
1384
+ '@tbox.cn/app-sdk-client@0.21.3':
1385
+ resolution: {integrity: sha512-64y22k5gzCc9eEQ0IJA1izxPaosNEmoCJ4YrsfHOoHYq2UPJCCmP7RIu3Rn4stPZ4tcmRdMdAi2y5499KObYHw==}
1356
1386
  engines: {node: '>=20.0.0'}
1357
1387
 
1358
- '@tbox.cn/app-sdk-core@0.20.3':
1359
- resolution: {integrity: sha512-3oR/UtV8LMYS/M62I/LLlXfajXTwGFA8JEbSZftq/XR6bfzADcx7skhVqJAVBvfRqRN9mUcs/UnuJFYKEIamIQ==}
1388
+ '@tbox.cn/app-sdk-core@0.20.4':
1389
+ resolution: {integrity: sha512-4kcoxnZnPgsO0RwAsjsodOXRhZNQcr9r3INN3Z03/JR2e3E+izkW2YHsgGcdbVSVX81s8gZrkaBbE+xco3wSqg==}
1360
1390
  engines: {node: '>=20.0.0'}
1361
1391
 
1362
- '@tbox.cn/app-sdk-server@0.24.1':
1363
- resolution: {integrity: sha512-/l2ST/m/o1gM2+v9jPWKaNkQC4iAAqg2E/4mV9KiEFsCgvB8gZ2FA1b9qyh2Dmijw/3azvhao32VMbM3nAv4Ng==}
1392
+ '@tbox.cn/app-sdk-server@0.25.0':
1393
+ resolution: {integrity: sha512-wKKbmFnY6YU+mQOoak4UADWe1nWZKKdZeGqzatWC9Ny0W05QtDGLG9ql9kP1IwN3a5S6lFf4A6OBdSwERTFqTw==}
1364
1394
  engines: {node: '>=20.0.0'}
1365
1395
  hasBin: true
1366
1396
 
1367
- '@tbox.cn/app-theme-tbox@0.1.3':
1368
- resolution: {integrity: sha512-Wf2umpT/k+Ppy1oKuCDqe6M5yvp4F/tjdGpU7uygGWMaEduwFnoK0EVh4eDcA6dMlERLCAjxFlEUY68xXGq99A==}
1397
+ '@tbox.cn/app-theme-tbox@0.1.4':
1398
+ resolution: {integrity: sha512-VF2fjTBFKJ6x/wvM6/T0qi7dmoiN1stNIT2xDerYbBBLCggr7f+H0v6VtuFMSed6tirlcpAlqtBDOctxudHJlQ==}
1369
1399
 
1370
- '@tbox.cn/app-toolkit@0.7.4':
1371
- resolution: {integrity: sha512-FHxlqD9mlL5OdfmjthDbIZKWIMcZTD2a5+TOGrNUHn9pML9z9gagBco/KqEKJNejzq0CXZeAKdYRtY5bFi4TSg==}
1400
+ '@tbox.cn/app-toolkit@0.7.5':
1401
+ resolution: {integrity: sha512-ObVkHKElsDz/JazUHkBaIGYYDxZxvQEtjFAk77HXBc0+PSikSRmtb62F99PWGibTnOSLq6wlkGWhk/y+Iy1UOg==}
1372
1402
  engines: {node: '>=20.0.0'}
1373
1403
 
1374
1404
  '@types/babel__core@7.20.5':
@@ -3907,6 +3937,15 @@ snapshots:
3907
3937
  zod: 3.25.76
3908
3938
  zod-from-json-schema: 0.5.6
3909
3939
 
3940
+ '@mini-types/alipay@3.0.14':
3941
+ dependencies:
3942
+ '@mini-types/global': 3.0.14
3943
+ '@mini-types/my': 3.0.14
3944
+
3945
+ '@mini-types/global@3.0.14': {}
3946
+
3947
+ '@mini-types/my@3.0.14': {}
3948
+
3910
3949
  '@modelcontextprotocol/core@2.0.0':
3911
3950
  dependencies:
3912
3951
  zod: 4.4.3
@@ -4069,11 +4108,11 @@ snapshots:
4069
4108
  '@tbox-dev-js/sdk': 0.1.18
4070
4109
  zod: 3.25.76
4071
4110
 
4072
- '@tbox.cn/app-agent-sdk-client@0.1.5(@types/react@18.3.31)':
4111
+ '@tbox.cn/app-agent-sdk-client@0.1.6(@types/react@18.3.31)':
4073
4112
  dependencies:
4074
- '@tbox.cn/app-contracts': 0.12.4
4075
- '@tbox.cn/app-sdk-client': 0.21.2
4076
- '@tbox.cn/app-sdk-core': 0.20.3
4113
+ '@tbox.cn/app-contracts': 0.13.0
4114
+ '@tbox.cn/app-sdk-client': 0.21.3
4115
+ '@tbox.cn/app-sdk-core': 0.20.4
4077
4116
  react: 18.3.1
4078
4117
  react-dom: 18.3.1(react@18.3.1)
4079
4118
  zustand: 4.5.7(@types/react@18.3.31)(react@18.3.1)
@@ -4081,7 +4120,7 @@ snapshots:
4081
4120
  - '@types/react'
4082
4121
  - immer
4083
4122
 
4084
- '@tbox.cn/app-agent-sdk-server@0.2.2(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4123
+ '@tbox.cn/app-agent-sdk-server@0.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4085
4124
  dependencies:
4086
4125
  '@ag-ui/core': 0.0.47
4087
4126
  '@ai-sdk/openai-compatible': 2.0.68(zod@3.25.76)
@@ -4089,9 +4128,9 @@ snapshots:
4089
4128
  '@mastra/core': 1.59.0(ai@6.0.246(zod@3.25.76))(express@4.22.2)(rxjs@7.8.1)(zod@3.25.76)
4090
4129
  '@mastra/observability': 1.16.5(@mastra/core@1.59.0(ai@6.0.246(zod@3.25.76))(express@4.22.2)(rxjs@7.8.1)(zod@3.25.76))(zod@3.25.76)
4091
4130
  '@tbox.cn/agent-plugin': 0.1.0(@mastra/core@1.59.0(ai@6.0.246(zod@3.25.76))(express@4.22.2)(rxjs@7.8.1)(zod@3.25.76))(@tbox-dev-js/sdk@0.1.18)(zod@3.25.76)
4092
- '@tbox.cn/app-contracts': 0.12.4
4093
- '@tbox.cn/app-sdk-core': 0.20.3
4094
- '@tbox.cn/app-sdk-server': 0.24.1
4131
+ '@tbox.cn/app-contracts': 0.13.0
4132
+ '@tbox.cn/app-sdk-core': 0.20.4
4133
+ '@tbox.cn/app-sdk-server': 0.25.0
4095
4134
  ai: 6.0.246(zod@3.25.76)
4096
4135
  express: 4.22.2
4097
4136
  gray-matter: 4.0.3
@@ -4109,43 +4148,43 @@ snapshots:
4109
4148
  - utf-8-validate
4110
4149
  - workflow
4111
4150
 
4112
- '@tbox.cn/app-contracts-mall@0.12.5':
4151
+ '@tbox.cn/app-contracts-mall@0.13.0':
4113
4152
  dependencies:
4114
- '@tbox.cn/app-contracts': 0.12.4
4153
+ '@tbox.cn/app-contracts': 0.13.0
4115
4154
  zod: 3.25.76
4116
4155
 
4117
- '@tbox.cn/app-contracts@0.12.4':
4156
+ '@tbox.cn/app-contracts@0.13.0':
4118
4157
  dependencies:
4119
4158
  '@ag-ui/core': 0.0.47
4120
4159
  react: 18.3.1
4121
4160
  zod: 3.25.76
4122
4161
 
4123
- '@tbox.cn/app-sdk-client@0.21.2':
4162
+ '@tbox.cn/app-sdk-client@0.21.3':
4124
4163
  dependencies:
4125
- '@tbox.cn/app-contracts': 0.12.4
4126
- '@tbox.cn/app-sdk-core': 0.20.3
4164
+ '@tbox.cn/app-contracts': 0.13.0
4165
+ '@tbox.cn/app-sdk-core': 0.20.4
4127
4166
  react: 18.3.1
4128
4167
  react-dom: 18.3.1(react@18.3.1)
4129
4168
 
4130
- '@tbox.cn/app-sdk-core@0.20.3':
4169
+ '@tbox.cn/app-sdk-core@0.20.4':
4131
4170
  dependencies:
4132
- '@tbox.cn/app-contracts': 0.12.4
4171
+ '@tbox.cn/app-contracts': 0.13.0
4133
4172
 
4134
- '@tbox.cn/app-sdk-server@0.24.1':
4173
+ '@tbox.cn/app-sdk-server@0.25.0':
4135
4174
  dependencies:
4136
4175
  '@ag-ui/core': 0.0.47
4137
- '@tbox.cn/app-contracts': 0.12.4
4138
- '@tbox.cn/app-sdk-core': 0.20.3
4139
- '@tbox.cn/app-toolkit': 0.7.4
4176
+ '@tbox.cn/app-contracts': 0.13.0
4177
+ '@tbox.cn/app-sdk-core': 0.20.4
4178
+ '@tbox.cn/app-toolkit': 0.7.5
4140
4179
  express: 4.22.2
4141
4180
  jose: 6.2.8
4142
4181
  zod: 3.25.76
4143
4182
  transitivePeerDependencies:
4144
4183
  - supports-color
4145
4184
 
4146
- '@tbox.cn/app-theme-tbox@0.1.3': {}
4185
+ '@tbox.cn/app-theme-tbox@0.1.4': {}
4147
4186
 
4148
- '@tbox.cn/app-toolkit@0.7.4':
4187
+ '@tbox.cn/app-toolkit@0.7.5':
4149
4188
  dependencies:
4150
4189
  ajv: 8.20.0
4151
4190
  zod: 3.25.76
@@ -38,14 +38,14 @@ catalog:
38
38
  ws: 8.21.3
39
39
  "@types/ws": 8.18.1
40
40
  "@tbox.cn/agent-plugin": 0.1.0
41
- "@tbox.cn/app-sdk-core": 0.20.3
42
- "@tbox.cn/app-sdk-client": 0.21.2
43
- "@tbox.cn/app-sdk-server": 0.24.1
44
- "@tbox.cn/app-agent-sdk-server": 0.2.2
45
- "@tbox.cn/app-agent-sdk-client": 0.1.5
46
- "@tbox.cn/app-contracts": 0.12.4
47
- "@tbox.cn/app-contracts-mall": 0.12.5
48
- "@tbox.cn/app-theme-tbox": 0.1.3
41
+ "@tbox.cn/app-sdk-core": 0.20.4
42
+ "@tbox.cn/app-sdk-client": 0.21.3
43
+ "@tbox.cn/app-sdk-server": 0.25.0
44
+ "@tbox.cn/app-agent-sdk-server": 0.2.3
45
+ "@tbox.cn/app-agent-sdk-client": 0.1.6
46
+ "@tbox.cn/app-contracts": 0.13.0
47
+ "@tbox.cn/app-contracts-mall": 0.13.0
48
+ "@tbox.cn/app-theme-tbox": 0.1.4
49
49
  zustand: 4.5.7
50
50
  eslint: 9.39.5
51
51
  typescript-eslint: 8.67.0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "mall 画像(单一模板统一化 W4):create --profile mall 执行器(W5 接线)按 modules 序列加装 + configOverlay 叠加(--config-dir 通道)+ rootFiles 根文件落地(TEMPLATE.md 使用指南 → 应用根)。provider 轴独立(缺省 mock-only 演示态;vendor 档由部署者后续 add)。",
3
3
  "name": "mall",
4
- "description": "商圈 AI Agent:家页形态(home 槽)+ 域装配 + 六业务域(导购/会员/停车/营销/活动/客服)",
4
+ "description": "商圈 AI Agent:家页形态(home 槽)+ 域装配 + 七业务域(导购/会员/停车/营销/活动/客服/AI 支付)",
5
5
  "modules": [
6
6
  "@tbox.cn/app-module-mall-core",
7
7
  "@tbox.cn/app-module-shopping-guide",
@@ -9,7 +9,8 @@
9
9
  "@tbox.cn/app-module-parking",
10
10
  "@tbox.cn/app-module-promotion",
11
11
  "@tbox.cn/app-module-alipay-activity",
12
- "@tbox.cn/app-module-customer-service"
12
+ "@tbox.cn/app-module-customer-service",
13
+ "@tbox.cn/app-module-ai-payment"
13
14
  ],
14
15
  "configOverlay": "profiles/mall/config",
15
16
  "rootFiles": ["TEMPLATE.md"]
@@ -0,0 +1,91 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { accessSync, constants, existsSync, statSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ export function hasCommand(command, env = process.env) {
7
+ const extensions = process.platform === 'win32' ? (env.PATHEXT ?? '.EXE;.CMD;.BAT').split(';') : [''];
8
+ return (env.PATH ?? '').split(path.delimiter).some(dir => extensions.some(extension => {
9
+ try {
10
+ const executable = path.join(dir || '.', command + extension);
11
+ accessSync(executable, constants.X_OK);
12
+ return statSync(executable).isFile();
13
+ }
14
+ catch { return false; }
15
+ }));
16
+ }
17
+
18
+ function stopChild(child, signal) {
19
+ if (!child?.pid) return;
20
+ try {
21
+ if (process.platform === 'win32') child.kill(signal);
22
+ else process.kill(-child.pid, signal);
23
+ } catch (error) {
24
+ if (error.code !== 'ESRCH') throw error;
25
+ }
26
+ }
27
+
28
+ /** H5/server 为主进程;可选容器失败不终止主进程。 */
29
+ export function startDev({
30
+ projectDir,
31
+ spawnProcess = spawn,
32
+ commandExists = hasCommand,
33
+ stopProcess = stopChild,
34
+ signals = process,
35
+ log = console,
36
+ finish = code => { process.exitCode = code; },
37
+ }) {
38
+ const options = { cwd: projectDir, detached: process.platform !== 'win32', shell: process.platform === 'win32' };
39
+ const containerInstalled = existsSync(path.join(projectDir, 'apps/miniapp-container-alipay/package.json'));
40
+ const containerEnabled = containerInstalled && commandExists('minidev');
41
+ const server = spawnProcess('pnpm', ['--filter', './apps/server', 'dev'], {
42
+ ...options, stdio: containerEnabled ? ['ignore', 'inherit', 'inherit'] : 'inherit',
43
+ });
44
+ let container;
45
+ let stopping = false;
46
+ let requestedCode;
47
+ let completed = false;
48
+ const stop = code => {
49
+ if (stopping) return;
50
+ stopping = true;
51
+ requestedCode = code;
52
+ stopProcess(server, 'SIGTERM');
53
+ stopProcess(container, 'SIGTERM');
54
+ setTimeout(() => {
55
+ stopProcess(server, 'SIGKILL');
56
+ stopProcess(container, 'SIGKILL');
57
+ }, 2000);
58
+ };
59
+ const interrupt = () => stop(130);
60
+ const terminate = () => stop(143);
61
+ signals.on('SIGINT', interrupt);
62
+ signals.on('SIGTERM', terminate);
63
+ const complete = code => {
64
+ if (completed) return;
65
+ completed = true;
66
+ stop(code);
67
+ signals.removeListener('SIGINT', interrupt);
68
+ signals.removeListener('SIGTERM', terminate);
69
+ finish(requestedCode ?? code);
70
+ };
71
+ server.once('error', error => { log.error(`H5/server 启动失败:${error.message}`); complete(1); });
72
+ server.once('exit', (code, signal) => complete(code ?? (signal ? 1 : 0)));
73
+
74
+ if (!containerInstalled) {
75
+ log.info('未安装支付宝小程序容器,仅启动 H5/server。');
76
+ } else if (!containerEnabled) {
77
+ log.info('未找到 minidev,跳过小程序容器,H5/server 正常启动。');
78
+ } else {
79
+ log.info('同时启动支付宝小程序容器(minidev)。');
80
+ container = spawnProcess('pnpm', ['--filter', '@app/miniapp-container-alipay', 'dev'], { ...options, stdio: 'inherit' });
81
+ container.once('error', error => log.warn(`小程序容器启动失败,H5/server 继续运行:${error.message}`));
82
+ container.once('exit', code => {
83
+ if (!stopping) log.info(`小程序容器已退出(${code ?? 'signal'}),H5/server 继续运行。`);
84
+ });
85
+ }
86
+ return { server, get container() { return container; }, stop };
87
+ }
88
+
89
+ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
90
+ startDev({ projectDir: path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') });
91
+ }
package/scripts/dev.sh CHANGED
@@ -12,4 +12,4 @@ pnpm install
12
12
  echo "Starting development server..."
13
13
  echo " - http://localhost:8000 (API + WS + 页面 + HMR)"
14
14
 
15
- pnpm --filter @app/server dev
15
+ pnpm dev