@zhushanwen/zcode-subagent-cli 0.6.0 → 0.8.0

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/dist/main.cjs CHANGED
@@ -23,10 +23,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  ));
24
24
 
25
25
  // src/main.ts
26
- var import_subagent_engine_sdk15 = require("@zhushanwen/subagent-engine-sdk");
26
+ var import_subagent_engine_sdk16 = require("@zhushanwen/subagent-engine-sdk");
27
27
 
28
28
  // src/server.ts
29
- var import_subagent_engine_sdk14 = require("@zhushanwen/subagent-engine-sdk");
29
+ var import_subagent_engine_sdk15 = require("@zhushanwen/subagent-engine-sdk");
30
30
 
31
31
  // src/constants.ts
32
32
  var ZCODE_ENGINE_ID = "zcode";
@@ -62,13 +62,13 @@ var ZCODE_RESUME_CHARS_PER_TOKEN = 4;
62
62
  var ZCODE_SESSION_SWEEP_DEFER_MS = 50;
63
63
 
64
64
  // src/registration.ts
65
- var import_subagent_engine_sdk12 = require("@zhushanwen/subagent-engine-sdk");
65
+ var import_subagent_engine_sdk13 = require("@zhushanwen/subagent-engine-sdk");
66
66
 
67
67
  // src/zcode-engine.ts
68
68
  var fs6 = __toESM(require("fs"), 1);
69
69
  var path4 = __toESM(require("path"), 1);
70
- var import_subagent_engine_sdk10 = require("@zhushanwen/subagent-engine-sdk");
71
70
  var import_subagent_engine_sdk11 = require("@zhushanwen/subagent-engine-sdk");
71
+ var import_subagent_engine_sdk12 = require("@zhushanwen/subagent-engine-sdk");
72
72
 
73
73
  // src/journal-io.ts
74
74
  var import_subagent_engine_sdk = require("@zhushanwen/subagent-engine-sdk");
