@tbox.cn/app-template-agent 0.10.8 → 0.10.10

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/ENV.md CHANGED
@@ -171,6 +171,8 @@ dev/src 与 prod/dist bundle 形态恒等):
171
171
  | `MALL_HOME_DEV_SERVICES` | 首页「常用服务」开发测试入口展示开关:`true`/`1` 展示,`false`/`0`/缺席隐藏(fail-closed,正式用户零透出;生产部署不配置即隐藏态)。server 启动期解析,经 `GET /api/m/mall-core/config` 下发前端(响应 `{ showDevServices: boolean }`);env 变更需重启进程。注入走外层 source(档位 env 文件/启动器 scripts/app-dev.mjs),`tbox-app dev` 不注入 env 值 |
172
172
  | `HOST` | 服务监听地址(默认 `0.0.0.0`) |
173
173
  | `PORT` | 服务监听端口(默认 `8000`) |
174
+ | `TBOX_DEV_TOKEN` | 沙箱 dev server 鉴权 token(方案 W;平台运行时注入,**本地无需设置**):形状 `^[A-Za-z0-9_-]{20,128}$`。在场 → protected 双面裁决——dev 面(凭据 + 浏览器导航/同源信号)完整 vite 能力,static 面(无凭据/跨源子资源)纯 dist + SSE 刷新,零源码泄漏;缺席 → classic(与历史行为字节级等价)。在场但形状不合规 → fail-closed 全 static。配套:`GET /__tbox_dev_hot_reload`(static 面刷新 SSE,凭据无关);HMR WS 凭据走 query(`tbox_dev_token`,页面 bootstrap 自动补参);protected 面 vite `fs.allow` 收窄(client 源 + 工作区依赖真源)+ `fs.deny` 保留 |
175
+ | `TBOX_DEV_SSE_KEEPALIVE_MS` | protected 面 SSE 心跳间隔 ms(缺省 15000;smoke-dev-protected.sh 经此覆盖加速断言。非法/缺席回退缺省) |
174
176
 
175
177
  ## 本地 export 命令块(必需项,可复制)
176
178
 
@@ -193,3 +195,16 @@ export MALL_HOME_DEV_SERVICES=true
193
195
  覆盖面含 `llm_provider.json`(`modelName`/`thinking`):注入时 LLM 装配读档位目录文件,
194
196
  其 `modelName` 优先于 `APP_AI_MODEL_NAME`;档目录缺该文件 → 链式回退 env(config-dir 独占
195
197
  注入语义:缺文件 = 显式不指定,不落回模板默认 config)。
198
+
199
+ # dev protected 排障速查(方案 W)
200
+
201
+ `TBOX_DEV_TOKEN` 注入形态下预览异常时,按症状对日志特征定位(`TBOX_LOG_LEVEL=debug` 开 debug 族):
202
+
203
+ | 症状 | 日志特征 | 处置 |
204
+ |---|---|---|
205
+ | 页面白屏且网络面全 404 | `dev_face_decision` reason=`no-cred` | 凭据未送达——确认预览面板 URL 带 `tbox_dev_token`(302 盖戳后以 cookie 存续);手动验证用 `?tbox_dev_token=<token>` |
206
+ | HMR 不连(浏览器 console `vite:ws:disconnect`) | `dev_hmr_upgrade` outcome=`rejected-401` | WS query 凭据缺失/失效——页面须经 dev 面 HTML 加载(bootstrap 自动补 query);直接打开裸 URL 无 token |
207
+ | 静态面不刷新(改代码后页面不变) | 无 `dev_build_end` | watch 构建未触发/失败——看 `[dev] watch build failed`;public/ 改动 **dev 面实时生效**(vite publicDir 实时读盘)但 static 面(dist)滞后至下次 rebuild(rollup watch 不监 publicDir——已实测),需手动刷新或 touch 源文件 |
208
+ | 页面反复刷新循环 | `dev_build_end` 高频 | touch 型工具循环改文件——排查写入源 |
209
+ | 302 后 requestId 变化对不上 | 前后两条 `dev_face_decision` requestId 不同 | 302 盖戳是独立一跳(box 侧 `dev_token_redirect`),两跳 requestId 各自独立——按 URL 与时序关联 |
210
+ | 本地 protected 直跑模块 403 | `dev_face_decision` reason 正常但 `/@fs` 403 | 构建区(.tbox-dev.local)缺席时 fs.allow 为收窄半径;workspace 真源目录在 allow 内(`packages/`),应用自有文件按收窄语义拒绝 |
@@ -2,13 +2,15 @@ import { lazy, Suspense } from 'react';
2
2
  import BusinessApp from '@/business/App';
