chainlesschain 0.162.77 → 0.162.79
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/README.md +37 -1
- package/bin/chainlesschain.js +20 -1
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps--t6qElO3.js → AIOps-D89fD_7T.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-vRiifAww.js → ActionButton-d75flwX8.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BfSlGprA.js → Analytics-gvvBEb4T.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B6L2I5ld.js → AppLayout-DzHOVS64.js} +4 -4
- package/src/assets/web-panel/assets/{Audit-Dwpk7vO2.js → Audit-15K7MhRC.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D7UuR3M8.js → Backup-BgVHsglI.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BzMDBTyZ.js → BaseInput-BRnvd4sF.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BxYUynGU.js → Chat-B2vtXu7s.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BYyCFqO0.js → ChatBubbleRenderer-d1EFM3dh.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DgpLcrjA.js → Checkbox-B5uV5Jhr.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-N5dSkUbq.js → Codegen-cVDMBVGV.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C1nf7jzT.js → Col-DtL6q7Hw.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BuX21CEd.js → Community-DSyPZkqQ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-M37IFQe_.js → Compact-CzfV_q4O.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B_OBnXJx.js → Compliance-B_xhhLE1.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BcIn7Sb2.js → Cowork-Y49Qf0JX.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BtmA9AMI.js → Cron-B7JG-oLj.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DlAiW2Iy.js → Crosschain-CukEkQtf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-91Skenc5.js → DID-Bd4UVKdn.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BTzcKrw1.js → Dashboard-DRCQl7H1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-VNCZqfkL.js → Dropdown-De47CuRY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-B_o62liK.js → EmailListRenderer-C-wAkceB.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqceYpym.js → FamilyGuardDashboard-DhLF_E0k.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BJFcp8S0.js → Federation-DAipUS1m.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DwsPen2h.js → FormItemContext-BCFyAd2j.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BOU0nfJP.js → GenericCardRenderer-wMdxrEV9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_92Ngor.js → Git-CcwP7HUN.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-SIBJc353.js → Governance-VF760JcB.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DcEwRh8C.js → Inference-DnR-GIn2.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C4LQ8MJI.js → KnowledgeGraph-j-ewVKWO.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BXz2tihi.js → Logs-DgB7wSor.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DqXKQJ2n.js → Marketplace-fiKjzVWE.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CXVGQSUd.js → McpTools-BjXSMQrd.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Bp8huWkt.js → Memory-C0L5lnSS.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-B3duw6FB.js → MobileBridge-C0Rgg1Su.js} +3 -3
- package/src/assets/web-panel/assets/{MobileProjects-Cn5YO60O.js → MobileProjects-BPA50hQb.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CE_M_-1m.js → Mtc-BUsHuAjB.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Dev-y1Ei.js → MtcAudit-dlH8Q_7U.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-RILPE0-i.js → Multisig-L3_9beuW.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DsBeFM0w.js → NLProgramming-BG4sXy27.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-MONi8b1b.js → Notes-felgIvGS.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-mXNink9t.js → NotificationSettings-DHDT96AK.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Bvtv8CHQ.js → OrderTableRenderer-BYrkEfvR.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-_7rEqDWP.js → Organization-DdtOLkHG.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CuqybwI0.js → Overflow-DLw5Pni7.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BvYN2SXJ.js → P2P-B-mZ5EXz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BWGnb4i0.js → PdhVaultBrowser-DeOmNCwK.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-D2vyDMm6.js → Permissions-BeQMX71K.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BWaT70CA.js → PersonalDataHub-D5PoqtQI.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-T_Pztk-K.js → Pipeline-B0f5sqKF.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BTChzeM8.js → Privacy-Dj_gcxio.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BQQBICYM.js → ProjectInit-DmfPgied.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BOLO_fhW.js → ProjectSettings-BmBfocrv.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BfqkBhzi.js → Projects-BUif48cc.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DpWEAYh2.js → Providers-B0ztEAOV.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-MX8kg-uO.js → QuickAsk-BtMG4jH5.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-UOCp-h2X.js → Recommend-DQKN1En8.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-H_vE2kEf.js → Reputation-D34CvUxg.js} +1 -1
- package/src/assets/web-panel/assets/{Row-dupAolkD.js → Row-nnuDNx31.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DVoerh51.js → RssFeed-DHx9x8_B.js} +2 -2
- package/src/assets/web-panel/assets/{Search-5zxC_iWb.js → Search-CH-JYtn_.js} +1 -1
- package/src/assets/web-panel/assets/{Security-vg3XxdEZ.js → Security-nNKBmzm4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWjum0P4.js → Services-xYk_lDxy.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BkVnAX7_.js → Skeleton-DTYyRduA.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-2oMJr3sU.js → Skills-DS19-9sF.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bv8uLcr_.js → Sla-Cr_ir42Y.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BfvawAGM.js → SpeechSettings-Ch5Iq7Wy.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DzWmsU8K.js → SyncSettings-CTblfa_E.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-cbtuyShK.js → Tasks-z7lz3hjG.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-PP2omXNk.js → Templates-DGoMFd4r.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Cab9qgCx.js → Tenant-DQUPvHxx.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-9kFA0Vf8.js → Terminal-Wt2wrbE6.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cx8kncEg.js → TimelineRenderer-DGTc2UqL.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D19NKMv_.js → Tokens-DPVnuARF.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DbRaTJsm.js → Trigger-DV5MPXC1.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-8EFY9ZrM.js → Trust-BBkMKqwS.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign--wxy-nr4.js → UkeySign-B_2E0qev.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BlRqqo2c.js → VideoEditing-CA-qKeVb.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B2x_RfaK.js → Wallet-Ds4WURh-.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DISokPYb.js → WebAuthn-BApiHjzz.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DkuLYA12.js → WorkflowEditor-DFzmAnzV.js} +1 -1
- package/src/assets/web-panel/assets/{chat-MMwBSP3l.js → chat-DZ6sHPit.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CPP3K6Jb.js → colors-DgbwhHtE.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-2ruYr7FB.js → compact-item-C4QVYSzd.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BPpiGxaR.js → createContext-yXIs4TwU.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-C-HfIeF7.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CtP3Uqy-.js → hasIn-CPtuUtBl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpBaxHIL.js → index-4g6pGxnX.js} +1 -1
- package/src/assets/web-panel/assets/{index-9SEWDDhb.js → index-B91hax9S.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2N_-y_W.js → index-B9DUiQ24.js} +3 -3
- package/src/assets/web-panel/assets/index-BBgWatYO.js +1 -0
- package/src/assets/web-panel/assets/{index-2cESIQ4O.js → index-BCb7MYMS.js} +1 -1
- package/src/assets/web-panel/assets/{index-D05imMj-.js → index-BIAxMDe9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq8gB01i.js → index-BJiGrT6V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM_RMGj5.js → index-BOKVSmKh.js} +1 -1
- package/src/assets/web-panel/assets/{index-COSm6DcE.js → index-BWJGry74.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf1tNEoB.js → index-BaVYCMJa.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyCZ3fz1.js → index-Bd0JznCS.js} +1 -1
- package/src/assets/web-panel/assets/{index-oaNSovPm.js → index-BpBCKK6W.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSNoOIwN.js → index-BsXF9cn5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIQO-prS.js → index-BxclR5gc.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6qsWs-4.js → index-C0LyE6R6.js} +1 -1
- package/src/assets/web-panel/assets/{index-COPqJgcW.js → index-CBAgy5pf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLAT0M1t.js → index-CJ550XXg.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7-Zo0uW.js → index-CTlz3MP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dc1ysHqq.js → index-CaC4gaQZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-6Sly6NDj.js → index-CnP2ftM5.js} +1 -1
- package/src/assets/web-panel/assets/index-CvCTol_u.js +1 -0
- package/src/assets/web-panel/assets/{index-Bjthf-eJ.js → index-D2KRfjEI.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bfr1HIma.js → index-DA0ePxNn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byddazfj.js → index-DC5iP1VB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkqTFggQ.js → index-DCGmeXfl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM7y07U3.js → index-DHnWI0jj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZrah8Gb.js → index-DN4qpkKQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DS_ISOVj.js → index-DTLaRwKx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO_a65ut.js → index-DdFjcgqH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dy85x86R.js → index-DopuoTzG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXGebJnR.js → index-DpDAGvyU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUQp8MdV.js → index-EGVlUtH-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cru4qTvK.js → index-IFh9qCi0.js} +1 -1
- package/src/assets/web-panel/assets/{index-oD_rJWBp.js → index-UEeNpaDD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzFVlsbg.js → index-ZCyyy3Zt.js} +1 -1
- package/src/assets/web-panel/assets/{index-h-zAHKNr.js → index-aKZjRwjv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5g378QF.js → index-jBlY6-bF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZyr02ib.js → index-kbcTc6Pf.js} +1 -1
- package/src/assets/web-panel/assets/{index-P_R2pJ9q.js → index-x9bXmSNB.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BrJf63uk.js → initDefaultProps-BDsxioXk.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BD8UoaTG.js → motion-erZ2fiIQ.js} +1 -1
- package/src/assets/web-panel/assets/{move-DbunBKV-.js → move-BFiiw4WK.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CkGNCa-h.js → omit-BRMVd4pM.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DTvTrHC2.js → pickAttrs-CGjoFXsq.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Cb7oz9vL.js → placementArrow-DU_Bnf7w.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-O7lB6MAE.js → responsiveObserve-DPdkYupg.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C24m1SKv.js → slide-JfHiG96y.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D_-9GtZ3.js → statusUtils-Dy-1guyd.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CrAYF9jD.js → styleChecker-Chaljnux.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CmgeoVPN.js → useFlexGapSupport-DOHIHBgY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DzJSzGsy.js → useFs-BxSoQhIY.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Bgqky5YK.js → usePersonalDataHub-MOR76PYB.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-ErTJLgr4.js → vnode-BBGIyeYD.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-wlf3cppM.js → zoom-C1oFENec.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/audit.js +4 -3
- package/src/commands/automation.js +6 -14
- package/src/commands/bi.js +10 -9
- package/src/commands/codegen.js +5 -13
- package/src/commands/dao.js +8 -6
- package/src/commands/dbevo.js +13 -14
- package/src/commands/economy.js +3 -2
- package/src/commands/evolution.js +3 -2
- package/src/commands/federation.js +4 -3
- package/src/commands/governance.js +9 -4
- package/src/commands/hardening.js +5 -4
- package/src/commands/incentive.js +6 -5
- package/src/commands/kg.js +17 -10
- package/src/commands/lowcode.js +23 -11
- package/src/commands/marketplace.js +4 -3
- package/src/commands/mcp.js +17 -5
- package/src/commands/ops.js +9 -4
- package/src/commands/recommend.js +7 -5
- package/src/commands/scim.js +3 -2
- package/src/commands/session.js +9 -6
- package/src/commands/social.js +4 -3
- package/src/commands/sync.js +3 -2
- package/src/commands/tenant.js +11 -6
- package/src/commands/zkp.js +8 -9
- package/src/gateways/ws/ws-agent-handler.js +12 -3
- package/src/gateways/ws/ws-server.js +6 -0
- package/src/harness/background-task-manager.js +44 -18
- package/src/harness/mcp-client.js +125 -46
- package/src/lib/agent-core.js +2 -1
- package/src/lib/chat-core.js +209 -107
- package/src/lib/claude-code-bridge.js +13 -1
- package/src/lib/dao-governance.js +3 -3
- package/src/lib/downloader.js +82 -25
- package/src/lib/headless-config-command.js +62 -0
- package/src/lib/json-schema-output.js +55 -11
- package/src/lib/mcp-oauth.js +110 -21
- package/src/lib/mcp-serve.js +70 -11
- package/src/lib/multisig-runtime.js +22 -3
- package/src/lib/parse-json-option.js +35 -0
- package/src/lib/parse-number-option.js +27 -0
- package/src/lib/runnable-provider.js +97 -0
- package/src/repl/agent-repl.js +76 -17
- package/src/repl/config-summary.js +66 -0
- package/src/runtime/agent-core.js +189 -36
- package/src/runtime/headless-runner.js +49 -1
- package/src/runtime/headless-stream.js +34 -0
- package/src/assets/web-panel/assets/devWarning-D7iybGpP.js +0 -1
- package/src/assets/web-panel/assets/index-BzJrOJ0f.js +0 -1
- package/src/assets/web-panel/assets/index-QN-iyhAl.js +0 -1
package/src/commands/zkp.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { logger } from "../lib/logger.js";
|
|
8
|
+
import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
8
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
10
|
import {
|
|
10
11
|
ensureZKPTables,
|
|
@@ -100,10 +101,8 @@ export function registerZkpCommand(program) {
|
|
|
100
101
|
const db = ctx.db.getDatabase();
|
|
101
102
|
ensureZKPTables(db);
|
|
102
103
|
|
|
103
|
-
const privateInputs = options.private
|
|
104
|
-
|
|
105
|
-
: {};
|
|
106
|
-
const publicInputs = options.public ? JSON.parse(options.public) : [];
|
|
104
|
+
const privateInputs = parseJsonOption(options.private, "--private", {});
|
|
105
|
+
const publicInputs = parseJsonOption(options.public, "--public", []);
|
|
107
106
|
const proveOpts = options.scheme ? { scheme: options.scheme } : {};
|
|
108
107
|
const proof = generateProof(
|
|
109
108
|
db,
|
|
@@ -174,7 +173,7 @@ export function registerZkpCommand(program) {
|
|
|
174
173
|
.option("--json", "Output as JSON")
|
|
175
174
|
.action(async (options) => {
|
|
176
175
|
try {
|
|
177
|
-
const claims = options.claims
|
|
176
|
+
const claims = parseJsonOption(options.claims, "--claims", {});
|
|
178
177
|
const disclose = options.disclose
|
|
179
178
|
? options.disclose.split(",").map((s) => s.trim())
|
|
180
179
|
: [];
|
|
@@ -404,7 +403,7 @@ export function registerZkpCommand(program) {
|
|
|
404
403
|
const db = ctx.db.getDatabase();
|
|
405
404
|
ensureZKPTables(db);
|
|
406
405
|
|
|
407
|
-
const claims = options.claims
|
|
406
|
+
const claims = parseJsonOption(options.claims, "--claims", {});
|
|
408
407
|
const cred = registerCredential(db, {
|
|
409
408
|
did: options.did,
|
|
410
409
|
claims,
|
|
@@ -622,7 +621,7 @@ export function registerZkpCommand(program) {
|
|
|
622
621
|
}
|
|
623
622
|
const db = ctx.db.getDatabase();
|
|
624
623
|
ensureZKPTables(db);
|
|
625
|
-
const def = options.definition
|
|
624
|
+
const def = parseJsonOption(options.definition, "--definition", {});
|
|
626
625
|
const circuit = compileCircuitV2(db, {
|
|
627
626
|
name,
|
|
628
627
|
definition: def,
|
|
@@ -675,8 +674,8 @@ export function registerZkpCommand(program) {
|
|
|
675
674
|
ensureZKPTables(db);
|
|
676
675
|
const proof = generateProofV2(db, {
|
|
677
676
|
circuitId,
|
|
678
|
-
privateInputs:
|
|
679
|
-
publicInputs:
|
|
677
|
+
privateInputs: parseJsonOption(options.private, "--private"),
|
|
678
|
+
publicInputs: parseJsonOption(options.public, "--public"),
|
|
680
679
|
scheme: options.scheme,
|
|
681
680
|
});
|
|
682
681
|
logger.success("Proof generated (V2)");
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
detectTaskType,
|
|
17
17
|
selectModelForTask,
|
|
18
18
|
} from "../../lib/task-model-selector.js";
|
|
19
|
+
import { runnableTaskModel } from "../../lib/runnable-provider.js";
|
|
19
20
|
import { PlanState } from "../../lib/plan-mode.js";
|
|
20
21
|
import { CLISlotFiller } from "../../lib/slot-filler.js";
|
|
21
22
|
import { createAbortError, isAbortError } from "../../lib/abort-utils.js";
|
|
@@ -63,7 +64,9 @@ export class WSAgentHandler {
|
|
|
63
64
|
// Add user message
|
|
64
65
|
session.messages.push({ role: "user", content: userMessage });
|
|
65
66
|
|
|
66
|
-
// Auto-select model based on task type
|
|
67
|
+
// Auto-select model based on task type — runnable-first: never switch
|
|
68
|
+
// onto a provider with no usable key (you'd just 401). Keep the
|
|
69
|
+
// configured model in that case.
|
|
67
70
|
let activeModel = session.model;
|
|
68
71
|
const taskDetection = detectTaskType(userMessage);
|
|
69
72
|
if (taskDetection.confidence > 0.3) {
|
|
@@ -71,8 +74,14 @@ export class WSAgentHandler {
|
|
|
71
74
|
session.provider,
|
|
72
75
|
taskDetection.taskType,
|
|
73
76
|
);
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
const switchTo = runnableTaskModel({
|
|
78
|
+
provider: session.provider,
|
|
79
|
+
currentModel: activeModel,
|
|
80
|
+
recommended,
|
|
81
|
+
apiKey: session.apiKey,
|
|
82
|
+
});
|
|
83
|
+
if (switchTo) {
|
|
84
|
+
activeModel = switchTo;
|
|
76
85
|
this.interaction.emit("model-switch", {
|
|
77
86
|
requestId,
|
|
78
87
|
from: session.model,
|
|
@@ -855,6 +855,12 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
855
855
|
}
|
|
856
856
|
|
|
857
857
|
_startHeartbeat() {
|
|
858
|
+
// Idempotent: clear any existing timer first so a repeated start() (or a
|
|
859
|
+
// re-fired "listening" event) can't leak the previous interval — stop()
|
|
860
|
+
// only clears the most recent handle, so an overwrite would orphan it.
|
|
861
|
+
if (this._heartbeatTimer) {
|
|
862
|
+
clearInterval(this._heartbeatTimer);
|
|
863
|
+
}
|
|
858
864
|
this._heartbeatTimer = setInterval(() => {
|
|
859
865
|
for (const [clientId, client] of this.clients) {
|
|
860
866
|
if (!client.alive) {
|
|
@@ -9,12 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { fork } from "node:child_process";
|
|
12
|
-
import {
|
|
13
|
-
existsSync,
|
|
14
|
-
mkdirSync,
|
|
15
|
-
appendFileSync,
|
|
16
|
-
readFileSync,
|
|
17
|
-
} from "node:fs";
|
|
12
|
+
import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
|
|
18
13
|
import { join } from "node:path";
|
|
19
14
|
import { createHash } from "node:crypto";
|
|
20
15
|
import { EventEmitter } from "node:events";
|
|
@@ -38,7 +33,10 @@ export const TaskStatus = {
|
|
|
38
33
|
TIMEOUT: "timeout",
|
|
39
34
|
};
|
|
40
35
|
|
|
41
|
-
const RECOVERABLE_TASK_STATUSES = new Set([
|
|
36
|
+
const RECOVERABLE_TASK_STATUSES = new Set([
|
|
37
|
+
TaskStatus.PENDING,
|
|
38
|
+
TaskStatus.RUNNING,
|
|
39
|
+
]);
|
|
42
40
|
|
|
43
41
|
export class BackgroundTaskManager extends EventEmitter {
|
|
44
42
|
constructor(options = {}) {
|
|
@@ -47,7 +45,9 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
47
45
|
this.heartbeatTimeout = options.heartbeatTimeout || 60000;
|
|
48
46
|
this.historyLimit = options.historyLimit || 50;
|
|
49
47
|
this.nodeId =
|
|
50
|
-
options.nodeId ||
|
|
48
|
+
options.nodeId ||
|
|
49
|
+
process.env.CC_NODE_ID ||
|
|
50
|
+
`${process.pid}@${process.platform}`;
|
|
51
51
|
this.recoveryPolicy = options.recoveryPolicy || "claim-stale";
|
|
52
52
|
this.staleNodeTimeout = options.staleNodeTimeout || 5 * 60 * 1000;
|
|
53
53
|
this.tasks = new Map();
|
|
@@ -139,7 +139,12 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
139
139
|
child.on("exit", (code) => {
|
|
140
140
|
if (task.status === TaskStatus.RUNNING) {
|
|
141
141
|
if (code === 0) {
|
|
142
|
-
this._complete(
|
|
142
|
+
this._complete(
|
|
143
|
+
taskId,
|
|
144
|
+
TaskStatus.COMPLETED,
|
|
145
|
+
"Process exited (0)",
|
|
146
|
+
null,
|
|
147
|
+
);
|
|
143
148
|
} else {
|
|
144
149
|
this._complete(
|
|
145
150
|
taskId,
|
|
@@ -178,8 +183,12 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
178
183
|
|
|
179
184
|
getHistory(taskId, options = {}) {
|
|
180
185
|
const history = this.get(taskId)?.history || [];
|
|
181
|
-
const limit = Number.isFinite(options.limit)
|
|
182
|
-
|
|
186
|
+
const limit = Number.isFinite(options.limit)
|
|
187
|
+
? Math.max(1, options.limit)
|
|
188
|
+
: null;
|
|
189
|
+
const offset = Number.isFinite(options.offset)
|
|
190
|
+
? Math.max(0, options.offset)
|
|
191
|
+
: 0;
|
|
183
192
|
|
|
184
193
|
if (limit === null && offset === 0) {
|
|
185
194
|
return history;
|
|
@@ -192,7 +201,8 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
192
201
|
offset,
|
|
193
202
|
limit: limit || history.length,
|
|
194
203
|
hasMore: offset + items.length < history.length,
|
|
195
|
-
nextOffset:
|
|
204
|
+
nextOffset:
|
|
205
|
+
offset + items.length < history.length ? offset + items.length : null,
|
|
196
206
|
};
|
|
197
207
|
}
|
|
198
208
|
|
|
@@ -212,9 +222,16 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
212
222
|
const child = this.processes.get(taskId);
|
|
213
223
|
if (child) {
|
|
214
224
|
child.kill("SIGTERM");
|
|
215
|
-
|
|
225
|
+
// Escalate to SIGKILL only if SIGTERM didn't take. unref() + clear-on-exit
|
|
226
|
+
// so a prompt exit (or process shutdown right after stop) isn't held open
|
|
227
|
+
// for the full grace period by this timer.
|
|
228
|
+
const killTimer = setTimeout(() => {
|
|
216
229
|
if (child.exitCode === null) child.kill("SIGKILL");
|
|
217
230
|
}, 2000);
|
|
231
|
+
if (killTimer && typeof killTimer.unref === "function") killTimer.unref();
|
|
232
|
+
if (typeof child.once === "function") {
|
|
233
|
+
child.once("exit", () => clearTimeout(killTimer));
|
|
234
|
+
}
|
|
218
235
|
}
|
|
219
236
|
const task = this.tasks.get(taskId);
|
|
220
237
|
if (task) {
|
|
@@ -335,7 +352,8 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
335
352
|
}
|
|
336
353
|
|
|
337
354
|
_normalizePersistedTask(entry) {
|
|
338
|
-
const task =
|
|
355
|
+
const task =
|
|
356
|
+
entry?.kind === "task_snapshot" && entry.task ? entry.task : entry;
|
|
339
357
|
|
|
340
358
|
if (!task || typeof task !== "object") {
|
|
341
359
|
return null;
|
|
@@ -354,7 +372,11 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
354
372
|
if (normalized.history.length === 0) {
|
|
355
373
|
normalized.history.push({
|
|
356
374
|
event: "loaded",
|
|
357
|
-
timestamp:
|
|
375
|
+
timestamp:
|
|
376
|
+
normalized.completedAt ||
|
|
377
|
+
normalized.startedAt ||
|
|
378
|
+
normalized.createdAt ||
|
|
379
|
+
Date.now(),
|
|
358
380
|
status: normalized.status,
|
|
359
381
|
});
|
|
360
382
|
}
|
|
@@ -414,8 +436,10 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
414
436
|
|
|
415
437
|
_decideRecovery(task) {
|
|
416
438
|
const previousOwnerNodeId = task.ownerNodeId || null;
|
|
417
|
-
const sameNode =
|
|
418
|
-
|
|
439
|
+
const sameNode =
|
|
440
|
+
previousOwnerNodeId === this.nodeId || !previousOwnerNodeId;
|
|
441
|
+
const lastSeenAt =
|
|
442
|
+
task.lastHeartbeat || task.startedAt || task.createdAt || 0;
|
|
419
443
|
const stale = Date.now() - lastSeenAt > this.staleNodeTimeout;
|
|
420
444
|
|
|
421
445
|
if (sameNode) {
|
|
@@ -440,7 +464,9 @@ export class BackgroundTaskManager extends EventEmitter {
|
|
|
440
464
|
return {
|
|
441
465
|
shouldRecover: false,
|
|
442
466
|
policy: this.recoveryPolicy,
|
|
443
|
-
reason: stale
|
|
467
|
+
reason: stale
|
|
468
|
+
? "foreign-node-stale-observed"
|
|
469
|
+
: "foreign-node-active-observed",
|
|
444
470
|
previousOwnerNodeId,
|
|
445
471
|
};
|
|
446
472
|
}
|
|
@@ -33,6 +33,14 @@ export const ServerState = {
|
|
|
33
33
|
/** Transport kinds that carry a URL (no stdio process). */
|
|
34
34
|
const URL_TRANSPORTS = new Set(["http", "https", "sse", "ws", "wss"]);
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Default per-call timeout for HTTP MCP requests, mirroring the 30s stdio
|
|
38
|
+
* timeout so a hung/dead HTTP server can't block a request forever. Servers
|
|
39
|
+
* flagged `longRunning` (e.g. the IDE bridge, whose openDiff blocks on human
|
|
40
|
+
* review) are exempt; override per server with `config.requestTimeoutMs`.
|
|
41
|
+
*/
|
|
42
|
+
const HTTP_REQUEST_TIMEOUT_MS = 30000;
|
|
43
|
+
|
|
36
44
|
/**
|
|
37
45
|
* Infer the transport kind for a server config. Falls back to "stdio".
|
|
38
46
|
* Prefers an explicit `transport` field; otherwise derives from URL scheme
|
|
@@ -218,13 +226,32 @@ export class MCPClient extends EventEmitter {
|
|
|
218
226
|
this.emit("server-error", { name, error: data.toString("utf8") });
|
|
219
227
|
});
|
|
220
228
|
|
|
229
|
+
// If the server process dies with requests in flight, reject them
|
|
230
|
+
// immediately with a clear error instead of letting each hang until its
|
|
231
|
+
// 30s timeout (fail-fast on a crashed/exited MCP server).
|
|
232
|
+
const failPending = (errMsg) => {
|
|
233
|
+
for (const [, pending] of entry._pending) {
|
|
234
|
+
if (pending.timeout) clearTimeout(pending.timeout);
|
|
235
|
+
try {
|
|
236
|
+
pending.reject(new Error(errMsg));
|
|
237
|
+
} catch {
|
|
238
|
+
// already settled — ignore
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
entry._pending.clear();
|
|
242
|
+
};
|
|
243
|
+
|
|
221
244
|
proc.on("close", (code) => {
|
|
222
245
|
entry.state = ServerState.DISCONNECTED;
|
|
246
|
+
failPending(
|
|
247
|
+
`MCP server "${name}" process exited (code ${code}) before responding`,
|
|
248
|
+
);
|
|
223
249
|
this.emit("server-disconnected", { name, code });
|
|
224
250
|
});
|
|
225
251
|
|
|
226
252
|
proc.on("error", (err) => {
|
|
227
253
|
entry.state = ServerState.ERROR;
|
|
254
|
+
failPending(`MCP server "${name}" process error: ${err.message}`);
|
|
228
255
|
this.emit("server-error", { name, error: err.message });
|
|
229
256
|
});
|
|
230
257
|
} else {
|
|
@@ -247,12 +274,24 @@ export class MCPClient extends EventEmitter {
|
|
|
247
274
|
entry.serverInfo = initResult?.serverInfo || {};
|
|
248
275
|
entry.capabilities = initResult?.capabilities || {};
|
|
249
276
|
|
|
250
|
-
// Fetch available tools
|
|
277
|
+
// Fetch available tools. Per MCP a server advertises a `tools` capability
|
|
278
|
+
// in its initialize response; if it does and tools/list then fails, that
|
|
279
|
+
// is a genuine fetch failure we must surface (Claude-Code 2.1.181 — show
|
|
280
|
+
// "Connected · tools fetch failed" rather than a misleading "Tools: 0").
|
|
281
|
+
// A server that did not advertise tools simply has none, so a failure
|
|
282
|
+
// there is expected and stays quiet.
|
|
283
|
+
entry.tools = [];
|
|
284
|
+
entry.toolsError = null;
|
|
285
|
+
const advertisesTools =
|
|
286
|
+
entry.capabilities && entry.capabilities.tools !== undefined;
|
|
251
287
|
try {
|
|
252
288
|
const toolsResult = await this._sendRequest(name, "tools/list", {});
|
|
253
289
|
entry.tools = toolsResult?.tools || [];
|
|
254
|
-
} catch {
|
|
255
|
-
|
|
290
|
+
} catch (err) {
|
|
291
|
+
if (advertisesTools) {
|
|
292
|
+
entry.toolsError = err?.message || String(err);
|
|
293
|
+
}
|
|
294
|
+
// else: server did not advertise tools — legitimately none.
|
|
256
295
|
}
|
|
257
296
|
|
|
258
297
|
// Fetch available resources
|
|
@@ -275,11 +314,16 @@ export class MCPClient extends EventEmitter {
|
|
|
275
314
|
// Server may not support prompts
|
|
276
315
|
}
|
|
277
316
|
|
|
278
|
-
this.emit("server-connected", {
|
|
317
|
+
this.emit("server-connected", {
|
|
318
|
+
name,
|
|
319
|
+
tools: entry.tools.length,
|
|
320
|
+
toolsError: entry.toolsError,
|
|
321
|
+
});
|
|
279
322
|
return {
|
|
280
323
|
name,
|
|
281
324
|
state: entry.state,
|
|
282
325
|
tools: entry.tools,
|
|
326
|
+
toolsError: entry.toolsError,
|
|
283
327
|
resources: entry.resources,
|
|
284
328
|
prompts: entry.prompts,
|
|
285
329
|
serverInfo: entry.serverInfo,
|
|
@@ -338,6 +382,7 @@ export class MCPClient extends EventEmitter {
|
|
|
338
382
|
name,
|
|
339
383
|
state: entry.state,
|
|
340
384
|
tools: entry.tools.length,
|
|
385
|
+
toolsError: entry.toolsError || null,
|
|
341
386
|
resources: entry.resources.length,
|
|
342
387
|
prompts: (entry.prompts || []).length,
|
|
343
388
|
serverInfo: entry.serverInfo || {},
|
|
@@ -599,53 +644,87 @@ export class MCPClient extends EventEmitter {
|
|
|
599
644
|
headers["Mcp-Session-Id"] = entry.httpSessionId;
|
|
600
645
|
}
|
|
601
646
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
typeof response.text === "function" ? await response.text() : "";
|
|
621
|
-
throw new Error(
|
|
622
|
-
`HTTP ${response.status}${text ? `: ${text.slice(0, 200)}` : ""}`,
|
|
623
|
-
);
|
|
647
|
+
// Per-call timeout (parity with the 30s stdio timeout) so a hung or dead
|
|
648
|
+
// HTTP MCP server can't block the request forever. Servers flagged
|
|
649
|
+
// longRunning — e.g. the IDE bridge, whose openDiff blocks on human review
|
|
650
|
+
// (see ideServerToMcpConfig) — are exempt. Override per server with
|
|
651
|
+
// config.requestTimeoutMs (0 disables).
|
|
652
|
+
const longRunning = Boolean(entry.config && entry.config.longRunning);
|
|
653
|
+
const timeoutMs = Number.isFinite(entry.config?.requestTimeoutMs)
|
|
654
|
+
? entry.config.requestTimeoutMs
|
|
655
|
+
: HTTP_REQUEST_TIMEOUT_MS;
|
|
656
|
+
let controller = null;
|
|
657
|
+
let timer = null;
|
|
658
|
+
if (
|
|
659
|
+
!longRunning &&
|
|
660
|
+
timeoutMs > 0 &&
|
|
661
|
+
typeof AbortController === "function"
|
|
662
|
+
) {
|
|
663
|
+
controller = new AbortController();
|
|
664
|
+
timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
624
665
|
}
|
|
625
666
|
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
667
|
+
try {
|
|
668
|
+
const response = await _deps.fetch(entry.httpUrl, {
|
|
669
|
+
method: "POST",
|
|
670
|
+
headers,
|
|
671
|
+
body,
|
|
672
|
+
...(controller ? { signal: controller.signal } : {}),
|
|
673
|
+
});
|
|
629
674
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
);
|
|
640
|
-
}
|
|
675
|
+
// Capture session id (server may emit on initialize response only)
|
|
676
|
+
const sessionId =
|
|
677
|
+
(response.headers && typeof response.headers.get === "function"
|
|
678
|
+
? response.headers.get("mcp-session-id") ||
|
|
679
|
+
response.headers.get("Mcp-Session-Id")
|
|
680
|
+
: null) || null;
|
|
681
|
+
if (sessionId && !entry.httpSessionId) {
|
|
682
|
+
entry.httpSessionId = sessionId;
|
|
683
|
+
}
|
|
641
684
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
685
|
+
if (!response.ok) {
|
|
686
|
+
const text =
|
|
687
|
+
typeof response.text === "function" ? await response.text() : "";
|
|
688
|
+
throw new Error(
|
|
689
|
+
`HTTP ${response.status}${text ? `: ${text.slice(0, 200)}` : ""}`,
|
|
690
|
+
);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
const contentType = response.headers?.get
|
|
694
|
+
? String(response.headers.get("content-type") || "").toLowerCase()
|
|
695
|
+
: "";
|
|
696
|
+
|
|
697
|
+
let envelope;
|
|
698
|
+
if (contentType.includes("text/event-stream")) {
|
|
699
|
+
envelope = await _extractSseResponse(response, id);
|
|
700
|
+
} else {
|
|
701
|
+
envelope =
|
|
702
|
+
typeof response.json === "function"
|
|
703
|
+
? await response.json()
|
|
704
|
+
: JSON.parse(
|
|
705
|
+
typeof response.text === "function"
|
|
706
|
+
? await response.text()
|
|
707
|
+
: "",
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
if (!envelope || typeof envelope !== "object") {
|
|
712
|
+
throw new Error("Empty or invalid JSON-RPC response");
|
|
713
|
+
}
|
|
714
|
+
if (envelope.error) {
|
|
715
|
+
throw new Error(envelope.error.message || "Unknown error");
|
|
716
|
+
}
|
|
717
|
+
return envelope.result;
|
|
718
|
+
} catch (err) {
|
|
719
|
+
if (controller && controller.signal.aborted) {
|
|
720
|
+
throw new Error(
|
|
721
|
+
`Request timeout: ${method} (HTTP, no response in ${timeoutMs}ms)`,
|
|
722
|
+
);
|
|
723
|
+
}
|
|
724
|
+
throw err;
|
|
725
|
+
} finally {
|
|
726
|
+
if (timer) clearTimeout(timer);
|
|
647
727
|
}
|
|
648
|
-
return envelope.result;
|
|
649
728
|
}
|
|
650
729
|
|
|
651
730
|
/** Fire-and-forget JSON-RPC notification over HTTP. Errors swallowed. */
|
package/src/lib/agent-core.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* `../runtime/agent-core.js` as of the CLI Runtime Convergence roadmap
|
|
4
4
|
* (Phase 6b, 2026-04-09). This file is retained as a re-export shim for
|
|
5
5
|
* backwards compatibility and will be removed once all external consumers
|
|
6
|
-
* have migrated. Please import from
|
|
6
|
+
* have migrated. Please import from `packages/cli/src/runtime/agent-core.js`
|
|
7
|
+
* in new code.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
export {
|