@zhushanwen/zcode-subagent-cli 0.7.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/index.cjs CHANGED
@@ -357,21 +357,6 @@ function locateZcodeBuiltinCatalog(sources) {
357
357
  }
358
358
  return void 0;
359
359
  }
360
- function resolveZcodeMinimalReasoningLevel(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)?.[0];
374
- }
375
360
  function lastMatchingReasoningValues(modelRules, modelId) {
376
361
  let values;
377
362
  for (const rule of modelRules) {
@@ -380,7 +365,7 @@ function lastMatchingReasoningValues(modelRules, modelId) {
380
365
  if (typeof match !== "string") continue;
381
366
  let re;
382
367
  try {
383
- re = new RegExp(match);
368
+ re = new RegExp(match, "i");
384
369
  } catch {
385
370
  continue;
386
371
  }
@@ -392,6 +377,21 @@ function lastMatchingReasoningValues(modelRules, modelId) {
392
377
  }
393
378
  return values;
394
379
  }
380
+ function resolveZcodeReasoningValues(modelRef, sources) {
381
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
382
+ if (catalogPath === void 0) return void 0;
383
+ let parsed;
384
+ try {
385
+ parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
386
+ } catch {
387
+ return void 0;
388
+ }
389
+ const modelId = modelShort(modelRef);
390
+ const rules = parsed["config"];
391
+ const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
392
+ if (!Array.isArray(modelRules)) return void 0;
393
+ return lastMatchingReasoningValues(modelRules, modelId);
394
+ }
395
395
  function defaultProviderForShortName(conf, withKey) {
396
396
  const ordered = conf.order.find((id) => {
397
397
  const entry = conf.providers.get(id);
@@ -400,6 +400,49 @@ function defaultProviderForShortName(conf, withKey) {
400
400
  if (ordered !== void 0) return ordered;
401
401
  return withKey[0][0];
402
402
  }
403
+ function resolveAccountModelRef(wanted, wantedProvider, sources) {
404
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
405
+ if (catalogPath === void 0) {
406
+ throw new ZcodePrepareError(
407
+ "model_not_available",
408
+ `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`
409
+ );
410
+ }
411
+ let catalog;
412
+ try {
413
+ catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
414
+ } catch (err) {
415
+ throw new ZcodePrepareError(
416
+ "model_not_available",
417
+ `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`
418
+ );
419
+ }
420
+ const accountRule = findAccountProviderRule(catalog, wantedProvider);
421
+ if (accountRule === void 0) {
422
+ throw new ZcodePrepareError(
423
+ "model_not_available",
424
+ `\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`
425
+ );
426
+ }
427
+ assertAccountModelKnown(accountRule, wanted, wantedProvider);
428
+ return wanted;
429
+ }
430
+ function findAccountProviderRule(catalog, wantedProvider) {
431
+ const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
432
+ const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
433
+ return isRecord(accountRule) ? accountRule : void 0;
434
+ }
435
+ function assertAccountModelKnown(accountRule, wanted, wantedProvider) {
436
+ const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
437
+ const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
438
+ const short = modelShort(wanted);
439
+ if (Array.isArray(modelIds) && modelIds.length > 0 && !modelIds.includes(short)) {
440
+ throw new ZcodePrepareError(
441
+ "model_not_available",
442
+ `\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
443
+ );
444
+ }
445
+ }
403
446
  function resolveZcodeModelRef(requested, sources) {
404
447
  const { conf, sourceDesc } = readPersonalProviderView(sources);
405
448
  const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
@@ -412,6 +455,10 @@ function resolveZcodeModelRef(requested, sources) {
412
455
  );
413
456
  }
414
457
  if (wanted === void 0) return "";
458
+ const wantedProvider = wanted.includes("/") ? providerOf(wanted) : void 0;
459
+ if (wantedProvider !== void 0 && wantedProvider.startsWith("account:")) {
460
+ return resolveAccountModelRef(wanted, wantedProvider, sources);
461
+ }
415
462
  const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
416
463
  const short = modelShort(wanted);
417
464
  const entry = conf.providers.get(provider);
@@ -498,7 +545,7 @@ function injectedConfigText() {
498
545
  let v2 = {};
499
546
  try { v2 = JSON.parse(readOrig(V2_PATH, 'utf8')); }
500
547
  catch (err) {
501
- // 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
548
+ // 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
502
549
  // \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
503
550
  if (!err || err.code !== 'ENOENT') {
504
551
  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');
@@ -653,60 +700,72 @@ if (!CLI_PATH) {
653
700
  process.exit(2);
654
701
  }
655
702
 
656
- const text = injectedConfigText();
657
- if (text !== null) {
658
- // 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
659
- // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
660
- // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
661
- const shape = (args, value) => {
662
- const enc = args[0];
663
- const e = typeof enc === 'string' ? enc
664
- : (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
665
- if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
666
- return Buffer.from(value);
667
- };
668
- fs.__origReadFileSync = fs.readFileSync;
669
- fs.readFileSync = function (p, ...rest) {
670
- if (typeof p === 'string' && p === CONFIG_PATH) {
671
- const cur = injectedConfigText();
672
- if (cur !== null) return shape(rest, cur);
673
- }
674
- // D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
675
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
676
- const cur = mergedProviderConfigText();
677
- if (cur !== null) return shape(rest, cur);
678
- }
679
- return fs.__origReadFileSync.call(fs, p, ...rest);
680
- };
681
- fs.promises.__origReadFile = fs.promises.readFile;
682
- fs.promises.readFile = function (p, ...rest) {
683
- if (typeof p === 'string' && p === CONFIG_PATH) {
684
- const cur = injectedConfigText();
685
- if (cur !== null) return Promise.resolve(shape(rest, cur));
686
- }
687
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
688
- const cur = mergedProviderConfigText();
689
- if (cur !== null) return Promise.resolve(shape(rest, cur));
690
- }
691
- return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
692
- };
693
- // existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
694
- // \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
695
- // \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
696
- // D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
697
- //\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
698
- fs.__origExistsSync = fs.existsSync;
699
- fs.existsSync = function (p) {
700
- if (typeof p === 'string' && p === CONFIG_PATH) {
701
- const cur = injectedConfigText();
702
- if (cur !== null) return true;
703
+ // [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
704
+ // app-server \u6CE8\u518C\u8868\u88C5\u8F7D\u5224\u636E = access.entitled === true\uFF0C\u5916\u90E8 spawn \u4ECE\u76EE\u5F55\u6784\u5EFA\u7684\u8D26\u53F7
705
+ // \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
706
+ // 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
707
+ // ZCode.app \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\u3002null = \u76EE\u5F55\u65E0 zhipu-account \u6761\u76EE\uFF08\u65E0\u9700 patch\uFF09\u3002
708
+ // \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
709
+ // \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
710
+ let CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
711
+ const __catalogPatchCache = new Map();
712
+ // \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
713
+ // \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
714
+ const __catalogPatchStatus = new Map(); // path -> 'no-entries' | 'unreadable'
715
+ function catalogPatchText(path) {
716
+ if (__catalogPatchCache.has(path)) return __catalogPatchCache.get(path);
717
+ let result = null;
718
+ try {
719
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
720
+ const parsed = JSON.parse(readOrig(path, 'utf8'));
721
+ const rules = parsed && parsed.config && parsed.config.providerConfigRules
722
+ && Array.isArray(parsed.config.providerConfigRules.providerRules)
723
+ ? parsed.config.providerConfigRules.providerRules : null;
724
+ let touched = 0;
725
+ if (rules) for (const rule of rules) {
726
+ const acc = rule && rule.config && rule.config.access;
727
+ if (acc && acc.type === 'zhipu-account' && acc.entitled !== true) { acc.entitled = true; touched++; }
728
+ }
729
+ result = touched > 0 ? JSON.stringify(parsed) : null;
730
+ __catalogPatchStatus.set(path, 'no-entries');
731
+ } catch { result = null; __catalogPatchStatus.set(path, 'unreadable'); }
732
+ __catalogPatchCache.set(path, result);
733
+ return result;
734
+ }
735
+
736
+ // [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
737
+ // \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
738
+ // \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
739
+ // \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
740
+ // \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
741
+ // \u4E0D\u53D7\u5F71\u54CD\u3002
742
+ const __cliPatchCache = new Map();
743
+ function patchedCliSource(path) {
744
+ if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
745
+ let result = null;
746
+ try {
747
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
748
+ const src = readOrig(path, 'utf8');
749
+ // \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
750
+ // \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
751
+ // \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
752
+ // \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
753
+ // \u8FDB app-server stderr \u65E5\u5FD7\uFF09\uFF0C\u4E2A\u4EBA provider \u4E0D\u53D7\u5F71\u54CD\u3002
754
+ const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
755
+ if (anchorIdx >= 0) {
756
+ const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
757
+ if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
758
+ result = src.slice(0, anchorIdx)
759
+ + window.split('entitled:!1').join('entitled:!0')
760
+ + src.slice(anchorIdx + 600);
761
+ }
703
762
  }
704
- if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
705
- if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
706
- return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
763
+ if (result === null) {
764
+ process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated, personal providers unaffected\\n');
707
765
  }
708
- return fs.__origExistsSync.call(fs, p);
709
- };
766
+ } catch { result = null; }
767
+ __cliPatchCache.set(path, result);
768
+ return result;
710
769
  }
711
770
 
712
771
  // \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
@@ -715,6 +774,11 @@ if (text !== null) {
715
774
  // <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
716
775
  // \uFF08semver \u6700\u5927\uFF09\u7684 endpoint-*/zcode-builtin.json \u2192 \u90FD\u627E\u4E0D\u5230\u5219\u4E0D\u8BBE\u952E\uFF0C\u8BA9 CLI
717
776
  // \u539F\u751F\u62A5\u9519\u900F\u51FA\uFF08\u9519\u8BEF\u6587\u6848\u542B\u6062\u590D\u6307\u5F15\uFF09\u3002
777
+ // [\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
778
+ // \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
779
+ // fs.readFileSync(undefined) \u629B\u9519\u88AB catch \u6052\u8FD4 null \u2192 \u95E8\u9000\u5316\u4E3A text!==null\uFF0C
780
+ // \u7EAF account \u5BBF\u4E3B\uFF08v2 \u65E0\u51ED\u636E\u6761\u76EE \u2192 text=null\uFF09\u4E0B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\u3001account
781
+ // \u76F4\u901A\u6574\u4F53\u5931\u6548\u4E14\u96F6\u65E5\u5FD7\uFF082026-10 \u56DE\u5F52\u4FEE\u590D\uFF09\u3002
718
782
  if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
719
783
  let located = null;
720
784
  try {
@@ -756,6 +820,7 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
756
820
  }
757
821
  } catch { /* provider \u76EE\u5F55\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 \u4E0D\u8BBE\u952E */ }
758
822
  if (located) process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE = located;
823
+ CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
759
824
  // endpoint origin \u5BF9\u9F50\uFF082026-09-29 \u8FC1\u79FB\u540C\u6B65\uFF09\uFF1ACLI \u6309 ZCODE_BASE_URL \u6D3E\u751F active
760
825
  // \u76EE\u5F55\u8DEF\u5F84\uFF08sha256(origin) \u524D\u7F00\uFF09\uFF1BGUI \u5B89\u88C5\u7684\u76EE\u5F55\u5728 refresh \u63A7\u5236\u6587\u4EF6\u7684 endpointKey
761
826
  // \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
@@ -775,6 +840,115 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
775
840
  }
776
841
  }
777
842
 
843
+ // \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
844
+ // \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
845
+ // Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
846
+ const text = injectedConfigText();
847
+ const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
848
+ if (text !== null || catalogPatch !== null) {
849
+ process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
850
+ + ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
851
+ + ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off') + ', cli-source-bypass=armed\\n');
852
+ // 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
853
+ // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
854
+ // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
855
+ // shape \u540C\u65F6\u670D\u52A1\u56DB\u5904 patch \u6E90\uFF08config / provider merge / \u5185\u5EFA\u76EE\u5F55 / \u2014\u2014encoding \u5F52\u4E00
856
+ // \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
857
+ const shape = (args, value) => {
858
+ const enc = args[0];
859
+ const e = typeof enc === 'string' ? enc
860
+ : (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
861
+ if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
862
+ return Buffer.from(value);
863
+ };
864
+ fs.__origReadFileSync = fs.readFileSync;
865
+ fs.readFileSync = function (p, ...rest) {
866
+ if (typeof p === 'string' && p === CONFIG_PATH) {
867
+ const cur = injectedConfigText();
868
+ if (cur !== null) return shape(rest, cur);
869
+ }
870
+ // D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
871
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
872
+ const cur = mergedProviderConfigText();
873
+ if (cur !== null) return shape(rest, cur);
874
+ }
875
+ // account \u76F4\u901A\uFF1A\u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6 \u2192 zhipu-account \u6CE8\u5165 entitled:true\u3002\u6309\u6587\u4EF6\u540D\u5339\u914D
876
+ // \uFF08app-server \u6309 ZCODE_BASE_URL \u81EA\u6D3E\u751F endpoint \u76EE\u5F55\uFF0C\u8BFB\u8DEF\u5F84\u2260env \u5B9A\u4F4D\u8DEF\u5F84\uFF09\u3002
877
+ if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
878
+ const cur = catalogPatchText(p);
879
+ if (cur !== null) return shape(rest, cur);
880
+ }
881
+ // account \u76F4\u901A\u2461\uFF1ACLI bundle \u6E90\u7801 \u2192 YXe entitled:!1 \u5185\u5B58\u7FFB\u8F6C\u4E3A !0
882
+ if (typeof p === 'string' && p === CLI_PATH) {
883
+ const cur = patchedCliSource(p);
884
+ if (cur !== null) return cur;
885
+ }
886
+ return fs.__origReadFileSync.call(fs, p, ...rest);
887
+ };
888
+ fs.promises.__origReadFile = fs.promises.readFile;
889
+ fs.promises.readFile = function (p, ...rest) {
890
+ if (typeof p === 'string' && p === CONFIG_PATH) {
891
+ const cur = injectedConfigText();
892
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
893
+ }
894
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
895
+ const cur = mergedProviderConfigText();
896
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
897
+ }
898
+ if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
899
+ const cur = catalogPatchText(p);
900
+ if (cur !== null) return Promise.resolve(shape(rest, cur));
901
+ }
902
+ if (typeof p === 'string' && p === CLI_PATH) {
903
+ const cur = patchedCliSource(p);
904
+ if (cur !== null) return Promise.resolve(cur);
905
+ }
906
+ return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
907
+ };
908
+ // [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
909
+ // internalModuleReadFile \u901A\u9053\uFF0Cfs \u7334\u8865\u4E01\u4E0D\u53EF\u89C1\u2014\u2014CLI bundle \u6E90\u7801\u8865\u4E01\u6539\u5728\u6269\u5C55
910
+ // \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
911
+ const __Module = require('node:module');
912
+ const __origJsHandler = __Module._extensions['.js'];
913
+ __Module._extensions['.js'] = function (mod, filename) {
914
+ if (CLI_PATH && filename === CLI_PATH) {
915
+ const patched = patchedCliSource(filename);
916
+ if (patched !== null) {
917
+ let src = patched.charCodeAt(0) === 0xfeff ? patched.slice(1) : patched;
918
+ if (src.startsWith('#!')) src = src.slice(src.indexOf('\\n') + 1);
919
+ return mod._compile(src, filename);
920
+ }
921
+ }
922
+ return __origJsHandler(mod, filename);
923
+ };
924
+
925
+ // existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
926
+ // \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
927
+ // \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
928
+ // D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
929
+ //\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
930
+ fs.__origExistsSync = fs.existsSync;
931
+ fs.existsSync = function (p) {
932
+ if (typeof p === 'string' && p === CONFIG_PATH) {
933
+ const cur = injectedConfigText();
934
+ if (cur !== null) return true;
935
+ }
936
+ if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
937
+ if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
938
+ return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
939
+ }
940
+ return fs.__origExistsSync.call(fs, p);
941
+ };
942
+ } else {
943
+ 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)'
944
+ + (CATALOG_PATH !== null
945
+ ? (__catalogPatchStatus.get(CATALOG_PATH) === 'unreadable'
946
+ ? '; \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)'
947
+ : '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46\u65E0 zhipu-account \u6761\u76EE\u9700\u8865(\u76EE\u5F55\u8BFB\u53D6\u539F\u751F\u900F\u51FA)')
948
+ : '; \u5185\u5EFA\u76EE\u5F55\u672A\u5B9A\u4F4D(env \u672A\u8BBE\u4E14\u81EA\u5B9A\u4F4D\u672A\u547D\u4E2D)')
949
+ + '\\n');
950
+ }
951
+
778
952
  // \u4E0A\u6E38 provider bootstrap \u4EE5 argv[1] \u4E3A\u5165\u53E3\u951A\uFF0C\u4ECE\u8BE5\u8DEF\u5F84\u90BB\u8FD1\u5B9A\u4F4D CLI \u5185\u5EFA
779
953
  // provider \u914D\u7F6E\u2014\u2014wrapper \u5F62\u6001\u4E0B argv[1] = \u672C wrapper \u843D\u76D8\u8DEF\u5F84\uFF0Cbootstrap \u4F1A\u5728
780
954
  // wrapper \u90BB\u57DF\u627E provider \u914D\u7F6E\u800C\u5931\u8D25\uFF08\u771F\u673A\u62A5\u300C\u65E0\u6CD5\u5B9A\u4F4D CLI ZCode Built-in Provider
@@ -2176,6 +2350,7 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
2176
2350
  var logger4 = (0, import_subagent_engine_sdk11.getLogger)("subagents");
2177
2351
  var PROBE_VERSION_TIMEOUT_MS = 15e3;
2178
2352
  var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
2353
+ var OFF_FAMILY_THINKING_LEVELS = /* @__PURE__ */ new Set(["off", "minimal"]);
2179
2354
  var ZcodeEngine = class {
2180
2355
  id = ZCODE_ENGINE_ID;
2181
2356
  deps;
@@ -2388,7 +2563,7 @@ var ZcodeEngine = class {
2388
2563
  */
2389
2564
  async attemptAppServerTurn(task, ctx, modelRef, cwd, prompt, opts = {}) {
2390
2565
  const rt = this.ensureAppServerRuntime();
2391
- const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.minimalReasoningFor(modelRef) : void 0;
2566
+ const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.reasoningLevelFor(modelRef, task.thinkingLevel) : void 0;
2392
2567
  const createParams = buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel);
2393
2568
  let currentSessionId;
2394
2569
  let signalSessionCreated;
@@ -2685,16 +2860,30 @@ var ZcodeEngine = class {
2685
2860
  listModels() {
2686
2861
  return listZcodeModels(this.deps.sources);
2687
2862
  }
2688
- /** 显式模型的最小 reasoning 档(目录 modelRules 值域;per-modelRef 记忆化——
2863
+ /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
2689
2864
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
2690
2865
  reasoningMemo = /* @__PURE__ */ new Map();
2691
- minimalReasoningFor(modelRef) {
2866
+ /**
2867
+ * create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
2868
+ * - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
2869
+ * - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
2870
+ * 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
2871
+ * - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
2872
+ * (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
2873
+ * disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
2874
+ */
2875
+ reasoningLevelFor(modelRef, thinkingLevel) {
2692
2876
  const memoKey = `${locateZcodeBuiltinCatalog(this.deps.sources) ?? "none"}|${modelRef}`;
2693
- const hit = this.reasoningMemo.get(memoKey);
2694
- if (hit !== void 0 || this.reasoningMemo.has(memoKey)) return hit;
2695
- const level = resolveZcodeMinimalReasoningLevel(modelRef, this.deps.sources);
2696
- this.reasoningMemo.set(memoKey, level);
2697
- return level;
2877
+ const memoHit = this.reasoningMemo.get(memoKey);
2878
+ const domain = memoHit !== void 0 || this.reasoningMemo.has(memoKey) ? memoHit : resolveZcodeReasoningValues(modelRef, this.deps.sources);
2879
+ this.reasoningMemo.set(memoKey, domain);
2880
+ if (domain === void 0 || domain.length === 0) return void 0;
2881
+ const requested = thinkingLevel?.trim();
2882
+ if (requested === void 0 || requested === "") return domain[0];
2883
+ if (domain.includes(requested)) return requested;
2884
+ if (OFF_FAMILY_THINKING_LEVELS.has(requested)) return domain[0];
2885
+ const nonMinimal = domain.slice(1);
2886
+ return nonMinimal.length > 0 ? nonMinimal[nonMinimal.length - 1] : domain[0];
2698
2887
  }
2699
2888
  /**
2700
2889
  * [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
package/dist/index.d.cts CHANGED
@@ -243,10 +243,19 @@ declare class ZcodeEngine implements EnginePort {
243
243
  id: string;
244
244
  name?: string;
245
245
  }>;
246
- /** 显式模型的最小 reasoning 档(目录 modelRules 值域;per-modelRef 记忆化——
246
+ /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
247
247
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
248
- private readonly reasoningMemo;
249
- private minimalReasoningFor;
248
+ private reasoningMemo;
249
+ /**
250
+ * create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
251
+ * - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
252
+ * - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
253
+ * 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
254
+ * - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
255
+ * (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
256
+ * disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
257
+ */
258
+ private reasoningLevelFor;
250
259
  /**
251
260
  * [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
252
261
  * 显式路径同一函数——canonicalRef 归一化、短名缺省 provider、凭据与清单校验单一
package/dist/index.d.ts CHANGED
@@ -243,10 +243,19 @@ declare class ZcodeEngine implements EnginePort {
243
243
  id: string;
244
244
  name?: string;
245
245
  }>;
246
- /** 显式模型的最小 reasoning 档(目录 modelRules 值域;per-modelRef 记忆化——
246
+ /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
247
247
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
248
- private readonly reasoningMemo;
249
- private minimalReasoningFor;
248
+ private reasoningMemo;
249
+ /**
250
+ * create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
251
+ * - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
252
+ * - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
253
+ * 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
254
+ * - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
255
+ * (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
256
+ * disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
257
+ */
258
+ private reasoningLevelFor;
250
259
  /**
251
260
  * [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
252
261
  * 显式路径同一函数——canonicalRef 归一化、短名缺省 provider、凭据与清单校验单一
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  readZcodeSessionView,
11
11
  zcodeDbPathAllowlist,
12
12
  zcodeSessionDbPath
13
- } from "./chunk-33XN65H4.js";
13
+ } from "./chunk-REEFBX67.js";
14
14
 
15
15
  // src/golden-sample.ts
16
16
  var ZCODE_APPSERVER_GOLDEN = {