@tbox.cn/app-template-agent 0.10.11 → 0.10.13

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
@@ -115,6 +115,8 @@ dev/src 与 prod/dist bundle 形态恒等):
115
115
  | `TBOX_LLM_AFFINITY` | 会话亲和大容量旋钮(缺省 on;`=off` 关闭——fetch 头 `X-Affinity-Session` 与 body `prompt_cache_key` 双通道均不注入。best-effort 语义:网关负载可覆盖亲和;排障时若网关对未知 body 字段报错可关) |
116
116
  | `TBOX_LLM_CONN_BIND` | per-session 连接绑定旋钮(缺省 on;`=off` 关闭——LLM fetch 回退全局连接池。连接=网关缓存池路由单位:per-session 单连接(120s keep-alive)钉死集群分配,保活跨 run 提升前缀缓存命中;排障时可关) |
117
117
  | `TBOX_LLM_COOKIE_AFFINITY` | 网关 cookie 亲和旋钮(缺省 on;`=off` 关闭——不回传网关 set-cookie。回传激活 LB 粘性:连接重建后恢复原集群的通道;best-effort) |
118
+ | `TBOX_SOFA_TRACE` | SOFA 链路标识注入旋钮(缺省 on;`=off` 关注入——出站 `*.tbox.cn` 请求不带 sofa-traceid/traceid 双格式头;作用域进入照常。平台 tracelog 串联排障用,独立回滚) |
119
+ | `TBOX_SOFA_TRACE_HOSTS` | SOFA 注入 host 闸门扩展(逗号分隔 host 后缀,**追加**于缺省 `tbox.cn`;如预发 `agtgw-pre.alipay.com`。dot 锚定匹配,闸外请求字节级不变) |
118
120
 
119
121
  ## 统一鉴权
120
122
 
