@zhushanwen/zcode-subagent-cli 0.8.1 → 0.8.3
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/bin/zcode-subagent-cli.mjs +1 -1
- package/dist/{chunk-L3M3CMFJ.js → chunk-X36GXWMP.js} +677 -99
- package/dist/index.cjs +677 -99
- package/dist/index.d.cts +39 -30
- package/dist/index.d.ts +39 -30
- package/dist/index.js +1 -1
- package/dist/main.cjs +677 -99
- package/dist/main.js +1 -1
- package/package.json +6 -3
package/dist/index.cjs
CHANGED
|
@@ -424,41 +424,97 @@ function resolveAccountModelRef(wanted, wantedProvider, sources) {
|
|
|
424
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
425
|
);
|
|
426
426
|
}
|
|
427
|
-
|
|
428
|
-
return wanted;
|
|
427
|
+
return `${wantedProvider}/${normalizeAccountModel(accountRule, wanted, wantedProvider)}`;
|
|
429
428
|
}
|
|
430
429
|
function findAccountProviderRule(catalog, wantedProvider) {
|
|
431
430
|
const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
|
|
432
431
|
const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
|
|
433
432
|
return isRecord(accountRule) ? accountRule : void 0;
|
|
434
433
|
}
|
|
435
|
-
function
|
|
434
|
+
function normalizeAccountModel(accountRule, wanted, wantedProvider) {
|
|
436
435
|
const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
|
|
437
436
|
const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
|
|
438
437
|
const short = modelShort(wanted);
|
|
439
|
-
if (Array.isArray(modelIds)
|
|
438
|
+
if (!Array.isArray(modelIds) || modelIds.length === 0) return short;
|
|
439
|
+
const matched = modelIds.find((m) => typeof m === "string" && m.toLowerCase() === short.toLowerCase());
|
|
440
|
+
if (matched === void 0) {
|
|
440
441
|
throw new ZcodePrepareError(
|
|
441
442
|
"model_not_available",
|
|
442
|
-
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
|
|
443
|
+
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.filter((m) => typeof m === "string").join(", ")}\uFF09\u3002`
|
|
443
444
|
);
|
|
444
445
|
}
|
|
446
|
+
return matched;
|
|
447
|
+
}
|
|
448
|
+
var PI_TO_ZCODE_PROVIDER_MAP = {
|
|
449
|
+
"zai-coding-cn": "account:bigmodel-individual-coding-plan"
|
|
450
|
+
};
|
|
451
|
+
function translatePiModelRefToZcode(requested, sources) {
|
|
452
|
+
if (!requested.includes("/")) return requested;
|
|
453
|
+
const piProvider = providerOf(requested);
|
|
454
|
+
const target = PI_TO_ZCODE_PROVIDER_MAP[piProvider];
|
|
455
|
+
if (target === void 0) return requested;
|
|
456
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
457
|
+
if (catalogPath === void 0) {
|
|
458
|
+
throw new ZcodePrepareError(
|
|
459
|
+
"model_not_available",
|
|
460
|
+
`\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`
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
let catalog;
|
|
464
|
+
try {
|
|
465
|
+
catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
466
|
+
} catch (err) {
|
|
467
|
+
throw new ZcodePrepareError(
|
|
468
|
+
"model_not_available",
|
|
469
|
+
`\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`
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
const accountRule = findAccountProviderRule(catalog, target);
|
|
473
|
+
if (accountRule === void 0) {
|
|
474
|
+
throw new ZcodePrepareError(
|
|
475
|
+
"model_not_available",
|
|
476
|
+
`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`
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
|
|
480
|
+
const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
|
|
481
|
+
if (!Array.isArray(modelIds) || modelIds.length === 0) {
|
|
482
|
+
return `${target}/${modelShort(requested)}`;
|
|
483
|
+
}
|
|
484
|
+
const wanted = modelShort(requested).toLowerCase();
|
|
485
|
+
const matched = modelIds.find((m) => typeof m === "string" && m.toLowerCase() === wanted);
|
|
486
|
+
if (matched === void 0) {
|
|
487
|
+
throw new ZcodePrepareError(
|
|
488
|
+
"model_not_available",
|
|
489
|
+
`\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`
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
return `${target}/${matched}`;
|
|
493
|
+
}
|
|
494
|
+
function translateToAccountModelRef(wanted, sources) {
|
|
495
|
+
const translated = translatePiModelRefToZcode(wanted, sources);
|
|
496
|
+
const translatedProvider = translated.includes("/") ? providerOf(translated) : void 0;
|
|
497
|
+
if (translatedProvider !== void 0 && translatedProvider.startsWith("account:")) {
|
|
498
|
+
return resolveAccountModelRef(translated, translatedProvider, sources);
|
|
499
|
+
}
|
|
500
|
+
return void 0;
|
|
445
501
|
}
|
|
446
502
|
function resolveZcodeModelRef(requested, sources) {
|
|
447
503
|
const { conf, sourceDesc } = readPersonalProviderView(sources);
|
|
448
504
|
const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
|
|
449
505
|
const wanted = requested?.trim() || void 0;
|
|
506
|
+
if (wanted !== void 0) {
|
|
507
|
+
const accountRef = translateToAccountModelRef(wanted, sources);
|
|
508
|
+
if (accountRef !== void 0) return accountRef;
|
|
509
|
+
}
|
|
450
510
|
if (withKey.length === 0) {
|
|
451
511
|
const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
|
|
452
512
|
throw new ZcodePrepareError(
|
|
453
513
|
"engine_credential_missing",
|
|
454
|
-
`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\
|
|
514
|
+
`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
|
|
455
515
|
);
|
|
456
516
|
}
|
|
457
517
|
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
|
-
}
|
|
462
518
|
const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
|
|
463
519
|
const short = modelShort(wanted);
|
|
464
520
|
const entry = conf.providers.get(provider);
|
|
@@ -487,16 +543,58 @@ function resolveZcodeModelRef(requested, sources) {
|
|
|
487
543
|
function listZcodeModels(sources) {
|
|
488
544
|
const { conf } = readPersonalProviderView(sources);
|
|
489
545
|
const out = [];
|
|
546
|
+
const seen = /* @__PURE__ */ new Set();
|
|
490
547
|
for (const [pid, entry] of conf.providers) {
|
|
491
548
|
if (!hasApiKey(entry)) continue;
|
|
492
549
|
const providerName = entry.providerName !== void 0 && entry.providerName.trim() !== "" ? entry.providerName.trim() : void 0;
|
|
493
550
|
for (const model of entry.models ?? []) {
|
|
551
|
+
if (seen.has(`${pid}/${model}`)) continue;
|
|
552
|
+
seen.add(`${pid}/${model}`);
|
|
494
553
|
out.push({
|
|
495
554
|
id: `${pid}/${model}`,
|
|
496
555
|
...providerName !== void 0 ? { name: `${providerName} \xB7 ${model}` } : {}
|
|
497
556
|
});
|
|
498
557
|
}
|
|
499
558
|
}
|
|
559
|
+
for (const entry of listAccountFamilyModels(sources)) {
|
|
560
|
+
if (seen.has(entry.id)) continue;
|
|
561
|
+
seen.add(entry.id);
|
|
562
|
+
out.push(entry);
|
|
563
|
+
}
|
|
564
|
+
return out;
|
|
565
|
+
}
|
|
566
|
+
function readCatalogProviderRules(catalog) {
|
|
567
|
+
const rules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
|
|
568
|
+
return Array.isArray(rules) ? rules : [];
|
|
569
|
+
}
|
|
570
|
+
function pushAccountFamilyRuleModels(rule, out) {
|
|
571
|
+
if (!isRecord(rule)) return;
|
|
572
|
+
const providerId = rule["providerId"];
|
|
573
|
+
if (typeof providerId !== "string" || !providerId.startsWith("account:")) return;
|
|
574
|
+
const cfg = isRecord(rule["config"]) ? rule["config"] : {};
|
|
575
|
+
const models = Array.isArray(cfg["builtinModelIds"]) ? cfg["builtinModelIds"] : cfg["personalModelIds"];
|
|
576
|
+
const providerName = typeof rule["providerName"] === "string" && rule["providerName"].trim() !== "" ? rule["providerName"].trim() : void 0;
|
|
577
|
+
for (const model of Array.isArray(models) ? models : []) {
|
|
578
|
+
if (typeof model !== "string" || model.trim() === "") continue;
|
|
579
|
+
out.push({
|
|
580
|
+
id: `${providerId}/${model}`,
|
|
581
|
+
...providerName !== void 0 ? { name: `${providerName} \xB7 ${model}` } : {}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
function listAccountFamilyModels(sources) {
|
|
586
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
587
|
+
if (catalogPath === void 0) return [];
|
|
588
|
+
let catalog;
|
|
589
|
+
try {
|
|
590
|
+
catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
591
|
+
} catch {
|
|
592
|
+
return [];
|
|
593
|
+
}
|
|
594
|
+
const out = [];
|
|
595
|
+
for (const rule of readCatalogProviderRules(catalog)) {
|
|
596
|
+
pushAccountFamilyRuleModels(rule, out);
|
|
597
|
+
}
|
|
500
598
|
return out;
|
|
501
599
|
}
|
|
502
600
|
|
|
@@ -507,6 +605,475 @@ var path3 = __toESM(require("path"), 1);
|
|
|
507
605
|
// src/error-message.ts
|
|
508
606
|
var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
|
|
509
607
|
|
|
608
|
+
// src/appserver-launcher-patches.ts
|
|
609
|
+
var CLI_PATCH_SECTION = `
|
|
610
|
+
// [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
|
|
611
|
+
// \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
|
|
612
|
+
// \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
|
|
613
|
+
// \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
|
|
614
|
+
// \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
|
|
615
|
+
// \u4E0D\u53D7\u5F71\u54CD\u3002
|
|
616
|
+
// \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
|
|
617
|
+
// \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
|
|
618
|
+
// \u8FD4\u56DE -1 = \u8BE5\u4F4D\u7F6E\u4E0D\u662F\u5B57\u9762\u91CF/\u6CE8\u91CA\u8D77\u70B9\uFF08\u6B63\u5E38\u4EE3\u7801\u5B57\u7B26\uFF09\u3002
|
|
619
|
+
function __skipLiteralOrComment(src, i) {
|
|
620
|
+
const ch = src[i];
|
|
621
|
+
if (ch === '"' || ch === "'") {
|
|
622
|
+
i++;
|
|
623
|
+
while (i < src.length) {
|
|
624
|
+
if (src.charCodeAt(i) === 92) { i += 2; continue; }
|
|
625
|
+
if (src[i] === ch) return i + 1;
|
|
626
|
+
i++;
|
|
627
|
+
}
|
|
628
|
+
return i;
|
|
629
|
+
}
|
|
630
|
+
if (ch === '\`') {
|
|
631
|
+
i++;
|
|
632
|
+
while (i < src.length) {
|
|
633
|
+
if (src.charCodeAt(i) === 92) { i += 2; continue; }
|
|
634
|
+
const c = src[i];
|
|
635
|
+
if (c === '\`') return i + 1;
|
|
636
|
+
if (c === '$' && src[i + 1] === '{') {
|
|
637
|
+
let depth = 1;
|
|
638
|
+
i += 2;
|
|
639
|
+
while (i < src.length && depth > 0) {
|
|
640
|
+
const cc = src[i];
|
|
641
|
+
if (cc === '"' || cc === "'" || cc === '\`') { i = __skipLiteralOrComment(src, i); continue; }
|
|
642
|
+
if (cc === '/' && src[i + 1] === '/') { const nl = src.indexOf('\\n', i + 2); i = nl < 0 ? src.length : nl + 1; continue; }
|
|
643
|
+
if (cc === '/' && src[i + 1] === '*') { const end = src.indexOf('*/', i + 2); i = end < 0 ? src.length : end + 2; continue; }
|
|
644
|
+
if (cc === '{') depth++;
|
|
645
|
+
else if (cc === '}') depth--;
|
|
646
|
+
i++;
|
|
647
|
+
}
|
|
648
|
+
continue;
|
|
649
|
+
}
|
|
650
|
+
i++;
|
|
651
|
+
}
|
|
652
|
+
return i;
|
|
653
|
+
}
|
|
654
|
+
if (ch === '/' && src[i + 1] === '/') {
|
|
655
|
+
const nl = src.indexOf('\\n', i + 2);
|
|
656
|
+
return nl < 0 ? src.length : nl + 1;
|
|
657
|
+
}
|
|
658
|
+
if (ch === '/' && src[i + 1] === '*') {
|
|
659
|
+
const end = src.indexOf('*/', i + 2);
|
|
660
|
+
return end < 0 ? src.length : end + 2;
|
|
661
|
+
}
|
|
662
|
+
return -1;
|
|
663
|
+
}
|
|
664
|
+
// \u4E0E openIdx \u5904 '(' \u914D\u5BF9\u7684\u95ED\u62EC\u53F7\uFF08\u8DF3\u8FC7\u5B57\u9762\u91CF/\u6CE8\u91CA\uFF09\uFF1B-1 = \u4E0D\u914D\u5E73\u3002
|
|
665
|
+
function __matchingParen(src, openIdx) {
|
|
666
|
+
let depth = 0;
|
|
667
|
+
for (let i = openIdx; i < src.length; i++) {
|
|
668
|
+
const skip = __skipLiteralOrComment(src, i);
|
|
669
|
+
if (skip >= 0) { i = skip - 1; continue; }
|
|
670
|
+
const c = src[i];
|
|
671
|
+
if (c === '(') depth++;
|
|
672
|
+
else if (c === ')') { depth--; if (depth === 0) return i; }
|
|
673
|
+
}
|
|
674
|
+
return -1;
|
|
675
|
+
}
|
|
676
|
+
// [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
|
|
677
|
+
// \u8FD4\u56DE\u7EDD\u5BF9\u504F\u79FB\u6BB5\u5217\u8868\u3002
|
|
678
|
+
function __splitTopLevel(src, start, end) {
|
|
679
|
+
const parts = [];
|
|
680
|
+
let depth = 0;
|
|
681
|
+
let segStart = start;
|
|
682
|
+
for (let i = start; i < end; i++) {
|
|
683
|
+
const skip = __skipLiteralOrComment(src, i);
|
|
684
|
+
if (skip >= 0) { i = Math.min(skip, end) - 1; continue; }
|
|
685
|
+
const c = src[i];
|
|
686
|
+
if (c === '(' || c === '[' || c === '{') depth++;
|
|
687
|
+
else if (c === ')' || c === ']' || c === '}') depth--;
|
|
688
|
+
else if (c === ',' && depth === 0) { parts.push({ start: segStart, end: i }); segStart = i + 1; }
|
|
689
|
+
}
|
|
690
|
+
parts.push({ start: segStart, end: end });
|
|
691
|
+
return parts;
|
|
692
|
+
}
|
|
693
|
+
const __cliPatchCache = new Map();
|
|
694
|
+
// \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
|
|
695
|
+
// 3.15.3 bundle \u672C\u5C31\u542B 8 \u5904 'providerRuntimeHeadersPort:'\uFF082 \u5904 ',providerRuntimeHeadersPort:'\uFF09
|
|
696
|
+
// \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,
|
|
697
|
+
// 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
|
|
698
|
+
const __cliPatchStatus = new Map();
|
|
699
|
+
function patchedCliSource(path) {
|
|
700
|
+
if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
|
|
701
|
+
let result = null;
|
|
702
|
+
let entitledApplied = false;
|
|
703
|
+
let standaloneApplied = false;
|
|
704
|
+
let portInjected = false;
|
|
705
|
+
try {
|
|
706
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
707
|
+
let src = readOrig(path, 'utf8');
|
|
708
|
+
// \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
|
|
709
|
+
// \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
|
|
710
|
+
// \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
|
|
711
|
+
// \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
|
|
712
|
+
// \u8FDB app-server stderr \u65E5\u5FD7\uFF09\u3002
|
|
713
|
+
const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
|
|
714
|
+
if (anchorIdx >= 0) {
|
|
715
|
+
const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
|
|
716
|
+
if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
|
|
717
|
+
src = src.slice(0, anchorIdx)
|
|
718
|
+
+ window.split('entitled:!1').join('entitled:!0')
|
|
719
|
+
+ src.slice(anchorIdx + 600);
|
|
720
|
+
entitledApplied = true;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
if (!entitledApplied) {
|
|
724
|
+
process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated\\n');
|
|
725
|
+
}
|
|
726
|
+
// \u2461 [2026-10-16 standalone account] \u534F\u8BAE\u8DEF\u5F84\u7684 provider registry \u6052\u4EE5 host-account
|
|
727
|
+
// \u6A21\u5F0F\u521B\u5EFA\uFF08\u6E90\u7801\uFF1Acreate:r(()=>xCt(z),"create") \u4E0D\u4F20 standalone\uFF09\u2014\u2014\u8BE5\u6A21\u5F0F\u4E0B
|
|
728
|
+
// account \u65CF\u8BF7\u6C42\u5FC5\u987B\u7531\u5BBF\u4E3B\u5E94\u7B54 providerRuntimeHeaders\uFF1Btaiji \u7684 headless spawn \u65E0
|
|
729
|
+
// \u5BBF\u4E3B\u53C2\u4E0E\u8BE5\u534F\u8BAE\uFF0C\u5E94\u7B54\u5E27\u7578\u5F62 \u2192 zod invalid_union(headersApplied)\uFF082026-10-16 \u771F\u673A
|
|
730
|
+
// \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
|
|
731
|
+
// {standalone:{}}\uFF1Astandalone \u6A21\u5F0F\u81EA\u5EFA\u672C\u5730\u8D26\u53F7\u6E90\uFF08entitled \u7531\u51ED\u636E\u5B58\u5728\u6027\u8BA1\u7B97\uFF0C
|
|
732
|
+
// \u8BFB credentials.json\uFF09\u5E76\u6CE8\u5165\u672C\u5730 providerRuntimeHeaders \u7AEF\u53E3\u2014\u2014\u8D26\u53F7\u65CF\u5168\u94FE\u672C\u5730
|
|
733
|
+
// \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
|
|
734
|
+
// startProcessProviderRegistryRuntime:()=> \u53D6\u51FD\u6570\u540D + \u8C03\u7528\u70B9 create:r(()=><fn>(\u3002
|
|
735
|
+
const exportAnchor = 'startProcessProviderRegistryRuntime:()=>';
|
|
736
|
+
const exportIdx = src.indexOf(exportAnchor);
|
|
737
|
+
if (exportIdx >= 0) {
|
|
738
|
+
// \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
|
|
739
|
+
// \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
|
|
740
|
+
const nameMatch = /^([A-Za-z_$][A-Za-z0-9_$]*)(?=[,}:])/.exec(src.slice(exportIdx + exportAnchor.length));
|
|
741
|
+
const fnName = nameMatch ? nameMatch[1] : null;
|
|
742
|
+
if (fnName) {
|
|
743
|
+
// \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
|
|
744
|
+
// 'function <fnName>(e,t={}){' \u2192 'function <fnName>(e,t={standalone:{}}){'\u3002
|
|
745
|
+
// \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
|
|
746
|
+
// {}\uFF08skipUserConfig \u8DEF\u5F84\uFF09\u6216 {standalone:{...}}\uFF08TUI \u8DEF\u5F84\uFF09\u4E0D\u53D7\u5F71\u54CD\u3002
|
|
747
|
+
const defAnchor = 'function ' + fnName + '(';
|
|
748
|
+
// \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
|
|
749
|
+
// \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
|
|
750
|
+
// \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
|
|
751
|
+
// \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 /
|
|
752
|
+
// not armed\uFF09\uFF0C\u5B81\u53EF\u6F0F\u8865\u4E5F\u4E0D\u9ED8\u9ED8\u6539\u9519\u4F4D\u7F6E\u3002
|
|
753
|
+
let defCount = 0;
|
|
754
|
+
let defIdx = -1;
|
|
755
|
+
for (let scan = src.indexOf(defAnchor); scan >= 0; scan = src.indexOf(defAnchor, scan + 1)) {
|
|
756
|
+
defCount++;
|
|
757
|
+
if (scan < exportIdx) defIdx = scan;
|
|
758
|
+
}
|
|
759
|
+
if (defCount !== 1) defIdx = -1;
|
|
760
|
+
if (defIdx >= 0) {
|
|
761
|
+
const paramsEnd = __matchingParen(src, defIdx + defAnchor.length - 1);
|
|
762
|
+
if (paramsEnd > defIdx) {
|
|
763
|
+
// \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
|
|
764
|
+
// 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
|
|
765
|
+
// function f(e,t={},o={}) \u4E5F\u4E0D\u786E\u5B9A\u6CE8\u5165\u70B9\uFF08\u65E2\u6709\u56DE\u9000\u7528\u4F8B\uFF09\u3002
|
|
766
|
+
const params = __splitTopLevel(src, defIdx + defAnchor.length, paramsEnd);
|
|
767
|
+
if (params.length === 2) {
|
|
768
|
+
const second = params[1];
|
|
769
|
+
let secondEnd = second.end;
|
|
770
|
+
while (secondEnd > second.start && src.charCodeAt(secondEnd - 1) <= 32) secondEnd--;
|
|
771
|
+
// \u51FD\u6570\u4F53\u7A97\u53E3\u4EE4\u724C\uFF08\u53EF\u9009\u4FDD\u9669\uFF09\uFF1A\u771F\u5B9E\u6CE8\u518C\u6E90\u5B9E\u88C5\u5F15\u7528 .standalone /
|
|
772
|
+
// 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
|
|
773
|
+
const bodyWindow = src.slice(paramsEnd + 1, paramsEnd + 500);
|
|
774
|
+
if (secondEnd - second.start > 3 && src.slice(secondEnd - 3, secondEnd) === '={}'
|
|
775
|
+
&& (bodyWindow.indexOf('standalone') >= 0 || bodyWindow.indexOf('credentialStore') >= 0)) {
|
|
776
|
+
const at = secondEnd - 3;
|
|
777
|
+
src = src.slice(0, at) + '={standalone:{}}' + src.slice(secondEnd);
|
|
778
|
+
standaloneApplied = true;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
// \u951A\u70B9 B\uFF08\u56DE\u9000\uFF09\uFF1A\u8C03\u7528\u70B9\u6CE8\u5165 create:r(()=><fn>( \u2192 (<arg>,{standalone:{}})\u3002
|
|
784
|
+
// \u7ED3\u6784\u6821\u9A8C\u4E0E\u5B9A\u4E49\u951A\u540C\u53E3\u5F84\uFF082026-10 review\xB7N-1\uFF09\uFF1A\u5168\u6587\u4EF6\u51FA\u73B0\u6B21\u6570\u5FC5\u987B\u6070\u597D 1
|
|
785
|
+
// \u2014\u2014\u66FE\u53D6\u9996\u4E2A\u6587\u672C\u547D\u4E2D\uFF0C\u672A\u6765\u7248\u672C\u51FA\u73B0\u4E24\u5904\u540C\u6B3E\u8C03\u7528\u65F6\u6CE8\u5165\u843D\u5728\u65E0\u5173\u8C03\u7528\u4E0A\u3001
|
|
786
|
+
// standaloneApplied \u4ECD\u7F6E true = \u771F\u5B9E\u534F\u8BAE\u8DEF\u5F84 host \u6A21\u5F0F\u800C\u95E8\u62A5 armed \u7684\u5047\u6210\u529F\u3002
|
|
787
|
+
// count > 1 = \u65E0\u6CD5\u786E\u5B9A\u534F\u8BAE\u8DEF\u5F84\u8C03\u7528\u70B9 \u2192 \u653E\u5F03\u672C\u951A\uFF08not armed\uFF09\u3002
|
|
788
|
+
if (!standaloneApplied) {
|
|
789
|
+
const callAnchor = 'create:r(()=>' + fnName + '(';
|
|
790
|
+
let callCount = 0;
|
|
791
|
+
let callIdx = -1;
|
|
792
|
+
for (let scan = src.indexOf(callAnchor); scan >= 0; scan = src.indexOf(callAnchor, scan + 1)) {
|
|
793
|
+
callCount++;
|
|
794
|
+
callIdx = scan;
|
|
795
|
+
}
|
|
796
|
+
if (callCount === 1) {
|
|
797
|
+
const argStart = callIdx + callAnchor.length;
|
|
798
|
+
// \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
|
|
799
|
+
// \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
|
|
800
|
+
const closeIdx = __matchingParen(src, argStart - 1);
|
|
801
|
+
if (closeIdx > argStart) {
|
|
802
|
+
src = src.slice(0, closeIdx) + ',{standalone:{}}' + src.slice(closeIdx);
|
|
803
|
+
standaloneApplied = true;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
if (!standaloneApplied) {
|
|
810
|
+
process.stderr.write('[zcode-launcher] standalone account: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays host-dependent\\n');
|
|
811
|
+
}
|
|
812
|
+
// \u2462 [2026-10-16 standalone account\xB7\u7AEF\u53E3\u6CE8\u5165] \u534F\u8BAE\u8DEF\u5F84\u7684 app \u521B\u5EFA\uFF08
|
|
813
|
+
// createZCodeApp:r((ut={})=>INn({...q0c(...)}) \u552F\u4E00\u547D\u4E2D\uFF09\u672A\u4F20
|
|
814
|
+
// providerRuntimeHeadersPort\u2014\u2014app \u56E0\u6B64\u56DE\u843D host \u8BF7\u6C42\u7AEF\u53E3\uFF08mai\uFF09\uFF0C\u800C taiji \u94FE\u4E0A\u65E0
|
|
815
|
+
// \u5BBF\u4E3B\u4EFB\u5E94\u7B54 \u2192 zod invalid_union(headersApplied)\uFF08\u2461\u53EA\u4FEE\u4E86 registry \u4FA7\uFF1Aprovider
|
|
816
|
+
// \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
|
|
817
|
+
// providerRuntimeHeadersPort\uFF08standalone \u6A21\u5F0F = \u672C\u5730\u7AEF\u53E3\uFF09\u6CE8\u5165\u8BE5 app \u521B\u5EFA\u9009\u9879\uFF1A
|
|
818
|
+
// \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
|
|
819
|
+
const appAnchor = 'createZCodeApp:r(';
|
|
820
|
+
const appIdx = src.indexOf(appAnchor);
|
|
821
|
+
if (appIdx >= 0) {
|
|
822
|
+
const closeAnchor = '}),"createZCodeApp")';
|
|
823
|
+
const closeIdx = src.indexOf(closeAnchor, appIdx);
|
|
824
|
+
// \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
|
|
825
|
+
// \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
|
|
826
|
+
const regMatch = closeIdx > appIdx
|
|
827
|
+
? /([A-Za-z_$][A-Za-z0-9_$]*).runtime.registryService/.exec(src.slice(appIdx, closeIdx))
|
|
828
|
+
: null;
|
|
829
|
+
if (closeIdx > appIdx && regMatch) {
|
|
830
|
+
// \u6761\u4EF6 spread\uFF082026-10 review\xB7S-4\uFF09\uFF1A\u4E0A\u6E38 kEt \u4EE5 \`n.providerRuntimeHeadersPort ??
|
|
831
|
+
// 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
|
|
832
|
+
// \u65E0\u6761\u4EF6\u5C3E\u63D2 <reg>.providerRuntimeHeadersPort \u5728 standalone \u672A\u6B66\u88C5\u5F62\u6001\uFF08\u503C\u4E3A
|
|
833
|
+
// 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
|
|
834
|
+
// standalone \u5F62\u6001\u5B57\u8282\u7B49\u4EF7\uFF0Chost \u5F62\u6001\u4FDD\u7559\u8C03\u7528\u65B9\u503C\u3002
|
|
835
|
+
const reg = regMatch[1];
|
|
836
|
+
src = src.slice(0, closeIdx)
|
|
837
|
+
+ ',...(' + reg + '.providerRuntimeHeadersPort?{providerRuntimeHeadersPort:' + reg + '.providerRuntimeHeadersPort}:{})'
|
|
838
|
+
+ src.slice(closeIdx);
|
|
839
|
+
portInjected = true;
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
if (!portInjected) {
|
|
843
|
+
process.stderr.write('[zcode-launcher] standalone account: header-port injection anchor not found (zcode upstream shape drifted?) - account auth stays host-dependent\\n');
|
|
844
|
+
}
|
|
845
|
+
// \u4EA4\u4ED8\u6761\u4EF6\u542B portInjected\uFF082026-10 review \u4FEE\u6B63\uFF09\uFF1A\u66FE\u53EA\u8BA4 entitled/standalone\u2014\u2014
|
|
846
|
+
// \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
|
|
847
|
+
if (entitledApplied || standaloneApplied || portInjected) {
|
|
848
|
+
// \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
|
|
849
|
+
// 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
|
|
850
|
+
// \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
|
|
851
|
+
// \u4E0E .js \u6269\u5C55\u5904\u7406\u5668\u540C\u6B3E\uFF08\u5426\u5219\u5408\u6CD5 CJS \u88AB\u8BEF\u5224\u975E\u6CD5\uFF09\u3002
|
|
852
|
+
let check = src;
|
|
853
|
+
if (check.charCodeAt(0) === 0xfeff) check = check.slice(1);
|
|
854
|
+
if (check.startsWith('#!')) check = check.slice(check.indexOf('\\n') + 1);
|
|
855
|
+
try {
|
|
856
|
+
new Function(check);
|
|
857
|
+
result = src;
|
|
858
|
+
} catch (syntaxErr) {
|
|
859
|
+
process.stderr.write('[zcode-launcher] cli-source patch produced invalid JS (' + ((syntaxErr && syntaxErr.message) || 'unknown') + ') - falling back to unpatched source\\n');
|
|
860
|
+
result = null;
|
|
861
|
+
}
|
|
862
|
+
} else {
|
|
863
|
+
result = null;
|
|
864
|
+
}
|
|
865
|
+
} catch { result = null; }
|
|
866
|
+
__cliPatchCache.set(path, result);
|
|
867
|
+
// \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
|
|
868
|
+
// \u95E8\u4E0D\u5F97\u628A\u672A\u751F\u6548\u7684\u8865\u4E01\u62A5\u6210 armed\u3002
|
|
869
|
+
__cliPatchStatus.set(path, {
|
|
870
|
+
entitled: result !== null && entitledApplied,
|
|
871
|
+
standalone: result !== null && standaloneApplied,
|
|
872
|
+
headerPort: result !== null && portInjected,
|
|
873
|
+
});
|
|
874
|
+
return result;
|
|
875
|
+
}`;
|
|
876
|
+
var ACCOUNT_METADATA_SECTION = `
|
|
877
|
+
// [2026-10-16 standalone account metadata] standalone \u8D26\u53F7\u6E90\u8981\u6C42
|
|
878
|
+
// account-provider:<planProviderId>:identity / :auth-source \u4E24\u6761**\u5143\u6570\u636E**\u952E\u624D\u627F\u8BA4
|
|
879
|
+
// account provider\uFF08\u7F3A identity \u76F4\u63A5\u4E22\u5F03\u8BE5 provider \u2192 \u6D3E\u53D1\u62A5\u300CProvider Registry \u4E2D
|
|
880
|
+
// \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
|
|
881
|
+
// \uFF08oauth token \u6216 plan api-key\uFF0C\u5747\u5728 credentials.json\uFF0C\u7531 ZCode \u767B\u5F55/\u914D\u7F6E\u5199\u5165\uFF09\u3002
|
|
882
|
+
// \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
|
|
883
|
+
// 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
|
|
884
|
+
// \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
|
|
885
|
+
// 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
|
|
886
|
+
// \u5F15\u64CE\u4FA7\u65E2\u6709\u6587\u6848\u627F\u8F7D\uFF09\u3002catches\uFF1A\u6587\u4EF6\u7F3A\u5931/\u574F JSON/\u76EE\u5F55\u4E0D\u53EF\u5199\u3002
|
|
887
|
+
// \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
|
|
888
|
+
// \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 /
|
|
889
|
+
// \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\u5143\u6570\u636E\u952E
|
|
890
|
+
// \u9762\u53E6\u52A0 compare-and-skip \u9632\u7EBF\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u5199\u56DE\u524D\u91CD\u8BFB\u78C1\u76D8\u6BD4\u5BF9
|
|
891
|
+
// identity/auth-source \u4E24\u952E\uFF0C\u68C0\u6D4B\u5230\u5E76\u53D1\u5199\u5165\u5373\u653E\u5F03\u672C\u6B21\u5199\u5165\uFF08\u89C1\u843D\u5E93\u6BB5\u6CE8\u91CA\uFF09\u3002
|
|
892
|
+
// \u8C03\u7528\u5951\u7EA6\uFF082026-10 review\xB7S-3\uFF09\uFF1A\u4EC5\u5728\u5B89\u88C5\u95E8\u786E\u8BA4 standalone \u4E0E header-port \u4E24\u951A
|
|
893
|
+
// \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
|
|
894
|
+
// \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
|
|
895
|
+
// \u4EFB\u4F55\u8FD0\u884C\u65F6\u6536\u76CA\uFF0C\u53EA\u589E\u98CE\u9669\u3002
|
|
896
|
+
function ensureAccountMetadata() {
|
|
897
|
+
try {
|
|
898
|
+
const credPath = path.join(os.homedir(), '.zcode', 'v2', 'credentials.json');
|
|
899
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
900
|
+
if (!fs.existsSync(credPath)) return;
|
|
901
|
+
const creds = JSON.parse(readOrig.call(fs, credPath, 'utf8'));
|
|
902
|
+
if (!creds || typeof creds !== 'object' || Array.isArray(creds)) return;
|
|
903
|
+
if (!CATALOG_PATH) return;
|
|
904
|
+
let planIds = [];
|
|
905
|
+
try {
|
|
906
|
+
const cat = JSON.parse(readOrig.call(fs, CATALOG_PATH, 'utf8'));
|
|
907
|
+
const pcr = (cat && cat.config && cat.config.providerConfigRules) || {};
|
|
908
|
+
const rules = Array.isArray(pcr.providerRules) ? pcr.providerRules : [];
|
|
909
|
+
planIds = rules
|
|
910
|
+
// \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
|
|
911
|
+
// && mode=individual-coding-plan && accountType \u975E\u7A7A && builtinModelIds \u975E\u7A7A\uFF1B
|
|
912
|
+
// \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
|
|
913
|
+
// \u7F3A\u65F6\u8FFD\u52A0\u6210\u672C\u2248\u96F6\uFF1B\u800C mode \u503C\u57DF\uFF08individual/team/start/off-peak/
|
|
914
|
+
// 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
|
|
915
|
+
// \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
|
|
916
|
+
.filter(function (r) { return r && r.config && r.config.access && r.config.access.type === 'zhipu-account'; })
|
|
917
|
+
.map(function (r) { return String(r.providerId || ''); })
|
|
918
|
+
.filter(Boolean);
|
|
919
|
+
} catch (e) {
|
|
920
|
+
// \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
|
|
921
|
+
// standalone \u6D3E\u53D1\u62A5\u300CProvider Registry \u4E2D\u4E0D\u5B58\u5728 Model\u300D\u65F6\u6392\u969C\u65E0\u5165\u53E3\uFF09
|
|
922
|
+
process.stderr.write('[zcode-launcher] account metadata: builtin catalog unreadable (' + ((e && e.message) || String(e)) + ') - skipping account provider metadata\\n');
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
const added = [];
|
|
926
|
+
const reconciled = [];
|
|
927
|
+
// compare-and-skip \u57FA\u7EBF\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u5168\u90E8 plan \u4E24\u952E\u7684\u8BFB\u65F6\u539F\u59CB\u503C\uFF08\u9996\u89C1
|
|
928
|
+
// \u6355\u83B7\u2014\u2014\u540E\u7EED\u6539\u5199 creds \u4E0D\u5F71\u54CD\u57FA\u7EBF\uFF09\u3002\u5199\u56DE\u524D\u91CD\u8BFB\u78C1\u76D8\u9010\u952E\u6BD4\u5BF9\uFF0C\u68C0\u6D4B\u300C\u5FEB\u7167\u8BFB\u53D6
|
|
929
|
+
// \u2192\u5199\u56DE\u300D\u7A97\u53E3\u5185\u7684 GUI/\u767B\u5F55\u5E76\u53D1\u5199\u5165\uFF0C\u9632\u9648\u65E7\u5FEB\u7167\u8986\u76D6\u6743\u5A01\u65B0\u503C\u3002
|
|
930
|
+
const metaBaseline = Object.create(null);
|
|
931
|
+
for (const pid of planIds) {
|
|
932
|
+
const idKey = 'account-provider:' + pid + ':identity';
|
|
933
|
+
const srcKey = 'account-provider:' + pid + ':auth-source';
|
|
934
|
+
if (metaBaseline[idKey] === undefined) metaBaseline[idKey] = creds[idKey];
|
|
935
|
+
if (metaBaseline[srcKey] === undefined) metaBaseline[srcKey] = creds[srcKey];
|
|
936
|
+
// host \u6001 plan api-key \u952E\u540D\u6A21\u677F\uFF1Aaccount-provider:coding-plan:<pid>:account:<identity>:api-key
|
|
937
|
+
const apiKeyPrefix = 'account-provider:coding-plan:' + pid + ':account:';
|
|
938
|
+
const apiKeySuffix = ':api-key';
|
|
939
|
+
const hasPlanApiKey = (id) => {
|
|
940
|
+
if (!id) return false;
|
|
941
|
+
return Boolean(creds[apiKeyPrefix + encodeURIComponent(id) + apiKeySuffix]);
|
|
942
|
+
};
|
|
943
|
+
let identity = typeof creds[idKey] === 'string' ? creds[idKey] : '';
|
|
944
|
+
const authSource = typeof creds[srcKey] === 'string' ? creds[srcKey] : '';
|
|
945
|
+
// \u6D3E\u751F\u8EAB\u4EFD\u6BCF\u6B21 spawn \u91CD\u7B97\uFF08\u4E0D\u8BFB\u65E2\u6709\u952E\uFF09\u3002\u591A plan api-key\uFF08\u65E7+\u65B0 account / \u8F6E\u6362
|
|
946
|
+
// \u6B8B\u7559\uFF09\u65F6\u300CObject.keys \u9996\u4E2A\u547D\u4E2D\u300D\u4F1A\u6C38\u4E45\u6307\u5411\u9648\u65E7 account \u4E14 hasPlanApiKey \u6052\u771F\u3001
|
|
947
|
+
// \u6C38\u4E0D\u81EA\u6108\uFF082026-10 review\xB7DG-R2-01\uFF09\u2014\u2014\u6D3E\u751F\u4F18\u5148\u7EA7\uFF1A
|
|
948
|
+
// \u2460 project-key-location:v1:[origin,family,identity,...] \u952E\u5185\u5D4C identity
|
|
949
|
+
// \uFF08ZCode \u767B\u5F55\u5199\u5165\u7684\u786E\u5B9A\u6027\u4FE1\u53F7\uFF1B\u952E\u540D\u5C3E\u6BB5 URL \u7F16\u7801 JSON \u6570\u7EC4\uFF0C\u7B2C 2/3 \u5143\u7D20
|
|
950
|
+
// = family/identity\uFF0Cfamily \u4E0E pid \u524D\u7F00\u5339\u914D\u540C oauth \u5BB6\u65CF\u5224\u636E\uFF09\u5168\u4F53\u53BB\u91CD\u540E
|
|
951
|
+
// \u552F\u4E00\u4E14\u8BE5 identity \u540D\u4E0B\u786E\u6709 plan api-key \u2192 \u7528\u5B83\uFF1B
|
|
952
|
+
// \u2461 \u65E0\u2460\u4FE1\u53F7\u65F6\uFF0C\u8BE5 pid \u540D\u4E0B plan api-key \u952E\u7684 identity \u53BB\u91CD\u540E\u552F\u4E00 \u2192 \u7528\u5B83
|
|
953
|
+
// \uFF08\u5355 account \u5E38\u6001\uFF09\uFF1B
|
|
954
|
+
// \u2462 \u591A\u5019\u9009\u4E14\u65E0\u2460\u786E\u5B9A\u6027\u4FE1\u53F7 \u2192 \u4E0D\u731C\u6D4B\uFF1A\u4E0D\u6D3E\u751F\uFF08\u4FDD\u7559\u65E2\u6709 stored identity\uFF09\u5E76
|
|
955
|
+
// log \u6B67\u4E49\u2014\u2014\u731C\u6D4B\u6539\u5199\u6BD4\u4FDD\u7559\u9648\u65E7\u503C\u66F4\u7CDF\uFF08\u9648\u65E7\u503C\u81F3\u5C11\u662F\u767B\u5F55\u6D41\u7A0B\u5199\u8FC7\u7684\uFF09\u3002
|
|
956
|
+
let derivedIdentity = '';
|
|
957
|
+
let ambiguousIdentity = false;
|
|
958
|
+
const keyLocPrefix = 'project-key-location:v1:';
|
|
959
|
+
const keyLocIds = [];
|
|
960
|
+
for (const k of Object.keys(creds)) {
|
|
961
|
+
if (k.indexOf(keyLocPrefix) !== 0) continue;
|
|
962
|
+
try {
|
|
963
|
+
const arr = JSON.parse(decodeURIComponent(k.slice(keyLocPrefix.length)));
|
|
964
|
+
if (Array.isArray(arr) && typeof arr[1] === 'string' && typeof arr[2] === 'string'
|
|
965
|
+
&& pid.indexOf('account:' + arr[1]) === 0 && keyLocIds.indexOf(arr[2]) === -1) {
|
|
966
|
+
keyLocIds.push(arr[2]);
|
|
967
|
+
}
|
|
968
|
+
} catch (e2) { /* \u5F62\u6001\u5916\u952E\uFF08\u635F\u574F/\u975E\u6570\u7EC4\uFF09\u4E0D\u6784\u6210\u786E\u5B9A\u6027\u4FE1\u53F7 */ }
|
|
969
|
+
}
|
|
970
|
+
if (keyLocIds.length === 1 && hasPlanApiKey(keyLocIds[0])) {
|
|
971
|
+
derivedIdentity = keyLocIds[0];
|
|
972
|
+
} else {
|
|
973
|
+
const apiKeyIds = [];
|
|
974
|
+
for (const k of Object.keys(creds)) {
|
|
975
|
+
if (k.indexOf(apiKeyPrefix) !== 0 || k.slice(-apiKeySuffix.length) !== apiKeySuffix) continue;
|
|
976
|
+
const mid = k.slice(apiKeyPrefix.length, k.length - apiKeySuffix.length);
|
|
977
|
+
if (!mid) continue;
|
|
978
|
+
let id; try { id = decodeURIComponent(mid); } catch (e2) { id = mid; }
|
|
979
|
+
if (apiKeyIds.indexOf(id) === -1) apiKeyIds.push(id);
|
|
980
|
+
}
|
|
981
|
+
if (apiKeyIds.length === 1) derivedIdentity = apiKeyIds[0];
|
|
982
|
+
else if (apiKeyIds.length > 1) ambiguousIdentity = true;
|
|
983
|
+
}
|
|
984
|
+
if (ambiguousIdentity) {
|
|
985
|
+
process.stderr.write('[zcode-launcher] account metadata: multiple plan api-key identities for ' + pid + ', no deterministic signal - keeping stored identity\\n');
|
|
986
|
+
}
|
|
987
|
+
// oauth \u5BB6\u65CF\u51ED\u636E\u5B58\u5728\u6027\uFF1A\u626B oauth:<family>:access_token\uFF0Cprovider id \u4EE5
|
|
988
|
+
// account:<family> \u5F00\u5934\u5373\u7ED1\u5B9A\u8BE5\u5BB6\u65CF\uFF08\u96F6\u5BB6\u65CF\u540D\u5199\u6B7B\uFF09\u3002
|
|
989
|
+
let oauthBacked = false;
|
|
990
|
+
const oauthPrefix = 'oauth:';
|
|
991
|
+
const oauthSuffix = ':access_token';
|
|
992
|
+
for (const k of Object.keys(creds)) {
|
|
993
|
+
if (k.indexOf(oauthPrefix) !== 0 || k.slice(-oauthSuffix.length) !== oauthSuffix) continue;
|
|
994
|
+
const fam = k.slice(oauthPrefix.length, k.length - oauthSuffix.length);
|
|
995
|
+
if (!fam) continue;
|
|
996
|
+
const token = creds[k];
|
|
997
|
+
if (typeof token !== 'string' || token === '') continue;
|
|
998
|
+
if (pid.indexOf('account:' + fam) === 0) { oauthBacked = true; break; }
|
|
999
|
+
}
|
|
1000
|
+
// \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
|
|
1001
|
+
// 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
|
|
1002
|
+
// \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
|
|
1003
|
+
// \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
|
|
1004
|
+
// \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
|
|
1005
|
+
let identityCorrectedFrom = '';
|
|
1006
|
+
if (identity && !hasPlanApiKey(identity) && (authSource === 'manual' || !oauthBacked)
|
|
1007
|
+
&& derivedIdentity && derivedIdentity !== identity) {
|
|
1008
|
+
identityCorrectedFrom = identity;
|
|
1009
|
+
identity = derivedIdentity;
|
|
1010
|
+
}
|
|
1011
|
+
if (!identity) identity = derivedIdentity;
|
|
1012
|
+
if (!identity) continue;
|
|
1013
|
+
// \u2461 auth-source \u6D3E\u751F + \u5B64\u513F\u77EB\u6B63\uFF1Aoauth \u9700\u5339\u914D\u5BB6\u65CF\u7684 access_token\uFF1Bmanual \u9700\u8BE5
|
|
1014
|
+
// \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
|
|
1015
|
+
// 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
|
|
1016
|
+
const derivedAuthSource = oauthBacked ? 'oauth' : (hasPlanApiKey(identity) ? 'manual' : '');
|
|
1017
|
+
let nextAuthSource = authSource || derivedAuthSource;
|
|
1018
|
+
if (authSource === 'oauth' && !oauthBacked) nextAuthSource = derivedAuthSource;
|
|
1019
|
+
else if (authSource === 'manual' && !hasPlanApiKey(identity)) nextAuthSource = derivedAuthSource;
|
|
1020
|
+
if (!nextAuthSource) continue;
|
|
1021
|
+
// \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
|
|
1022
|
+
if (creds[idKey] !== identity) {
|
|
1023
|
+
if (identityCorrectedFrom) {
|
|
1024
|
+
reconciled.push(idKey + ' (' + identityCorrectedFrom + ' -> ' + identity + ')');
|
|
1025
|
+
} else if (typeof creds[idKey] !== 'string' || creds[idKey] === '') {
|
|
1026
|
+
added.push(idKey);
|
|
1027
|
+
}
|
|
1028
|
+
creds[idKey] = identity;
|
|
1029
|
+
}
|
|
1030
|
+
if (creds[srcKey] !== nextAuthSource) {
|
|
1031
|
+
if (typeof creds[srcKey] === 'string' && creds[srcKey] !== '') {
|
|
1032
|
+
reconciled.push(srcKey + ' (' + creds[srcKey] + ' -> ' + nextAuthSource + ')');
|
|
1033
|
+
} else added.push(srcKey);
|
|
1034
|
+
creds[srcKey] = nextAuthSource;
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
if (added.length === 0 && reconciled.length === 0) return;
|
|
1038
|
+
// compare-and-skip\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u65E0\u9501 RMW \u7684\u9648\u65E7\u8986\u76D6\u9632\u7EBF\u2014\u2014\u5199\u56DE\u524D\u91CD\u8BFB
|
|
1039
|
+
// \u78C1\u76D8\uFF0C\u4EFB\u4E00 plan \u4E24\u952E\u5F53\u524D\u503C \u2260 \u8BFB\u65F6\u57FA\u7EBF = \u7A97\u53E3\u5185 GUI/\u767B\u5F55\u5DF2\u5B8C\u6210\u6743\u5A01\u5199\u5165 \u2192 \u653E\u5F03
|
|
1040
|
+
// \u672C\u6B21\u5199\u5165\uFF08log \u8BF4\u660E\uFF0C\u4E0B\u6B21 spawn \u5E42\u7B49\u91CD\u7B97\uFF1B\u653E\u5F03\u540E\u7684\u6062\u590D = \u91CD\u65B0\u767B\u5F55/\u914D\u7F6E\u6216\u5220\u9664
|
|
1041
|
+
// \u8BE5\u952E\uFF0CADR-0143 \u5E76\u53D1\u8FB9\u754C\uFF09\u3002\u91CD\u8BFB/\u89E3\u6790\u5931\u8D25 = \u7A97\u53E3\u4E0D\u53EF\u5224\u5B9A\uFF0C\u540C\u6837\u4FDD\u5B88\u653E\u5F03\u3002
|
|
1042
|
+
try {
|
|
1043
|
+
const reread = JSON.parse(readOrig.call(fs, credPath, 'utf8'));
|
|
1044
|
+
if (!reread || typeof reread !== 'object' || Array.isArray(reread)) {
|
|
1045
|
+
throw new Error('credentials reread is not an object');
|
|
1046
|
+
}
|
|
1047
|
+
for (const mk of Object.keys(metaBaseline)) {
|
|
1048
|
+
if ((reread[mk] || '') !== (metaBaseline[mk] || '')) {
|
|
1049
|
+
throw new Error('concurrent write detected on ' + mk);
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
} catch (skipErr) {
|
|
1053
|
+
process.stderr.write('[zcode-launcher] account metadata skipped (' + ((skipErr && skipErr.message) || String(skipErr)) + ') - retry on next spawn\\n');
|
|
1054
|
+
return;
|
|
1055
|
+
}
|
|
1056
|
+
const tmp = credPath + '.taiji-tmp-' + process.pid;
|
|
1057
|
+
// 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
|
|
1058
|
+
// \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
|
|
1059
|
+
// \u5931\u8D25\u6E05\u7406 tmp\uFF0C\u4E0D\u5728\u7528\u6237\u51ED\u636E\u76EE\u5F55\u7559\u6B8B\u7247\u3002
|
|
1060
|
+
let writeMode = 0o600;
|
|
1061
|
+
try { writeMode = fs.statSync(credPath).mode & 0o777; } catch { /* \u7F3A\u7701 0600 */ }
|
|
1062
|
+
try {
|
|
1063
|
+
fs.writeFileSync(tmp, JSON.stringify(creds, null, 2), { mode: writeMode });
|
|
1064
|
+
fs.renameSync(tmp, credPath);
|
|
1065
|
+
} catch (err) {
|
|
1066
|
+
try { fs.unlinkSync(tmp); } catch { /* tmp \u672A\u751F\u6210\u6216\u5DF2 rename */ }
|
|
1067
|
+
throw err;
|
|
1068
|
+
}
|
|
1069
|
+
if (added.length > 0) process.stderr.write('[zcode-launcher] account metadata provisioned: ' + added.join(', ') + '\\n');
|
|
1070
|
+
if (reconciled.length > 0) process.stderr.write('[zcode-launcher] account metadata reconciled: ' + reconciled.join(', ') + '\\n');
|
|
1071
|
+
} catch (err) {
|
|
1072
|
+
process.stderr.write('[zcode-launcher] account metadata provisioning failed (non-blocking): ' + ((err && err.message) || String(err)) + '\\n');
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
`;
|
|
1076
|
+
|
|
510
1077
|
// src/appserver-launcher.ts
|
|
511
1078
|
var ZCODE_APPSERVER_LAUNCHER_NAME = "appserver-launcher.cjs";
|
|
512
1079
|
var APPSERVER_LAUNCHER_SOURCE = `'use strict';
|
|
@@ -527,7 +1094,7 @@ const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
|
|
|
527
1094
|
|
|
528
1095
|
// \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
|
|
529
1096
|
// + v2 \u7684 provider \u5B57\u5178\u6CE8\u5165\uFF0C\u540C id \u65F6 v2 \u6761\u76EE\u6574\u6761\u4F18\u5148\u2014\u2014GUI \u76F4\u4F20 modelConfig \u65F6
|
|
530
|
-
// v2 \u5373\u6743\u5A01\u6E90\uFF08\u8FDB\u7A0B\u5916\u7B49\u4EF7\u590D\u523B\uFF09\uFF1Bcli config \u4E0D\u5728 GUI \u7BA1\u7406\
|
|
1097
|
+
// v2 \u5373\u6743\u5A01\u6E90\uFF08\u8FDB\u7A0B\u5916\u7B49\u4EF7\u590D\u523B\uFF09\uFF1Bcli config \u4E0D\u5728 GUI \u7BA1\u7406\u4FA7\u3001\u53EF\u80FD\u6B8B\u7559\u5386\u53F2\u9A8C\u8BC1
|
|
531
1098
|
// \u914D\u7F6E\uFF082026-08-25 \u4E8B\u6545\uFF1A\u6B8B\u7559\u65E7 key \u538B\u8FC7\u65B0\u51ED\u636E\u81F4 turn 0 401\uFF09\uFF0C\u6545\u4E0D\u53D6 real \u4F18\u5148\u3002
|
|
532
1099
|
// model.main \u7F3A\u5931\u65F6\u53EA\u4ECE v2 \u900F\u4F20\uFF08v2 \u4E5F\u6CA1\u6709\u5219\u4E0D\u4F2A\u9020\u2014\u2014CLI \u7F3A\u7701\u89E3\u6790\u81EA\u4F1A\u843D\u5230\u6CE8\u518C\u8868
|
|
533
1100
|
// \u53EF\u7528\u6A21\u578B\uFF1Bplan \u5BB6\u65CF id \u5DF2\u4E0D\u53EF\u7528\uFF0C\u4E0D\u518D\u515C\u5E95\u4F2A\u9020\uFF09\u3002
|
|
@@ -556,12 +1123,16 @@ function injectedConfigText() {
|
|
|
556
1123
|
const v2Providers = v2.provider && typeof v2.provider === 'object' ? v2.provider : {};
|
|
557
1124
|
const hasKey = (entry) => entry && typeof entry === 'object'
|
|
558
1125
|
&& entry.options && typeof entry.options.apiKey === 'string' && entry.options.apiKey !== '';
|
|
559
|
-
|
|
1126
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02\uFF09\uFF1Aprovider id \u503C\u57DF\u542B '__proto__'/'toString' \u7B49\u5371\u9669\u952E
|
|
1127
|
+
//\uFF08runtime \u4FA7\u6709\u610F\u4EA7\u51FA\uFF0CS-17\uFF09\u2014\u2014\u666E\u901A\u5BF9\u8C61\u4E0A\u5BF9 __proto__ \u952E\u8D4B\u503C\u89E6\u53D1\u539F\u578B setter
|
|
1128
|
+
// \u9759\u9ED8\u4E22\u6761\u76EE\u3001\u8BFB toString \u952E\u843D\u5230\u539F\u578B\u65B9\u6CD5\u8BEF\u5224\u5DF2\u5B58\u5728\u3002Object.create(null) \u4F7F
|
|
1129
|
+
// \u952E\u8BFB\u5199\u5747\u843D\u5728 own property\u3002
|
|
1130
|
+
const injectable = Object.create(null);
|
|
560
1131
|
for (const [id, entry] of Object.entries(v2Providers)) {
|
|
561
1132
|
if (hasKey(entry)) injectable[id] = entry;
|
|
562
1133
|
}
|
|
563
1134
|
// provider_config.json \u8865\u6CE8\u5165\uFF08\u8BFB\u53D6\u5931\u8D25\u9759\u9ED8\u964D\u7EA7\u2014\u2014\u6821\u9A8C\u6E90\u7F3A\u5E2D\u65F6\u5F15\u64CE\u4FA7\u6821\u9A8C\u540C\u6837\u4E0D\u53EF
|
|
564
|
-
// \u7528\uFF0C\u6CE8\u5165\
|
|
1135
|
+
// \u7528\uFF0C\u6CE8\u5165\u70B9\u7EF4\u6301 v2-only \u73B0\u72B6\uFF1BproviderRules \u7F3A\u5931\u4E0D\u6784\u6210\u51ED\u636E\u9519\u8BEF\uFF09\u3002
|
|
565
1136
|
try {
|
|
566
1137
|
const pc = JSON.parse(readOrig(PROVIDER_CONFIG_PATH, 'utf8'));
|
|
567
1138
|
const pcCfg = pc && typeof pc.config === 'object' && pc.config ? pc.config : {};
|
|
@@ -569,7 +1140,9 @@ function injectedConfigText() {
|
|
|
569
1140
|
const rules = Array.isArray(pcr.providerRules) ? pcr.providerRules : [];
|
|
570
1141
|
const mcr = typeof pcCfg.modelConfigRules === 'object' && pcCfg.modelConfigRules ? pcCfg.modelConfigRules : {};
|
|
571
1142
|
const modelRules = Array.isArray(mcr.providerModelRules) ? mcr.providerModelRules : [];
|
|
572
|
-
|
|
1143
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02 \u540C\u65CF\uFF09\uFF1Aid \u4E3A 'constructor' \u7B49\u539F\u578B\u65B9\u6CD5\u540D\u65F6\u666E\u901A\u5BF9\u8C61\u8BFB\u53D6
|
|
1144
|
+
// \u843D\u5230\u539F\u578B Function\uFF0Cfor...of \u76F4\u63A5 TypeError \u88AB catch \u9759\u9ED8\u541E\u6389\u8BE5 rule \u7684\u5408\u6210
|
|
1145
|
+
const modelMeta = Object.create(null);
|
|
573
1146
|
for (const mr of modelRules) {
|
|
574
1147
|
if (!mr || typeof mr !== 'object' || typeof mr.providerId !== 'string' || typeof mr.modelId !== 'string') continue;
|
|
575
1148
|
(modelMeta[mr.providerId] = modelMeta[mr.providerId] || []).push(mr);
|
|
@@ -580,8 +1153,10 @@ function injectedConfigText() {
|
|
|
580
1153
|
const cfg = rule.config && typeof rule.config === 'object' ? rule.config : {};
|
|
581
1154
|
const access = cfg.access && typeof cfg.access === 'object' ? cfg.access : {};
|
|
582
1155
|
const api = cfg.api && typeof cfg.api === 'object' ? cfg.api : {};
|
|
583
|
-
// v2/real \u5DF2\u6709 \u2192 \u4E0D\u91CD\u590D\u5408\u6210\uFF08v2 \u6761\u76EE\u66F4\u5168\uFF0C\u6574\u6761\u4F18\u5148\u8BED\u4E49\u4E0D\u53D7\u5F71\u54CD\uFF09
|
|
584
|
-
|
|
1156
|
+
// v2/real \u5DF2\u6709 \u2192 \u4E0D\u91CD\u590D\u5408\u6210\uFF08v2 \u6761\u76EE\u66F4\u5168\uFF0C\u6574\u6761\u4F18\u5148\u8BED\u4E49\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002
|
|
1157
|
+
// realProviders \u662F JSON.parse \u666E\u901A\u5BF9\u8C61\uFF08\u6709\u539F\u578B\uFF09\u2014\u2014id \u4E3A 'toString' \u7B49
|
|
1158
|
+
// \u539F\u578B\u65B9\u6CD5\u540D\u65F6\u76F4\u63A5\u4E0B\u6807\u8BFB\u53D6\u6052 truthy \u8BEF\u5224 real \u5DF2\u6709\uFF0C\u987B own-property \u68C0\u67E5
|
|
1159
|
+
if (!id || injectable[id] || Object.prototype.hasOwnProperty.call(realProviders, id)) continue;
|
|
585
1160
|
// hasKey \u7EAA\u5F8B\u540C\u6B3E\uFF1A\u65E0 apiKey \u4E0D\u5408\u6210\uFF1B\u65E0 baseUrl\uFF08endpoint \u7531\u6A21\u677F\u63D0\u4F9B\u7684\u5F62\u6001\uFF09
|
|
586
1161
|
// \u4E0D\u5408\u6210\u2014\u2014\u6B8B\u7F3A\u6761\u76EE\u6BD4\u4E0D\u6CE8\u5165\u66F4\u7CDF\uFF0C\u539F\u751F\u300C\u4E0D\u5B58\u5728 Model\u300D\u62A5\u9519\u7167\u65E7\u900F\u51FA
|
|
587
1162
|
if (typeof access.apiKey !== 'string' || access.apiKey === '') continue;
|
|
@@ -613,7 +1188,7 @@ function injectedConfigText() {
|
|
|
613
1188
|
models: models,
|
|
614
1189
|
};
|
|
615
1190
|
}
|
|
616
|
-
} catch { /* provider_config \u7F3A\u5931/\u635F\u574F \u2192 \u8865\u6CE8\u5165\
|
|
1191
|
+
} catch { /* provider_config \u7F3A\u5931/\u635F\u574F \u2192 \u8865\u6CE8\u5165\u70B9\u9759\u9ED8\u964D\u7EA7\uFF08v2 \u6CE8\u5165\u4E0D\u53D7\u5F71\u54CD\uFF09 */ }
|
|
617
1192
|
if (Object.keys(injectable).length === 0) return null;
|
|
618
1193
|
const merged = { ...real };
|
|
619
1194
|
merged.provider = { ...realProviders, ...injectable };
|
|
@@ -627,7 +1202,7 @@ function injectedConfigText() {
|
|
|
627
1202
|
// [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
|
|
628
1203
|
// eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
|
|
629
1204
|
// \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
|
|
630
|
-
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\
|
|
1205
|
+
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u5207\u6362\u7248\u89C4\u5219\uFF1A
|
|
631
1206
|
// - \u526F\u672C\u975E\u5BF9\u8C61 \u2192 \u539F\u6837\u8FD4\u56DE real\uFF08\u526F\u672C\u7F3A\u5E2D\u56DE\u843D\u8BED\u4E49\uFF1Bwrapper \u4FA7\u66F4\u65E9\u77ED\u8DEF\uFF0C\u9632\u5FA1\u5F62\u6001\uFF09
|
|
632
1207
|
// - \u771F\u5B9E\u975E\u5BF9\u8C61\uFF08ENOENT/\u635F\u574F\uFF09\u2192 \u539F\u6837\u8FD4\u56DE copy\uFF08\u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6\uFF1AproviderRules
|
|
633
1208
|
// \u4EC5\u526F\u672C\u6761\u76EE + order \u4EC5\u526F\u672C\u5E8F\uFF0C\u9876\u5C42\u5B57\u6BB5\u968F\u526F\u672C\u4FDD\u6301\u5F62\u6001\u5B8C\u6574\uFF09
|
|
@@ -647,7 +1222,10 @@ function mergeProviderConfig(realObj, copyObj) {
|
|
|
647
1222
|
};
|
|
648
1223
|
const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
|
|
649
1224
|
const mergedRules = [];
|
|
650
|
-
|
|
1225
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02\uFF09\uFF1AproviderId \u4E3A '__proto__'/'toString' \u7B49\u5371\u9669\u952E\u65F6\u666E\u901A\u5BF9\u8C61
|
|
1226
|
+
// \u7684 seen \u8BFB\u5199\u90FD\u4F1A\u649E\u539F\u578B\u94FE\uFF08__proto__ \u8D4B\u503C\u88AB setter \u541E / toString \u8BFB\u5230\u539F\u578B\u65B9\u6CD5
|
|
1227
|
+
// \u8BEF\u5224\u5DF2\u89C1 \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u88AB\u4E22\uFF0C\u4E0E TS \u4FA7 Set \u5B9E\u88C5\u5206\u6B67\uFF09\u3002Object.create(null) \u6D88\u9664\u3002
|
|
1228
|
+
const seen = Object.create(null);
|
|
651
1229
|
for (const rule of rulesOf(realObj)) {
|
|
652
1230
|
mergedRules.push(rule);
|
|
653
1231
|
if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
|
|
@@ -674,7 +1252,7 @@ function mergeProviderConfig(realObj, copyObj) {
|
|
|
674
1252
|
}
|
|
675
1253
|
// [merge-fn-end]
|
|
676
1254
|
|
|
677
|
-
// D3 \u6362\
|
|
1255
|
+
// D3 \u5207\u6362\u88C5\u8F7D\u901A\u9053\uFF1A\u547D\u4E2D\u771F\u5B9E provider_config.json \u7684\u8BFB\u53D6\u91CD\u5B9A\u5411\u4E3A merge(\u771F\u5B9E\u5B9E\u65F6
|
|
678
1256
|
// \u5185\u5BB9, taiji \u540C\u6B65\u526F\u672C)\u2014\u2014\u6BCF\u6B21\u8BFB\u53D6\u91CD\u7B97\uFF08\u4E8B\u5B9E\u9A71\u52A8\uFF0C\u65E0\u7F13\u5B58/\u65F6\u95F4\u7A97\uFF0CZCode \u7AEF\u53D8\u66F4
|
|
679
1257
|
// \u5B9E\u65F6\u751F\u6548\uFF09\u3002\u526F\u672C\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 null = \u8C03\u7528\u65B9\u77ED\u8DEF\u56DE\u539F\u6587\u4EF6\uFF08\u56DE\u843D\u771F\u5B9E\u6587\u4EF6\u8BED\u4E49\uFF0C
|
|
680
1258
|
// \u96F6\u884C\u4E3A\u53D8\u5316\uFF09\uFF1Benv \u672A\u8BBE \u2192 null\uFF08\u5206\u652F\u4E0D\u6FC0\u6D3B\uFF09\u3002\u8BFB\u53D6\u4E00\u5F8B\u7ECF readOrig \u95F4\u63A5\u53D6\uFF08\u9632
|
|
@@ -733,42 +1311,9 @@ function catalogPatchText(path) {
|
|
|
733
1311
|
return result;
|
|
734
1312
|
}
|
|
735
1313
|
|
|
736
|
-
|
|
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
|
-
}
|
|
762
|
-
}
|
|
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');
|
|
765
|
-
}
|
|
766
|
-
} catch { result = null; }
|
|
767
|
-
__cliPatchCache.set(path, result);
|
|
768
|
-
return result;
|
|
769
|
-
}
|
|
1314
|
+
${CLI_PATCH_SECTION}
|
|
770
1315
|
|
|
771
|
-
// \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\
|
|
1316
|
+
// \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\u98CE\u9669\u2461\uFF09\uFF1A3.12.x \u8D77\u914D\u7F6E\u6587\u4EF6\u632A\u4F4D + CLI \u4F9D\u8D56\u5BBF\u4E3B\u6CE8\u5165
|
|
772
1317
|
// ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u76F4\u63A5\u5B9A\u4F4D\uFF1BZCode \u684C\u9762 spawn \u94FE\u81EA\u5E26\u8BE5\u952E\uFF0C
|
|
773
1318
|
// \u672C wrapper \u94FE\u9700\u81EA\u7ED9\u3002\u663E\u5F0F\u4F20\u5165\u4F18\u5148 \u2192 v2 runtime \u76EE\u5F55\u4E0B\u5E73\u53F0\u76EE\u5F55\uFF08\u7CBE\u786E
|
|
774
1319
|
// <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
|
|
@@ -840,15 +1385,32 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
|
840
1385
|
}
|
|
841
1386
|
}
|
|
842
1387
|
|
|
1388
|
+
${ACCOUNT_METADATA_SECTION}
|
|
1389
|
+
|
|
843
1390
|
// \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
1391
|
// \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
1392
|
// Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
|
|
846
1393
|
const text = injectedConfigText();
|
|
847
1394
|
const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
|
|
848
|
-
|
|
1395
|
+
const cliPatchProbe = CLI_PATH ? patchedCliSource(CLI_PATH) : null;
|
|
1396
|
+
// \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
|
|
1397
|
+
// 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
|
|
1398
|
+
// \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
|
|
1399
|
+
// \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
|
|
1400
|
+
// \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
|
|
1401
|
+
const cliPatchStatus = CLI_PATH ? __cliPatchStatus.get(CLI_PATH) : null;
|
|
1402
|
+
const anchorFlags = cliPatchStatus
|
|
1403
|
+
? '(entitled=' + (cliPatchStatus.entitled ? 'on' : 'off')
|
|
1404
|
+
+ ',standalone=' + (cliPatchStatus.standalone ? 'on' : 'off')
|
|
1405
|
+
+ ',port=' + (cliPatchStatus.headerPort ? 'on' : 'off') + ')'
|
|
1406
|
+
: '';
|
|
1407
|
+
if (text !== null || catalogPatch !== null || cliPatchProbe !== null) {
|
|
849
1408
|
process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
|
|
850
1409
|
+ ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
|
|
851
|
-
+ ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off')
|
|
1410
|
+
+ ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off')
|
|
1411
|
+
+ ', cli-source-bypass=' + (cliPatchProbe !== null ? 'armed' : 'off') + anchorFlags
|
|
1412
|
+
+ ', standalone-account=' + (cliPatchStatus && cliPatchStatus.standalone ? 'armed' : 'off')
|
|
1413
|
+
+ ', header-port=' + (cliPatchStatus && cliPatchStatus.headerPort ? 'armed' : 'off') + '\\n');
|
|
852
1414
|
// 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
1415
|
// \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
|
|
854
1416
|
// \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
|
|
@@ -862,12 +1424,17 @@ if (text !== null || catalogPatch !== null) {
|
|
|
862
1424
|
return Buffer.from(value);
|
|
863
1425
|
};
|
|
864
1426
|
fs.__origReadFileSync = fs.readFileSync;
|
|
1427
|
+
// standalone \u8D26\u53F7\u5143\u6570\u636E\u952E\u4F9B\u7ED9\uFF08ADR-0143\uFF09\uFF1A\u4EC5\u5F53 standalone \u4E0E header-port \u4E24\u951A
|
|
1428
|
+
// \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
|
|
1429
|
+
// \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
|
|
1430
|
+
// \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
|
|
1431
|
+
if (cliPatchStatus && cliPatchStatus.standalone && cliPatchStatus.headerPort) ensureAccountMetadata();
|
|
865
1432
|
fs.readFileSync = function (p, ...rest) {
|
|
866
1433
|
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
867
1434
|
const cur = injectedConfigText();
|
|
868
1435
|
if (cur !== null) return shape(rest, cur);
|
|
869
1436
|
}
|
|
870
|
-
// D3 \u6362\
|
|
1437
|
+
// D3 \u5207\u6362\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
|
|
871
1438
|
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
872
1439
|
const cur = mergedProviderConfigText();
|
|
873
1440
|
if (cur !== null) return shape(rest, cur);
|
|
@@ -924,8 +1491,8 @@ if (text !== null || catalogPatch !== null) {
|
|
|
924
1491
|
|
|
925
1492
|
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
926
1493
|
// \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\
|
|
928
|
-
// D3 \u6362\
|
|
1494
|
+
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u4FA7 = \u4E0D\u53EF\u89C1\u3002
|
|
1495
|
+
// D3 \u5207\u6362\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
|
|
929
1496
|
//\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
1497
|
fs.__origExistsSync = fs.existsSync;
|
|
931
1498
|
fs.existsSync = function (p) {
|
|
@@ -1312,7 +1879,7 @@ var AppServerConnection = class {
|
|
|
1312
1879
|
killChainPromise;
|
|
1313
1880
|
generation = 0;
|
|
1314
1881
|
pushHandlers = /* @__PURE__ */ new Map();
|
|
1315
|
-
/** [R4]
|
|
1882
|
+
/** [R4] 连接级崩溃通知侧(onClose 订阅者集合;与 pushHandlers 同构的 refCount 形态)。 */
|
|
1316
1883
|
closeHandlers = /* @__PURE__ */ new Set();
|
|
1317
1884
|
capturedProtocolInfo = null;
|
|
1318
1885
|
constructor(opts) {
|
|
@@ -1332,7 +1899,7 @@ var AppServerConnection = class {
|
|
|
1332
1899
|
get pid() {
|
|
1333
1900
|
return this.child?.pid;
|
|
1334
1901
|
}
|
|
1335
|
-
/**
|
|
1902
|
+
/** 当前代是否有活进程(关闭原语与重建测试的观测范围)。 */
|
|
1336
1903
|
get alive() {
|
|
1337
1904
|
return this.child !== null;
|
|
1338
1905
|
}
|
|
@@ -1613,7 +2180,7 @@ var AppServerConnection = class {
|
|
|
1613
2180
|
return false;
|
|
1614
2181
|
}
|
|
1615
2182
|
}
|
|
1616
|
-
/** stderr 实时 append 落盘(懒打开 + 尺寸轮转 +
|
|
2183
|
+
/** stderr 实时 append 落盘(懒打开 + 尺寸轮转 + 过期清理;失败静默——取证侧不
|
|
1617
2184
|
* 能拖垮主通道)。 */
|
|
1618
2185
|
appendStderrLog(chunk) {
|
|
1619
2186
|
if (this.stderrStreamFailed) return;
|
|
@@ -1799,7 +2366,7 @@ var SessionChannel = class {
|
|
|
1799
2366
|
/**
|
|
1800
2367
|
* [P0-1 U5/D7] dispose 标志:dispose 收割后 closeSession 短路——收割形态下连接
|
|
1801
2368
|
* 可能仍 alive(close 事件迟到,finalize 未跑、child 非 null),此时发 close
|
|
1802
|
-
* request
|
|
2369
|
+
* request 会写死进程(请求挂到控制范围超时)或触发惰性重建(凭空 spawn 无人使用的
|
|
1803
2370
|
* 进程,违背 dispose 防泄漏语义);进程随即被引擎杀链回收,会话驻留随之消亡。
|
|
1804
2371
|
*/
|
|
1805
2372
|
disposed = false;
|
|
@@ -1823,10 +2390,10 @@ var SessionChannel = class {
|
|
|
1823
2390
|
/**
|
|
1824
2391
|
* [P0-1 U5/D7] dispose 前收割 + 退订:「退订 = 不会再有事件」在结构上蕴含「在途
|
|
1825
2392
|
* turn 不应再等」——close 缺失/被吞没形态(onClose 收割主路径未触发)下,在途
|
|
1826
|
-
* turn 于退订前经既有 failAllTurns 收敛为明确失败(设计 §3.4
|
|
2393
|
+
* turn 于退订前经既有 failAllTurns 收敛为明确失败(设计 §3.4 退化路径完成;
|
|
1827
2394
|
* race 窗口在引擎 shutdownRuntimeAndDisposeChannel,量级与 awaitConnFinalized
|
|
1828
2395
|
* 同源 ZCODE_APPSERVER_HARVEST_GRACE_MS)。幂等:与 onClose 收割先到者赢
|
|
1829
|
-
* (turn.fail 的 settled
|
|
2396
|
+
* (turn.fail 的 settled 检查——已落定 turn 不改写),activeTurns 已空则 no-op。
|
|
1830
2397
|
* 不影响连接自身生命周期(R4)。
|
|
1831
2398
|
*/
|
|
1832
2399
|
dispose() {
|
|
@@ -1898,7 +2465,7 @@ var SessionChannel = class {
|
|
|
1898
2465
|
* 原样上抛(调用方决定降级形态——引擎侧 warn 后注入锚失效声明段继续执行,
|
|
1899
2466
|
* run 不失败,[U3])。
|
|
1900
2467
|
* 经 conn.request 惰性启动连接(resume 是 run 的**首个**请求——调用时点连接
|
|
1901
|
-
* 可能尚未启动,与 readBestEffort 的「已死跳过」判据不同场景,不做 alive
|
|
2468
|
+
* 可能尚未启动,与 readBestEffort 的「已死跳过」判据不同场景,不做 alive 检查)。
|
|
1902
2469
|
*/
|
|
1903
2470
|
async resumeSession(sessionId) {
|
|
1904
2471
|
return this.conn.request("session/resume", { sessionId }, { timeoutMs: ZCODE_APPSERVER_TURN_READ_TIMEOUT_MS });
|
|
@@ -2047,7 +2614,7 @@ var SessionChannel = class {
|
|
|
2047
2614
|
}
|
|
2048
2615
|
/**
|
|
2049
2616
|
* 收尾帧判定与吸收(A.2 ⑤ 两种形态:payload.response / stopReason+content 变体)。
|
|
2050
|
-
* 命中任一形态则落 finalText/finalUsage 并以 final-frame
|
|
2617
|
+
* 命中任一形态则落 finalText/finalUsage 并以 final-frame 宽松终态收尾,返回 true。
|
|
2051
2618
|
*/
|
|
2052
2619
|
applyFinalFrame(turn, payload) {
|
|
2053
2620
|
if (typeof payload.response === "string" && payload.response !== "") {
|
|
@@ -2124,7 +2691,7 @@ var SessionChannel = class {
|
|
|
2124
2691
|
* - "interrupted":用户中断形态,debug(stderr 兜底对 debug no-op——对齐
|
|
2125
2692
|
* SDK logger CONSOLE_SINK 语义,host/log 反向请求侧仍可观测);
|
|
2126
2693
|
* - 失败类(isFailedTerminalStatus,与引擎失败分流同口径)与 unknown/未识别
|
|
2127
|
-
* status:保守 warn(原样 status
|
|
2694
|
+
* status:保守 warn(原样 status 已写入文案)——假成功识破的防御机制,理论
|
|
2128
2695
|
* 不可达但保留,宁可误报不静默。
|
|
2129
2696
|
*/
|
|
2130
2697
|
logLateTerminal(turn, status) {
|
|
@@ -2165,7 +2732,7 @@ var SessionChannel = class {
|
|
|
2165
2732
|
}
|
|
2166
2733
|
}
|
|
2167
2734
|
}
|
|
2168
|
-
/** 终态后 read(A.2 ⑥)。失败/超时不抛——降级链由 runTurn
|
|
2735
|
+
/** 终态后 read(A.2 ⑥)。失败/超时不抛——降级链由 runTurn 收尾(read 只兜底不致命)。
|
|
2169
2736
|
* 连接已死时跳过(与 closeSession 同判——对死连接发请求会凭空重建进程)。 */
|
|
2170
2737
|
async readBestEffort(sessionId) {
|
|
2171
2738
|
if (!this.conn.alive) return void 0;
|
|
@@ -2320,7 +2887,7 @@ function sweepExpiredZcodeSessions(dbPath, opts = {}) {
|
|
|
2320
2887
|
return { swept, keptActive };
|
|
2321
2888
|
} catch (err) {
|
|
2322
2889
|
logger3.warn(
|
|
2323
|
-
`[zcode-ttl] sweep \u5931\u8D25\uFF08\u8F85\u52A9\u8D44\u6E90\
|
|
2890
|
+
`[zcode-ttl] sweep \u5931\u8D25\uFF08\u8F85\u52A9\u8D44\u6E90\u4FA7\uFF0C\u4E0D\u5F71\u54CD run \u4E3B\u94FE\u8DEF\uFF1B\u4E0B\u4E2A\u8282\u6D41\u7A97\u91CD\u8BD5\uFF09: ${err instanceof Error ? err.message : String(err)}`,
|
|
2324
2891
|
{ dbPath }
|
|
2325
2892
|
);
|
|
2326
2893
|
return noOp;
|
|
@@ -2398,7 +2965,7 @@ var ZcodeEngine = class {
|
|
|
2398
2965
|
permissionMode: "native",
|
|
2399
2966
|
// [D3-④] 无 turn_end 语义,轮数上限不可兑现(预检 gate 据此同步拒绝)
|
|
2400
2967
|
maxTurns: false,
|
|
2401
|
-
// [subagent-model-switch] zcode
|
|
2968
|
+
// [subagent-model-switch] zcode 引擎不在模型切换设计范围(协议范围引擎中立预留,
|
|
2402
2969
|
// 后续另立项接入)——setModel 通路未接通,unsupported 如实声明
|
|
2403
2970
|
setModel: "unsupported"
|
|
2404
2971
|
};
|
|
@@ -2466,7 +3033,7 @@ var ZcodeEngine = class {
|
|
|
2466
3033
|
* 常驻路径主编排:模型解析(v2 单源校验)→ 惰性连接 + runTurn(事件时序前移:
|
|
2467
3034
|
* text_delta 流式、终态后 message_end/turn_end)→ schema 仿真重试 → outcome/handle。
|
|
2468
3035
|
* onHandleReady 在 create 应答后(§3.4 不变量 3;原 onPoolResolved prepare 期
|
|
2469
|
-
* 声明已随 [池抽象降级 2026-09-13] poolKey
|
|
3036
|
+
* 声明已随 [池抽象降级 2026-09-13] poolKey 协议范围退役删除)。
|
|
2470
3037
|
*/
|
|
2471
3038
|
async runViaAppServer(task, ctx) {
|
|
2472
3039
|
const startedAt = Date.now();
|
|
@@ -2486,7 +3053,7 @@ var ZcodeEngine = class {
|
|
|
2486
3053
|
const outcome = this.finalizeOutcome(task, ctx, final, usageAcc, startedAt);
|
|
2487
3054
|
return { handle: this.appServerHandle(outcome), outcome };
|
|
2488
3055
|
}
|
|
2489
|
-
/** pre-aborted
|
|
3056
|
+
/** pre-aborted 短路收尾:合成中止 outcome + 'shared' 锚定 handle。 */
|
|
2490
3057
|
abortedAppServerRun(task, ctx, startedAt) {
|
|
2491
3058
|
const outcome = this.finalizeOutcome(
|
|
2492
3059
|
task,
|
|
@@ -2506,11 +3073,11 @@ var ZcodeEngine = class {
|
|
|
2506
3073
|
* 新建会话)。重试轮 prompt 用 basePrompt 原样重跑(失败形态非 schema),文案补
|
|
2507
3074
|
* 「已自动重试一次」句(retried 标记仅对真实发生的重试生效)。
|
|
2508
3075
|
*
|
|
2509
|
-
* 两次重试一次封顶各自独立(D6
|
|
3076
|
+
* 两次重试一次封顶各自独立(D6 不采用①:多次重试/指数退避不做——重跑一轮=整任务
|
|
2510
3077
|
* 重算,一次封顶)。组合序:瞬时重试在前、schema 重试在后——瞬时重试轮 parsed 且
|
|
2511
3078
|
* 校验失败时仍进 schema 重试(末次 attempt 语义,schema 重试编排保持现状不动)。
|
|
2512
3079
|
*
|
|
2513
|
-
* 重试轮是独立会话的独立 LLM 调用:token 计入 outcome.usage
|
|
3080
|
+
* 重试轮是独立会话的独立 LLM 调用:token 计入 outcome.usage 总量;事件范围
|
|
2514
3081
|
* text_delta 按实际流出(含失败轮——journal 记录真实流水),message_end/turn_end
|
|
2515
3082
|
* 只在最终轮终态后合成(不变量 2/5)。
|
|
2516
3083
|
*/
|
|
@@ -2557,7 +3124,7 @@ var ZcodeEngine = class {
|
|
|
2557
3124
|
}
|
|
2558
3125
|
/**
|
|
2559
3126
|
* 单轮常驻执行:runTurn 组合面 + D3 abort 链 + 事件前移(text_delta 实时流出;
|
|
2560
|
-
* 终态数据经 read
|
|
3127
|
+
* 终态数据经 read 兜底收尾后才 resolve——不变量 1/2)。
|
|
2561
3128
|
*
|
|
2562
3129
|
* @param opts retried:瞬时重试轮标记——失败文案补「已自动重试一次」句(F-1/F-4)。
|
|
2563
3130
|
*/
|
|
@@ -2580,7 +3147,7 @@ var ZcodeEngine = class {
|
|
|
2580
3147
|
// 等,真机探针实证每 ~1s 一帧)→ activity 事件(零载荷纯活性信号——宿主无进展
|
|
2581
3148
|
// 守护对任何事件类型刷新;reducer no-op、不落 journal)。zcode 引擎声明
|
|
2582
3149
|
// conversation:"cold"(续聊 = session-store 冷恢复重建 + 新 run + resume 锚点,
|
|
2583
|
-
// 无热 steering/chat 域接线),run
|
|
3150
|
+
// 无热 steering/chat 域接线),run 域是唯一发射点。
|
|
2584
3151
|
onActivity: () => ctx.onEvent?.({ type: "activity" }),
|
|
2585
3152
|
onSessionCreated: (sessionId) => {
|
|
2586
3153
|
currentSessionId = sessionId;
|
|
@@ -2617,12 +3184,12 @@ var ZcodeEngine = class {
|
|
|
2617
3184
|
}
|
|
2618
3185
|
/**
|
|
2619
3186
|
* [attemptAppServerTurn 拆分] 失败分流(catch 半边):
|
|
2620
|
-
* - signal 已 aborted →
|
|
3187
|
+
* - signal 已 aborted → 中止终态收尾;
|
|
2621
3188
|
* - [P0-1 U4] 连接崩溃收割形态(failAllTurns 的错误,D6 可重试形态)判据:
|
|
2622
|
-
* 非 RPC error
|
|
3189
|
+
* 非 RPC error(服务端无明确应答——有应答即精确错误归类,非瞬时崩溃)且
|
|
2623
3190
|
* conn 不存活。时序可靠性:catch 时刻紧随 onClose 收割,连接重建仅由
|
|
2624
3191
|
* conn.request 惰性触发——本链路中 runTurn finally 的 closeSession 对死连接
|
|
2625
|
-
* 短路(channel 侧 !alive
|
|
3192
|
+
* 短路(channel 侧 !alive 检查)、stop 只属 abort 链(已被 signal.aborted
|
|
2626
3193
|
* 短路)——此刻无 request 可重建,判据可靠;
|
|
2627
3194
|
* - 其余 → 精确错误终态。
|
|
2628
3195
|
*/
|
|
@@ -2658,7 +3225,7 @@ var ZcodeEngine = class {
|
|
|
2658
3225
|
* D3 abort 链执行体(用户取消入口,fire-and-forget——与 turn promise 并行推进):
|
|
2659
3226
|
* stop 帧(超时 ZCODE_APPSERVER_STOP_TIMEOUT_MS)→ grace 窗口内 turn 落定即止
|
|
2660
3227
|
* (不杀共享进程)→ 超窗 killChain(conn.shutdown 全序:SIGTERM→grace→SIGKILL)。
|
|
2661
|
-
* turn 的最终落定由 attempt 主路径 await
|
|
3228
|
+
* turn 的最终落定由 attempt 主路径 await 收尾,本链不直接产出终态。abort 与 create
|
|
2662
3229
|
* 竞态(signal 先到、session 未建立):等会话建立(带上限)再发 stop——否则 stop
|
|
2663
3230
|
* 永远发不出,直接连坐杀共享进程。
|
|
2664
3231
|
*/
|
|
@@ -2707,7 +3274,7 @@ var ZcodeEngine = class {
|
|
|
2707
3274
|
* workspace.workspacePath 按任务传递——D10 基线不预设任务级进程 cwd)。
|
|
2708
3275
|
* spawn 经 fs 拦截 wrapper(appserver-launcher:cli config 读取重定向为
|
|
2709
3276
|
* 「真实文件 + v2 provider 注入」——CLI 形态 app-server 在共享宿主 HOME 下的
|
|
2710
|
-
*
|
|
3277
|
+
* 唯一凭据供数通路,机制与漂移风险见该文件头注)。
|
|
2711
3278
|
*/
|
|
2712
3279
|
ensureAppServerRuntime() {
|
|
2713
3280
|
if (this.appserverRuntime !== void 0) return this.appserverRuntime;
|
|
@@ -2756,7 +3323,7 @@ var ZcodeEngine = class {
|
|
|
2756
3323
|
* [P0-1 U5/D7] grace race 输掉(close 迟到/永不到达——stdio 被孙进程持有排空不
|
|
2757
3324
|
* 尽等病态形态)时,channel.dispose() 内置的 dispose 收割(failAllTurns 先于退订,
|
|
2758
3325
|
* SessionChannel.dispose)兜底在途 turn——在途 turn 收敛为「grace 窗口内明确失败」
|
|
2759
|
-
* (设计 §3.4
|
|
3326
|
+
* (设计 §3.4 退化路径完成);race 窗口与 awaitConnFinalized 同源同量级
|
|
2760
3327
|
* (ZCODE_APPSERVER_HARVEST_GRACE_MS)。正常 close 先到时 onClose 收割先行,
|
|
2761
3328
|
* dispose 收割幂等 no-op(零回归)。
|
|
2762
3329
|
*/
|
|
@@ -2772,10 +3339,10 @@ var ZcodeEngine = class {
|
|
|
2772
3339
|
rt.channel.dispose();
|
|
2773
3340
|
}
|
|
2774
3341
|
/**
|
|
2775
|
-
* [R1 D6 主体]
|
|
3342
|
+
* [R1 D6 主体] 引擎停机路径:①fire 全部在途会话的 session/close 帧(不等待
|
|
2776
3343
|
* 应答——D6① 顺序规定:close 帧必须先于 SIGTERM,否则对面来不及处理即被杀)→
|
|
2777
|
-
* ②同步 SIGTERM(conn.shutdown 调用内 killChain
|
|
2778
|
-
* Promise 前完成)→ ③grace → SIGKILL
|
|
3344
|
+
* ②同步 SIGTERM(conn.shutdown 调用内 killChain 前缀同步执行——同步部分在返回
|
|
3345
|
+
* Promise 前完成)→ ③grace → SIGKILL(异步侧,Promise resolve 于进程退出)。
|
|
2779
3346
|
* 幂等:运行时字段取走即置空,二次调用零副作用;dispose 后首个 run 经
|
|
2780
3347
|
* ensureAppServerRuntime 自动重建(与崩溃重建同一代码路径,不变量 4)。
|
|
2781
3348
|
*/
|
|
@@ -2814,7 +3381,7 @@ var ZcodeEngine = class {
|
|
|
2814
3381
|
/** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
|
|
2815
3382
|
applyAbortedOutcome(outcome, task, ctx, final, emit) {
|
|
2816
3383
|
outcome.exitCode = null;
|
|
2817
|
-
outcome.error = isHostTimeoutAbort(ctx) ? (0, import_subagent_engine_sdk12.synthesizeTimeoutOutcome)(task, final.output.stdoutText, ZCODE_ENGINE_ID).error ?? (0, import_subagent_engine_sdk12.engineTimeoutDetail)(final.output.stdoutText) : final.abortMessage ?? `engine_run_failed: zcode \u4EFB\u52A1\u88AB\u4E2D\u6B62\uFF08app-server abort \u94FE\u6536\
|
|
3384
|
+
outcome.error = isHostTimeoutAbort(ctx) ? (0, import_subagent_engine_sdk12.synthesizeTimeoutOutcome)(task, final.output.stdoutText, ZCODE_ENGINE_ID).error ?? (0, import_subagent_engine_sdk12.engineTimeoutDetail)(final.output.stdoutText) : final.abortMessage ?? `engine_run_failed: zcode \u4EFB\u52A1\u88AB\u4E2D\u6B62\uFF08app-server abort \u94FE\u6536\u5C3E\uFF0C\u5BBF\u4E3B\u5408\u6210\u7EC8\u6001\uFF09\u3002\u8F93\u51FA\u5C3E\u90E8: ${final.output.stdoutText.slice(-ZCODE_ERROR_TAIL_CHARS)}`;
|
|
2818
3385
|
emit({ type: "error", message: outcome.error });
|
|
2819
3386
|
}
|
|
2820
3387
|
/**
|
|
@@ -2860,6 +3427,17 @@ var ZcodeEngine = class {
|
|
|
2860
3427
|
listModels() {
|
|
2861
3428
|
return listZcodeModels(this.deps.sources);
|
|
2862
3429
|
}
|
|
3430
|
+
/**
|
|
3431
|
+
* [engine-ref-translation D1] 派发期模型 ref 翻译(EnginePort 可选成员实装):
|
|
3432
|
+
* pi 词汇 ref → zcode 原生 ref(zai-coding-cn/* → account:bigmodel-individual-*
|
|
3433
|
+
* 大小写归一,2026-10-16 用户裁决(证据驱动修正目标家族)),其余透传。编排层在 record stamp 前调用——
|
|
3434
|
+
* record/上报侧呈现实际发给引擎的 ref;翻译失败抛错 = 显式失败(不静默回落)。
|
|
3435
|
+
* 幂等:翻译产物(account:/个人 id)再入恒等,引擎内 resolveZcodeModelRef 的
|
|
3436
|
+
* 同名翻译分支零冲突。
|
|
3437
|
+
*/
|
|
3438
|
+
translateModelRef(modelRef) {
|
|
3439
|
+
return translatePiModelRefToZcode(modelRef, this.deps.sources);
|
|
3440
|
+
}
|
|
2863
3441
|
/** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
|
|
2864
3442
|
* 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
|
|
2865
3443
|
reasoningMemo = /* @__PURE__ */ new Map();
|
|
@@ -2891,9 +3469,9 @@ var ZcodeEngine = class {
|
|
|
2891
3469
|
* 权威,无双实现)。校验失败原样抛 ZcodePrepareError,由编排层
|
|
2892
3470
|
* (engine/model-validation.ts)包装成「引擎与模型不配套」文案。
|
|
2893
3471
|
*
|
|
2894
|
-
* [R4/D6-②] 缺席语义:本实现是进程内形态 +
|
|
3472
|
+
* [R4/D6-②] 缺席语义:本实现是进程内形态 + 协议诊断范围(宿主 cli 形态消费的是
|
|
2895
3473
|
* RemoteEngine 的 manifest 本地判定,不经本方法——SDK protocol methods.ts 明示
|
|
2896
|
-
* validateModel
|
|
3474
|
+
* validateModel 为诊断范围)。缺席 modelRef 时返回空串 canonical(= create 帧省略
|
|
2897
3475
|
* model 键、CLI 自身缺省解析——2026-09-29 account 体系迁移后 plan 家族兜底 id
|
|
2898
3476
|
* 已不可用;record 留痕侧按 R4/D6-② 空串归一为「用户未指定」条件留空)。帧应答
|
|
2899
3477
|
* 形态维持 {canonicalRef: string}(SDK port-contract 契约必填——「帧字段缺席」
|
|
@@ -2910,7 +3488,7 @@ var ZcodeEngine = class {
|
|
|
2910
3488
|
* (zcodeSessionDbPath(engineDataDir),tier1 白名单集合见方法体——宿主路径仅
|
|
2911
3489
|
* 「共享 HOME 时代」存量兼容);旧 records(池时代)的相对路径仍按池目录锚定
|
|
2912
3490
|
* 解析(read 兼容旧数据,池目录不存在时自然落②级 journal 降级)。[池抽象降级
|
|
2913
|
-
* 2026-09-13] 锚定 key 用常量 SHARED_POOL_KEY
|
|
3491
|
+
* 2026-09-13] 锚定 key 用常量 SHARED_POOL_KEY 承载——协议范围 poolKey 已删,池
|
|
2914
3492
|
* 时代真实池 key 不再随 handle 传输;若旧 record 的池目录恰为 shared 布局则①级
|
|
2915
3493
|
* 仍可达,其余池 key 的旧 record 直接走②级 journal 降级(30 天 TTL 同尺度衰减,
|
|
2916
3494
|
* 行为安全)。
|
|
@@ -3007,8 +3585,8 @@ var ZcodeEngine = class {
|
|
|
3007
3585
|
* [U6 / §3.2.6 要点 3] resume 锚 → 历史前缀(interact-resume 的读半段)。
|
|
3008
3586
|
*
|
|
3009
3587
|
* 无锚 / 非 zcode 锚形态 → undefined(行为不变)。读通道失败(会话失效 / 控制
|
|
3010
|
-
* 面错误)=
|
|
3011
|
-
* 于 create 应答,分钟级窗 +
|
|
3588
|
+
* 面错误)= 锚真失效的权威信号——宿主侧库派生视图预检查已退役(app-server 写盘滞后
|
|
3589
|
+
* 于 create 应答,分钟级窗 + 部分行永不写盘,预检查系统性误判;resume 走
|
|
3012
3590
|
* app-server resident 内存态才是真实活性判据),因此此处不再静默降级为无前缀
|
|
3013
3591
|
* 裸跑,而是返回锚失效声明段:让模型知情「延续但无历史」,基于最新消息独立
|
|
3014
3592
|
* 续推,而非在缺上下文时臆测连续性。用户消息照常执行,不炸轮。
|
|
@@ -3102,7 +3680,7 @@ function stopTimeoutMs() {
|
|
|
3102
3680
|
return resolveAppserverTimingMs(
|
|
3103
3681
|
ZCODE_APPSERVER_STOP_TIMEOUT_ENV,
|
|
3104
3682
|
ZCODE_APPSERVER_STOP_TIMEOUT_MS,
|
|
3105
|
-
"stop \u63A7\u5236\
|
|
3683
|
+
"stop \u63A7\u5236\u8303\u56F4\u8D85\u65F6"
|
|
3106
3684
|
);
|
|
3107
3685
|
}
|
|
3108
3686
|
function abortGraceMs() {
|
|
@@ -3406,10 +3984,10 @@ var EngineProtocolServer = class {
|
|
|
3406
3984
|
(0, import_server.writeRunEvent)(this.write, this.activeRuns, runId, event);
|
|
3407
3985
|
}
|
|
3408
3986
|
/**
|
|
3409
|
-
*
|
|
3987
|
+
* 发反向请求并等应答(帧④必须应答)。计时侧登记:发出 → clock.started;收到
|
|
3410
3988
|
* ack 形态应答 → clock.acked(两阶段第一段,等待不计超时);终结 → clock.settled。
|
|
3411
|
-
* 应答超时兜底 reject
|
|
3412
|
-
*
|
|
3989
|
+
* 应答超时兜底 reject——数据范围通道(host/log 等)core 10s 应答,reject 由调用方
|
|
3990
|
+
* 吞掉留痕(数据范围丢失不拖死主链路)。
|
|
3413
3991
|
*/
|
|
3414
3992
|
/**
|
|
3415
3993
|
* fire-and-forget 反向请求(`void this.reverseRequestInternal(...)` 形态)的
|
|
@@ -3424,7 +4002,7 @@ var EngineProtocolServer = class {
|
|
|
3424
4002
|
});
|
|
3425
4003
|
};
|
|
3426
4004
|
}
|
|
3427
|
-
/**
|
|
4005
|
+
/** 反向请求发送(对外公开:main.ts 的 host/log 桥接消费;内部 run 通道同路)。 */
|
|
3428
4006
|
reverseRequest(method, params) {
|
|
3429
4007
|
return this.reverseRequestInternal(method, params);
|
|
3430
4008
|
}
|
|
@@ -3441,7 +4019,7 @@ var EngineProtocolServer = class {
|
|
|
3441
4019
|
params
|
|
3442
4020
|
);
|
|
3443
4021
|
}
|
|
3444
|
-
/** 反向请求应答落位(ack 两阶段:{ack:true}/{unsupported:true}/{ok:true} 均先 ack
|
|
4022
|
+
/** 反向请求应答落位(ack 两阶段:{ack:true}/{unsupported:true}/{ok:true} 均先 ack 计时侧)。 */
|
|
3445
4023
|
settleReverse(id, frame) {
|
|
3446
4024
|
const pending = this.reversePending.get(String(id));
|
|
3447
4025
|
if (pending === void 0) return;
|