@tbox.cn/app-template-agent 0.10.17 → 0.10.19
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/.gitignore +1 -1
- package/AGENTS.md +1 -1
- package/ENV.md +2 -10
- package/INTEGRATION.md +15 -11
- package/README.md +5 -11
- package/apps/client/src/platform/agent-runtime.ts +1 -5
- package/apps/client/vite.config.ts +2 -2
- package/apps/server/src/app.ts +1 -1
- package/package.json +4 -4
- package/packages/provider-custom/INTEGRATION.md +6 -4
- package/packages/provider-custom/tbox.module.json +4 -2
- package/pnpm-lock.template.yaml +53 -81
- package/pnpm-workspace.template.yaml +5 -5
- package/scripts/dev.sh +1 -1
- package/.tbox/default-modules.json +0 -3
- package/.tbox/miniapp-containers.json +0 -6
- package/scripts/dev.mjs +0 -91
package/.gitignore
CHANGED
package/AGENTS.md
CHANGED
|
@@ -84,7 +84,7 @@ CLI 免安装,命令均经 `npx --yes @tbox.cn/app-cli <cmd>` 运行(下表
|
|
|
84
84
|
| `module list` / `sync` / `diff` / `doctor` | 已装清单 / 增量装配 / 漂移对比 / 结构校验 |
|
|
85
85
|
| `module update <module>` | 升级模块(codegen → 3-way merge) |
|
|
86
86
|
| `new <module\|provider\|theme> <name>` | 应用内脚手架(生成 `packages/<id>` 并完成装配) |
|
|
87
|
-
| `provider use / bind / unbind / unuse` | 集成绑定(写 `config/integrations.json
|
|
87
|
+
| `provider use / bind / unbind / unuse` | 集成绑定(写 `config/integrations.json`;v8 起自定义 API 统一 `provider-custom` 字符串厂商——CLI 全覆盖三层,含 `--module` 模块级单点绑定;bind/use 整槽覆盖既有 provider) |
|
|
88
88
|
| `theme use <id>` / `theme list` | 主题接线 / 状态 |
|
|
89
89
|
| `starter --list` / `starter --type <type>` | starter 文档查询(商圈模块清单见 `--type agent-mall`) |
|
|
90
90
|
|
package/ENV.md
CHANGED
|
@@ -133,11 +133,6 @@ dev/src 与 prod/dist bundle 形态恒等):
|
|
|
133
133
|
| `AUTH_TOKEN_ISSUER` | token issuer(默认 `agent`;如需 mall 独立身份可显式设 `agent-mall`) |
|
|
134
134
|
| `AUTH_EMBED_EXTERNAL_TOKEN` | 是否把外部原始 token 内嵌进自有 JWT(external claim,默认 `true`;`false` 则上游调用需另取) |
|
|
135
135
|
| `AUTH_EXTERNAL_TOKEN_MAX_BYTES` | external 原始 token 上限(bytes,默认 16KB=Node http header 上限)。external claim 使自有 JWT 膨胀 ~1.4x,生产网关 header 上限需 ≥16KB |
|
|
136
|
-
| `AUTH_EXTERNAL_EXCHANGE_URL` | 外部 provider 换发地址;配置后 `/api/auth/login(platform=external)` 走 HMAC 转发换发 |
|
|
137
|
-
| `AUTH_EXTERNAL_SECRET` | 外部换发 HMAC 密钥 |
|
|
138
|
-
| `AUTH_EXTERNAL_PROVIDER` | 外部 provider 名(默认 `external`) |
|
|
139
|
-
| `AUTH_EXTERNAL_JWT_PUBLIC_KEY` | 外部已签 JWT 验签公钥(PEM,RS256):外部返回 `{ jwt }` 且无 identity 时解 `sub`;未配置则解码 `payload.sub` |
|
|
140
|
-
| `AUTH_EXTERNAL_TIMEOUT_MS` | 外部换发请求超时(毫秒,默认 3000) |
|
|
141
136
|
|
|
142
137
|
### 真实支付宝登录链路(provider 包换码器自注册)
|
|
143
138
|
|
|
@@ -150,8 +145,6 @@ dev/src 与 prod/dist bundle 形态恒等):
|
|
|
150
145
|
appId 字段已配(漏配 → 该 mall 503,字段名见各 provider 包)。
|
|
151
146
|
- 登录双形态与复合凭证语义由各 provider 包承载;`AUTH_TOKEN_TTL_MS` 保守建议 ≤2h
|
|
152
147
|
(上游 Token 寿命未知;自有 JWT 过期即重登换新)。
|
|
153
|
-
- ⚠️ 与 `VITE_AUTH_PROVIDER=external` **互斥**:设 external 走 `AUTH_EXTERNAL_*` HMAC 转发旁路,
|
|
154
|
-
换码器被 platform 路由绕过,两者勿同时启用。
|
|
155
148
|
- 裸跑(无登录槽配置):无换码器注册 → 内置 alipay/weapp;未配 env → **200 guest 降级**
|
|
156
149
|
(Fix D——内置换码器声明 allowsGuestLogin,`[AUTH] login failed (downgraded to guest)` warn
|
|
157
150
|
可观测;意图真实支付宝登录却恒 guest 时查该日志)或 browser 轴 guest,匿名降级属预期行为。
|
|
@@ -164,7 +157,6 @@ dev/src 与 prod/dist bundle 形态恒等):
|
|
|
164
157
|
|
|
165
158
|
| 变量 | 说明 |
|
|
166
159
|
|---|---|
|
|
167
|
-
| `VITE_AUTH_PROVIDER` | 登录平台:外部 provider 场景设 `external`(壳内 `getAuthCode` → `/api/auth/login(platform=external)` 转发外部);缺省 `alipay`(本地换码)。消费方:`platform/agent-runtime.ts` 的 `createAuthClient({ loginPlatform })` |
|
|
168
160
|
| `VITE_API_URL` | 前端 API 地址覆盖(默认同源相对路径,开发期可指向 server)。消费方:`main.tsx` 的 `configureRuntime({ apiBaseUrl })`(007:SDK 零 Vite 依赖,环境值由模板注入) |
|
|
169
161
|
|
|
170
162
|
## 可选
|
|
@@ -178,7 +170,7 @@ dev/src 与 prod/dist bundle 形态恒等):
|
|
|
178
170
|
| `TBOX_PRE_TOOL_TIMEOUT_MS` | 前置工具(010)单工具总预算 ms(decide+execute 共享):默认 `2000`;`0` = 整体禁用(预执行全关,行为与未启用逐字节一致)。非法值回退默认 |
|
|
179
171
|
| `TBOX_TOOL_DEBUG` | 工具调试视图(018):`1` 开 / `0` 关;缺省 = 非 `NODE_ENV=production` 开启。开启时 memory 召回/silent 前置工具以伪工具事件下发前端(不持久化)且 HELLO_ACK 携带旗标解锁客户端 dev 工具视图(出入参展开+技术名+紧凑格式)。**生产勿开**——测试环境开启会使 silent 检索 query 与用户记忆预览(截断 200 字符)对页面访问者可见。非法值回退缺省 |
|
|
180
172
|
| `TBOX_EARLY_TOOL_EXECUTION` | 尽早工具执行(缺省 `off`):`1`/`true` 开启。模型流中白名单工具(只读查询类,`withEarlyExecution` 标记)参数流完即预执行,多工具轮延迟优化;收益依赖 `parallelToolCalls` 开启;参数漂移自动作废重执行(正确性无损);单工具轮行为等价现状。仅显式 opt-in,观测 journal `tool_preexec` |
|
|
181
|
-
| `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 值 |
|
|
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 dev` 不注入 env 值 |
|
|
182
174
|
| `HOST` | 服务监听地址(默认 `0.0.0.0`) |
|
|
183
175
|
| `PORT` | 服务监听端口(默认 `8000`) |
|
|
184
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` 保留 |
|
|
@@ -199,7 +191,7 @@ export TTS_APPKEY=your-tts-appkey # 敏感值勿提交;本地 shell export 注
|
|
|
199
191
|
export MALL_HOME_DEV_SERVICES=true
|
|
200
192
|
```
|
|
201
193
|
|
|
202
|
-
# tbox-app dev 配置面
|
|
194
|
+
# tbox-app-dev dev 配置面
|
|
203
195
|
|
|
204
196
|
- `TBOX_CONFIG_DIR`:dev 命令注入的配置目录覆盖(preset `configDir` / `--config-dir` 旗标显式指定的目录绝对路径——config 恒显式);未设时使用默认 `config/`。
|
|
205
197
|
覆盖面含 `llm_provider.json`(`modelName`/`thinking`):注入时 LLM 装配读档位目录文件,
|
package/INTEGRATION.md
CHANGED
|
@@ -66,21 +66,25 @@
|
|
|
66
66
|
|
|
67
67
|
## 声明落点
|
|
68
68
|
|
|
69
|
-
| 维度 |
|
|
70
|
-
|
|
71
|
-
| 指定服务 | `services.<slot
|
|
72
|
-
| 指定模块 |
|
|
73
|
-
| 应用 |
|
|
69
|
+
| 维度 | 绑定(单点) | 激活 | 共享连接参数落点 |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| 指定服务 | `services.<slot>.provider = "provider-custom"` | 节点本身 | 槽/实例级 `config` |
|
|
72
|
+
| 指定模块 | `modules[<install id>].provider = "provider-custom"`(**单点作用于全部 ownedServices**) | owned 槽补 `{}` 通配节点 | `modules[<install id>].config` |
|
|
73
|
+
| 应用 | root `provider = "provider-custom"` | 同左逐槽 | root `config` |
|
|
74
|
+
|
|
75
|
+
推荐 CLI(等价路径):`tbox-app provider use provider-custom --module <install id>`(模块)/
|
|
76
|
+
`provider use provider-custom`(应用)/ `provider bind <slot> provider-custom`(服务)。
|
|
74
77
|
|
|
75
78
|
关键形态约束:
|
|
76
79
|
|
|
77
|
-
-
|
|
78
|
-
`
|
|
79
|
-
|
|
80
|
-
-
|
|
80
|
+
- **绑定与激活正交**:provider 选择单点落绑定层;激活 = `services[<slot>]` 节点在场
|
|
81
|
+
(`{}` 空槽 = 通配激活,实例差异化再补 instances 键)。只写绑定不写激活 → 服务保持
|
|
82
|
+
`service-not-configured`(诚实暴露,非错误)。
|
|
83
|
+
- **内联 provider 声明(对象形态)已弃用(v8)**:存量兼容读;迁移 =
|
|
84
|
+
`tbox-app provider migrate --write`(内联 → provider-custom 统一落点,迁移后 ⚠ 待接入,
|
|
85
|
+
按 provider-custom/INTEGRATION.md 实施转 ok)。
|
|
81
86
|
- 完整字段语义(各层级联、instances 激活等)单源 = `@tbox.cn/app-contracts` 的
|
|
82
|
-
integrations-config(zod
|
|
83
|
-
`packages/provider-custom/INTEGRATION.md`「内联声明 JSON 片段」。
|
|
87
|
+
integrations-config(zod 校验,与运行时同一解析面)。
|
|
84
88
|
- **provider 名三处一致**(声明/注册/凭据)规则与失败信号见
|
|
85
89
|
`packages/provider-custom/INTEGRATION.md`「provider 名三处一致」。
|
|
86
90
|
|
package/README.md
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
# template-agent
|
|
2
2
|
|
|
3
3
|
tbox AI Agent 全栈模板(npm 包名 `@tbox.cn/app-template-agent`,唯一模板——W4 单一模板统一化),多包 pnpm workspace:`apps/` 薄组装端 + `packages/` 模块。
|
|
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
|
-
创建应用时按 `.tbox/default-modules.json` 加装 AI 支付模块,源码落在 `packages/module-ai-payment`。
|
|
8
|
-
|
|
9
|
-
创建应用时默认生成 `apps/miniapp-container-alipay`,容器计划见 `.tbox/miniapp-containers.json`。使用前配置小程序 AppId 和 H5 地址;重复创建保留已登记的容器。
|
|
10
|
-
|
|
11
|
-
`pnpm dev` 始终启动原有 H5/server;容器已安装且 PATH 中有 `minidev` 时同时启动容器,否则跳过。容器异常退出不影响 H5/server,Ctrl+C 统一停止本次启动的进程。
|
|
12
|
-
|
|
13
7
|
## 快速开始
|
|
14
8
|
|
|
15
9
|
```sh
|
|
16
10
|
pnpm install
|
|
17
|
-
pnpm dev #
|
|
11
|
+
pnpm dev # 单进程 http://localhost:8000(API + WS + 页面 + HMR)
|
|
18
12
|
pnpm verify # typecheck + test + build
|
|
19
13
|
```
|
|
20
14
|
|
|
21
|
-
|
|
15
|
+
**能力加装**(空装配起点,能力即模块;mall 全套可改用 `create --profile mall` 一步到位):
|
|
22
16
|
|
|
23
17
|
```sh
|
|
24
18
|
tbox-app module add shopping-guide # 导购/找店/业态/客服(模块级 intents + LLM 工具 + 卡片)
|
|
@@ -34,7 +28,7 @@ tbox-app module doctor # 26 条结构校验
|
|
|
34
28
|
> 环境变量:本地开发用 shell export 注入(见 `ENV.md`,含必需变量命令块;每次新终端需重新执行),
|
|
35
29
|
> 生产建议在 tbox 平台页面上配置(平台托管 env,密钥不进代码仓库)。
|
|
36
30
|
|
|
37
|
-
> 平台包消费(005 v0.4.0
|
|
31
|
+
> 平台包消费(005 v0.4.0 发布态):生成应用初始通过 `@app/contracts-mall` shim 使用 `catalog:` 引用的发布包;添加依赖 contracts-mall 的 codegen 模块后,CLI 将 shim 替换为本地源码包——
|
|
38
32
|
> 生产(registry 已发布)直接 `pnpm install`;平台包未发布 npm 时,由 `tbox-app create --local-deps <平台 tgz 目录>`
|
|
39
33
|
> 注入 overrides(`file:` 本地发布态产物)后 install 离线可用。
|
|
40
34
|
>
|
|
@@ -182,7 +176,7 @@ definePreTool(findStoreTool, {
|
|
|
182
176
|
| `getToolRequestContext` / `requireToolRequestContext` | `@tbox.cn/app-sdk/server` | 工具 execute 第二参读取运行上下文(fail-soft / 缺失抛 AUTH_FORBIDDEN;上下文统一化) |
|
|
183
177
|
| `createToolExecContext(reqCtx)` | `@tbox.cn/app-sdk/server` | 测试/直调助手:构造工具 execute 第二参(散键与引擎同构) |
|
|
184
178
|
| `createPlatformAdapters(session, overrides)` | `@tbox.cn/app-sdk/client` | 自定义 ASR/TTS/upload/feedback 实现(contracts 接口,UI 零改动) |
|
|
185
|
-
| `createAuthClient({
|
|
179
|
+
| `createAuthClient({ scopeKey })` | `@tbox.cn/app-sdk/client` | 客户端登录配置(`platform/agent-runtime.ts`);**应用级单例**——重复调用幂等返回首建实例,首建选项生效 |
|
|
186
180
|
| `configureRuntime({ apiBaseUrl })` | `@tbox.cn/app-sdk/client` | API/WS 地址注入(`main.tsx`;对应 `VITE_API_URL`) |
|
|
187
181
|
| bridge 透传 | `@tbox.cn/app-sdk/client` 的 `callJsapi` | 业务新能力(扫码/导航/分享等,壳子补 JSAPI 白名单) |
|
|
188
182
|
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 平台运行时装配(client 平台轴,已下沉 @tbox.cn/app-agent-sdk-client)。
|
|
3
3
|
* 模板唯一的 SDK 单例持有点:authClient(鉴权)+ platformApi(能力凭证/会话/历史)。
|
|
4
|
-
* 环境值(VITE_API_URL
|
|
4
|
+
* 环境值(VITE_API_URL)由 main.tsx 经 configureRuntime 注入(H1)。
|
|
5
5
|
*/
|
|
6
6
|
import { createAuthClient, createPlatformApi } from '@tbox.cn/app-agent-sdk-client';
|
|
7
7
|
// 读源归位 TIER1():mall-scope-url 契约助手(search-only 语义;壳 URL 改写层契约见包注释)
|
|
8
8
|
import { readMallIdFromUrl } from '@app/contracts-mall';
|
|
9
9
|
|
|
10
|
-
/** VITE_AUTH_PROVIDER=external 时壳内换码登录转发外部(服务端需同步配置 AUTH_EXTERNAL_*) */
|
|
11
|
-
const AUTH_PROVIDER = import.meta.env.VITE_AUTH_PROVIDER as string | undefined;
|
|
12
|
-
|
|
13
10
|
export const authClient = createAuthClient({
|
|
14
|
-
...(AUTH_PROVIDER === 'external' ? { loginPlatform: 'external' } : {}),
|
|
15
11
|
// SPEZ-017:token 缓存域键——URL mallId 变更即失效旧 token 重登(跨 mall 防串域)。
|
|
16
12
|
// 读源与 chat.ts configureHelloContext 逐字符同源(mall-scope-url.ts 唯一真源,search-only)
|
|
17
13
|
scopeKey: () => readMallIdFromUrl() ?? '',
|
|
@@ -27,8 +27,8 @@ const pxToRemPlugin = pxToRem({
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
export default defineConfig(async ({ command }) => {
|
|
30
|
-
// tbox-app dev 探测行(dev 探针常量;构件区在位时启用原地装配改指,缺席零行为变化。
|
|
31
|
-
// guard 断言本标记在场——重定位需同步 cli
|
|
30
|
+
// tbox-app-dev dev 探测行(dev 探针常量;构件区在位时启用原地装配改指,缺席零行为变化。
|
|
31
|
+
// guard 断言本标记在场——重定位需同步 dev 探针(cli-dev)与 guard 两处)
|
|
32
32
|
// __dirname 基准 = apps/client:构件区在模板根(上一级×2)
|
|
33
33
|
const devOverridePath = resolve(__dirname, '../../.tbox-dev.local/vite-override.mjs');
|
|
34
34
|
const devPlugins: Plugin[] = [];
|
package/apps/server/src/app.ts
CHANGED
|
@@ -74,7 +74,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
74
74
|
// entry 即 bundle 实文件:src/dist 平级,dev/prod 恒等。被 tsup 内联的模块禁止
|
|
75
75
|
// 基于自身 import.meta.url 做层级解析(bundle 后层级漂移——config 曾因此解析到
|
|
76
76
|
// 应用根上一级)。同族锚点:../skills、../../client/dist。
|
|
77
|
-
// TBOX_CONFIG_DIR 为 tbox-app dev 的配置面注入锚点(dev 探针常量,guard 守护):
|
|
77
|
+
// TBOX_CONFIG_DIR 为 tbox-app-dev dev 的配置面注入锚点(dev 探针常量,guard 守护):
|
|
78
78
|
// 注入时为 real-env 档位目录绝对路径;未注入维持默认相对解析。
|
|
79
79
|
const CONFIG_DIR = process.env.TBOX_CONFIG_DIR
|
|
80
80
|
? path.resolve(process.env.TBOX_CONFIG_DIR)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tbox.cn/app-template-agent",
|
|
3
|
-
"version": "0.10.
|
|
4
|
-
"description": "tbox AI Agent 全栈模板(多包 pnpm workspace):apps/client + apps/server。唯一模板(W4
|
|
3
|
+
"version": "0.10.19",
|
|
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"
|
|
7
7
|
},
|
|
@@ -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.
|
|
40
|
+
"@tbox.cn/app-sdk-server": "0.26.0"
|
|
41
41
|
},
|
|
42
42
|
"license": "MIT",
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
|
-
"dev": "
|
|
47
|
+
"dev": "pnpm --filter ./apps/server dev",
|
|
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",
|
|
@@ -35,8 +35,10 @@
|
|
|
35
35
|
| 内联对象 `{ provider, credentialType }` | **本包**(provider-custom) | 未注册 → `PROVIDER_NOT_IMPLEMENTED` |
|
|
36
36
|
| 字符串厂商名(如 `"mall-demo"`) | 对应正式 provider 包(catalog 来源;`packages/provider-mock` 为样例) | catalog 无此厂商 → **`PROVIDER_NOT_FOUND`** |
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
`declare.providers.
|
|
38
|
+
**v8 起:字符串声明 `"provider-custom"` = 唯一推荐声明形态**——本包经
|
|
39
|
+
`declare.providers.id` 自声明入 provider catalog(零槽起步,AI 实施即补槽声明:
|
|
40
|
+
`{ service, provider: 'provider-custom', implementation, credentialType, configSchema? }`)。
|
|
41
|
+
历史条款「禁止配字符串声明」随零槽形态退役。存量内联对象声明运行时按
|
|
40
42
|
catalog 查表,必报 `PROVIDER_NOT_FOUND`(错误文案「provider 未命中
|
|
41
43
|
catalog」≠ 名字拼错,是**形态落错**)。
|
|
42
44
|
|
|
@@ -62,7 +64,7 @@ catalog」≠ 名字拼错,是**形态落错**)。
|
|
|
62
64
|
|
|
63
65
|
| ❌ 错误 | 原因 |
|
|
64
66
|
|---|---|
|
|
65
|
-
| `"provider": { "provider": "my-api", "implementation": "my-api@1" }` | `implementation` 不是内联对象字段(zod
|
|
67
|
+
| `"provider": { "provider": "my-api", "implementation": "my-api@1" }` | `implementation` 不是内联对象字段(zod 拒)——v8 弃用形态,存量迁移 `tbox-app provider migrate --write` |
|
|
66
68
|
| `"provider": "my-api"` 而 adapter 在本包 | catalog 查表失配 → `PROVIDER_NOT_FOUND`(见上节) |
|
|
67
69
|
| `"instances": {}` | 零激活(省略 = 通配激活) |
|
|
68
70
|
|
|
@@ -117,7 +119,7 @@ import type { ServerContext } from '@tbox.cn/app-agent-sdk-server';
|
|
|
117
119
|
import { myApiFactory } from './my-api';
|
|
118
120
|
|
|
119
121
|
// register(ctx) 内:
|
|
120
|
-
ctx.integrations?.registerAdapter('
|
|
122
|
+
ctx.integrations?.registerAdapter('provider-custom', '<implementation>', myApiFactory);
|
|
121
123
|
```
|
|
122
124
|
|
|
123
125
|
单 factory 多服务:按 `input.service` 分支返回不同 Port 实现(服务清单见
|
package/pnpm-lock.template.yaml
CHANGED
|
@@ -16,23 +16,20 @@ catalogs:
|
|
|
16
16
|
specifier: 0.1.0
|
|
17
17
|
version: 0.1.0
|
|
18
18
|
'@tbox.cn/app-agent-sdk-client':
|
|
19
|
-
specifier: 0.
|
|
20
|
-
version: 0.
|
|
19
|
+
specifier: 0.2.0
|
|
20
|
+
version: 0.2.0
|
|
21
21
|
'@tbox.cn/app-agent-sdk-server':
|
|
22
|
-
specifier: 0.
|
|
23
|
-
version: 0.
|
|
22
|
+
specifier: 0.3.0
|
|
23
|
+
version: 0.3.0
|
|
24
24
|
'@tbox.cn/app-contracts':
|
|
25
|
-
specifier: 0.13.
|
|
26
|
-
version: 0.13.
|
|
25
|
+
specifier: 0.13.1
|
|
26
|
+
version: 0.13.1
|
|
27
27
|
'@tbox.cn/app-contracts-mall':
|
|
28
|
-
specifier: 0.13.
|
|
29
|
-
version: 0.13.
|
|
30
|
-
'@tbox.cn/app-sdk-client':
|
|
31
|
-
specifier: 0.21.3
|
|
32
|
-
version: 0.21.3
|
|
28
|
+
specifier: 0.13.1
|
|
29
|
+
version: 0.13.1
|
|
33
30
|
'@tbox.cn/app-sdk-server':
|
|
34
|
-
specifier: 0.
|
|
35
|
-
version: 0.
|
|
31
|
+
specifier: 0.26.0
|
|
32
|
+
version: 0.26.0
|
|
36
33
|
'@tbox.cn/app-theme-tbox':
|
|
37
34
|
specifier: 0.1.4
|
|
38
35
|
version: 0.1.4
|
|
@@ -118,7 +115,7 @@ importers:
|
|
|
118
115
|
devDependencies:
|
|
119
116
|
'@tbox.cn/app-sdk-server':
|
|
120
117
|
specifier: 'catalog:'
|
|
121
|
-
version: 0.
|
|
118
|
+
version: 0.26.0
|
|
122
119
|
eslint:
|
|
123
120
|
specifier: 'catalog:'
|
|
124
121
|
version: 9.39.5
|
|
@@ -145,10 +142,10 @@ importers:
|
|
|
145
142
|
version: link:../../packages/provider-custom
|
|
146
143
|
'@tbox.cn/app-agent-sdk-client':
|
|
147
144
|
specifier: 'catalog:'
|
|
148
|
-
version: 0.
|
|
145
|
+
version: 0.2.0(@types/react@18.3.31)
|
|
149
146
|
'@tbox.cn/app-contracts':
|
|
150
147
|
specifier: 'catalog:'
|
|
151
|
-
version: 0.13.
|
|
148
|
+
version: 0.13.1
|
|
152
149
|
'@tbox.cn/app-theme-tbox':
|
|
153
150
|
specifier: 'catalog:'
|
|
154
151
|
version: 0.1.4
|
|
@@ -193,24 +190,6 @@ importers:
|
|
|
193
190
|
specifier: 'catalog:'
|
|
194
191
|
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))
|
|
195
192
|
|
|
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
|
-
|
|
214
193
|
apps/server:
|
|
215
194
|
dependencies:
|
|
216
195
|
'@app/contracts-mall':
|
|
@@ -227,10 +206,10 @@ importers:
|
|
|
227
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)
|
|
228
207
|
'@tbox.cn/app-agent-sdk-server':
|
|
229
208
|
specifier: 'catalog:'
|
|
230
|
-
version: 0.
|
|
209
|
+
version: 0.3.0(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
|
|
231
210
|
'@tbox.cn/app-contracts':
|
|
232
211
|
specifier: 'catalog:'
|
|
233
|
-
version: 0.13.
|
|
212
|
+
version: 0.13.1
|
|
234
213
|
express:
|
|
235
214
|
specifier: 'catalog:'
|
|
236
215
|
version: 4.22.2
|
|
@@ -267,10 +246,10 @@ importers:
|
|
|
267
246
|
version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
268
247
|
'@tbox.cn/app-agent-sdk-client':
|
|
269
248
|
specifier: 'catalog:'
|
|
270
|
-
version: 0.
|
|
249
|
+
version: 0.2.0(@types/react@18.3.31)
|
|
271
250
|
'@tbox.cn/app-contracts':
|
|
272
251
|
specifier: 'catalog:'
|
|
273
|
-
version: 0.13.
|
|
252
|
+
version: 0.13.1
|
|
274
253
|
antd-mobile:
|
|
275
254
|
specifier: 'catalog:'
|
|
276
255
|
version: 5.42.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
@@ -319,7 +298,7 @@ importers:
|
|
|
319
298
|
dependencies:
|
|
320
299
|
'@tbox.cn/app-contracts-mall':
|
|
321
300
|
specifier: 'catalog:'
|
|
322
|
-
version: 0.13.
|
|
301
|
+
version: 0.13.1
|
|
323
302
|
devDependencies:
|
|
324
303
|
'@types/node':
|
|
325
304
|
specifier: 24.13.3
|
|
@@ -335,13 +314,13 @@ importers:
|
|
|
335
314
|
dependencies:
|
|
336
315
|
'@tbox.cn/app-agent-sdk-client':
|
|
337
316
|
specifier: 'catalog:'
|
|
338
|
-
version: 0.
|
|
317
|
+
version: 0.2.0(@types/react@18.3.31)
|
|
339
318
|
'@tbox.cn/app-agent-sdk-server':
|
|
340
319
|
specifier: 'catalog:'
|
|
341
|
-
version: 0.
|
|
320
|
+
version: 0.3.0(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
|
|
342
321
|
'@tbox.cn/app-contracts':
|
|
343
322
|
specifier: 'catalog:'
|
|
344
|
-
version: 0.13.
|
|
323
|
+
version: 0.13.1
|
|
345
324
|
devDependencies:
|
|
346
325
|
'@types/node':
|
|
347
326
|
specifier: 24.13.3
|
|
@@ -1122,15 +1101,6 @@ packages:
|
|
|
1122
1101
|
peerDependencies:
|
|
1123
1102
|
zod: ^3.25.0 || ^4.0.0
|
|
1124
1103
|
|
|
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
|
-
|
|
1134
1104
|
'@modelcontextprotocol/core@2.0.0':
|
|
1135
1105
|
resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==}
|
|
1136
1106
|
engines: {node: '>=20'}
|
|
@@ -1365,22 +1335,26 @@ packages:
|
|
|
1365
1335
|
'@tbox-dev-js/sdk': '>=0.1.18 <0.2.0'
|
|
1366
1336
|
zod: '>=3.24.0 <4.0.0'
|
|
1367
1337
|
|
|
1368
|
-
'@tbox.cn/app-agent-sdk-client@0.
|
|
1369
|
-
resolution: {integrity: sha512
|
|
1338
|
+
'@tbox.cn/app-agent-sdk-client@0.2.0':
|
|
1339
|
+
resolution: {integrity: sha512-yxK5vLuERzlebTwiw8WxU6e9rm7F1L9tVW4aSUGsIxeU0y8VtRcrh7y8xKbrlXR4WL4XrmYZ6ZoDyOuro9sn5A==}
|
|
1370
1340
|
engines: {node: '>=20.0.0'}
|
|
1371
1341
|
|
|
1372
|
-
'@tbox.cn/app-agent-sdk-server@0.
|
|
1373
|
-
resolution: {integrity: sha512-
|
|
1342
|
+
'@tbox.cn/app-agent-sdk-server@0.3.0':
|
|
1343
|
+
resolution: {integrity: sha512-thnnPwA0Tkb3yf+HxmeIEDyji6myIJVKvyhzn0WWuVJN7mg9I6+juTimxwRNhqnpZBjue3kExMw75+MvTineYA==}
|
|
1374
1344
|
engines: {node: '>=20.0.0'}
|
|
1375
1345
|
|
|
1376
|
-
'@tbox.cn/app-contracts-mall@0.13.
|
|
1377
|
-
resolution: {integrity: sha512-
|
|
1346
|
+
'@tbox.cn/app-contracts-mall@0.13.1':
|
|
1347
|
+
resolution: {integrity: sha512-xylb7J5KxH3rmK8bA1AAJ/Qinn0zGsqO3HjXY8R4CrazHV+F0R2YJvD4J2vd/tazOm9rKRqDxfhdW208QQioFg==}
|
|
1378
1348
|
engines: {node: '>=20.0.0'}
|
|
1379
1349
|
|
|
1380
1350
|
'@tbox.cn/app-contracts@0.13.0':
|
|
1381
1351
|
resolution: {integrity: sha512-8sqP/23MoUlbTX9enFNotP5bu7XKFfigDUJ6sEn1Ff2a0rRlSTWzLWmDv9lP70cfZMPjh4MHoLKFoukr8QPvMA==}
|
|
1382
1352
|
engines: {node: '>=20.0.0'}
|
|
1383
1353
|
|
|
1354
|
+
'@tbox.cn/app-contracts@0.13.1':
|
|
1355
|
+
resolution: {integrity: sha512-Cty4qoknyihli6ZMlxOqqTgRqwg0NOh0WOMfIWdB4rHua0QzZkP1jUoeffq5imnpIh7vXdfLhDpv/JwTrHd1XQ==}
|
|
1356
|
+
engines: {node: '>=20.0.0'}
|
|
1357
|
+
|
|
1384
1358
|
'@tbox.cn/app-sdk-client@0.21.3':
|
|
1385
1359
|
resolution: {integrity: sha512-64y22k5gzCc9eEQ0IJA1izxPaosNEmoCJ4YrsfHOoHYq2UPJCCmP7RIu3Rn4stPZ4tcmRdMdAi2y5499KObYHw==}
|
|
1386
1360
|
engines: {node: '>=20.0.0'}
|
|
@@ -1389,16 +1363,16 @@ packages:
|
|
|
1389
1363
|
resolution: {integrity: sha512-4kcoxnZnPgsO0RwAsjsodOXRhZNQcr9r3INN3Z03/JR2e3E+izkW2YHsgGcdbVSVX81s8gZrkaBbE+xco3wSqg==}
|
|
1390
1364
|
engines: {node: '>=20.0.0'}
|
|
1391
1365
|
|
|
1392
|
-
'@tbox.cn/app-sdk-server@0.
|
|
1393
|
-
resolution: {integrity: sha512-
|
|
1366
|
+
'@tbox.cn/app-sdk-server@0.26.0':
|
|
1367
|
+
resolution: {integrity: sha512-VpV3sf4K/2MEsnkuK5EqZUyf9KoSVHeJUm4Al0M6R4Wumg6183apnxB2f38S5wuP30JSJShN/ww63EzRniTrjw==}
|
|
1394
1368
|
engines: {node: '>=20.0.0'}
|
|
1395
1369
|
hasBin: true
|
|
1396
1370
|
|
|
1397
1371
|
'@tbox.cn/app-theme-tbox@0.1.4':
|
|
1398
1372
|
resolution: {integrity: sha512-VF2fjTBFKJ6x/wvM6/T0qi7dmoiN1stNIT2xDerYbBBLCggr7f+H0v6VtuFMSed6tirlcpAlqtBDOctxudHJlQ==}
|
|
1399
1373
|
|
|
1400
|
-
'@tbox.cn/app-toolkit@0.
|
|
1401
|
-
resolution: {integrity: sha512-
|
|
1374
|
+
'@tbox.cn/app-toolkit@0.8.0':
|
|
1375
|
+
resolution: {integrity: sha512-urefCf5DCWbH9wM8dSGavA9MNdY4gx7LY16+s9jIlwhahq83mfrCP2h9ombn44ljMrv04G7mnb3vMtNeWs5/Ug==}
|
|
1402
1376
|
engines: {node: '>=20.0.0'}
|
|
1403
1377
|
|
|
1404
1378
|
'@types/babel__core@7.20.5':
|
|
@@ -3937,15 +3911,6 @@ snapshots:
|
|
|
3937
3911
|
zod: 3.25.76
|
|
3938
3912
|
zod-from-json-schema: 0.5.6
|
|
3939
3913
|
|
|
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
|
-
|
|
3949
3914
|
'@modelcontextprotocol/core@2.0.0':
|
|
3950
3915
|
dependencies:
|
|
3951
3916
|
zod: 4.4.3
|
|
@@ -4108,9 +4073,10 @@ snapshots:
|
|
|
4108
4073
|
'@tbox-dev-js/sdk': 0.1.18
|
|
4109
4074
|
zod: 3.25.76
|
|
4110
4075
|
|
|
4111
|
-
'@tbox.cn/app-agent-sdk-client@0.
|
|
4076
|
+
'@tbox.cn/app-agent-sdk-client@0.2.0(@types/react@18.3.31)':
|
|
4112
4077
|
dependencies:
|
|
4113
|
-
'@
|
|
4078
|
+
'@phosphor-icons/react': 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
4079
|
+
'@tbox.cn/app-contracts': 0.13.1
|
|
4114
4080
|
'@tbox.cn/app-sdk-client': 0.21.3
|
|
4115
4081
|
'@tbox.cn/app-sdk-core': 0.20.4
|
|
4116
4082
|
react: 18.3.1
|
|
@@ -4120,7 +4086,7 @@ snapshots:
|
|
|
4120
4086
|
- '@types/react'
|
|
4121
4087
|
- immer
|
|
4122
4088
|
|
|
4123
|
-
'@tbox.cn/app-agent-sdk-server@0.
|
|
4089
|
+
'@tbox.cn/app-agent-sdk-server@0.3.0(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
|
|
4124
4090
|
dependencies:
|
|
4125
4091
|
'@ag-ui/core': 0.0.47
|
|
4126
4092
|
'@ai-sdk/openai-compatible': 2.0.68(zod@3.25.76)
|
|
@@ -4128,9 +4094,9 @@ snapshots:
|
|
|
4128
4094
|
'@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)
|
|
4129
4095
|
'@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)
|
|
4130
4096
|
'@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)
|
|
4131
|
-
'@tbox.cn/app-contracts': 0.13.
|
|
4097
|
+
'@tbox.cn/app-contracts': 0.13.1
|
|
4132
4098
|
'@tbox.cn/app-sdk-core': 0.20.4
|
|
4133
|
-
'@tbox.cn/app-sdk-server': 0.
|
|
4099
|
+
'@tbox.cn/app-sdk-server': 0.26.0
|
|
4134
4100
|
ai: 6.0.246(zod@3.25.76)
|
|
4135
4101
|
express: 4.22.2
|
|
4136
4102
|
gray-matter: 4.0.3
|
|
@@ -4148,9 +4114,9 @@ snapshots:
|
|
|
4148
4114
|
- utf-8-validate
|
|
4149
4115
|
- workflow
|
|
4150
4116
|
|
|
4151
|
-
'@tbox.cn/app-contracts-mall@0.13.
|
|
4117
|
+
'@tbox.cn/app-contracts-mall@0.13.1':
|
|
4152
4118
|
dependencies:
|
|
4153
|
-
'@tbox.cn/app-contracts': 0.13.
|
|
4119
|
+
'@tbox.cn/app-contracts': 0.13.1
|
|
4154
4120
|
zod: 3.25.76
|
|
4155
4121
|
|
|
4156
4122
|
'@tbox.cn/app-contracts@0.13.0':
|
|
@@ -4159,6 +4125,12 @@ snapshots:
|
|
|
4159
4125
|
react: 18.3.1
|
|
4160
4126
|
zod: 3.25.76
|
|
4161
4127
|
|
|
4128
|
+
'@tbox.cn/app-contracts@0.13.1':
|
|
4129
|
+
dependencies:
|
|
4130
|
+
'@ag-ui/core': 0.0.47
|
|
4131
|
+
react: 18.3.1
|
|
4132
|
+
zod: 3.25.76
|
|
4133
|
+
|
|
4162
4134
|
'@tbox.cn/app-sdk-client@0.21.3':
|
|
4163
4135
|
dependencies:
|
|
4164
4136
|
'@tbox.cn/app-contracts': 0.13.0
|
|
@@ -4170,12 +4142,12 @@ snapshots:
|
|
|
4170
4142
|
dependencies:
|
|
4171
4143
|
'@tbox.cn/app-contracts': 0.13.0
|
|
4172
4144
|
|
|
4173
|
-
'@tbox.cn/app-sdk-server@0.
|
|
4145
|
+
'@tbox.cn/app-sdk-server@0.26.0':
|
|
4174
4146
|
dependencies:
|
|
4175
4147
|
'@ag-ui/core': 0.0.47
|
|
4176
|
-
'@tbox.cn/app-contracts': 0.13.
|
|
4148
|
+
'@tbox.cn/app-contracts': 0.13.1
|
|
4177
4149
|
'@tbox.cn/app-sdk-core': 0.20.4
|
|
4178
|
-
'@tbox.cn/app-toolkit': 0.
|
|
4150
|
+
'@tbox.cn/app-toolkit': 0.8.0
|
|
4179
4151
|
express: 4.22.2
|
|
4180
4152
|
jose: 6.2.8
|
|
4181
4153
|
zod: 3.25.76
|
|
@@ -4184,7 +4156,7 @@ snapshots:
|
|
|
4184
4156
|
|
|
4185
4157
|
'@tbox.cn/app-theme-tbox@0.1.4': {}
|
|
4186
4158
|
|
|
4187
|
-
'@tbox.cn/app-toolkit@0.
|
|
4159
|
+
'@tbox.cn/app-toolkit@0.8.0':
|
|
4188
4160
|
dependencies:
|
|
4189
4161
|
ajv: 8.20.0
|
|
4190
4162
|
zod: 3.25.76
|
|
@@ -40,11 +40,11 @@ catalog:
|
|
|
40
40
|
"@tbox.cn/agent-plugin": 0.1.0
|
|
41
41
|
"@tbox.cn/app-sdk-core": 0.20.4
|
|
42
42
|
"@tbox.cn/app-sdk-client": 0.21.3
|
|
43
|
-
"@tbox.cn/app-sdk-server": 0.
|
|
44
|
-
"@tbox.cn/app-agent-sdk-server": 0.
|
|
45
|
-
"@tbox.cn/app-agent-sdk-client": 0.
|
|
46
|
-
"@tbox.cn/app-contracts": 0.13.
|
|
47
|
-
"@tbox.cn/app-contracts-mall": 0.13.
|
|
43
|
+
"@tbox.cn/app-sdk-server": 0.26.0
|
|
44
|
+
"@tbox.cn/app-agent-sdk-server": 0.3.0
|
|
45
|
+
"@tbox.cn/app-agent-sdk-client": 0.2.0
|
|
46
|
+
"@tbox.cn/app-contracts": 0.13.1
|
|
47
|
+
"@tbox.cn/app-contracts-mall": 0.13.1
|
|
48
48
|
"@tbox.cn/app-theme-tbox": 0.1.4
|
|
49
49
|
zustand: 4.5.7
|
|
50
50
|
eslint: 9.39.5
|
package/scripts/dev.sh
CHANGED
package/scripts/dev.mjs
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
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
|
-
}
|