@tbox.cn/app-template-agent 0.10.8 → 0.10.9
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 +15 -0
- package/apps/client/src/app.tsx +7 -5
- package/apps/client/src/vite-env.d.ts +3 -0
- package/apps/client/vite.config.ts +6 -0
- package/apps/server/src/dev.ts +89 -56
- package/package.json +2 -2
- package/pnpm-lock.template.yaml +16 -7
- package/pnpm-workspace.template.yaml +1 -1
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/`),应用自有文件按收窄语义拒绝 |
|
package/apps/client/src/app.tsx
CHANGED
|
@@ -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——`
|
|
6
|
-
// lazy 分支成为可摇除死代码,动态 import 与页面 chunk
|
|
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 />
|
|
@@ -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'),
|
package/apps/server/src/dev.ts
CHANGED
|
@@ -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 {
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
9
14
|
import { fileURLToPath } from 'url';
|
|
10
|
-
import { createServer as createViteServer } from 'vite';
|
|
11
|
-
import {
|
|
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
|
-
// 解耦——
|
|
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
|
|
24
|
-
//
|
|
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
|
-
//
|
|
65
|
+
// 沙箱域名 Host 透传放行(dev-only;dist 物理不含 vite)。安全边界见 Agent Note
|
|
66
|
+
// 2026-09-09 与方案 W Note(protected 面 /@fs 另有 allow 收窄 + deny 现值保留)
|
|
35
67
|
allowedHosts: true,
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
75
|
+
// custom:不加 Vite 自己的 SPA fallback,HTML 路由由 runtime.final() 统一处理
|
|
41
76
|
appType: 'custom',
|
|
42
77
|
});
|
|
43
78
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
//
|
|
75
|
-
app.use(
|
|
94
|
+
// 面裁决:dev 面 → vite middlewares;static 面 → next()(落 final 的 dist 静态)
|
|
95
|
+
app.use(runtime.gate);
|
|
76
96
|
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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.
|
|
3
|
+
"version": "0.10.9",
|
|
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.
|
|
39
|
+
"@tbox.cn/app-sdk-server": "0.22.0"
|
|
40
40
|
},
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"publishConfig": {
|
package/pnpm-lock.template.yaml
CHANGED
|
@@ -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.
|
|
32
|
-
version: 0.
|
|
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.
|
|
118
|
+
version: 0.22.0
|
|
119
119
|
eslint:
|
|
120
120
|
specifier: 'catalog:'
|
|
121
121
|
version: 9.39.5
|
|
@@ -1380,8 +1380,8 @@ packages:
|
|
|
1380
1380
|
engines: {node: '>=20.0.0'}
|
|
1381
1381
|
hasBin: true
|
|
1382
1382
|
|
|
1383
|
-
'@tbox.cn/app-sdk-server@0.
|
|
1384
|
-
resolution: {integrity: sha512-
|
|
1383
|
+
'@tbox.cn/app-sdk-server@0.22.0':
|
|
1384
|
+
resolution: {integrity: sha512-St5cP43/y/pH/s6ubXX44Rf0wmysL19tZRvTWSUV/0EmO7ouoRmtTzsWHe+XnqkcUnRgfSYm/evRse+K9ATNhg==}
|
|
1385
1385
|
engines: {node: '>=20.0.0'}
|
|
1386
1386
|
hasBin: true
|
|
1387
1387
|
|
|
@@ -1392,6 +1392,10 @@ packages:
|
|
|
1392
1392
|
resolution: {integrity: sha512-bvq5l7rwwX3EJe0hQm4dnwSh0tuDmoucCkCfX306PvNbhSv0H9uHSljg/jeXh08DBtc2gjIJyvPsfDxrv5X6Uw==}
|
|
1393
1393
|
engines: {node: '>=20.0.0'}
|
|
1394
1394
|
|
|
1395
|
+
'@tbox.cn/app-toolkit@0.7.3':
|
|
1396
|
+
resolution: {integrity: sha512-Tdh1XkqRX0DGvTxflrfgJ4WFVW5wiq9cGOd7hpFrGzQ95mXFiSUKyQMgMtIum8kbReUq+aPI5hv8Z87AugZ1yQ==}
|
|
1397
|
+
engines: {node: '>=20.0.0'}
|
|
1398
|
+
|
|
1395
1399
|
'@types/babel__core@7.20.5':
|
|
1396
1400
|
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
|
|
1397
1401
|
|
|
@@ -4184,12 +4188,12 @@ snapshots:
|
|
|
4184
4188
|
transitivePeerDependencies:
|
|
4185
4189
|
- supports-color
|
|
4186
4190
|
|
|
4187
|
-
'@tbox.cn/app-sdk-server@0.
|
|
4191
|
+
'@tbox.cn/app-sdk-server@0.22.0':
|
|
4188
4192
|
dependencies:
|
|
4189
4193
|
'@ag-ui/core': 0.0.47
|
|
4190
4194
|
'@tbox.cn/app-contracts': 0.12.3
|
|
4191
4195
|
'@tbox.cn/app-sdk-core': 0.20.2
|
|
4192
|
-
'@tbox.cn/app-toolkit': 0.7.
|
|
4196
|
+
'@tbox.cn/app-toolkit': 0.7.3
|
|
4193
4197
|
express: 4.22.2
|
|
4194
4198
|
jose: 6.2.8
|
|
4195
4199
|
zod: 3.25.76
|
|
@@ -4203,6 +4207,11 @@ snapshots:
|
|
|
4203
4207
|
ajv: 8.20.0
|
|
4204
4208
|
zod: 3.25.76
|
|
4205
4209
|
|
|
4210
|
+
'@tbox.cn/app-toolkit@0.7.3':
|
|
4211
|
+
dependencies:
|
|
4212
|
+
ajv: 8.20.0
|
|
4213
|
+
zod: 3.25.76
|
|
4214
|
+
|
|
4206
4215
|
'@types/babel__core@7.20.5':
|
|
4207
4216
|
dependencies:
|
|
4208
4217
|
'@babel/parser': 7.29.8
|
|
@@ -40,7 +40,7 @@ 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.
|
|
43
|
+
"@tbox.cn/app-sdk-server": 0.22.0
|
|
44
44
|
"@tbox.cn/app-agent-sdk-server": 0.1.4
|
|
45
45
|
"@tbox.cn/app-agent-sdk-client": 0.1.3
|
|
46
46
|
"@tbox.cn/app-contracts": 0.12.3
|