@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 CHANGED
@@ -18,7 +18,7 @@ dist-ssr
18
18
  .env.*
19
19
  !.env.example
20
20
 
21
- # 本地评测产物(tbox-app eval / start -d;报告与轨迹不进版本库)
21
+ # 本地评测产物(仓内 QA 经 tbox-app-dev eval / start -d 驱动;报告与轨迹不进版本库)
22
22
  .eval/
23
23
  .tbox-server.json
24
24
  .tbox-server.log
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`;仅字符串厂商——自定义 API 声明直接编辑该文件;bind/use 整槽覆盖既有 provider,含内联声明) |
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>` 单槽 | 槽/实例级 `config` |
72
- | 指定模块 | 模块 `declare.owns` 全部服务槽(snapshot 除外) | `modules[<install id>].config` |
73
- | 应用 | 已装业务模块 owns 并集(空装配不适用) | root `config` |
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
- - **内联 provider 声明(对象形态)恒槽级合法**——`modules[].provider` 与 root
78
- `provider` 只接受字符串厂商名(zod 直接拒,fail-visible)。模块/应用维度 = 逐槽落
79
- 对象声明,共享的是 `config` 层。
80
- - `implementation` 写 `<provider名>@1` 字面量(槽级兄弟键,不在 provider 对象内)。
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
- 缺省出厂 = 带 AI 支付体验的 chat 形态;**商圈形态经 `profiles/mall` 画像加装**(`tbox-app create --profile mall`:mall-core + 七业务模块 + 商圈配置叠加)。
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 # H5/server + 可选 minidev 小程序容器
11
+ pnpm dev # 单进程 http://localhost:8000(API + WS + 页面 + HMR)
18
12
  pnpm verify # typecheck + test + build
19
13
  ```
20
14
 
21
- **能力加装**(已有 AI 支付体验,能力即模块;mall 全套可改用 `create --profile mall` 一步到位):
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 发布态):模板通过 `@app/contracts-mall` shim 使用 `catalog:` 引用的发布包;创建时默认安装 AI 支付模块,CLI 按依赖将 shim 替换为本地源码包——
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({ loginPlatform, scopeKey })` | `@tbox.cn/app-sdk/client` | 客户端登录配置(`main.tsx`/`platform/agent-runtime.ts`);**应用级单例**——重复调用幂等返回首建实例,首建选项生效 |
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 / VITE_AUTH_PROVIDER)由 main.tsx 经 configureRuntime / 选项注入(H1)。
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 探针与 guard 两处)
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[] = [];
@@ -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.17",
4
- "description": "tbox AI Agent 全栈模板(多包 pnpm workspace):apps/client + apps/server。唯一模板(W4 单一模板统一化:缺省带 AI 支付体验的 chat 形态;mall 能力经 profiles/mall 加装),能力经 tbox-app module add 模块扩展(shopping-guide/member 等)。",
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.25.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": "node scripts/dev.mjs",
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
- **本包 adapter 禁止配字符串声明**:本包零贡献(manifest 无
39
- `declare.providers.slots`),永不进 provider catalog——字符串声明运行时按
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('my-api', 'inline', myApiFactory);
122
+ ctx.integrations?.registerAdapter('provider-custom', '<implementation>', myApiFactory);
121
123
  ```
122
124
 
123
125
  单 factory 多服务:按 `input.service` 分支返回不同 Port 实现(服务清单见
@@ -22,8 +22,10 @@
22
22
  "pages": [],
23
23
  "tabs": [],
24
24
  "providers": {
25
- "slots": []
25
+ "slots": [],
26
+ "id": "provider-custom"
26
27
  },
27
28
  "consumes": []
28
- }
29
+ },
30
+ "name": "自定义 API"
29
31
  }
@@ -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.1.6
20
- version: 0.1.6
19
+ specifier: 0.2.0
20
+ version: 0.2.0
21
21
  '@tbox.cn/app-agent-sdk-server':
22
- specifier: 0.2.3
23
- version: 0.2.3
22
+ specifier: 0.3.0
23
+ version: 0.3.0
24
24
  '@tbox.cn/app-contracts':
25
- specifier: 0.13.0
26
- version: 0.13.0
25
+ specifier: 0.13.1
26
+ version: 0.13.1
27
27
  '@tbox.cn/app-contracts-mall':
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
28
+ specifier: 0.13.1
29
+ version: 0.13.1
33
30
  '@tbox.cn/app-sdk-server':
34
- specifier: 0.25.0
35
- version: 0.25.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.25.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.1.6(@types/react@18.3.31)
145
+ version: 0.2.0(@types/react@18.3.31)
149
146
  '@tbox.cn/app-contracts':
150
147
  specifier: 'catalog:'
151
- version: 0.13.0
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.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
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.0
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.1.6(@types/react@18.3.31)
249
+ version: 0.2.0(@types/react@18.3.31)
271
250
  '@tbox.cn/app-contracts':
272
251
  specifier: 'catalog:'
273
- version: 0.13.0
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.0
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.1.6(@types/react@18.3.31)
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.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)
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.0
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.1.6':
1369
- resolution: {integrity: sha512-/dCthY+JEccMPGafALYkhPRDRBPHSzPklNfXw63XQqhU7yrvqgeyuOXFrhkSYU5ZFzupZErUndXpiZz/zzJVug==}
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.2.3':
1373
- resolution: {integrity: sha512-EeSXpW1Aoy85Z9ZXCKSlziGhxyBeQCWQDRuLdkg7ReVKthNXfFKcAiIiaZIQkSjoZB1OL3Qlg8xl2cLqiXZxHA==}
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.0':
1377
- resolution: {integrity: sha512-EzLRs93WoHbqYI9MZV555ru14jTYnUILhClFisJXd3vlXTpHw9T1annSaa4IpkHepsX6AmCT5FxwvRUZcZ6T3A==}
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.25.0':
1393
- resolution: {integrity: sha512-wKKbmFnY6YU+mQOoak4UADWe1nWZKKdZeGqzatWC9Ny0W05QtDGLG9ql9kP1IwN3a5S6lFf4A6OBdSwERTFqTw==}
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.7.5':
1401
- resolution: {integrity: sha512-ObVkHKElsDz/JazUHkBaIGYYDxZxvQEtjFAk77HXBc0+PSikSRmtb62F99PWGibTnOSLq6wlkGWhk/y+Iy1UOg==}
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.1.6(@types/react@18.3.31)':
4076
+ '@tbox.cn/app-agent-sdk-client@0.2.0(@types/react@18.3.31)':
4112
4077
  dependencies:
4113
- '@tbox.cn/app-contracts': 0.13.0
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.2.3(@tbox-dev-js/sdk@0.1.18)(rxjs@7.8.1)':
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.0
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.25.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.0':
4117
+ '@tbox.cn/app-contracts-mall@0.13.1':
4152
4118
  dependencies:
4153
- '@tbox.cn/app-contracts': 0.13.0
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.25.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.0
4148
+ '@tbox.cn/app-contracts': 0.13.1
4177
4149
  '@tbox.cn/app-sdk-core': 0.20.4
4178
- '@tbox.cn/app-toolkit': 0.7.5
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.7.5':
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.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
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
@@ -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 dev
15
+ pnpm --filter @app/server dev
@@ -1,3 +0,0 @@
1
- [
2
- "@tbox.cn/app-module-ai-payment"
3
- ]
@@ -1,6 +0,0 @@
1
- [
2
- {
3
- "platform": "alipay",
4
- "source": "@tbox.cn/app-miniapp-container-alipay@0.2.3"
5
- }
6
- ]
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
- }