@zhushanwen/zcode-subagent-cli 0.8.0 → 0.8.2

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.
@@ -634,41 +634,97 @@ function resolveAccountModelRef(wanted, wantedProvider, sources) {
634
634
  `\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`
635
635
  );
636
636
  }
637
- assertAccountModelKnown(accountRule, wanted, wantedProvider);
638
- return wanted;
637
+ return `${wantedProvider}/${normalizeAccountModel(accountRule, wanted, wantedProvider)}`;
639
638
  }
640
639
  function findAccountProviderRule(catalog, wantedProvider) {
641
640
  const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
642
641
  const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
643
642
  return isRecord(accountRule) ? accountRule : void 0;
644
643
  }
645
- function assertAccountModelKnown(accountRule, wanted, wantedProvider) {
644
+ function normalizeAccountModel(accountRule, wanted, wantedProvider) {
646
645
  const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
647
646
  const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
648
647
  const short = modelShort(wanted);
649
- if (Array.isArray(modelIds) && modelIds.length > 0 && !modelIds.includes(short)) {
648
+ if (!Array.isArray(modelIds) || modelIds.length === 0) return short;
649
+ const matched = modelIds.find((m) => typeof m === "string" && m.toLowerCase() === short.toLowerCase());
650
+ if (matched === void 0) {
650
651
  throw new ZcodePrepareError(
651
652
  "model_not_available",
652
- `\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
653
+ `\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.filter((m) => typeof m === "string").join(", ")}\uFF09\u3002`
653
654
  );
654
655
  }
656
+ return matched;
657
+ }
658
+ var PI_TO_ZCODE_PROVIDER_MAP = {
659
+ "zai-coding-cn": "account:bigmodel-individual-coding-plan"
660
+ };
661
+ function translatePiModelRefToZcode(requested, sources) {
662
+ if (!requested.includes("/")) return requested;
663
+ const piProvider = providerOf(requested);
664
+ const target = PI_TO_ZCODE_PROVIDER_MAP[piProvider];
665
+ if (target === void 0) return requested;
666
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
667
+ if (catalogPath === void 0) {
668
+ throw new ZcodePrepareError(
669
+ "model_not_available",
670
+ `\u6A21\u578B\u901A\u9053\u7FFB\u8BD1\u5931\u8D25\uFF1Api \u4FA7 "${piProvider}" \u5728 zcode \u4FA7\u5BF9\u5E94 ${target}\uFF0C\u4F46\u5185\u5EFA\u76EE\u5F55\u5B9A\u4F4D\u5931\u8D25\uFF08ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u4E0E runtime/provider \u626B\u63CF\u5747\u672A\u547D\u4E2D\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u786E\u8BA4 ZCode \u5DF2\u5B89\u88C5\u540E\u91CD\u8BD5\u3002`
671
+ );
672
+ }
673
+ let catalog;
674
+ try {
675
+ catalog = JSON.parse(fs2.readFileSync(catalogPath, "utf8"));
676
+ } catch (err) {
677
+ throw new ZcodePrepareError(
678
+ "model_not_available",
679
+ `\u6A21\u578B\u901A\u9053\u7FFB\u8BD1\u5931\u8D25\uFF1A\u5185\u5EFA\u76EE\u5F55\u4E0D\u53EF\u8BFB\uFF08${err instanceof Error ? err.message : String(err)}\uFF09\u3002`
680
+ );
681
+ }
682
+ const accountRule = findAccountProviderRule(catalog, target);
683
+ if (accountRule === void 0) {
684
+ throw new ZcodePrepareError(
685
+ "model_not_available",
686
+ `pi \u4FA7 "${piProvider}" \u7684 zcode \u5BF9\u5E94\u901A\u9053 ${target} \u4E0D\u53EF\u7528\uFF08\u5185\u5EFA\u76EE\u5F55\u65E0\u6B64\u89C4\u5219\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u5B8C\u6210\u8BE5 plan \u7684\u8D26\u53F7\u767B\u5F55/\u914D\u7F6E\u540E\u91CD\u8BD5\u3002`
687
+ );
688
+ }
689
+ const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
690
+ const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
691
+ if (!Array.isArray(modelIds) || modelIds.length === 0) {
692
+ return `${target}/${modelShort(requested)}`;
693
+ }
694
+ const wanted = modelShort(requested).toLowerCase();
695
+ const matched = modelIds.find((m) => typeof m === "string" && m.toLowerCase() === wanted);
696
+ if (matched === void 0) {
697
+ throw new ZcodePrepareError(
698
+ "model_not_available",
699
+ `\u6A21\u578B "${modelShort(requested)}" \u5728 ${target} \u4E0B\u65E0\u7B49\u4EF7\u6A21\u578B\uFF08\u53EF\u7528: ${modelIds.filter((m) => typeof m === "string").join(", ")}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u4E0A\u8FF0\u6A21\u578B\u4E4B\u4E00\uFF0C\u6216\u7701\u7565 model \u53C2\u6570\u8D70\u5F15\u64CE\u7F3A\u7701\u3002`
700
+ );
701
+ }
702
+ return `${target}/${matched}`;
703
+ }
704
+ function translateToAccountModelRef(wanted, sources) {
705
+ const translated = translatePiModelRefToZcode(wanted, sources);
706
+ const translatedProvider = translated.includes("/") ? providerOf(translated) : void 0;
707
+ if (translatedProvider !== void 0 && translatedProvider.startsWith("account:")) {
708
+ return resolveAccountModelRef(translated, translatedProvider, sources);
709
+ }
710
+ return void 0;
655
711
  }
656
712
  function resolveZcodeModelRef(requested, sources) {
657
713
  const { conf, sourceDesc } = readPersonalProviderView(sources);
658
714
  const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
659
715
  const wanted = requested?.trim() || void 0;
716
+ if (wanted !== void 0) {
717
+ const accountRef = translateToAccountModelRef(wanted, sources);
718
+ if (accountRef !== void 0) return accountRef;
719
+ }
660
720
  if (withKey.length === 0) {
661
721
  const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
662
722
  throw new ZcodePrepareError(
663
723
  "engine_credential_missing",
664
- `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
724
+ `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\u4E2D account: \u524D\u7F00\u7ECF\u8D26\u53F7 entitlement \u76F4\u901A\u53EF\u7528\uFF08builtin: \u524D\u7F00\u4E0D\u88C5\u8F7D\uFF0C\u4E0D\u53EF\u4F5C\u4E3A\u5F15\u64CE\u6A21\u578B\uFF09\u3002` + TAIJI_SYNC_GUIDANCE
665
725
  );
666
726
  }
667
727
  if (wanted === void 0) return "";
668
- const wantedProvider = wanted.includes("/") ? providerOf(wanted) : void 0;
669
- if (wantedProvider !== void 0 && wantedProvider.startsWith("account:")) {
670
- return resolveAccountModelRef(wanted, wantedProvider, sources);
671
- }
672
728
  const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
673
729
  const short = modelShort(wanted);
674
730
  const entry = conf.providers.get(provider);
@@ -697,16 +753,58 @@ function resolveZcodeModelRef(requested, sources) {
697
753
  function listZcodeModels(sources) {
698
754
  const { conf } = readPersonalProviderView(sources);
699
755
  const out = [];
756
+ const seen = /* @__PURE__ */ new Set();
700
757
  for (const [pid, entry] of conf.providers) {
701
758
  if (!hasApiKey(entry)) continue;
702
759
  const providerName = entry.providerName !== void 0 && entry.providerName.trim() !== "" ? entry.providerName.trim() : void 0;
703
760
  for (const model of entry.models ?? []) {
761
+ if (seen.has(`${pid}/${model}`)) continue;
762
+ seen.add(`${pid}/${model}`);
704
763
  out.push({
705
764
  id: `${pid}/${model}`,
706
765
  ...providerName !== void 0 ? { name: `${providerName} \xB7 ${model}` } : {}
707
766
  });
708
767
  }
709
768
  }
769
+ for (const entry of listAccountFamilyModels(sources)) {
770
+ if (seen.has(entry.id)) continue;
771
+ seen.add(entry.id);
772
+ out.push(entry);
773
+ }
774
+ return out;
775
+ }
776
+ function readCatalogProviderRules(catalog) {
777
+ const rules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
778
+ return Array.isArray(rules) ? rules : [];
779
+ }
780
+ function pushAccountFamilyRuleModels(rule, out) {
781
+ if (!isRecord(rule)) return;
782
+ const providerId = rule["providerId"];
783
+ if (typeof providerId !== "string" || !providerId.startsWith("account:")) return;
784
+ const cfg = isRecord(rule["config"]) ? rule["config"] : {};
785
+ const models = Array.isArray(cfg["builtinModelIds"]) ? cfg["builtinModelIds"] : cfg["personalModelIds"];
786
+ const providerName = typeof rule["providerName"] === "string" && rule["providerName"].trim() !== "" ? rule["providerName"].trim() : void 0;
787
+ for (const model of Array.isArray(models) ? models : []) {
788
+ if (typeof model !== "string" || model.trim() === "") continue;
789
+ out.push({
790
+ id: `${providerId}/${model}`,
791
+ ...providerName !== void 0 ? { name: `${providerName} \xB7 ${model}` } : {}
792
+ });
793
+ }
794
+ }
795
+ function listAccountFamilyModels(sources) {
796
+ const catalogPath = locateZcodeBuiltinCatalog(sources);
797
+ if (catalogPath === void 0) return [];
798
+ let catalog;
799
+ try {
800
+ catalog = JSON.parse(fs2.readFileSync(catalogPath, "utf8"));
801
+ } catch {
802
+ return [];
803
+ }
804
+ const out = [];
805
+ for (const rule of readCatalogProviderRules(catalog)) {
806
+ pushAccountFamilyRuleModels(rule, out);
807
+ }
710
808
  return out;
711
809
  }
712
810
 
@@ -717,6 +815,406 @@ import * as path3 from "path";
717
815
  // src/error-message.ts
718
816
  import { toErrorMessage } from "@zhushanwen/subagent-engine-sdk";
719
817
 
818
+ // src/appserver-launcher-patches.ts
819
+ var CLI_PATCH_SECTION = `
820
+ // [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
821
+ // \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
822
+ // \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
823
+ // \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
824
+ // \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
825
+ // \u4E0D\u53D7\u5F71\u54CD\u3002
826
+ // \u8865\u4E01\u6BB5\u5185\u8054\u626B\u63CF\u5668\uFF082026-10 review\xB7MF-1-5\uFF09\uFF1A\u8DF3\u8FC7\u5B57\u7B26\u4E32/\u6A21\u677F\u5B57\u9762\u91CF/\u6CE8\u91CA\uFF0C\u8BA9\u62EC\u53F7
827
+ // \u914D\u5E73\u4E0E\u53C2\u6570\u5207\u5206\u53EA\u5728\u4EE3\u7801\u9762\u4E0A\u8FDB\u884C\u2014\u2014bundle \u5185\u8054\u4E32\u91CC\u7684 ')' \u66FE\u628A\u8C03\u7528\u70B9\u53C2\u6570\u914D\u5E73\u5E26\u504F\u3002
828
+ // \u8FD4\u56DE -1 = \u8BE5\u4F4D\u7F6E\u4E0D\u662F\u5B57\u9762\u91CF/\u6CE8\u91CA\u8D77\u70B9\uFF08\u6B63\u5E38\u4EE3\u7801\u5B57\u7B26\uFF09\u3002
829
+ function __skipLiteralOrComment(src, i) {
830
+ const ch = src[i];
831
+ if (ch === '"' || ch === "'") {
832
+ i++;
833
+ while (i < src.length) {
834
+ if (src.charCodeAt(i) === 92) { i += 2; continue; }
835
+ if (src[i] === ch) return i + 1;
836
+ i++;
837
+ }
838
+ return i;
839
+ }
840
+ if (ch === '\`') {
841
+ i++;
842
+ while (i < src.length) {
843
+ if (src.charCodeAt(i) === 92) { i += 2; continue; }
844
+ const c = src[i];
845
+ if (c === '\`') return i + 1;
846
+ if (c === '$' && src[i + 1] === '{') {
847
+ let depth = 1;
848
+ i += 2;
849
+ while (i < src.length && depth > 0) {
850
+ const cc = src[i];
851
+ if (cc === '"' || cc === "'" || cc === '\`') { i = __skipLiteralOrComment(src, i); continue; }
852
+ if (cc === '/' && src[i + 1] === '/') { const nl = src.indexOf('\\n', i + 2); i = nl < 0 ? src.length : nl + 1; continue; }
853
+ if (cc === '/' && src[i + 1] === '*') { const end = src.indexOf('*/', i + 2); i = end < 0 ? src.length : end + 2; continue; }
854
+ if (cc === '{') depth++;
855
+ else if (cc === '}') depth--;
856
+ i++;
857
+ }
858
+ continue;
859
+ }
860
+ i++;
861
+ }
862
+ return i;
863
+ }
864
+ if (ch === '/' && src[i + 1] === '/') {
865
+ const nl = src.indexOf('\\n', i + 2);
866
+ return nl < 0 ? src.length : nl + 1;
867
+ }
868
+ if (ch === '/' && src[i + 1] === '*') {
869
+ const end = src.indexOf('*/', i + 2);
870
+ return end < 0 ? src.length : end + 2;
871
+ }
872
+ return -1;
873
+ }
874
+ // \u4E0E openIdx \u5904 '(' \u914D\u5BF9\u7684\u95ED\u62EC\u53F7\uFF08\u8DF3\u8FC7\u5B57\u9762\u91CF/\u6CE8\u91CA\uFF09\uFF1B-1 = \u4E0D\u914D\u5E73\u3002
875
+ function __matchingParen(src, openIdx) {
876
+ let depth = 0;
877
+ for (let i = openIdx; i < src.length; i++) {
878
+ const skip = __skipLiteralOrComment(src, i);
879
+ if (skip >= 0) { i = skip - 1; continue; }
880
+ const c = src[i];
881
+ if (c === '(') depth++;
882
+ else if (c === ')') { depth--; if (depth === 0) return i; }
883
+ }
884
+ return -1;
885
+ }
886
+ // [start,end) \u5185\u6309\u9876\u5C42\u9017\u53F7\u5207\u5206\uFF08\u62EC\u53F7/\u65B9\u62EC\u53F7/\u5BF9\u8C61\u5B57\u9762\u91CF\u4E0E\u5B57\u9762\u91CF\u5185\u7684\u9017\u53F7\u4E0D\u8BA1\uFF09\uFF1B
887
+ // \u8FD4\u56DE\u7EDD\u5BF9\u504F\u79FB\u6BB5\u5217\u8868\u3002
888
+ function __splitTopLevel(src, start, end) {
889
+ const parts = [];
890
+ let depth = 0;
891
+ let segStart = start;
892
+ for (let i = start; i < end; i++) {
893
+ const skip = __skipLiteralOrComment(src, i);
894
+ if (skip >= 0) { i = Math.min(skip, end) - 1; continue; }
895
+ const c = src[i];
896
+ if (c === '(' || c === '[' || c === '{') depth++;
897
+ else if (c === ')' || c === ']' || c === '}') depth--;
898
+ else if (c === ',' && depth === 0) { parts.push({ start: segStart, end: i }); segStart = i + 1; }
899
+ }
900
+ parts.push({ start: segStart, end: end });
901
+ return parts;
902
+ }
903
+ const __cliPatchCache = new Map();
904
+ // \u5E94\u7528\u6001\u6807\u5FD7\u53D1\u5E03\uFF082026-10 review\uFF09\uFF1A\u5B89\u88C5\u95E8\u66FE\u4EE5\u8865\u4E01\u4EA7\u7269\u5B50\u4E32\u5224\u5B9A header-port\u2014\u2014\u771F\u5B9E
905
+ // 3.15.3 bundle \u672C\u5C31\u542B 8 \u5904 'providerRuntimeHeadersPort:'\uFF082 \u5904 ',providerRuntimeHeadersPort:'\uFF09
906
+ // \u2192 \u5B50\u4E32\u5224\u5B9A\u6052\u771F\u3001\u5BF9\u951A\u70B9\u6F02\u79FB\u96F6\u68C0\u6D4B\u529B\u3002\u6539\u7531\u8865\u4E01\u51FD\u6570\u672C\u8EAB\u53D1\u5E03 {entitled,standalone,
907
+ // headerPort}\uFF08\u7F13\u5B58\u547D\u4E2D\u4ECD\u53EF\u8BFB\uFF09\uFF0C\u95E8\u53EA\u8BFB\u6807\u5FD7\uFF08\u4E09\u5904\u5224\u5B9A\u5404\u81EA\u5177\u540D\uFF0C\u6F02\u79FB\u4E0D\u9759\u9ED8\uFF09\u3002
908
+ const __cliPatchStatus = new Map();
909
+ function patchedCliSource(path) {
910
+ if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
911
+ let result = null;
912
+ let entitledApplied = false;
913
+ let standaloneApplied = false;
914
+ let portInjected = false;
915
+ try {
916
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
917
+ let src = readOrig(path, 'utf8');
918
+ // \u2460 \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
919
+ // \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
920
+ // \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
921
+ // \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
922
+ // \u8FDB app-server stderr \u65E5\u5FD7\uFF09\u3002
923
+ const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
924
+ if (anchorIdx >= 0) {
925
+ const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
926
+ if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
927
+ src = src.slice(0, anchorIdx)
928
+ + window.split('entitled:!1').join('entitled:!0')
929
+ + src.slice(anchorIdx + 600);
930
+ entitledApplied = true;
931
+ }
932
+ }
933
+ if (!entitledApplied) {
934
+ process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated\\n');
935
+ }
936
+ // \u2461 [2026-10-16 standalone account] \u534F\u8BAE\u8DEF\u5F84\u7684 provider registry \u6052\u4EE5 host-account
937
+ // \u6A21\u5F0F\u521B\u5EFA\uFF08\u6E90\u7801\uFF1Acreate:r(()=>xCt(z),"create") \u4E0D\u4F20 standalone\uFF09\u2014\u2014\u8BE5\u6A21\u5F0F\u4E0B
938
+ // account \u65CF\u8BF7\u6C42\u5FC5\u987B\u7531\u5BBF\u4E3B\u5E94\u7B54 providerRuntimeHeaders\uFF1Btaiji \u7684 headless spawn \u65E0
939
+ // \u5BBF\u4E3B\u53C2\u4E0E\u8BE5\u534F\u8BAE\uFF0C\u5E94\u7B54\u5E27\u7578\u5F62 \u2192 zod invalid_union(headersApplied)\uFF082026-10-16 \u771F\u673A
940
+ // \u4E8B\u6545\u6839\u56E0\uFF1B\u5BBF\u4E3B\u65E5\u5FD7\u96F6\u8E2A\u8FF9 = \u8BF7\u6C42\u4ECE\u672A\u5230\u8FBE\u4EFB\u4F55 host \u5B9E\u73B0\uFF09\u3002\u672C\u8865\u4E01\u7ED9\u8BE5\u8C03\u7528\u6CE8\u5165
941
+ // {standalone:{}}\uFF1Astandalone \u6A21\u5F0F\u81EA\u5EFA\u672C\u5730\u8D26\u53F7\u6E90\uFF08entitled \u7531\u51ED\u636E\u5B58\u5728\u6027\u8BA1\u7B97\uFF0C
942
+ // \u8BFB credentials.json\uFF09\u5E76\u6CE8\u5165\u672C\u5730 providerRuntimeHeaders \u7AEF\u53E3\u2014\u2014\u8D26\u53F7\u65CF\u5168\u94FE\u672C\u5730
943
+ // \u5B8C\u6210\u3001\u96F6\u5BBF\u4E3B\u4F9D\u8D56\u3002\u951A\u70B9\u4E24\u5904\u7A33\u5B9A\u4E32\uFF08\u975E minified\uFF09\uFF1A\u6A21\u5757\u5BFC\u51FA\u6620\u5C04
944
+ // startProcessProviderRegistryRuntime:()=> \u53D6\u51FD\u6570\u540D + \u8C03\u7528\u70B9 create:r(()=><fn>(\u3002
945
+ const exportAnchor = 'startProcessProviderRegistryRuntime:()=>';
946
+ const exportIdx = src.indexOf(exportAnchor);
947
+ if (exportIdx >= 0) {
948
+ // \u540D\u79F0\u5C3E\u90E8\u987B\u662F\u5206\u9694\u7B26\uFF08\u771F\u5B9E\u5F62\u6001 = \u5BFC\u51FA\u6620\u5C04\u5BF9\u8C61 ',' / '}'\uFF09\uFF1A'{0,10}' \u4E0A\u9650\u4F1A\u9759\u9ED8
949
+ // \u622A\u65AD\u66F4\u957F\u7684 minified \u540D \u2192 \u53D6\u5230\u9519\u8BEF\u51FD\u6570\u540D\uFF1B\u8981\u6C42\u5206\u9694\u7B26\u540E\u622A\u65AD\u4E0D\u6210\u7ACB\uFF08\u6F02\u79FB\u53EF\u89C1\uFF09\u3002
950
+ const nameMatch = /^([A-Za-z_$][A-Za-z0-9_$]*)(?=[,}:])/.exec(src.slice(exportIdx + exportAnchor.length));
951
+ const fnName = nameMatch ? nameMatch[1] : null;
952
+ if (fnName) {
953
+ // \u951A\u70B9 A\uFF08\u9996\u9009\uFF0C\u6297\u6F02\u79FB\u6700\u5F3A\uFF09\uFF1A\u51FD\u6570\u5B9A\u4E49\u9ED8\u8BA4\u53C2\u6570\u6CD5\u2014\u2014
954
+ // 'function <fnName>(e,t={}){' \u2192 'function <fnName>(e,t={standalone:{}}){'\u3002
955
+ // \u8BED\u4E49\uFF1A\u8C03\u7528\u65B9\u7701\u7565\u7B2C\u4E8C\u53C2\uFF08\u534F\u8BAE\u8DEF\u5F84 xCt(z)\uFF09\u2192 t = {standalone:{}}\uFF1B\u663E\u5F0F\u4F20
956
+ // {}\uFF08skipUserConfig \u8DEF\u5F84\uFF09\u6216 {standalone:{...}}\uFF08TUI \u8DEF\u5F84\uFF09\u4E0D\u53D7\u5F71\u54CD\u3002
957
+ const defAnchor = 'function ' + fnName + '(';
958
+ // \u7ED3\u6784\u6821\u9A8C\uFF082026-10 review\xB7MF-1-5\uFF09\uFF1A\u66FE\u53D6\u9996\u4E2A\u6587\u672C\u547D\u4E2D\u2014\u2014\u771F\u5B9E bundle \u6709\u6570\u767E\u4E2A
959
+ // \u91CD\u540D function \u5B9A\u4E49\uFF08\u540C\u540D\u4E0D\u4EE3\u8868\u552F\u4E00\uFF09\uFF0C\u9519\u6539\u4E00\u5904\u4ECD\u662F\u8BED\u6CD5\u5408\u6CD5 bundle\uFF0C\u81EA\u68C0\u65E0\u6CD5
960
+ // \u53D1\u73B0\u4E14\u95E8\u4F1A\u62A5 armed\u3002\u5B9A\u4E49\u5FC5\u987B**\u552F\u4E00**\u4E14\u4F4D\u4E8E\u5BFC\u51FA\u6620\u5C04\u4E4B\u524D\uFF1B\u7B2C\u4E8C\u5904\u51FA\u73B0\u6216\u5B9A\u4E49
961
+ // \u843D\u5728\u5BFC\u51FA\u6620\u5C04\u4E4B\u540E = \u65E0\u6CD5\u786E\u5B9A\u5BFC\u51FA\u5BF9\u8C61\u6307\u5411\u7684\u5B9E\u73B0 \u2192 \u653E\u5F03\u672C\u951A\uFF08\u56DE\u9000\u8C03\u7528\u70B9\u951A /
962
+ // not armed\uFF09\uFF0C\u5B81\u53EF\u6F0F\u8865\u4E5F\u4E0D\u9ED8\u9ED8\u6539\u9519\u4F4D\u7F6E\u3002
963
+ let defCount = 0;
964
+ let defIdx = -1;
965
+ for (let scan = src.indexOf(defAnchor); scan >= 0; scan = src.indexOf(defAnchor, scan + 1)) {
966
+ defCount++;
967
+ if (scan < exportIdx) defIdx = scan;
968
+ }
969
+ if (defCount !== 1) defIdx = -1;
970
+ if (defIdx >= 0) {
971
+ const paramsEnd = __matchingParen(src, defIdx + defAnchor.length - 1);
972
+ if (paramsEnd > defIdx) {
973
+ // \u5FC5\u987B\u6070\u597D\u4E24\u4E2A\u9876\u5C42\u53C2\u6570\u4E14\u7B2C\u4E8C\u4E2A\u4EE5 '={}' \u6536\u5C3E\uFF1A\u66FE\u53EA\u8981\u6C42 '={}' \u552F\u4E00\u2014\u2014
974
+ // function f(e={},t) \u4F1A\u628A standalone \u6CE8\u5165\u7B2C\u4E00\u4E2A\u53C2\u6570\uFF08\u8BED\u6CD5\u5408\u6CD5\u3001\u8BED\u4E49\u9519\u8BEF\uFF09\uFF0C
975
+ // function f(e,t={},o={}) \u4E5F\u4E0D\u786E\u5B9A\u6CE8\u5165\u70B9\uFF08\u65E2\u6709\u56DE\u9000\u7528\u4F8B\uFF09\u3002
976
+ const params = __splitTopLevel(src, defIdx + defAnchor.length, paramsEnd);
977
+ if (params.length === 2) {
978
+ const second = params[1];
979
+ let secondEnd = second.end;
980
+ while (secondEnd > second.start && src.charCodeAt(secondEnd - 1) <= 32) secondEnd--;
981
+ // \u51FD\u6570\u4F53\u7A97\u53E3\u4EE4\u724C\uFF08\u53EF\u9009\u4FDD\u9669\uFF09\uFF1A\u771F\u5B9E\u6CE8\u518C\u6E90\u5B9E\u88C5\u5F15\u7528 .standalone /
982
+ // credentialStore\u2014\u2014\u540C\u540D\u4F46\u65E0\u5173\u7684\u5B9A\u4E49\uFF08\u6216\u5B57\u7B26\u4E32\u5185\u4F2A\u547D\u4E2D\uFF09\u4E0D\u5F97\u88AB\u6539\u5199\u3002
983
+ const bodyWindow = src.slice(paramsEnd + 1, paramsEnd + 500);
984
+ if (secondEnd - second.start > 3 && src.slice(secondEnd - 3, secondEnd) === '={}'
985
+ && (bodyWindow.indexOf('standalone') >= 0 || bodyWindow.indexOf('credentialStore') >= 0)) {
986
+ const at = secondEnd - 3;
987
+ src = src.slice(0, at) + '={standalone:{}}' + src.slice(secondEnd);
988
+ standaloneApplied = true;
989
+ }
990
+ }
991
+ }
992
+ }
993
+ // \u951A\u70B9 B\uFF08\u56DE\u9000\uFF09\uFF1A\u8C03\u7528\u70B9\u6CE8\u5165 create:r(()=><fn>( \u2192 (<arg>,{standalone:{}})
994
+ if (!standaloneApplied) {
995
+ const callAnchor = 'create:r(()=>' + fnName + '(';
996
+ const callIdx = src.indexOf(callAnchor);
997
+ if (callIdx >= 0) {
998
+ const argStart = callIdx + callAnchor.length;
999
+ // \u62EC\u53F7\u914D\u5E73\u627E\u4E0E fnName( \u914D\u5BF9\u7684\u95ED\u62EC\u53F7\uFF08\u626B\u63CF\u5668\u8DF3\u8FC7\u5B57\u9762\u91CF/\u6A21\u677F/\u6CE8\u91CA\u2014\u2014\u5B9E\u53C2
1000
+ // \u542B\u5185\u8054\u4E32\u6216\u5185\u5C42\u8C03\u7528\u65F6\u9996\u4E2A ')' \u843D\u5728\u9519\u8BEF\u5C42\u7EA7 = \u6CE8\u5165\u9519\u4F4D\u7684\u5047\u6210\u529F\uFF09
1001
+ const closeIdx = __matchingParen(src, argStart - 1);
1002
+ if (closeIdx > argStart) {
1003
+ src = src.slice(0, closeIdx) + ',{standalone:{}}' + src.slice(closeIdx);
1004
+ standaloneApplied = true;
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ }
1010
+ if (!standaloneApplied) {
1011
+ process.stderr.write('[zcode-launcher] standalone account: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays host-dependent\\n');
1012
+ }
1013
+ // \u2462 [2026-10-16 standalone account\xB7\u7AEF\u53E3\u6CE8\u5165] \u534F\u8BAE\u8DEF\u5F84\u7684 app \u521B\u5EFA\uFF08
1014
+ // createZCodeApp:r((ut={})=>INn({...q0c(...)}) \u552F\u4E00\u547D\u4E2D\uFF09\u672A\u4F20
1015
+ // providerRuntimeHeadersPort\u2014\u2014app \u56E0\u6B64\u56DE\u843D host \u8BF7\u6C42\u7AEF\u53E3\uFF08mai\uFF09\uFF0C\u800C taiji \u94FE\u4E0A\u65E0
1016
+ // \u5BBF\u4E3B\u4EFB\u5E94\u7B54 \u2192 zod invalid_union(headersApplied)\uFF08\u2461\u53EA\u4FEE\u4E86 registry \u4FA7\uFF1Aprovider
1017
+ // \u5DF2\u80FD\u8FDB\u6CE8\u518C\u8868\uFF0C\u4F46\u8BA4\u8BC1\u5934\u4ECD\u8D70 host \u8BF7\u6C42\uFF09\u3002\u672C\u6B65\u628A registry runtime \u5BF9\u8C61\u4E0A\u7684
1018
+ // providerRuntimeHeadersPort\uFF08standalone \u6A21\u5F0F = \u672C\u5730\u7AEF\u53E3\uFF09\u6CE8\u5165\u8BE5 app \u521B\u5EFA\u9009\u9879\uFF1A
1019
+ // \u8D26\u53F7\u65CF\u8BA4\u8BC1\u5934\u7531\u672C\u8FDB\u7A0B\u672C\u5730\u89E3\u6790\uFF08\u51ED\u636E = credentials.json \u4E2D ZCode \u81EA\u6709\u9879\uFF09\u3002
1020
+ const appAnchor = 'createZCodeApp:r(';
1021
+ const appIdx = src.indexOf(appAnchor);
1022
+ if (appIdx >= 0) {
1023
+ const closeAnchor = '}),"createZCodeApp")';
1024
+ const closeIdx = src.indexOf(closeAnchor, appIdx);
1025
+ // \u641C\u7D22\u7A97\u4EE5\u6536\u53E3\u951A\u4E3A\u754C\uFF08\u66FE\u7528 appIdx+1600 \u56FA\u5B9A\u7A97\u2014\u2014\u7A97\u53E3\u8D8A\u8FC7\u6536\u53E3\u4F1A\u6355\u83B7\u9009\u9879\u5BF9\u8C61\u5916
1026
+ // \u7684\u65E0\u5173\u540C\u540D\u5F62\u6001\uFF0C\u6CE8\u5165\u9519\u8BEF\u53D8\u91CF\u540D \u2192 \u52A0\u8F7D\u671F ReferenceError \u4E14\u8865\u4E01\u5C42\u65E0 warn\uFF09
1027
+ const regMatch = closeIdx > appIdx
1028
+ ? /([A-Za-z_$][A-Za-z0-9_$]*).runtime.registryService/.exec(src.slice(appIdx, closeIdx))
1029
+ : null;
1030
+ if (closeIdx > appIdx && regMatch) {
1031
+ // \u6761\u4EF6 spread\uFF082026-10 review\xB7S-4\uFF09\uFF1A\u4E0A\u6E38 kEt \u4EE5 \`n.providerRuntimeHeadersPort ??
1032
+ // mai(e,t)\` \u628A\u5BBF\u4E3B\u8BF7\u6C42\u7AEF\u53E3\u663E\u5F0F\u4EA4\u7ED9 createZCodeApp\uFF08...q0c($0c(ut,n),...) \u5DF2\u542B\u8BE5\u503C\uFF09\uFF1B
1033
+ // \u65E0\u6761\u4EF6\u5C3E\u63D2 <reg>.providerRuntimeHeadersPort \u5728 standalone \u672A\u6B66\u88C5\u5F62\u6001\uFF08\u503C\u4E3A
1034
+ // undefined\uFF09\u4F1A shadow \u6389\u5BBF\u4E3B\u7AEF\u53E3\u3001\u62B9\u9664 host \u56DE\u843D\u3002\u6539\u4E3A\u4EC5\u5728\u672C\u5730\u7AEF\u53E3\u5B58\u5728\u65F6\u8986\u76D6\uFF1A
1035
+ // standalone \u5F62\u6001\u5B57\u8282\u7B49\u4EF7\uFF0Chost \u5F62\u6001\u4FDD\u7559\u8C03\u7528\u65B9\u503C\u3002
1036
+ const reg = regMatch[1];
1037
+ src = src.slice(0, closeIdx)
1038
+ + ',...(' + reg + '.providerRuntimeHeadersPort?{providerRuntimeHeadersPort:' + reg + '.providerRuntimeHeadersPort}:{})'
1039
+ + src.slice(closeIdx);
1040
+ portInjected = true;
1041
+ }
1042
+ }
1043
+ if (!portInjected) {
1044
+ process.stderr.write('[zcode-launcher] standalone account: header-port injection anchor not found (zcode upstream shape drifted?) - account auth stays host-dependent\\n');
1045
+ }
1046
+ // \u4EA4\u4ED8\u6761\u4EF6\u542B portInjected\uFF082026-10 review \u4FEE\u6B63\uFF09\uFF1A\u66FE\u53EA\u8BA4 entitled/standalone\u2014\u2014
1047
+ // \u7AEF\u53E3\u951A\u5355\u72EC\u547D\u4E2D\u65F6\u8865\u4E01\u4EA7\u7269\u88AB\u9759\u9ED8\u4E22\u5F03\uFF08\u2462 \u5F62\u540C\u865A\u8BBE\uFF0C\u65E0\u4EFB\u4F55\u4FE1\u53F7\uFF09\u3002
1048
+ if (entitledApplied || standaloneApplied || portInjected) {
1049
+ // \u7F13\u5B58\u524D\u8BED\u6CD5\u81EA\u68C0\uFF08\u5EC9\u4EF7\u4FDD\u9669\uFF09\uFF1A\u951A\u6F02\u79FB\u5F62\u6001\u4E0B\u63D2\u9519\u4F4D\u7F6E\u4F1A\u4EA7\u51FA\u8BED\u6CD5\u975E\u6CD5 bundle\uFF0C
1050
+ // app-server \u542F\u52A8\u5373\u88F8 SyntaxError \u4E14\u96BE\u5F52\u56E0\u8865\u4E01\u5C42\u2014\u2014\u7F13\u5B58\u524D try \u7F16\u8BD1\u4E00\u6B21\uFF0C
1051
+ // \u5931\u8D25\u56DE\u9000\u539F\u6587 + stderr warn\uFF08\u8D70\u65E2\u6709\u300C\u539F\u6587\u900F\u51FA\u300D\u964D\u7EA7\u8BED\u4E49\uFF09\u3002BOM/shebang \u5265\u79BB
1052
+ // \u4E0E .js \u6269\u5C55\u5904\u7406\u5668\u540C\u6B3E\uFF08\u5426\u5219\u5408\u6CD5 CJS \u88AB\u8BEF\u5224\u975E\u6CD5\uFF09\u3002
1053
+ let check = src;
1054
+ if (check.charCodeAt(0) === 0xfeff) check = check.slice(1);
1055
+ if (check.startsWith('#!')) check = check.slice(check.indexOf('\\n') + 1);
1056
+ try {
1057
+ new Function(check);
1058
+ result = src;
1059
+ } catch (syntaxErr) {
1060
+ process.stderr.write('[zcode-launcher] cli-source patch produced invalid JS (' + ((syntaxErr && syntaxErr.message) || 'unknown') + ') - falling back to unpatched source\\n');
1061
+ result = null;
1062
+ }
1063
+ } else {
1064
+ result = null;
1065
+ }
1066
+ } catch { result = null; }
1067
+ __cliPatchCache.set(path, result);
1068
+ // \u6807\u5FD7\u53EA\u63CF\u8FF0\u300C\u5DF2\u4EA4\u4ED8\u4EA7\u7269\u300D\uFF1A\u8BED\u6CD5\u81EA\u68C0\u5931\u8D25/\u5F02\u5E38\u56DE\u9000\uFF08result=null\uFF09\u65F6\u5168\u90E8 false\u2014\u2014
1069
+ // \u95E8\u4E0D\u5F97\u628A\u672A\u751F\u6548\u7684\u8865\u4E01\u62A5\u6210 armed\u3002
1070
+ __cliPatchStatus.set(path, {
1071
+ entitled: result !== null && entitledApplied,
1072
+ standalone: result !== null && standaloneApplied,
1073
+ headerPort: result !== null && portInjected,
1074
+ });
1075
+ return result;
1076
+ }`;
1077
+ var ACCOUNT_METADATA_SECTION = `
1078
+ // [2026-10-16 standalone account metadata] standalone \u8D26\u53F7\u6E90\u8981\u6C42
1079
+ // account-provider:<planProviderId>:identity / :auth-source \u4E24\u6761**\u5143\u6570\u636E**\u952E\u624D\u627F\u8BA4
1080
+ // account provider\uFF08\u7F3A identity \u76F4\u63A5\u4E22\u5F03\u8BE5 provider \u2192 \u6D3E\u53D1\u62A5\u300CProvider Registry \u4E2D
1081
+ // \u4E0D\u5B58\u5728 Model\u300D\uFF09\u3002\u4E24\u952E\u975E\u79D8\u5BC6\uFF08\u8EAB\u4EFD ID / \u8BA4\u8BC1\u6765\u6E90\uFF09\uFF0C\u771F\u51ED\u636E\u4ECD\u662F ZCode \u81EA\u6709\u9879
1082
+ // \uFF08oauth token \u6216 plan api-key\uFF0C\u5747\u5728 credentials.json\uFF0C\u7531 ZCode \u767B\u5F55/\u914D\u7F6E\u5199\u5165\uFF09\u3002
1083
+ // \u672C\u6B65\u5E42\u7B49\u4F9B\u7ED9\uFF1A\u7F3A\u65F6\u8FFD\u52A0 + **\u5B64\u513F\u503C\u77EB\u6B63**\uFF082026-10 review\xB7MF-1-1\uFF09\u2014\u2014\u6D3E\u751F\u503C\u6BCF\u6B21
1084
+ // spawn \u91CD\u7B97\uFF0C\u65E2\u6709\u975E\u7A7A\u503C\u4ECD\u662F\u6743\u5A01\uFF08\u4E0D\u65E0\u5DEE\u522B\u8986\u5199\uFF09\uFF0C\u4EC5\u5F53\u5176\u80CC\u540E\u51ED\u636E\u5DF2\u4E0D\u5B58\u5728\u65F6\u624D
1085
+ // \u6539\u5199\uFF08oauth \u64A4\u9500 / plan key \u8F6E\u6362 / \u8D26\u53F7\u5207\u6362\uFF09\uFF1B\u5426\u5219\u65E7\u8EAB\u4EFD/\u65E7\u6765\u6E90\u4F1A\u6C38\u4E45\u95E8\u63A7\u8BE5
1086
+ // provider \u4E14\u6C38\u4E0D\u6536\u655B\u3002\u4EFB\u4F55\u5931\u8D25\u53EA warn \u4E0D\u963B\u65AD spawn\uFF08\u7F3A\u952E\u7684\u62A5\u9519\u8DEF\u5F84\u4E0E\u6062\u590D\u6307\u5F15\u7531
1087
+ // \u5F15\u64CE\u4FA7\u65E2\u6709\u6587\u6848\u627F\u8F7D\uFF09\u3002catches\uFF1A\u6587\u4EF6\u7F3A\u5931/\u574F JSON/\u76EE\u5F55\u4E0D\u53EF\u5199\u3002
1088
+ // \u5E76\u53D1\u8FB9\u754C\uFF08ADR-0143 \u767B\u8BB0\uFF09\uFF1A\u5BF9\u4E0E GUI \u5171\u4EAB\u7684\u51ED\u636E\u5E93\u505A\u65E0\u9501 read-modify-write \u5168\u91CF
1089
+ // \u5199\u56DE\uFF0C\u4E0E GUI token \u5237\u65B0\u5E76\u53D1\u5B58\u5728\u6BEB\u79D2\u7EA7\u4E22\u66F4\u65B0\u7A97\u53E3\u2014\u2014\u540E\u679C\u81EA\u6108\uFF08GUI \u4FA7\u91CD\u8BD5\u5237\u65B0 /
1090
+ // \u672C\u4FA7\u7F3A\u952E\u4E0B\u6B21 spawn \u5E42\u7B49\u8865\u9F50\uFF09\uFF0C\u4E8B\u5B9E\u9A71\u52A8\u539F\u5219\u4E0B\u4E0D\u52A0\u9501\u3001\u4E0D\u505A\u65F6\u95F4\u8865\u507F\u3002
1091
+ // \u8C03\u7528\u5951\u7EA6\uFF082026-10 review\xB7S-3\uFF09\uFF1A\u4EC5\u5728\u5B89\u88C5\u95E8\u786E\u8BA4 standalone \u4E0E header-port \u4E24\u951A
1092
+ // \u5747\u5DF2\u6B66\u88C5\u65F6\u8C03\u7528\u2014\u2014\u8FD9\u4E9B\u5143\u6570\u636E\u952E\u53EA\u88AB standalone \u8D26\u53F7\u6E90\u6D88\u8D39\uFF0C\u4E14\u8D26\u53F7\u94FE\u8981\u6210\u7ACB\u8FD8\u8981\u6C42
1093
+ // \u8BA4\u8BC1\u5934\u8D70\u672C\u5730\u7AEF\u53E3\uFF1B\u4EFB\u4E00\u951A\u6F02\u79FB\uFF08\u7248\u672C\u4E0D\u652F\u6301\uFF09\u65F6\u5199\u5165\u7528\u6237\u5171\u4EAB credentials.json \u65E0
1094
+ // \u4EFB\u4F55\u8FD0\u884C\u65F6\u6536\u76CA\uFF0C\u53EA\u589E\u98CE\u9669\u3002
1095
+ function ensureAccountMetadata() {
1096
+ try {
1097
+ const credPath = path.join(os.homedir(), '.zcode', 'v2', 'credentials.json');
1098
+ const readOrig = fs.__origReadFileSync || fs.readFileSync;
1099
+ if (!fs.existsSync(credPath)) return;
1100
+ const creds = JSON.parse(readOrig.call(fs, credPath, 'utf8'));
1101
+ if (!creds || typeof creds !== 'object' || Array.isArray(creds)) return;
1102
+ if (!CATALOG_PATH) return;
1103
+ let planIds = [];
1104
+ try {
1105
+ const cat = JSON.parse(readOrig.call(fs, CATALOG_PATH, 'utf8'));
1106
+ const pcr = (cat && cat.config && cat.config.providerConfigRules) || {};
1107
+ const rules = Array.isArray(pcr.providerRules) ? pcr.providerRules : [];
1108
+ planIds = rules
1109
+ // \u8FC7\u6EE4\u9762\u523B\u610F\u5BBD\u4E8E 3.15.3 standalone \u5FEB\u7167\u7684\u6D88\u8D39\u5224\u636E\uFF08\u6E90\u7801 NNn\uFF1Atype=zhipu-account
1110
+ // && mode=individual-coding-plan && accountType \u975E\u7A7A && builtinModelIds \u975E\u7A7A\uFF1B
1111
+ // \u771F\u5B9E\u76EE\u5F55 10 \u6761\u547D\u4E2D\u3001\u4EC5 2 \u6761\u88AB individual \u5FEB\u7167\u6D88\u8D39\uFF09\uFF1A\u591A\u5199\u7684\u952E\u662F\u975E\u79D8\u5BC6\u5143\u6570\u636E\u3001
1112
+ // \u7F3A\u65F6\u8FFD\u52A0\u6210\u672C\u2248\u96F6\uFF1B\u800C mode \u503C\u57DF\uFF08individual/team/start/off-peak/
1113
+ // highspeed\uFF09\u8DE8 CLI \u7248\u672C\u4ECD\u5728\u6F14\u5316\uFF0C\u6309\u5F53\u524D\u7248\u672C\u6536\u7A84\u4F1A\u8BA9\u522B\u7684\u7248\u672C/\u672A\u6765\u6D88\u8D39\u9762
1114
+ // \u9759\u9ED8\u7F3A\u952E\u3002\u5BBD\u5EA6\u662F\u6709\u610F\u7684\uFF0C\u4E0D\u6309 3.15.3 \u6536\u7A84\uFF082026-10 review\xB7S-5 \u6838\u5B9E\u540E\u4FDD\u7559\uFF09\u3002
1115
+ .filter(function (r) { return r && r.config && r.config.access && r.config.access.type === 'zhipu-account'; })
1116
+ .map(function (r) { return String(r.providerId || ''); })
1117
+ .filter(Boolean);
1118
+ } catch (e) {
1119
+ // \u76EE\u5F55\u635F\u574F/\u4E0D\u53EF\u8BFB = identity/auth-source \u65E0\u6CD5\u4F9B\u7ED9\u7684\u771F\u56E0\uFF0C\u4E0D\u80FD\u9759\u9ED8\u8FD4\u56DE\uFF08\u5426\u5219
1120
+ // standalone \u6D3E\u53D1\u62A5\u300CProvider Registry \u4E2D\u4E0D\u5B58\u5728 Model\u300D\u65F6\u6392\u969C\u65E0\u5165\u53E3\uFF09
1121
+ process.stderr.write('[zcode-launcher] account metadata: builtin catalog unreadable (' + ((e && e.message) || String(e)) + ') - skipping account provider metadata\\n');
1122
+ return;
1123
+ }
1124
+ const added = [];
1125
+ const reconciled = [];
1126
+ for (const pid of planIds) {
1127
+ const idKey = 'account-provider:' + pid + ':identity';
1128
+ const srcKey = 'account-provider:' + pid + ':auth-source';
1129
+ // host \u6001 plan api-key \u952E\u540D\u6A21\u677F\uFF1Aaccount-provider:coding-plan:<pid>:account:<identity>:api-key
1130
+ const apiKeyPrefix = 'account-provider:coding-plan:' + pid + ':account:';
1131
+ const apiKeySuffix = ':api-key';
1132
+ const hasPlanApiKey = (id) => {
1133
+ if (!id) return false;
1134
+ return Boolean(creds[apiKeyPrefix + encodeURIComponent(id) + apiKeySuffix]);
1135
+ };
1136
+ let identity = typeof creds[idKey] === 'string' ? creds[idKey] : '';
1137
+ const authSource = typeof creds[srcKey] === 'string' ? creds[srcKey] : '';
1138
+ // \u6D3E\u751F\u8EAB\u4EFD\u6BCF\u6B21 spawn \u91CD\u7B97\uFF08\u4E0D\u8BFB\u65E2\u6709\u952E\uFF09\uFF1A\u5F53\u524D host \u6001\u952E\u540D\u9996\u547D\u4E2D\uFF08\u4FDD\u6301\u65E2\u6709\u4F18\u5148\u7EA7\uFF09\u3002
1139
+ let derivedIdentity = '';
1140
+ for (const k of Object.keys(creds)) {
1141
+ if (k.indexOf(apiKeyPrefix) === 0 && k.slice(-apiKeySuffix.length) === apiKeySuffix) {
1142
+ const mid = k.slice(apiKeyPrefix.length, k.length - apiKeySuffix.length);
1143
+ if (mid) { try { derivedIdentity = decodeURIComponent(mid); } catch (e2) { derivedIdentity = mid; } break; }
1144
+ }
1145
+ }
1146
+ // oauth \u5BB6\u65CF\u51ED\u636E\u5B58\u5728\u6027\uFF1A\u626B oauth:<family>:access_token\uFF0Cprovider id \u4EE5
1147
+ // account:<family> \u5F00\u5934\u5373\u7ED1\u5B9A\u8BE5\u5BB6\u65CF\uFF08\u96F6\u5BB6\u65CF\u540D\u5199\u6B7B\uFF09\u3002
1148
+ let oauthBacked = false;
1149
+ const oauthPrefix = 'oauth:';
1150
+ const oauthSuffix = ':access_token';
1151
+ for (const k of Object.keys(creds)) {
1152
+ if (k.indexOf(oauthPrefix) !== 0 || k.slice(-oauthSuffix.length) !== oauthSuffix) continue;
1153
+ const fam = k.slice(oauthPrefix.length, k.length - oauthSuffix.length);
1154
+ if (!fam) continue;
1155
+ const token = creds[k];
1156
+ if (typeof token !== 'string' || token === '') continue;
1157
+ if (pid.indexOf('account:' + fam) === 0) { oauthBacked = true; break; }
1158
+ }
1159
+ // \u2460 \u8EAB\u4EFD\u5B64\u513F\u77EB\u6B63\uFF1A\u65E2\u6709\u975E\u7A7A\u8EAB\u4EFD\u662F\u6743\u5A01\u5199\u5165\uFF0C\u4F46\u53EA\u5728\u300C\u8BA4\u8BC1\u5F62\u6001\u8981\u6C42\u8EAB\u4EFD\u5BF9\u5E94 plan
1160
+ // api-key\u300D\u65F6\u5224\u5B9A\u5B64\u513F\u2014\u2014oauth \u5F62\u6001\u4E0B\u8EAB\u4EFD\u4E0D\u53C2\u4E0E\u51ED\u636E\u67E5\u627E\uFF08CLI \u767B\u5F55\u5199\u5165\u7684\u8EAB\u4EFD
1161
+ // \u53EF\u80FD\u6C38\u65E0 api-key\uFF09\uFF0C\u4E0D\u5F97\u7528\u6B8B\u7559\u952E\u540D\u8986\u5199\u3002\u5B64\u513F = \u65E0\u5BF9\u5E94 api-key \u4E14\u5F53\u524D\u53EF\u6D3E\u751F
1162
+ // \u2192 \u6539\u6210\u5F53\u524D\u8EAB\u4EFD\uFF08\u5426\u5219 manual \u67E5\u65E7\u8EAB\u4EFD\u51ED\u636E\u6052\u5931\u8D25\u3001\u6C38\u4E0D\u6536\u655B\uFF09\u3002\u65E5\u5FD7\u5728\u843D\u5E93
1163
+ // \u70B9\u53D1\uFF08\u65E0\u53EF\u7528 auth-source \u65F6 continue\uFF0C\u4E0D\u5F97\u7559\u4E0B\u201C\u5DF2\u77EB\u6B63\u201D\u800C\u672A\u5199\u76D8\u7684\u5047\u65E5\u5FD7\uFF09\u3002
1164
+ let identityCorrectedFrom = '';
1165
+ if (identity && !hasPlanApiKey(identity) && (authSource === 'manual' || !oauthBacked)
1166
+ && derivedIdentity && derivedIdentity !== identity) {
1167
+ identityCorrectedFrom = identity;
1168
+ identity = derivedIdentity;
1169
+ }
1170
+ if (!identity) identity = derivedIdentity;
1171
+ if (!identity) continue;
1172
+ // \u2461 auth-source \u6D3E\u751F + \u5B64\u513F\u77EB\u6B63\uFF1Aoauth \u9700\u5339\u914D\u5BB6\u65CF\u7684 access_token\uFF1Bmanual \u9700\u8BE5
1173
+ // \u8EAB\u4EFD\u540D\u4E0B\u7684 plan api-key\u3002\u65E2\u6709\u503C\u4E0E\u5F53\u524D\u4E8B\u5B9E\u4E00\u81F4\u65F6\u539F\u6837\u4FDD\u7559\uFF08GUI/\u767B\u5F55\u5199\u5165\u7684
1174
+ // manual \u5728 oauth \u540C\u65F6\u5B58\u5728\u65F6\u4ECD\u662F\u6743\u5A01\u2014\u2014\u66FE\u65E0\u5DEE\u522B\u8986\u5199\u5DEE\u5F02\u503C\uFF09\u3002
1175
+ const derivedAuthSource = oauthBacked ? 'oauth' : (hasPlanApiKey(identity) ? 'manual' : '');
1176
+ let nextAuthSource = authSource || derivedAuthSource;
1177
+ if (authSource === 'oauth' && !oauthBacked) nextAuthSource = derivedAuthSource;
1178
+ else if (authSource === 'manual' && !hasPlanApiKey(identity)) nextAuthSource = derivedAuthSource;
1179
+ if (!nextAuthSource) continue;
1180
+ // \u843D\u5E93\u5224\u5B9A\uFF1A\u7F3A\u5931\u6001\uFF08\u7A7A\u4E32/\u975E\u4E32\uFF09\u8BB0 provisioned\uFF0C\u975E\u7A7A\u65E7\u503C\u88AB\u77EB\u6B63\u8BB0 reconciled\u3002
1181
+ if (creds[idKey] !== identity) {
1182
+ if (identityCorrectedFrom) {
1183
+ reconciled.push(idKey + ' (' + identityCorrectedFrom + ' -> ' + identity + ')');
1184
+ } else if (typeof creds[idKey] !== 'string' || creds[idKey] === '') {
1185
+ added.push(idKey);
1186
+ }
1187
+ creds[idKey] = identity;
1188
+ }
1189
+ if (creds[srcKey] !== nextAuthSource) {
1190
+ if (typeof creds[srcKey] === 'string' && creds[srcKey] !== '') {
1191
+ reconciled.push(srcKey + ' (' + creds[srcKey] + ' -> ' + nextAuthSource + ')');
1192
+ } else added.push(srcKey);
1193
+ creds[srcKey] = nextAuthSource;
1194
+ }
1195
+ }
1196
+ if (added.length === 0 && reconciled.length === 0) return;
1197
+ const tmp = credPath + '.taiji-tmp-' + process.pid;
1198
+ // rename \u6362 inode\u2014\u2014tmp \u4E0D\u5E26 mode \u843D\u76D8\u4F1A\u628A GUI \u4FA7\u6536\u7D27\u8FC7\u7684\u6587\u4EF6\u6743\u9650\u9759\u9ED8\u653E\u5BBD\u4E3A
1199
+ // \u7F3A\u7701 umask \u503C\uFF0C\u5199\u524D\u8BFB\u65E2\u6709 mode \u968F\u5199\u4F20\u9012\uFF08stat \u5931\u8D25\u56DE\u9000 0600\uFF09\uFF1B\u5199/rename
1200
+ // \u5931\u8D25\u6E05\u7406 tmp\uFF0C\u4E0D\u5728\u7528\u6237\u51ED\u636E\u76EE\u5F55\u7559\u6B8B\u7247\u3002
1201
+ let writeMode = 0o600;
1202
+ try { writeMode = fs.statSync(credPath).mode & 0o777; } catch { /* \u7F3A\u7701 0600 */ }
1203
+ try {
1204
+ fs.writeFileSync(tmp, JSON.stringify(creds, null, 2), { mode: writeMode });
1205
+ fs.renameSync(tmp, credPath);
1206
+ } catch (err) {
1207
+ try { fs.unlinkSync(tmp); } catch { /* tmp \u672A\u751F\u6210\u6216\u5DF2 rename */ }
1208
+ throw err;
1209
+ }
1210
+ if (added.length > 0) process.stderr.write('[zcode-launcher] account metadata provisioned: ' + added.join(', ') + '\\n');
1211
+ if (reconciled.length > 0) process.stderr.write('[zcode-launcher] account metadata reconciled: ' + reconciled.join(', ') + '\\n');
1212
+ } catch (err) {
1213
+ process.stderr.write('[zcode-launcher] account metadata provisioning failed (non-blocking): ' + ((err && err.message) || String(err)) + '\\n');
1214
+ }
1215
+ }
1216
+ `;
1217
+
720
1218
  // src/appserver-launcher.ts
721
1219
  var ZCODE_APPSERVER_LAUNCHER_NAME = "appserver-launcher.cjs";
722
1220
  var APPSERVER_LAUNCHER_SOURCE = `'use strict';
@@ -943,40 +1441,7 @@ function catalogPatchText(path) {
943
1441
  return result;
944
1442
  }
945
1443
 
946
- // [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
947
- // \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
948
- // \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
949
- // \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
950
- // \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
951
- // \u4E0D\u53D7\u5F71\u54CD\u3002
952
- const __cliPatchCache = new Map();
953
- function patchedCliSource(path) {
954
- if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
955
- let result = null;
956
- try {
957
- const readOrig = fs.__origReadFileSync || fs.readFileSync;
958
- const src = readOrig(path, 'utf8');
959
- // \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
960
- // \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
961
- // \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
962
- // \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
963
- // \u8FDB app-server stderr \u65E5\u5FD7\uFF09\uFF0C\u4E2A\u4EBA provider \u4E0D\u53D7\u5F71\u54CD\u3002
964
- const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
965
- if (anchorIdx >= 0) {
966
- const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
967
- if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
968
- result = src.slice(0, anchorIdx)
969
- + window.split('entitled:!1').join('entitled:!0')
970
- + src.slice(anchorIdx + 600);
971
- }
972
- }
973
- if (result === null) {
974
- process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated, personal providers unaffected\\n');
975
- }
976
- } catch { result = null; }
977
- __cliPatchCache.set(path, result);
978
- return result;
979
- }
1444
+ ${CLI_PATCH_SECTION}
980
1445
 
981
1446
  // \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
982
1447
  // ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u76F4\u63A5\u5B9A\u4F4D\uFF1BZCode \u684C\u9762 spawn \u94FE\u81EA\u5E26\u8BE5\u952E\uFF0C
@@ -1050,15 +1515,32 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
1050
1515
  }
1051
1516
  }
1052
1517
 
1518
+ ${ACCOUNT_METADATA_SECTION}
1519
+
1053
1520
  // \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
1054
1521
  // \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
1055
1522
  // Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
1056
1523
  const text = injectedConfigText();
1057
1524
  const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
1058
- if (text !== null || catalogPatch !== null) {
1525
+ const cliPatchProbe = CLI_PATH ? patchedCliSource(CLI_PATH) : null;
1526
+ // \u4E09\u5904\u6539\u5199\u7684\u5E94\u7528\u6001\u7531 patchedCliSource \u53D1\u5E03\uFF08__cliPatchStatus\uFF09\u2014\u2014\u66FE\u4EE5\u4EA7\u7269\u5B50\u4E32\u5224\u5B9A\uFF1A
1527
+ // header-port \u5728\u672A\u6253\u8865\u4E01\u7684 3.15.3 bundle \u4E0A\u6052\u771F\uFF088 \u5904\u65E2\u6709\u540C\u540D\u5C5E\u6027\uFF09\u2192 \u95E8\u5BF9\u951A\u70B9
1528
+ // \u6F02\u79FB\u96F6\u68C0\u6D4B\u529B\uFF1Bstandalone \u540C\u7406\u7531\u6807\u5FD7\u9A71\u52A8\uFF08\u4E09\u5904\u5224\u5B9A\u5404\u81EA\u5177\u540D\uFF09\u3002cli-source-bypass
1529
+ // \u7684\u62EC\u53F7\u540E\u7F00\u628A\u4E09\u951A\u9010\u4E00\u5217\u51FA\uFF082026-10 review\xB7S-2\uFF09\uFF1Aentitled \u6807\u5FD7\u66FE\u53D1\u5E03\u4F46\u65E0\u6D88\u8D39\u65B9\uFF0C
1530
+ // \u8BE5\u951A\u5355\u72EC\u6F02\u79FB\u65F6\u516D\u9879\u77E9\u9635\u4F1A\u5168\u90E8 armed\u2014\u2014\u9010\u951A\u53EF\u89C1\u624D\u80FD\u5B9A\u4F4D\u6F02\u79FB\uFF08\u516D\u9879\u53E3\u5F84\u4E0D\u53D8\uFF09\u3002
1531
+ const cliPatchStatus = CLI_PATH ? __cliPatchStatus.get(CLI_PATH) : null;
1532
+ const anchorFlags = cliPatchStatus
1533
+ ? '(entitled=' + (cliPatchStatus.entitled ? 'on' : 'off')
1534
+ + ',standalone=' + (cliPatchStatus.standalone ? 'on' : 'off')
1535
+ + ',port=' + (cliPatchStatus.headerPort ? 'on' : 'off') + ')'
1536
+ : '';
1537
+ if (text !== null || catalogPatch !== null || cliPatchProbe !== null) {
1059
1538
  process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
1060
1539
  + ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
1061
- + ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off') + ', cli-source-bypass=armed\\n');
1540
+ + ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off')
1541
+ + ', cli-source-bypass=' + (cliPatchProbe !== null ? 'armed' : 'off') + anchorFlags
1542
+ + ', standalone-account=' + (cliPatchStatus && cliPatchStatus.standalone ? 'armed' : 'off')
1543
+ + ', header-port=' + (cliPatchStatus && cliPatchStatus.headerPort ? 'armed' : 'off') + '\\n');
1062
1544
  // 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
1063
1545
  // \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
1064
1546
  // \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
@@ -1072,6 +1554,11 @@ if (text !== null || catalogPatch !== null) {
1072
1554
  return Buffer.from(value);
1073
1555
  };
1074
1556
  fs.__origReadFileSync = fs.readFileSync;
1557
+ // standalone \u8D26\u53F7\u5143\u6570\u636E\u952E\u4F9B\u7ED9\uFF08ADR-0143\uFF09\uFF1A\u4EC5\u5F53 standalone \u4E0E header-port \u4E24\u951A
1558
+ // \u5747\u5DF2\u6B66\u88C5\u65F6\u6267\u884C\uFF082026-10 review\xB7S-3\uFF09\u2014\u2014\u53EA\u6B66\u88C5 standalone \u65F6\u8BA4\u8BC1\u5934\u4ECD\u56DE\u843D\u5BBF\u4E3B
1559
+ // \u8BF7\u6C42\u7AEF\u53E3\uFF08\u65E0\u5BBF\u4E3B\u4EFB\u5E94\u7B54 = \u8D26\u53F7\u94FE\u4ECD\u4E0D\u53EF\u7528\uFF09\uFF0C\u6B64\u65F6\u5199\u7528\u6237\u5171\u4EAB credentials.json
1560
+ // \u65E0\u8FD0\u884C\u65F6\u6536\u76CA\u3001\u53EA\u589E\u98CE\u9669\uFF1B\u6B64\u5904\u8BFB\u6E90\u4ECD\u662F\u539F\u751F fs\uFF08readFileSync \u62E6\u622A\u5C1A\u672A\u5B89\u88C5\uFF09\u3002
1561
+ if (cliPatchStatus && cliPatchStatus.standalone && cliPatchStatus.headerPort) ensureAccountMetadata();
1075
1562
  fs.readFileSync = function (p, ...rest) {
1076
1563
  if (typeof p === 'string' && p === CONFIG_PATH) {
1077
1564
  const cur = injectedConfigText();
@@ -2842,6 +3329,17 @@ var ZcodeEngine = class {
2842
3329
  listModels() {
2843
3330
  return listZcodeModels(this.deps.sources);
2844
3331
  }
3332
+ /**
3333
+ * [engine-ref-translation D1] 派发期模型 ref 翻译(EnginePort 可选成员实装):
3334
+ * pi 词汇 ref → zcode 原生 ref(zai-coding-cn/* → account:bigmodel-individual-*
3335
+ * 大小写归一,2026-10-16 用户裁决(证据驱动修正目标家族)),其余透传。编排层在 record stamp 前调用——
3336
+ * record/上报面呈现实际发给引擎的 ref;翻译失败抛错 = 显式失败(不静默回落)。
3337
+ * 幂等:翻译产物(account:/个人 id)再入恒等,引擎内 resolveZcodeModelRef 的
3338
+ * 同名翻译分支零冲突。
3339
+ */
3340
+ translateModelRef(modelRef) {
3341
+ return translatePiModelRefToZcode(modelRef, this.deps.sources);
3342
+ }
2845
3343
  /** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
2846
3344
  * 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
2847
3345
  reasoningMemo = /* @__PURE__ */ new Map();
@@ -2951,13 +3449,17 @@ var ZcodeEngine = class {
2951
3449
  * COMMON_THOUGHT_LEVELS 之外的档位出声一行提示(措辞是「若不支持将被忽略/回落」的
2952
3450
  * 或然警告,非无效断言);是否真不支持由目标模型决定,core 不做权威校验(引擎层
2953
3451
  * 不掌握各模型值域)。
3452
+ *
3453
+ * [2026-10-14 措辞同步] thoughtLevel 下发值已改为「按目录值域解析后的档位」
3454
+ * (reasoning 唯一生效通道,见 buildAppServerCreateParams 头注):有值域时
3455
+ * off/minimal 归一最小档、非命中档取非最小档末值;无值域时维持恒等透传。
2954
3456
  */
2955
3457
  warnThoughtLevelUncommon(task, ctx) {
2956
3458
  const thoughtLevel = task.thinkingLevel?.trim();
2957
3459
  if (thoughtLevel === void 0 || thoughtLevel === "") return;
2958
3460
  if (COMMON_THOUGHT_LEVELS.includes(thoughtLevel)) return;
2959
3461
  logger4.warn(
2960
- `[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`,
3462
+ `[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`,
2961
3463
  { taskId: ctx.taskId }
2962
3464
  );
2963
3465
  }
@@ -3147,7 +3649,7 @@ Answer again. Output ONLY the JSON value conforming to the schema above \u2014 n
3147
3649
  }
3148
3650
  function buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel) {
3149
3651
  const denyTools = (task.denyTools ?? []).filter((t) => typeof t === "string" && t.trim() !== "");
3150
- const thoughtLevel = task.thinkingLevel?.trim();
3652
+ const thoughtLevel = reasoningLevel !== void 0 && reasoningLevel !== "" ? reasoningLevel : task.thinkingLevel?.trim();
3151
3653
  const model = modelRef !== void 0 && modelRef !== "" ? {
3152
3654
  ...splitZcodeModelRef(modelRef),
3153
3655
  ...reasoningLevel !== void 0 && reasoningLevel !== "" ? { options: { reasoningLevel } } : {}