3
3
 
4
4
  // dev 卡片预览页(/_tbox/card-preview):
5
- // - 守卫用**三元**而非 if——`import.meta.env.DEV` 在生产构建被静态替换为 false,
6
- // lazy 分支成为可摇除死代码,动态 import 与页面 chunk 一并消失(若用顶层 if,
7
- // lazy() 调用本身活过 treeshaking,chunk 仍会产出);
5
+ // - 守卫用**三元**而非 if——`DEV || __TBOX_CARD_PREVIEW__` 在生产构建(define false)被
6
+ // 静态替换为 false,lazy 分支成为可摇除死代码,动态 import 与页面 chunk 一并消失
7
+ // (若用顶层 if,lazy() 调用本身活过 treeshaking,chunk 仍会产出);
8
+ // - 方案 W:沙箱 protected 静态面经 __TBOX_CARD_PREVIEW__(build + TBOX_DEV_TOKEN)放行,
9
+ // dev 面仍由 import.meta.env.DEV 放行——两态共用同一 lazy 装配;
8
10
  // - lazy 双动态 import 组装(SDK 页面 + 模板 registry/authClient 单例注入——
9
11
  // authClient 含模板选项,不经预览页自建)。
10
12
  const CARD_PREVIEW_PATH = '/_tbox/card-preview';
