@zhushanwen/zcode-subagent-cli 0.7.0 → 0.8.1

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
@@ -337,21 +337,6 @@ function locateZcodeBuiltinCatalog(sources) {
337
337
  }
338
338
  return void 0;
339
339
  }
340
- function resolveZcodeMinimalReasoningLevel(modelRef, sources) {
341
- const catalogPath = locateZcodeBuiltinCatalog(sources);
342
- if (catalogPath === void 0) return void 0;
343
- let parsed;
344
- try {
345
- parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
346
- } catch {
347
- return void 0;
348
- }
349
- const modelId = modelShort(modelRef);
350
- const rules = parsed["config"];
351
- const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
352
- if (!Array.isArray(modelRules)) return void 0;
353
- return lastMatchingReasoningValues(modelRules, modelId)?.[0];
354
- }
355
340
  function lastMatchingReasoningValues(modelRules, modelId) {
356
341
  let values;
357
342
  for (const rule of modelRules) {
@@ -360,7 +345,7 @@ function lastMatchingReasoningValues(modelRules, modelId) {
360
345
  if (typeof match !== "string") continue;
361
346
  let re;
362
347
  try {
363
- re = new RegExp(match);
348
+ re = new RegExp(match, "i");
364
349
  } catch {
365
350
  continue;
366
351
  }
@@ -372,6 +357,21 @@ function lastMatchingReasoningValues(modelRules, modelId) {
372
357
  }
373
358
  return values;
374
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
+ }
375
375
  function defaultProviderForShortName(conf, withKey) {
376
376
  const ordered = conf.order.find((id) => {
377
377
  const entry = conf.providers.get(id);
@@ -380,6 +380,49 @@ function defaultProviderForShortName(conf, withKey) {
380
380
  if (ordered !== void 0) return ordered;
381
381
  return withKey[0][0];
382
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
+ }
383
426
  function resolveZcodeModelRef(requested, sources) {
384
427
  const { conf, sourceDesc } = readPersonalProviderView(sources);
385
428
  const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
@@ -392,6 +435,10 @@ function resolveZcodeModelRef(requested, sources) {
392
435
  );
393
436
  }
394
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
+ }
395
442
  const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
396
443
  const short = modelShort(wanted);
397
444
  const entry = conf.providers.get(provider);
@@ -478,7 +525,7 @@ function injectedConfigText() {
478
525
  let v2 = {};
479
526
  try { v2 = JSON.parse(readOrig(V2_PATH, 'utf8')); }
480
527
  catch (err) {
481
- // 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
482
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
483
530
  if (!err || err.code !== 'ENOENT') {
484
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');
@@ -633,60 +680,72 @@ if (!CLI_PATH) {
633
680
  process.exit(2);
634
681
  }
635
682
 
636
- const text = injectedConfigText();
637
- if (text !== null) {
638
- // 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
639
- // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
640
- // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
641
- const shape = (args, value) => {
642
- const enc = args[0];
643
- const e = typeof enc === 'string' ? enc
644
- : (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
645
- if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
646
- return Buffer.from(value);
647
- };
648
- fs.__origReadFileSync = fs.readFileSync;
649
- fs.readFileSync = function (p, ...rest) {
650
- if (typeof p === 'string' && p === CONFIG_PATH) {
651
- const cur = injectedConfigText();
652
- if (cur !== null) return shape(rest, cur);
653
- }
654
- // D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
655
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
656
- const cur = mergedProviderConfigText();
657
- if (cur !== null) return shape(rest, cur);
658
- }
659
- return fs.__origReadFileSync.call(fs, p, ...rest);
660
- };
661
- fs.promises.__origReadFile = fs.promises.readFile;
662
- fs.promises.readFile = function (p, ...rest) {
663
- if (typeof p === 'string' && p === CONFIG_PATH) {
664
- const cur = injectedConfigText();
665
- if (cur !== null) return Promise.resolve(shape(rest, cur));
666
- }
667
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
668
- const cur = mergedProviderConfigText();
669
- if (cur !== null) return Promise.resolve(shape(rest, cur));
670
- }
671
- return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
672
- };
673
- // existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
674
- // \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
675
- // \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
676
- // D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
677
- //\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
678
- fs.__origExistsSync = fs.existsSync;
679
- fs.existsSync = function (p) {
680
- if (typeof p === 'string' && p === CONFIG_PATH) {
681
- const cur = injectedConfigText();
682
- if (cur !== null) return true;
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
+ }
683
742
  }
684
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
685
- if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
686
- return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
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');
687
745
  }
688
- return fs.__origExistsSync.call(fs, p);
689
- };
746
+ } catch { result = null; }
747
+ __cliPatchCache.set(path, result);
748
+ return result;
690
749
  }
691
750
 
692
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
@@ -695,6 +754,11 @@ if (text !== null) {
695
754
  // <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
696
755
  // \uFF08semver \u6700\u5927\uFF09\u7684 endpoint-*/zcode-builtin.json \u2192 \u90FD\u627E\u4E0D\u5230\u5219\u4E0D\u8BBE\u952E\uFF0C\u8BA9 CLI
697
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
698
762
  if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
699
763
  let located = null;
700
764
  try {
@@ -736,6 +800,7 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
736
800
  }
737
801
  } catch { /* provider \u76EE\u5F55\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 \u4E0D\u8BBE\u952E */ }
738
802
  if (located) process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE = located;
803
+ CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
739
804
  // endpoint origin \u5BF9\u9F50\uFF082026-09-29 \u8FC1\u79FB\u540C\u6B65\uFF09\uFF1ACLI \u6309 ZCODE_BASE_URL \u6D3E\u751F active
740
805
  // \u76EE\u5F55\u8DEF\u5F84\uFF08sha256(origin) \u524D\u7F00\uFF09\uFF1BGUI \u5B89\u88C5\u7684\u76EE\u5F55\u5728 refresh \u63A7\u5236\u6587\u4EF6\u7684 endpointKey
741
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
@@ -755,6 +820,115 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
755
820
  }
756
821
  }
757
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
+
758
932
  // \u4E0A\u6E38 provider bootstrap \u4EE5 argv[1] \u4E3A\u5165\u53E3\u951A\uFF0C\u4ECE\u8BE5\u8DEF\u5F84\u90BB\u8FD1\u5B9A\u4F4D CLI \u5185\u5EFA
759
933
  // provider \u914D\u7F6E\u2014\u2014wrapper \u5F62\u6001\u4E0B argv[1] = \u672C wrapper \u843D\u76D8\u8DEF\u5F84\uFF0Cbootstrap \u4F1A\u5728
760
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
@@ -2156,6 +2330,7 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
2156
2330
  var logger4 = (0, import_subagent_engine_sdk11.getLogger)("subagents");
2157
2331
  var PROBE_VERSION_TIMEOUT_MS = 15e3;
2158
2332
  var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
2333
+ var OFF_FAMILY_THINKING_LEVELS = /* @__PURE__ */ new Set(["off", "minimal"]);
2159
2334
  var ZcodeEngine = class {
2160
2335
  id = ZCODE_ENGINE_ID;
2161
2336
  deps;
@@ -2368,7 +2543,7 @@ var ZcodeEngine = class {
2368
2543
  */
2369
2544
  async attemptAppServerTurn(task, ctx, modelRef, cwd, prompt, opts = {}) {
2370
2545
  const rt = this.ensureAppServerRuntime();
2371
- 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;
2372
2547
  const createParams = buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel);
2373
2548
  let currentSessionId;
2374
2549
  let signalSessionCreated;
@@ -2665,16 +2840,30 @@ var ZcodeEngine = class {
2665
2840
  listModels() {
2666
2841
  return listZcodeModels(this.deps.sources);
2667
2842
  }
2668
- /** 显式模型的最小 reasoning 档(目录 modelRules 值域;per-modelRef 记忆化——
2843
+ /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
2669
2844
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
2670
2845
  reasoningMemo = /* @__PURE__ */ new Map();
2671
- 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) {
2672
2856
  const memoKey = `${locateZcodeBuiltinCatalog(this.deps.sources) ?? "none"}|${modelRef}`;
2673
- const hit = this.reasoningMemo.get(memoKey);
2674
- if (hit !== void 0 || this.reasoningMemo.has(memoKey)) return hit;
2675
- const level = resolveZcodeMinimalReasoningLevel(modelRef, this.deps.sources);
2676
- this.reasoningMemo.set(memoKey, level);
2677
- 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];
2678
2867
  }
2679
2868
  /**
2680
2869
  * [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
@@ -2760,13 +2949,17 @@ var ZcodeEngine = class {
2760
2949
  * COMMON_THOUGHT_LEVELS 之外的档位出声一行提示(措辞是「若不支持将被忽略/回落」的
2761
2950
  * 或然警告,非无效断言);是否真不支持由目标模型决定,core 不做权威校验(引擎层
2762
2951
  * 不掌握各模型值域)。
2952
+ *
2953
+ * [2026-10-14 措辞同步] thoughtLevel 下发值已改为「按目录值域解析后的档位」
2954
+ * (reasoning 唯一生效通道,见 buildAppServerCreateParams 头注):有值域时
2955
+ * off/minimal 归一最小档、非命中档取非最小档末值;无值域时维持恒等透传。
2763
2956
  */
2764
2957
  warnThoughtLevelUncommon(task, ctx) {
2765
2958
  const thoughtLevel = task.thinkingLevel?.trim();
2766
2959
  if (thoughtLevel === void 0 || thoughtLevel === "") return;
2767
2960
  if (COMMON_THOUGHT_LEVELS.includes(thoughtLevel)) return;
2768
2961
  logger4.warn(
2769
- `[zcode-engine] thinkingLevel=${thoughtLevel} \u5DF2\u900F\u4F20\u4E3A thoughtLevel\uFF08\u975E\u5E38\u89C1\u6863\u4F4D\uFF09\uFF1A\u82E5\u76EE\u6807\u6A21\u578B\u4E0D\u652F\u6301\u8BE5\u6863\u4F4D\u5C06\u88AB\u5FFD\u7565/\u56DE\u843D\u5230\u6A21\u578B\u7F3A\u7701\u63A8\u7406\u6863\u4F4D\uFF08\u5E38\u89C1\u6863\u4F4D\uFF1A${COMMON_THOUGHT_LEVELS.join("/")}\uFF09\uFF1B\u6863\u4F4D\u662F\u5426\u751F\u6548\u4EE5\u6A21\u578B\u5B9E\u9645\u884C\u4E3A\u4E3A\u51C6`,
2962
+ `[zcode-engine] thinkingLevel=${thoughtLevel}\uFF08\u975E\u5E38\u89C1\u6863\u4F4D\uFF09\u2192 \u6309\u6A21\u578B reasoning \u503C\u57DF\u89E3\u6790\u540E\u4E0B\u53D1 thoughtLevel\uFF08\u65E0\u503C\u57DF\u65F6\u6052\u7B49\u900F\u4F20\uFF1Boff/minimal \u5F52\u4E00\u6700\u5C0F\u6863\uFF0C\u975E\u547D\u4E2D\u6863\u53D6\u975E\u6700\u5C0F\u6863\u672B\u503C\uFF1B\u82E5\u76EE\u6807\u6A21\u578B\u4E0D\u652F\u6301\u5C06\u88AB\u5FFD\u7565/\u56DE\u843D\u5230\u6A21\u578B\u7F3A\u7701\u63A8\u7406\u6863\u4F4D\uFF0C\u5E38\u89C1\u6863\u4F4D\uFF1A${COMMON_THOUGHT_LEVELS.join("/")}\uFF09`,
2770
2963
  { taskId: ctx.taskId }
2771
2964
  );
2772
2965
  }
@@ -2956,7 +3149,7 @@ Answer again. Output ONLY the JSON value conforming to the schema above \u2014 n
2956
3149
  }
2957
3150
  function buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel) {
2958
3151
  const denyTools = (task.denyTools ?? []).filter((t) => typeof t === "string" && t.trim() !== "");
2959
- const thoughtLevel = task.thinkingLevel?.trim();
3152
+ const thoughtLevel = reasoningLevel !== void 0 && reasoningLevel !== "" ? reasoningLevel : task.thinkingLevel?.trim();
2960
3153
  const model = modelRef !== void 0 && modelRef !== "" ? {
2961
3154
  ...splitZcodeModelRef(modelRef),
2962
3155
  ...reasoningLevel !== void 0 && reasoningLevel !== "" ? { options: { reasoningLevel } } : {}
package/dist/main.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngineProtocolServer
3
- } from "./chunk-33XN65H4.js";
3
+ } from "./chunk-L3M3CMFJ.js";
4
4
 
5
5
  // src/main.ts
6
6
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhushanwen/zcode-subagent-cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "zcode subagent engine as an independent CLI package (W5 of subagent-engine-protocolization): speaks engine-protocol v1 over NDJSON stdio, depends only on @zhushanwen/subagent-engine-sdk (never subagent-core)",
5
5
  "type": "module",
6
6
  "license": "MIT",