@@ -171,7 +173,7 @@ dev/src 与 prod/dist bundle 形态恒等):
171
173
  | `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
174
  | `HOST` | 服务监听地址(默认 `0.0.0.0`) |
173
175
  | `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` 保留 |
176
+ | `TBOX_DEV_TOKEN` | 沙箱 dev server 鉴权 token(方案 W;平台运行时注入,**本地无需设置**):形状 `^[A-Za-z0-9_-]{20,128}$`。在场 → protected 双面裁决——dev 面(凭据 + 浏览器导航/同源信号)完整 vite 能力,static 面(无凭据/跨源子资源)dist 静态 + SPA fallback catch-all(GET/HEAD 未命中恒回入口页,对齐生产)+ 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
177
  | `TBOX_DEV_SSE_KEEPALIVE_MS` | protected 面 SSE 心跳间隔 ms(缺省 15000;smoke-dev-protected.sh 经此覆盖加速断言。非法/缺席回退缺省) |
176
178
 
177
179
  ## 本地 export 命令块(必需项,可复制)
@@ -208,3 +210,4 @@ export MALL_HOME_DEV_SERVICES=true
208
210
  | 页面反复刷新循环 | `dev_build_end` 高频 | touch 型工具循环改文件——排查写入源 |
209
211
  | 302 后 requestId 变化对不上 | 前后两条 `dev_face_decision` requestId 不同 | 302 盖戳是独立一跳(box 侧 `dev_token_redirect`),两跳 requestId 各自独立——按 URL 与时序关联 |
210
212
  | 本地 protected 直跑模块 403 | `dev_face_decision` reason 正常但 `/@fs` 403 | 构建区(.tbox-dev.local)缺席时 fs.allow 为收窄半径;workspace 真源目录在 allow 内(`packages/`),应用自有文件按收窄语义拒绝 |
213
+ | curl/脚本 GET 任意路径 → 200 入口页(非业务 JSON) | —(无异常日志) | 正常 static 面语义(2026-10-09 起 catch-all 对齐生产);GET 404 才异常 = dist 缺失(watch 首建窗口/构建失败) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tbox.cn/app-template-agent",
3
- "version": "0.10.11",
3
+ "version": "0.10.13",
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.22.1"
39
+ "@tbox.cn/app-sdk-server": "0.24.0"
40
40
  },
41
41
  "license": "MIT",
42
42
  "publishConfig": {
@@ -0,0 +1,84 @@
1
+ // @vitest-environment happy-dom
2
+ /**
3
+ * DebugButton postMessage 载荷契约锁(P0 对齐 trace-exporter 行格式锁定先例):
4
+ * 载荷形状是 H5 → 平台父窗口的跨系统契约——键名漂移 = 平台侧静默断裂。
5
+ * conversationId 语义:会话 β 后由服务端经 run 事件 threadId / 历史行下发,
6
+ * 与 requestId 同点位落位至 message;D2 锁定「缺席 = 键值 undefined 仍发送」
7
+ * 现状降级形态(平台侧 no-conv 回退依赖此形态)。
8
+ */
9
+ import { act } from 'react';
10
+ import { createRoot } from 'react-dom/client';
11
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
12
+
13
+ vi.mock('@tbox.cn/app-agent-sdk-client', () => ({
14
+ createLogger: () => ({ warn: vi.fn() }),
15
+ }));
16
+
17
+ import { DebugButton } from './DebugButton';
18
+
19
+ describe('DebugButton 平台契约(tbox:debug-trace 载荷锁定)', () => {
20
+ let host: HTMLDivElement;
21
+ let root: ReturnType<typeof createRoot>;
22
+ let postSpy: ReturnType<typeof vi.fn>;
23
+
24
+ beforeEach(() => {
25
+ host = document.createElement('div');
26
+ document.body.appendChild(host);
27
+ root = createRoot(host);
28
+ // happy-dom 下 window.parent === window:同一函数引用
29
+ postSpy = vi.fn();
30
+ window.parent.postMessage = postSpy as unknown as typeof window.postMessage;
31
+ });
32
+
33
+ afterEach(() => {
34
+ act(() => root.unmount());
35
+ host.remove();
36
+ });
37
+
38
+ const clickDebug = () => {
39
+ act(() => {
40
+ host.querySelector('.tbox-debug-btn')!.dispatchEvent(new MouseEvent('click', { bubbles: true }));
41
+ });
42
+ };
43
+
44
+ it('D1 点击 → 载荷全键精确(type/requestId/conversationId/messageId/messageCreatedAt)', () => {
45
+ act(() => {
46
+ root.render(<DebugButton requestId="req_1" conversationId="conv_1" messageId="m1" messageCreatedAt={123} />);
47
+ });
48
+ clickDebug();
49
+ expect(postSpy).toHaveBeenCalledTimes(1);
50
+ expect(postSpy.mock.calls[0]![0]).toEqual({
51
+ type: 'tbox:debug-trace',
52
+ requestId: 'req_1',
53
+ conversationId: 'conv_1',
54
+ messageId: 'm1',
55
+ messageCreatedAt: 123,
56
+ });
57
+ expect(postSpy.mock.calls[0]![1]).toBe('*');
58
+ });
59
+
60
+ it('D2 conversationId 缺席 → 载荷键恒在场、值为 undefined(现状降级形态锁定)', () => {
61
+ act(() => {
62
+ root.render(<DebugButton requestId="req_1" messageId="m2" messageCreatedAt={456} />);
63
+ });
64
+ clickDebug();
65
+ const payload = postSpy.mock.calls[0]![0] as Record<string, unknown>;
66
+ // 键恒在场(严格区分键存在性——toEqual 对 undefined 键与缺失等价,故断言键集)
67
+ expect(Object.keys(payload).sort()).toEqual([
68
+ 'conversationId',
69
+ 'messageCreatedAt',
70
+ 'messageId',
71
+ 'requestId',
72
+ 'type',
73
+ ]);
74
+ expect(payload.conversationId).toBeUndefined();
75
+ expect(payload.requestId).toBe('req_1');
76
+ });
77
+
78
+ it('D3 requestId 缺席 → 不渲染(渲染守卫不变)', () => {
79
+ act(() => {
80
+ root.render(<DebugButton messageId="m3" />);
81
+ });
82
+ expect(host.querySelector('.tbox-debug-btn')).toBeNull();
83
+ });
84
+ });
@@ -0,0 +1,83 @@
1
+ // @vitest-environment happy-dom
2
+ /**
3
+ * ActionBar → DebugButton prop 接线守卫(病因学守卫):
4
+ * 会话 β(31de86f3)删除 conversationId prop 行零红灯复发——本测试锁定
5
+ * message.requestId/conversationId 恒透传至 DebugButton(删除任一 prop 行 → 红)。
6
+ * 捕获式 mock(MessageBubble 测试同款模式)。
7
+ */
8
+ import { act } from 'react';
9
+ import { createRoot } from 'react-dom/client';
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
11
+ import type { ChatMessage } from '../../types';
12
+
13
+ const { debugPropsRef } = vi.hoisted(() => ({
14
+ debugPropsRef: {} as { current?: Record<string, unknown> },
15
+ }));
16
+
17
+ vi.mock('./DebugButton', () => ({
18
+ DebugButton: (props: Record<string, unknown>) => {
19
+ debugPropsRef.current = props;
20
+ return null;
21
+ },
22
+ }));
23
+ vi.mock('../../store-context', () => ({
24
+ useChatStore: (selector: (s: Record<string, unknown>) => unknown) =>
25
+ selector({ submitFeedback: vi.fn() }),
26
+ }));
27
+ vi.mock('../../chat-config', () => ({
28
+ useChatConfigStore: (selector: (s: Record<string, unknown>) => unknown) => selector({ enableTTS: false }),
29
+ }));
30
+ vi.mock('@tbox.cn/app-agent-sdk-client', () => ({
31
+ createLogger: () => ({ warn: vi.fn() }),
32
+ useFeedbackAdapter: () => undefined,
33
+ useRefreshSession: () => undefined,
34
+ useTTSAdapter: () => undefined,
35
+ }));
36
+ vi.mock('../../utils/copyText', () => ({ copyText: vi.fn(async () => true) }));
37
+ vi.mock('../../utils/toast', () => ({ toast: vi.fn() }));
38
+
39
+ import { ActionBar } from './index';
40
+
41
+ const doneMessage = (over: Partial<ChatMessage> = {}): ChatMessage => ({
42
+ id: 'm1',
43
+ role: 'assistant',
44
+ content: '答案',
45
+ status: 'done',
46
+ createdAt: 1,
47
+ ...over,
48
+ });
49
+
50
+ describe('ActionBar → DebugButton 接线(病因学守卫)', () => {
51
+ let host: HTMLDivElement;
52
+ let root: ReturnType<typeof createRoot>;
53
+
54
+ beforeEach(() => {
55
+ host = document.createElement('div');
56
+ document.body.appendChild(host);
57
+ root = createRoot(host);
58
+ debugPropsRef.current = undefined;
59
+ });
60
+
61
+ afterEach(() => {
62
+ act(() => root.unmount());
63
+ host.remove();
64
+ });
65
+
66
+ it('A1 done 消息:requestId + conversationId 均透传(删除任一 prop 行 → 红)', () => {
67
+ act(() => {
68
+ root.render(<ActionBar message={doneMessage({ requestId: 'req_1', conversationId: 'conv_1' })} />);
69
+ });
70
+ expect(debugPropsRef.current).toMatchObject({
71
+ requestId: 'req_1',
72
+ conversationId: 'conv_1',
73
+ messageId: 'm1',
74
+ });
75
+ });
76
+
77
+ it('A2 字段缺席:prop 透传 undefined(不抛错、按钮层自守卫)', () => {
78
+ act(() => {
79
+ root.render(<ActionBar message={doneMessage({ requestId: 'req_1' })} />);
80
+ });
81
+ expect(debugPropsRef.current).toMatchObject({ requestId: 'req_1', conversationId: undefined });
82
+ });
83
+ });
@@ -150,6 +150,7 @@ export function ActionBar({ message }: { message: ChatMessage }) {
150
150
 
151
151
  <DebugButton
152
152
  requestId={message.requestId}
153
+ conversationId={message.conversationId}
153
154
  messageId={message.id}
154
155
  messageCreatedAt={new Date(message.createdAt).getTime()}
155
156
  />
@@ -7,8 +7,8 @@ import type { TboxCardPayload } from '@tbox.cn/app-contracts';
7
7
  const mocks = vi.hoisted(() => ({
8
8
  state: {
9
9
  cardsByMessageId: {} as Record<string, TboxCardPayload[]>,
10
- conversationId: null,
11
10
  },
11
+ debugProps: null as Record<string, unknown> | null,
12
12
  }));
13
13
 
14
14
  vi.mock('../../store-context', () => ({
@@ -29,7 +29,12 @@ vi.mock('../../components/ActionBar', () => ({
29
29
  CopyButton: () => null,
30
30
  getMessageCopyText: () => '',
31
31
  }));
32
- vi.mock('../../components/ActionBar/DebugButton', () => ({ DebugButton: () => null }));
32
+ vi.mock('../../components/ActionBar/DebugButton', () => ({
33
+ DebugButton: (props: Record<string, unknown>) => {
34
+ mocks.debugProps = props;
35
+ return null;
36
+ },
37
+ }));
33
38
 
34
39
  import { MessageBubble } from './index';
35
40
 
@@ -109,4 +114,21 @@ describe('MessageBubble member gate card partition', () => {
109
114
  // 纵向铺开:不再有轮播圆点指示器
110
115
  expect(host.querySelector('[aria-label^="第 "]')).toBeNull();
111
116
  });
117
+
118
+ it('error 消息接线:DebugButton 透传 requestId + conversationId(error 分支守卫——不经 ActionBar 的独立渲染路径)', () => {
119
+ mocks.state.cardsByMessageId = {}; // 用例间隔离:清除前序用例的卡片桶残留
120
+ mocks.debugProps = null;
121
+ act(() => {
122
+ root.render(
123
+ <MessageBubble
124
+ message={{ ...emptyAssistantMessage, status: 'error' as const, error: '失败', requestId: 'req_e', conversationId: 'conv_e' }}
125
+ />,
126
+ );
127
+ });
128
+ expect(mocks.debugProps).toMatchObject({
129
+ requestId: 'req_e',
130
+ conversationId: 'conv_e',
131
+ messageId: 'assistant-1',
132
+ });
133
+ });
112
134
  });
@@ -163,6 +163,7 @@ export function MessageBubble({ message }: { message: ChatMessage }) {
163
163
  {message.requestId && (
164
164
  <DebugButton
165
165
  requestId={message.requestId}
166
+ conversationId={message.conversationId}
166
167
  messageId={message.id}
167
168
  messageCreatedAt={new Date(message.createdAt).getTime()}
168
169
  />
@@ -16,11 +16,11 @@ 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.3
20
- version: 0.1.3
19
+ specifier: 0.1.4
20
+ version: 0.1.4
21
21
  '@tbox.cn/app-agent-sdk-server':
22
- specifier: 0.1.6
23
- version: 0.1.6
22
+ specifier: 0.2.1
23
+ version: 0.2.1
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.22.1
32
- version: 0.22.1
31
+ specifier: 0.24.0
32
+ version: 0.24.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.22.1
118
+ version: 0.24.0
119
119
  eslint:
120
120
  specifier: 'catalog:'
121
121
  version: 9.39.5
@@ -142,7 +142,7 @@ importers:
142
142
  version: link:../../packages/provider-custom
143
143
  '@tbox.cn/app-agent-sdk-client':
144
144
  specifier: 'catalog:'
145
- version: 0.1.3(@types/react@18.3.31)
145
+ version: 0.1.4(@types/react@18.3.31)
146
146
  '@tbox.cn/app-contracts':
147
147
  specifier: 'catalog:'
148
148
  version: 0.12.3
@@ -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.6(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
209
+ version: 0.2.1(@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
@@ -246,7 +246,7 @@ importers:
246
246
  version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
247
247
  '@tbox.cn/app-agent-sdk-client':
248
248
  specifier: 'catalog:'
249
- version: 0.1.3(@types/react@18.3.31)
249
+ version: 0.1.4(@types/react@18.3.31)
250
250
  '@tbox.cn/app-contracts':
251
251
  specifier: 'catalog:'
252
252
  version: 0.12.3
@@ -314,10 +314,10 @@ importers:
314
314
  dependencies:
315
315
  '@tbox.cn/app-agent-sdk-client':
316
316
  specifier: 'catalog:'
317
- version: 0.1.3(@types/react@18.3.31)
317
+ version: 0.1.4(@types/react@18.3.31)
318
318
  '@tbox.cn/app-agent-sdk-server':
319
319
  specifier: 'catalog:'
320
- version: 0.1.6(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
320
+ version: 0.2.1(@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
@@ -1335,12 +1335,12 @@ packages:
1335
1335
  '@tbox-dev-js/sdk': '>=0.1.18 <0.2.0'
1336
1336
  zod: '>=3.24.0 <4.0.0'
1337
1337
 
1338
- '@tbox.cn/app-agent-sdk-client@0.1.3':
1339
- resolution: {integrity: sha512-oyHvufpJ1bWfoEAm82Kkh07d0NbuK9NQkZGEvprB3UBKEQRgyydKps58K1IHHjVZ/eDMBeGA8DgAxqAbC8rQCw==}
1338
+ '@tbox.cn/app-agent-sdk-client@0.1.4':
1339
+ resolution: {integrity: sha512-5Mlqcsvj7q0/5DyTNbczCEttodfhJf5m2XBhgepF04pye3TlOuHJazR5mkInRyPjZAzbYiC0uN6AaK86Dmt1aQ==}
1340
1340
  engines: {node: '>=20.0.0'}
1341
1341
 
1342
- '@tbox.cn/app-agent-sdk-server@0.1.6':
1343
- resolution: {integrity: sha512-manek451WQdIWDS41Gd+HJDgELjZc5Kq7GMzSMRBg5IuWrxHTJUgbw+SGHPAPxd+bjn83ck9hKleXi4pwNpntg==}
1342
+ '@tbox.cn/app-agent-sdk-server@0.2.1':
1343
+ resolution: {integrity: sha512-LzyTVgVk6xYVJZ1ah5zJUjz8mV49w0z/cWAO098DVedUXRzYGI6w9sAK/XQRJVzs0ZVJGxVw8pqlGx2yvJD4ug==}
1344
1344
  engines: {node: '>=20.0.0'}
1345
1345
 
1346
1346
  '@tbox.cn/app-contracts-mall@0.12.4':
@@ -1367,8 +1367,8 @@ packages:
1367
1367
  resolution: {integrity: sha512-KDcFdIrIEOlwDvIqBu29CzR5vDjt0BCADMBrgrd5WlRqjrPM1/jM/RcaRO6gRuElmQCp5LfsoAkVeYTZE/6rpw==}
1368
1368
  engines: {node: '>=20.0.0'}
1369
1369
 
1370
- '@tbox.cn/app-sdk-server@0.22.1':
1371
- resolution: {integrity: sha512-IYeOOvUogleijkibS1glG/N7Myv2LlaSCbwxAf8FrLqgkgHpzzGK75xMGFCrak3FwzjWDfj3zMCM7ywbcpY+zQ==}
1370
+ '@tbox.cn/app-sdk-server@0.24.0':
1371
+ resolution: {integrity: sha512-BzE40pZokr5DyXc5YuzJ7+PM/fA3rN9814/xxyFA5fToIz+YFIpamE4s9VgsJODYsgvfY0NsZeQ3bisv3yh6fw==}
1372
1372
  engines: {node: '>=20.0.0'}
1373
1373
  hasBin: true
1374
1374
 
@@ -4077,7 +4077,7 @@ snapshots:
4077
4077
  '@tbox-dev-js/sdk': 0.1.18
4078
4078
  zod: 3.25.76
4079
4079
 
4080
- '@tbox.cn/app-agent-sdk-client@0.1.3(@types/react@18.3.31)':
4080
+ '@tbox.cn/app-agent-sdk-client@0.1.4(@types/react@18.3.31)':
4081
4081
  dependencies:
4082
4082
  '@tbox.cn/app-contracts': 0.12.3
4083
4083
  '@tbox.cn/app-sdk-client': 0.21.1
@@ -4089,7 +4089,7 @@ snapshots:
4089
4089
  - '@types/react'
4090
4090
  - immer
4091
4091
 
4092
- '@tbox.cn/app-agent-sdk-server@0.1.6(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4092
+ '@tbox.cn/app-agent-sdk-server@0.2.1(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
4093
4093
  dependencies:
4094
4094
  '@ag-ui/core': 0.0.47
4095
4095
  '@ai-sdk/openai-compatible': 2.0.68(zod@3.25.76)
@@ -4099,7 +4099,7 @@ snapshots:
4099
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)
4100
4100
  '@tbox.cn/app-contracts': 0.12.3
4101
4101
  '@tbox.cn/app-sdk-core': 0.20.2
4102
- '@tbox.cn/app-sdk-server': 0.22.1
4102
+ '@tbox.cn/app-sdk-server': 0.24.0
4103
4103
  ai: 6.0.246(zod@3.25.76)
4104
4104
  express: 4.22.2
4105
4105
  gray-matter: 4.0.3
@@ -4149,7 +4149,7 @@ snapshots:
4149
4149
  dependencies:
4150
4150
  '@tbox.cn/app-contracts': 0.12.3
4151
4151
 
4152
- '@tbox.cn/app-sdk-server@0.22.1':
4152
+ '@tbox.cn/app-sdk-server@0.24.0':
4153
4153
  dependencies:
4154
4154
  '@ag-ui/core': 0.0.47
4155
4155
  '@tbox.cn/app-contracts': 0.12.3
@@ -40,9 +40,9 @@ 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.22.1
44
- "@tbox.cn/app-agent-sdk-server": 0.1.6
45
- "@tbox.cn/app-agent-sdk-client": 0.1.3
43
+ "@tbox.cn/app-sdk-server": 0.24.0
44
+ "@tbox.cn/app-agent-sdk-server": 0.2.1
45
+ "@tbox.cn/app-agent-sdk-client": 0.1.4
46
46
  "@tbox.cn/app-contracts": 0.12.3
47
47
  "@tbox.cn/app-contracts-mall": 0.12.4
48
48
  "@tbox.cn/app-theme-tbox": 0.1.3