@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
package/dist/main.cjs
CHANGED
|
@@ -23,10 +23,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
23
23
|
));
|
|
24
24
|
|
|
25
25
|
// src/main.ts
|
|
26
|
-
var
|
|
26
|
+
var import_subagent_engine_sdk16 = require("@zhushanwen/subagent-engine-sdk");
|
|
27
27
|
|
|
28
28
|
// src/server.ts
|
|
29
|
-
var
|
|
29
|
+
var import_subagent_engine_sdk15 = require("@zhushanwen/subagent-engine-sdk");
|
|
30
30
|
|
|
31
31
|
// src/constants.ts
|
|
32
32
|
var ZCODE_ENGINE_ID = "zcode";
|
|
@@ -62,13 +62,13 @@ var ZCODE_RESUME_CHARS_PER_TOKEN = 4;
|
|
|
62
62
|
var ZCODE_SESSION_SWEEP_DEFER_MS = 50;
|
|
63
63
|
|
|
64
64
|
// src/registration.ts
|
|
65
|
-
var
|
|
65
|
+
var import_subagent_engine_sdk13 = require("@zhushanwen/subagent-engine-sdk");
|
|
66
66
|
|
|
67
67
|
// src/zcode-engine.ts
|
|
68
68
|
var fs6 = __toESM(require("fs"), 1);
|
|
69
69
|
var path4 = __toESM(require("path"), 1);
|
|
70
|
-
var import_subagent_engine_sdk10 = require("@zhushanwen/subagent-engine-sdk");
|
|
71
70
|
var import_subagent_engine_sdk11 = require("@zhushanwen/subagent-engine-sdk");
|
|
71
|
+
var import_subagent_engine_sdk12 = require("@zhushanwen/subagent-engine-sdk");
|
|
72
72
|
|
|
73
73
|
// src/journal-io.ts
|
|
74
74
|
var import_subagent_engine_sdk = require("@zhushanwen/subagent-engine-sdk");
|
|
@@ -139,6 +139,7 @@ function synthesizeCoarseEvents(response, usage) {
|
|
|
139
139
|
var fs = __toESM(require("fs"), 1);
|
|
140
140
|
var os2 = __toESM(require("os"), 1);
|
|
141
141
|
var path2 = __toESM(require("path"), 1);
|
|
142
|
+
var import_subagent_engine_sdk4 = require("@zhushanwen/subagent-engine-sdk");
|
|
142
143
|
var ZcodePrepareError = class extends Error {
|
|
143
144
|
code;
|
|
144
145
|
constructor(code, message) {
|
|
@@ -147,35 +148,81 @@ var ZcodePrepareError = class extends Error {
|
|
|
147
148
|
this.code = code;
|
|
148
149
|
}
|
|
149
150
|
};
|
|
151
|
+
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";
|
|
150
152
|
function isRecord(v) {
|
|
151
153
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
152
154
|
}
|
|
153
155
|
function strArray(v) {
|
|
154
156
|
return Array.isArray(v) ? v.filter((m) => typeof m === "string" && m.trim() !== "") : [];
|
|
155
157
|
}
|
|
156
|
-
function
|
|
157
|
-
const empty = { providers: /* @__PURE__ */ new Map(), order: [] };
|
|
158
|
+
function readSourceJsonOrUndefined(absPath) {
|
|
158
159
|
let raw;
|
|
159
160
|
try {
|
|
160
161
|
raw = fs.readFileSync(absPath, "utf8");
|
|
161
162
|
} catch {
|
|
162
|
-
return
|
|
163
|
+
return void 0;
|
|
163
164
|
}
|
|
164
|
-
let parsed;
|
|
165
165
|
try {
|
|
166
|
-
|
|
166
|
+
return JSON.parse(raw);
|
|
167
167
|
} catch {
|
|
168
|
-
return
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
if (!
|
|
176
|
-
|
|
168
|
+
return void 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function extractSourceConfig(parsed) {
|
|
172
|
+
const conf = { providers: /* @__PURE__ */ new Map(), order: [] };
|
|
173
|
+
if (!isRecord(parsed)) return conf;
|
|
174
|
+
const config = parsed["config"];
|
|
175
|
+
if (!isRecord(config)) return conf;
|
|
176
|
+
conf.order = strArray(config["providerOrder"]);
|
|
177
|
+
const rules = config["providerConfigRules"];
|
|
178
|
+
const providerRules = isRecord(rules) ? rules["providerRules"] : void 0;
|
|
179
|
+
if (Array.isArray(providerRules)) collectProviderRules(providerRules, conf);
|
|
177
180
|
return conf;
|
|
178
181
|
}
|
|
182
|
+
function readSourceConfig(absPath) {
|
|
183
|
+
return extractSourceConfig(readSourceJsonOrUndefined(absPath));
|
|
184
|
+
}
|
|
185
|
+
function mergePersonalProviderConfig(realObj, copyObj) {
|
|
186
|
+
if (!isRecord(copyObj)) return realObj;
|
|
187
|
+
if (!isRecord(realObj)) return copyObj;
|
|
188
|
+
const cfgOf = (obj) => isRecord(obj["config"]) ? obj["config"] : {};
|
|
189
|
+
const rulesOf = (obj) => {
|
|
190
|
+
const pcr = cfgOf(obj)["providerConfigRules"];
|
|
191
|
+
const rules = isRecord(pcr) ? pcr["providerRules"] : void 0;
|
|
192
|
+
return Array.isArray(rules) ? rules : [];
|
|
193
|
+
};
|
|
194
|
+
const mergedRules = [];
|
|
195
|
+
const seen = /* @__PURE__ */ new Set();
|
|
196
|
+
for (const rule of rulesOf(realObj)) {
|
|
197
|
+
mergedRules.push(rule);
|
|
198
|
+
if (isRecord(rule)) {
|
|
199
|
+
const id = rule["providerId"];
|
|
200
|
+
if (typeof id === "string" && id !== "") seen.add(id);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
for (const rule of rulesOf(copyObj)) {
|
|
204
|
+
if (!isRecord(rule)) continue;
|
|
205
|
+
const id = rule["providerId"];
|
|
206
|
+
if (typeof id !== "string" || id === "") continue;
|
|
207
|
+
if (seen.has(id)) continue;
|
|
208
|
+
seen.add(id);
|
|
209
|
+
mergedRules.push(rule);
|
|
210
|
+
}
|
|
211
|
+
const mergedOrder = [];
|
|
212
|
+
for (const id of [...strArray(cfgOf(realObj)["providerOrder"]), ...strArray(cfgOf(copyObj)["providerOrder"])]) {
|
|
213
|
+
if (!mergedOrder.includes(id)) mergedOrder.push(id);
|
|
214
|
+
}
|
|
215
|
+
const realCfg = cfgOf(realObj);
|
|
216
|
+
const realPcr = isRecord(realCfg["providerConfigRules"]) ? realCfg["providerConfigRules"] : {};
|
|
217
|
+
return {
|
|
218
|
+
...realObj,
|
|
219
|
+
config: {
|
|
220
|
+
...realCfg,
|
|
221
|
+
providerOrder: mergedOrder,
|
|
222
|
+
providerConfigRules: { ...realPcr, providerRules: mergedRules }
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
179
226
|
function collectProviderRules(providerRules, conf) {
|
|
180
227
|
for (const rule of providerRules) {
|
|
181
228
|
if (!isRecord(rule)) continue;
|
|
@@ -210,6 +257,40 @@ function defaultPersonalProviderConfigPath() {
|
|
|
210
257
|
function defaultV2ConfigPath() {
|
|
211
258
|
return path2.join(os2.homedir(), ...ZCODE_V2_CONFIG_PATH_SUFFIX);
|
|
212
259
|
}
|
|
260
|
+
function piSyncedProviderConfigPath(engineDataDir) {
|
|
261
|
+
return path2.join(engineDataDir, ...import_subagent_engine_sdk4.ZCODE_PI_SYNCED_PROVIDER_CONFIG_SEGMENTS);
|
|
262
|
+
}
|
|
263
|
+
function envEngineDataDirOrUndefined() {
|
|
264
|
+
try {
|
|
265
|
+
return (0, import_subagent_engine_sdk4.resolveEngineDataDir)(process.env);
|
|
266
|
+
} catch {
|
|
267
|
+
return void 0;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function resolvePersonalProviderSource(sources, engineDataDir) {
|
|
271
|
+
const explicit = sources?.personalProviderConfigPath;
|
|
272
|
+
if (explicit !== void 0) return { kind: "explicit", path: explicit };
|
|
273
|
+
const dataDir = engineDataDir ?? envEngineDataDirOrUndefined();
|
|
274
|
+
if (dataDir !== void 0 && fs.existsSync(piSyncedProviderConfigPath(dataDir))) {
|
|
275
|
+
return { kind: "copy", path: piSyncedProviderConfigPath(dataDir), realPath: defaultPersonalProviderConfigPath() };
|
|
276
|
+
}
|
|
277
|
+
return { kind: "real", path: defaultPersonalProviderConfigPath() };
|
|
278
|
+
}
|
|
279
|
+
function resolvePersonalProviderConfigPath(sources, engineDataDir) {
|
|
280
|
+
return resolvePersonalProviderSource(sources, engineDataDir).path;
|
|
281
|
+
}
|
|
282
|
+
function readPersonalProviderView(sources) {
|
|
283
|
+
const resolution = resolvePersonalProviderSource(sources);
|
|
284
|
+
if (resolution.kind !== "copy") {
|
|
285
|
+
return { conf: readSourceConfig(resolution.path), sourceDesc: resolution.path };
|
|
286
|
+
}
|
|
287
|
+
const copyJson = readSourceJsonOrUndefined(resolution.path);
|
|
288
|
+
const realJson = readSourceJsonOrUndefined(resolution.realPath);
|
|
289
|
+
return {
|
|
290
|
+
conf: extractSourceConfig(mergePersonalProviderConfig(realJson, copyJson)),
|
|
291
|
+
sourceDesc: `merge(\u771F\u5B9E ${resolution.realPath} + \u526F\u672C ${resolution.path})`
|
|
292
|
+
};
|
|
293
|
+
}
|
|
213
294
|
var SEMVER_SEGMENTS = 3;
|
|
214
295
|
function locateZcodeBuiltinCatalog(sources) {
|
|
215
296
|
if (sources?.builtinCatalogPath !== void 0) return sources.builtinCatalogPath;
|
|
@@ -256,21 +337,6 @@ function locateZcodeBuiltinCatalog(sources) {
|
|
|
256
337
|
}
|
|
257
338
|
return void 0;
|
|
258
339
|
}
|
|
259
|
-
function resolveZcodeMinimalReasoningLevel(modelRef, sources) {
|
|
260
|
-
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
261
|
-
if (catalogPath === void 0) return void 0;
|
|
262
|
-
let parsed;
|
|
263
|
-
try {
|
|
264
|
-
parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
265
|
-
} catch {
|
|
266
|
-
return void 0;
|
|
267
|
-
}
|
|
268
|
-
const modelId = modelShort(modelRef);
|
|
269
|
-
const rules = parsed["config"];
|
|
270
|
-
const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
|
|
271
|
-
if (!Array.isArray(modelRules)) return void 0;
|
|
272
|
-
return lastMatchingReasoningValues(modelRules, modelId)?.[0];
|
|
273
|
-
}
|
|
274
340
|
function lastMatchingReasoningValues(modelRules, modelId) {
|
|
275
341
|
let values;
|
|
276
342
|
for (const rule of modelRules) {
|
|
@@ -279,7 +345,7 @@ function lastMatchingReasoningValues(modelRules, modelId) {
|
|
|
279
345
|
if (typeof match !== "string") continue;
|
|
280
346
|
let re;
|
|
281
347
|
try {
|
|
282
|
-
re = new RegExp(match);
|
|
348
|
+
re = new RegExp(match, "i");
|
|
283
349
|
} catch {
|
|
284
350
|
continue;
|
|
285
351
|
}
|
|
@@ -291,6 +357,21 @@ function lastMatchingReasoningValues(modelRules, modelId) {
|
|
|
291
357
|
}
|
|
292
358
|
return values;
|
|
293
359
|
}
|
|
360
|
+
function resolveZcodeReasoningValues(modelRef, sources) {
|
|
361
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
362
|
+
if (catalogPath === void 0) return void 0;
|
|
363
|
+
let parsed;
|
|
364
|
+
try {
|
|
365
|
+
parsed = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
366
|
+
} catch {
|
|
367
|
+
return void 0;
|
|
368
|
+
}
|
|
369
|
+
const modelId = modelShort(modelRef);
|
|
370
|
+
const rules = parsed["config"];
|
|
371
|
+
const modelRules = isRecord(rules) && isRecord(rules["modelConfigRules"]) ? rules["modelConfigRules"]["modelRules"] : void 0;
|
|
372
|
+
if (!Array.isArray(modelRules)) return void 0;
|
|
373
|
+
return lastMatchingReasoningValues(modelRules, modelId);
|
|
374
|
+
}
|
|
294
375
|
function defaultProviderForShortName(conf, withKey) {
|
|
295
376
|
const ordered = conf.order.find((id) => {
|
|
296
377
|
const entry = conf.providers.get(id);
|
|
@@ -299,19 +380,65 @@ function defaultProviderForShortName(conf, withKey) {
|
|
|
299
380
|
if (ordered !== void 0) return ordered;
|
|
300
381
|
return withKey[0][0];
|
|
301
382
|
}
|
|
383
|
+
function resolveAccountModelRef(wanted, wantedProvider, sources) {
|
|
384
|
+
const catalogPath = locateZcodeBuiltinCatalog(sources);
|
|
385
|
+
if (catalogPath === void 0) {
|
|
386
|
+
throw new ZcodePrepareError(
|
|
387
|
+
"model_not_available",
|
|
388
|
+
`account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u5B9A\u4F4D\u5931\u8D25\uFF08ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u4E0E runtime/provider \u626B\u63CF\u5747\u672A\u547D\u4E2D\uFF09\u3002`
|
|
389
|
+
);
|
|
390
|
+
}
|
|
391
|
+
let catalog;
|
|
392
|
+
try {
|
|
393
|
+
catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
394
|
+
} catch (err) {
|
|
395
|
+
throw new ZcodePrepareError(
|
|
396
|
+
"model_not_available",
|
|
397
|
+
`account \u6A21\u578B "${wanted}" \u65E0\u6CD5\u6821\u9A8C\uFF1A\u5185\u5EFA\u76EE\u5F55\u4E0D\u53EF\u8BFB\uFF08${err instanceof Error ? err.message : String(err)}\uFF09\u3002`
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
const accountRule = findAccountProviderRule(catalog, wantedProvider);
|
|
401
|
+
if (accountRule === void 0) {
|
|
402
|
+
throw new ZcodePrepareError(
|
|
403
|
+
"model_not_available",
|
|
404
|
+
`\u672A\u77E5 account provider "${wantedProvider}"\uFF08\u5185\u5EFA\u76EE\u5F55\u65E0\u6B64\u89C4\u5219\uFF09\u3002\u6062\u590D\u6307\u5F15\uFF1A\u6539\u7528\u76EE\u5F55\u5185 account:* \u89C4\u5219\uFF08\u5982 account:zai-individual-coding-plan / account:bigmodel-individual-coding-plan\uFF09\u3002`
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
assertAccountModelKnown(accountRule, wanted, wantedProvider);
|
|
408
|
+
return wanted;
|
|
409
|
+
}
|
|
410
|
+
function findAccountProviderRule(catalog, wantedProvider) {
|
|
411
|
+
const catalogRules = isRecord(catalog) && isRecord(catalog["config"]) && isRecord(catalog["config"]["providerConfigRules"]) ? catalog["config"]["providerConfigRules"]["providerRules"] : void 0;
|
|
412
|
+
const accountRule = Array.isArray(catalogRules) ? catalogRules.find((r) => isRecord(r) && r["providerId"] === wantedProvider) : void 0;
|
|
413
|
+
return isRecord(accountRule) ? accountRule : void 0;
|
|
414
|
+
}
|
|
415
|
+
function assertAccountModelKnown(accountRule, wanted, wantedProvider) {
|
|
416
|
+
const accountConfig = isRecord(accountRule["config"]) ? accountRule["config"] : {};
|
|
417
|
+
const modelIds = accountConfig["builtinModelIds"] ?? accountConfig["personalModelIds"];
|
|
418
|
+
const short = modelShort(wanted);
|
|
419
|
+
if (Array.isArray(modelIds) && modelIds.length > 0 && !modelIds.includes(short)) {
|
|
420
|
+
throw new ZcodePrepareError(
|
|
421
|
+
"model_not_available",
|
|
422
|
+
`\u672A\u77E5\u6A21\u578B "${short}"\uFF08account provider ${wantedProvider} \u4E0B\u53EF\u7528: ${modelIds.join(", ")}\uFF09\u3002`
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
302
426
|
function resolveZcodeModelRef(requested, sources) {
|
|
303
|
-
const
|
|
304
|
-
const conf = readSourceConfig(srcPath);
|
|
427
|
+
const { conf, sourceDesc } = readPersonalProviderView(sources);
|
|
305
428
|
const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
|
|
306
429
|
const wanted = requested?.trim() || void 0;
|
|
307
430
|
if (withKey.length === 0) {
|
|
308
431
|
const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
|
|
309
432
|
throw new ZcodePrepareError(
|
|
310
433
|
"engine_credential_missing",
|
|
311
|
-
`zcode \u5F15\u64CE\u627E\u4E0D\u5230\u4EFB\u4F55\u5E26 apiKey \u7684\u4E2A\u4EBA provider\uFF08${hint}\uFF09\u3002\u5DF2\u8BFB\u6E90\uFF1A${
|
|
434
|
+
`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
|
|
312
435
|
);
|
|
313
436
|
}
|
|
314
437
|
if (wanted === void 0) return "";
|
|
438
|
+
const wantedProvider = wanted.includes("/") ? providerOf(wanted) : void 0;
|
|
439
|
+
if (wantedProvider !== void 0 && wantedProvider.startsWith("account:")) {
|
|
440
|
+
return resolveAccountModelRef(wanted, wantedProvider, sources);
|
|
441
|
+
}
|
|
315
442
|
const provider = wanted.includes("/") ? providerOf(wanted) : defaultProviderForShortName(conf, withKey);
|
|
316
443
|
const short = modelShort(wanted);
|
|
317
444
|
const entry = conf.providers.get(provider);
|
|
@@ -319,26 +446,26 @@ function resolveZcodeModelRef(requested, sources) {
|
|
|
319
446
|
const known = withKey.map(([id]) => id).join(", ");
|
|
320
447
|
throw new ZcodePrepareError(
|
|
321
448
|
"model_not_available",
|
|
322
|
-
`\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`
|
|
449
|
+
`\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
|
|
323
450
|
);
|
|
324
451
|
}
|
|
325
452
|
if (!hasApiKey(entry)) {
|
|
326
453
|
throw new ZcodePrepareError(
|
|
327
454
|
"engine_credential_missing",
|
|
328
|
-
`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`
|
|
455
|
+
`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
|
|
329
456
|
);
|
|
330
457
|
}
|
|
331
458
|
const models = entry.models ?? [];
|
|
332
459
|
if (models.length > 0 && !models.includes(short)) {
|
|
333
460
|
throw new ZcodePrepareError(
|
|
334
461
|
"model_not_available",
|
|
335
|
-
`\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`
|
|
462
|
+
`\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
|
|
336
463
|
);
|
|
337
464
|
}
|
|
338
465
|
return `${provider}/${short}`;
|
|
339
466
|
}
|
|
340
467
|
function listZcodeModels(sources) {
|
|
341
|
-
const conf =
|
|
468
|
+
const { conf } = readPersonalProviderView(sources);
|
|
342
469
|
const out = [];
|
|
343
470
|
for (const [pid, entry] of conf.providers) {
|
|
344
471
|
if (!hasApiKey(entry)) continue;
|
|
@@ -358,7 +485,7 @@ var fs2 = __toESM(require("fs"), 1);
|
|
|
358
485
|
var path3 = __toESM(require("path"), 1);
|
|
359
486
|
|
|
360
487
|
// src/error-message.ts
|
|
361
|
-
var
|
|
488
|
+
var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
|
|
362
489
|
|
|
363
490
|
// src/appserver-launcher.ts
|
|
364
491
|
var ZCODE_APPSERVER_LAUNCHER_NAME = "appserver-launcher.cjs";
|
|
@@ -370,7 +497,12 @@ const os = require('node:os');
|
|
|
370
497
|
|
|
371
498
|
const CLI_PATH = process.env.ZCODE_ENG_CLI_PATH;
|
|
372
499
|
const V2_PATH = process.env.ZCODE_ENG_V2_CONFIG || path.join(os.homedir(), '.zcode', 'v2', 'config.json');
|
|
373
|
-
|
|
500
|
+
// \u771F\u5B9E provider_config.json\uFF08Registry \u76F4\u8BFB\u8DEF\u5F84\uFF0CA0 \u63A2\u9488\u5B9E\u8BC1\uFF09\u2014\u2014\u4E0E CONFIG_PATH \u540C\u6B3E
|
|
501
|
+
// 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
|
|
502
|
+
const REAL_PROVIDER_CONFIG_PATH = path.join(os.homedir(), '.zcode', 'v2', 'provider_config.json');
|
|
503
|
+
// 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
|
|
504
|
+
const PI_SYNCED_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || '';
|
|
505
|
+
const PROVIDER_CONFIG_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || REAL_PROVIDER_CONFIG_PATH;
|
|
374
506
|
const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
|
|
375
507
|
|
|
376
508
|
// \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
|
|
@@ -393,7 +525,7 @@ function injectedConfigText() {
|
|
|
393
525
|
let v2 = {};
|
|
394
526
|
try { v2 = JSON.parse(readOrig(V2_PATH, 'utf8')); }
|
|
395
527
|
catch (err) {
|
|
396
|
-
// ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\
|
|
528
|
+
// ENOENT = \u684C\u9762\u7AEF\u672A\u767B\u5F55\uFF08\u6B63\u5E38 no-patch\uFF0C\u4E0D\u6784\u6210\u9519\u8BEF\uFF1B\u8DF3\u8FC7\u51B3\u7B56\u7531\u5B89\u88C5\u95E8\u65E5\u5FD7\u627F\u8F7D\uFF09\uFF1B\u5176\u4ED6\u5931\u8D25\uFF08JSON \u635F\u574F/\u6743\u9650\uFF09
|
|
397
529
|
// \u51FA\u58F0\u2014\u2014\u5426\u5219\u6392\u969C\u4F1A\u88AB\u539F\u751F\u300C\u8BF7\u767B\u5F55\u300D\u62A5\u9519\u8BEF\u5BFC\uFF0C\u4E0E\u771F\u56E0\uFF08\u6587\u4EF6\u635F\u574F\uFF09\u4E0D\u7B26
|
|
398
530
|
if (!err || err.code !== 'ENOENT') {
|
|
399
531
|
process.stderr.write('[zcode-launcher] v2 config \u8BFB\u53D6\u5931\u8D25(' + ((err && err.code) || (err && err.message) || 'unknown') + '): ' + V2_PATH + '\u2014\u2014\u51ED\u636E\u6CE8\u5165\u672A\u751F\u6548\\n');
|
|
@@ -448,11 +580,14 @@ function injectedConfigText() {
|
|
|
448
580
|
for (const mid of order) {
|
|
449
581
|
if (typeof mid === 'string' && mid !== '' && !(mid in models)) models[mid] = {};
|
|
450
582
|
}
|
|
583
|
+
// kind \u6309\u6761\u76EE api.type \u6D3E\u751F\uFF08D3\uFF09\uFF1Aanthropic-messages \u2192 anthropic\uFF0C\u5176\u4F59
|
|
584
|
+
// \uFF08openai-chat-completions / api.type \u7F3A\u5E2D / \u672A\u77E5\u503C\uFF09\u2192 openai-compatible
|
|
585
|
+
// \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
|
|
586
|
+
// \u771F\u5B9E\u6761\u76EE\uFF0Canthropic \u534F\u8BAE\u771F\u5B9E\u6761\u76EE\u4ECE\u65E7\u9519\u914D\u503C openai-compatible \u987A\u5E26\u4FEE\u6B63\uFF09\u3002
|
|
587
|
+
// \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
|
|
451
588
|
injectable[id] = {
|
|
452
589
|
name: typeof rule.providerName === 'string' ? rule.providerName : id,
|
|
453
|
-
|
|
454
|
-
// \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
|
|
455
|
-
kind: 'openai-compatible',
|
|
590
|
+
kind: api.type === 'anthropic-messages' ? 'anthropic' : 'openai-compatible',
|
|
456
591
|
options: { apiKey: access.apiKey, baseURL: api.baseUrl },
|
|
457
592
|
source: 'custom',
|
|
458
593
|
models: models,
|
|
@@ -469,50 +604,148 @@ function injectedConfigText() {
|
|
|
469
604
|
return JSON.stringify(merged);
|
|
470
605
|
}
|
|
471
606
|
|
|
607
|
+
// [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
|
|
608
|
+
// eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
|
|
609
|
+
// \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
|
|
610
|
+
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\u8F68\u7248\u89C4\u5219\uFF1A
|
|
611
|
+
// - \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
|
|
612
|
+
// - \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
|
|
613
|
+
// \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
|
|
614
|
+
// - 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
|
|
615
|
+
// \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
|
|
616
|
+
// - providerOrder\uFF1A\u771F\u5B9E\u73B0\u503C\u5E8F + \u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u53BB\u91CD\u4FDD\u5E8F\uFF09
|
|
617
|
+
// - \u5176\u4F59\u5B57\u6BB5\uFF08\u542B config \u5185\u5176\u4ED6\u952E\uFF09\u53D6\u771F\u5B9E\u73B0\u503C
|
|
618
|
+
function mergeProviderConfig(realObj, copyObj) {
|
|
619
|
+
const isRec = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
620
|
+
if (!isRec(copyObj)) return realObj;
|
|
621
|
+
if (!isRec(realObj)) return copyObj;
|
|
622
|
+
const cfgOf = (obj) => (isRec(obj.config) ? obj.config : {});
|
|
623
|
+
const rulesOf = (obj) => {
|
|
624
|
+
const pcr = cfgOf(obj).providerConfigRules;
|
|
625
|
+
const r = isRec(pcr) ? pcr.providerRules : undefined;
|
|
626
|
+
return Array.isArray(r) ? r : [];
|
|
627
|
+
};
|
|
628
|
+
const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
|
|
629
|
+
const mergedRules = [];
|
|
630
|
+
const seen = {};
|
|
631
|
+
for (const rule of rulesOf(realObj)) {
|
|
632
|
+
mergedRules.push(rule);
|
|
633
|
+
if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
|
|
634
|
+
}
|
|
635
|
+
for (const rule of rulesOf(copyObj)) {
|
|
636
|
+
if (!isRec(rule) || typeof rule.providerId !== 'string' || rule.providerId === '') continue;
|
|
637
|
+
if (seen[rule.providerId]) continue;
|
|
638
|
+
seen[rule.providerId] = true;
|
|
639
|
+
mergedRules.push(rule);
|
|
640
|
+
}
|
|
641
|
+
const mergedOrder = [];
|
|
642
|
+
for (const id of strArr(cfgOf(realObj).providerOrder).concat(strArr(cfgOf(copyObj).providerOrder))) {
|
|
643
|
+
if (mergedOrder.indexOf(id) === -1) mergedOrder.push(id);
|
|
644
|
+
}
|
|
645
|
+
const outCfg = Object.assign({}, cfgOf(realObj), {
|
|
646
|
+
providerOrder: mergedOrder,
|
|
647
|
+
providerConfigRules: Object.assign(
|
|
648
|
+
{},
|
|
649
|
+
isRec(cfgOf(realObj).providerConfigRules) ? cfgOf(realObj).providerConfigRules : {},
|
|
650
|
+
{ providerRules: mergedRules },
|
|
651
|
+
),
|
|
652
|
+
});
|
|
653
|
+
return Object.assign({}, realObj, { config: outCfg });
|
|
654
|
+
}
|
|
655
|
+
// [merge-fn-end]
|
|
656
|
+
|
|
657
|
+
// 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
|
|
658
|
+
// \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
|
|
659
|
+
// \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
|
|
660
|
+
// \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
|
|
661
|
+
// patch \u9762\u9012\u5F52\u81EA\u8C03\u7528\uFF09\u3002
|
|
662
|
+
function mergedProviderConfigText() {
|
|
663
|
+
if (!PI_SYNCED_PATH) return null;
|
|
664
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
665
|
+
let copyObj;
|
|
666
|
+
try {
|
|
667
|
+
copyObj = JSON.parse(readOrig(PI_SYNCED_PATH, 'utf8'));
|
|
668
|
+
} catch { return null; }
|
|
669
|
+
if (!copyObj || typeof copyObj !== 'object' || Array.isArray(copyObj)) return null;
|
|
670
|
+
let realObj = null;
|
|
671
|
+
try {
|
|
672
|
+
const parsed = JSON.parse(readOrig(REAL_PROVIDER_CONFIG_PATH, 'utf8'));
|
|
673
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) realObj = parsed;
|
|
674
|
+
} catch { /* ENOENT/\u635F\u574F \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6 */ }
|
|
675
|
+
return JSON.stringify(mergeProviderConfig(realObj, copyObj));
|
|
676
|
+
}
|
|
677
|
+
|
|
472
678
|
if (!CLI_PATH) {
|
|
473
679
|
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');
|
|
474
680
|
process.exit(2);
|
|
475
681
|
}
|
|
476
682
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
if (
|
|
500
|
-
const
|
|
501
|
-
if (
|
|
683
|
+
// [2026-10-13 account \u76F4\u901A] \u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6\u62E6\u622A\uFF1A\u7ED9 zhipu-account \u6761\u76EE\u6CE8\u5165 entitled:true\u3002
|
|
684
|
+
// app-server \u6CE8\u518C\u8868\u88C5\u8F7D\u5224\u636E = access.entitled === true\uFF0C\u5916\u90E8 spawn \u4ECE\u76EE\u5F55\u6784\u5EFA\u7684\u8D26\u53F7
|
|
685
|
+
// \u6761\u76EE\u9ED8\u8BA4\u975E entitled\uFF08YXe \u786C\u7F16\u7801 !1\uFF09\u2192 plan \u5BB6\u65CF\u5F15\u7528\u4E00\u5F8B\u300C\u4E0D\u5B58\u5728 Model\u300D\u3002\u7528\u6237\u88C1\u51B3\uFF1A
|
|
686
|
+
// zai \u7CFB\u8D70 account provider \u914D\u7F6E\u5E76\u7ED5\u8FC7\u8BE5\u9650\u5236\u2014\u2014patch \u53EA\u53D1\u751F\u5728\u672C wrapper \u7684\u8BFB\u53D6\u8FD4\u56DE\u503C\uFF0C
|
|
687
|
+
// ZCode.app \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\u3002null = \u76EE\u5F55\u65E0 zhipu-account \u6761\u76EE\uFF08\u65E0\u9700 patch\uFF09\u3002
|
|
688
|
+
// \u672C\u51FD\u6570\u5FC5\u987B\u4EE5\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u8C03\u7528\uFF08\u5B89\u88C5\u95E8\u4F20 CATALOG_PATH\uFF09\u2014\u2014\u65E0\u53C2\u8C03\u7528\u4F1A\u5728\u8BFB\u6587\u4EF6
|
|
689
|
+
// \u65F6\u629B\u9519\u88AB catch \u6052\u8FD4 null\uFF0C\u66FE\u81F4\u7EAF account \u5BBF\u4E3B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\uFF08\u89C1\u5B89\u88C5\u95E8\u5904\u6CE8\u91CA\uFF09\u3002
|
|
690
|
+
let CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
|
|
691
|
+
const __catalogPatchCache = new Map();
|
|
692
|
+
// \u8DF3\u8FC7\u51B3\u7B56\u5F52\u56E0\uFF082026-10 \u5BA1\u67E5\u8865\uFF09\uFF1AcatalogPatchText \u628A\u300C\u65E0\u6761\u76EE\u9700\u8865\u300D\u4E0E\u300C\u8BFB\u53D6/\u89E3\u6790\u5931\u8D25
|
|
693
|
+
// \uFF08\u6587\u4EF6\u7F3A\u5931/\u635F\u574F\uFF09\u300D\u90FD\u6298\u6210 null\uFF0C\u8DF3\u8FC7\u65E5\u5FD7\u82E5\u4E0D\u533A\u5206\u4F1A\u628A\u635F\u574F\u6001\u8BEF\u62A5\u6210\u300C\u65E0\u6761\u76EE\u300D\uFF0C\u6392\u969C\u88AB\u8BEF\u5BFC
|
|
694
|
+
const __catalogPatchStatus = new Map(); // path -> 'no-entries' | 'unreadable'
|
|
695
|
+
function catalogPatchText(path) {
|
|
696
|
+
if (__catalogPatchCache.has(path)) return __catalogPatchCache.get(path);
|
|
697
|
+
let result = null;
|
|
698
|
+
try {
|
|
699
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
700
|
+
const parsed = JSON.parse(readOrig(path, 'utf8'));
|
|
701
|
+
const rules = parsed && parsed.config && parsed.config.providerConfigRules
|
|
702
|
+
&& Array.isArray(parsed.config.providerConfigRules.providerRules)
|
|
703
|
+
? parsed.config.providerConfigRules.providerRules : null;
|
|
704
|
+
let touched = 0;
|
|
705
|
+
if (rules) for (const rule of rules) {
|
|
706
|
+
const acc = rule && rule.config && rule.config.access;
|
|
707
|
+
if (acc && acc.type === 'zhipu-account' && acc.entitled !== true) { acc.entitled = true; touched++; }
|
|
708
|
+
}
|
|
709
|
+
result = touched > 0 ? JSON.stringify(parsed) : null;
|
|
710
|
+
__catalogPatchStatus.set(path, 'no-entries');
|
|
711
|
+
} catch { result = null; __catalogPatchStatus.set(path, 'unreadable'); }
|
|
712
|
+
__catalogPatchCache.set(path, result);
|
|
713
|
+
return result;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// [2026-10-13 account \u76F4\u901A\u2461] CLI bundle \u6E90\u7801\u5185\u5B58\u8865\u4E01\uFF1A\u5916\u90E8 spawn \u7684\u8D26\u53F7\u6761\u76EE\u6784\u5EFA
|
|
717
|
+
// \u786C\u7F16\u7801 entitled:!1\uFF08YXe\uFF09\uFF0C\u6570\u636E\u9762\u6CE8\u5165\uFF08\u76EE\u5F55 entitled \u5B57\u6BB5\uFF09\u88AB\u5176\u65E0\u89C6\u2014\u2014\u6309\u7528\u6237\u88C1\u51B3
|
|
718
|
+
// \u6539 zcode \u6E90\u7801\u7ED5\u8FC7\uFF1A\u62E6\u622A CLI bundle \u6E90\u7801\u8BFB\u53D6\uFF0C\u5185\u5B58\u66FF\u6362\u8BE5\u5B57\u9762\u91CF\u4E3A !0\uFF08ZCode.app
|
|
719
|
+
// \u78C1\u76D8\u6587\u4EF6\u96F6\u89E6\u78B0\uFF1B\u951A\u4E32\u542B ]]:[] \u5C3E\u7F00\u552F\u4E00\u547D\u4E2D YXe \u6784\u9020\uFF0C\u53E6\u4E00\u5904\u540C\u540D\u6761\u4EF6\u903B\u8F91\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002
|
|
720
|
+
// \u951A\u4E0D\u547D\u4E2D\uFF08\u4E0A\u6E38\u6DF7\u6DC6\u5F62\u6001\u53D8\u5316\uFF09\u2192 \u539F\u6587\u900F\u51FA\uFF1A\u4EC5 account \u5BB6\u65CF\u7EE7\u7EED\u88AB\u62D2\uFF0C\u4E2A\u4EBA provider
|
|
721
|
+
// \u4E0D\u53D7\u5F71\u54CD\u3002
|
|
722
|
+
const __cliPatchCache = new Map();
|
|
723
|
+
function patchedCliSource(path) {
|
|
724
|
+
if (__cliPatchCache.has(path)) return __cliPatchCache.get(path);
|
|
725
|
+
let result = null;
|
|
726
|
+
try {
|
|
727
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
728
|
+
const src = readOrig(path, 'utf8');
|
|
729
|
+
// \u7248\u672C\u9C81\u68D2\u951A\uFF082026-10-13 \u4FEE\u8BA2\uFF09\uFF1Aminified \u6807\u8BC6\u7B26\uFF08Uk/I3 \u7B49\uFF09\u968F zcode \u91CD\u65B0\u6253\u5305
|
|
730
|
+
// \u6F02\u79FB\uFF0C\u5C5E\u6027\u540D\uFF08zcodeBuiltinProviders / zhipu-account / entitled\uFF09\u662F\u6570\u636E/\u5951\u7EA6
|
|
731
|
+
// \u771F\u540D\u4E0D\u88AB\u6DF7\u6DC6\u2014\u2014\u4EE5\u5C5E\u6027\u540D\u5B9A\u4F4D + 600 \u5B57\u7B26\u7A97\u53E3\u5185\u628A\u8D26\u53F7\u6761\u76EE\u6784\u5EFA\u7684 entitled:!1
|
|
732
|
+
// \u7FFB\u8F6C\u4E3A !0\u3002\u7A97\u53E3\u96F6\u547D\u4E2D = \u4E0A\u6E38\u5F62\u6001\u6F02\u79FB \u2192 \u539F\u6587\u900F\u51FA + stderr warn\uFF08\u6F02\u79FB\u53EF\u89C1\uFF0C
|
|
733
|
+
// \u8FDB app-server stderr \u65E5\u5FD7\uFF09\uFF0C\u4E2A\u4EBA provider \u4E0D\u53D7\u5F71\u54CD\u3002
|
|
734
|
+
const anchorIdx = src.indexOf('zcodeBuiltinProviders.entries()');
|
|
735
|
+
if (anchorIdx >= 0) {
|
|
736
|
+
const window = src.slice(anchorIdx, Math.min(src.length, anchorIdx + 600));
|
|
737
|
+
if (window.indexOf('zhipu-account') >= 0 && window.indexOf('entitled:!1') >= 0) {
|
|
738
|
+
result = src.slice(0, anchorIdx)
|
|
739
|
+
+ window.split('entitled:!1').join('entitled:!0')
|
|
740
|
+
+ src.slice(anchorIdx + 600);
|
|
741
|
+
}
|
|
502
742
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
506
|
-
// \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
|
|
507
|
-
// \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
|
|
508
|
-
fs.__origExistsSync = fs.existsSync;
|
|
509
|
-
fs.existsSync = function (p) {
|
|
510
|
-
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
511
|
-
const cur = injectedConfigText();
|
|
512
|
-
if (cur !== null) return true;
|
|
743
|
+
if (result === null) {
|
|
744
|
+
process.stderr.write('[zcode-launcher] account bypass: CLI bundle anchor not found (zcode upstream shape drifted?) - account family stays gated, personal providers unaffected\\n');
|
|
513
745
|
}
|
|
514
|
-
|
|
515
|
-
|
|
746
|
+
} catch { result = null; }
|
|
747
|
+
__cliPatchCache.set(path, result);
|
|
748
|
+
return result;
|
|
516
749
|
}
|
|
517
750
|
|
|
518
751
|
// \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\u9762\u2461\uFF09\uFF1A3.12.x \u8D77\u914D\u7F6E\u6587\u4EF6\u632A\u4F4D + CLI \u4F9D\u8D56\u5BBF\u4E3B\u6CE8\u5165
|
|
@@ -521,6 +754,11 @@ if (text !== null) {
|
|
|
521
754
|
// <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
|
|
522
755
|
// \uFF08semver \u6700\u5927\uFF09\u7684 endpoint-*/zcode-builtin.json \u2192 \u90FD\u627E\u4E0D\u5230\u5219\u4E0D\u8BBE\u952E\uFF0C\u8BA9 CLI
|
|
523
756
|
// \u539F\u751F\u62A5\u9519\u900F\u51FA\uFF08\u9519\u8BEF\u6587\u6848\u542B\u6062\u590D\u6307\u5F15\uFF09\u3002
|
|
757
|
+
// [\u4F4D\u7F6E\uFF1A\u5B89\u88C5\u95E8\u4E4B\u524D] \u5B9A\u4F4D/env \u63A8\u5BFC\u5FC5\u987B\u5148\u4E8E\u5B89\u88C5\u95E8\u5224\u5B9A\u5B8C\u6210\u2014\u2014catalogPatchText
|
|
758
|
+
// \u9700\u8981\u5B9A\u4F4D\u540E\u7684\u771F\u5B9E\u8DEF\u5F84\u53C2\u4E0E\u95E8\u5224\u5B9A\u3002\u66FE\u56E0\u95E8\u5148\u4E8E\u5B9A\u4F4D\u6267\u884C\u4E14\u65E0\u53C2\u8C03\u7528\uFF0C
|
|
759
|
+
// fs.readFileSync(undefined) \u629B\u9519\u88AB catch \u6052\u8FD4 null \u2192 \u95E8\u9000\u5316\u4E3A text!==null\uFF0C
|
|
760
|
+
// \u7EAF account \u5BBF\u4E3B\uFF08v2 \u65E0\u51ED\u636E\u6761\u76EE \u2192 text=null\uFF09\u4E0B\u8865\u4E01\u5C42\u9759\u9ED8\u4E0D\u5B89\u88C5\u3001account
|
|
761
|
+
// \u76F4\u901A\u6574\u4F53\u5931\u6548\u4E14\u96F6\u65E5\u5FD7\uFF082026-10 \u56DE\u5F52\u4FEE\u590D\uFF09\u3002
|
|
524
762
|
if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
525
763
|
let located = null;
|
|
526
764
|
try {
|
|
@@ -562,6 +800,7 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
|
562
800
|
}
|
|
563
801
|
} catch { /* provider \u76EE\u5F55\u7F3A\u5931/\u4E0D\u53EF\u8BFB \u2192 \u4E0D\u8BBE\u952E */ }
|
|
564
802
|
if (located) process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE = located;
|
|
803
|
+
CATALOG_PATH = process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE || null;
|
|
565
804
|
// endpoint origin \u5BF9\u9F50\uFF082026-09-29 \u8FC1\u79FB\u540C\u6B65\uFF09\uFF1ACLI \u6309 ZCODE_BASE_URL \u6D3E\u751F active
|
|
566
805
|
// \u76EE\u5F55\u8DEF\u5F84\uFF08sha256(origin) \u524D\u7F00\uFF09\uFF1BGUI \u5B89\u88C5\u7684\u76EE\u5F55\u5728 refresh \u63A7\u5236\u6587\u4EF6\u7684 endpointKey
|
|
567
806
|
// \u4E0B\uFF08\u5982 https://zcode.z.ai\uFF09\uFF0C\u4E0E CLI \u7F3A\u7701 origin\uFF08bigmodel.cn\uFF09\u4E0D\u540C\u2014\u2014\u4E0D\u6CE8\u5165\u5219
|
|
@@ -581,6 +820,115 @@ if (!process.env.ZCODE_BUILTIN_PROVIDER_CONFIG_FILE) {
|
|
|
581
820
|
}
|
|
582
821
|
}
|
|
583
822
|
|
|
823
|
+
// \u5B89\u88C5\u95E8\uFF1A\u4EFB\u4E00 patch \u6E90\u53EF\u7528\u5373\u5B89\u88C5\u62E6\u622A\u5C42\uFF1B\u51B3\u7B56\u4E24\u6001\u90FD\u51FA\u58F0\uFF08\u88C5\u4E86\u54EA\u4E9B patch / \u4E3A\u4F55
|
|
824
|
+
// \u8DF3\u8FC7\uFF09\u2014\u2014\u8865\u4E01\u5C42\u7684\u5931\u6548\u5F62\u6001\u662F\u9759\u9ED8\u7684\uFF08account \u76F4\u901A\u5931\u6548 = plan \u5BB6\u65CF\u62A5\u300C\u4E0D\u5B58\u5728
|
|
825
|
+
// Model\u300D\u800C\u65E0\u4EFB\u4F55\u65E5\u5FD7\uFF09\uFF0C\u8DF3\u8FC7\u540C\u6837\u5FC5\u987B\u7559\u75D5\u3002
|
|
826
|
+
const text = injectedConfigText();
|
|
827
|
+
const catalogPatch = CATALOG_PATH !== null ? catalogPatchText(CATALOG_PATH) : null;
|
|
828
|
+
if (text !== null || catalogPatch !== null) {
|
|
829
|
+
process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u5DF2\u5B89\u88C5: cli-config-inject=' + (text !== null ? 'on' : 'off')
|
|
830
|
+
+ ', catalog-entitled=' + (catalogPatch !== null ? 'on' : 'off')
|
|
831
|
+
+ ', provider-merge=' + (PI_SYNCED_PATH ? 'armed' : 'off') + ', cli-source-bypass=armed\\n');
|
|
832
|
+
// encoding \u5F52\u4E00\uFF08Node \u522B\u540D\u9762\uFF09\uFF1A'utf8'/'utf-8'/\u5927\u5C0F\u5199\u53D8\u4F53\u7EDF\u4E00\u6309 string \u8FD4\u56DE\u2014\u2014
|
|
833
|
+
// \u771F\u5B9E bundle \u7684 config \u8BFB\u53D6\u6070\u7528 'utf-8' \u5F62\u6001\uFF0C\u4EC5\u5339\u914D 'utf8' \u4F1A\u9519\u56DE Buffer
|
|
834
|
+
// \uFF08\u5F53\u4E0B\u6E38\u4E0D\u53EA JSON.parse \u800C\u505A\u5B57\u7B26\u4E32\u8FD0\u7B97\u65F6\u5373 TypeError\uFF09
|
|
835
|
+
// shape \u540C\u65F6\u670D\u52A1\u56DB\u5904 patch \u6E90\uFF08config / provider merge / \u5185\u5EFA\u76EE\u5F55 / \u2014\u2014encoding \u5F52\u4E00
|
|
836
|
+
// \u8BED\u4E49\u76F8\u540C\uFF0C\u5355\u526F\u672C\uFF1A\u76EE\u5F55\u6761\u76EE\u66FE\u53E6\u6301\u9010\u5B57\u91CD\u590D\u526F\u672C catalogShape\uFF0C\u5DF2\u5E76\u56DE\u672C\u51FD\u6570\uFF09
|
|
837
|
+
const shape = (args, value) => {
|
|
838
|
+
const enc = args[0];
|
|
839
|
+
const e = typeof enc === 'string' ? enc
|
|
840
|
+
: (enc && typeof enc === 'object' && typeof enc.encoding === 'string' ? enc.encoding : undefined);
|
|
841
|
+
if (e !== undefined && String(e).toLowerCase().replace(/-/g, '') === 'utf8') return value;
|
|
842
|
+
return Buffer.from(value);
|
|
843
|
+
};
|
|
844
|
+
fs.__origReadFileSync = fs.readFileSync;
|
|
845
|
+
fs.readFileSync = function (p, ...rest) {
|
|
846
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
847
|
+
const cur = injectedConfigText();
|
|
848
|
+
if (cur !== null) return shape(rest, cur);
|
|
849
|
+
}
|
|
850
|
+
// D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
|
|
851
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
852
|
+
const cur = mergedProviderConfigText();
|
|
853
|
+
if (cur !== null) return shape(rest, cur);
|
|
854
|
+
}
|
|
855
|
+
// account \u76F4\u901A\uFF1A\u5185\u5EFA\u76EE\u5F55\u8BFB\u53D6 \u2192 zhipu-account \u6CE8\u5165 entitled:true\u3002\u6309\u6587\u4EF6\u540D\u5339\u914D
|
|
856
|
+
// \uFF08app-server \u6309 ZCODE_BASE_URL \u81EA\u6D3E\u751F endpoint \u76EE\u5F55\uFF0C\u8BFB\u8DEF\u5F84\u2260env \u5B9A\u4F4D\u8DEF\u5F84\uFF09\u3002
|
|
857
|
+
if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
|
|
858
|
+
const cur = catalogPatchText(p);
|
|
859
|
+
if (cur !== null) return shape(rest, cur);
|
|
860
|
+
}
|
|
861
|
+
// account \u76F4\u901A\u2461\uFF1ACLI bundle \u6E90\u7801 \u2192 YXe entitled:!1 \u5185\u5B58\u7FFB\u8F6C\u4E3A !0
|
|
862
|
+
if (typeof p === 'string' && p === CLI_PATH) {
|
|
863
|
+
const cur = patchedCliSource(p);
|
|
864
|
+
if (cur !== null) return cur;
|
|
865
|
+
}
|
|
866
|
+
return fs.__origReadFileSync.call(fs, p, ...rest);
|
|
867
|
+
};
|
|
868
|
+
fs.promises.__origReadFile = fs.promises.readFile;
|
|
869
|
+
fs.promises.readFile = function (p, ...rest) {
|
|
870
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
871
|
+
const cur = injectedConfigText();
|
|
872
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
873
|
+
}
|
|
874
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
875
|
+
const cur = mergedProviderConfigText();
|
|
876
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
877
|
+
}
|
|
878
|
+
if (typeof p === 'string' && p.endsWith('zcode-builtin.json')) {
|
|
879
|
+
const cur = catalogPatchText(p);
|
|
880
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
881
|
+
}
|
|
882
|
+
if (typeof p === 'string' && p === CLI_PATH) {
|
|
883
|
+
const cur = patchedCliSource(p);
|
|
884
|
+
if (cur !== null) return Promise.resolve(cur);
|
|
885
|
+
}
|
|
886
|
+
return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
|
|
887
|
+
};
|
|
888
|
+
// [account \u76F4\u901A\u2461 \u8F7D\u4F53] .js \u6269\u5C55\u5904\u7406\u5668\u6302\u94A9\uFF1ANode \u5BF9 CJS \u5165\u53E3\u6E90\u7801\u7684\u8BFB\u53D6\u8D70\u539F\u751F
|
|
889
|
+
// internalModuleReadFile \u901A\u9053\uFF0Cfs \u7334\u8865\u4E01\u4E0D\u53EF\u89C1\u2014\u2014CLI bundle \u6E90\u7801\u8865\u4E01\u6539\u5728\u6269\u5C55
|
|
890
|
+
// \u5904\u7406\u5668\u5C42\u62E6\u622A\uFF08\u4EC5\u547D\u4E2D CLI_PATH\uFF1B\u5176\u4F59\u6587\u4EF6\u5168\u6743\u59D4\u6258\u539F handler\uFF0C\u96F6\u989D\u5916\u5F00\u9500\uFF09\u3002
|
|
891
|
+
const __Module = require('node:module');
|
|
892
|
+
const __origJsHandler = __Module._extensions['.js'];
|
|
893
|
+
__Module._extensions['.js'] = function (mod, filename) {
|
|
894
|
+
if (CLI_PATH && filename === CLI_PATH) {
|
|
895
|
+
const patched = patchedCliSource(filename);
|
|
896
|
+
if (patched !== null) {
|
|
897
|
+
let src = patched.charCodeAt(0) === 0xfeff ? patched.slice(1) : patched;
|
|
898
|
+
if (src.startsWith('#!')) src = src.slice(src.indexOf('\\n') + 1);
|
|
899
|
+
return mod._compile(src, filename);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
return __origJsHandler(mod, filename);
|
|
903
|
+
};
|
|
904
|
+
|
|
905
|
+
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
906
|
+
// \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
|
|
907
|
+
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u53D6\u9762 = \u4E0D\u53EF\u89C1\u3002
|
|
908
|
+
// D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
|
|
909
|
+
//\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
|
|
910
|
+
fs.__origExistsSync = fs.existsSync;
|
|
911
|
+
fs.existsSync = function (p) {
|
|
912
|
+
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
913
|
+
const cur = injectedConfigText();
|
|
914
|
+
if (cur !== null) return true;
|
|
915
|
+
}
|
|
916
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
|
|
917
|
+
if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
|
|
918
|
+
return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
|
|
919
|
+
}
|
|
920
|
+
return fs.__origExistsSync.call(fs, p);
|
|
921
|
+
};
|
|
922
|
+
} else {
|
|
923
|
+
process.stderr.write('[zcode-launcher] \u8865\u4E01\u5C42\u672A\u5B89\u88C5(\u8DF3\u8FC7): \u65E0\u51ED\u636E\u53EF\u6CE8\u5165(v2 config \u65E0 provider \u6761\u76EE)'
|
|
924
|
+
+ (CATALOG_PATH !== null
|
|
925
|
+
? (__catalogPatchStatus.get(CATALOG_PATH) === 'unreadable'
|
|
926
|
+
? '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46 catalog \u8BFB\u53D6/\u89E3\u6790\u5931\u8D25(\u6587\u4EF6\u7F3A\u5931\u6216\u635F\u574F\uFF0C\u6392\u969C\u5165\u53E3: zcode-builtin.json\u2014\u2014\u975E\u300C\u65E0\u6761\u76EE\u300D)'
|
|
927
|
+
: '; \u5185\u5EFA\u76EE\u5F55\u5DF2\u5B9A\u4F4D\u4F46\u65E0 zhipu-account \u6761\u76EE\u9700\u8865(\u76EE\u5F55\u8BFB\u53D6\u539F\u751F\u900F\u51FA)')
|
|
928
|
+
: '; \u5185\u5EFA\u76EE\u5F55\u672A\u5B9A\u4F4D(env \u672A\u8BBE\u4E14\u81EA\u5B9A\u4F4D\u672A\u547D\u4E2D)')
|
|
929
|
+
+ '\\n');
|
|
930
|
+
}
|
|
931
|
+
|
|
584
932
|
// \u4E0A\u6E38 provider bootstrap \u4EE5 argv[1] \u4E3A\u5165\u53E3\u951A\uFF0C\u4ECE\u8BE5\u8DEF\u5F84\u90BB\u8FD1\u5B9A\u4F4D CLI \u5185\u5EFA
|
|
585
933
|
// provider \u914D\u7F6E\u2014\u2014wrapper \u5F62\u6001\u4E0B argv[1] = \u672C wrapper \u843D\u76D8\u8DEF\u5F84\uFF0Cbootstrap \u4F1A\u5728
|
|
586
934
|
// wrapper \u90BB\u57DF\u627E provider \u914D\u7F6E\u800C\u5931\u8D25\uFF08\u771F\u673A\u62A5\u300C\u65E0\u6CD5\u5B9A\u4F4D CLI ZCode Built-in Provider
|
|
@@ -605,7 +953,7 @@ function ensureAppServerLauncher(engineDataDir) {
|
|
|
605
953
|
fs2.writeFileSync(tmp, APPSERVER_LAUNCHER_SOURCE);
|
|
606
954
|
fs2.renameSync(tmp, file);
|
|
607
955
|
} catch (err) {
|
|
608
|
-
const reason = (0,
|
|
956
|
+
const reason = (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
609
957
|
throw new Error(
|
|
610
958
|
`zcode app-server launcher \u843D\u76D8\u5931\u8D25: ${file}\uFF08${reason}\uFF09\u3002\u6062\u590D\uFF1A\u68C0\u67E5\u5F15\u64CE\u6570\u636E\u76EE\u5F55 \u5199\u6743\u9650\u4E0E\u78C1\u76D8\u7A7A\u95F4\uFF08engineDataDir \u7531\u5BBF\u4E3B\u4F20\u5165\uFF0C\u8DEF\u5F84\u89C1\u4E0A\uFF09\u540E\u91CD\u8BD5\u3002`
|
|
611
959
|
);
|
|
@@ -863,21 +1211,21 @@ async function readZcodeSessionView(dbPath, sessionId) {
|
|
|
863
1211
|
var fs4 = __toESM(require("fs"), 1);
|
|
864
1212
|
var import_node_path = require("path");
|
|
865
1213
|
var import_node_os = require("os");
|
|
866
|
-
var
|
|
1214
|
+
var import_subagent_engine_sdk8 = require("@zhushanwen/subagent-engine-sdk");
|
|
867
1215
|
|
|
868
1216
|
// src/logs/stderr-rotation.ts
|
|
869
|
-
var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
|
|
870
1217
|
var import_subagent_engine_sdk6 = require("@zhushanwen/subagent-engine-sdk");
|
|
1218
|
+
var import_subagent_engine_sdk7 = require("@zhushanwen/subagent-engine-sdk");
|
|
871
1219
|
var ZCODE_STDERR_LOG_PREFIX = "zcode-appserver-stderr-";
|
|
872
1220
|
function stderrLogPathFor(engineDataDir, pid) {
|
|
873
|
-
return (0,
|
|
1221
|
+
return (0, import_subagent_engine_sdk6.stderrLogPathFor)(engineDataDir, pid, ZCODE_STDERR_LOG_PREFIX);
|
|
874
1222
|
}
|
|
875
1223
|
function cleanupSiblingStderrLogs(logPath, env, now) {
|
|
876
|
-
return (0,
|
|
1224
|
+
return (0, import_subagent_engine_sdk6.cleanupSiblingStderrLogs)(logPath, env, ZCODE_STDERR_LOG_PREFIX, now);
|
|
877
1225
|
}
|
|
878
1226
|
|
|
879
1227
|
// src/connection.ts
|
|
880
|
-
var logger = (0,
|
|
1228
|
+
var logger = (0, import_subagent_engine_sdk8.getLogger)("subagents");
|
|
881
1229
|
var RAW_FRAME_LOG_CHARS = 200;
|
|
882
1230
|
var RUNTIME_PREFERENCES = Object.freeze({
|
|
883
1231
|
nativeSearchEnhancementsEnabled: true,
|
|
@@ -899,11 +1247,11 @@ function frameIdOf(frame) {
|
|
|
899
1247
|
return typeof id === "string" || typeof id === "number" ? id : void 0;
|
|
900
1248
|
}
|
|
901
1249
|
function errMessage(err) {
|
|
902
|
-
return (0,
|
|
1250
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
903
1251
|
}
|
|
904
1252
|
function buildAppServerEnv(baseEnv = process.env) {
|
|
905
1253
|
return {
|
|
906
|
-
...(0,
|
|
1254
|
+
...(0, import_subagent_engine_sdk8.buildNestedSpawnEnv)(baseEnv),
|
|
907
1255
|
ZCODE_MODEL_TELEMETRY_ENABLED: "false"
|
|
908
1256
|
};
|
|
909
1257
|
}
|
|
@@ -1053,7 +1401,7 @@ var AppServerConnection = class {
|
|
|
1053
1401
|
close() {
|
|
1054
1402
|
const child = this.child;
|
|
1055
1403
|
if (child === null || this.killChainPromise !== void 0) return;
|
|
1056
|
-
this.killChainPromise = (0,
|
|
1404
|
+
this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: ZCODE_KILL_GRACE_MS });
|
|
1057
1405
|
}
|
|
1058
1406
|
/**
|
|
1059
1407
|
* 异步完整关闭面:SIGTERM → grace → SIGKILL 杀链走完(含收尸),resolve 于进程
|
|
@@ -1065,7 +1413,7 @@ var AppServerConnection = class {
|
|
|
1065
1413
|
if (this.killChainPromise === void 0) {
|
|
1066
1414
|
const child = this.child;
|
|
1067
1415
|
if (child === null) return;
|
|
1068
|
-
this.killChainPromise = (0,
|
|
1416
|
+
this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: opts?.graceMs ?? ZCODE_KILL_GRACE_MS });
|
|
1069
1417
|
}
|
|
1070
1418
|
await this.killChainPromise;
|
|
1071
1419
|
}
|
|
@@ -1084,10 +1432,10 @@ var AppServerConnection = class {
|
|
|
1084
1432
|
this.generation += 1;
|
|
1085
1433
|
const gen = this.generation;
|
|
1086
1434
|
const script = this.launcherScript ?? this.cliPath;
|
|
1087
|
-
const child = (0,
|
|
1435
|
+
const child = (0, import_subagent_engine_sdk8.spawnEngineChild)({
|
|
1088
1436
|
command: this.nodeBin,
|
|
1089
1437
|
args: [script, "app-server", "--cwd", this.cwd],
|
|
1090
|
-
env: (0,
|
|
1438
|
+
env: (0, import_subagent_engine_sdk8.buildEngineChildEnv)(this.env, {
|
|
1091
1439
|
// L0 TAIJI_AGENT_DATA_DIR 缺省链:显式传参 > 宿主注入 env > tmpdir 占位
|
|
1092
1440
|
//(app-server 不消费该键,占位仅满足 L0 必注入契约;生产调用方
|
|
1093
1441
|
// zcode-engine.ensureAppServerRuntime 恒传 engineDataDir)。
|
|
@@ -1125,7 +1473,7 @@ var AppServerConnection = class {
|
|
|
1125
1473
|
}
|
|
1126
1474
|
}
|
|
1127
1475
|
};
|
|
1128
|
-
(0,
|
|
1476
|
+
(0, import_subagent_engine_sdk8.pumpNdjsonLines)(child.stdout, (line) => this.handleLine(line));
|
|
1129
1477
|
child.stderr?.setEncoding("utf8");
|
|
1130
1478
|
child.stderr?.on("data", (chunk) => {
|
|
1131
1479
|
this.stderrTail = (this.stderrTail + chunk).slice(-ZCODE_APPSERVER_STDERR_TAIL_BUFFER_CHARS);
|
|
@@ -1266,8 +1614,8 @@ var AppServerConnection = class {
|
|
|
1266
1614
|
}
|
|
1267
1615
|
this.stderrStream.write(chunk);
|
|
1268
1616
|
if (this.activeStderrLogPath !== null) {
|
|
1269
|
-
const params = (0,
|
|
1270
|
-
if ((0,
|
|
1617
|
+
const params = (0, import_subagent_engine_sdk7.stderrRotationParams)(process.env);
|
|
1618
|
+
if ((0, import_subagent_engine_sdk7.rotateStderrLogIfNeeded)(this.activeStderrLogPath, params)) {
|
|
1271
1619
|
this.closeStderrStream();
|
|
1272
1620
|
}
|
|
1273
1621
|
}
|
|
@@ -1285,8 +1633,8 @@ var AppServerConnection = class {
|
|
|
1285
1633
|
|
|
1286
1634
|
// src/session-channel.ts
|
|
1287
1635
|
var import_node_crypto = require("crypto");
|
|
1288
|
-
var
|
|
1289
|
-
var logger2 = (0,
|
|
1636
|
+
var import_subagent_engine_sdk9 = require("@zhushanwen/subagent-engine-sdk");
|
|
1637
|
+
var logger2 = (0, import_subagent_engine_sdk9.getLogger)("subagents");
|
|
1290
1638
|
var SUBSCRIBE_DELIVERY_KIND = "desktop-continuous";
|
|
1291
1639
|
var WORKSPACE_KEY_HASH_CHARS = 16;
|
|
1292
1640
|
var CREATE_REPLY_LOG_CHARS = 300;
|
|
@@ -1295,7 +1643,7 @@ function isRecord3(v) {
|
|
|
1295
1643
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
1296
1644
|
}
|
|
1297
1645
|
function errMessage2(err) {
|
|
1298
|
-
return (0,
|
|
1646
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
1299
1647
|
}
|
|
1300
1648
|
function stableWorkspaceKey(workspacePath) {
|
|
1301
1649
|
return "ws-" + (0, import_node_crypto.createHash)("sha256").update(workspacePath).digest("hex").slice(0, WORKSPACE_KEY_HASH_CHARS);
|
|
@@ -1822,8 +2170,8 @@ var SessionChannel = class {
|
|
|
1822
2170
|
|
|
1823
2171
|
// src/session-db-maintenance.ts
|
|
1824
2172
|
var fs5 = __toESM(require("fs"), 1);
|
|
1825
|
-
var
|
|
1826
|
-
var logger3 = (0,
|
|
2173
|
+
var import_subagent_engine_sdk10 = require("@zhushanwen/subagent-engine-sdk");
|
|
2174
|
+
var logger3 = (0, import_subagent_engine_sdk10.getLogger)("subagents");
|
|
1827
2175
|
var ZCODE_SESSION_TTL_MS = 2592e6;
|
|
1828
2176
|
var ZCODE_SESSION_SWEEP_INTERVAL_MS = 864e5;
|
|
1829
2177
|
var SWEEP_BUSY_TIMEOUT_MS = 5e3;
|
|
@@ -1979,9 +2327,10 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
|
|
|
1979
2327
|
}
|
|
1980
2328
|
|
|
1981
2329
|
// src/zcode-engine.ts
|
|
1982
|
-
var logger4 = (0,
|
|
2330
|
+
var logger4 = (0, import_subagent_engine_sdk11.getLogger)("subagents");
|
|
1983
2331
|
var PROBE_VERSION_TIMEOUT_MS = 15e3;
|
|
1984
2332
|
var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
|
|
2333
|
+
var OFF_FAMILY_THINKING_LEVELS = /* @__PURE__ */ new Set(["off", "minimal"]);
|
|
1985
2334
|
var ZcodeEngine = class {
|
|
1986
2335
|
id = ZCODE_ENGINE_ID;
|
|
1987
2336
|
deps;
|
|
@@ -2194,7 +2543,7 @@ var ZcodeEngine = class {
|
|
|
2194
2543
|
*/
|
|
2195
2544
|
async attemptAppServerTurn(task, ctx, modelRef, cwd, prompt, opts = {}) {
|
|
2196
2545
|
const rt = this.ensureAppServerRuntime();
|
|
2197
|
-
const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.
|
|
2546
|
+
const reasoningLevel = modelRef !== void 0 && modelRef !== "" ? this.reasoningLevelFor(modelRef, task.thinkingLevel) : void 0;
|
|
2198
2547
|
const createParams = buildAppServerCreateParams(task, modelRef, cwd, reasoningLevel);
|
|
2199
2548
|
let currentSessionId;
|
|
2200
2549
|
let signalSessionCreated;
|
|
@@ -2348,7 +2697,7 @@ var ZcodeEngine = class {
|
|
|
2348
2697
|
const env = buildAppServerEnv(this.deps.processEnv ?? process.env);
|
|
2349
2698
|
env.ZCODE_ENG_CLI_PATH = cliPath;
|
|
2350
2699
|
env.ZCODE_ENG_V2_CONFIG = this.deps.sources?.v2ConfigPath ?? defaultV2ConfigPath();
|
|
2351
|
-
env.ZCODE_ENG_PROVIDER_CONFIG = this.deps.sources
|
|
2700
|
+
env.ZCODE_ENG_PROVIDER_CONFIG = resolvePersonalProviderConfigPath(this.deps.sources, engineDataDir);
|
|
2352
2701
|
const sessionDbPath = zcodeSessionDbPath(engineDataDir);
|
|
2353
2702
|
env.ZCODE_SESSION_DB_PATH = sessionDbPath;
|
|
2354
2703
|
delete env.ZCODE_SESSION_DB;
|
|
@@ -2445,7 +2794,7 @@ var ZcodeEngine = class {
|
|
|
2445
2794
|
/** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
|
|
2446
2795
|
applyAbortedOutcome(outcome, task, ctx, final, emit) {
|
|
2447
2796
|
outcome.exitCode = null;
|
|
2448
|
-
outcome.error = isHostTimeoutAbort(ctx) ? (0,
|
|
2797
|
+
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\u53E3\uFF0C\u5BBF\u4E3B\u5408\u6210\u7EC8\u6001\uFF09\u3002\u8F93\u51FA\u5C3E\u90E8: ${final.output.stdoutText.slice(-ZCODE_ERROR_TAIL_CHARS)}`;
|
|
2449
2798
|
emit({ type: "error", message: outcome.error });
|
|
2450
2799
|
}
|
|
2451
2800
|
/**
|
|
@@ -2491,16 +2840,30 @@ var ZcodeEngine = class {
|
|
|
2491
2840
|
listModels() {
|
|
2492
2841
|
return listZcodeModels(this.deps.sources);
|
|
2493
2842
|
}
|
|
2494
|
-
/**
|
|
2843
|
+
/** 模型 reasoning 值域缓存(目录 modelRules 值域;per-modelRef 记忆化——
|
|
2495
2844
|
* 目录文件在引擎进程生命周期内视为静态,重复 run 不重读)。 */
|
|
2496
2845
|
reasoningMemo = /* @__PURE__ */ new Map();
|
|
2497
|
-
|
|
2846
|
+
/**
|
|
2847
|
+
* create 帧模型 reasoning 档择选(目录值域域内择档;2026-10-13 探针实测驱动):
|
|
2848
|
+
* - 无 thinkingLevel:目录值域首值(最小档,现状保形——轻推理默认);
|
|
2849
|
+
* - off 族(off/minimal,显式禁思考/最省):恒值域首值(最小档)——绝不落
|
|
2850
|
+
* 非最小档末值回退(那是「请求思考」档位的回退,off 族落之即意图反转);
|
|
2851
|
+
* - 其余 thinkingLevel:精确命中值域 → 用之;值域无精确名 → 取非最小档末值
|
|
2852
|
+
* (请求了思考 = reasoning 开;plan 网关对部分模型拒收 disabled——目录域含
|
|
2853
|
+
* disabled 但服务端只认非最小档,域与接受面漂移时显式意图走非最小档)。
|
|
2854
|
+
*/
|
|
2855
|
+
reasoningLevelFor(modelRef, thinkingLevel) {
|
|
2498
2856
|
const memoKey = `${locateZcodeBuiltinCatalog(this.deps.sources) ?? "none"}|${modelRef}`;
|
|
2499
|
-
const
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2857
|
+
const memoHit = this.reasoningMemo.get(memoKey);
|
|
2858
|
+
const domain = memoHit !== void 0 || this.reasoningMemo.has(memoKey) ? memoHit : resolveZcodeReasoningValues(modelRef, this.deps.sources);
|
|
2859
|
+
this.reasoningMemo.set(memoKey, domain);
|
|
2860
|
+
if (domain === void 0 || domain.length === 0) return void 0;
|
|
2861
|
+
const requested = thinkingLevel?.trim();
|
|
2862
|
+
if (requested === void 0 || requested === "") return domain[0];
|
|
2863
|
+
if (domain.includes(requested)) return requested;
|
|
2864
|
+
if (OFF_FAMILY_THINKING_LEVELS.has(requested)) return domain[0];
|
|
2865
|
+
const nonMinimal = domain.slice(1);
|
|
2866
|
+
return nonMinimal.length > 0 ? nonMinimal[nonMinimal.length - 1] : domain[0];
|
|
2504
2867
|
}
|
|
2505
2868
|
/**
|
|
2506
2869
|
* [u-h2 D2-2] 派发同步期 model 校验:委托 resolveZcodeModelRef(与 run prepare 期
|
|
@@ -2550,7 +2913,7 @@ var ZcodeEngine = class {
|
|
|
2550
2913
|
}
|
|
2551
2914
|
} else {
|
|
2552
2915
|
const poolDir = path4.resolve(
|
|
2553
|
-
(0,
|
|
2916
|
+
(0, import_subagent_engine_sdk12.resolvePoolDir)(this.deps.engineDataDir(), ZCODE_ENGINE_ID, import_subagent_engine_sdk12.SHARED_POOL_KEY)
|
|
2554
2917
|
);
|
|
2555
2918
|
const resolved = path4.resolve(poolDir, dbPathRaw);
|
|
2556
2919
|
if (resolved.startsWith(poolDir + path4.sep)) {
|
|
@@ -2568,7 +2931,7 @@ var ZcodeEngine = class {
|
|
|
2568
2931
|
logger4.warn("[zcode-engine] native session read failed, degrade to journal replay", {
|
|
2569
2932
|
dbPath,
|
|
2570
2933
|
sessionId,
|
|
2571
|
-
reason: (0,
|
|
2934
|
+
reason: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
|
|
2572
2935
|
});
|
|
2573
2936
|
}
|
|
2574
2937
|
}
|
|
@@ -2655,7 +3018,7 @@ var ZcodeEngine = class {
|
|
|
2655
3018
|
buildPrompt(task, schema) {
|
|
2656
3019
|
const segments = [...task.appendSystemPrompt ?? []];
|
|
2657
3020
|
segments.push(task.prompt);
|
|
2658
|
-
if (schema !== void 0) segments.push((0,
|
|
3021
|
+
if (schema !== void 0) segments.push((0, import_subagent_engine_sdk12.buildSchemaEmulationSegment)(schema));
|
|
2659
3022
|
return segments.join("\n\n");
|
|
2660
3023
|
}
|
|
2661
3024
|
};
|
|
@@ -2698,7 +3061,7 @@ function isPlainObject(v) {
|
|
|
2698
3061
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
2699
3062
|
}
|
|
2700
3063
|
function errMessage3(err) {
|
|
2701
|
-
return (0,
|
|
3064
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
2702
3065
|
}
|
|
2703
3066
|
function resolveAppserverTimingMs(envName, fallbackMs, label) {
|
|
2704
3067
|
const raw = process.env[envName];
|
|
@@ -2810,7 +3173,7 @@ function parsedAppServerAttempt(task, r) {
|
|
|
2810
3173
|
kind: "parsed",
|
|
2811
3174
|
output: syntheticAppServerOutput(0),
|
|
2812
3175
|
payload: turnResultToPayload(r),
|
|
2813
|
-
...schema !== void 0 ? { schemaResult: (0,
|
|
3176
|
+
...schema !== void 0 ? { schemaResult: (0, import_subagent_engine_sdk12.extractAndValidateStructuredOutput)(r.response, schema) } : {}
|
|
2814
3177
|
};
|
|
2815
3178
|
}
|
|
2816
3179
|
function failedTerminalAppServerAttempt(r) {
|
|
@@ -2848,16 +3211,16 @@ function failedAppServerAttempt(err, currentSessionId, opts = {}) {
|
|
|
2848
3211
|
};
|
|
2849
3212
|
}
|
|
2850
3213
|
function isHostTimeoutAbort(ctx) {
|
|
2851
|
-
return ctx.signal?.aborted === true && ctx.signal.reason ===
|
|
3214
|
+
return ctx.signal?.aborted === true && ctx.signal.reason === import_subagent_engine_sdk12.HOST_TIMEOUT_ABORT_REASON;
|
|
2852
3215
|
}
|
|
2853
3216
|
var PROBE_STDOUT_CAP_CHARS = 4096;
|
|
2854
3217
|
async function defaultProbeVersion(cliPath, dataDir) {
|
|
2855
3218
|
try {
|
|
2856
3219
|
return await new Promise((resolve2, reject) => {
|
|
2857
|
-
const child = (0,
|
|
3220
|
+
const child = (0, import_subagent_engine_sdk12.spawnEngineChild)({
|
|
2858
3221
|
command: "node",
|
|
2859
3222
|
args: [cliPath, "--version"],
|
|
2860
|
-
env: (0,
|
|
3223
|
+
env: (0, import_subagent_engine_sdk12.buildEngineChildEnv)(process.env, { dataDir }),
|
|
2861
3224
|
stdout: "pipe",
|
|
2862
3225
|
stderr: "ignore",
|
|
2863
3226
|
signal: AbortSignal.timeout(PROBE_VERSION_TIMEOUT_MS)
|
|
@@ -2875,7 +3238,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
|
|
|
2875
3238
|
});
|
|
2876
3239
|
} catch (err) {
|
|
2877
3240
|
logger4.debug(
|
|
2878
|
-
`[zcode-engine] probe version check failed (best-effort continue): ${(0,
|
|
3241
|
+
`[zcode-engine] probe version check failed (best-effort continue): ${(0, import_subagent_engine_sdk5.toErrorMessage)(err)}`
|
|
2879
3242
|
);
|
|
2880
3243
|
return void 0;
|
|
2881
3244
|
}
|
|
@@ -2883,7 +3246,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
|
|
|
2883
3246
|
|
|
2884
3247
|
// src/registration.ts
|
|
2885
3248
|
function defaultEngineDataDir() {
|
|
2886
|
-
return (0,
|
|
3249
|
+
return (0, import_subagent_engine_sdk13.resolveEngineDataDir)(process.env);
|
|
2887
3250
|
}
|
|
2888
3251
|
function createZcodeEngine(deps) {
|
|
2889
3252
|
return new ZcodeEngine(deps);
|
|
@@ -2896,11 +3259,11 @@ function createDefaultZcodeEngine() {
|
|
|
2896
3259
|
}
|
|
2897
3260
|
|
|
2898
3261
|
// src/port-types.ts
|
|
2899
|
-
var
|
|
3262
|
+
var import_subagent_engine_sdk14 = require("@zhushanwen/subagent-engine-sdk");
|
|
2900
3263
|
|
|
2901
3264
|
// src/server.ts
|
|
2902
3265
|
var import_server = require("@zhushanwen/subagent-engine-sdk/server");
|
|
2903
|
-
var logger5 = (0,
|
|
3266
|
+
var logger5 = (0, import_subagent_engine_sdk15.getLogger)("subagents");
|
|
2904
3267
|
var EngineProtocolServer = class {
|
|
2905
3268
|
write;
|
|
2906
3269
|
engine;
|
|
@@ -2970,7 +3333,7 @@ var EngineProtocolServer = class {
|
|
|
2970
3333
|
const active = { controller, seq: 0 };
|
|
2971
3334
|
this.activeRuns.set(runId, active);
|
|
2972
3335
|
const fullTask = (0, import_server.assembleFullTask)(task, ctx);
|
|
2973
|
-
const ctxModel = (0,
|
|
3336
|
+
const ctxModel = (0, import_subagent_engine_sdk14.parseCtxModel)(ctx.ctxModel);
|
|
2974
3337
|
const stream = ctx.streamMode === "stream" ? {
|
|
2975
3338
|
onDelta: (delta) => {
|
|
2976
3339
|
void this.reverseRequestInternal("host/streamDelta", { runId, delta }).catch(this.warnReverseFailure("host/streamDelta", `run ${runId}`));
|
|
@@ -3006,7 +3369,7 @@ var EngineProtocolServer = class {
|
|
|
3006
3369
|
}
|
|
3007
3370
|
validateModel(params) {
|
|
3008
3371
|
if (this.engine.validateModel === void 0) {
|
|
3009
|
-
throw new
|
|
3372
|
+
throw new import_subagent_engine_sdk15.EngineSdkError(
|
|
3010
3373
|
"engine_capability_unsupported",
|
|
3011
3374
|
"engine does not implement validateModel",
|
|
3012
3375
|
"Manifest omits modelCatalog; model validation falls back to run-time engine checks."
|
|
@@ -3033,7 +3396,7 @@ var EngineProtocolServer = class {
|
|
|
3033
3396
|
warnReverseFailure(method, context) {
|
|
3034
3397
|
return (err) => {
|
|
3035
3398
|
logger5.warn(`[protocol] ${method} reverse request failed (${context}); continuing without it`, {
|
|
3036
|
-
detail: (0,
|
|
3399
|
+
detail: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
|
|
3037
3400
|
});
|
|
3038
3401
|
};
|
|
3039
3402
|
}
|
|
@@ -3062,7 +3425,7 @@ var EngineProtocolServer = class {
|
|
|
3062
3425
|
clearTimeout(pending.timer);
|
|
3063
3426
|
this.reverseClock?.acked(String(id));
|
|
3064
3427
|
this.reverseClock?.settled(String(id));
|
|
3065
|
-
if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0,
|
|
3428
|
+
if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0, import_subagent_engine_sdk5.toErrorMessage)(frame.error)}`));
|
|
3066
3429
|
else pending.resolve(frame.result);
|
|
3067
3430
|
}
|
|
3068
3431
|
};
|
|
@@ -3075,8 +3438,8 @@ function toProtocolError(err) {
|
|
|
3075
3438
|
}
|
|
3076
3439
|
|
|
3077
3440
|
// src/main.ts
|
|
3078
|
-
var clock = (0,
|
|
3079
|
-
(0,
|
|
3441
|
+
var clock = (0, import_subagent_engine_sdk16.armEngineSelfDestruct)({ stdin: process.stdin });
|
|
3442
|
+
(0, import_subagent_engine_sdk16.runEngineCliEntry)({
|
|
3080
3443
|
component: "zcode-engine-cli",
|
|
3081
3444
|
server: new EngineProtocolServer({
|
|
3082
3445
|
write: (frame) => {
|