@zhushanwen/zcode-subagent-cli 0.6.0 → 0.7.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-33XN65H4.js} +203 -29
- package/dist/index.cjs +243 -69
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +1 -1
- package/dist/main.cjs +246 -72
- 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;
|
|
@@ -300,15 +381,14 @@ function defaultProviderForShortName(conf, withKey) {
|
|
|
300
381
|
return withKey[0][0];
|
|
301
382
|
}
|
|
302
383
|
function resolveZcodeModelRef(requested, sources) {
|
|
303
|
-
const
|
|
304
|
-
const conf = readSourceConfig(srcPath);
|
|
384
|
+
const { conf, sourceDesc } = readPersonalProviderView(sources);
|
|
305
385
|
const withKey = [...conf.providers.entries()].filter(([, e]) => hasApiKey(e));
|
|
306
386
|
const wanted = requested?.trim() || void 0;
|
|
307
387
|
if (withKey.length === 0) {
|
|
308
388
|
const hint = wanted ? `model="${wanted}" \u4E0D\u80FD\u6821\u9A8C` : "\u7F3A\u7701\u6A21\u578B\u89E3\u6790\u4E0D\u80FD\u6821\u9A8C";
|
|
309
389
|
throw new ZcodePrepareError(
|
|
310
390
|
"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${
|
|
391
|
+
`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
392
|
);
|
|
313
393
|
}
|
|
314
394
|
if (wanted === void 0) return "";
|
|
@@ -319,26 +399,26 @@ function resolveZcodeModelRef(requested, sources) {
|
|
|
319
399
|
const known = withKey.map(([id]) => id).join(", ");
|
|
320
400
|
throw new ZcodePrepareError(
|
|
321
401
|
"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`
|
|
402
|
+
`\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
403
|
);
|
|
324
404
|
}
|
|
325
405
|
if (!hasApiKey(entry)) {
|
|
326
406
|
throw new ZcodePrepareError(
|
|
327
407
|
"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`
|
|
408
|
+
`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
409
|
);
|
|
330
410
|
}
|
|
331
411
|
const models = entry.models ?? [];
|
|
332
412
|
if (models.length > 0 && !models.includes(short)) {
|
|
333
413
|
throw new ZcodePrepareError(
|
|
334
414
|
"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`
|
|
415
|
+
`\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
416
|
);
|
|
337
417
|
}
|
|
338
418
|
return `${provider}/${short}`;
|
|
339
419
|
}
|
|
340
420
|
function listZcodeModels(sources) {
|
|
341
|
-
const conf =
|
|
421
|
+
const { conf } = readPersonalProviderView(sources);
|
|
342
422
|
const out = [];
|
|
343
423
|
for (const [pid, entry] of conf.providers) {
|
|
344
424
|
if (!hasApiKey(entry)) continue;
|
|
@@ -358,7 +438,7 @@ var fs2 = __toESM(require("fs"), 1);
|
|
|
358
438
|
var path3 = __toESM(require("path"), 1);
|
|
359
439
|
|
|
360
440
|
// src/error-message.ts
|
|
361
|
-
var
|
|
441
|
+
var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
|
|
362
442
|
|
|
363
443
|
// src/appserver-launcher.ts
|
|
364
444
|
var ZCODE_APPSERVER_LAUNCHER_NAME = "appserver-launcher.cjs";
|
|
@@ -370,7 +450,12 @@ const os = require('node:os');
|
|
|
370
450
|
|
|
371
451
|
const CLI_PATH = process.env.ZCODE_ENG_CLI_PATH;
|
|
372
452
|
const V2_PATH = process.env.ZCODE_ENG_V2_CONFIG || path.join(os.homedir(), '.zcode', 'v2', 'config.json');
|
|
373
|
-
|
|
453
|
+
// \u771F\u5B9E provider_config.json\uFF08Registry \u76F4\u8BFB\u8DEF\u5F84\uFF0CA0 \u63A2\u9488\u5B9E\u8BC1\uFF09\u2014\u2014\u4E0E CONFIG_PATH \u540C\u6B3E
|
|
454
|
+
// 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
|
|
455
|
+
const REAL_PROVIDER_CONFIG_PATH = path.join(os.homedir(), '.zcode', 'v2', 'provider_config.json');
|
|
456
|
+
// 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
|
|
457
|
+
const PI_SYNCED_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || '';
|
|
458
|
+
const PROVIDER_CONFIG_PATH = process.env.ZCODE_ENG_PROVIDER_CONFIG || REAL_PROVIDER_CONFIG_PATH;
|
|
374
459
|
const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
|
|
375
460
|
|
|
376
461
|
// \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
|
|
@@ -448,11 +533,14 @@ function injectedConfigText() {
|
|
|
448
533
|
for (const mid of order) {
|
|
449
534
|
if (typeof mid === 'string' && mid !== '' && !(mid in models)) models[mid] = {};
|
|
450
535
|
}
|
|
536
|
+
// kind \u6309\u6761\u76EE api.type \u6D3E\u751F\uFF08D3\uFF09\uFF1Aanthropic-messages \u2192 anthropic\uFF0C\u5176\u4F59
|
|
537
|
+
// \uFF08openai-chat-completions / api.type \u7F3A\u5E2D / \u672A\u77E5\u503C\uFF09\u2192 openai-compatible
|
|
538
|
+
// \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
|
|
539
|
+
// \u771F\u5B9E\u6761\u76EE\uFF0Canthropic \u534F\u8BAE\u771F\u5B9E\u6761\u76EE\u4ECE\u65E7\u9519\u914D\u503C openai-compatible \u987A\u5E26\u4FEE\u6B63\uFF09\u3002
|
|
540
|
+
// \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
541
|
injectable[id] = {
|
|
452
542
|
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',
|
|
543
|
+
kind: api.type === 'anthropic-messages' ? 'anthropic' : 'openai-compatible',
|
|
456
544
|
options: { apiKey: access.apiKey, baseURL: api.baseUrl },
|
|
457
545
|
source: 'custom',
|
|
458
546
|
models: models,
|
|
@@ -469,6 +557,77 @@ function injectedConfigText() {
|
|
|
469
557
|
return JSON.stringify(merged);
|
|
470
558
|
}
|
|
471
559
|
|
|
560
|
+
// [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
|
|
561
|
+
// eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
|
|
562
|
+
// \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
|
|
563
|
+
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\u8F68\u7248\u89C4\u5219\uFF1A
|
|
564
|
+
// - \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
|
|
565
|
+
// - \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
|
|
566
|
+
// \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
|
|
567
|
+
// - 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
|
|
568
|
+
// \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
|
|
569
|
+
// - providerOrder\uFF1A\u771F\u5B9E\u73B0\u503C\u5E8F + \u526F\u672C\u72EC\u6709 id \u8FFD\u52A0\uFF08\u53BB\u91CD\u4FDD\u5E8F\uFF09
|
|
570
|
+
// - \u5176\u4F59\u5B57\u6BB5\uFF08\u542B config \u5185\u5176\u4ED6\u952E\uFF09\u53D6\u771F\u5B9E\u73B0\u503C
|
|
571
|
+
function mergeProviderConfig(realObj, copyObj) {
|
|
572
|
+
const isRec = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
573
|
+
if (!isRec(copyObj)) return realObj;
|
|
574
|
+
if (!isRec(realObj)) return copyObj;
|
|
575
|
+
const cfgOf = (obj) => (isRec(obj.config) ? obj.config : {});
|
|
576
|
+
const rulesOf = (obj) => {
|
|
577
|
+
const pcr = cfgOf(obj).providerConfigRules;
|
|
578
|
+
const r = isRec(pcr) ? pcr.providerRules : undefined;
|
|
579
|
+
return Array.isArray(r) ? r : [];
|
|
580
|
+
};
|
|
581
|
+
const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
|
|
582
|
+
const mergedRules = [];
|
|
583
|
+
const seen = {};
|
|
584
|
+
for (const rule of rulesOf(realObj)) {
|
|
585
|
+
mergedRules.push(rule);
|
|
586
|
+
if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
|
|
587
|
+
}
|
|
588
|
+
for (const rule of rulesOf(copyObj)) {
|
|
589
|
+
if (!isRec(rule) || typeof rule.providerId !== 'string' || rule.providerId === '') continue;
|
|
590
|
+
if (seen[rule.providerId]) continue;
|
|
591
|
+
seen[rule.providerId] = true;
|
|
592
|
+
mergedRules.push(rule);
|
|
593
|
+
}
|
|
594
|
+
const mergedOrder = [];
|
|
595
|
+
for (const id of strArr(cfgOf(realObj).providerOrder).concat(strArr(cfgOf(copyObj).providerOrder))) {
|
|
596
|
+
if (mergedOrder.indexOf(id) === -1) mergedOrder.push(id);
|
|
597
|
+
}
|
|
598
|
+
const outCfg = Object.assign({}, cfgOf(realObj), {
|
|
599
|
+
providerOrder: mergedOrder,
|
|
600
|
+
providerConfigRules: Object.assign(
|
|
601
|
+
{},
|
|
602
|
+
isRec(cfgOf(realObj).providerConfigRules) ? cfgOf(realObj).providerConfigRules : {},
|
|
603
|
+
{ providerRules: mergedRules },
|
|
604
|
+
),
|
|
605
|
+
});
|
|
606
|
+
return Object.assign({}, realObj, { config: outCfg });
|
|
607
|
+
}
|
|
608
|
+
// [merge-fn-end]
|
|
609
|
+
|
|
610
|
+
// 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
|
|
611
|
+
// \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
|
|
612
|
+
// \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
|
|
613
|
+
// \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
|
|
614
|
+
// patch \u9762\u9012\u5F52\u81EA\u8C03\u7528\uFF09\u3002
|
|
615
|
+
function mergedProviderConfigText() {
|
|
616
|
+
if (!PI_SYNCED_PATH) return null;
|
|
617
|
+
const readOrig = fs.__origReadFileSync || fs.readFileSync;
|
|
618
|
+
let copyObj;
|
|
619
|
+
try {
|
|
620
|
+
copyObj = JSON.parse(readOrig(PI_SYNCED_PATH, 'utf8'));
|
|
621
|
+
} catch { return null; }
|
|
622
|
+
if (!copyObj || typeof copyObj !== 'object' || Array.isArray(copyObj)) return null;
|
|
623
|
+
let realObj = null;
|
|
624
|
+
try {
|
|
625
|
+
const parsed = JSON.parse(readOrig(REAL_PROVIDER_CONFIG_PATH, 'utf8'));
|
|
626
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) realObj = parsed;
|
|
627
|
+
} catch { /* ENOENT/\u635F\u574F \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u4E3A\u5168\u96C6 */ }
|
|
628
|
+
return JSON.stringify(mergeProviderConfig(realObj, copyObj));
|
|
629
|
+
}
|
|
630
|
+
|
|
472
631
|
if (!CLI_PATH) {
|
|
473
632
|
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
633
|
process.exit(2);
|
|
@@ -492,6 +651,11 @@ if (text !== null) {
|
|
|
492
651
|
const cur = injectedConfigText();
|
|
493
652
|
if (cur !== null) return shape(rest, cur);
|
|
494
653
|
}
|
|
654
|
+
// D3 \u6362\u8F68\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
|
|
655
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
656
|
+
const cur = mergedProviderConfigText();
|
|
657
|
+
if (cur !== null) return shape(rest, cur);
|
|
658
|
+
}
|
|
495
659
|
return fs.__origReadFileSync.call(fs, p, ...rest);
|
|
496
660
|
};
|
|
497
661
|
fs.promises.__origReadFile = fs.promises.readFile;
|
|
@@ -500,17 +664,27 @@ if (text !== null) {
|
|
|
500
664
|
const cur = injectedConfigText();
|
|
501
665
|
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
502
666
|
}
|
|
667
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
668
|
+
const cur = mergedProviderConfigText();
|
|
669
|
+
if (cur !== null) return Promise.resolve(shape(rest, cur));
|
|
670
|
+
}
|
|
503
671
|
return fs.promises.__origReadFile.call(fs.promises, p, ...rest);
|
|
504
672
|
};
|
|
505
673
|
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
506
674
|
// \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
|
|
675
|
+
// \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
|
|
676
|
+
// D3 \u6362\u8F68\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
|
|
677
|
+
//\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
|
|
508
678
|
fs.__origExistsSync = fs.existsSync;
|
|
509
679
|
fs.existsSync = function (p) {
|
|
510
680
|
if (typeof p === 'string' && p === CONFIG_PATH) {
|
|
511
681
|
const cur = injectedConfigText();
|
|
512
682
|
if (cur !== null) return true;
|
|
513
683
|
}
|
|
684
|
+
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH && PI_SYNCED_PATH) {
|
|
685
|
+
if (fs.__origExistsSync.call(fs, REAL_PROVIDER_CONFIG_PATH)) return true;
|
|
686
|
+
return fs.__origExistsSync.call(fs, PI_SYNCED_PATH);
|
|
687
|
+
}
|
|
514
688
|
return fs.__origExistsSync.call(fs, p);
|
|
515
689
|
};
|
|
516
690
|
}
|
|
@@ -605,7 +779,7 @@ function ensureAppServerLauncher(engineDataDir) {
|
|
|
605
779
|
fs2.writeFileSync(tmp, APPSERVER_LAUNCHER_SOURCE);
|
|
606
780
|
fs2.renameSync(tmp, file);
|
|
607
781
|
} catch (err) {
|
|
608
|
-
const reason = (0,
|
|
782
|
+
const reason = (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
609
783
|
throw new Error(
|
|
610
784
|
`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
785
|
);
|
|
@@ -863,21 +1037,21 @@ async function readZcodeSessionView(dbPath, sessionId) {
|
|
|
863
1037
|
var fs4 = __toESM(require("fs"), 1);
|
|
864
1038
|
var import_node_path = require("path");
|
|
865
1039
|
var import_node_os = require("os");
|
|
866
|
-
var
|
|
1040
|
+
var import_subagent_engine_sdk8 = require("@zhushanwen/subagent-engine-sdk");
|
|
867
1041
|
|
|
868
1042
|
// src/logs/stderr-rotation.ts
|
|
869
|
-
var import_subagent_engine_sdk5 = require("@zhushanwen/subagent-engine-sdk");
|
|
870
1043
|
var import_subagent_engine_sdk6 = require("@zhushanwen/subagent-engine-sdk");
|
|
1044
|
+
var import_subagent_engine_sdk7 = require("@zhushanwen/subagent-engine-sdk");
|
|
871
1045
|
var ZCODE_STDERR_LOG_PREFIX = "zcode-appserver-stderr-";
|
|
872
1046
|
function stderrLogPathFor(engineDataDir, pid) {
|
|
873
|
-
return (0,
|
|
1047
|
+
return (0, import_subagent_engine_sdk6.stderrLogPathFor)(engineDataDir, pid, ZCODE_STDERR_LOG_PREFIX);
|
|
874
1048
|
}
|
|
875
1049
|
function cleanupSiblingStderrLogs(logPath, env, now) {
|
|
876
|
-
return (0,
|
|
1050
|
+
return (0, import_subagent_engine_sdk6.cleanupSiblingStderrLogs)(logPath, env, ZCODE_STDERR_LOG_PREFIX, now);
|
|
877
1051
|
}
|
|
878
1052
|
|
|
879
1053
|
// src/connection.ts
|
|
880
|
-
var logger = (0,
|
|
1054
|
+
var logger = (0, import_subagent_engine_sdk8.getLogger)("subagents");
|
|
881
1055
|
var RAW_FRAME_LOG_CHARS = 200;
|
|
882
1056
|
var RUNTIME_PREFERENCES = Object.freeze({
|
|
883
1057
|
nativeSearchEnhancementsEnabled: true,
|
|
@@ -899,11 +1073,11 @@ function frameIdOf(frame) {
|
|
|
899
1073
|
return typeof id === "string" || typeof id === "number" ? id : void 0;
|
|
900
1074
|
}
|
|
901
1075
|
function errMessage(err) {
|
|
902
|
-
return (0,
|
|
1076
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
903
1077
|
}
|
|
904
1078
|
function buildAppServerEnv(baseEnv = process.env) {
|
|
905
1079
|
return {
|
|
906
|
-
...(0,
|
|
1080
|
+
...(0, import_subagent_engine_sdk8.buildNestedSpawnEnv)(baseEnv),
|
|
907
1081
|
ZCODE_MODEL_TELEMETRY_ENABLED: "false"
|
|
908
1082
|
};
|
|
909
1083
|
}
|
|
@@ -1053,7 +1227,7 @@ var AppServerConnection = class {
|
|
|
1053
1227
|
close() {
|
|
1054
1228
|
const child = this.child;
|
|
1055
1229
|
if (child === null || this.killChainPromise !== void 0) return;
|
|
1056
|
-
this.killChainPromise = (0,
|
|
1230
|
+
this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: ZCODE_KILL_GRACE_MS });
|
|
1057
1231
|
}
|
|
1058
1232
|
/**
|
|
1059
1233
|
* 异步完整关闭面:SIGTERM → grace → SIGKILL 杀链走完(含收尸),resolve 于进程
|
|
@@ -1065,7 +1239,7 @@ var AppServerConnection = class {
|
|
|
1065
1239
|
if (this.killChainPromise === void 0) {
|
|
1066
1240
|
const child = this.child;
|
|
1067
1241
|
if (child === null) return;
|
|
1068
|
-
this.killChainPromise = (0,
|
|
1242
|
+
this.killChainPromise = (0, import_subagent_engine_sdk8.killChain)(child, { graceMs: opts?.graceMs ?? ZCODE_KILL_GRACE_MS });
|
|
1069
1243
|
}
|
|
1070
1244
|
await this.killChainPromise;
|
|
1071
1245
|
}
|
|
@@ -1084,10 +1258,10 @@ var AppServerConnection = class {
|
|
|
1084
1258
|
this.generation += 1;
|
|
1085
1259
|
const gen = this.generation;
|
|
1086
1260
|
const script = this.launcherScript ?? this.cliPath;
|
|
1087
|
-
const child = (0,
|
|
1261
|
+
const child = (0, import_subagent_engine_sdk8.spawnEngineChild)({
|
|
1088
1262
|
command: this.nodeBin,
|
|
1089
1263
|
args: [script, "app-server", "--cwd", this.cwd],
|
|
1090
|
-
env: (0,
|
|
1264
|
+
env: (0, import_subagent_engine_sdk8.buildEngineChildEnv)(this.env, {
|
|
1091
1265
|
// L0 TAIJI_AGENT_DATA_DIR 缺省链:显式传参 > 宿主注入 env > tmpdir 占位
|
|
1092
1266
|
//(app-server 不消费该键,占位仅满足 L0 必注入契约;生产调用方
|
|
1093
1267
|
// zcode-engine.ensureAppServerRuntime 恒传 engineDataDir)。
|
|
@@ -1125,7 +1299,7 @@ var AppServerConnection = class {
|
|
|
1125
1299
|
}
|
|
1126
1300
|
}
|
|
1127
1301
|
};
|
|
1128
|
-
(0,
|
|
1302
|
+
(0, import_subagent_engine_sdk8.pumpNdjsonLines)(child.stdout, (line) => this.handleLine(line));
|
|
1129
1303
|
child.stderr?.setEncoding("utf8");
|
|
1130
1304
|
child.stderr?.on("data", (chunk) => {
|
|
1131
1305
|
this.stderrTail = (this.stderrTail + chunk).slice(-ZCODE_APPSERVER_STDERR_TAIL_BUFFER_CHARS);
|
|
@@ -1266,8 +1440,8 @@ var AppServerConnection = class {
|
|
|
1266
1440
|
}
|
|
1267
1441
|
this.stderrStream.write(chunk);
|
|
1268
1442
|
if (this.activeStderrLogPath !== null) {
|
|
1269
|
-
const params = (0,
|
|
1270
|
-
if ((0,
|
|
1443
|
+
const params = (0, import_subagent_engine_sdk7.stderrRotationParams)(process.env);
|
|
1444
|
+
if ((0, import_subagent_engine_sdk7.rotateStderrLogIfNeeded)(this.activeStderrLogPath, params)) {
|
|
1271
1445
|
this.closeStderrStream();
|
|
1272
1446
|
}
|
|
1273
1447
|
}
|
|
@@ -1285,8 +1459,8 @@ var AppServerConnection = class {
|
|
|
1285
1459
|
|
|
1286
1460
|
// src/session-channel.ts
|
|
1287
1461
|
var import_node_crypto = require("crypto");
|
|
1288
|
-
var
|
|
1289
|
-
var logger2 = (0,
|
|
1462
|
+
var import_subagent_engine_sdk9 = require("@zhushanwen/subagent-engine-sdk");
|
|
1463
|
+
var logger2 = (0, import_subagent_engine_sdk9.getLogger)("subagents");
|
|
1290
1464
|
var SUBSCRIBE_DELIVERY_KIND = "desktop-continuous";
|
|
1291
1465
|
var WORKSPACE_KEY_HASH_CHARS = 16;
|
|
1292
1466
|
var CREATE_REPLY_LOG_CHARS = 300;
|
|
@@ -1295,7 +1469,7 @@ function isRecord3(v) {
|
|
|
1295
1469
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
1296
1470
|
}
|
|
1297
1471
|
function errMessage2(err) {
|
|
1298
|
-
return (0,
|
|
1472
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
1299
1473
|
}
|
|
1300
1474
|
function stableWorkspaceKey(workspacePath) {
|
|
1301
1475
|
return "ws-" + (0, import_node_crypto.createHash)("sha256").update(workspacePath).digest("hex").slice(0, WORKSPACE_KEY_HASH_CHARS);
|
|
@@ -1822,8 +1996,8 @@ var SessionChannel = class {
|
|
|
1822
1996
|
|
|
1823
1997
|
// src/session-db-maintenance.ts
|
|
1824
1998
|
var fs5 = __toESM(require("fs"), 1);
|
|
1825
|
-
var
|
|
1826
|
-
var logger3 = (0,
|
|
1999
|
+
var import_subagent_engine_sdk10 = require("@zhushanwen/subagent-engine-sdk");
|
|
2000
|
+
var logger3 = (0, import_subagent_engine_sdk10.getLogger)("subagents");
|
|
1827
2001
|
var ZCODE_SESSION_TTL_MS = 2592e6;
|
|
1828
2002
|
var ZCODE_SESSION_SWEEP_INTERVAL_MS = 864e5;
|
|
1829
2003
|
var SWEEP_BUSY_TIMEOUT_MS = 5e3;
|
|
@@ -1979,7 +2153,7 @@ function maybeSweepExpiredZcodeSessions(dbPath, opts = {}) {
|
|
|
1979
2153
|
}
|
|
1980
2154
|
|
|
1981
2155
|
// src/zcode-engine.ts
|
|
1982
|
-
var logger4 = (0,
|
|
2156
|
+
var logger4 = (0, import_subagent_engine_sdk11.getLogger)("subagents");
|
|
1983
2157
|
var PROBE_VERSION_TIMEOUT_MS = 15e3;
|
|
1984
2158
|
var COMMON_THOUGHT_LEVELS = ["low", "high", "max"];
|
|
1985
2159
|
var ZcodeEngine = class {
|
|
@@ -2348,7 +2522,7 @@ var ZcodeEngine = class {
|
|
|
2348
2522
|
const env = buildAppServerEnv(this.deps.processEnv ?? process.env);
|
|
2349
2523
|
env.ZCODE_ENG_CLI_PATH = cliPath;
|
|
2350
2524
|
env.ZCODE_ENG_V2_CONFIG = this.deps.sources?.v2ConfigPath ?? defaultV2ConfigPath();
|
|
2351
|
-
env.ZCODE_ENG_PROVIDER_CONFIG = this.deps.sources
|
|
2525
|
+
env.ZCODE_ENG_PROVIDER_CONFIG = resolvePersonalProviderConfigPath(this.deps.sources, engineDataDir);
|
|
2352
2526
|
const sessionDbPath = zcodeSessionDbPath(engineDataDir);
|
|
2353
2527
|
env.ZCODE_SESSION_DB_PATH = sessionDbPath;
|
|
2354
2528
|
delete env.ZCODE_SESSION_DB;
|
|
@@ -2445,7 +2619,7 @@ var ZcodeEngine = class {
|
|
|
2445
2619
|
/** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
|
|
2446
2620
|
applyAbortedOutcome(outcome, task, ctx, final, emit) {
|
|
2447
2621
|
outcome.exitCode = null;
|
|
2448
|
-
outcome.error = isHostTimeoutAbort(ctx) ? (0,
|
|
2622
|
+
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
2623
|
emit({ type: "error", message: outcome.error });
|
|
2450
2624
|
}
|
|
2451
2625
|
/**
|
|
@@ -2550,7 +2724,7 @@ var ZcodeEngine = class {
|
|
|
2550
2724
|
}
|
|
2551
2725
|
} else {
|
|
2552
2726
|
const poolDir = path4.resolve(
|
|
2553
|
-
(0,
|
|
2727
|
+
(0, import_subagent_engine_sdk12.resolvePoolDir)(this.deps.engineDataDir(), ZCODE_ENGINE_ID, import_subagent_engine_sdk12.SHARED_POOL_KEY)
|
|
2554
2728
|
);
|
|
2555
2729
|
const resolved = path4.resolve(poolDir, dbPathRaw);
|
|
2556
2730
|
if (resolved.startsWith(poolDir + path4.sep)) {
|
|
@@ -2568,7 +2742,7 @@ var ZcodeEngine = class {
|
|
|
2568
2742
|
logger4.warn("[zcode-engine] native session read failed, degrade to journal replay", {
|
|
2569
2743
|
dbPath,
|
|
2570
2744
|
sessionId,
|
|
2571
|
-
reason: (0,
|
|
2745
|
+
reason: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
|
|
2572
2746
|
});
|
|
2573
2747
|
}
|
|
2574
2748
|
}
|
|
@@ -2655,7 +2829,7 @@ var ZcodeEngine = class {
|
|
|
2655
2829
|
buildPrompt(task, schema) {
|
|
2656
2830
|
const segments = [...task.appendSystemPrompt ?? []];
|
|
2657
2831
|
segments.push(task.prompt);
|
|
2658
|
-
if (schema !== void 0) segments.push((0,
|
|
2832
|
+
if (schema !== void 0) segments.push((0, import_subagent_engine_sdk12.buildSchemaEmulationSegment)(schema));
|
|
2659
2833
|
return segments.join("\n\n");
|
|
2660
2834
|
}
|
|
2661
2835
|
};
|
|
@@ -2698,7 +2872,7 @@ function isPlainObject(v) {
|
|
|
2698
2872
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
2699
2873
|
}
|
|
2700
2874
|
function errMessage3(err) {
|
|
2701
|
-
return (0,
|
|
2875
|
+
return (0, import_subagent_engine_sdk5.toErrorMessage)(err);
|
|
2702
2876
|
}
|
|
2703
2877
|
function resolveAppserverTimingMs(envName, fallbackMs, label) {
|
|
2704
2878
|
const raw = process.env[envName];
|
|
@@ -2810,7 +2984,7 @@ function parsedAppServerAttempt(task, r) {
|
|
|
2810
2984
|
kind: "parsed",
|
|
2811
2985
|
output: syntheticAppServerOutput(0),
|
|
2812
2986
|
payload: turnResultToPayload(r),
|
|
2813
|
-
...schema !== void 0 ? { schemaResult: (0,
|
|
2987
|
+
...schema !== void 0 ? { schemaResult: (0, import_subagent_engine_sdk12.extractAndValidateStructuredOutput)(r.response, schema) } : {}
|
|
2814
2988
|
};
|
|
2815
2989
|
}
|
|
2816
2990
|
function failedTerminalAppServerAttempt(r) {
|
|
@@ -2848,16 +3022,16 @@ function failedAppServerAttempt(err, currentSessionId, opts = {}) {
|
|
|
2848
3022
|
};
|
|
2849
3023
|
}
|
|
2850
3024
|
function isHostTimeoutAbort(ctx) {
|
|
2851
|
-
return ctx.signal?.aborted === true && ctx.signal.reason ===
|
|
3025
|
+
return ctx.signal?.aborted === true && ctx.signal.reason === import_subagent_engine_sdk12.HOST_TIMEOUT_ABORT_REASON;
|
|
2852
3026
|
}
|
|
2853
3027
|
var PROBE_STDOUT_CAP_CHARS = 4096;
|
|
2854
3028
|
async function defaultProbeVersion(cliPath, dataDir) {
|
|
2855
3029
|
try {
|
|
2856
3030
|
return await new Promise((resolve2, reject) => {
|
|
2857
|
-
const child = (0,
|
|
3031
|
+
const child = (0, import_subagent_engine_sdk12.spawnEngineChild)({
|
|
2858
3032
|
command: "node",
|
|
2859
3033
|
args: [cliPath, "--version"],
|
|
2860
|
-
env: (0,
|
|
3034
|
+
env: (0, import_subagent_engine_sdk12.buildEngineChildEnv)(process.env, { dataDir }),
|
|
2861
3035
|
stdout: "pipe",
|
|
2862
3036
|
stderr: "ignore",
|
|
2863
3037
|
signal: AbortSignal.timeout(PROBE_VERSION_TIMEOUT_MS)
|
|
@@ -2875,7 +3049,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
|
|
|
2875
3049
|
});
|
|
2876
3050
|
} catch (err) {
|
|
2877
3051
|
logger4.debug(
|
|
2878
|
-
`[zcode-engine] probe version check failed (best-effort continue): ${(0,
|
|
3052
|
+
`[zcode-engine] probe version check failed (best-effort continue): ${(0, import_subagent_engine_sdk5.toErrorMessage)(err)}`
|
|
2879
3053
|
);
|
|
2880
3054
|
return void 0;
|
|
2881
3055
|
}
|
|
@@ -2883,7 +3057,7 @@ async function defaultProbeVersion(cliPath, dataDir) {
|
|
|
2883
3057
|
|
|
2884
3058
|
// src/registration.ts
|
|
2885
3059
|
function defaultEngineDataDir() {
|
|
2886
|
-
return (0,
|
|
3060
|
+
return (0, import_subagent_engine_sdk13.resolveEngineDataDir)(process.env);
|
|
2887
3061
|
}
|
|
2888
3062
|
function createZcodeEngine(deps) {
|
|
2889
3063
|
return new ZcodeEngine(deps);
|
|
@@ -2896,11 +3070,11 @@ function createDefaultZcodeEngine() {
|
|
|
2896
3070
|
}
|
|
2897
3071
|
|
|
2898
3072
|
// src/port-types.ts
|
|
2899
|
-
var
|
|
3073
|
+
var import_subagent_engine_sdk14 = require("@zhushanwen/subagent-engine-sdk");
|
|
2900
3074
|
|
|
2901
3075
|
// src/server.ts
|
|
2902
3076
|
var import_server = require("@zhushanwen/subagent-engine-sdk/server");
|
|
2903
|
-
var logger5 = (0,
|
|
3077
|
+
var logger5 = (0, import_subagent_engine_sdk15.getLogger)("subagents");
|
|
2904
3078
|
var EngineProtocolServer = class {
|
|
2905
3079
|
write;
|
|
2906
3080
|
engine;
|
|
@@ -2970,7 +3144,7 @@ var EngineProtocolServer = class {
|
|
|
2970
3144
|
const active = { controller, seq: 0 };
|
|
2971
3145
|
this.activeRuns.set(runId, active);
|
|
2972
3146
|
const fullTask = (0, import_server.assembleFullTask)(task, ctx);
|
|
2973
|
-
const ctxModel = (0,
|
|
3147
|
+
const ctxModel = (0, import_subagent_engine_sdk14.parseCtxModel)(ctx.ctxModel);
|
|
2974
3148
|
const stream = ctx.streamMode === "stream" ? {
|
|
2975
3149
|
onDelta: (delta) => {
|
|
2976
3150
|
void this.reverseRequestInternal("host/streamDelta", { runId, delta }).catch(this.warnReverseFailure("host/streamDelta", `run ${runId}`));
|
|
@@ -3006,7 +3180,7 @@ var EngineProtocolServer = class {
|
|
|
3006
3180
|
}
|
|
3007
3181
|
validateModel(params) {
|
|
3008
3182
|
if (this.engine.validateModel === void 0) {
|
|
3009
|
-
throw new
|
|
3183
|
+
throw new import_subagent_engine_sdk15.EngineSdkError(
|
|
3010
3184
|
"engine_capability_unsupported",
|
|
3011
3185
|
"engine does not implement validateModel",
|
|
3012
3186
|
"Manifest omits modelCatalog; model validation falls back to run-time engine checks."
|
|
@@ -3033,7 +3207,7 @@ var EngineProtocolServer = class {
|
|
|
3033
3207
|
warnReverseFailure(method, context) {
|
|
3034
3208
|
return (err) => {
|
|
3035
3209
|
logger5.warn(`[protocol] ${method} reverse request failed (${context}); continuing without it`, {
|
|
3036
|
-
detail: (0,
|
|
3210
|
+
detail: (0, import_subagent_engine_sdk5.toErrorMessage)(err)
|
|
3037
3211
|
});
|
|
3038
3212
|
};
|
|
3039
3213
|
}
|
|
@@ -3062,7 +3236,7 @@ var EngineProtocolServer = class {
|
|
|
3062
3236
|
clearTimeout(pending.timer);
|
|
3063
3237
|
this.reverseClock?.acked(String(id));
|
|
3064
3238
|
this.reverseClock?.settled(String(id));
|
|
3065
|
-
if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0,
|
|
3239
|
+
if (frame.error !== void 0) pending.reject(new Error(`reverse request ${String(id)} rejected: ${(0, import_subagent_engine_sdk5.toErrorMessage)(frame.error)}`));
|
|
3066
3240
|
else pending.resolve(frame.result);
|
|
3067
3241
|
}
|
|
3068
3242
|
};
|
|
@@ -3075,8 +3249,8 @@ function toProtocolError(err) {
|
|
|
3075
3249
|
}
|
|
3076
3250
|
|
|
3077
3251
|
// src/main.ts
|
|
3078
|
-
var clock = (0,
|
|
3079
|
-
(0,
|
|
3252
|
+
var clock = (0, import_subagent_engine_sdk16.armEngineSelfDestruct)({ stdin: process.stdin });
|
|
3253
|
+
(0, import_subagent_engine_sdk16.runEngineCliEntry)({
|
|
3080
3254
|
component: "zcode-engine-cli",
|
|
3081
3255
|
server: new EngineProtocolServer({
|
|
3082
3256
|
write: (frame) => {
|