@zhushanwen/zcode-subagent-cli 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-PWNJ5JYZ.js → chunk-REEFBX67.js} +453 -90
- package/dist/index.cjs +493 -130
- package/dist/index.d.cts +17 -4
- package/dist/index.d.ts +17 -4
- package/dist/index.js +1 -1
- package/dist/main.cjs +496 -133
- package/dist/main.js +1 -1
- package/package.json +2 -2
|
@@ -369,6 +369,7 @@ function synthesizeCoarseEvents(response, usage) {
|
|
|
369
369
|
import * as fs2 from "fs";
|
|
370
370
|
import * as os2 from "os";
|
|
371
371
|
import * as path2 from "path";
|
|
372
|
+
import { resolveEngineDataDir, ZCODE_PI_SYNCED_PROVIDER_CONFIG_SEGMENTS } from "@zhushanwen/subagent-engine-sdk";
|
|
372
373
|
var ZcodePrepareError = class extends Error {
|
|
373
374
|
code;
|
|
374
375
|
constructor(code, message) {
|
|
@@ -377,35 +378,81 @@ var ZcodePrepareError = class extends Error {
|
|
|
377
378
|
this.code = code;
|
|
378
379
|
}
|
|
379
380
|
};
|
|
381
|
+
var TAIJI_SYNC_GUIDANCE = "\u82E5\u4F7F\u7528 taiji \u540C\u6B65\u526F\u672C/\u9ED8\u8BA4\u6A21\u578B\uFF0C\u5230 taiji settings \u6838\u5BF9\u6216\u91CD\u9009\uFF0C\u91CD\u542F taiji \u751F\u6548\u3002";
|
|
380
382
|
function isRecord(v) {
|
|
381
383
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
382
384
|
}
|
|
383
385
|
function strArray(v) {
|
|
384
386
|
return Array.isArray(v) ? v.filter((m) => typeof m === "string" && m.trim() !== "") : [];
|
|
385
387
|
}
|
|
386
|
-
function
|
|
387
|
-
const empty = { providers: /* @__PURE__ */ new Map(), order: [] };
|
|
388
|
+
function readSourceJsonOrUndefined(absPath) {
|
|
388
389
|
let raw;
|
|
389
390
|
try {
|
|
390
391
|
raw = fs2.readFileSync(absPath, "utf8");
|
|
391
392
|
} catch {
|
|
392
|
-
return
|
|
393
|
+
return void 0;
|
|
393
394
|
}
|
|
394
|
-
let parsed;
|
|
395
395
|
try {
|
|
396
|
-
|
|
396
|
+
return JSON.parse(raw);
|
|
397
397
|
} catch {
|
|
398
|
-
return
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
const
|
|
405
|
-
if (!
|
|
406
|
-
|
|
398
|
+
return void 0;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
function extractSourceConfig(parsed) {
|
|
402
|
+
const conf = { providers: /* @__PURE__ */ new Map(), order: [] };
|
|
403
|
+
if (!isRecord(parsed)) return conf;
|
|
404
|
+
const config = parsed["config"];
|
|
405
|
+
if (!isRecord(config)) return conf;
|
|
406
|
+
conf.order = strArray(config["providerOrder"]);
|
|
407
|
+
const rules = config["providerConfigRules"];
|
|
408
|
+
const providerRules = isRecord(rules) ? rules["providerRules"] : void 0;
|
|
409
|
+
if (Array.isArray(providerRules)) collectProviderRules(providerRules, conf);
|
|
407
410
|
return conf;
|
|
408
411
|
}
|
|
412
|
+
function readSourceConfig(absPath) {
|
|
413
|
+
return extractSourceConfig(readSourceJsonOrUndefined(absPath));
|
|
414
|
+
}
|
|
415
|
+
function mergePersonalProviderConfig(realObj, copyObj) {
|
|
416
|
+
if (!isRecord(copyObj)) return realObj;
|
|
417
|
+
if (!isRecord(realObj)) return copyObj;
|
|
418
|
+
const cfgOf = (obj) => isRecord(obj["config"]) ? obj["config"] : {};
|
|
419
|
+
const rulesOf = (obj) => {
|
|
420
|
+
const pcr = cfgOf(obj)["providerConfigRules"];
|
|
421
|
+
const rules = isRecord(pcr) ? pcr["providerRules"] : void 0;
|
|
422
|
+
return Array.isArray(rules) ? rules : [];
|
|
423
|
+
};
|
|
424
|
+
const mergedRules = [];
|
|
425
|
+
const seen = /* @__PURE__ */ new Set();
|
|
426
|
+
for (const rule of rulesOf(realObj)) {
|
|
427
|
+
mergedRules.push(rule);
|
|
428
|
+
if (isRecord(rule)) {
|
|
429
|
+
const id = rule["providerId"];
|
|
430
|
+
if (typeof id === "string" && id !== "") seen.add(id);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
for (const rule of rulesOf(copyObj)) {
|
|
434
|
+
if (!isRecord(rule)) continue;
|
|
435
|
+
const id = rule["providerId"];
|
|
436
|
+
if (typeof id !== "string" || id === "") continue;
|
|
437
|
+
if (seen.has(id)) continue;
|
|
438
|
+
seen.add(id);
|
|
439
|
+
mergedRules.push(rule);
|
|
440
|
+
}
|
|
441
|
+
const mergedOrder = [];
|
|
442
|
+
for (const id of [...strArray(cfgOf(realObj)["providerOrder"]), ...strArray(cfgOf(copyObj)["providerOrder"])]) {
|
|
443
|
+
if (!mergedOrder.includes(id)) mergedOrder.push(id);
|
|
444
|
+
}
|
|
445
|
+
const realCfg = cfgOf(realObj);
|
|
446
|
+
const realPcr = isRecord(realCfg["providerConfigRules"]) ? realCfg["providerConfigRules"] : {};
|
|
447
|
+
return {
|
|
448
|
+
...realObj,
|
|
449
|
+
config: {
|
|
450
|
+
...realCfg,
|
|
451
|
+
providerOrder: mergedOrder,
|
|
452
|
+
providerConfigRules: { ...realPcr, providerRules: mergedRules }
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
}
|
|
409
456
|
function collectProviderRules(providerRules, conf) {
|
|
410
457
|
for (const rule of providerRules) {
|
|
411
458
|
if (!isRecord(rule)) continue;
|
|
@@ -440,6 +487,40 @@ function defaultPersonalProviderConfigPath() {
|
|
|
440
487
|
function defaultV2ConfigPath() {
|
|
441
488
|
return path2.join(os2.homedir(), ...ZCODE_V2_CONFIG_PATH_SUFFIX);
|
|
442
489
|
}
|
|
490
|
+
function piSyncedProviderConfigPath(engineDataDir) {
|
|
491
|
+
return path2.join(engineDataDir, ...ZCODE_PI_SYNCED_PROVIDER_CONFIG_SEGMENTS);
|
|
492
|
+
}
|
|
493
|
+
function envEngineDataDirOrUndefined() {
|
|
494
|
+
try {
|
|
495
|
+
return resolveEngineDataDir(process.env);
|
|
496
|
+
} catch {
|
|
497
|
+
return void 0;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function resolvePersonalProviderSource(sources, engineDataDir) {
|
|
501
|
+
const explicit = sources?.personalProviderConfigPath;
|
|
502
|
+
if (explicit !== void 0) return { kind: "explicit", path: explicit };
|
|
503
|
+
const dataDir = engineDataDir ?? envEngineDataDirOrUndefined();
|
|
504
|
+
if (dataDir !== void 0 && fs2.existsSync(piSyncedProviderConfigPath(dataDir))) {
|
|
505
|
+
return { kind: "copy", path: piSyncedProviderConfigPath(dataDir), realPath: defaultPersonalProviderConfigPath() };
|
|
506
|
+
}
|
|
507
|
+
return { kind: "real", path: defaultPersonalProviderConfigPath() };
|
|
508
|
+
}
|
|
509
|
+
function resolvePersonalProviderConfigPath(sources, engineDataDir) {
|
|
510
|
+
return resolvePersonalProviderSource(sources, engineDataDir).path;
|
|
511
|
+
}
|
|
512
|
+
function readPersonalProviderView(sources) {
|
|
513
|
+
const resolution = resolvePersonalProviderSource(sources);
|
|
514
|
+
if (resolution.kind !== "copy") {
|
|
515
|
+
return { conf: readSourceConfig(resolution.path), sourceDesc: resolution.path };
|
|
516
|
+
}
|
|
517
|
+
const copyJson = readSourceJsonOrUndefined(resolution.path);
|
|
518
|
+
const realJson = readSourceJsonOrUndefined(resolution.realPath);
|
|
519
|
+
return {
|
|
520
|
+
conf: extractSourceConfig(mergePersonalProviderConfig(realJson, copyJson)),
|
|
521
|
+
sourceDesc: `merge(\u771F\u5B9E ${resolution.realPath} + \u526F\u672C ${resolution.path})`
|
|
522
|
+
};
|
|
523
|
+
}
|
|
443
524
|
var SEMVER_SEGMENTS = 3;
|
|
444
525
|
function locateZcodeBuiltinCatalog(sources) {
|
|
445
526
|
if (sources?.builtinCatalogPath !== void 0) return sources.builtinCatalogPath;
|
|
@@ -486,21 +567,6 @@ function locateZcodeBuiltinCatalog(sources) {
|
|
|
486
567
|
}
|
|
487
568
|
return void 0;
|
|
488
569
|
}
|
|
489
|
-
function resolveZcodeMinimalReasoningLevel(modelRef, sources) {
|
|
490
|
-
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
491
|
-
if (catalogPath === void 0) return void 0;
|
|
492
|
-
let parsed;
|
|
493
|
-
try {
|
|
494
|
-
parsed = JSON.parse(fs2.readFileSync(catalogPath, "utf8"));
|
|
495
|
-
} catch {
|
|
496
|
-
return void 0;
|
|
497
|
-
}
|
|
498
|
-
const modelId = modelShort(modelRef);
|
|
499
|
-
const rules = parsed["config"];
|
|
500
|
-
const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
|
|
501
|
-
if (!Array.isArray(modelRules)) return void 0;
|
|
502
|
-
return lastMatchingReasoningValues(modelRules, modelId)?.[0];
|
|
503
|
-
}
|
|
504
570
|
function lastMatchingReasoningValues(modelRules, modelId) {
|
|
505
571
|
let values;
|
|
506
572
|
for (const rule of modelRules) {
|
|
@@ -509,7 +575,7 @@ function lastMatchingReasoningValues(modelRules, modelId) {
|
|
|
509
575
|
if (typeof match !== "string") continue;
|
|
510
576
|
let re;
|
|
511
577
|
try {
|
|
512
|
-
re = new RegExp(match);
|
|
578
|
+
re = new RegExp(match, "i");
|
|
513
579
|
} catch {
|
|
514
580
|
continue;
|
|
515
581
|
}
|
|
@@ -521,6 +587,21 @@ function lastMatchingReasoningValues(modelRules, modelId) {
|
|
|
521
587
|
}
|
|
522
588
|
return values;
|
|
523
589
|
}
|
|
590
|
+
function resolveZcodeReasoningValues(modelRef, sources) {
|
|
591
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
592
|
+
if (catalogPath === void 0) return void 0;
|
|
593
|
+
let parsed;
|
|
594
|
+
try {
|
|
595
|
+
parsed = JSON.parse(fs2.readFileSync(catalogPath, "utf8"));
|
|
596
|
+
} catch {
|
|
597
|
+
return void 0;
|
|
598
|
+
}
|
|
599
|
+
const modelId = modelShort(modelRef);
|
|
600
|
+
const rules = parsed["config"];
|
|
601
|
+
const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
|
|
602
|
+
if (!Array.isArray(modelRules)) return void 0;
|
|
603
|
+
return lastMatchingReasoningValues(modelRules, modelId);
|
|
604
|
+
}
|
|
524
605
|
function defaultProviderForShortName(conf, withKey) {
|
|
525
606
|
const ordered = conf.order.find((id) => {
|
|
526
607
|
const entry = conf.providers.get(id);
|
|
@@ -529,19 +610,65 @@ function defaultProviderForShortName(conf, withKey) {
|
|
|
529
610
|
if (ordered !== void 0) return ordered;
|
|
530
611
|
return withKey[0][0];
|
|
531
612
|
}
|
|
613
|
+
function resolveAccountModelRef(wanted, wantedProvider, sources) {
|
|
614
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
615
|
+
if (catalogPath === void 0) {
|
|
616
|
+
throw new ZcodePrepareError(
|
|
617
|
+
"model_not_available",
|
|
618
|
+
`account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u5B9A\u4F4D\u5931\u8D25\uFF08ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u4E0E runtime/provider \u626B\u63CF\u5747\u672A\u547D\u4E2D\uFF09\u3002`
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
let catalog;
|
|
622
|
+
try {
|
|
623
|
+
catalog = JSON.parse(fs2.readFileSync(catalogPath, "utf8"));
|
|
624
|
+
} catch (err) {
|
|
625
|
+
throw new ZcodePrepareError(
|
|
626
|
+
"model_not_available",
|
|
627
|
+
`account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u4E0D\u53EF\u8BFB\uFF08${err instanceof Error ? err.message : String(err)}\uFF09\u3002`
|
|
628
|
+
);
|
|
629
|
+
}
|
|
630
|
+
const accountRule = findAccountProviderRule(catalog, wantedProvider);
|
|
631
|
+
if (accountRule === void 0) {
|
|
632
|
+
throw new ZcodePrepareError(
|
|
633
|
+
"model_not_available",
|
|
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
|
+
);
|
|
636
|
+
}
|
|
637
|
+
assertAccountModelKnown(accountRule, wanted, wantedProvider);
|
|
638
|
+
return wanted;
|
|
639
|
+
}
|
|
640
|
+
function findAccountProviderRule(catalog, wantedProvider) {
|
|
641
|
+
const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
|
|
642
|
+
const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
|
|
643
|
+
return isRecord(accountRule) ? accountRule : void 0;
|
|
644
|
+
}
|
|
645
|
+
function assertAccountModelKnown(accountRule, wanted, wantedProvider) {
|
|
646
|
+
const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
|
|
647
|
+
const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
|
|
648
|
+
const short = modelShort(wanted);
|
|
649
|
+
if (Array.isArray(modelIds) && modelIds.length > 0 && !modelIds.includes(short)) {
|
|
650
|
+
throw new ZcodePrepareError(
|
|
651
|
+
"model_not_available",
|
|
652
|
+
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
|
|
653
|
+
);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
532
656
|
function resolveZcodeModelRef(requested, sources) {
|
|
533
|
-
const
|
|
534
|
-
const conf = readSourceConfig(srcPath);
|
|
657
|
+
const { conf, sourceDesc } = readPersonalProviderView(sources);
|
|
535
658
|
const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
|
|
536
659
|
const wanted = requested?.trim() || void 0;
|
|
537
660
|
if (withKey.length === 0) {
|
|
538
661
|
const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
|
|
539
662
|
throw new ZcodePrepareError(
|
|
540
663
|
"engine_credential_missing",
|
|
541
|
-
`zcode \u5F15\u64CE\u627E\u4E0D\u5230\u4EFB\u4F55\u5E26 apiKey \u7684\u4E2A\u4EBA provider\uFF08${hint}\uFF09\u3002\u5DF2\u8BFB\u6E90\uFF1A${
|
|
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
|
|
542
665
|
);
|
|
543
666
|
}
|
|
544
667
|
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
|
+
}
|
|
545
672
|
const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
|
|
546
673
|
const short = modelShort(wanted);
|
|
547
674
|
const entry = conf.providers.get(provider);
|
|
@@ -549,26 +676,26 @@ function resolveZcodeModelRef(requested, sources) {
|
|
|
549
676
|
const known = withKey.map(([id]) => id).join(", ");
|
|
550
677
|
throw new ZcodePrepareError(
|
|
551
678
|
"model_not_available",
|
|
552
|
-
`\u672A\u77E5 provider "${provider}"\uFF08\u5E26\u51ED\u636E\u7684\u4E2A\u4EBA provider: ${known}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u4E0A\u8FF0 provider \u4E4B\u4E00\uFF08\u5168\u540D provider/model\uFF09\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u8BE5 provider \u540E\u91CD\u8BD5\uFF1B\u7701\u7565 model \u53C2\u6570\u5219\u8D70\u5F15\u64CE\u7F3A\u7701\u89E3\u6790\uFF08CLI \u81EA\u8EAB\u9009\u53D6\u53EF\u7528\u6A21\u578B\uFF09\u3002`
|
|
679
|
+
`\u672A\u77E5 provider "${provider}"\uFF08\u5E26\u51ED\u636E\u7684\u4E2A\u4EBA provider: ${known}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u4E0A\u8FF0 provider \u4E4B\u4E00\uFF08\u5168\u540D provider/model\uFF09\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u914D\u7F6E\u8BE5 provider \u540E\u91CD\u8BD5\uFF1B\u7701\u7565 model \u53C2\u6570\u5219\u8D70\u5F15\u64CE\u7F3A\u7701\u89E3\u6790\uFF08CLI \u81EA\u8EAB\u9009\u53D6\u53EF\u7528\u6A21\u578B\uFF09\u3002` + TAIJI_SYNC_GUIDANCE
|
|
553
680
|
);
|
|
554
681
|
}
|
|
555
682
|
if (!hasApiKey(entry)) {
|
|
556
683
|
throw new ZcodePrepareError(
|
|
557
684
|
"engine_credential_missing",
|
|
558
|
-
`provider "${provider}" \u5B58\u5728\u4F46\u672A\u914D\u7F6E apiKey\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u4E3A\u8BE5 provider \u914D\u7F6E\u51ED\u636E\uFF0C\u6216\u6539\u7528\u5DF2\u914D\u51ED\u636E\u7684 provider\uFF08${withKey.map(([id]) => id).join(", ")}\uFF09\u540E\u91CD\u8BD5\u3002`
|
|
685
|
+
`provider "${provider}" \u5B58\u5728\u4F46\u672A\u914D\u7F6E apiKey\u3002\u6062\u590D\u6307\u5F15\uFF1A\u5728 ZCode \u684C\u9762\u7AEF\u4E3A\u8BE5 provider \u914D\u7F6E\u51ED\u636E\uFF0C\u6216\u6539\u7528\u5DF2\u914D\u51ED\u636E\u7684 provider\uFF08${withKey.map(([id]) => id).join(", ")}\uFF09\u540E\u91CD\u8BD5\u3002` + TAIJI_SYNC_GUIDANCE
|
|
559
686
|
);
|
|
560
687
|
}
|
|
561
688
|
const models = entry.models ?? [];
|
|
562
689
|
if (models.length > 0 && !models.includes(short)) {
|
|
563
690
|
throw new ZcodePrepareError(
|
|
564
691
|
"model_not_available",
|
|
565
|
-
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08provider ${provider} \u4E0B\u53EF\u7528: ${models.join(", ")}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u8BE5 provider \u4E0B\u7684\u6A21\u578B\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u542F\u7528\u76EE\u6807\u6A21\u578B\u540E\u91CD\u8BD5\u3002`
|
|
692
|
+
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08provider ${provider} \u4E0B\u53EF\u7528: ${models.join(", ")}\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u8BE5 provider \u4E0B\u7684\u6A21\u578B\uFF0C\u6216\u5728 ZCode \u684C\u9762\u7AEF\u542F\u7528\u76EE\u6807\u6A21\u578B\u540E\u91CD\u8BD5\u3002` + TAIJI_SYNC_GUIDANCE
|
|
566
693
|
);
|
|
567
694
|
}
|
|
568
695
|
return `${provider}/${short}`;
|
|
569
696
|
}
|
|
570
697
|
function listZcodeModels(sources) {
|
|
571
|
-
const conf =
|
|
698
|
+
const { conf } = readPersonalProviderView(sources);
|
|
572
699
|
const out = [];
|
|
573
700
|
for (const [pid, entry] of conf.providers) {
|
|
574
701
|
if (!hasApiKey(entry)) continue;
|
|
@@ -600,7 +727,12 @@ const os = require('node:os');
|
|
|
600
727
|
|
|
601
728
|
const CLI_PATH = process.env.ZCODE_ENG_CLI_PATH;
|
|
602
729
|
const V2_PATH = process.env.ZCODE_ENG_V2_CONFIG || path.join(os.homedir(), '.zcode', 'v2', 'config.json');
|
|
603
|
-
|
|
730
|
+
// \u771F\u5B9E provider_config.json\uFF08Registry \u76F4\u8BFB\u8DEF\u5F84\uFF0CA0 \u63A2\u9488\u5B9E\u8BC1\uFF09\u2014\u2014\u4E0E CONFIG_PATH \u540C\u6B3E
|
|
731
|
+
// homedir \u63A8\u5BFC\u5F62\u6001\uFF0C\u4E0D\u53D7 env \u91CD\u5B9A\u5411\uFF08merge \u5206\u652F\u8981\u8BFB\u7684\u6B63\u662F\u8FD9\u4E2A\u771F\u5B9E\u8DEF\u5F84\u672C\u8EAB\uFF09
|
|
732
|
+
const REAL_PROVIDER_CONFIG_PATH = path.join(os.homedir(), '.zcode', 'v2', 'provider_config.json');
|
|
733
|
+
// taiji \u540C\u6B65\u526F\u672C\u8DEF\u5F84\uFF08ZCODE_ENG_PROVIDER_CONFIG \u8BED\u4E49\u6536\u7A84\uFF1B'' = \u672A\u8BBE \u2192 merge \u5206\u652F\u4E0D\u6FC0\u6D3B\uFF09
|
|
734
|
+
const PI_SYNCED_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || '';
|
|
735
|
+
const PROVIDER_CONFIG_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || REAL_PROVIDER_CONFIG_PATH;
|
|
604
736
|
const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
|
|
605
737
|
|
|
606
738
|
// \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
|
|
@@ -623,7 +755,7 @@ function injectedConfigText() {
|
|
|
623
755
|
let v2 = {};
|
|
624
756
|
try { v2 = JSON.parse(readOrig(V2_PATH, 'utf8')); }
|
|
625
757
|
catch (err) {
|
|
626
|
-
// ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\
|
|
758
|
+
// ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\u4E0D\u6784\u6210\u9519\u8BEF\uFF1B\u8DF3\u8FC7\u51B3\u7B56\u7531\u5B89\u88C5\u95E8\u65E5\u5FD7\u627F\u8F7D\uFF09\uFF1B\u5176\u4ED6\u5931\u8D25\uFF08JSON \u635F\u574F/\u6743\u9650\uFF09
|
|
627
759
|
// \u51FA\u58F0\u2014\u2014\u5426\u5219\u6392\u969C\u4F1A\u88AB\u539F\u751F\u300C\u8BF7\u767B\u5F55\u300D\u62A5\u9519\u8BEF\u5BFC\uFF0C\u4E0E\u771F\u56E0\uFF08\u6587\u4EF6\u635F\u574F\uFF09\u4E0D\u7B26
|
|
628
760
|
if (!err || err.code !== 'ENOENT') {
|
|
629
761
|
process.stderr.write('[zcode-launcher] v2 config \u8BFB\u53D6\u5931\u8D25(' + ((err && err.code) || (err && err.message) || 'unknown') + '): ' + V2_PATH + '\u2014\u2014\u51ED\u636E\u6CE8\u5165\u672A\u751F\u6548\\n');
|
|
@@ -678,11 +810,14 @@ function injectedConfigText() {
|
|
|
678
810
|
for (const mid of order) {
|
|
679
811
|
if (typeof mid === 'string' && mid !== '' && !(mid in models)) models[mid] = {};
|
|
680
812
|
}
|
|
813
|
+
// kind \u6309\u6761\u76EE api.type \u6D3E\u751F\uFF08D3\uFF09\uFF1Aanthropic-messages \u2192 anthropic\uFF0C\u5176\u4F59
|
|
814
|
+
// \uFF08openai-chat-completions / api.type \u7F3A\u5E2D / \u672A\u77E5\u503C\uFF09\u2192 openai-compatible
|
|
815
|
+
// \u2014\u2014\u5BF9\u9F50 v2 config.json \u65E2\u6709 kind \u4E24\u503C\u5F62\u6001\uFF1B\u4F5C\u7528\u4E8E\u8865\u6CE8\u5165\u6BB5\u5168\u90E8\u6761\u76EE\uFF08\u542B\u900F\u4F20
|
|
816
|
+
// \u771F\u5B9E\u6761\u76EE\uFF0Canthropic \u534F\u8BAE\u771F\u5B9E\u6761\u76EE\u4ECE\u65E7\u9519\u914D\u503C openai-compatible \u987A\u5E26\u4FEE\u6B63\uFF09\u3002
|
|
817
|
+
// \u672A\u77E5\u534F\u8BAE\u503C\u9519\u914D\u65F6\u8BF7\u6C42\u671F\u534F\u8BAE\u9519\u8BEF\u53EF\u89C1\uFF08\u4E0D\u963B\u585E\u6CE8\u518C\u8868\u88C5\u8F7D\uFF09\uFF0C\u771F\u673A\u6F02\u79FB\u4FE1\u53F7\u660E\u786E
|
|
681
818
|
injectable[id] = {
|
|
682
819
|
name: typeof rule.providerName === 'string' ? rule.providerName : id,
|
|
683
|
-
|
|
684
|
-
// \u4E3A\u591A\u6570\u5148\u4F8B\uFF1B\u9519\u914D\u65F6\u8BF7\u6C42\u671F\u534F\u8BAE\u9519\u8BEF\u53EF\u89C1\uFF08\u4E0D\u963B\u585E\u6CE8\u518C\u8868\u88C5\u8F7D\uFF09\uFF0C\u771F\u673A\u6F02\u79FB\u4FE1\u53F7\u660E\u786E
|
|
685
|
-
kind: 'openai-compatible',
|
|
820
|
+
kind: api.type === 'anthropic-messages' ? 'anthropic' : 'openai-compatible',
|
|
686
821
|
options: { apiKey: access.apiKey, baseURL: api.baseUrl },
|
|
687
822
|
source: 'custom',
|
|
688
823
|
models: models,
|
|
@@ -699,50 +834,148 @@ function injectedConfigText() {
|
|
|
699
834
|
return JSON.stringify(merged);
|
|
700
835
|
}
|
|
701
836
|
|
|
837
|
+
// [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
|
|
838
|
+
// eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
|
|
839
|
+
// \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
|
|
840
|
+
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\u8F68\u7248\u89C4\u5219\uFF1A
|
|
841
|
+
// - \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
|
|
842
|
+
// - \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
|
|
843
|
+
// \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
|
|
844
|
+
// - providerRules\uFF1A\u771F\u5B9E\u6761\u76EE\u6574\u6761\u4FDD\u7559\u5728\u524D\uFF0C\u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u771F\u5B9E\u4F18\u5148 = \u540C\u540D\u8BA9\u4F4D
|
|
845
|
+
// \u7684\u8FD0\u884C\u65F6\u7B2C\u4E8C\u9053\u9632\u7EBF\uFF09\uFF1B\u65E0\u6709\u6548 providerId \u7684\u526F\u672C\u6761\u76EE\u4E22\u5F03\uFF0C\u771F\u5B9E\u6761\u76EE\u539F\u6837\u4FDD\u7559
|
|
846
|
+
// - providerOrder\uFF1A\u771F\u5B9E\u73B0\u503C\u5E8F + \u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u53BB\u91CD\u4FDD\u5E8F\uFF09
|
|
847
|
+
// - \u5176\u4F59\u5B57\u6BB5\uFF08\u542B config \u5185\u5176\u4ED6\u952E\uFF09\u53D6\u771F\u5B9E\u73B0\u503C
|
|
848
|
+
function mergeProviderConfig(realObj, copyObj) {
|
|
849
|
+
const isRec = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
850
|
+
if (!isRec(copyObj)) return realObj;
|
|
851
|
+
if (!isRec(realObj)) return copyObj;
|
|
852
|
+
const cfgOf = (obj) => (isRec(obj.config) ? obj.config : {});
|
|
853
|
+
const rulesOf = (obj) => {
|
|
854
|
+
const pcr = cfgOf(obj).providerConfigRules;
|
|
855
|
+
const r = isRec(pcr) ? pcr.providerRules : undefined;
|
|
856
|
+
return Array.isArray(r) ? r : [];
|
|
857
|
+
};
|
|
858
|
+
const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
|
|
859
|
+
const mergedRules = [];
|
|
860
|
+
const seen = {};
|
|
861
|
+
for (const rule of rulesOf(realObj)) {
|
|
862
|
+
mergedRules.push(rule);
|
|
863
|
+
if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
|
|
864
|
+
}
|
|
865
|
+
for (const rule of rulesOf(copyObj)) {
|
|
866
|
+
if (!isRec(rule) || typeof rule.providerId !== 'string' || rule.providerId === '') continue;
|
|
867
|
+
if (seen[rule.providerId]) continue;
|
|
868
|
+
seen[rule.providerId] = true;
|
|
869
|
+
mergedRules.push(rule);
|
|
870
|
+
}
|
|
871
|
+
const mergedOrder = [];
|
|
872
|
+
for (const id of strArr(cfgOf(realObj).providerOrder).concat(strArr(cfgOf(copyObj).providerOrder))) {
|
|
873
|
+
if (mergedOrder.indexOf(id) === -1) mergedOrder.push(id);
|
|
874
|
+
}
|
|
875
|
+
const outCfg = Object.assign({}, cfgOf(realObj), {
|
|
876
|
+
providerOrder: mergedOrder,
|
|
877
|
+
providerConfigRules: Object.assign(
|
|
878
|
+
{},
|
|
879
|
+
isRec(cfgOf(realObj).providerConfigRules) ? cfgOf(realObj).providerConfigRules : {},
|
|
880
|
+
{ providerRules: mergedRules },
|
|
881
|
+
),
|
|
882
|
+
});
|
|
883
|
+
return Object.assign({}, realObj, { config: outCfg });
|
|
884
|
+
}
|
|
885
|
+
// [merge-fn-end]
|
|
886
|
+
|
|
887
|
+
// D3 \u6362\u8F68\u88C5\u8F7D\u901A\u9053\uFF1A\u547D\u4E2D\u771F\u5B9E provider_config.json \u7684\u8BFB\u53D6\u91CD\u5B9A\u5411\u4E3A merge(\u771F\u5B9E\u5B9E\u65F6
|
|
888
|
+
// \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
|
|
889
|
+
// \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
|
|
890
|
+
// \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
|
|
891
|
+
// patch \u9762\u9012\u5F52\u81EA\u8C03\u7528\uFF09\u3002
|
|
892
|
+
function mergedProviderConfigText() {
|
|
893
|
+
if (!PI_SYNCED_PATH) return null;
|
|
894
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
895
|
+
let copyObj;
|
|
896
|
+
try {
|
|
897
|
+
copyObj = JSON.parse(readOrig(PI_SYNCED_PATH, 'utf8'));
|
|
898
|
+
} catch { return null; }
|
|
899
|
+
if (!copyObj || typeof copyObj !== 'object' || Array.isArray(copyObj)) return null;
|
|
900
|
+
let realObj = null;
|
|
901
|
+
try {
|
|
902
|
+
const parsed = JSON.parse(readOrig(REAL_PROVIDER_CONFIG_PATH, 'utf8'));
|
|
903
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) realObj = parsed;
|
|
904
|
+
} catch { /* ENOENT/\u635F\u574F \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6 */ }
|
|
905
|
+
return JSON.stringify(mergeProviderConfig(realObj, copyObj));
|
|
906
|
+
}
|
|
907
|
+
|
|
702
908
|
if (!CLI_PATH) {
|
|
703
909
|
process.stderr.write('[zcode-launcher] ZCODE_ENG_CLI_PATH \u672A\u8BBE\u7F6E\uFF0C\u65E0\u6CD5\u542F\u52A8 app-server\uFF08\u8BE5 env \u7531\u5F15\u64CE\u81EA\u52A8\u8BBE\u7F6E\uFF1B\u624B\u5DE5\u8FD0\u884C wrapper \u9700\u663E\u5F0F\u4F20\u5165\uFF09\\n');
|
|
704
910
|
process.exit(2);
|
|
705
911
|
}
|
|
706
912
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
if (
|
|
730
|
-
const
|
|
731
|
-
if (
|
|
913
|
+
// [2026-10-13 account \u76F4\u901A] \u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6\u62E6\u622A\uFF1A\u7ED9 zhipu-account \u6761\u76EE\u6CE8\u5165 entitled:true\u3002
|
|
914
|
+
// app-server \u6CE8\u518C\u8868\u88C5\u8F7D\u5224\u636E = access.entitled === true\uFF0C\u5916\u90E8 spawn \u4ECE\u76EE\u5F55\u6784\u5EFA\u7684\u8D26\u53F7
|
|
915
|
+
// \u6761\u76EE\u9ED8\u8BA4\u975E entitled\uFF08YXe \u786C\u7F16\u7801 !1\uFF09\u2192 plan \u5BB6\u65CF\u5F15\u7528\u4E00\u5F8B\u300C\u4E0D\u5B58\u5728 Model\u300D\u3002\u7528\u6237\u88C1\u51B3\uFF1A
|
|
916
|
+
// zai \u7CFB\u8D70 account provider \u914D\u7F6E\u5E76\u7ED5\u8FC7\u8BE5\u9650\u5236\u2014\u2014patch \u53EA\u53D1\u751F\u5728\u672C wrapper \u7684\u8BFB\u53D6\u8FD4\u56DE\u503C\uFF0C
|
|
917
|
+
// ZCode.app \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\u3002null = \u76EE\u5F55\u65E0 zhipu-account \u6761\u76EE\uFF08\u65E0\u9700 patch\uFF09\u3002
|
|
918
|
+
// \u672C\u51FD\u6570\u5FC5\u987B\u4EE5\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u8C03\u7528\uFF08\u5B89\u88C5\u95E8\u4F20 CATALOG_PATH\uFF09\u2014\u2014\u65E0\u53C2\u8C03\u7528\u4F1A\u5728\u8BFB\u6587\u4EF6
|
|
919
|
+
// \u65F6\u629B\u9519\u88AB catch \u6052\u8FD4 null\uFF0C\u66FE\u81F4\u7EAF account \u5BBF\u4E3B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\uFF08\u89C1\u5B89\u88C5\u95E8\u5904\u6CE8\u91CA\uFF09\u3002
|
|
920
|
+
let CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
|
|
921
|
+
const __catalogPatchCache = new Map();
|
|
922
|
+
// \u8DF3\u8FC7\u51B3\u7B56\u5F52\u56E0\uFF082026-10 \u5BA1\u67E5\u8865\uFF09\uFF1AcatalogPatchText \u628A\u300C\u65E0\u6761\u76EE\u9700\u8865\u300D\u4E0E\u300C\u8BFB\u53D6/\u89E3\u6790\u5931\u8D25
|
|
923
|
+
// \uFF08\u6587\u4EF6\u7F3A\u5931/\u635F\u574F\uFF09\u300D\u90FD\u6298\u6210 null\uFF0C\u8DF3\u8FC7\u65E5\u5FD7\u82E5\u4E0D\u533A\u5206\u4F1A\u628A\u635F\u574F\u6001\u8BEF\u62A5\u6210\u300C\u65E0\u6761\u76EE\u300D\uFF0C\u6392\u969C\u88AB\u8BEF\u5BFC
|
|
924
|
+
const __catalogPatchStatus = new Map(); // path -> 'no-entries' | 'unreadable'
|
|
925
|
+
function catalogPatchText(path) {
|
|
926
|
+
if (__catalogPatchCache.has(path)) return __catalogPatchCache.get(path);
|
|
927
|
+
let result = null;
|
|
928
|
+
try {
|
|
929
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
930
|
+
const parsed = JSON.parse(readOrig(path, 'utf8'));
|
|
931
|
+
const rules = parsed && parsed.config && parsed.config.providerConfigRules
|
|
932
|
+
&& Array.isArray(parsed.config.providerConfigRules.providerRules)
|
|
933
|
+
? parsed.config.providerConfigRules.providerRules : null;
|
|
934
|
+
let touched = 0;
|
|
935
|
+
if (rules) for (const rule of rules) {
|
|
936
|
+
const acc = rule && rule.config && rule.config.access;
|
|
937
|
+
if (acc && acc.type === 'zhipu-account' && acc.entitled !== true) { acc.entitled = true; touched++; }
|
|
938
|
+
}
|
|
939
|
+
result = touched > 0 ? JSON.stringify(parsed) : null;
|
|
940
|
+
__catalogPatchStatus.set(path, 'no-entries');
|
|
941
|
+
} catch { result = null; __catalogPatchStatus.set(path, 'unreadable'); }
|
|
942
|
+
__catalogPatchCache.set(path, result);
|
|
943
|
+
return result;
|
|
944
|
+
}
|
|
945
|
+
|
|
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
|
+
}
|
|
732
972
|
}
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
736
|
-
// \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
|
|
737
|
-
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u53D6\u9762 = \u4E0D\u53EF\u89C1
|
|
738
|
-
fs.__origExistsSync = fs.existsSync;
|
|
739
|
-
fs.existsSync = function (p) {
|
|
740
|
-
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
741
|
-
const cur = injectedConfigText();
|
|
742
|
-
if (cur !== null) return true;
|
|
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');
|
|
743
975
|
}
|
|
744
|
-
|
|
745
|
-
|
|
976
|
+
} catch { result = null; }
|
|
977
|
+
__cliPatchCache.set(path, result);
|
|
978
|
+
return result;
|
|
746
979
|
}
|
|
747
980
|
|
|
748
981
|
// \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
|
|
@@ -751,6 +984,11 @@ if (text !== null) {
|
|
|
751
984
|
// <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
|
|
752
985
|
// \uFF08semver \u6700\u5927\uFF09\u7684 endpoint-*/zcode-builtin.json \u2192 \u90FD\u627E\u4E0D\u5230\u5219\u4E0D\u8BBE\u952E\uFF0C\u8BA9 CLI
|
|
753
986
|
// \u539F\u751F\u62A5\u9519\u900F\u51FA\uFF08\u9519\u8BEF\u6587\u6848\u542B\u6062\u590D\u6307\u5F15\uFF09\u3002
|
|
987
|
+
// [\u4F4D\u7F6E\uFF1A\u5B89\u88C5\u95E8\u4E4B\u524D] \u5B9A\u4F4D/env \u63A8\u5BFC\u5FC5\u987B\u5148\u4E8E\u5B89\u88C5\u95E8\u5224\u5B9A\u5B8C\u6210\u2014\u2014catalogPatchText
|
|
988
|
+
// \u9700\u8981\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u53C2\u4E0E\u95E8\u5224\u5B9A\u3002\u66FE\u56E0\u95E8\u5148\u4E8E\u5B9A\u4F4D\u6267\u884C\u4E14\u65E0\u53C2\u8C03\u7528\uFF0C
|
|
989
|
+
// fs.readFileSync(undefined) \u629B\u9519\u88AB catch \u6052\u8FD4 null \u2192 \u95E8\u9000\u5316\u4E3A text!==null\uFF0C
|
|
990
|
+
// \u7EAF account \u5BBF\u4E3B\uFF08v2 \u65E0\u51ED\u636E\u6761\u76EE \u2192 text=null\uFF09\u4E0B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\u3001account
|
|
991
|
+
// \u76F4\u901A\u6574\u4F53\u5931\u6548\u4E14\u96F6\u65E5\u5FD7\uFF082026-10 \u56DE\u5F52\u4FEE\u590D\uFF09\u3002
|
|
754
992
|
if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
755
993
|
let located = null;
|
|
756
994
|
try {
|
|
@@ -792,6 +1030,7 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
|
792
1030
|
}
|
|
793
1031
|
} catch { /* provider \u76EE\u5F55\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 \u4E0D\u8BBE\u952E */ }
|
|
794
1032
|
if (located) process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE = located;
|
|
1033
|
+
CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
|
|
795
1034
|
// endpoint origin \u5BF9\u9F50\uFF082026-09-29 \u8FC1\u79FB\u540C\u6B65\uFF09\uFF1ACLI \u6309 ZCODE_BASE_URL \u6D3E\u751F active
|
|
796
1035
|
// \u76EE\u5F55\u8DEF\u5F84\uFF08sha256(origin) \u524D\u7F00\uFF09\uFF1BGUI \u5B89\u88C5\u7684\u76EE\u5F55\u5728 refresh \u63A7\u5236\u6587\u4EF6\u7684 endpointKey
|
|
797
1036
|
// \u4E0B\uFF08\u5982 https://zcode.z.ai\uFF09\uFF0C\u4E0E CLI \u7F3A\u7701 origin\uFF08bigmodel.cn\uFF09\u4E0D\u540C\u2014\u2014\u4E0D\u6CE8\u5165\u5219
|
|
@@ -811,6 +1050,115 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
|
811
1050
|
}
|
|
812
1051
|
}
|
|
813
1052
|
|
|
1053
|
+
// \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
|
+
// \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
|
+
// Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
|
|
1056
|
+
const text = injectedConfigText();
|
|
1057
|
+
const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
|
|
1058
|
+
if (text !== null || catalogPatch !== null) {
|
|
1059
|
+
process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
|
|
1060
|
+
+ ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
|
|
1061
|
+
+ ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off') + ', cli-source-bypass=armed\\n');
|
|
1062
|
+
// 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
|
+
// \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
|
|
1064
|
+
// \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
|
|
1065
|
+
// shape \u540C\u65F6\u670D\u52A1\u56DB\u5904 patch \u6E90\uFF08config / provider merge / \u5185\u5EFA\u76EE\u5F55 / \u2014\u2014encoding \u5F52\u4E00
|
|
1066
|
+
// \u8BED\u4E49\u76F8\u540C\uFF0C\u5355\u526F\u672C\uFF1A\u76EE\u5F55\u6761\u76EE\u66FE\u53E6\u6301\u9010\u5B57\u91CD\u590D\u526F\u672C catalogShape\uFF0C\u5DF2\u5E76\u56DE\u672C\u51FD\u6570\uFF09
|
|
1067
|
+
const shape = (args, value) => {
|
|
1068
|
+
const enc = args[0];
|
|
1069
|
+
const e = typeof enc === 'string' ? enc
|
|
1070
|
+
: (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
|
|
1071
|
+
if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
|
|
1072
|
+
return Buffer.from(value);
|
|
1073
|
+
};
|
|
1074
|
+
fs.__origReadFileSync = fs.readFileSync;
|
|
1075
|
+
fs.readFileSync = function (p, ...rest) {
|
|
1076
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
1077
|
+
const cur = injectedConfigText();
|
|
1078
|
+
if (cur !== null) return shape(rest, cur);
|
|
1079
|
+
}
|
|
1080
|
+
// D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
|
|
1081
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
1082
|
+
const cur = mergedProviderConfigText();
|
|
1083
|
+
if (cur !== null) return shape(rest, cur);
|
|
1084
|
+
}
|
|
1085
|
+
// account \u76F4\u901A\uFF1A\u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6 \u2192 zhipu-account \u6CE8\u5165 entitled:true\u3002\u6309\u6587\u4EF6\u540D\u5339\u914D
|
|
1086
|
+
// \uFF08app-server \u6309 ZCODE_BASE_URL \u81EA\u6D3E\u751F endpoint \u76EE\u5F55\uFF0C\u8BFB\u8DEF\u5F84\u2260env \u5B9A\u4F4D\u8DEF\u5F84\uFF09\u3002
|
|
1087
|
+
if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
|
|
1088
|
+
const cur = catalogPatchText(p);
|
|
1089
|
+
if (cur !== null) return shape(rest, cur);
|
|
1090
|
+
}
|
|
1091
|
+
// account \u76F4\u901A\u2461\uFF1ACLI bundle \u6E90\u7801 \u2192 YXe entitled:!1 \u5185\u5B58\u7FFB\u8F6C\u4E3A !0
|
|
1092
|
+
if (typeof p === 'string' && p === CLI_PATH) {
|
|
1093
|
+
const cur = patchedCliSource(p);
|
|
1094
|
+
if (cur !== null) return cur;
|
|
1095
|
+
}
|
|
1096
|
+
return fs.__origReadFileSync.call(fs, p, ...rest);
|
|
1097
|
+
};
|
|
1098
|
+
fs.promises.__origReadFile = fs.promises.readFile;
|
|
1099
|
+
fs.promises.readFile = function (p, ...rest) {
|
|
1100
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
1101
|
+
const cur = injectedConfigText();
|
|
1102
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
1103
|
+
}
|
|
1104
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
1105
|
+
const cur = mergedProviderConfigText();
|
|
1106
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
1107
|
+
}
|
|
1108
|
+
if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
|
|
1109
|
+
const cur = catalogPatchText(p);
|
|
1110
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
1111
|
+
}
|
|
1112
|
+
if (typeof p === 'string' && p === CLI_PATH) {
|
|
1113
|
+
const cur = patchedCliSource(p);
|
|
1114
|
+
if (cur !== null) return Promise.resolve(cur);
|
|
1115
|
+
}
|
|
1116
|
+
return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
|
|
1117
|
+
};
|
|
1118
|
+
// [account \u76F4\u901A\u2461 \u8F7D\u4F53] .js \u6269\u5C55\u5904\u7406\u5668\u6302\u94A9\uFF1ANode \u5BF9 CJS \u5165\u53E3\u6E90\u7801\u7684\u8BFB\u53D6\u8D70\u539F\u751F
|
|
1119
|
+
// internalModuleReadFile \u901A\u9053\uFF0Cfs \u7334\u8865\u4E01\u4E0D\u53EF\u89C1\u2014\u2014CLI bundle \u6E90\u7801\u8865\u4E01\u6539\u5728\u6269\u5C55
|
|
1120
|
+
// \u5904\u7406\u5668\u5C42\u62E6\u622A\uFF08\u4EC5\u547D\u4E2D CLI_PATH\uFF1B\u5176\u4F59\u6587\u4EF6\u5168\u6743\u59D4\u6258\u539F handler\uFF0C\u96F6\u989D\u5916\u5F00\u9500\uFF09\u3002
|
|
1121
|
+
const __Module = require('node:module');
|
|
1122
|
+
const __origJsHandler = __Module._extensions['.js'];
|
|
1123
|
+
__Module._extensions['.js'] = function (mod, filename) {
|
|
1124
|
+
if (CLI_PATH && filename === CLI_PATH) {
|
|
1125
|
+
const patched = patchedCliSource(filename);
|
|
1126
|
+
if (patched !== null) {
|
|
1127
|
+
let src = patched.charCodeAt(0) === 0xfeff ? patched.slice(1) : patched;
|
|
1128
|
+
if (src.startsWith('#!')) src = src.slice(src.indexOf('\\n') + 1);
|
|
1129
|
+
return mod._compile(src, filename);
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
return __origJsHandler(mod, filename);
|
|
1133
|
+
};
|
|
1134
|
+
|
|
1135
|
+
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
1136
|
+
// \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
|
|
1137
|
+
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u53D6\u9762 = \u4E0D\u53EF\u89C1\u3002
|
|
1138
|
+
// D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
|
|
1139
|
+
//\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
|
|
1140
|
+
fs.__origExistsSync = fs.existsSync;
|
|
1141
|
+
fs.existsSync = function (p) {
|
|
1142
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
1143
|
+
const cur = injectedConfigText();
|
|
1144
|
+
if (cur !== null) return true;
|
|
1145
|
+
}
|
|
1146
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
|
|
1147
|
+
if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
|
|
1148
|
+
return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
|
|
1149
|
+
}
|
|
1150
|
+
return fs.__origExistsSync.call(fs, p);
|
|
1151
|
+
};
|
|
1152
|
+
} else {
|
|
1153
|
+
process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u672A\u5B89\u88C5(\u8DF3\u8FC7): \u65E0\u51ED\u636E\u53EF\u6CE8\u5165(v2 config \u65E0 provider \u6761\u76EE)'
|
|
1154
|
+
+ (CATALOG_PATH !== null
|
|
1155
|
+
? (__catalogPatchStatus.get(CATALOG_PATH) === 'unreadable'
|
|
1156
|
+
? '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46 catalog \u8BFB\u53D6/\u89E3\u6790\u5931\u8D25(\u6587\u4EF6\u7F3A\u5931\u6216\u635F\u574F\uFF0C\u6392\u969C\u5165\u53E3: zcode-builtin.json\u2014\u2014\u975E\u300C\u65E0\u6761\u76EE\u300D)'
|
|
1157
|
+
: '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46\u65E0 zhipu-account \u6761\u76EE\u9700\u8865(\u76EE\u5F55\u8BFB\u53D6\u539F\u751F\u900F\u51FA)')
|
|
1158
|
+
: '; \u5185\u5EFA\u76EE\u5F55\u672A\u5B9A\u4F4D(env \u672A\u8BBE\u4E14\u81EA\u5B9A\u4F4D\u672A\u547D\u4E2D)')
|
|
1159
|
+
+ '\\n');
|
|
1160
|
+
}
|
|
1161
|
+
|
|
814
1162
|
// \u4E0A\u6E38 provider bootstrap \u4EE5 argv[1] \u4E3A\u5165\u53E3\u951A\uFF0C\u4ECE\u8BE5\u8DEF\u5F84\u90BB\u8FD1\u5B9A\u4F4D CLI \u5185\u5EFA
|
|
815
1163
|
// provider \u914D\u7F6E\u2014\u2014wrapper \u5F62\u6001\u4E0B argv[1] = \u672C wrapper \u843D\u76D8\u8DEF\u5F84\uFF0Cbootstrap \u4F1A\u5728
|
|
816
1164
|
// wrapper \u90BB\u57DF\u627E provider \u914D\u7F6E\u800C\u5931\u8D25\uFF08\u771F\u673A\u62A5\u300C\u65E0\u6CD5\u5B9A\u4F4D CLI ZCode Built-in Provider
|
|
@@ -1984,6 +2332,7 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
|
|
|
1984
2332
|
var logger4 = getLogger4("subagents");
|
|
1985
2333
|
var PROBE_VERSION_TIMEOUT_MS = 15e3;
|
|
1986
2334
|
var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
|
|
2335
|
+
var OFF_FAMILY_THINKING_LEVELS = /* @__PURE__ */ new Set(["off", "minimal"]);
|
|
1987
2336
|
var ZcodeEngine = class {
|
|
1988
2337
|
id = ZCODE_ENGINE_ID;
|
|
1989
2338
|
deps;
|
|
@@ -2196,7 +2545,7 @@ var ZcodeEngine = class {
|
|
|
2196
2545
|
*/
|
|
2197
2546
|
async attemptAppServerTurn(task, ctx, modelRef, cwd, prompt, opts = {}) {
|
|
2198
2547
|
const rt = this.ensureAppServerRuntime();
|
|
2199
|
-
const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.
|
|
2548
|
+
const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.reasoningLevelFor(modelRef, task.thinkingLevel) : void 0;
|
|
2200
2549
|
const createParams = buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel);
|
|
2201
2550
|
let currentSessionId;
|
|
2202
2551
|
let signalSessionCreated;
|
|
@@ -2350,7 +2699,7 @@ var ZcodeEngine = class {
|
|
|
2350
2699
|
const env = buildAppServerEnv(this.deps.processEnv ?? process.env);
|
|
2351
2700
|
env.ZCODE_ENG_CLI_PATH = cliPath;
|
|
2352
2701
|
env.ZCODE_ENG_V2_CONFIG = this.deps.sources?.v2ConfigPath ?? defaultV2ConfigPath();
|
|
2353
|
-
env.ZCODE_ENG_PROVIDER_CONFIG = this.deps.sources
|
|
2702
|
+
env.ZCODE_ENG_PROVIDER_CONFIG = resolvePersonalProviderConfigPath(this.deps.sources, engineDataDir);
|
|
2354
2703
|
const sessionDbPath = zcodeSessionDbPath(engineDataDir);
|
|
2355
2704
|
env.ZCODE_SESSION_DB_PATH = sessionDbPath;
|
|
2356
2705
|
delete env.ZCODE_SESSION_DB;
|
|
@@ -2493,16 +2842,30 @@ var ZcodeEngine = class {
|
|
|
2493
2842
|
listModels() {
|
|
2494
2843
|
return listZcodeModels(this.deps.sources);
|
|
2495
2844
|
}
|
|
2496
|
-
/**
|
|
2845
|
+
/** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
|
|
2497
2846
|
* 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
|
|
2498
2847
|
reasoningMemo = /* @__PURE__ */ new Map();
|
|
2499
|
-
|
|
2848
|
+
/**
|
|
2849
|
+
* create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
|
|
2850
|
+
* - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
|
|
2851
|
+
* - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
|
|
2852
|
+
* 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
|
|
2853
|
+
* - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
|
|
2854
|
+
* (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
|
|
2855
|
+
* disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
|
|
2856
|
+
*/
|
|
2857
|
+
reasoningLevelFor(modelRef, thinkingLevel) {
|
|
2500
2858
|
const memoKey = `${locateZcodeBuiltinCatalog(this.deps.sources) ?? "none"}|${modelRef}`;
|
|
2501
|
-
const
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2859
|
+
const memoHit = this.reasoningMemo.get(memoKey);
|
|
2860
|
+
const domain = memoHit !== void 0 || this.reasoningMemo.has(memoKey) ? memoHit : resolveZcodeReasoningValues(modelRef, this.deps.sources);
|
|
2861
|
+
this.reasoningMemo.set(memoKey, domain);
|
|
2862
|
+
if (domain === void 0 || domain.length === 0) return void 0;
|
|
2863
|
+
const requested = thinkingLevel?.trim();
|
|
2864
|
+
if (requested === void 0 || requested === "") return domain[0];
|
|
2865
|
+
if (domain.includes(requested)) return requested;
|
|
2866
|
+
if (OFF_FAMILY_THINKING_LEVELS.has(requested)) return domain[0];
|
|
2867
|
+
const nonMinimal = domain.slice(1);
|
|
2868
|
+
return nonMinimal.length > 0 ? nonMinimal[nonMinimal.length - 1] : domain[0];
|
|
2506
2869
|
}
|
|
2507
2870
|
/**
|
|
2508
2871
|
* [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
|
|
@@ -2884,9 +3247,9 @@ async function defaultProbeVersion(cliPath, dataDir) {
|
|
|
2884
3247
|
}
|
|
2885
3248
|
|
|
2886
3249
|
// src/registration.ts
|
|
2887
|
-
import { resolveEngineDataDir } from "@zhushanwen/subagent-engine-sdk";
|
|
3250
|
+
import { resolveEngineDataDir as resolveEngineDataDir2 } from "@zhushanwen/subagent-engine-sdk";
|
|
2888
3251
|
function defaultEngineDataDir() {
|
|
2889
|
-
return
|
|
3252
|
+
return resolveEngineDataDir2(process.env);
|
|
2890
3253
|
}
|
|
2891
3254
|
function createZcodeEngine(deps) {
|
|
2892
3255
|
return new ZcodeEngine(deps);
|