11
- const DevCardPreview = import.meta.env.DEV
13
+ const DevCardPreview = import.meta.env.DEV || __TBOX_CARD_PREVIEW__
12
14
  ? lazy(async () => {
13
15
  const [{ CardPreviewPage }, { CARD_REGISTRY }, { authClient }] = await Promise.all([
14
16
  import('@tbox.cn/app-agent-sdk-client/client/card-preview'),
@@ -22,7 +24,7 @@ const DevCardPreview = import.meta.env.DEV
22
24
  : null;
23
25
 
24
26
  export default function App() {
25
- if (import.meta.env.DEV && DevCardPreview && window.location.pathname === CARD_PREVIEW_PATH) {
27
+ if ((import.meta.env.DEV || __TBOX_CARD_PREVIEW__) && DevCardPreview && window.location.pathname === CARD_PREVIEW_PATH) {
26
28
  return (
27
29
  <Suspense fallback={<div>加载卡片预览…</div>}>
28
30
  <DevCardPreview />
@@ -1,3 +1,6 @@
1
1
  /// <reference types="vite/client" />
2
2
 
3
3
  declare module 'postcss-pxtorem';
4
+
5
+ // 卡片预览面三态编译常量(vite.config.ts define 注入;guard-dev-probe 断言声明在场)
6
+ declare const __TBOX_CARD_PREVIEW__: boolean;
@@ -45,6 +45,12 @@ export default defineConfig(async ({ command }) => {
45
45
  }),
46
46
  ...devPlugins,
47
47
  ],
48
+ // 卡片预览面三态(方案 W):serve 恒 false(dev 面由 import.meta.env.DEV 放行);
49
+ // build 无 TBOX_DEV_TOKEN → false(chunk 可摇除,生产零残留);build 有(沙箱 protected
50
+ // watch 构建)→ true(static 面 /_tbox/card-preview 可达)。guard-dev-probe 断言本标记。
51
+ define: {
52
+ __TBOX_CARD_PREVIEW__: command === 'build' && !!process.env.TBOX_DEV_TOKEN ? 'true' : 'false',
53
+ },
48
54
  resolve: {
49
55
  alias: {
50
56
  '@': resolve(__dirname, 'src'),
@@ -2,92 +2,125 @@
2
2
  * vite dev 入口(仅 tsx 运行:pnpm dev;物理不进 tsup bundle——forbid-vite 插件拦截)。
3
3
  * middlewareMode + 单端口:HTTP 与 HMR WS 全走应用端口(沙箱仅暴露一个端口亦可开发)。
4
4
  * 部署形态一律走 dist/index.js(静态产物,零 HMR WS)。
5
+ *
6
+ * 方案 W(沙箱 dev server 鉴权保护):TBOX_DEV_TOKEN 在场 → protected 双面裁决
7
+ * (dev 面 = 凭据 + 导航/同源信号放行 vite;static 面 = 纯 dist + SSE 刷新,零源码泄漏);
8
+ * 缺席 → classic,与历史行为字节级等价。裁决机制真源 = SDK platform/dev-runtime
9
+ * (createTboxDevRuntime),本文件只做装配:vite 实例 + fs.allow 收窄 + 面无关自由区。
5
10
  */
6
11
  import { createServer } from 'http';
7
12
  import path from 'path';
8
- import { readFile } from 'node:fs/promises';
13
+ import { existsSync } from 'node:fs';
9
14
  import { fileURLToPath } from 'url';
10
- import { createServer as createViteServer } from 'vite';
11
- import { injectScript, isReady } from '@tbox.cn/app-agent-sdk-server/platform';
15
+ import { build as viteBuild, createServer as createViteServer, searchForWorkspaceRoot } from 'vite';
16
+ import {
17
+ createTboxDevRuntime,
18
+ injectScript,
19
+ isReady,
20
+ resolveDevTokenFromEnv,
21
+ } from '@tbox.cn/app-agent-sdk-server/platform';
12
22
  import { createLogger } from '@tbox.cn/app-agent-sdk-server';
13
23
  import { app, registerUpgradeDelegate, start } from './app.js';
14
24
 
15
25
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
26
  const serverLogger = createLogger('server');
17
27
  const clientRoot = path.resolve(__dirname, '../../client');
28
+ const appRoot = path.resolve(__dirname, '../..');
18
29
 
19
30
  // HMR WS 独立路径:dev 基础设施命名空间(双下划线呼应 /@vite/*),与业务命名空间(/ws*)
20
- // 解耦——delegate 只认领此路径,根路径归还业务路由。
31
+ // 解耦——upgrade 认领只针对此路径,根路径归还业务路由。协议常量(vite-hmr/vite-ping)、
32
+ // 认领路径 posix.join(base, hmr.path) 与 Spanner 子协议补写均内聚于 SDK handleUpgrade
33
+ // (smoke-dev-hmr.sh 守护该契约面)。
21
34
  const HMR_WS_PATH = '/__vite_hmr';
22
35
 
23
- // HMR WS hub:永不 listen 的纯事件载体。hmr.server 在场 → vite 不自建 24678 独立端口,
24
- // 客户端 __HMR_PORT__=null → 按页面同源端口连接(公网端口映射无关)。vite 对 hub 仅
25
- // on/off('upgrade')(6.4.3 源码实证);协议常量(vite-hmr/vite-ping)与认领路径
26
- // posix.join(base, hmr.path) 是 vite 契约面,由 scripts/smoke-dev-hmr.sh 守护。
36
+ // HMR WS hub:永不 listen 的纯事件载体。hmr.server 在场 → vite 不自建独立端口,
37
+ // 客户端按页面同源端口连接。vite 对 hub 仅 on/off('upgrade')(6.4.3 源码实证)。
27
38
  const hmrHub = createServer();
28
39
 
40
+ const tokenState = resolveDevTokenFromEnv(process.env);
41
+ const protectedMode = tokenState.mode === 'protected';
42
+
43
+ // protected 面 fs.allow 收窄(classic 恒默认不传——红线):client 源 + 工作区依赖真源。
44
+ // 模板原地装配(pnpm dev)时模块图经 workspace 链接解析到仓库 packages/,故并入
45
+ // workspace 两目录(filter(existsSync):生成应用无此目录时自动滤除,不影响沙箱半径)。
46
+ const workspaceRoot = searchForWorkspaceRoot(clientRoot);
47
+ const fsAllowNarrowed = protectedMode
48
+ ? [
49
+ ...new Set(
50
+ [
51
+ clientRoot,
52
+ path.join(appRoot, 'packages'),
53
+ path.join(appRoot, 'node_modules'),
54
+ path.join(workspaceRoot, 'packages'),
55
+ path.join(workspaceRoot, 'node_modules'),
56
+ ].filter((p) => existsSync(p)),
57
+ ),
58
+ ]
59
+ : undefined;
60
+
29
61
  const vite = await createViteServer({
30
62
  root: clientRoot,
31
63
  server: {
32
64
  middlewareMode: true,
33
- // 沙箱域名 Host 透传放行(dev-only;dist 物理不含 vite)。安全边界四条
34
- // (cors() 既存全开 / 代理收敛公网入口 / token 轴不变 / /@fs 另有 deny)见 Agent Note 2026-09-09。
65
+ // 沙箱域名 Host 透传放行(dev-only;dist 物理不含 vite)。安全边界见 Agent Note
66
+ // 2026-09-09 与方案 W Note(protected 面 /@fs 另有 allow 收窄 + deny 现值保留)
35
67
  allowedHosts: true,
36
- // /@fs 加固:默认 deny 不含服务端凭证目录(client 永不需要经 /@fs 读它)
37
- fs: { deny: ['.env', '.env.*', '*.{crt,pem}', '**/.git/**', '**/config/credentials/**'] },
68
+ fs: {
69
+ ...(fsAllowNarrowed ? { allow: fsAllowNarrowed } : {}),
70
+ // /@fs 加固:默认 deny 不含服务端凭证目录(client 永不需要经 /@fs 读它)
71
+ deny: ['.env', '.env.*', '*.{crt,pem}', '**/.git/**', '**/config/credentials/**'],
72
+ },
38
73
  hmr: { server: hmrHub, path: HMR_WS_PATH },
39
74
  },
40
- // custom:不加 Vite 自己的 SPA fallback,由下方 app.use('*') 统一处理 HTML 路由
75
+ // custom:不加 Vite 自己的 SPA fallback,HTML 路由由 runtime.final() 统一处理
41
76
  appType: 'custom',
42
77
  });
43
78
 
44
- // 升级委托:pathname === 认领路径(与 vite 同一 resolved config 同式 posix.join 派生——
45
- // 恒等无漂移,字面比较在未来设 base 时有悬挂方向:delegate 认领转发而 vite 不接,socket
46
- // 无人销毁);协议轴 = 子协议补写 + 白名单(见下)。
47
- // 子协议补写(2026-09-21,详见 .agents/notes/implemented/bug-fix/
48
- // 2026-09-21-spanner-ws-subprotocol-strip-reload-loop.md):Spanner 网关(*.coding.tboxpro.cn
49
- // 车道)把 WS 升级的 Sec-WebSocket-Protocol 视为 hop-by-hop 在下游拨号时剥除(2026-09-09
50
- // Terminal Note 同源实证:Authorization/Cookie/子协议均剥、query 唯一存活)。剥除后的拨号
51
- // 无协议头——原逻辑不认领 → 回落 app upgrade destroy → 网关报 "unexpected EOF";WebKit
52
- // (Safari/iOS 支付宝·微信)宽松接受网关乐观 101(无协议回显),hmr WS open 即断 → vite
53
- // client vite:ws:disconnect → vite-ping 探测又被乐观 101 放行(成功判据 = open 事件,先于
54
- // 下游拨号结果)→ location.reload() 无限循环(Chrome/Blink 严格校验协议回显恒不 open,
55
- // 走静默分支免疫)。补写让下游握手成立:vite 101 带协议回显 + connected → 连接保持 →
56
- // 无 disconnect/ping/reload,WebKit 下 HMR 恢复可用。补写在网关透传修复(agtchannel spec
57
- // 2026-09-21 close/握手头透传,1b)落地后自动退化为死分支——长留不移除(sync 覆盖 + DRM
58
- // 回滚场景防回归载体)。其余非 vite 协议值仍不认领(smoke ⑤⑥ 语义不变)。
59
- // 未认领的升级回落 app 路由(业务 /ws、根路径归还业务、fail-fast 语义不变)。
60
- const viteHmrPath = path.posix.join(vite.config.base, HMR_WS_PATH);
61
- registerUpgradeDelegate((request, socket, head) => {
62
- const { pathname } = new URL(request.url || '/', 'http://localhost');
63
- if (pathname !== viteHmrPath) return false;
64
- const protocol = request.headers['sec-websocket-protocol'];
65
- if (!protocol) {
66
- request.headers['sec-websocket-protocol'] = 'vite-hmr';
67
- } else if (protocol !== 'vite-hmr' && protocol !== 'vite-ping') {
68
- return false;
69
- }
70
- hmrHub.emit('upgrade', request, socket, head);
71
- return true;
79
+ const runtime = createTboxDevRuntime({
80
+ vite: { middlewares: vite.middlewares, transformIndexHtml: vite.transformIndexHtml },
81
+ hmrHub,
82
+ // 与 vite 同一 resolved config 同式 posix.join 派生——恒等无漂移
83
+ hmrPath: path.posix.join(vite.config.base, HMR_WS_PATH),
84
+ tokenState,
85
+ clientRoot,
86
+ clientDist: path.join(clientRoot, 'dist'),
87
+ spaExcludePrefixes: ['/api', '/ws'],
88
+ decorateHtml: (html) => (isReady() ? injectScript(html) : html),
89
+ logger: serverLogger,
90
+ fsAllowNarrowed: protectedMode,
91
+ sseKeepaliveMs: process.env.TBOX_DEV_SSE_KEEPALIVE_MS ? Number(process.env.TBOX_DEV_SSE_KEEPALIVE_MS) : undefined,
72
92
  });
73
93
 
74
- // Vite 中间件:静态资源、模块转换、HMR(装配已在 ./app.js import 期完成)
75
- app.use(vite.middlewares);
94
+ // 面裁决:dev 面 → vite middlewares;static 面 → next()(落 final 的 dist 静态)
95
+ app.use(runtime.gate);
76
96
 
77
- // HTML 路由兜底:非 /api、/ws 一律返回 index.html(经 Vite 转换 + inspector 注入)
78
- app.use('*', async (req, res, next) => {
79
- if (req.originalUrl.startsWith('/api') || req.originalUrl.startsWith('/ws')) {
80
- return next();
81
- }
82
- try {
83
- const rawHtml = await readFile(path.join(clientRoot, 'index.html'), 'utf-8');
84
- const template = await vite.transformIndexHtml(req.originalUrl, rawHtml);
85
- const html = isReady() ? injectScript(template) : template;
86
- res.status(200).set({ 'Content-Type': 'text/html' }).end(html);
87
- } catch (e) {
88
- next(e);
89
- }
97
+ // ── 自由区(模板差异 + 应用自定义 middleware;dev/static 两面恒可见)──
98
+ // 探针路由:smoke-dev-protected.sh ⑩ 断言两面可见性(dev 基础设施,dist 物理不含)
99
+ app.get('/__tbox_dev_freezone_probe', (_req, res) => {
100
+ res.type('text/plain').send('freezone-ok');
90
101
  });
102
+ // ── 自由区结束 ──
103
+
104
+ app.use(runtime.final);
105
+
106
+ // 升级委托:唯一 WS 入口 = runtime.handleUpgrade(路径认领 + 子协议补写 + protected
107
+ // token 校验,失败 401;未认领回落 app 路由——业务 /ws、根路径、fail-fast 语义不变)
108
+ registerUpgradeDelegate(runtime.handleUpgrade);
109
+
110
+ // protected 面构建通知:watch 增量构建 → BUNDLE_END → SSE 广播 → static 面 reload。
111
+ // fire-and-forget(不 await、无显式 close——dev 会话生命周期即进程生命周期);
112
+ // watch 启动 emptyOutDir 清空 dist 为已定价行为(首建完成前 static 面纯 404)。
113
+ if (protectedMode) {
114
+ viteBuild({ root: clientRoot, build: { watch: {}, sourcemap: false } })
115
+ .then((result) => {
116
+ const watcher = Array.isArray(result) ? result[0] : result;
117
+ if (!watcher || !('on' in watcher)) return;
118
+ watcher.on('event', (e) => {
119
+ if (e.code === 'BUNDLE_END') runtime.notifyBuildEnd();
120
+ });
121
+ })
122
+ .catch((err) => serverLogger.error('[dev] watch build failed:', err));
123
+ }
91
124
 
92
125
  start().catch((err) => {
93
126
  serverLogger.error('Failed to start:', err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tbox.cn/app-template-agent",
3
- "version": "0.10.8",
3
+ "version": "0.10.10",
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"
@@ -36,7 +36,7 @@
36
36
  "typescript-eslint": "8.67.0",
37
37
  "eslint-plugin-react-hooks": "5.2.0",
38
38
  "vite": "6.4.3",
39
- "@tbox.cn/app-sdk-server": "0.21.2"
39
+ "@tbox.cn/app-sdk-server": "0.22.0"
40
40
  },
41
41
  "license": "MIT",
42
42
  "publishConfig": {
@@ -19,8 +19,8 @@ catalogs:
19
19
  specifier: 0.1.3
20
20
  version: 0.1.3
21
21
  '@tbox.cn/app-agent-sdk-server':
22
- specifier: 0.1.4
23
- version: 0.1.4
22
+ specifier: 0.1.5
23
+ version: 0.1.5
24
24
  '@tbox.cn/app-contracts':
25
25
  specifier: 0.12.3
26
26
  version: 0.12.3
@@ -28,8 +28,8 @@ catalogs:
28
28
  specifier: 0.12.4
29
29
  version: 0.12.4
30
30
  '@tbox.cn/app-sdk-server':
31
- specifier: 0.21.2
32
- version: 0.21.2
31
+ specifier: 0.22.0
32
+ version: 0.22.0
33
33
  '@tbox.cn/app-theme-tbox':
34
34
  specifier: 0.1.3
35
35
  version: 0.1.3
@@ -115,7 +115,7 @@ importers:
115
115
  devDependencies:
116
116
  '@tbox.cn/app-sdk-server':
117
117
  specifier: 'catalog:'
118
- version: 0.21.2
118
+ version: 0.22.0
119
119
  eslint:
120
120
  specifier: 'catalog:'
121
121
  version: 9.39.5
@@ -206,7 +206,7 @@ importers:
206
206
  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
207
  '@tbox.cn/app-agent-sdk-server':
208
208
  specifier: 'catalog:'
209
- version: 0.1.4(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
209
+ version: 0.1.5(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
210
210
  '@tbox.cn/app-contracts':
211
211
  specifier: 'catalog:'
212
212
  version: 0.12.3
@@ -317,7 +317,7 @@ importers:
317
317
  version: 0.1.3(@types/react@18.3.31)
318
318
  '@tbox.cn/app-agent-sdk-server':
319
319
  specifier: 'catalog:'
320
- version: 0.1.4(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
320
+ version: 0.1.5(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
321
321
  '@tbox.cn/app-contracts':
322
322
  specifier: 'catalog:'
323
323
  version: 0.12.3
@@ -1339,8 +1339,8 @@ packages:
1339
1339
  resolution: {integrity: sha512-oyHvufpJ1bWfoEAm82Kkh07d0NbuK9NQkZGEvprB3UBKEQRgyydKps58K1IHHjVZ/eDMBeGA8DgAxqAbC8rQCw==}
1340
1340
  engines: {node: '>=20.0.0'}
1341
1341
 
1342
- '@tbox.cn/app-agent-sdk-server@0.1.4':
1343
- resolution: {integrity: sha512-V4XS+DkanVTdX/5TsgPFgBV/6+iNx0lgA4AjGfhR4eIyV3fhlBU0qS3KN+ZPbfQQfgh95fqenV4n6jMO8iothw==}
1342
+ '@tbox.cn/app-agent-sdk-server@0.1.5':
1343
+ resolution: {integrity: sha512-5M7CTzFpex+KQ+INTEaYGzA1aKEhAcnWbixk6hnXYk9y3CVpJWDo3MV1/ZiwsEmTsFYwryOglbLDS30m3RDl7w==}
1344
1344
  engines: {node: '>=20.0.0'}
1345
1345
 
1346
1346
  '@tbox.cn/app-contracts-mall@0.12.4':
@@ -1351,10 +1351,6 @@ packages:
1351
1351
  resolution: {integrity: sha512-GFthajvUSE7tY6Y5kLJgg2dRuZQdLfxq/WAEHOh+Q7RTwg7mpuLsWiNhXISkXMAtpxg0RkSgtwyRq33QS0ay3w==}
1352
1352
  engines: {node: '>=20.0.0'}
1353
1353
 
1354
- '@tbox.cn/app-contracts@0.12.1':
1355
- resolution: {integrity: sha512-h5HXIfk5frNx6hufY2IBE+hISCk3/2n8A7G3EtnAF4JsR91Pm/uwdmn4zYtZOz0r9cL7Wk1SrUMcokMZ9HkbLw==}
1356
- engines: {node: '>=20.0.0'}
1357
-
1358
1354
  '@tbox.cn/app-contracts@0.12.3':
1359
1355
  resolution: {integrity: sha512-b71WtU1Kk9rC3lwaefb48ymKPgkdb7MJcJQ0lTeUZu/jSNHsqQ4ZZI9ZUbHQ/rzYvWmZbdxe5H94328jAfJoVA==}
1360
1356
  engines: {node: '>=20.0.0'}
@@ -1367,29 +1363,20 @@ packages:
1367
1363
  resolution: {integrity: sha512-hvdcXntg4iJniVu9LEwo5A/vov3L08kRlJLTgStYRdAlH9AJXWLDxFITMNf7YJX8W+j9wjJmmS7Sv88iswxM+w==}
1368
1364
  engines: {node: '>=20.0.0'}
1369
1365
 
1370
- '@tbox.cn/app-sdk-core@0.20.1':
1371
- resolution: {integrity: sha512-OSncc0sjhcuEQAlcANLCKNP0V+hgVhP0qol6pIyYSxSUUVLf69naiGWC4CBtY7PTIYlhximMw6bIn8tqNYKFXg==}
1372
- engines: {node: '>=20.0.0'}
1373
-
1374
1366
  '@tbox.cn/app-sdk-core@0.20.2':
1375
1367
  resolution: {integrity: sha512-KDcFdIrIEOlwDvIqBu29CzR5vDjt0BCADMBrgrd5WlRqjrPM1/jM/RcaRO6gRuElmQCp5LfsoAkVeYTZE/6rpw==}
1376
1368
  engines: {node: '>=20.0.0'}
1377
1369
 
1378
- '@tbox.cn/app-sdk-server@0.21.1':
1379
- resolution: {integrity: sha512-LCB9gH6n5ILdLDHQUAq1NLrclLjmB0dsqGVHe4Zb4yucUPb16jxk/53NREYq0NzsHiTDxc29IvcreVaxRpVmXw==}
1380
- engines: {node: '>=20.0.0'}
1381
- hasBin: true
1382
-
1383
- '@tbox.cn/app-sdk-server@0.21.2':
1384
- resolution: {integrity: sha512-nqBBakAsHjGvG5eO8OLWoC0TTbBFTorrCWZRFLiyKhxHV2OnVThvIZWXTeu08UMBh5se9NFhRfYZxldtAvIwbQ==}
1370
+ '@tbox.cn/app-sdk-server@0.22.0':
1371
+ resolution: {integrity: sha512-St5cP43/y/pH/s6ubXX44Rf0wmysL19tZRvTWSUV/0EmO7ouoRmtTzsWHe+XnqkcUnRgfSYm/evRse+K9ATNhg==}
1385
1372
  engines: {node: '>=20.0.0'}
1386
1373
  hasBin: true
1387
1374
 
1388
1375
  '@tbox.cn/app-theme-tbox@0.1.3':
1389
1376
  resolution: {integrity: sha512-Wf2umpT/k+Ppy1oKuCDqe6M5yvp4F/tjdGpU7uygGWMaEduwFnoK0EVh4eDcA6dMlERLCAjxFlEUY68xXGq99A==}
1390
1377
 
1391
- '@tbox.cn/app-toolkit@0.7.2':
1392
- resolution: {integrity: sha512-bvq5l7rwwX3EJe0hQm4dnwSh0tuDmoucCkCfX306PvNbhSv0H9uHSljg/jeXh08DBtc2gjIJyvPsfDxrv5X6Uw==}
1378
+ '@tbox.cn/app-toolkit@0.7.3':
1379
+ resolution: {integrity: sha512-Tdh1XkqRX0DGvTxflrfgJ4WFVW5wiq9cGOd7hpFrGzQ95mXFiSUKyQMgMtIum8kbReUq+aPI5hv8Z87AugZ1yQ==}
1393
1380
  engines: {node: '>=20.0.0'}
1394
1381
 
1395
1382
  '@types/babel__core@7.20.5':
@@ -4102,7 +4089,7 @@ snapshots:
4102
4089
  - '@types/react'
4103
4090
  - immer
4104
4091
 
4105
- '@tbox.cn/app-agent-sdk-server@0.1.4(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4092
+ '@tbox.cn/app-agent-sdk-server@0.1.5(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4106
4093
  dependencies:
4107
4094
  '@ag-ui/core': 0.0.47
4108
4095
  '@ai-sdk/openai-compatible': 2.0.68(zod@3.25.76)
@@ -4112,7 +4099,7 @@ snapshots:
4112
4099
  '@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)
4113
4100
  '@tbox.cn/app-contracts': 0.12.3
4114
4101
  '@tbox.cn/app-sdk-core': 0.20.2
4115
- '@tbox.cn/app-sdk-server': 0.21.1
4102
+ '@tbox.cn/app-sdk-server': 0.22.0
4116
4103
  ai: 6.0.246(zod@3.25.76)
4117
4104
  express: 4.22.2
4118
4105
  gray-matter: 4.0.3
@@ -4141,12 +4128,6 @@ snapshots:
4141
4128
  react: 18.3.1
4142
4129
  zod: 3.25.76
4143
4130
 
4144
- '@tbox.cn/app-contracts@0.12.1':
4145
- dependencies:
4146
- '@ag-ui/core': 0.0.47
4147
- react: 18.3.1
4148
- zod: 3.25.76
4149
-
4150
4131
  '@tbox.cn/app-contracts@0.12.3':
4151
4132
  dependencies:
4152
4133
  '@ag-ui/core': 0.0.47
@@ -4164,32 +4145,16 @@ snapshots:
4164
4145
  dependencies:
4165
4146
  '@tbox.cn/app-contracts': 0.12.0
4166
4147
 
4167
- '@tbox.cn/app-sdk-core@0.20.1':
4168
- dependencies:
4169
- '@tbox.cn/app-contracts': 0.12.1
4170
-
4171
4148
  '@tbox.cn/app-sdk-core@0.20.2':
4172
4149
  dependencies:
4173
4150
  '@tbox.cn/app-contracts': 0.12.3
4174
4151
 
4175
- '@tbox.cn/app-sdk-server@0.21.1':
4176
- dependencies:
4177
- '@ag-ui/core': 0.0.47
4178
- '@tbox.cn/app-contracts': 0.12.1
4179
- '@tbox.cn/app-sdk-core': 0.20.1
4180
- '@tbox.cn/app-toolkit': 0.7.2
4181
- express: 4.22.2
4182
- jose: 6.2.8
4183
- zod: 3.25.76
4184
- transitivePeerDependencies:
4185
- - supports-color
4186
-
4187
- '@tbox.cn/app-sdk-server@0.21.2':
4152
+ '@tbox.cn/app-sdk-server@0.22.0':
4188
4153
  dependencies:
4189
4154
  '@ag-ui/core': 0.0.47
4190
4155
  '@tbox.cn/app-contracts': 0.12.3
4191
4156
  '@tbox.cn/app-sdk-core': 0.20.2
4192
- '@tbox.cn/app-toolkit': 0.7.2
4157
+ '@tbox.cn/app-toolkit': 0.7.3
4193
4158
  express: 4.22.2
4194
4159
  jose: 6.2.8
4195
4160
  zod: 3.25.76
@@ -4198,7 +4163,7 @@ snapshots:
4198
4163
 
4199
4164
  '@tbox.cn/app-theme-tbox@0.1.3': {}
4200
4165
 
4201
- '@tbox.cn/app-toolkit@0.7.2':
4166
+ '@tbox.cn/app-toolkit@0.7.3':
4202
4167
  dependencies:
4203
4168
  ajv: 8.20.0
4204
4169
  zod: 3.25.76
@@ -40,8 +40,8 @@ catalog:
40
40
  "@tbox.cn/agent-plugin": 0.1.0
41
41
  "@tbox.cn/app-sdk-core": 0.20.2
42
42
  "@tbox.cn/app-sdk-client": 0.21.1
43
- "@tbox.cn/app-sdk-server": 0.21.2
44
- "@tbox.cn/app-agent-sdk-server": 0.1.4
43
+ "@tbox.cn/app-sdk-server": 0.22.0
44
+ "@tbox.cn/app-agent-sdk-server": 0.1.5
45
45
  "@tbox.cn/app-agent-sdk-client": 0.1.3
46
46
  "@tbox.cn/app-contracts": 0.12.3
47
47
  "@tbox.cn/app-contracts-mall": 0.12.4