@@ -139,6 +139,7 @@ function synthesizeCoarseEvents(response, usage) {
139
139
  var fs = __toESM(require("fs"), 1);
140
140
  var os2 = __toESM(require("os"), 1);
141
141
  var path2 = __toESM(require("path"), 1);
142
+ var import_subagent_engine_sdk4 = require("@zhushanwen/subagent-engine-sdk");
142
143
  var ZcodePrepareError = class extends Error {
143
144
  code;
144
145
  constructor(code, message) {
@@ -147,35 +148,81 @@ var ZcodePrepareError = class extends Error {
147
148
  this.code = code;
148
149
  }
149
150
  };
151
+ var TAIJI_SYNC_GUIDANCE = "\u82E5\u4F7F\u7528 taiji \u540C\u6B65\u526F\u672C/\u9ED8\u8BA4\u6A21\u578B\uFF0C\u5230 taiji settings \u6838\u5BF9\u6216\u91CD\u9009\uFF0C\u91CD\u542F taiji \u751F\u6548\u3002";
150
152
  function isRecord(v) {
151
153
  return typeof v === "object" && v !== null && !Array.isArray(v);
152
154
  }
153
155
  function strArray(v) {
154
156
  return Array.isArray(v) ? v.filter((m) => typeof m === "string" && m.trim() !== "") : [];
155
157
  }
156
- function readSourceConfig(absPath) {
157
- const empty = { providers: /* @__PURE__ */ new Map(), order: [] };
158
+ function readSourceJsonOrUndefined(absPath) {
158
159
  let raw;
159
160
  try {
160
161
  raw = fs.readFileSync(absPath, "utf8");
161
162
  } catch {
162
- return empty;
163
+ return void 0;
163
164
  }
164
- let parsed;
165
165
  try {
166
- parsed = JSON.parse(raw);
166
+ return JSON.parse(raw);
167
167
  } catch {
168
- return empty;
169
- }
170
- if (!isRecord(parsed)) return empty;
171
- const rules = parsed["config"]?.["providerConfigRules"];
172
- const providerRules = !isRecord(rules) ? void 0 : rules["providerRules"];
173
- const orderSrc = parsed["config"]?.["providerOrder"];
174
- const conf = { providers: /* @__PURE__ */ new Map(), order: strArray(orderSrc) };
175
- if (!Array.isArray(providerRules)) return conf;
176
- collectProviderRules(providerRules, conf);
168
+ return void 0;
169
+ }
170
+ }
171
+ function extractSourceConfig(parsed) {
172
+ const conf = { providers: /* @__PURE__ */ new Map(), order: [] };
173
+ if (!isRecord(parsed)) return conf;
174
+ const config = parsed["config"];
175
+ if (!isRecord(config)) return conf;
176
+ conf.order = strArray(config["providerOrder"]);
177
+ const rules = config["providerConfigRules"];
178
+ const providerRules = isRecord(rules) ? rules["providerRules"] : void 0;
179
+ if (Array.isArray(providerRules)) collectProviderRules(providerRules, conf);
177
180
  return conf;
178
181
  }
182
+ function readSourceConfig(absPath) {
183
+ return extractSourceConfig(readSourceJsonOrUndefined(absPath));
184
+ }
185
+ function mergePersonalProviderConfig(realObj, copyObj) {
186
+ if (!isRecord(copyObj)) return realObj;
187
+ if (!isRecord(realObj)) return copyObj;
188
+ const cfgOf = (obj) => isRecord(obj["config"]) ? obj["config"] : {};
189
+ const rulesOf = (obj) => {
190
+ const pcr = cfgOf(obj)["providerConfigRules"];
191
+ const rules = isRecord(pcr) ? pcr["providerRules"] : void 0;
192
+ return Array.isArray(rules) ? rules : [];
193
+ };
194
+ const mergedRules = [];
195
+ const seen = /* @__PURE__ */ new Set();
196
+ for (const rule of rulesOf(realObj)) {
197
+ mergedRules.push(rule);
198
+ if (isRecord(rule)) {
199
+ const id = rule["providerId"];
200
+ if (typeof id === "string" && id !== "") seen.add(id);
201
+ }
202
+ }
203
+ for (const rule of rulesOf(copyObj)) {
204
+ if (!isRecord(rule)) continue;
205
+ const id = rule["providerId"];
206
+ if (typeof id !== "string" || id === "") continue;
207
+ if (seen.has(id)) continue;
208
+ seen.add(id);
209
+ mergedRules.push(rule);
210
+ }
211
+ const mergedOrder = [];
212
+ for (const id of [...strArray(cfgOf(realObj)["providerOrder"]), ...strArray(cfgOf(copyObj)["providerOrder"])]) {
213
+ if (!mergedOrder.includes(id)) mergedOrder.push(id);
214
+ }
215
+ const realCfg = cfgOf(realObj);
216
+ const realPcr = isRecord(realCfg["providerConfigRules"]) ? realCfg["providerConfigRules"] : {};
217
+ return {
218
+ ...realObj,
219
+ config: {
220
+ ...realCfg,
221
+ providerOrder: mergedOrder,
222
+ providerConfigRules: { ...realPcr, providerRules: mergedRules }
223
+ }
224
+ };
225
+ }
179
226
  function collectProviderRules(providerRules, conf) {
180
227
  for (const rule of providerRules) {
181
228
  if (!isRecord(rule)) continue;
@@ -210,6 +257,40 @@ function defaultPersonalProviderConfigPath() {
210
257
  function defaultV2ConfigPath() {
211
258
  return path2.join(os2.homedir(), ...ZCODE_V2_CONFIG_PATH_SUFFIX);
212
259
  }
260
+ function piSyncedProviderConfigPath(engineDataDir) {
261
+ return path2.join(engineDataDir, ...import_subagent_engine_sdk4.ZCODE_PI_SYNCED_PROVIDER_CONFIG_SEGMENTS);
262
+ }
263
+ function envEngineDataDirOrUndefined() {
264
+ try {
265
+ return (0, import_subagent_engine_sdk4.resolveEngineDataDir)(process.env);
266
+ } catch {
267
+ return void 0;
268
+ }
269
+ }
270
+ function resolvePersonalProviderSource(sources, engineDataDir) {
271
+ const explicit = sources?.personalProviderConfigPath;
272
+ if (explicit !== void 0) return { kind: "explicit", path: explicit };
273
+ const dataDir = engineDataDir ?? envEngineDataDirOrUndefined();
274
+ if (dataDir !== void 0 && fs.existsSync(piSyncedProviderConfigPath(dataDir))) {
275
+ return { kind: "copy", path: piSyncedProviderConfigPath(dataDir), realPath: defaultPersonalProviderConfigPath() };
276
+ }
277
+ return { kind: "real", path: defaultPersonalProviderConfigPath() };
278
+ }
279
+ function resolvePersonalProviderConfigPath(sources, engineDataDir) {
280
+ return resolvePersonalProviderSource(sources, engineDataDir).path;
281
+ }
282
+ function readPersonalProviderView(sources) {
283
+ const resolution = resolvePersonalProviderSource(sources);
284
+ if (resolution.kind !== "copy") {
285
+ return { conf: readSourceConfig(resolution.path), sourceDesc: resolution.path };
286
+ }
287
+ const copyJson = readSourceJsonOrUndefined(resolution.path);
288
+ const realJson = readSourceJsonOrUndefined(resolution.realPath);
289
+ return {
290
+ conf: extractSourceConfig(mergePersonalProviderConfig(realJson, copyJson)),
291
+ sourceDesc: `merge(\u771F\u5B9E ${resolution.realPath} + \u526F\u672C ${resolution.path})`
292
+ };
293
+ }
213
294
  var SEMVER_SEGMENTS = 3;
214
295
  function locateZcodeBuiltinCatalog(sources) {
215
296
  if (sources?.builtinCatalogPath !== void 0) return sources.builtinCatalogPath;
@@ -256,21 +337,6 @@ function locateZcodeBuiltinCatalog(sources) {
256
337
  }
257
338
  return void 0;
258
339
  }
259
- function resolveZcodeMinimalReasoningLevel(modelRef, sources) {
260
- const catalogPath = locateZcodeBuiltinCatalog(sources);
261
- if (catalogPath === void 0) return void 0;
262
- let parsed;
263
- try {
264
- parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
265
- } catch {
266
- return void 0;
267
- }
268
- const modelId = modelShort(modelRef);
269
- const rules = parsed["config"];
270
- const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
271
- if (!Array.isArray(modelRules)) return void 0;
272
- return lastMatchingReasoningValues(modelRules, modelId)?.[0];
273
- }
274
340
  function lastMatchingReasoningValues(modelRules, modelId) {
275
341
  let values;
276
342
  for (const rule of modelRules) {
@@ -279,7 +345,7 @@ function lastMatchingReasoningValues(modelRules, modelId) {
279
345
  if (typeof match !== "string") continue;
280
346
  let re;
281
347
  try {
282
- re = new RegExp(match);
348
+ re = new RegExp(match, "i");
283
349
  } catch {
284
350
  continue;
285
351
  }
@@ -291,6 +357,21 @@ function lastMatchingReasoningValues(modelRules, modelId) {
291
357
  }
292
358
  return values;
293
359
  }
360
+ function resolveZcodeReasoningValues(modelRef, sources) {
361
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
362
+ if (catalogPath === void 0) return void 0;
363
+ let parsed;
364
+ try {
365
+ parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
366
+ } catch {
367
+ return void 0;
368
+ }
369
+ const modelId = modelShort(modelRef);
370
+ const rules = parsed["config"];
371
+ const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
372
+ if (!Array.isArray(modelRules)) return void 0;
373
+ return lastMatchingReasoningValues(modelRules, modelId);
374
+ }
294
375
  function defaultProviderForShortName(conf, withKey) {
295
376
  const ordered = conf.order.find((id) => {
296
377
  const entry = conf.providers.get(id);
@@ -299,19 +380,65 @@ function defaultProviderForShortName(conf, withKey) {
299
380
  if (ordered !== void 0) return ordered;
300
381
  return withKey[0][0];
301
382
  }
383
+ function resolveAccountModelRef(wanted, wantedProvider, sources) {
384
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
385
+ if (catalogPath === void 0) {
386
+ throw new ZcodePrepareError(
387
+ "model_not_available",
388
+ `account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u5B9A\u4F4D\u5931\u8D25\uFF08ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u4E0E runtime/provider \u626B\u63CF\u5747\u672A\u547D\u4E2D\uFF09\u3002`
389
+ );
390
+ }
391
+ let catalog;
392
+ try {
393
+ catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
394
+ } catch (err) {
395
+ throw new ZcodePrepareError(
396
+ "model_not_available",
397
+ `account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u4E0D\u53EF\u8BFB\uFF08${err instanceof Error ? err.message : String(err)}\uFF09\u3002`
398
+ );
399
+ }
400
+ const accountRule = findAccountProviderRule(catalog, wantedProvider);
401
+ if (accountRule === void 0) {
402
+ throw new ZcodePrepareError(
403
+ "model_not_available",
404
+ `\u672A\u77E5 account provider "${wantedProvider}"\uFF08\u5185\u5EFA\u76EE\u5F55\u65E0\u6B64\u89C4\u5219\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u76EE\u5F55\u5185 account:* \u89C4\u5219\uFF08\u5982 account:zai-individual-coding-plan / account:bigmodel-individual-coding-plan\uFF09\u3002`
405
+ );
406
+ }
407
+ assertAccountModelKnown(accountRule, wanted, wantedProvider);
408
+ return wanted;
409
+ }
410
+ function findAccountProviderRule(catalog, wantedProvider) {
411
+ const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
412
+ const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
413
+ return isRecord(accountRule) ? accountRule : void 0;
414
+ }
415
+ function assertAccountModelKnown(accountRule, wanted, wantedProvider) {
416
+ const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
417
+ const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
418
+ const short = modelShort(wanted);
419
+ if (Array.isArray(modelIds) && modelIds.length > 0 && !modelIds.includes(short)) {
420
+ throw new ZcodePrepareError(
421
+ "model_not_available",
422
+ `\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
423
+ );
424
+ }
425
+ }
302
426
  function resolveZcodeModelRef(requested, sources) {
303
- const srcPath = sources?.personalProviderConfigPath ?? defaultPersonalProviderConfigPath();
304
- const conf = readSourceConfig(srcPath);
427
+ const { conf, sourceDesc } = readPersonalProviderView(sources);
305
428
  const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
306
429
  const wanted = requested?.trim() || void 0;
307
430
  if (withKey.length === 0) {
308
431
  const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
309
432
  throw new ZcodePrepareError(
310
433
  "engine_credential_missing",
311
- `zcode \u5F15\u64CE\u627E\u4E0D\u5230\u4EFB\u4F55\u5E26 apiKey \u7684\u4E2A\u4EBA provider\uFF08${hint}\uFF09\u3002\u5DF2\u8BFB\u6E90\uFF1A${srcPath}\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u81F3\u5C11\u4E00\u4E2A\u4E2A\u4EBA provider\uFF08provider_config.json \u5185\u5B58\u5728 config.access.apiKey \u975E\u7A7A\u6761\u76EE\uFF09\u540E\u91CD\u8BD5\uFF1Bplan \u5957\u9910\u65CF\uFF08builtin:/account: \u524D\u7F00\uFF09\u7ECF\u8D26\u53F7 entitlement \u95E8\u63A7\uFF0C\u5916\u90E8 spawn \u7684\u5F15\u64CE\u6CE8\u518C\u8868\u4E0D\u88C5\u8F7D\uFF0C\u4E0D\u53EF\u4F5C\u4E3A\u5F15\u64CE\u6A21\u578B\u3002`
434
+ `zcode \u5F15\u64CE\u627E\u4E0D\u5230\u4EFB\u4F55\u5E26 apiKey \u7684\u4E2A\u4EBA provider\uFF08${hint}\uFF09\u3002\u5DF2\u8BFB\u6E90\uFF1A${sourceDesc}\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u81F3\u5C11\u4E00\u4E2A\u4E2A\u4EBA provider\uFF08provider_config.json \u5185\u5B58\u5728 config.access.apiKey \u975E\u7A7A\u6761\u76EE\uFF09\u540E\u91CD\u8BD5\uFF1Bplan \u5957\u9910\u65CF\uFF08builtin:/account: \u524D\u7F00\uFF09\u7ECF\u8D26\u53F7 entitlement \u95E8\u63A7\uFF0C\u5916\u90E8 spawn \u7684\u5F15\u64CE\u6CE8\u518C\u8868\u4E0D\u88C5\u8F7D\uFF0C\u4E0D\u53EF\u4F5C\u4E3A\u5F15\u64CE\u6A21\u578B\u3002` + TAIJI_SYNC_GUIDANCE
312
435
  );
313
436
  }
314
437
  if (wanted === void 0) return "";
438
+ const wantedProvider = wanted.includes("/") ? providerOf(wanted) : void 0;
439
+ if (wantedProvider !== void 0 && wantedProvider.startsWith("account:")) {
440
+ return resolveAccountModelRef(wanted, wantedProvider, sources);
441
+ }
315
442
  const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
316
443
  const short = modelShort(wanted);
317
444
  const entry = conf.providers.get(provider);
@@ -319,26 +446,26 @@ function resolveZcodeModelRef(requested, sources) {
319
446
  const known = withKey.map(([id]) => id).join(", ");
320
447
  throw new ZcodePrepareError(
321
448
  "model_not_available",
322
- `\u672A\u77E5 provider "${provider}"\uFF08\u5E26\u51ED\u636E\u7684\u4E2A\u4EBA provider: ${known}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u4E0A\u8FF0 provider \u4E4B\u4E00\uFF08\u5168\u540D provider/model\uFF09\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u8BE5 provider \u540E\u91CD\u8BD5\uFF1B\u7701\u7565 model \u53C2\u6570\u5219\u8D70\u5F15\u64CE\u7F3A\u7701\u89E3\u6790\uFF08CLI \u81EA\u8EAB\u9009\u53D6\u53EF\u7528\u6A21\u578B\uFF09\u3002`
449
+ `\u672A\u77E5 provider "${provider}"\uFF08\u5E26\u51ED\u636E\u7684\u4E2A\u4EBA provider: ${known}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u4E0A\u8FF0 provider \u4E4B\u4E00\uFF08\u5168\u540D provider/model\uFF09\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u8BE5 provider \u540E\u91CD\u8BD5\uFF1B\u7701\u7565 model \u53C2\u6570\u5219\u8D70\u5F15\u64CE\u7F3A\u7701\u89E3\u6790\uFF08CLI \u81EA\u8EAB\u9009\u53D6\u53EF\u7528\u6A21\u578B\uFF09\u3002` + TAIJI_SYNC_GUIDANCE
323
450
  );
324
451
  }
325
452
  if (!hasApiKey(entry)) {
326
453
  throw new ZcodePrepareError(
327
454
  "engine_credential_missing",
328
- `provider "${provider}" \u5B58\u5728\u4F46\u672A\u914D\u7F6E apiKey\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u4E3A\u8BE5 provider \u914D\u7F6E\u51ED\u636E\uFF0C\u6216\u6539\u7528\u5DF2\u914D\u51ED\u636E\u7684 provider\uFF08${withKey.map(([id]) => id).join(", ")}\uFF09\u540E\u91CD\u8BD5\u3002`
455
+ `provider "${provider}" \u5B58\u5728\u4F46\u672A\u914D\u7F6E apiKey\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u4E3A\u8BE5 provider \u914D\u7F6E\u51ED\u636E\uFF0C\u6216\u6539\u7528\u5DF2\u914D\u51ED\u636E\u7684 provider\uFF08${withKey.map(([id]) => id).join(", ")}\uFF09\u540E\u91CD\u8BD5\u3002` + TAIJI_SYNC_GUIDANCE
329
456
  );
330
457
  }
331
458
  const models = entry.models ?? [];
332
459
  if (models.length > 0 && !models.includes(short)) {
333
460
  throw new ZcodePrepareError(
334
461
  "model_not_available",
335
- `\u672A\u77E5\u6A21\u578B "${short}"\uFF08provider ${provider} \u4E0B\u53EF\u7528: ${models.join(", ")}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u8BE5 provider \u4E0B\u7684\u6A21\u578B\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u542F\u7528\u76EE\u6807\u6A21\u578B\u540E\u91CD\u8BD5\u3002`
462
+ `\u672A\u77E5\u6A21\u578B "${short}"\uFF08provider ${provider} \u4E0B\u53EF\u7528: ${models.join(", ")}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u8BE5 provider \u4E0B\u7684\u6A21\u578B\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u542F\u7528\u76EE\u6807\u6A21\u578B\u540E\u91CD\u8BD5\u3002` + TAIJI_SYNC_GUIDANCE
336
463
  );
337
464
  }
338
465
  return `${provider}/${short}`;
339
466
  }
340
467
  function listZcodeModels(sources) {
341
- const conf = readSourceConfig(sources?.personalProviderConfigPath ?? defaultPersonalProviderConfigPath());
468
+ const { conf } = readPersonalProviderView(sources);
342
469
  const out = [];
343
470
  for (const [pid, entry] of conf.providers) {
344
471
  if (!hasApiKey(entry)) continue;
@@ -358,7 +485,7 @@ var fs2 = __toESM(require("fs"), 1);
358
485
  var path3 = __toESM(require("path"), 1);
359
486
 
360
487
  // src/error-message.ts
361
- var import_subagent_engine_sdk4 = require("@zhushanwen/subagent-engine-sdk");
488
+ var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
362
489
 
363
490
  // src/appserver-launcher.ts
364
491
  var ZCODE_APPSERVER_LAUNCHER_NAME = "appserver-launcher.cjs";
@@ -370,7 +497,12 @@ const os = require('node:os');
370
497
 
371
498
  const CLI_PATH = process.env.ZCODE_ENG_CLI_PATH;
372
499
  const V2_PATH = process.env.ZCODE_ENG_V2_CONFIG || path.join(os.homedir(), '.zcode', 'v2', 'config.json');
373
- const PROVIDER_CONFIG_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || path.join(os.homedir(), '.zcode', 'v2', 'provider_config.json');
500
+ // \u771F\u5B9E provider_config.json\uFF08Registry \u76F4\u8BFB\u8DEF\u5F84\uFF0CA0 \u63A2\u9488\u5B9E\u8BC1\uFF09\u2014\u2014\u4E0E CONFIG_PATH \u540C\u6B3E
501
+ // homedir \u63A8\u5BFC\u5F62\u6001\uFF0C\u4E0D\u53D7 env \u91CD\u5B9A\u5411\uFF08merge \u5206\u652F\u8981\u8BFB\u7684\u6B63\u662F\u8FD9\u4E2A\u771F\u5B9E\u8DEF\u5F84\u672C\u8EAB\uFF09
502
+ const REAL_PROVIDER_CONFIG_PATH = path.join(os.homedir(), '.zcode', 'v2', 'provider_config.json');
503
+ // taiji \u540C\u6B65\u526F\u672C\u8DEF\u5F84\uFF08ZCODE_ENG_PROVIDER_CONFIG \u8BED\u4E49\u6536\u7A84\uFF1B'' = \u672A\u8BBE \u2192 merge \u5206\u652F\u4E0D\u6FC0\u6D3B\uFF09
504
+ const PI_SYNCED_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || '';
505
+ const PROVIDER_CONFIG_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || REAL_PROVIDER_CONFIG_PATH;
374
506
  const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
375
507
 
376
508
  // \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
@@ -393,7 +525,7 @@ function injectedConfigText() {
393
525
  let v2 = {};
394
526
  try { v2 = JSON.parse(readOrig(V2_PATH, 'utf8')); }
395
527
  catch (err) {
396
- // ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\u9759\u9ED8\uFF09\uFF1B\u5176\u4ED6\u5931\u8D25\uFF08JSON \u635F\u574F/\u6743\u9650\uFF09
528
+ // ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\u4E0D\u6784\u6210\u9519\u8BEF\uFF1B\u8DF3\u8FC7\u51B3\u7B56\u7531\u5B89\u88C5\u95E8\u65E5\u5FD7\u627F\u8F7D\uFF09\uFF1B\u5176\u4ED6\u5931\u8D25\uFF08JSON \u635F\u574F/\u6743\u9650\uFF09
397
529
  // \u51FA\u58F0\u2014\u2014\u5426\u5219\u6392\u969C\u4F1A\u88AB\u539F\u751F\u300C\u8BF7\u767B\u5F55\u300D\u62A5\u9519\u8BEF\u5BFC\uFF0C\u4E0E\u771F\u56E0\uFF08\u6587\u4EF6\u635F\u574F\uFF09\u4E0D\u7B26
398
530
  if (!err || err.code !== 'ENOENT') {
399
531
  process.stderr.write('[zcode-launcher] v2 config \u8BFB\u53D6\u5931\u8D25(' + ((err && err.code) || (err && err.message) || 'unknown') + '): ' + V2_PATH + '\u2014\u2014\u51ED\u636E\u6CE8\u5165\u672A\u751F\u6548\\n');
@@ -448,11 +580,14 @@ function injectedConfigText() {
448
580
  for (const mid of order) {
449
581
  if (typeof mid === 'string' && mid !== '' && !(mid in models)) models[mid] = {};
450
582
  }
583
+ // kind \u6309\u6761\u76EE api.type \u6D3E\u751F\uFF08D3\uFF09\uFF1Aanthropic-messages \u2192 anthropic\uFF0C\u5176\u4F59
584
+ // \uFF08openai-chat-completions / api.type \u7F3A\u5E2D / \u672A\u77E5\u503C\uFF09\u2192 openai-compatible
585
+ // \u2014\u2014\u5BF9\u9F50 v2 config.json \u65E2\u6709 kind \u4E24\u503C\u5F62\u6001\uFF1B\u4F5C\u7528\u4E8E\u8865\u6CE8\u5165\u6BB5\u5168\u90E8\u6761\u76EE\uFF08\u542B\u900F\u4F20
586
+ // \u771F\u5B9E\u6761\u76EE\uFF0Canthropic \u534F\u8BAE\u771F\u5B9E\u6761\u76EE\u4ECE\u65E7\u9519\u914D\u503C openai-compatible \u987A\u5E26\u4FEE\u6B63\uFF09\u3002
587
+ // \u672A\u77E5\u534F\u8BAE\u503C\u9519\u914D\u65F6\u8BF7\u6C42\u671F\u534F\u8BAE\u9519\u8BEF\u53EF\u89C1\uFF08\u4E0D\u963B\u585E\u6CE8\u518C\u8868\u88C5\u8F7D\uFF09\uFF0C\u771F\u673A\u6F02\u79FB\u4FE1\u53F7\u660E\u786E
451
588
  injectable[id] = {
452
589
  name: typeof rule.providerName === 'string' ? rule.providerName : id,
453
- // provider_config.json \u4E0D\u643A\u5E26\u534F\u8BAE\u5F62\u6001\u2014\u2014standard-personal \u7EC4\u4EE5 openai-compatible
454
- // \u4E3A\u591A\u6570\u5148\u4F8B\uFF1B\u9519\u914D\u65F6\u8BF7\u6C42\u671F\u534F\u8BAE\u9519\u8BEF\u53EF\u89C1\uFF08\u4E0D\u963B\u585E\u6CE8\u518C\u8868\u88C5\u8F7D\uFF09\uFF0C\u771F\u673A\u6F02\u79FB\u4FE1\u53F7\u660E\u786E
455
- kind: 'openai-compatible',
590
+ kind: api.type === 'anthropic-messages' ? 'anthropic' : 'openai-compatible',
456
591
  options: { apiKey: access.apiKey, baseURL: api.baseUrl },
457
592
  source: 'custom',
458
593
  models: models,
@@ -469,50 +604,148 @@ function injectedConfigText() {
469
604
  return JSON.stringify(merged);
470
605
  }
471
606
 
607
+ // [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
608
+ // eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
609
+ // \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
610
+ // merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\u8F68\u7248\u89C4\u5219\uFF1A
611
+ // - \u526F\u672C\u975E\u5BF9\u8C61 \u2192 \u539F\u6837\u8FD4\u56DE real\uFF08\u526F\u672C\u7F3A\u5E2D\u56DE\u843D\u8BED\u4E49\uFF1Bwrapper \u4FA7\u66F4\u65E9\u77ED\u8DEF\uFF0C\u9632\u5FA1\u5F62\u6001\uFF09
612
+ // - \u771F\u5B9E\u975E\u5BF9\u8C61\uFF08ENOENT/\u635F\u574F\uFF09\u2192 \u539F\u6837\u8FD4\u56DE copy\uFF08\u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6\uFF1AproviderRules
613
+ // \u4EC5\u526F\u672C\u6761\u76EE + order \u4EC5\u526F\u672C\u5E8F\uFF0C\u9876\u5C42\u5B57\u6BB5\u968F\u526F\u672C\u4FDD\u6301\u5F62\u6001\u5B8C\u6574\uFF09
614
+ // - providerRules\uFF1A\u771F\u5B9E\u6761\u76EE\u6574\u6761\u4FDD\u7559\u5728\u524D\uFF0C\u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u771F\u5B9E\u4F18\u5148 = \u540C\u540D\u8BA9\u4F4D
615
+ // \u7684\u8FD0\u884C\u65F6\u7B2C\u4E8C\u9053\u9632\u7EBF\uFF09\uFF1B\u65E0\u6709\u6548 providerId \u7684\u526F\u672C\u6761\u76EE\u4E22\u5F03\uFF0C\u771F\u5B9E\u6761\u76EE\u539F\u6837\u4FDD\u7559
616
+ // - providerOrder\uFF1A\u771F\u5B9E\u73B0\u503C\u5E8F + \u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u53BB\u91CD\u4FDD\u5E8F\uFF09
617
+ // - \u5176\u4F59\u5B57\u6BB5\uFF08\u542B config \u5185\u5176\u4ED6\u952E\uFF09\u53D6\u771F\u5B9E\u73B0\u503C
618
+ function mergeProviderConfig(realObj, copyObj) {
619
+ const isRec = (v) => v && typeof v === 'object' && !Array.isArray(v);
620
+ if (!isRec(copyObj)) return realObj;
621
+ if (!isRec(realObj)) return copyObj;
622
+ const cfgOf = (obj) => (isRec(obj.config) ? obj.config : {});
623
+ const rulesOf = (obj) => {
624
+ const pcr = cfgOf(obj).providerConfigRules;
625
+ const r = isRec(pcr) ? pcr.providerRules : undefined;
626
+ return Array.isArray(r) ? r : [];
627
+ };
628
+ const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
629
+ const mergedRules = [];
630
+ const seen = {};
631
+ for (const rule of rulesOf(realObj)) {
632
+ mergedRules.push(rule);
633
+ if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
634
+ }
635
+ for (const rule of rulesOf(copyObj)) {
636
+ if (!isRec(rule) || typeof rule.providerId !== 'string' || rule.providerId === '') continue;
637
+ if (seen[rule.providerId]) continue;
638
+ seen[rule.providerId] = true;
639
+ mergedRules.push(rule);
640
+ }
641
+ const mergedOrder = [];
642
+ for (const id of strArr(cfgOf(realObj).providerOrder).concat(strArr(cfgOf(copyObj).providerOrder))) {
643
+ if (mergedOrder.indexOf(id) === -1) mergedOrder.push(id);
644
+ }
645
+ const outCfg = Object.assign({}, cfgOf(realObj), {
646
+ providerOrder: mergedOrder,
647
+ providerConfigRules: Object.assign(
648
+ {},
649
+ isRec(cfgOf(realObj).providerConfigRules) ? cfgOf(realObj).providerConfigRules : {},
650
+ { providerRules: mergedRules },
651
+ ),
652
+ });
653
+ return Object.assign({}, realObj, { config: outCfg });
654
+ }
655
+ // [merge-fn-end]
656
+
657
+ // D3 \u6362\u8F68\u88C5\u8F7D\u901A\u9053\uFF1A\u547D\u4E2D\u771F\u5B9E provider_config.json \u7684\u8BFB\u53D6\u91CD\u5B9A\u5411\u4E3A merge(\u771F\u5B9E\u5B9E\u65F6
658
+ // \u5185\u5BB9, taiji \u540C\u6B65\u526F\u672C)\u2014\u2014\u6BCF\u6B21\u8BFB\u53D6\u91CD\u7B97\uFF08\u4E8B\u5B9E\u9A71\u52A8\uFF0C\u65E0\u7F13\u5B58/\u65F6\u95F4\u7A97\uFF0CZCode \u7AEF\u53D8\u66F4
659
+ // \u5B9E\u65F6\u751F\u6548\uFF09\u3002\u526F\u672C\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 null = \u8C03\u7528\u65B9\u77ED\u8DEF\u56DE\u539F\u6587\u4EF6\uFF08\u56DE\u843D\u771F\u5B9E\u6587\u4EF6\u8BED\u4E49\uFF0C
660
+ // \u96F6\u884C\u4E3A\u53D8\u5316\uFF09\uFF1Benv \u672A\u8BBE \u2192 null\uFF08\u5206\u652F\u4E0D\u6FC0\u6D3B\uFF09\u3002\u8BFB\u53D6\u4E00\u5F8B\u7ECF readOrig \u95F4\u63A5\u53D6\uFF08\u9632
661
+ // patch \u9762\u9012\u5F52\u81EA\u8C03\u7528\uFF09\u3002
662
+ function mergedProviderConfigText() {
663
+ if (!PI_SYNCED_PATH) return null;
664
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
665
+ let copyObj;
666
+ try {
667
+ copyObj = JSON.parse(readOrig(PI_SYNCED_PATH, 'utf8'));
668
+ } catch { return null; }
669
+ if (!copyObj || typeof copyObj !== 'object' || Array.isArray(copyObj)) return null;
670
+ let realObj = null;
671
+ try {
672
+ const parsed = JSON.parse(readOrig(REAL_PROVIDER_CONFIG_PATH, 'utf8'));
673
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) realObj = parsed;
674
+ } catch { /* ENOENT/\u635F\u574F \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6 */ }
675
+ return JSON.stringify(mergeProviderConfig(realObj, copyObj));
676
+ }
677
+
472
678
  if (!CLI_PATH) {
473
679
  process.stderr.write('[zcode-launcher] ZCODE_ENG_CLI_PATH \u672A\u8BBE\u7F6E\uFF0C\u65E0\u6CD5\u542F\u52A8 app-server\uFF08\u8BE5 env \u7531\u5F15\u64CE\u81EA\u52A8\u8BBE\u7F6E\uFF1B\u624B\u5DE5\u8FD0\u884C wrapper \u9700\u663E\u5F0F\u4F20\u5165\uFF09\\n');
474
680
  process.exit(2);
475
681
  }
476
682
 
477
- const text = injectedConfigText();
478
- if (text !== null) {
479
- // encoding \u5F52\u4E00\uFF08Node \u522B\u540D\u9762\uFF09\uFF1A'utf8'/'utf-8'/\u5927\u5C0F\u5199\u53D8\u4F53\u7EDF\u4E00\u6309 string \u8FD4\u56DE\u2014\u2014
480
- // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
481
- // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
482
- const shape = (args, value) => {
483
- const enc = args[0];
484
- const e = typeof enc === 'string' ? enc
485
- : (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
486
- if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
487
- return Buffer.from(value);
488
- };
489
- fs.__origReadFileSync = fs.readFileSync;
490
- fs.readFileSync = function (p, ...rest) {
491
- if (typeof p === 'string' && p === CONFIG_PATH) {
492
- const cur = injectedConfigText();
493
- if (cur !== null) return shape(rest, cur);
494
- }
495
- return fs.__origReadFileSync.call(fs, p, ...rest);
496
- };
497
- fs.promises.__origReadFile = fs.promises.readFile;
498
- fs.promises.readFile = function (p, ...rest) {
499
- if (typeof p === 'string' && p === CONFIG_PATH) {
500
- const cur = injectedConfigText();
501
- if (cur !== null) return Promise.resolve(shape(rest, cur));
683
+ // [2026-10-13 account \u76F4\u901A] \u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6\u62E6\u622A\uFF1A\u7ED9 zhipu-account \u6761\u76EE\u6CE8\u5165 entitled:true\u3002
684
+ // app-server \u6CE8\u518C\u8868\u88C5\u8F7D\u5224\u636E = access.entitled === true\uFF0C\u5916\u90E8 spawn \u4ECE\u76EE\u5F55\u6784\u5EFA\u7684\u8D26\u53F7
685
+ // \u6761\u76EE\u9ED8\u8BA4\u975E entitled\uFF08YXe \u786C\u7F16\u7801 !1\uFF09\u2192 plan \u5BB6\u65CF\u5F15\u7528\u4E00\u5F8B\u300C\u4E0D\u5B58\u5728 Model\u300D\u3002\u7528\u6237\u88C1\u51B3\uFF1A
686
+ // zai \u7CFB\u8D70 account provider \u914D\u7F6E\u5E76\u7ED5\u8FC7\u8BE5\u9650\u5236\u2014\u2014patch \u53EA\u53D1\u751F\u5728\u672C wrapper \u7684\u8BFB\u53D6\u8FD4\u56DE\u503C\uFF0C
687
+ // ZCode.app \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\u3002null = \u76EE\u5F55\u65E0 zhipu-account \u6761\u76EE\uFF08\u65E0\u9700 patch\uFF09\u3002
688
+ // \u672C\u51FD\u6570\u5FC5\u987B\u4EE5\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u8C03\u7528\uFF08\u5B89\u88C5\u95E8\u4F20 CATALOG_PATH\uFF09\u2014\u2014\u65E0\u53C2\u8C03\u7528\u4F1A\u5728\u8BFB\u6587\u4EF6
689
+ // \u65F6\u629B\u9519\u88AB catch \u6052\u8FD4 null\uFF0C\u66FE\u81F4\u7EAF account \u5BBF\u4E3B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\uFF08\u89C1\u5B89\u88C5\u95E8\u5904\u6CE8\u91CA\uFF09\u3002
690
+ let CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
691
+ const __catalogPatchCache = new Map();
692
+ // \u8DF3\u8FC7\u51B3\u7B56\u5F52\u56E0\uFF082026-10 \u5BA1\u67E5\u8865\uFF09\uFF1AcatalogPatchText \u628A\u300C\u65E0\u6761\u76EE\u9700\u8865\u300D\u4E0E\u300C\u8BFB\u53D6/\u89E3\u6790\u5931\u8D25
693
+ // \uFF08\u6587\u4EF6\u7F3A\u5931/\u635F\u574F\uFF09\u300D\u90FD\u6298\u6210 null\uFF0C\u8DF3\u8FC7\u65E5\u5FD7\u82E5\u4E0D\u533A\u5206\u4F1A\u628A\u635F\u574F\u6001\u8BEF\u62A5\u6210\u300C\u65E0\u6761\u76EE\u300D\uFF0C\u6392\u969C\u88AB\u8BEF\u5BFC
694
+ const __catalogPatchStatus = new Map(); // path -> 'no-entries' | 'unreadable'
695
+ function catalogPatchText(path) {
696
+ if (__catalogPatchCache.has(path)) return __catalogPatchCache.get(path);
697
+ let result = null;
698
+ try {
699
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
700
+ const parsed = JSON.parse(readOrig(path, 'utf8'));
701
+ const rules = parsed && parsed.config && parsed.config.providerConfigRules
702
+ && Array.isArray(parsed.config.providerConfigRules.providerRules)
703
+ ? parsed.config.providerConfigRules.providerRules : null;
704
+ let touched = 0;
705
+ if (rules) for (const rule of rules) {
706
+ const acc = rule && rule.config && rule.config.access;
707
+ if (acc && acc.type === 'zhipu-account' && acc.entitled !== true) { acc.entitled = true; touched++; }
708
+ }
709
+ result = touched > 0 ? JSON.stringify(parsed) : null;
710
+ __catalogPatchStatus.set(path, 'no-entries');
711
+ } catch { result = null; __catalogPatchStatus.set(path, 'unreadable'); }
712
+ __catalogPatchCache.set(path, result);
713
+ return result;
714
+ }
715
+
716
+ // [2026-10-13 account \u76F4\u901A\u2461] CLI bundle \u6E90\u7801\u5185\u5B58\u8865\u4E01\uFF1A\u5916\u90E8 spawn \u7684\u8D26\u53F7\u6761\u76EE\u6784\u5EFA
717
+ // \u786C\u7F16\u7801 entitled:!1\uFF08YXe\uFF09\uFF0C\u6570\u636E\u9762\u6CE8\u5165\uFF08\u76EE\u5F55 entitled \u5B57\u6BB5\uFF09\u88AB\u5176\u65E0\u89C6\u2014\u2014\u6309\u7528\u6237\u88C1\u51B3
718
+ // \u6539 zcode \u6E90\u7801\u7ED5\u8FC7\uFF1A\u62E6\u622A CLI bundle \u6E90\u7801\u8BFB\u53D6\uFF0C\u5185\u5B58\u66FF\u6362\u8BE5\u5B57\u9762\u91CF\u4E3A !0\uFF08ZCode.app
719
+ // \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\uFF1B\u951A\u4E32\u542B ]]:[] \u5C3E\u7F00\u552F\u4E00\u547D\u4E2D YXe \u6784\u9020\uFF0C\u53E6\u4E00\u5904\u540C\u540D\u6761\u4EF6\u903B\u8F91\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002
720
+ // \u951A\u4E0D\u547D\u4E2D\uFF08\u4E0A\u6E38\u6DF7\u6DC6\u5F62\u6001\u53D8\u5316\uFF09\u2192 \u539F\u6587\u900F\u51FA\uFF1A\u4EC5 account \u5BB6\u65CF\u7EE7\u7EED\u88AB\u62D2\uFF0C\u4E2A\u4EBA provider
721
+ // \u4E0D\u53D7\u5F71\u54CD\u3002
722
+ const __cliPatchCache = new Map();
723
+ function patchedCliSource(path) {
724
+ if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
725
+ let result = null;
726
+ try {
727
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
728
+ const src = readOrig(path, 'utf8');
729
+ // \u7248\u672C\u9C81\u68D2\u951A\uFF082026-10-13 \u4FEE\u8BA2\uFF09\uFF1Aminified \u6807\u8BC6\u7B26\uFF08Uk/I3 \u7B49\uFF09\u968F zcode \u91CD\u65B0\u6253\u5305
730
+ // \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
731
+ // \u771F\u540D\u4E0D\u88AB\u6DF7\u6DC6\u2014\u2014\u4EE5\u5C5E\u6027\u540D\u5B9A\u4F4D + 600 \u5B57\u7B26\u7A97\u53E3\u5185\u628A\u8D26\u53F7\u6761\u76EE\u6784\u5EFA\u7684 entitled:!1
732
+ // \u7FFB\u8F6C\u4E3A !0\u3002\u7A97\u53E3\u96F6\u547D\u4E2D = \u4E0A\u6E38\u5F62\u6001\u6F02\u79FB \u2192 \u539F\u6587\u900F\u51FA + stderr warn\uFF08\u6F02\u79FB\u53EF\u89C1\uFF0C
733
+ // \u8FDB app-server stderr \u65E5\u5FD7\uFF09\uFF0C\u4E2A\u4EBA provider \u4E0D\u53D7\u5F71\u54CD\u3002
734
+ const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
735
+ if (anchorIdx >= 0) {
736
+ const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
737
+ if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
738
+ result = src.slice(0, anchorIdx)
739
+ + window.split('entitled:!1').join('entitled:!0')
740
+ + src.slice(anchorIdx + 600);
741
+ }
502
742
  }
503
- return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
504
- };
505
- // existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
506
- // \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
507
- // \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u53D6\u9762 = \u4E0D\u53EF\u89C1
508
- fs.__origExistsSync = fs.existsSync;
509
- fs.existsSync = function (p) {
510
- if (typeof p === 'string' && p === CONFIG_PATH) {
511
- const cur = injectedConfigText();
512
- if (cur !== null) return true;
743
+ if (result === null) {
744
+ process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated, personal providers unaffected\\n');
513
745
  }
514
- return fs.__origExistsSync.call(fs, p);
515
- };
746
+ } catch { result = null; }
747
+ __cliPatchCache.set(path, result);
748
+ return result;
516
749
  }
517
750
 
518
751
  // \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\u9762\u2461\uFF09\uFF1A3.12.x \u8D77\u914D\u7F6E\u6587\u4EF6\u632A\u4F4D + CLI \u4F9D\u8D56\u5BBF\u4E3B\u6CE8\u5165
@@ -521,6 +754,11 @@ if (text !== null) {
521
754
  // <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
522
755
  // \uFF08semver \u6700\u5927\uFF09\u7684 endpoint-*/zcode-builtin.json \u2192 \u90FD\u627E\u4E0D\u5230\u5219\u4E0D\u8BBE\u952E\uFF0C\u8BA9 CLI
523
756
  // \u539F\u751F\u62A5\u9519\u900F\u51FA\uFF08\u9519\u8BEF\u6587\u6848\u542B\u6062\u590D\u6307\u5F15\uFF09\u3002
757
+ // [\u4F4D\u7F6E\uFF1A\u5B89\u88C5\u95E8\u4E4B\u524D] \u5B9A\u4F4D/env \u63A8\u5BFC\u5FC5\u987B\u5148\u4E8E\u5B89\u88C5\u95E8\u5224\u5B9A\u5B8C\u6210\u2014\u2014catalogPatchText
758
+ // \u9700\u8981\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u53C2\u4E0E\u95E8\u5224\u5B9A\u3002\u66FE\u56E0\u95E8\u5148\u4E8E\u5B9A\u4F4D\u6267\u884C\u4E14\u65E0\u53C2\u8C03\u7528\uFF0C
759
+ // fs.readFileSync(undefined) \u629B\u9519\u88AB catch \u6052\u8FD4 null \u2192 \u95E8\u9000\u5316\u4E3A text!==null\uFF0C
760
+ // \u7EAF account \u5BBF\u4E3B\uFF08v2 \u65E0\u51ED\u636E\u6761\u76EE \u2192 text=null\uFF09\u4E0B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\u3001account
761
+ // \u76F4\u901A\u6574\u4F53\u5931\u6548\u4E14\u96F6\u65E5\u5FD7\uFF082026-10 \u56DE\u5F52\u4FEE\u590D\uFF09\u3002
524
762
  if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
525
763
  let located = null;
526
764
  try {
@@ -562,6 +800,7 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
562
800
  }
563
801
  } catch { /* provider \u76EE\u5F55\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 \u4E0D\u8BBE\u952E */ }
564
802
  if (located) process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE = located;
803
+ CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
565
804
  // endpoint origin \u5BF9\u9F50\uFF082026-09-29 \u8FC1\u79FB\u540C\u6B65\uFF09\uFF1ACLI \u6309 ZCODE_BASE_URL \u6D3E\u751F active
566
805
  // \u76EE\u5F55\u8DEF\u5F84\uFF08sha256(origin) \u524D\u7F00\uFF09\uFF1BGUI \u5B89\u88C5\u7684\u76EE\u5F55\u5728 refresh \u63A7\u5236\u6587\u4EF6\u7684 endpointKey
567
806
  // \u4E0B\uFF08\u5982 https://zcode.z.ai\uFF09\uFF0C\u4E0E CLI \u7F3A\u7701 origin\uFF08bigmodel.cn\uFF09\u4E0D\u540C\u2014\u2014\u4E0D\u6CE8\u5165\u5219
@@ -581,6 +820,115 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
581
820
  }
582
821
  }
583
822
 
823
+ // \u5B89\u88C5\u95E8\uFF1A\u4EFB\u4E00 patch \u6E90\u53EF\u7528\u5373\u5B89\u88C5\u62E6\u622A\u5C42\uFF1B\u51B3\u7B56\u4E24\u6001\u90FD\u51FA\u58F0\uFF08\u88C5\u4E86\u54EA\u4E9B patch / \u4E3A\u4F55
824
+ // \u8DF3\u8FC7\uFF09\u2014\u2014\u8865\u4E01\u5C42\u7684\u5931\u6548\u5F62\u6001\u662F\u9759\u9ED8\u7684\uFF08account \u76F4\u901A\u5931\u6548 = plan \u5BB6\u65CF\u62A5\u300C\u4E0D\u5B58\u5728
825
+ // Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
826
+ const text = injectedConfigText();
827
+ const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
828
+ if (text !== null || catalogPatch !== null) {
829
+ process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
830
+ + ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
831
+ + ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off') + ', cli-source-bypass=armed\\n');
832
+ // encoding \u5F52\u4E00\uFF08Node \u522B\u540D\u9762\uFF09\uFF1A'utf8'/'utf-8'/\u5927\u5C0F\u5199\u53D8\u4F53\u7EDF\u4E00\u6309 string \u8FD4\u56DE\u2014\u2014
833
+ // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
834
+ // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
835
+ // shape \u540C\u65F6\u670D\u52A1\u56DB\u5904 patch \u6E90\uFF08config / provider merge / \u5185\u5EFA\u76EE\u5F55 / \u2014\u2014encoding \u5F52\u4E00
836
+ // \u8BED\u4E49\u76F8\u540C\uFF0C\u5355\u526F\u672C\uFF1A\u76EE\u5F55\u6761\u76EE\u66FE\u53E6\u6301\u9010\u5B57\u91CD\u590D\u526F\u672C catalogShape\uFF0C\u5DF2\u5E76\u56DE\u672C\u51FD\u6570\uFF09
837
+ const shape = (args, value) => {
838
+ const enc = args[0];
839
+ const e = typeof enc === 'string' ? enc
840
+ : (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
841
+ if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
842
+ return Buffer.from(value);
843
+ };
844
+ fs.__origReadFileSync = fs.readFileSync;
845
+ fs.readFileSync = function (p, ...rest) {
846
+ if (typeof p === 'string' && p === CONFIG_PATH) {
847
+ const cur = injectedConfigText();
848
+ if (cur !== null) return shape(rest, cur);
849
+ }
850
+ // D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
851
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
852
+ const cur = mergedProviderConfigText();
853
+ if (cur !== null) return shape(rest, cur);
854
+ }
855
+ // account \u76F4\u901A\uFF1A\u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6 \u2192 zhipu-account \u6CE8\u5165 entitled:true\u3002\u6309\u6587\u4EF6\u540D\u5339\u914D
856
+ // \uFF08app-server \u6309 ZCODE_BASE_URL \u81EA\u6D3E\u751F endpoint \u76EE\u5F55\uFF0C\u8BFB\u8DEF\u5F84\u2260env \u5B9A\u4F4D\u8DEF\u5F84\uFF09\u3002
857
+ if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
858
+ const cur = catalogPatchText(p);
859
+ if (cur !== null) return shape(rest, cur);
860
+ }
861
+ // account \u76F4\u901A\u2461\uFF1ACLI bundle \u6E90\u7801 \u2192 YXe entitled:!1 \u5185\u5B58\u7FFB\u8F6C\u4E3A !0
862
+ if (typeof p === 'string' && p === CLI_PATH) {
863
+ const cur = patchedCliSource(p);
864
+ if (cur !== null) return cur;
865
+ }
866
+ return fs.__origReadFileSync.call(fs, p, ...rest);
867
+ };
868
+ fs.promises.__origReadFile = fs.promises.readFile;
869
+ fs.promises.readFile = function (p, ...rest) {
870
+ if (typeof p === 'string' && p === CONFIG_PATH) {
871
+ const cur = injectedConfigText();
872
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
873
+ }
874
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
875
+ const cur = mergedProviderConfigText();
876
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
877
+ }
878
+ if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
879
+ const cur = catalogPatchText(p);
880
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
881
+ }
882
+ if (typeof p === 'string' && p === CLI_PATH) {
883
+ const cur = patchedCliSource(p);
884
+ if (cur !== null) return Promise.resolve(cur);
885
+ }
886
+ return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
887
+ };
888
+ // [account \u76F4\u901A\u2461 \u8F7D\u4F53] .js \u6269\u5C55\u5904\u7406\u5668\u6302\u94A9\uFF1ANode \u5BF9 CJS \u5165\u53E3\u6E90\u7801\u7684\u8BFB\u53D6\u8D70\u539F\u751F
889
+ // internalModuleReadFile \u901A\u9053\uFF0Cfs \u7334\u8865\u4E01\u4E0D\u53EF\u89C1\u2014\u2014CLI bundle \u6E90\u7801\u8865\u4E01\u6539\u5728\u6269\u5C55
890
+ // \u5904\u7406\u5668\u5C42\u62E6\u622A\uFF08\u4EC5\u547D\u4E2D CLI_PATH\uFF1B\u5176\u4F59\u6587\u4EF6\u5168\u6743\u59D4\u6258\u539F handler\uFF0C\u96F6\u989D\u5916\u5F00\u9500\uFF09\u3002
891
+ const __Module = require('node:module');
892
+ const __origJsHandler = __Module._extensions['.js'];
893
+ __Module._extensions['.js'] = function (mod, filename) {
894
+ if (CLI_PATH && filename === CLI_PATH) {
895
+ const patched = patchedCliSource(filename);
896
+ if (patched !== null) {
897
+ let src = patched.charCodeAt(0) === 0xfeff ? patched.slice(1) : patched;
898
+ if (src.startsWith('#!')) src = src.slice(src.indexOf('\\n') + 1);
899
+ return mod._compile(src, filename);
900
+ }
901
+ }
902
+ return __origJsHandler(mod, filename);
903
+ };
904
+
905
+ // existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
906
+ // \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
907
+ // \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u53D6\u9762 = \u4E0D\u53EF\u89C1\u3002
908
+ // D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
909
+ //\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
910
+ fs.__origExistsSync = fs.existsSync;
911
+ fs.existsSync = function (p) {
912
+ if (typeof p === 'string' && p === CONFIG_PATH) {
913
+ const cur = injectedConfigText();
914
+ if (cur !== null) return true;
915
+ }
916
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
917
+ if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
918
+ return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
919
+ }
920
+ return fs.__origExistsSync.call(fs, p);
921
+ };
922
+ } else {
923
+ process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u672A\u5B89\u88C5(\u8DF3\u8FC7): \u65E0\u51ED\u636E\u53EF\u6CE8\u5165(v2 config \u65E0 provider \u6761\u76EE)'
924
+ + (CATALOG_PATH !== null
925
+ ? (__catalogPatchStatus.get(CATALOG_PATH) === 'unreadable'
926
+ ? '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46 catalog \u8BFB\u53D6/\u89E3\u6790\u5931\u8D25(\u6587\u4EF6\u7F3A\u5931\u6216\u635F\u574F\uFF0C\u6392\u969C\u5165\u53E3: zcode-builtin.json\u2014\u2014\u975E\u300C\u65E0\u6761\u76EE\u300D)'
927
+ : '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46\u65E0 zhipu-account \u6761\u76EE\u9700\u8865(\u76EE\u5F55\u8BFB\u53D6\u539F\u751F\u900F\u51FA)')
928
+ : '; \u5185\u5EFA\u76EE\u5F55\u672A\u5B9A\u4F4D(env \u672A\u8BBE\u4E14\u81EA\u5B9A\u4F4D\u672A\u547D\u4E2D)')
929
+ + '\\n');
930
+ }
931
+
584
932
  // \u4E0A\u6E38 provider bootstrap \u4EE5 argv[1] \u4E3A\u5165\u53E3\u951A\uFF0C\u4ECE\u8BE5\u8DEF\u5F84\u90BB\u8FD1\u5B9A\u4F4D CLI \u5185\u5EFA
585
933
  // provider \u914D\u7F6E\u2014\u2014wrapper \u5F62\u6001\u4E0B argv[1] = \u672C wrapper \u843D\u76D8\u8DEF\u5F84\uFF0Cbootstrap \u4F1A\u5728
586
934
  // wrapper \u90BB\u57DF\u627E provider \u914D\u7F6E\u800C\u5931\u8D25\uFF08\u771F\u673A\u62A5\u300C\u65E0\u6CD5\u5B9A\u4F4D CLI ZCode Built-in Provider
@@ -605,7 +953,7 @@ function ensureAppServerLauncher(engineDataDir) {
605
953
  fs2.writeFileSync(tmp, APPSERVER_LAUNCHER_SOURCE);
606
954
  fs2.renameSync(tmp, file);
607
955
  } catch (err) {
608
- const reason = (0, import_subagent_engine_sdk4.toErrorMessage)(err);
956
+ const reason = (0, import_subagent_engine_sdk5.toErrorMessage)(err);
609
957
  throw new Error(
610
958
  `zcode app-server launcher \u843D\u76D8\u5931\u8D25: ${file}\uFF08${reason}\uFF09\u3002\u6062\u590D\uFF1A\u68C0\u67E5\u5F15\u64CE\u6570\u636E\u76EE\u5F55 \u5199\u6743\u9650\u4E0E\u78C1\u76D8\u7A7A\u95F4\uFF08engineDataDir \u7531\u5BBF\u4E3B\u4F20\u5165\uFF0C\u8DEF\u5F84\u89C1\u4E0A\uFF09\u540E\u91CD\u8BD5\u3002`
611
959
  );
@@ -863,21 +1211,21 @@ async function readZcodeSessionView(dbPath, sessionId) {
863
1211
  var fs4 = __toESM(require("fs"), 1);
864
1212
  var import_node_path = require("path");
865
1213
  var import_node_os = require("os");
866
- var import_subagent_engine_sdk7 = require("@zhushanwen/subagent-engine-sdk");
1214
+ var import_subagent_engine_sdk8 = require("@zhushanwen/subagent-engine-sdk");
867
1215
 
868
1216
  // src/logs/stderr-rotation.ts
869
- var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
870
1217
  var import_subagent_engine_sdk6 = require("@zhushanwen/subagent-engine-sdk");
1218
+ var import_subagent_engine_sdk7 = require("@zhushanwen/subagent-engine-sdk");
871
1219
  var ZCODE_STDERR_LOG_PREFIX = "zcode-appserver-stderr-";
872
1220
  function stderrLogPathFor(engineDataDir, pid) {
873
- return (0, import_subagent_engine_sdk5.stderrLogPathFor)(engineDataDir, pid, ZCODE_STDERR_LOG_PREFIX);
1221
+ return (0, import_subagent_engine_sdk6.stderrLogPathFor)(engineDataDir, pid, ZCODE_STDERR_LOG_PREFIX);
874
1222
  }
875
1223
  function cleanupSiblingStderrLogs(logPath, env, now) {
876
- return (0, import_subagent_engine_sdk5.cleanupSiblingStderrLogs)(logPath, env, ZCODE_STDERR_LOG_PREFIX, now);
1224
+ return (0, import_subagent_engine_sdk6.cleanupSiblingStderrLogs)(logPath, env, ZCODE_STDERR_LOG_PREFIX, now);
877
1225
  }
878
1226
 
879
1227
  // src/connection.ts
880
- var logger = (0, import_subagent_engine_sdk7.getLogger)("subagents");
1228
+ var logger = (0, import_subagent_engine_sdk8.getLogger)("subagents");
881
1229
  var RAW_FRAME_LOG_CHARS = 200;
882
1230
  var RUNTIME_PREFERENCES = Object.freeze({
883
1231
  nativeSearchEnhancementsEnabled: true,
@@ -899,11 +1247,11 @@ function frameIdOf(frame) {
899
1247
  return typeof id === "string" || typeof id === "number" ? id : void 0;
900
1248
  }
901
1249
  function errMessage(err) {
902
- return (0, import_subagent_engine_sdk4.toErrorMessage)(err);
1250
+ return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
903
1251
  }
904
1252
  function buildAppServerEnv(baseEnv = process.env) {
905
1253
  return {
906
- ...(0, import_subagent_engine_sdk7.buildNestedSpawnEnv)(baseEnv),
1254
+ ...(0, import_subagent_engine_sdk8.buildNestedSpawnEnv)(baseEnv),
907
1255
  ZCODE_MODEL_TELEMETRY_ENABLED: "false"
908
1256
  };
909
1257
  }
@@ -1053,7 +1401,7 @@ var AppServerConnection = class {
1053
1401
  close() {
1054
1402
  const child = this.child;
1055
1403
  if (child === null || this.killChainPromise !== void 0) return;
1056
- this.killChainPromise = (0, import_subagent_engine_sdk7.killChain)(child, { graceMs: ZCODE_KILL_GRACE_MS });
1404
+ this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: ZCODE_KILL_GRACE_MS });
1057
1405
  }
1058
1406
  /**
1059
1407
  * 异步完整关闭面:SIGTERM → grace → SIGKILL 杀链走完(含收尸),resolve 于进程
@@ -1065,7 +1413,7 @@ var AppServerConnection = class {
1065
1413
  if (this.killChainPromise === void 0) {
1066
1414
  const child = this.child;
1067
1415
  if (child === null) return;
1068
- this.killChainPromise = (0, import_subagent_engine_sdk7.killChain)(child, { graceMs: opts?.graceMs ?? ZCODE_KILL_GRACE_MS });
1416
+ this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: opts?.graceMs ?? ZCODE_KILL_GRACE_MS });
1069
1417
  }
1070
1418
  await this.killChainPromise;
1071
1419
  }
@@ -1084,10 +1432,10 @@ var AppServerConnection = class {
1084
1432
  this.generation += 1;
1085
1433
  const gen = this.generation;
1086
1434
  const script = this.launcherScript ?? this.cliPath;
1087
- const child = (0, import_subagent_engine_sdk7.spawnEngineChild)({
1435
+ const child = (0, import_subagent_engine_sdk8.spawnEngineChild)({
1088
1436
  command: this.nodeBin,
1089
1437
  args: [script, "app-server", "--cwd", this.cwd],
1090
- env: (0, import_subagent_engine_sdk7.buildEngineChildEnv)(this.env, {
1438
+ env: (0, import_subagent_engine_sdk8.buildEngineChildEnv)(this.env, {
1091
1439
  // L0 TAIJI_AGENT_DATA_DIR 缺省链:显式传参 > 宿主注入 env > tmpdir 占位
1092
1440
  //(app-server 不消费该键,占位仅满足 L0 必注入契约;生产调用方
1093
1441
  // zcode-engine.ensureAppServerRuntime 恒传 engineDataDir)。
@@ -1125,7 +1473,7 @@ var AppServerConnection = class {
1125
1473
  }
1126
1474
  }
1127
1475
  };
1128
- (0, import_subagent_engine_sdk7.pumpNdjsonLines)(child.stdout, (line) => this.handleLine(line));
1476
+ (0, import_subagent_engine_sdk8.pumpNdjsonLines)(child.stdout, (line) => this.handleLine(line));
1129
1477
  child.stderr?.setEncoding("utf8");
1130
1478
  child.stderr?.on("data", (chunk) => {
1131
1479
  this.stderrTail = (this.stderrTail + chunk).slice(-ZCODE_APPSERVER_STDERR_TAIL_BUFFER_CHARS);
@@ -1266,8 +1614,8 @@ var AppServerConnection = class {
1266
1614
  }
1267
1615
  this.stderrStream.write(chunk);
1268
1616
  if (this.activeStderrLogPath !== null) {
1269
- const params = (0, import_subagent_engine_sdk6.stderrRotationParams)(process.env);
1270
- if ((0, import_subagent_engine_sdk6.rotateStderrLogIfNeeded)(this.activeStderrLogPath, params)) {
1617
+ const params = (0, import_subagent_engine_sdk7.stderrRotationParams)(process.env);
1618
+ if ((0, import_subagent_engine_sdk7.rotateStderrLogIfNeeded)(this.activeStderrLogPath, params)) {
1271
1619
  this.closeStderrStream();
1272
1620
  }
1273
1621
  }
@@ -1285,8 +1633,8 @@ var AppServerConnection = class {
1285
1633
 
1286
1634
  // src/session-channel.ts
1287
1635
  var import_node_crypto = require("crypto");
1288
- var import_subagent_engine_sdk8 = require("@zhushanwen/subagent-engine-sdk");
1289
- var logger2 = (0, import_subagent_engine_sdk8.getLogger)("subagents");
1636
+ var import_subagent_engine_sdk9 = require("@zhushanwen/subagent-engine-sdk");
1637
+ var logger2 = (0, import_subagent_engine_sdk9.getLogger)("subagents");
1290
1638
  var SUBSCRIBE_DELIVERY_KIND = "desktop-continuous";
1291
1639
  var WORKSPACE_KEY_HASH_CHARS = 16;
1292
1640
  var CREATE_REPLY_LOG_CHARS = 300;
@@ -1295,7 +1643,7 @@ function isRecord3(v) {
1295
1643
  return typeof v === "object" && v !== null && !Array.isArray(v);
1296
1644
  }
1297
1645
  function errMessage2(err) {
1298
- return (0, import_subagent_engine_sdk4.toErrorMessage)(err);
1646
+ return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
1299
1647
  }
1300
1648
  function stableWorkspaceKey(workspacePath) {
1301
1649
  return "ws-" + (0, import_node_crypto.createHash)("sha256").update(workspacePath).digest("hex").slice(0, WORKSPACE_KEY_HASH_CHARS);
@@ -1822,8 +2170,8 @@ var SessionChannel = class {
1822
2170
 
1823
2171
  // src/session-db-maintenance.ts
1824
2172
  var fs5 = __toESM(require("fs"), 1);
1825
- var import_subagent_engine_sdk9 = require("@zhushanwen/subagent-engine-sdk");
1826
- var logger3 = (0, import_subagent_engine_sdk9.getLogger)("subagents");
2173
+ var import_subagent_engine_sdk10 = require("@zhushanwen/subagent-engine-sdk");
2174
+ var logger3 = (0, import_subagent_engine_sdk10.getLogger)("subagents");
1827
2175
  var ZCODE_SESSION_TTL_MS = 2592e6;
1828
2176
  var ZCODE_SESSION_SWEEP_INTERVAL_MS = 864e5;
1829
2177
  var SWEEP_BUSY_TIMEOUT_MS = 5e3;
@@ -1979,9 +2327,10 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
1979
2327
  }
1980
2328
 
1981
2329
  // src/zcode-engine.ts
1982
- var logger4 = (0, import_subagent_engine_sdk10.getLogger)("subagents");
2330
+ var logger4 = (0, import_subagent_engine_sdk11.getLogger)("subagents");
1983
2331
  var PROBE_VERSION_TIMEOUT_MS = 15e3;
1984
2332
  var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
2333
+ var OFF_FAMILY_THINKING_LEVELS = /* @__PURE__ */ new Set(["off", "minimal"]);
1985
2334
  var ZcodeEngine = class {
1986
2335
  id = ZCODE_ENGINE_ID;
1987
2336
  deps;
@@ -2194,7 +2543,7 @@ var ZcodeEngine = class {
2194
2543
  */
2195
2544
  async attemptAppServerTurn(task, ctx, modelRef, cwd, prompt, opts = {}) {
2196
2545
  const rt = this.ensureAppServerRuntime();
2197
- const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.minimalReasoningFor(modelRef) : void 0;
2546
+ const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.reasoningLevelFor(modelRef, task.thinkingLevel) : void 0;
2198
2547
  const createParams = buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel);
2199
2548
  let currentSessionId;
2200
2549
  let signalSessionCreated;
@@ -2348,7 +2697,7 @@ var ZcodeEngine = class {
2348
2697
  const env = buildAppServerEnv(this.deps.processEnv ?? process.env);
2349
2698
  env.ZCODE_ENG_CLI_PATH = cliPath;
2350
2699
  env.ZCODE_ENG_V2_CONFIG = this.deps.sources?.v2ConfigPath ?? defaultV2ConfigPath();
2351
- env.ZCODE_ENG_PROVIDER_CONFIG = this.deps.sources?.personalProviderConfigPath ?? defaultPersonalProviderConfigPath();
2700
+ env.ZCODE_ENG_PROVIDER_CONFIG = resolvePersonalProviderConfigPath(this.deps.sources, engineDataDir);
2352
2701
  const sessionDbPath = zcodeSessionDbPath(engineDataDir);
2353
2702
  env.ZCODE_SESSION_DB_PATH = sessionDbPath;
2354
2703
  delete env.ZCODE_SESSION_DB;
@@ -2445,7 +2794,7 @@ var ZcodeEngine = class {
2445
2794
  /** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
2446
2795
  applyAbortedOutcome(outcome, task, ctx, final, emit) {
2447
2796
  outcome.exitCode = null;
2448
- outcome.error = isHostTimeoutAbort(ctx) ? (0, import_subagent_engine_sdk11.synthesizeTimeoutOutcome)(task, final.output.stdoutText, ZCODE_ENGINE_ID).error ?? (0, import_subagent_engine_sdk11.engineTimeoutDetail)(final.output.stdoutText) : final.abortMessage ?? `engine_run_failed: zcode \u4EFB\u52A1\u88AB\u4E2D\u6B62\uFF08app-server abort \u94FE\u6536\u53E3\uFF0C\u5BBF\u4E3B\u5408\u6210\u7EC8\u6001\uFF09\u3002\u8F93\u51FA\u5C3E\u90E8: ${final.output.stdoutText.slice(-ZCODE_ERROR_TAIL_CHARS)}`;
2797
+ outcome.error = isHostTimeoutAbort(ctx) ? (0, import_subagent_engine_sdk12.synthesizeTimeoutOutcome)(task, final.output.stdoutText, ZCODE_ENGINE_ID).error ?? (0, import_subagent_engine_sdk12.engineTimeoutDetail)(final.output.stdoutText) : final.abortMessage ?? `engine_run_failed: zcode \u4EFB\u52A1\u88AB\u4E2D\u6B62\uFF08app-server abort \u94FE\u6536\u53E3\uFF0C\u5BBF\u4E3B\u5408\u6210\u7EC8\u6001\uFF09\u3002\u8F93\u51FA\u5C3E\u90E8: ${final.output.stdoutText.slice(-ZCODE_ERROR_TAIL_CHARS)}`;
2449
2798
  emit({ type: "error", message: outcome.error });
2450
2799
  }
2451
2800
  /**
@@ -2491,16 +2840,30 @@ var ZcodeEngine = class {
2491
2840
  listModels() {
2492
2841
  return listZcodeModels(this.deps.sources);
2493
2842
  }
2494
- /** 显式模型的最小 reasoning 档(目录 modelRules 值域;per-modelRef 记忆化——
2843
+ /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
2495
2844
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
2496
2845
  reasoningMemo = /* @__PURE__ */ new Map();
2497
- minimalReasoningFor(modelRef) {
2846
+ /**
2847
+ * create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
2848
+ * - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
2849
+ * - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
2850
+ * 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
2851
+ * - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
2852
+ * (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
2853
+ * disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
2854
+ */
2855
+ reasoningLevelFor(modelRef, thinkingLevel) {
2498
2856
  const memoKey = `${locateZcodeBuiltinCatalog(this.deps.sources) ?? "none"}|${modelRef}`;
2499
- const hit = this.reasoningMemo.get(memoKey);
2500
- if (hit !== void 0 || this.reasoningMemo.has(memoKey)) return hit;
2501
- const level = resolveZcodeMinimalReasoningLevel(modelRef, this.deps.sources);
2502
- this.reasoningMemo.set(memoKey, level);
2503
- return level;
2857
+ const memoHit = this.reasoningMemo.get(memoKey);
2858
+ const domain = memoHit !== void 0 || this.reasoningMemo.has(memoKey) ? memoHit : resolveZcodeReasoningValues(modelRef, this.deps.sources);
2859
+ this.reasoningMemo.set(memoKey, domain);
2860
+ if (domain === void 0 || domain.length === 0) return void 0;
2861
+ const requested = thinkingLevel?.trim();
2862
+ if (requested === void 0 || requested === "") return domain[0];
2863
+ if (domain.includes(requested)) return requested;
2864
+ if (OFF_FAMILY_THINKING_LEVELS.has(requested)) return domain[0];
2865
+ const nonMinimal = domain.slice(1);
2866
+ return nonMinimal.length > 0 ? nonMinimal[nonMinimal.length - 1] : domain[0];
2504
2867
  }
2505
2868
  /**
2506
2869
  * [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
@@ -2550,7 +2913,7 @@ var ZcodeEngine = class {
2550
2913
  }
2551
2914
  } else {
2552
2915
  const poolDir = path4.resolve(
2553
- (0, import_subagent_engine_sdk11.resolvePoolDir)(this.deps.engineDataDir(), ZCODE_ENGINE_ID, import_subagent_engine_sdk11.SHARED_POOL_KEY)
2916
+ (0, import_subagent_engine_sdk12.resolvePoolDir)(this.deps.engineDataDir(), ZCODE_ENGINE_ID, import_subagent_engine_sdk12.SHARED_POOL_KEY)
2554
2917
  );
2555
2918
  const resolved = path4.resolve(poolDir, dbPathRaw);
2556
2919
  if (resolved.startsWith(poolDir + path4.sep)) {
@@ -2568,7 +2931,7 @@ var ZcodeEngine = class {
2568
2931
  logger4.warn("[zcode-engine] native session read failed, degrade to journal replay", {
2569
2932
  dbPath,
2570
2933
  sessionId,
2571
- reason: (0, import_subagent_engine_sdk4.toErrorMessage)(err)
2934
+ reason: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
2572
2935
  });
2573
2936
  }
2574
2937
  }
@@ -2655,7 +3018,7 @@ var ZcodeEngine = class {
2655
3018
  buildPrompt(task, schema) {
2656
3019
  const segments = [...task.appendSystemPrompt ?? []];
2657
3020
  segments.push(task.prompt);
2658
- if (schema !== void 0) segments.push((0, import_subagent_engine_sdk11.buildSchemaEmulationSegment)(schema));
3021
+ if (schema !== void 0) segments.push((0, import_subagent_engine_sdk12.buildSchemaEmulationSegment)(schema));
2659
3022
  return segments.join("\n\n");
2660
3023
  }
2661
3024
  };
@@ -2698,7 +3061,7 @@ function isPlainObject(v) {
2698
3061
  return typeof v === "object" && v !== null && !Array.isArray(v);
2699
3062
  }
2700
3063
  function errMessage3(err) {
2701
- return (0, import_subagent_engine_sdk4.toErrorMessage)(err);
3064
+ return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
2702
3065
  }
2703
3066
  function resolveAppserverTimingMs(envName, fallbackMs, label) {
2704
3067
  const raw = process.env[envName];
@@ -2810,7 +3173,7 @@ function parsedAppServerAttempt(task, r) {
2810
3173
  kind: "parsed",
2811
3174
  output: syntheticAppServerOutput(0),
2812
3175
  payload: turnResultToPayload(r),
2813
- ...schema !== void 0 ? { schemaResult: (0, import_subagent_engine_sdk11.extractAndValidateStructuredOutput)(r.response, schema) } : {}
3176
+ ...schema !== void 0 ? { schemaResult: (0, import_subagent_engine_sdk12.extractAndValidateStructuredOutput)(r.response, schema) } : {}
2814
3177
  };
2815
3178
  }
2816
3179
  function failedTerminalAppServerAttempt(r) {
@@ -2848,16 +3211,16 @@ function failedAppServerAttempt(err, currentSessionId, opts = {}) {
2848
3211
  };
2849
3212
  }
2850
3213
  function isHostTimeoutAbort(ctx) {
2851
- return ctx.signal?.aborted === true && ctx.signal.reason === import_subagent_engine_sdk11.HOST_TIMEOUT_ABORT_REASON;
3214
+ return ctx.signal?.aborted === true && ctx.signal.reason === import_subagent_engine_sdk12.HOST_TIMEOUT_ABORT_REASON;
2852
3215
  }
2853
3216
  var PROBE_STDOUT_CAP_CHARS = 4096;
2854
3217
  async function defaultProbeVersion(cliPath, dataDir) {
2855
3218
  try {
2856
3219
  return await new Promise((resolve2, reject) => {
2857
- const child = (0, import_subagent_engine_sdk11.spawnEngineChild)({
3220
+ const child = (0, import_subagent_engine_sdk12.spawnEngineChild)({
2858
3221
  command: "node",
2859
3222
  args: [cliPath, "--version"],
2860
- env: (0, import_subagent_engine_sdk11.buildEngineChildEnv)(process.env, { dataDir }),
3223
+ env: (0, import_subagent_engine_sdk12.buildEngineChildEnv)(process.env, { dataDir }),
2861
3224
  stdout: "pipe",
2862
3225
  stderr: "ignore",
2863
3226
  signal: AbortSignal.timeout(PROBE_VERSION_TIMEOUT_MS)
@@ -2875,7 +3238,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
2875
3238
  });
2876
3239
  } catch (err) {
2877
3240
  logger4.debug(
2878
- `[zcode-engine] probe version check failed (best-effort continue): ${(0, import_subagent_engine_sdk4.toErrorMessage)(err)}`
3241
+ `[zcode-engine] probe version check failed (best-effort continue): ${(0, import_subagent_engine_sdk5.toErrorMessage)(err)}`
2879
3242
  );
2880
3243
  return void 0;
2881
3244
  }
@@ -2883,7 +3246,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
2883
3246
 
2884
3247
  // src/registration.ts
2885
3248
  function defaultEngineDataDir() {
2886
- return (0, import_subagent_engine_sdk12.resolveEngineDataDir)(process.env);
3249
+ return (0, import_subagent_engine_sdk13.resolveEngineDataDir)(process.env);
2887
3250
  }
2888
3251
  function createZcodeEngine(deps) {
2889
3252
  return new ZcodeEngine(deps);
@@ -2896,11 +3259,11 @@ function createDefaultZcodeEngine() {
2896
3259
  }
2897
3260
 
2898
3261
  // src/port-types.ts
2899
- var import_subagent_engine_sdk13 = require("@zhushanwen/subagent-engine-sdk");
3262
+ var import_subagent_engine_sdk14 = require("@zhushanwen/subagent-engine-sdk");
2900
3263
 
2901
3264
  // src/server.ts
2902
3265
  var import_server = require("@zhushanwen/subagent-engine-sdk/server");
2903
- var logger5 = (0, import_subagent_engine_sdk14.getLogger)("subagents");
3266
+ var logger5 = (0, import_subagent_engine_sdk15.getLogger)("subagents");
2904
3267
  var EngineProtocolServer = class {
2905
3268
  write;
2906
3269
  engine;
@@ -2970,7 +3333,7 @@ var EngineProtocolServer = class {
2970
3333
  const active = { controller, seq: 0 };
2971
3334
  this.activeRuns.set(runId, active);
2972
3335
  const fullTask = (0, import_server.assembleFullTask)(task, ctx);
2973
- const ctxModel = (0, import_subagent_engine_sdk13.parseCtxModel)(ctx.ctxModel);
3336
+ const ctxModel = (0, import_subagent_engine_sdk14.parseCtxModel)(ctx.ctxModel);
2974
3337
  const stream = ctx.streamMode === "stream" ? {
2975
3338
  onDelta: (delta) => {
2976
3339
  void this.reverseRequestInternal("host/streamDelta", { runId, delta }).catch(this.warnReverseFailure("host/streamDelta", `run ${runId}`));
@@ -3006,7 +3369,7 @@ var EngineProtocolServer = class {
3006
3369
  }
3007
3370
  validateModel(params) {
3008
3371
  if (this.engine.validateModel === void 0) {
3009
- throw new import_subagent_engine_sdk14.EngineSdkError(
3372
+ throw new import_subagent_engine_sdk15.EngineSdkError(
3010
3373
  "engine_capability_unsupported",
3011
3374
  "engine does not implement validateModel",
3012
3375
  "Manifest omits modelCatalog; model validation falls back to run-time engine checks."
@@ -3033,7 +3396,7 @@ var EngineProtocolServer = class {
3033
3396
  warnReverseFailure(method, context) {
3034
3397
  return (err) => {
3035
3398
  logger5.warn(`[protocol] ${method} reverse request failed (${context}); continuing without it`, {
3036
- detail: (0, import_subagent_engine_sdk4.toErrorMessage)(err)
3399
+ detail: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
3037
3400
  });
3038
3401
  };
3039
3402
  }
@@ -3062,7 +3425,7 @@ var EngineProtocolServer = class {
3062
3425
  clearTimeout(pending.timer);
3063
3426
  this.reverseClock?.acked(String(id));
3064
3427
  this.reverseClock?.settled(String(id));
3065
- if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0, import_subagent_engine_sdk4.toErrorMessage)(frame.error)}`));
3428
+ if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0, import_subagent_engine_sdk5.toErrorMessage)(frame.error)}`));
3066
3429
  else pending.resolve(frame.result);
3067
3430
  }
3068
3431
  };
@@ -3075,8 +3438,8 @@ function toProtocolError(err) {
3075
3438
  }
3076
3439
 
3077
3440
  // src/main.ts
3078
- var clock = (0, import_subagent_engine_sdk15.armEngineSelfDestruct)({ stdin: process.stdin });
3079
- (0, import_subagent_engine_sdk15.runEngineCliEntry)({
3441
+ var clock = (0, import_subagent_engine_sdk16.armEngineSelfDestruct)({ stdin: process.stdin });
3442
+ (0, import_subagent_engine_sdk16.runEngineCliEntry)({
3080
3443
  component: "zcode-engine-cli",
3081
3444
  server: new EngineProtocolServer({
3082
3445
  write: (frame) => {