@zhushanwen/zcode-subagent-cli 0.8.2 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/zcode-subagent-cli.mjs +1 -1
- package/dist/{chunk-Z6IPBSKG.js → chunk-RHWM2M5A.js} +151 -63
- package/dist/index.cjs +151 -63
- package/dist/index.d.cts +31 -31
- package/dist/index.d.ts +31 -31
- package/dist/index.js +1 -1
- package/dist/main.cjs +151 -63
- package/dist/main.js +1 -1
- package/package.json +4 -4
package/dist/main.cjs
CHANGED
|
@@ -54,6 +54,7 @@ function parseZcodePositiveMsEnv(raw) {
|
|
|
54
54
|
var ZCODE_APPSERVER_ERR_MODEL_CONFIG_MISSING = -32603;
|
|
55
55
|
var ZCODE_APPSERVER_ERR_BUSY_SESSION = -32010;
|
|
56
56
|
var ZCODE_APPSERVER_HARVEST_GRACE_MS = 1e3;
|
|
57
|
+
var ZCODE_APPSERVER_HARVEST_GRACE_ENV = "TAIJI_ZCODE_TEST_HARVEST_GRACE_MS";
|
|
57
58
|
function isFailedTerminalStatus(status) {
|
|
58
59
|
return status === "failed" || status === "error";
|
|
59
60
|
}
|
|
@@ -760,11 +761,20 @@ function patchedCliSource(path) {
|
|
|
760
761
|
}
|
|
761
762
|
}
|
|
762
763
|
}
|
|
763
|
-
// \u951A\u70B9 B\uFF08\u56DE\u9000\uFF09\uFF1A\u8C03\u7528\u70B9\u6CE8\u5165 create:r(()=><fn>( \u2192 (<arg>,{standalone:{}})
|
|
764
|
+
// \u951A\u70B9 B\uFF08\u56DE\u9000\uFF09\uFF1A\u8C03\u7528\u70B9\u6CE8\u5165 create:r(()=><fn>( \u2192 (<arg>,{standalone:{}})\u3002
|
|
765
|
+
// \u7ED3\u6784\u6821\u9A8C\u4E0E\u5B9A\u4E49\u951A\u540C\u53E3\u5F84\uFF082026-10 review\xB7N-1\uFF09\uFF1A\u5168\u6587\u4EF6\u51FA\u73B0\u6B21\u6570\u5FC5\u987B\u6070\u597D 1
|
|
766
|
+
// \u2014\u2014\u66FE\u53D6\u9996\u4E2A\u6587\u672C\u547D\u4E2D\uFF0C\u672A\u6765\u7248\u672C\u51FA\u73B0\u4E24\u5904\u540C\u6B3E\u8C03\u7528\u65F6\u6CE8\u5165\u843D\u5728\u65E0\u5173\u8C03\u7528\u4E0A\u3001
|
|
767
|
+
// standaloneApplied \u4ECD\u7F6E true = \u771F\u5B9E\u534F\u8BAE\u8DEF\u5F84 host \u6A21\u5F0F\u800C\u95E8\u62A5 armed \u7684\u5047\u6210\u529F\u3002
|
|
768
|
+
// count > 1 = \u65E0\u6CD5\u786E\u5B9A\u534F\u8BAE\u8DEF\u5F84\u8C03\u7528\u70B9 \u2192 \u653E\u5F03\u672C\u951A\uFF08not armed\uFF09\u3002
|
|
764
769
|
if (!standaloneApplied) {
|
|
765
770
|
const callAnchor = 'create:r(()=>' + fnName + '(';
|
|
766
|
-
|
|
767
|
-
|
|
771
|
+
let callCount = 0;
|
|
772
|
+
let callIdx = -1;
|
|
773
|
+
for (let scan = src.indexOf(callAnchor); scan >= 0; scan = src.indexOf(callAnchor, scan + 1)) {
|
|
774
|
+
callCount++;
|
|
775
|
+
callIdx = scan;
|
|
776
|
+
}
|
|
777
|
+
if (callCount === 1) {
|
|
768
778
|
const argStart = callIdx + callAnchor.length;
|
|
769
779
|
// \u62EC\u53F7\u914D\u5E73\u627E\u4E0E fnName( \u914D\u5BF9\u7684\u95ED\u62EC\u53F7\uFF08\u626B\u63CF\u5668\u8DF3\u8FC7\u5B57\u9762\u91CF/\u6A21\u677F/\u6CE8\u91CA\u2014\u2014\u5B9E\u53C2
|
|
770
780
|
// \u542B\u5185\u8054\u4E32\u6216\u5185\u5C42\u8C03\u7528\u65F6\u9996\u4E2A ')' \u843D\u5728\u9519\u8BEF\u5C42\u7EA7 = \u6CE8\u5165\u9519\u4F4D\u7684\u5047\u6210\u529F\uFF09
|
|
@@ -857,7 +867,9 @@ var ACCOUNT_METADATA_SECTION = `
|
|
|
857
867
|
// \u5F15\u64CE\u4FA7\u65E2\u6709\u6587\u6848\u627F\u8F7D\uFF09\u3002catches\uFF1A\u6587\u4EF6\u7F3A\u5931/\u574F JSON/\u76EE\u5F55\u4E0D\u53EF\u5199\u3002
|
|
858
868
|
// \u5E76\u53D1\u8FB9\u754C\uFF08ADR-0143 \u767B\u8BB0\uFF09\uFF1A\u5BF9\u4E0E GUI \u5171\u4EAB\u7684\u51ED\u636E\u5E93\u505A\u65E0\u9501 read-modify-write \u5168\u91CF
|
|
859
869
|
// \u5199\u56DE\uFF0C\u4E0E GUI token \u5237\u65B0\u5E76\u53D1\u5B58\u5728\u6BEB\u79D2\u7EA7\u4E22\u66F4\u65B0\u7A97\u53E3\u2014\u2014\u540E\u679C\u81EA\u6108\uFF08GUI \u4FA7\u91CD\u8BD5\u5237\u65B0 /
|
|
860
|
-
// \u672C\u4FA7\u7F3A\u952E\u4E0B\u6B21 spawn \u5E42\u7B49\u8865\u9F50\uFF09\uFF0C\u4E8B\u5B9E\u9A71\u52A8\u539F\u5219\u4E0B\u4E0D\u52A0\u9501\u3001\u4E0D\u505A\u65F6\u95F4\u8865\u507F\u3002
|
|
870
|
+
// \u672C\u4FA7\u7F3A\u952E\u4E0B\u6B21 spawn \u5E42\u7B49\u8865\u9F50\uFF09\uFF0C\u4E8B\u5B9E\u9A71\u52A8\u539F\u5219\u4E0B\u4E0D\u52A0\u9501\u3001\u4E0D\u505A\u65F6\u95F4\u8865\u507F\u3002\u5143\u6570\u636E\u952E
|
|
871
|
+
// \u9762\u53E6\u52A0 compare-and-skip \u9632\u7EBF\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u5199\u56DE\u524D\u91CD\u8BFB\u78C1\u76D8\u6BD4\u5BF9
|
|
872
|
+
// identity/auth-source \u4E24\u952E\uFF0C\u68C0\u6D4B\u5230\u5E76\u53D1\u5199\u5165\u5373\u653E\u5F03\u672C\u6B21\u5199\u5165\uFF08\u89C1\u843D\u5E93\u6BB5\u6CE8\u91CA\uFF09\u3002
|
|
861
873
|
// \u8C03\u7528\u5951\u7EA6\uFF082026-10 review\xB7S-3\uFF09\uFF1A\u4EC5\u5728\u5B89\u88C5\u95E8\u786E\u8BA4 standalone \u4E0E header-port \u4E24\u951A
|
|
862
874
|
// \u5747\u5DF2\u6B66\u88C5\u65F6\u8C03\u7528\u2014\u2014\u8FD9\u4E9B\u5143\u6570\u636E\u952E\u53EA\u88AB standalone \u8D26\u53F7\u6E90\u6D88\u8D39\uFF0C\u4E14\u8D26\u53F7\u94FE\u8981\u6210\u7ACB\u8FD8\u8981\u6C42
|
|
863
875
|
// \u8BA4\u8BC1\u5934\u8D70\u672C\u5730\u7AEF\u53E3\uFF1B\u4EFB\u4E00\u951A\u6F02\u79FB\uFF08\u7248\u672C\u4E0D\u652F\u6301\uFF09\u65F6\u5199\u5165\u7528\u6237\u5171\u4EAB credentials.json \u65E0
|
|
@@ -893,9 +905,15 @@ function ensureAccountMetadata() {
|
|
|
893
905
|
}
|
|
894
906
|
const added = [];
|
|
895
907
|
const reconciled = [];
|
|
908
|
+
// compare-and-skip \u57FA\u7EBF\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u5168\u90E8 plan \u4E24\u952E\u7684\u8BFB\u65F6\u539F\u59CB\u503C\uFF08\u9996\u89C1
|
|
909
|
+
// \u6355\u83B7\u2014\u2014\u540E\u7EED\u6539\u5199 creds \u4E0D\u5F71\u54CD\u57FA\u7EBF\uFF09\u3002\u5199\u56DE\u524D\u91CD\u8BFB\u78C1\u76D8\u9010\u952E\u6BD4\u5BF9\uFF0C\u68C0\u6D4B\u300C\u5FEB\u7167\u8BFB\u53D6
|
|
910
|
+
// \u2192\u5199\u56DE\u300D\u7A97\u53E3\u5185\u7684 GUI/\u767B\u5F55\u5E76\u53D1\u5199\u5165\uFF0C\u9632\u9648\u65E7\u5FEB\u7167\u8986\u76D6\u6743\u5A01\u65B0\u503C\u3002
|
|
911
|
+
const metaBaseline = Object.create(null);
|
|
896
912
|
for (const pid of planIds) {
|
|
897
913
|
const idKey = 'account-provider:' + pid + ':identity';
|
|
898
914
|
const srcKey = 'account-provider:' + pid + ':auth-source';
|
|
915
|
+
if (metaBaseline[idKey] === undefined) metaBaseline[idKey] = creds[idKey];
|
|
916
|
+
if (metaBaseline[srcKey] === undefined) metaBaseline[srcKey] = creds[srcKey];
|
|
899
917
|
// host \u6001 plan api-key \u952E\u540D\u6A21\u677F\uFF1Aaccount-provider:coding-plan:<pid>:account:<identity>:api-key
|
|
900
918
|
const apiKeyPrefix = 'account-provider:coding-plan:' + pid + ':account:';
|
|
901
919
|
const apiKeySuffix = ':api-key';
|
|
@@ -905,13 +923,47 @@ function ensureAccountMetadata() {
|
|
|
905
923
|
};
|
|
906
924
|
let identity = typeof creds[idKey] === 'string' ? creds[idKey] : '';
|
|
907
925
|
const authSource = typeof creds[srcKey] === 'string' ? creds[srcKey] : '';
|
|
908
|
-
// \u6D3E\u751F\u8EAB\u4EFD\u6BCF\u6B21 spawn \u91CD\u7B97\uFF08\u4E0D\u8BFB\u65E2\u6709\u952E\uFF09\
|
|
926
|
+
// \u6D3E\u751F\u8EAB\u4EFD\u6BCF\u6B21 spawn \u91CD\u7B97\uFF08\u4E0D\u8BFB\u65E2\u6709\u952E\uFF09\u3002\u591A plan api-key\uFF08\u65E7+\u65B0 account / \u8F6E\u6362
|
|
927
|
+
// \u6B8B\u7559\uFF09\u65F6\u300CObject.keys \u9996\u4E2A\u547D\u4E2D\u300D\u4F1A\u6C38\u4E45\u6307\u5411\u9648\u65E7 account \u4E14 hasPlanApiKey \u6052\u771F\u3001
|
|
928
|
+
// \u6C38\u4E0D\u81EA\u6108\uFF082026-10 review\xB7DG-R2-01\uFF09\u2014\u2014\u6D3E\u751F\u4F18\u5148\u7EA7\uFF1A
|
|
929
|
+
// \u2460 project-key-location:v1:[origin,family,identity,...] \u952E\u5185\u5D4C identity
|
|
930
|
+
// \uFF08ZCode \u767B\u5F55\u5199\u5165\u7684\u786E\u5B9A\u6027\u4FE1\u53F7\uFF1B\u952E\u540D\u5C3E\u6BB5 URL \u7F16\u7801 JSON \u6570\u7EC4\uFF0C\u7B2C 2/3 \u5143\u7D20
|
|
931
|
+
// = family/identity\uFF0Cfamily \u4E0E pid \u524D\u7F00\u5339\u914D\u540C oauth \u5BB6\u65CF\u5224\u636E\uFF09\u5168\u4F53\u53BB\u91CD\u540E
|
|
932
|
+
// \u552F\u4E00\u4E14\u8BE5 identity \u540D\u4E0B\u786E\u6709 plan api-key \u2192 \u7528\u5B83\uFF1B
|
|
933
|
+
// \u2461 \u65E0\u2460\u4FE1\u53F7\u65F6\uFF0C\u8BE5 pid \u540D\u4E0B plan api-key \u952E\u7684 identity \u53BB\u91CD\u540E\u552F\u4E00 \u2192 \u7528\u5B83
|
|
934
|
+
// \uFF08\u5355 account \u5E38\u6001\uFF09\uFF1B
|
|
935
|
+
// \u2462 \u591A\u5019\u9009\u4E14\u65E0\u2460\u786E\u5B9A\u6027\u4FE1\u53F7 \u2192 \u4E0D\u731C\u6D4B\uFF1A\u4E0D\u6D3E\u751F\uFF08\u4FDD\u7559\u65E2\u6709 stored identity\uFF09\u5E76
|
|
936
|
+
// log \u6B67\u4E49\u2014\u2014\u731C\u6D4B\u6539\u5199\u6BD4\u4FDD\u7559\u9648\u65E7\u503C\u66F4\u7CDF\uFF08\u9648\u65E7\u503C\u81F3\u5C11\u662F\u767B\u5F55\u6D41\u7A0B\u5199\u8FC7\u7684\uFF09\u3002
|
|
909
937
|
let derivedIdentity = '';
|
|
938
|
+
let ambiguousIdentity = false;
|
|
939
|
+
const keyLocPrefix = 'project-key-location:v1:';
|
|
940
|
+
const keyLocIds = [];
|
|
910
941
|
for (const k of Object.keys(creds)) {
|
|
911
|
-
if (k.indexOf(
|
|
942
|
+
if (k.indexOf(keyLocPrefix) !== 0) continue;
|
|
943
|
+
try {
|
|
944
|
+
const arr = JSON.parse(decodeURIComponent(k.slice(keyLocPrefix.length)));
|
|
945
|
+
if (Array.isArray(arr) && typeof arr[1] === 'string' && typeof arr[2] === 'string'
|
|
946
|
+
&& pid.indexOf('account:' + arr[1]) === 0 && keyLocIds.indexOf(arr[2]) === -1) {
|
|
947
|
+
keyLocIds.push(arr[2]);
|
|
948
|
+
}
|
|
949
|
+
} catch (e2) { /* \u5F62\u6001\u5916\u952E\uFF08\u635F\u574F/\u975E\u6570\u7EC4\uFF09\u4E0D\u6784\u6210\u786E\u5B9A\u6027\u4FE1\u53F7 */ }
|
|
950
|
+
}
|
|
951
|
+
if (keyLocIds.length === 1 && hasPlanApiKey(keyLocIds[0])) {
|
|
952
|
+
derivedIdentity = keyLocIds[0];
|
|
953
|
+
} else {
|
|
954
|
+
const apiKeyIds = [];
|
|
955
|
+
for (const k of Object.keys(creds)) {
|
|
956
|
+
if (k.indexOf(apiKeyPrefix) !== 0 || k.slice(-apiKeySuffix.length) !== apiKeySuffix) continue;
|
|
912
957
|
const mid = k.slice(apiKeyPrefix.length, k.length - apiKeySuffix.length);
|
|
913
|
-
if (mid)
|
|
958
|
+
if (!mid) continue;
|
|
959
|
+
let id; try { id = decodeURIComponent(mid); } catch (e2) { id = mid; }
|
|
960
|
+
if (apiKeyIds.indexOf(id) === -1) apiKeyIds.push(id);
|
|
914
961
|
}
|
|
962
|
+
if (apiKeyIds.length === 1) derivedIdentity = apiKeyIds[0];
|
|
963
|
+
else if (apiKeyIds.length > 1) ambiguousIdentity = true;
|
|
964
|
+
}
|
|
965
|
+
if (ambiguousIdentity) {
|
|
966
|
+
process.stderr.write('[zcode-launcher] account metadata: multiple plan api-key identities for ' + pid + ', no deterministic signal - keeping stored identity\\n');
|
|
915
967
|
}
|
|
916
968
|
// oauth \u5BB6\u65CF\u51ED\u636E\u5B58\u5728\u6027\uFF1A\u626B oauth:<family>:access_token\uFF0Cprovider id \u4EE5
|
|
917
969
|
// account:<family> \u5F00\u5934\u5373\u7ED1\u5B9A\u8BE5\u5BB6\u65CF\uFF08\u96F6\u5BB6\u65CF\u540D\u5199\u6B7B\uFF09\u3002
|
|
@@ -964,6 +1016,24 @@ function ensureAccountMetadata() {
|
|
|
964
1016
|
}
|
|
965
1017
|
}
|
|
966
1018
|
if (added.length === 0 && reconciled.length === 0) return;
|
|
1019
|
+
// compare-and-skip\uFF082026-10 review\xB7N-3\uFF09\uFF1A\u65E0\u9501 RMW \u7684\u9648\u65E7\u8986\u76D6\u9632\u7EBF\u2014\u2014\u5199\u56DE\u524D\u91CD\u8BFB
|
|
1020
|
+
// \u78C1\u76D8\uFF0C\u4EFB\u4E00 plan \u4E24\u952E\u5F53\u524D\u503C \u2260 \u8BFB\u65F6\u57FA\u7EBF = \u7A97\u53E3\u5185 GUI/\u767B\u5F55\u5DF2\u5B8C\u6210\u6743\u5A01\u5199\u5165 \u2192 \u653E\u5F03
|
|
1021
|
+
// \u672C\u6B21\u5199\u5165\uFF08log \u8BF4\u660E\uFF0C\u4E0B\u6B21 spawn \u5E42\u7B49\u91CD\u7B97\uFF1B\u653E\u5F03\u540E\u7684\u6062\u590D = \u91CD\u65B0\u767B\u5F55/\u914D\u7F6E\u6216\u5220\u9664
|
|
1022
|
+
// \u8BE5\u952E\uFF0CADR-0143 \u5E76\u53D1\u8FB9\u754C\uFF09\u3002\u91CD\u8BFB/\u89E3\u6790\u5931\u8D25 = \u7A97\u53E3\u4E0D\u53EF\u5224\u5B9A\uFF0C\u540C\u6837\u4FDD\u5B88\u653E\u5F03\u3002
|
|
1023
|
+
try {
|
|
1024
|
+
const reread = JSON.parse(readOrig.call(fs, credPath, 'utf8'));
|
|
1025
|
+
if (!reread || typeof reread !== 'object' || Array.isArray(reread)) {
|
|
1026
|
+
throw new Error('credentials reread is not an object');
|
|
1027
|
+
}
|
|
1028
|
+
for (const mk of Object.keys(metaBaseline)) {
|
|
1029
|
+
if ((reread[mk] || '') !== (metaBaseline[mk] || '')) {
|
|
1030
|
+
throw new Error('concurrent write detected on ' + mk);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
} catch (skipErr) {
|
|
1034
|
+
process.stderr.write('[zcode-launcher] account metadata skipped (' + ((skipErr && skipErr.message) || String(skipErr)) + ') - retry on next spawn\\n');
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
967
1037
|
const tmp = credPath + '.taiji-tmp-' + process.pid;
|
|
968
1038
|
// rename \u6362 inode\u2014\u2014tmp \u4E0D\u5E26 mode \u843D\u76D8\u4F1A\u628A GUI \u4FA7\u6536\u7D27\u8FC7\u7684\u6587\u4EF6\u6743\u9650\u9759\u9ED8\u653E\u5BBD\u4E3A
|
|
969
1039
|
// \u7F3A\u7701 umask \u503C\uFF0C\u5199\u524D\u8BFB\u65E2\u6709 mode \u968F\u5199\u4F20\u9012\uFF08stat \u5931\u8D25\u56DE\u9000 0600\uFF09\uFF1B\u5199/rename
|
|
@@ -1005,7 +1075,7 @@ const CONFIG_PATH = path.join(os.homedir(), '.zcode', 'cli', 'config.json');
|
|
|
1005
1075
|
|
|
1006
1076
|
// \u5408\u5E76\u5F62\u6001\uFF1A\u771F\u5B9E cli config \u539F\u6837\uFF08model/plugins/mcp/subagents \u7B49 worker \u7EE7\u627F\u9762\u4E0D\u53D8\uFF09
|
|
1007
1077
|
// + v2 \u7684 provider \u5B57\u5178\u6CE8\u5165\uFF0C\u540C id \u65F6 v2 \u6761\u76EE\u6574\u6761\u4F18\u5148\u2014\u2014GUI \u76F4\u4F20 modelConfig \u65F6
|
|
1008
|
-
// v2 \u5373\u6743\u5A01\u6E90\uFF08\u8FDB\u7A0B\u5916\u7B49\u4EF7\u590D\u523B\uFF09\uFF1Bcli config \u4E0D\u5728 GUI \u7BA1\u7406\
|
|
1078
|
+
// v2 \u5373\u6743\u5A01\u6E90\uFF08\u8FDB\u7A0B\u5916\u7B49\u4EF7\u590D\u523B\uFF09\uFF1Bcli config \u4E0D\u5728 GUI \u7BA1\u7406\u4FA7\u3001\u53EF\u80FD\u6B8B\u7559\u5386\u53F2\u9A8C\u8BC1
|
|
1009
1079
|
// \u914D\u7F6E\uFF082026-08-25 \u4E8B\u6545\uFF1A\u6B8B\u7559\u65E7 key \u538B\u8FC7\u65B0\u51ED\u636E\u81F4 turn 0 401\uFF09\uFF0C\u6545\u4E0D\u53D6 real \u4F18\u5148\u3002
|
|
1010
1080
|
// model.main \u7F3A\u5931\u65F6\u53EA\u4ECE v2 \u900F\u4F20\uFF08v2 \u4E5F\u6CA1\u6709\u5219\u4E0D\u4F2A\u9020\u2014\u2014CLI \u7F3A\u7701\u89E3\u6790\u81EA\u4F1A\u843D\u5230\u6CE8\u518C\u8868
|
|
1011
1081
|
// \u53EF\u7528\u6A21\u578B\uFF1Bplan \u5BB6\u65CF id \u5DF2\u4E0D\u53EF\u7528\uFF0C\u4E0D\u518D\u515C\u5E95\u4F2A\u9020\uFF09\u3002
|
|
@@ -1034,12 +1104,16 @@ function injectedConfigText() {
|
|
|
1034
1104
|
const v2Providers = v2.provider && typeof v2.provider === 'object' ? v2.provider : {};
|
|
1035
1105
|
const hasKey = (entry) => entry && typeof entry === 'object'
|
|
1036
1106
|
&& entry.options && typeof entry.options.apiKey === 'string' && entry.options.apiKey !== '';
|
|
1037
|
-
|
|
1107
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02\uFF09\uFF1Aprovider id \u503C\u57DF\u542B '__proto__'/'toString' \u7B49\u5371\u9669\u952E
|
|
1108
|
+
//\uFF08runtime \u4FA7\u6709\u610F\u4EA7\u51FA\uFF0CS-17\uFF09\u2014\u2014\u666E\u901A\u5BF9\u8C61\u4E0A\u5BF9 __proto__ \u952E\u8D4B\u503C\u89E6\u53D1\u539F\u578B setter
|
|
1109
|
+
// \u9759\u9ED8\u4E22\u6761\u76EE\u3001\u8BFB toString \u952E\u843D\u5230\u539F\u578B\u65B9\u6CD5\u8BEF\u5224\u5DF2\u5B58\u5728\u3002Object.create(null) \u4F7F
|
|
1110
|
+
// \u952E\u8BFB\u5199\u5747\u843D\u5728 own property\u3002
|
|
1111
|
+
const injectable = Object.create(null);
|
|
1038
1112
|
for (const [id, entry] of Object.entries(v2Providers)) {
|
|
1039
1113
|
if (hasKey(entry)) injectable[id] = entry;
|
|
1040
1114
|
}
|
|
1041
1115
|
// provider_config.json \u8865\u6CE8\u5165\uFF08\u8BFB\u53D6\u5931\u8D25\u9759\u9ED8\u964D\u7EA7\u2014\u2014\u6821\u9A8C\u6E90\u7F3A\u5E2D\u65F6\u5F15\u64CE\u4FA7\u6821\u9A8C\u540C\u6837\u4E0D\u53EF
|
|
1042
|
-
// \u7528\uFF0C\u6CE8\u5165\
|
|
1116
|
+
// \u7528\uFF0C\u6CE8\u5165\u70B9\u7EF4\u6301 v2-only \u73B0\u72B6\uFF1BproviderRules \u7F3A\u5931\u4E0D\u6784\u6210\u51ED\u636E\u9519\u8BEF\uFF09\u3002
|
|
1043
1117
|
try {
|
|
1044
1118
|
const pc = JSON.parse(readOrig(PROVIDER_CONFIG_PATH, 'utf8'));
|
|
1045
1119
|
const pcCfg = pc && typeof pc.config === 'object' && pc.config ? pc.config : {};
|
|
@@ -1047,7 +1121,9 @@ function injectedConfigText() {
|
|
|
1047
1121
|
const rules = Array.isArray(pcr.providerRules) ? pcr.providerRules : [];
|
|
1048
1122
|
const mcr = typeof pcCfg.modelConfigRules === 'object' && pcCfg.modelConfigRules ? pcCfg.modelConfigRules : {};
|
|
1049
1123
|
const modelRules = Array.isArray(mcr.providerModelRules) ? mcr.providerModelRules : [];
|
|
1050
|
-
|
|
1124
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02 \u540C\u65CF\uFF09\uFF1Aid \u4E3A 'constructor' \u7B49\u539F\u578B\u65B9\u6CD5\u540D\u65F6\u666E\u901A\u5BF9\u8C61\u8BFB\u53D6
|
|
1125
|
+
// \u843D\u5230\u539F\u578B Function\uFF0Cfor...of \u76F4\u63A5 TypeError \u88AB catch \u9759\u9ED8\u541E\u6389\u8BE5 rule \u7684\u5408\u6210
|
|
1126
|
+
const modelMeta = Object.create(null);
|
|
1051
1127
|
for (const mr of modelRules) {
|
|
1052
1128
|
if (!mr || typeof mr !== 'object' || typeof mr.providerId !== 'string' || typeof mr.modelId !== 'string') continue;
|
|
1053
1129
|
(modelMeta[mr.providerId] = modelMeta[mr.providerId] || []).push(mr);
|
|
@@ -1058,8 +1134,10 @@ function injectedConfigText() {
|
|
|
1058
1134
|
const cfg = rule.config && typeof rule.config === 'object' ? rule.config : {};
|
|
1059
1135
|
const access = cfg.access && typeof cfg.access === 'object' ? cfg.access : {};
|
|
1060
1136
|
const api = cfg.api && typeof cfg.api === 'object' ? cfg.api : {};
|
|
1061
|
-
// v2/real \u5DF2\u6709 \u2192 \u4E0D\u91CD\u590D\u5408\u6210\uFF08v2 \u6761\u76EE\u66F4\u5168\uFF0C\u6574\u6761\u4F18\u5148\u8BED\u4E49\u4E0D\u53D7\u5F71\u54CD\uFF09
|
|
1062
|
-
|
|
1137
|
+
// v2/real \u5DF2\u6709 \u2192 \u4E0D\u91CD\u590D\u5408\u6210\uFF08v2 \u6761\u76EE\u66F4\u5168\uFF0C\u6574\u6761\u4F18\u5148\u8BED\u4E49\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002
|
|
1138
|
+
// realProviders \u662F JSON.parse \u666E\u901A\u5BF9\u8C61\uFF08\u6709\u539F\u578B\uFF09\u2014\u2014id \u4E3A 'toString' \u7B49
|
|
1139
|
+
// \u539F\u578B\u65B9\u6CD5\u540D\u65F6\u76F4\u63A5\u4E0B\u6807\u8BFB\u53D6\u6052 truthy \u8BEF\u5224 real \u5DF2\u6709\uFF0C\u987B own-property \u68C0\u67E5
|
|
1140
|
+
if (!id || injectable[id] || Object.prototype.hasOwnProperty.call(realProviders, id)) continue;
|
|
1063
1141
|
// hasKey \u7EAA\u5F8B\u540C\u6B3E\uFF1A\u65E0 apiKey \u4E0D\u5408\u6210\uFF1B\u65E0 baseUrl\uFF08endpoint \u7531\u6A21\u677F\u63D0\u4F9B\u7684\u5F62\u6001\uFF09
|
|
1064
1142
|
// \u4E0D\u5408\u6210\u2014\u2014\u6B8B\u7F3A\u6761\u76EE\u6BD4\u4E0D\u6CE8\u5165\u66F4\u7CDF\uFF0C\u539F\u751F\u300C\u4E0D\u5B58\u5728 Model\u300D\u62A5\u9519\u7167\u65E7\u900F\u51FA
|
|
1065
1143
|
if (typeof access.apiKey !== 'string' || access.apiKey === '') continue;
|
|
@@ -1091,7 +1169,7 @@ function injectedConfigText() {
|
|
|
1091
1169
|
models: models,
|
|
1092
1170
|
};
|
|
1093
1171
|
}
|
|
1094
|
-
} catch { /* provider_config \u7F3A\u5931/\u635F\u574F \u2192 \u8865\u6CE8\u5165\
|
|
1172
|
+
} catch { /* provider_config \u7F3A\u5931/\u635F\u574F \u2192 \u8865\u6CE8\u5165\u70B9\u9759\u9ED8\u964D\u7EA7\uFF08v2 \u6CE8\u5165\u4E0D\u53D7\u5F71\u54CD\uFF09 */ }
|
|
1095
1173
|
if (Object.keys(injectable).length === 0) return null;
|
|
1096
1174
|
const merged = { ...real };
|
|
1097
1175
|
merged.provider = { ...realProviders, ...injectable };
|
|
@@ -1105,7 +1183,7 @@ function injectedConfigText() {
|
|
|
1105
1183
|
// [merge-fn-start]\uFF08\u5BF9\u8D26\u5355\u6D4B\u63D0\u53D6\u951A\u2014\u2014appserver-launcher.test.ts \u6309\u6807\u8BB0\u622A\u53D6\u672C\u51FD\u6570
|
|
1106
1184
|
// eval \u6267\u884C\uFF1Bpreparer.ts mergePersonalProviderConfig \u4E0E\u672C\u51FD\u6570\u540C\u89C4\u5219\u9501\u6B65\uFF0C\u6539\u4EFB\u4E00\u4FA7
|
|
1107
1185
|
// \u987B\u540C\u6B65\u53E6\u4E00\u4FA7\u5E76\u8DD1\u5BF9\u8D26\u5355\u6D4B\uFF09
|
|
1108
|
-
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u6362\
|
|
1186
|
+
// merge(\u771F\u5B9E, \u526F\u672C)\u2014\u2014D3 \u5207\u6362\u7248\u89C4\u5219\uFF1A
|
|
1109
1187
|
// - \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
|
|
1110
1188
|
// - \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
|
|
1111
1189
|
// \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
|
|
@@ -1125,7 +1203,10 @@ function mergeProviderConfig(realObj, copyObj) {
|
|
|
1125
1203
|
};
|
|
1126
1204
|
const strArr = (v) => (Array.isArray(v) ? v.filter((s) => typeof s === 'string' && s.trim() !== '') : []);
|
|
1127
1205
|
const mergedRules = [];
|
|
1128
|
-
|
|
1206
|
+
// \u65E0\u539F\u578B\u5B57\u5178\uFF08DG-R2-02\uFF09\uFF1AproviderId \u4E3A '__proto__'/'toString' \u7B49\u5371\u9669\u952E\u65F6\u666E\u901A\u5BF9\u8C61
|
|
1207
|
+
// \u7684 seen \u8BFB\u5199\u90FD\u4F1A\u649E\u539F\u578B\u94FE\uFF08__proto__ \u8D4B\u503C\u88AB setter \u541E / toString \u8BFB\u5230\u539F\u578B\u65B9\u6CD5
|
|
1208
|
+
// \u8BEF\u5224\u5DF2\u89C1 \u2192 \u526F\u672C\u72EC\u6709\u6761\u76EE\u88AB\u4E22\uFF0C\u4E0E TS \u4FA7 Set \u5B9E\u88C5\u5206\u6B67\uFF09\u3002Object.create(null) \u6D88\u9664\u3002
|
|
1209
|
+
const seen = Object.create(null);
|
|
1129
1210
|
for (const rule of rulesOf(realObj)) {
|
|
1130
1211
|
mergedRules.push(rule);
|
|
1131
1212
|
if (isRec(rule) && typeof rule.providerId === 'string' && rule.providerId !== '') seen[rule.providerId] = true;
|
|
@@ -1152,7 +1233,7 @@ function mergeProviderConfig(realObj, copyObj) {
|
|
|
1152
1233
|
}
|
|
1153
1234
|
// [merge-fn-end]
|
|
1154
1235
|
|
|
1155
|
-
// D3 \u6362\
|
|
1236
|
+
// D3 \u5207\u6362\u88C5\u8F7D\u901A\u9053\uFF1A\u547D\u4E2D\u771F\u5B9E provider_config.json \u7684\u8BFB\u53D6\u91CD\u5B9A\u5411\u4E3A merge(\u771F\u5B9E\u5B9E\u65F6
|
|
1156
1237
|
// \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
|
|
1157
1238
|
// \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
|
|
1158
1239
|
// \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
|
|
@@ -1213,7 +1294,7 @@ function catalogPatchText(path) {
|
|
|
1213
1294
|
|
|
1214
1295
|
${CLI_PATCH_SECTION}
|
|
1215
1296
|
|
|
1216
|
-
// \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\
|
|
1297
|
+
// \u5185\u5EFA provider \u914D\u7F6E\u5B9A\u4F4D\uFF08\u6F02\u79FB\u98CE\u9669\u2461\uFF09\uFF1A3.12.x \u8D77\u914D\u7F6E\u6587\u4EF6\u632A\u4F4D + CLI \u4F9D\u8D56\u5BBF\u4E3B\u6CE8\u5165
|
|
1217
1298
|
// ZCODE_BUILTIN_PROVIDER_CONFIG_FILE \u76F4\u63A5\u5B9A\u4F4D\uFF1BZCode \u684C\u9762 spawn \u94FE\u81EA\u5E26\u8BE5\u952E\uFF0C
|
|
1218
1299
|
// \u672C wrapper \u94FE\u9700\u81EA\u7ED9\u3002\u663E\u5F0F\u4F20\u5165\u4F18\u5148 \u2192 v2 runtime \u76EE\u5F55\u4E0B\u5E73\u53F0\u76EE\u5F55\uFF08\u7CBE\u786E
|
|
1219
1300
|
// <plat>-<arch> \u4F18\u5148\uFF0CRust arch \u53D8\u4F53\u5982 darwin-aarch64 \u5B57\u5178\u5E8F\u8DDF\u540E\uFF09\xD7 \u7248\u672C\u76EE\u5F55
|
|
@@ -1334,7 +1415,7 @@ if (text !== null || catalogPatch !== null || cliPatchProbe !== null) {
|
|
|
1334
1415
|
const cur = injectedConfigText();
|
|
1335
1416
|
if (cur !== null) return shape(rest, cur);
|
|
1336
1417
|
}
|
|
1337
|
-
// D3 \u6362\
|
|
1418
|
+
// D3 \u5207\u6362\uFF1ARegistry \u76F4\u8BFB\u771F\u5B9E provider_config.json \u2192 merge(\u771F\u5B9E, \u526F\u672C) \u89C6\u56FE
|
|
1338
1419
|
if (typeof p === 'string' && p === REAL_PROVIDER_CONFIG_PATH) {
|
|
1339
1420
|
const cur = mergedProviderConfigText();
|
|
1340
1421
|
if (cur !== null) return shape(rest, cur);
|
|
@@ -1391,8 +1472,8 @@ if (text !== null || catalogPatch !== null || cliPatchProbe !== null) {
|
|
|
1391
1472
|
|
|
1392
1473
|
// existsSync \u62E6\u622A\uFF1A\u771F\u5B9E bundle \u7684\u7528\u6237 config \u8BFB\u53D6\uFF08loadFileConfig\uFF09\u4EE5 existsSync
|
|
1393
1474
|
// \u4E3A\u77ED\u8DEF\u95E8\u2014\u2014\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u7A7A config \u4E14 readFileSync \u4E0D\u88AB\u8C03\u7528\uFF0CGUI-only
|
|
1394
|
-
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\
|
|
1395
|
-
// D3 \u6362\
|
|
1475
|
+
// \u767B\u5F55\u5BBF\u4E3B\uFF08cli/config.json \u4ECE\u672A\u88AB CLI \u4FA7\u5199\u8FC7\uFF09\u4E0A\u6CE8\u5165\u53EA\u6302\u5728\u8BFB\u4FA7 = \u4E0D\u53EF\u89C1\u3002
|
|
1476
|
+
// D3 \u5207\u6362\uFF1A\u771F\u5B9E provider_config.json \u7684\u5B58\u5728\u6027 = \u771F\u5B9E\u6216\u526F\u672C\u4EFB\u4E00\u5B58\u5728\u5373 true
|
|
1396
1477
|
//\uFF08\u771F\u5B9E\u7F3A\u5931 + \u526F\u672C\u5B58\u5728\u65F6 Registry \u7684 existsSync \u95E8\u4E0D\u5F97\u62E6\u6389 merge \u89C6\u56FE\u8BFB\u53D6\uFF09
|
|
1397
1478
|
fs.__origExistsSync = fs.existsSync;
|
|
1398
1479
|
fs.existsSync = function (p) {
|
|
@@ -1779,7 +1860,7 @@ var AppServerConnection = class {
|
|
|
1779
1860
|
killChainPromise;
|
|
1780
1861
|
generation = 0;
|
|
1781
1862
|
pushHandlers = /* @__PURE__ */ new Map();
|
|
1782
|
-
/** [R4]
|
|
1863
|
+
/** [R4] 连接级崩溃通知侧(onClose 订阅者集合;与 pushHandlers 同构的 refCount 形态)。 */
|
|
1783
1864
|
closeHandlers = /* @__PURE__ */ new Set();
|
|
1784
1865
|
capturedProtocolInfo = null;
|
|
1785
1866
|
constructor(opts) {
|
|
@@ -1799,7 +1880,7 @@ var AppServerConnection = class {
|
|
|
1799
1880
|
get pid() {
|
|
1800
1881
|
return this.child?.pid;
|
|
1801
1882
|
}
|
|
1802
|
-
/**
|
|
1883
|
+
/** 当前代是否有活进程(关闭原语与重建测试的观测范围)。 */
|
|
1803
1884
|
get alive() {
|
|
1804
1885
|
return this.child !== null;
|
|
1805
1886
|
}
|
|
@@ -2080,7 +2161,7 @@ var AppServerConnection = class {
|
|
|
2080
2161
|
return false;
|
|
2081
2162
|
}
|
|
2082
2163
|
}
|
|
2083
|
-
/** stderr 实时 append 落盘(懒打开 + 尺寸轮转 +
|
|
2164
|
+
/** stderr 实时 append 落盘(懒打开 + 尺寸轮转 + 过期清理;失败静默——取证侧不
|
|
2084
2165
|
* 能拖垮主通道)。 */
|
|
2085
2166
|
appendStderrLog(chunk) {
|
|
2086
2167
|
if (this.stderrStreamFailed) return;
|
|
@@ -2266,7 +2347,7 @@ var SessionChannel = class {
|
|
|
2266
2347
|
/**
|
|
2267
2348
|
* [P0-1 U5/D7] dispose 标志:dispose 收割后 closeSession 短路——收割形态下连接
|
|
2268
2349
|
* 可能仍 alive(close 事件迟到,finalize 未跑、child 非 null),此时发 close
|
|
2269
|
-
* request
|
|
2350
|
+
* request 会写死进程(请求挂到控制范围超时)或触发惰性重建(凭空 spawn 无人使用的
|
|
2270
2351
|
* 进程,违背 dispose 防泄漏语义);进程随即被引擎杀链回收,会话驻留随之消亡。
|
|
2271
2352
|
*/
|
|
2272
2353
|
disposed = false;
|
|
@@ -2290,10 +2371,10 @@ var SessionChannel = class {
|
|
|
2290
2371
|
/**
|
|
2291
2372
|
* [P0-1 U5/D7] dispose 前收割 + 退订:「退订 = 不会再有事件」在结构上蕴含「在途
|
|
2292
2373
|
* turn 不应再等」——close 缺失/被吞没形态(onClose 收割主路径未触发)下,在途
|
|
2293
|
-
* turn 于退订前经既有 failAllTurns 收敛为明确失败(设计 §3.4
|
|
2374
|
+
* turn 于退订前经既有 failAllTurns 收敛为明确失败(设计 §3.4 退化路径完成;
|
|
2294
2375
|
* race 窗口在引擎 shutdownRuntimeAndDisposeChannel,量级与 awaitConnFinalized
|
|
2295
2376
|
* 同源 ZCODE_APPSERVER_HARVEST_GRACE_MS)。幂等:与 onClose 收割先到者赢
|
|
2296
|
-
* (turn.fail 的 settled
|
|
2377
|
+
* (turn.fail 的 settled 检查——已落定 turn 不改写),activeTurns 已空则 no-op。
|
|
2297
2378
|
* 不影响连接自身生命周期(R4)。
|
|
2298
2379
|
*/
|
|
2299
2380
|
dispose() {
|
|
@@ -2365,7 +2446,7 @@ var SessionChannel = class {
|
|
|
2365
2446
|
* 原样上抛(调用方决定降级形态——引擎侧 warn 后注入锚失效声明段继续执行,
|
|
2366
2447
|
* run 不失败,[U3])。
|
|
2367
2448
|
* 经 conn.request 惰性启动连接(resume 是 run 的**首个**请求——调用时点连接
|
|
2368
|
-
* 可能尚未启动,与 readBestEffort 的「已死跳过」判据不同场景,不做 alive
|
|
2449
|
+
* 可能尚未启动,与 readBestEffort 的「已死跳过」判据不同场景,不做 alive 检查)。
|
|
2369
2450
|
*/
|
|
2370
2451
|
async resumeSession(sessionId) {
|
|
2371
2452
|
return this.conn.request("session/resume", { sessionId }, { timeoutMs: ZCODE_APPSERVER_TURN_READ_TIMEOUT_MS });
|
|
@@ -2514,7 +2595,7 @@ var SessionChannel = class {
|
|
|
2514
2595
|
}
|
|
2515
2596
|
/**
|
|
2516
2597
|
* 收尾帧判定与吸收(A.2 ⑤ 两种形态:payload.response / stopReason+content 变体)。
|
|
2517
|
-
* 命中任一形态则落 finalText/finalUsage 并以 final-frame
|
|
2598
|
+
* 命中任一形态则落 finalText/finalUsage 并以 final-frame 宽松终态收尾,返回 true。
|
|
2518
2599
|
*/
|
|
2519
2600
|
applyFinalFrame(turn, payload) {
|
|
2520
2601
|
if (typeof payload.response === "string" && payload.response !== "") {
|
|
@@ -2591,7 +2672,7 @@ var SessionChannel = class {
|
|
|
2591
2672
|
* - "interrupted":用户中断形态,debug(stderr 兜底对 debug no-op——对齐
|
|
2592
2673
|
* SDK logger CONSOLE_SINK 语义,host/log 反向请求侧仍可观测);
|
|
2593
2674
|
* - 失败类(isFailedTerminalStatus,与引擎失败分流同口径)与 unknown/未识别
|
|
2594
|
-
* status:保守 warn(原样 status
|
|
2675
|
+
* status:保守 warn(原样 status 已写入文案)——假成功识破的防御机制,理论
|
|
2595
2676
|
* 不可达但保留,宁可误报不静默。
|
|
2596
2677
|
*/
|
|
2597
2678
|
logLateTerminal(turn, status) {
|
|
@@ -2632,7 +2713,7 @@ var SessionChannel = class {
|
|
|
2632
2713
|
}
|
|
2633
2714
|
}
|
|
2634
2715
|
}
|
|
2635
|
-
/** 终态后 read(A.2 ⑥)。失败/超时不抛——降级链由 runTurn
|
|
2716
|
+
/** 终态后 read(A.2 ⑥)。失败/超时不抛——降级链由 runTurn 收尾(read 只兜底不致命)。
|
|
2636
2717
|
* 连接已死时跳过(与 closeSession 同判——对死连接发请求会凭空重建进程)。 */
|
|
2637
2718
|
async readBestEffort(sessionId) {
|
|
2638
2719
|
if (!this.conn.alive) return void 0;
|
|
@@ -2787,7 +2868,7 @@ function sweepExpiredZcodeSessions(dbPath, opts = {}) {
|
|
|
2787
2868
|
return { swept, keptActive };
|
|
2788
2869
|
} catch (err) {
|
|
2789
2870
|
logger3.warn(
|
|
2790
|
-
`[zcode-ttl] sweep \u5931\u8D25\uFF08\u8F85\u52A9\u8D44\u6E90\
|
|
2871
|
+
`[zcode-ttl] sweep \u5931\u8D25\uFF08\u8F85\u52A9\u8D44\u6E90\u4FA7\uFF0C\u4E0D\u5F71\u54CD run \u4E3B\u94FE\u8DEF\uFF1B\u4E0B\u4E2A\u8282\u6D41\u7A97\u91CD\u8BD5\uFF09: ${err instanceof Error ? err.message : String(err)}`,
|
|
2791
2872
|
{ dbPath }
|
|
2792
2873
|
);
|
|
2793
2874
|
return noOp;
|
|
@@ -2865,7 +2946,7 @@ var ZcodeEngine = class {
|
|
|
2865
2946
|
permissionMode: "native",
|
|
2866
2947
|
// [D3-④] 无 turn_end 语义,轮数上限不可兑现(预检 gate 据此同步拒绝)
|
|
2867
2948
|
maxTurns: false,
|
|
2868
|
-
// [subagent-model-switch] zcode
|
|
2949
|
+
// [subagent-model-switch] zcode 引擎不在模型切换设计范围(协议范围引擎中立预留,
|
|
2869
2950
|
// 后续另立项接入)——setModel 通路未接通,unsupported 如实声明
|
|
2870
2951
|
setModel: "unsupported"
|
|
2871
2952
|
};
|
|
@@ -2933,7 +3014,7 @@ var ZcodeEngine = class {
|
|
|
2933
3014
|
* 常驻路径主编排:模型解析(v2 单源校验)→ 惰性连接 + runTurn(事件时序前移:
|
|
2934
3015
|
* text_delta 流式、终态后 message_end/turn_end)→ schema 仿真重试 → outcome/handle。
|
|
2935
3016
|
* onHandleReady 在 create 应答后(§3.4 不变量 3;原 onPoolResolved prepare 期
|
|
2936
|
-
* 声明已随 [池抽象降级 2026-09-13] poolKey
|
|
3017
|
+
* 声明已随 [池抽象降级 2026-09-13] poolKey 协议范围退役删除)。
|
|
2937
3018
|
*/
|
|
2938
3019
|
async runViaAppServer(task, ctx) {
|
|
2939
3020
|
const startedAt = Date.now();
|
|
@@ -2953,7 +3034,7 @@ var ZcodeEngine = class {
|
|
|
2953
3034
|
const outcome = this.finalizeOutcome(task, ctx, final, usageAcc, startedAt);
|
|
2954
3035
|
return { handle: this.appServerHandle(outcome), outcome };
|
|
2955
3036
|
}
|
|
2956
|
-
/** pre-aborted
|
|
3037
|
+
/** pre-aborted 短路收尾:合成中止 outcome + 'shared' 锚定 handle。 */
|
|
2957
3038
|
abortedAppServerRun(task, ctx, startedAt) {
|
|
2958
3039
|
const outcome = this.finalizeOutcome(
|
|
2959
3040
|
task,
|
|
@@ -2973,11 +3054,11 @@ var ZcodeEngine = class {
|
|
|
2973
3054
|
* 新建会话)。重试轮 prompt 用 basePrompt 原样重跑(失败形态非 schema),文案补
|
|
2974
3055
|
* 「已自动重试一次」句(retried 标记仅对真实发生的重试生效)。
|
|
2975
3056
|
*
|
|
2976
|
-
* 两次重试一次封顶各自独立(D6
|
|
3057
|
+
* 两次重试一次封顶各自独立(D6 不采用①:多次重试/指数退避不做——重跑一轮=整任务
|
|
2977
3058
|
* 重算,一次封顶)。组合序:瞬时重试在前、schema 重试在后——瞬时重试轮 parsed 且
|
|
2978
3059
|
* 校验失败时仍进 schema 重试(末次 attempt 语义,schema 重试编排保持现状不动)。
|
|
2979
3060
|
*
|
|
2980
|
-
* 重试轮是独立会话的独立 LLM 调用:token 计入 outcome.usage
|
|
3061
|
+
* 重试轮是独立会话的独立 LLM 调用:token 计入 outcome.usage 总量;事件范围
|
|
2981
3062
|
* text_delta 按实际流出(含失败轮——journal 记录真实流水),message_end/turn_end
|
|
2982
3063
|
* 只在最终轮终态后合成(不变量 2/5)。
|
|
2983
3064
|
*/
|
|
@@ -3024,7 +3105,7 @@ var ZcodeEngine = class {
|
|
|
3024
3105
|
}
|
|
3025
3106
|
/**
|
|
3026
3107
|
* 单轮常驻执行:runTurn 组合面 + D3 abort 链 + 事件前移(text_delta 实时流出;
|
|
3027
|
-
* 终态数据经 read
|
|
3108
|
+
* 终态数据经 read 兜底收尾后才 resolve——不变量 1/2)。
|
|
3028
3109
|
*
|
|
3029
3110
|
* @param opts retried:瞬时重试轮标记——失败文案补「已自动重试一次」句(F-1/F-4)。
|
|
3030
3111
|
*/
|
|
@@ -3047,7 +3128,7 @@ var ZcodeEngine = class {
|
|
|
3047
3128
|
// 等,真机探针实证每 ~1s 一帧)→ activity 事件(零载荷纯活性信号——宿主无进展
|
|
3048
3129
|
// 守护对任何事件类型刷新;reducer no-op、不落 journal)。zcode 引擎声明
|
|
3049
3130
|
// conversation:"cold"(续聊 = session-store 冷恢复重建 + 新 run + resume 锚点,
|
|
3050
|
-
// 无热 steering/chat 域接线),run
|
|
3131
|
+
// 无热 steering/chat 域接线),run 域是唯一发射点。
|
|
3051
3132
|
onActivity: () => ctx.onEvent?.({ type: "activity" }),
|
|
3052
3133
|
onSessionCreated: (sessionId) => {
|
|
3053
3134
|
currentSessionId = sessionId;
|
|
@@ -3084,12 +3165,12 @@ var ZcodeEngine = class {
|
|
|
3084
3165
|
}
|
|
3085
3166
|
/**
|
|
3086
3167
|
* [attemptAppServerTurn 拆分] 失败分流(catch 半边):
|
|
3087
|
-
* - signal 已 aborted →
|
|
3168
|
+
* - signal 已 aborted → 中止终态收尾;
|
|
3088
3169
|
* - [P0-1 U4] 连接崩溃收割形态(failAllTurns 的错误,D6 可重试形态)判据:
|
|
3089
|
-
* 非 RPC error
|
|
3170
|
+
* 非 RPC error(服务端无明确应答——有应答即精确错误归类,非瞬时崩溃)且
|
|
3090
3171
|
* conn 不存活。时序可靠性:catch 时刻紧随 onClose 收割,连接重建仅由
|
|
3091
3172
|
* conn.request 惰性触发——本链路中 runTurn finally 的 closeSession 对死连接
|
|
3092
|
-
* 短路(channel 侧 !alive
|
|
3173
|
+
* 短路(channel 侧 !alive 检查)、stop 只属 abort 链(已被 signal.aborted
|
|
3093
3174
|
* 短路)——此刻无 request 可重建,判据可靠;
|
|
3094
3175
|
* - 其余 → 精确错误终态。
|
|
3095
3176
|
*/
|
|
@@ -3111,7 +3192,7 @@ var ZcodeEngine = class {
|
|
|
3111
3192
|
async awaitConnFinalized(rt) {
|
|
3112
3193
|
if (!rt.conn.alive) return;
|
|
3113
3194
|
await new Promise((resolve2) => {
|
|
3114
|
-
const timer = setTimeout(() => finish(),
|
|
3195
|
+
const timer = setTimeout(() => finish(), harvestGraceMs());
|
|
3115
3196
|
if (typeof timer.unref === "function") timer.unref();
|
|
3116
3197
|
const off = rt.conn.onClose(() => finish());
|
|
3117
3198
|
function finish() {
|
|
@@ -3125,7 +3206,7 @@ var ZcodeEngine = class {
|
|
|
3125
3206
|
* D3 abort 链执行体(用户取消入口,fire-and-forget——与 turn promise 并行推进):
|
|
3126
3207
|
* stop 帧(超时 ZCODE_APPSERVER_STOP_TIMEOUT_MS)→ grace 窗口内 turn 落定即止
|
|
3127
3208
|
* (不杀共享进程)→ 超窗 killChain(conn.shutdown 全序:SIGTERM→grace→SIGKILL)。
|
|
3128
|
-
* turn 的最终落定由 attempt 主路径 await
|
|
3209
|
+
* turn 的最终落定由 attempt 主路径 await 收尾,本链不直接产出终态。abort 与 create
|
|
3129
3210
|
* 竞态(signal 先到、session 未建立):等会话建立(带上限)再发 stop——否则 stop
|
|
3130
3211
|
* 永远发不出,直接连坐杀共享进程。
|
|
3131
3212
|
*/
|
|
@@ -3174,7 +3255,7 @@ var ZcodeEngine = class {
|
|
|
3174
3255
|
* workspace.workspacePath 按任务传递——D10 基线不预设任务级进程 cwd)。
|
|
3175
3256
|
* spawn 经 fs 拦截 wrapper(appserver-launcher:cli config 读取重定向为
|
|
3176
3257
|
* 「真实文件 + v2 provider 注入」——CLI 形态 app-server 在共享宿主 HOME 下的
|
|
3177
|
-
*
|
|
3258
|
+
* 唯一凭据供数通路,机制与漂移风险见该文件头注)。
|
|
3178
3259
|
*/
|
|
3179
3260
|
ensureAppServerRuntime() {
|
|
3180
3261
|
if (this.appserverRuntime !== void 0) return this.appserverRuntime;
|
|
@@ -3223,7 +3304,7 @@ var ZcodeEngine = class {
|
|
|
3223
3304
|
* [P0-1 U5/D7] grace race 输掉(close 迟到/永不到达——stdio 被孙进程持有排空不
|
|
3224
3305
|
* 尽等病态形态)时,channel.dispose() 内置的 dispose 收割(failAllTurns 先于退订,
|
|
3225
3306
|
* SessionChannel.dispose)兜底在途 turn——在途 turn 收敛为「grace 窗口内明确失败」
|
|
3226
|
-
* (设计 §3.4
|
|
3307
|
+
* (设计 §3.4 退化路径完成);race 窗口与 awaitConnFinalized 同源同量级
|
|
3227
3308
|
* (ZCODE_APPSERVER_HARVEST_GRACE_MS)。正常 close 先到时 onClose 收割先行,
|
|
3228
3309
|
* dispose 收割幂等 no-op(零回归)。
|
|
3229
3310
|
*/
|
|
@@ -3235,14 +3316,14 @@ var ZcodeEngine = class {
|
|
|
3235
3316
|
});
|
|
3236
3317
|
});
|
|
3237
3318
|
await rt.conn.shutdown({ graceMs: ZCODE_KILL_GRACE_MS });
|
|
3238
|
-
await Promise.race([harvested, delayResolved(
|
|
3319
|
+
await Promise.race([harvested, delayResolved(harvestGraceMs(), void 0)]);
|
|
3239
3320
|
rt.channel.dispose();
|
|
3240
3321
|
}
|
|
3241
3322
|
/**
|
|
3242
|
-
* [R1 D6 主体]
|
|
3323
|
+
* [R1 D6 主体] 引擎停机路径:①fire 全部在途会话的 session/close 帧(不等待
|
|
3243
3324
|
* 应答——D6① 顺序规定:close 帧必须先于 SIGTERM,否则对面来不及处理即被杀)→
|
|
3244
|
-
* ②同步 SIGTERM(conn.shutdown 调用内 killChain
|
|
3245
|
-
* Promise 前完成)→ ③grace → SIGKILL
|
|
3325
|
+
* ②同步 SIGTERM(conn.shutdown 调用内 killChain 前缀同步执行——同步部分在返回
|
|
3326
|
+
* Promise 前完成)→ ③grace → SIGKILL(异步侧,Promise resolve 于进程退出)。
|
|
3246
3327
|
* 幂等:运行时字段取走即置空,二次调用零副作用;dispose 后首个 run 经
|
|
3247
3328
|
* ensureAppServerRuntime 自动重建(与崩溃重建同一代码路径,不变量 4)。
|
|
3248
3329
|
*/
|
|
@@ -3281,7 +3362,7 @@ var ZcodeEngine = class {
|
|
|
3281
3362
|
/** abort 合成终态:exitCode=null(record 正常收尾,不留僵尸)。 */
|
|
3282
3363
|
applyAbortedOutcome(outcome, task, ctx, final, emit) {
|
|
3283
3364
|
outcome.exitCode = null;
|
|
3284
|
-
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\
|
|
3365
|
+
outcome.error = isHostTimeoutAbort(ctx) ? (0, import_subagent_engine_sdk12.synthesizeTimeoutOutcome)(task, final.output.stdoutText, ZCODE_ENGINE_ID).error ?? (0, import_subagent_engine_sdk12.engineTimeoutDetail)(final.output.stdoutText) : final.abortMessage ?? `engine_run_failed: zcode \u4EFB\u52A1\u88AB\u4E2D\u6B62\uFF08app-server abort \u94FE\u6536\u5C3E\uFF0C\u5BBF\u4E3B\u5408\u6210\u7EC8\u6001\uFF09\u3002\u8F93\u51FA\u5C3E\u90E8: ${final.output.stdoutText.slice(-ZCODE_ERROR_TAIL_CHARS)}`;
|
|
3285
3366
|
emit({ type: "error", message: outcome.error });
|
|
3286
3367
|
}
|
|
3287
3368
|
/**
|
|
@@ -3331,7 +3412,7 @@ var ZcodeEngine = class {
|
|
|
3331
3412
|
* [engine-ref-translation D1] 派发期模型 ref 翻译(EnginePort 可选成员实装):
|
|
3332
3413
|
* pi 词汇 ref → zcode 原生 ref(zai-coding-cn/* → account:bigmodel-individual-*
|
|
3333
3414
|
* 大小写归一,2026-10-16 用户裁决(证据驱动修正目标家族)),其余透传。编排层在 record stamp 前调用——
|
|
3334
|
-
* record
|
|
3415
|
+
* record/上报侧呈现实际发给引擎的 ref;翻译失败抛错 = 显式失败(不静默回落)。
|
|
3335
3416
|
* 幂等:翻译产物(account:/个人 id)再入恒等,引擎内 resolveZcodeModelRef 的
|
|
3336
3417
|
* 同名翻译分支零冲突。
|
|
3337
3418
|
*/
|
|
@@ -3369,9 +3450,9 @@ var ZcodeEngine = class {
|
|
|
3369
3450
|
* 权威,无双实现)。校验失败原样抛 ZcodePrepareError,由编排层
|
|
3370
3451
|
* (engine/model-validation.ts)包装成「引擎与模型不配套」文案。
|
|
3371
3452
|
*
|
|
3372
|
-
* [R4/D6-②] 缺席语义:本实现是进程内形态 +
|
|
3453
|
+
* [R4/D6-②] 缺席语义:本实现是进程内形态 + 协议诊断范围(宿主 cli 形态消费的是
|
|
3373
3454
|
* RemoteEngine 的 manifest 本地判定,不经本方法——SDK protocol methods.ts 明示
|
|
3374
|
-
* validateModel
|
|
3455
|
+
* validateModel 为诊断范围)。缺席 modelRef 时返回空串 canonical(= create 帧省略
|
|
3375
3456
|
* model 键、CLI 自身缺省解析——2026-09-29 account 体系迁移后 plan 家族兜底 id
|
|
3376
3457
|
* 已不可用;record 留痕侧按 R4/D6-② 空串归一为「用户未指定」条件留空)。帧应答
|
|
3377
3458
|
* 形态维持 {canonicalRef: string}(SDK port-contract 契约必填——「帧字段缺席」
|
|
@@ -3388,7 +3469,7 @@ var ZcodeEngine = class {
|
|
|
3388
3469
|
* (zcodeSessionDbPath(engineDataDir),tier1 白名单集合见方法体——宿主路径仅
|
|
3389
3470
|
* 「共享 HOME 时代」存量兼容);旧 records(池时代)的相对路径仍按池目录锚定
|
|
3390
3471
|
* 解析(read 兼容旧数据,池目录不存在时自然落②级 journal 降级)。[池抽象降级
|
|
3391
|
-
* 2026-09-13] 锚定 key 用常量 SHARED_POOL_KEY
|
|
3472
|
+
* 2026-09-13] 锚定 key 用常量 SHARED_POOL_KEY 承载——协议范围 poolKey 已删,池
|
|
3392
3473
|
* 时代真实池 key 不再随 handle 传输;若旧 record 的池目录恰为 shared 布局则①级
|
|
3393
3474
|
* 仍可达,其余池 key 的旧 record 直接走②级 journal 降级(30 天 TTL 同尺度衰减,
|
|
3394
3475
|
* 行为安全)。
|
|
@@ -3485,8 +3566,8 @@ var ZcodeEngine = class {
|
|
|
3485
3566
|
* [U6 / §3.2.6 要点 3] resume 锚 → 历史前缀(interact-resume 的读半段)。
|
|
3486
3567
|
*
|
|
3487
3568
|
* 无锚 / 非 zcode 锚形态 → undefined(行为不变)。读通道失败(会话失效 / 控制
|
|
3488
|
-
* 面错误)=
|
|
3489
|
-
* 于 create 应答,分钟级窗 +
|
|
3569
|
+
* 面错误)= 锚真失效的权威信号——宿主侧库派生视图预检查已退役(app-server 写盘滞后
|
|
3570
|
+
* 于 create 应答,分钟级窗 + 部分行永不写盘,预检查系统性误判;resume 走
|
|
3490
3571
|
* app-server resident 内存态才是真实活性判据),因此此处不再静默降级为无前缀
|
|
3491
3572
|
* 裸跑,而是返回锚失效声明段:让模型知情「延续但无历史」,基于最新消息独立
|
|
3492
3573
|
* 续推,而非在缺上下文时臆测连续性。用户消息照常执行,不炸轮。
|
|
@@ -3580,7 +3661,7 @@ function stopTimeoutMs() {
|
|
|
3580
3661
|
return resolveAppserverTimingMs(
|
|
3581
3662
|
ZCODE_APPSERVER_STOP_TIMEOUT_ENV,
|
|
3582
3663
|
ZCODE_APPSERVER_STOP_TIMEOUT_MS,
|
|
3583
|
-
"stop \u63A7\u5236\
|
|
3664
|
+
"stop \u63A7\u5236\u8303\u56F4\u8D85\u65F6"
|
|
3584
3665
|
);
|
|
3585
3666
|
}
|
|
3586
3667
|
function abortGraceMs() {
|
|
@@ -3590,6 +3671,13 @@ function abortGraceMs() {
|
|
|
3590
3671
|
"abort grace \u7A97\u53E3"
|
|
3591
3672
|
);
|
|
3592
3673
|
}
|
|
3674
|
+
function harvestGraceMs() {
|
|
3675
|
+
return resolveAppserverTimingMs(
|
|
3676
|
+
ZCODE_APPSERVER_HARVEST_GRACE_ENV,
|
|
3677
|
+
ZCODE_APPSERVER_HARVEST_GRACE_MS,
|
|
3678
|
+
"\u5D29\u6E83\u6536\u5272\u786E\u8BA4\u7A97\u53E3"
|
|
3679
|
+
);
|
|
3680
|
+
}
|
|
3593
3681
|
function delayResolved(ms, value) {
|
|
3594
3682
|
return new Promise((resolve2) => {
|
|
3595
3683
|
const t = setTimeout(() => resolve2(value), ms);
|
|
@@ -3884,10 +3972,10 @@ var EngineProtocolServer = class {
|
|
|
3884
3972
|
(0, import_server.writeRunEvent)(this.write, this.activeRuns, runId, event);
|
|
3885
3973
|
}
|
|
3886
3974
|
/**
|
|
3887
|
-
*
|
|
3975
|
+
* 发反向请求并等应答(帧④必须应答)。计时侧登记:发出 → clock.started;收到
|
|
3888
3976
|
* ack 形态应答 → clock.acked(两阶段第一段,等待不计超时);终结 → clock.settled。
|
|
3889
|
-
* 应答超时兜底 reject
|
|
3890
|
-
*
|
|
3977
|
+
* 应答超时兜底 reject——数据范围通道(host/log 等)core 10s 应答,reject 由调用方
|
|
3978
|
+
* 吞掉留痕(数据范围丢失不拖死主链路)。
|
|
3891
3979
|
*/
|
|
3892
3980
|
/**
|
|
3893
3981
|
* fire-and-forget 反向请求(`void this.reverseRequestInternal(...)` 形态)的
|
|
@@ -3902,7 +3990,7 @@ var EngineProtocolServer = class {
|
|
|
3902
3990
|
});
|
|
3903
3991
|
};
|
|
3904
3992
|
}
|
|
3905
|
-
/**
|
|
3993
|
+
/** 反向请求发送(对外公开:main.ts 的 host/log 桥接消费;内部 run 通道同路)。 */
|
|
3906
3994
|
reverseRequest(method, params) {
|
|
3907
3995
|
return this.reverseRequestInternal(method, params);
|
|
3908
3996
|
}
|
|
@@ -3919,7 +4007,7 @@ var EngineProtocolServer = class {
|
|
|
3919
4007
|
params
|
|
3920
4008
|
);
|
|
3921
4009
|
}
|
|
3922
|
-
/** 反向请求应答落位(ack 两阶段:{ack:true}/{unsupported:true}/{ok:true} 均先 ack
|
|
4010
|
+
/** 反向请求应答落位(ack 两阶段:{ack:true}/{unsupported:true}/{ok:true} 均先 ack 计时侧)。 */
|
|
3923
4011
|
settleReverse(id, frame) {
|
|
3924
4012
|
const pending = this.reversePending.get(String(id));
|
|
3925
4013
|
if (pending === void 0) return;
|
package/dist/main.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhushanwen/zcode-subagent-cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4",
|
|
4
4
|
"description": "zcode subagent engine as an independent CLI package (W5 of subagent-engine-protocolization): speaks engine-protocol v1 over NDJSON stdio, depends only on @zhushanwen/subagent-engine-sdk (never subagent-core)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -60,13 +60,13 @@
|
|
|
60
60
|
"description": "ZCode app-server resident engine (shared host HOME, isolated session db, credential injection via fs-interception launcher)"
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
|
-
"$comment": "W5 (impl-plan §2.5): 引擎包只依赖 SDK,禁止依赖 @zhushanwen/subagent-core(check-engine-sdk-boundary 同精神,W10 静态断言目标)。manifest 按 §2.4 schema:capabilities 与 core engines/zcode 的 ZcodeEngine.capabilities() 逐位一致(快照权威);modelCatalog 由 `pnpm gen:model-catalog` 构建期生成进 manifest,committed 的 {dynamic:true, models:[]} 只是生成器缺席时的占位——models 运行期真相经协议 listModels/validateModel
|
|
63
|
+
"$comment": "W5 (impl-plan §2.5): 引擎包只依赖 SDK,禁止依赖 @zhushanwen/subagent-core(check-engine-sdk-boundary 同精神,W10 静态断言目标)。manifest 按 §2.4 schema:capabilities 与 core engines/zcode 的 ZcodeEngine.capabilities() 逐位一致(快照权威);modelCatalog 由 `pnpm gen:model-catalog` 构建期生成进 manifest,committed 的 {dynamic:true, models:[]} 只是生成器缺席时的占位——models 运行期真相经协议 listModels/validateModel 诊断范围。过渡期 core 侧 engines/zcode/ 保留(TAIJI_SUBAGENT_ENGINE_MODE 双模,W11 删)。发布形态(MF-4/MF-5 修复,约束 C-proc-11):CLI 包——bin 是唯一 npm 消费方(仓内零生产 import),files 不带 src/(Node 拒载 node_modules 内 .ts,TS 源发布只产出误导 + __tests__/__golden__ 测试资产泄漏),npm 消费走 publishConfig -> dist(双形态约定同 subagent-core D4);构建 = tsup(src 内部 import 带 .ts 后缀 + allowImportingTsExtensions,tsc emit 不可行),SDK 保持 external 经宿主 node_modules 解析;bin = dist-first + 仅 workspace 形态回退 src(node_modules 判据禁用 npm 形态回退),见 bin/zcode-subagent-cli.mjs。main/module/types 顶层字段恒指 dist:npm pack 会强制包含 main 指向的文件(无视 files 白名单),指 src 会把 TS 源塞进不含 src/ 的 tarball;workspace 消费恒走 exports 的 import 条件 → src,顶层字段只是 exports 缺席时的 fallback,无 workspace DX 影响。",
|
|
64
64
|
"files": [
|
|
65
65
|
"bin/",
|
|
66
66
|
"dist/"
|
|
67
67
|
],
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@zhushanwen/subagent-engine-sdk": "0.
|
|
69
|
+
"@zhushanwen/subagent-engine-sdk": "0.12.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@types/node": "^24.0.0",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"scripts": {
|
|
79
79
|
"build": "tsup",
|
|
80
|
-
"test": "vitest run",
|
|
80
|
+
"test": "vitest run --pool=threads",
|
|
81
81
|
"typecheck": "tsc --noEmit",
|
|
82
82
|
"gen:model-catalog": "node scripts/gen-model-catalog.mjs"
|
|
83
83
|
}
|