chainlesschain 0.165.6 → 0.165.9
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/package.json +2 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-vfoDb6HZ.js → AIOps-DxwjrnEA.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Cm5f7p93.js → ActionButton-JdbYowzn.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-yRuvgWxa.js → Analytics-C06GCahv.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BROsC4h1.js → AppLayout-BUVEEyi1.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-CimHApb1.js → Artifacts-D_ORzkJd.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DI8kr8zI.js → Audit-8o_Y5ejG.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DSLzKy-n.js → BackgroundAgents-DrkHd5VU.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DkH_n2r1.js → Backup-CKBZCX11.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CKSrUoRA.js → BaseInput-C8HkI399.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-ClwfMXUS.js → Chat-zb2H2Wux.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CjMaqfL7.js → ChatBubbleRenderer-BDcNpU_F.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BYTehcQG.js → Checkbox-MwPtQmNz.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B8AMcp6J.js → Codegen-3p5QCkFK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BNSogPo3.js → Col-BPLlhn52.js} +1 -1
- package/src/assets/web-panel/assets/{Community-JxPvGb8O.js → Community-C-3dBNOM.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DF7bFAgE.js → Compact-BUcy-F_b.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bvhqnwrq.js → Compliance-CI8NxT8m.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BDS0CJvM.js → Cowork-DaDEBS-Q.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DqvRfxoQ.js → Cron-BSv9HXu5.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CDcIvnqS.js → Crosschain-yuiKlJmv.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D7jaUxU3.js → DID-D6LfldB0.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B5A18wEV.js → Dashboard-CBhLqG61.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-_6IVkGag.js → Dropdown-BG8pIl3O.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9PeiKCG.js → EmailListRenderer-CY92VIE6.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DXjuEHrX.js → FamilyGuardDashboard-1Q_ehauM.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B4IAR9zv.js → Federation-D3XirJIU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CxQeSNx1.js → FormItemContext-DfI9UuGZ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B8GS-Y3N.js → GenericCardRenderer-IeCZk2m7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BS8SouUX.js → Git-DzK4IJAZ.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Dq9aYb5Q.js → Governance-BHf5KfmQ.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BrCEe9AJ.js → Inference-BmaxSALS.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DybOpiY2.js → KnowledgeGraph-BgePFLA9.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DBpzbRfx.js → Logs-nqgxpOc4.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-xkX6izBt.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Cc7CCSCu.js → Marketplace-Bu8to-86.js} +1 -1
- package/src/assets/web-panel/assets/McpTools-BFWTzEk0.js +4 -0
- package/src/assets/web-panel/assets/{Memory-KCqlp9ol.js → Memory-B026G2GA.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bys84ySN.js → MobileBridge-CM2Eeg6I.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-B-6qU-je.js → MobileProjects-B79Ob3hy.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BgY-fvCq.js → Mtc-CxevSZuV.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-B8pCmqQJ.js → MtcAudit-X396cPEX.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BbOmYutA.js → Multisig-HWIB_aZ1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BocLQz_M.js → NLProgramming-gnYD1Xwy.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CSwbxEop.js → Notes-Dn2Gf_J1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CqFNSYG3.js → NotificationSettings-BRKBQ5rq.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C6gMfAk7.js → OrderTableRenderer-Dy___Cgo.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-QrDXVdMJ.js → Organization-cqfccxnt.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cxntotjt.js → Overflow-CSX4FHN3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CIdBOwNq.js → P2P-Bwa4aghp.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CT5aP8rD.js → PdhVaultBrowser-Dhszyjig.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DH7OM8XU.js → Permissions-CXzTyk6e.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CnJqbWce.js → PersonalDataHub-CFCAAJbb.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-5C3HG1kH.js → Pipeline-BPJbx6xt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B4yIp7xK.js → Privacy-BbiXvEHz.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BMvt-2M0.js → ProjectInit-B-s7-wSD.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CvSTEMRG.js → ProjectSettings-Dyug206y.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BKBJxEek.js → Projects-BtAI5Fwo.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BdwUqFWN.js → Providers-JpIPmz6N.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DtnCKlTm.js → QrScannerModal-CZdoN64A.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-sTbgwyNr.js → QuickAsk-BwvnoRIT.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bzr14gSb.js → Recommend-ASMlMQrD.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C_TF5IaJ.js → RemoteSession-BiJzKFKi.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-GCAM4H2K.js → Reputation-C80TWLIO.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dir0r6OQ.js → Row-C1VNmjmX.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CpGnlecX.js → RssFeed-T2MyGUlG.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DMMamC6u.js → Search-DXM6O83L.js} +1 -1
- package/src/assets/web-panel/assets/{Security-yqay5yG-.js → Security-nv69kU7W.js} +3 -3
- package/src/assets/web-panel/assets/{Services-C5i2wh9G.js → Services-AyHWe7Qj.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-vUqk35yj.js → Skeleton-D6PWLxFI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DzcSkhot.js → Skills-BqVeOmNQ.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CB6qbYNr.js → Sla-BegIPl9M.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BHUI7cox.js → SpeechSettings-CKJn3xk-.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D-RrsxTJ.js → SyncSettings-Th4cnAMl.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DFxdOJiq.js → Tasks-BuKfBroh.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-SKAob_Aq.js → Templates-CMuWN8Ac.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BPfsfHQ-.js → Tenant-C4je8E8Q.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-8iw7FpUf.js → Terminal-agJESOcO.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C4Gjj5Su.js → TimelineRenderer-D2qDuVZ_.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-COYhN18e.js → Tokens-Cvmn99rH.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B-JzXcf6.js → Trigger-D_QYIHH8.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BJ5bg0nI.js → Trust-BmzvQLnX.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BG_ByRMf.js → UkeySign-D_LopHwH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B3kOnSiU.js → VideoEditing-DoWl3PhQ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CcoGFnK7.js → Wallet-5NYcAkxe.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DdT8vRC_.js → WebAuthn-B-_Q3ewp.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-CZu3M9N8.js → WorkflowEditor-CHET-gi2.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DxJt3Qba.js → chat-C6nvb-n6.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DdYfwJaB.js → colors-CTDE9LTX.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BG3SUzwj.js → compact-item-KnemdF8D.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-By51z2-1.js → createContext-DUJR3Uek.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-1DqLH1KX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-B0apZ3KJ.js → hasIn-CFNTaby8.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZxtP8jG7.js → index-65HO56Bv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da_WBdLX.js → index-B8RtbSkV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBPf3TpM.js → index-BHqSqnW7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BP94CrBV.js → index-BTetEUWd.js} +1 -1
- package/src/assets/web-panel/assets/{index-p1_8SbI1.js → index-BXWg1crv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWF8_mkx.js → index-BdiC4LOs.js} +1 -1
- package/src/assets/web-panel/assets/index-BhJtcPWo.js +1 -0
- package/src/assets/web-panel/assets/{index-SQqOlR3d.js → index-BuizJo2E.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpjZhgNd.js → index-BwZM1rod.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzmQElZy.js → index-C96N9xeL.js} +1 -1
- package/src/assets/web-panel/assets/{index-bP_VlDb4.js → index-CHfUdnJH.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZFbps9po.js → index-CKvBF3Ov.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaIz0NAW.js → index-CSD9_I2_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BewKYrX9.js → index-Cc7dbl_p.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNIxXMmN.js → index-CcF0D7UZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q2SCX-MI.js → index-Ceu92a8D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE76D-kA.js → index-CnLpuTAU.js} +1 -1
- package/src/assets/web-panel/assets/index-Cq8MWPDT.js +1 -0
- package/src/assets/web-panel/assets/{index-BkvcEo4p.js → index-CquKnw5r.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp6e-hGw.js → index-CyEtHvEE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLIbGOLX.js → index-DF-fcTvQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCn8IcxV.js → index-DF1Y0Vuw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bissefox.js → index-DJyPeBBk.js} +3 -3
- package/src/assets/web-panel/assets/{index-BZ_0qm4g.js → index-DP-PbO11.js} +1 -1
- package/src/assets/web-panel/assets/{index-kf57LJ93.js → index-DZgCRMxk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYINoRLK.js → index-DfJzS3Qa.js} +1 -1
- package/src/assets/web-panel/assets/{index-3jWkIu5j.js → index-DqPpJkte.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5rLiEo0.js → index-DzReoLyh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW93tZDv.js → index-JGTiDeOW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1C9i79A.js → index-NUR0If7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAhHirVH.js → index-NtAcnJYW.js} +1 -1
- package/src/assets/web-panel/assets/{index-RD6O-0C6.js → index-OmuhFYKE.js} +1 -1
- package/src/assets/web-panel/assets/{index-oxRrmFO9.js → index-Wlc7o_C8.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3rWuPMW.js → index-bxTPfdri.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIrJfqO4.js → index-k6uorYmf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfWYsB9t.js → index-ox6mIwE2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bos5_aMV.js → index-rVDD7AAR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWEuZWCK.js → index-u0h6QqVV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dz49VOyQ.js → index-v-mtxmWH.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BWJktcg8.js → initDefaultProps-qEt8dI-t.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BEXBzUFV.js → motion-DetKPWy-.js} +1 -1
- package/src/assets/web-panel/assets/{move-BUKwn2sx.js → move-BeNYeDV2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-FTI7btqQ.js → mtc-parser-C0q0MK_T.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CsLtSPH3.js → omit-DLKkrKpE.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DWZxsT_S.js → pickAttrs-Bw1tWsY8.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bcfs43CX.js → placementArrow-DeesBLbd.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-a9bcC1p-.js → responsiveObserve-bqLhxHhn.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BDTzgOXN.js → slide-DGCXRoQm.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Iq1j_HUg.js → statusUtils-H-re3Egl.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DAZEYxeh.js → styleChecker-BXg4qGX_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DVkjyDrh.js → useFlexGapSupport-CKLb2KA6.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-wXTpNTHt.js → useFs-CTAhHeyw.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CtQM_aZr.js → usePersonalDataHub-BQ4pDh5g.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-hjEoG85v.js → vnode-jrSK6j4j.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BHVpyKg_.js → zoom-fOQE24pw.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +91 -60
- package/src/commands/git.js +39 -0
- package/src/commands/plugin.js +17 -2
- package/src/commands/session-group.js +131 -0
- package/src/commands/session-location.js +48 -0
- package/src/commands/session.js +11 -0
- package/src/commands/sync-providers.js +4 -1
- package/src/commands/update.js +1 -0
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/mcp-topic-handlers.js +167 -0
- package/src/gateways/ws/ws-agent-handler.js +20 -12
- package/src/harness/jsonl-session-store.js +279 -37
- package/src/harness/mcp-client.js +701 -91
- package/src/harness/session-index.js +15 -4
- package/src/lib/agent-network.js +166 -29
- package/src/lib/agent-router.js +62 -6
- package/src/lib/agent-sandbox.js +7 -1
- package/src/lib/agent-worktree.js +8 -1
- package/src/lib/auto-mode-safety-classifier.js +3 -17
- package/src/lib/background-agent-keeper-protocol.js +26 -6
- package/src/lib/background-agent-supervisor.js +17 -1
- package/src/lib/browser-evidence.js +1405 -0
- package/src/lib/chrome-connector.js +465 -79
- package/src/lib/claude-code-bridge.js +159 -54
- package/src/lib/claude-project-auto-memory.js +481 -0
- package/src/lib/claude-project-storage-layout.js +104 -0
- package/src/lib/cloud/cloud-client.js +40 -0
- package/src/lib/cowork-workflow.js +69 -6
- package/src/lib/execution-location-local-supervisor.mjs +226 -0
- package/src/lib/execution-location-runner-lifecycle.js +991 -0
- package/src/lib/execution-location-target-preflight.js +333 -0
- package/src/lib/execution-location-target.js +783 -13
- package/src/lib/external-agent-adapters.js +269 -0
- package/src/lib/file-lines.js +6 -1
- package/src/lib/gateway-client-resilience.js +571 -0
- package/src/lib/gitlab-mr-worktree.js +176 -0
- package/src/lib/hooks-v2-producers.js +119 -15
- package/src/lib/hooks-v2-workspace-context.js +44 -1
- package/src/lib/host-resource-budget.js +295 -0
- package/src/lib/ide-context.js +15 -2
- package/src/lib/ipfs-storage.js +127 -25
- package/src/lib/llm-config-defaults.js +43 -0
- package/src/lib/mcp-lifecycle-authority.js +887 -0
- package/src/lib/mcp-oauth.js +101 -20
- package/src/lib/mcp-tls.js +103 -3
- package/src/lib/orchestrator.js +47 -0
- package/src/lib/paths.js +260 -32
- package/src/lib/permission-request.js +48 -0
- package/src/lib/plugin-runtime/bin.js +3 -1
- package/src/lib/plugin-runtime/hooks.js +3 -1
- package/src/lib/plugin-runtime/install.js +117 -1
- package/src/lib/plugin-runtime/lsp.js +4 -4
- package/src/lib/plugin-runtime/marketplace-archive-source.js +40 -5
- package/src/lib/plugin-runtime/marketplace-catalog.js +13 -2
- package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
- package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +33 -8
- package/src/lib/plugin-runtime/mcp.js +3 -1
- package/src/lib/plugin-runtime/monitors.js +3 -1
- package/src/lib/plugin-runtime/remote-source.js +151 -6
- package/src/lib/plugin-runtime/settings.js +3 -1
- package/src/lib/plugin-runtime/trust.js +274 -13
- package/src/lib/process-execution-broker/credential-agent.js +210 -41
- package/src/lib/process-execution-broker/index.js +15 -1
- package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
- package/src/lib/project-mcp-trust.js +165 -10
- package/src/lib/resume-session.js +9 -6
- package/src/lib/session-core-singletons.js +26 -11
- package/src/lib/session-host-lease.js +52 -16
- package/src/lib/session-lifecycle-scope.js +153 -0
- package/src/lib/session-message-fabric.js +168 -21
- package/src/lib/session-projection.js +244 -4
- package/src/lib/session-store-guard.js +3 -1
- package/src/lib/session-workbench-store.js +466 -0
- package/src/lib/shell-approval.js +7 -5
- package/src/lib/spellcheck.js +211 -0
- package/src/lib/sub-agent-context.js +9 -9
- package/src/lib/sync-cli-db.js +485 -129
- package/src/lib/sync-credentials.js +31 -20
- package/src/lib/web-fetch.js +112 -40
- package/src/lib/web-search.js +127 -61
- package/src/lib/workflow-engine.js +42 -11
- package/src/lib/workspace-trust.js +793 -0
- package/src/repl/agent-repl.js +124 -5
- package/src/repl/permission-prompt.js +10 -12
- package/src/runtime/agent-core.js +311 -18
- package/src/runtime/agent-runtime.js +12 -1
- package/src/runtime/bootstrap.js +37 -13
- package/src/runtime/coding-agent-contract-shared.cjs +11 -4
- package/src/runtime/headless-runner.js +234 -36
- package/src/runtime/headless-stream.js +181 -6
- package/src/runtime/mcp-config.js +298 -8
- package/src/runtime/policies/agent-policy.js +8 -0
- package/src/runtime/status-diagnostics-lite.js +9 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +0 -1
- package/src/assets/web-panel/assets/McpTools-DFaIhOfu.js +0 -7
- package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +0 -1
- package/src/assets/web-panel/assets/index-BETiL0a3.js +0 -1
- package/src/assets/web-panel/assets/index-BhAVHuW8.js +0 -1
|
@@ -131,6 +131,9 @@ const ADMITTED_STEP_STATUSES = new Set([
|
|
|
131
131
|
"failed",
|
|
132
132
|
"partial",
|
|
133
133
|
"skipped",
|
|
134
|
+
"exhausted",
|
|
135
|
+
"upstream_failed",
|
|
136
|
+
"cancelled",
|
|
134
137
|
]);
|
|
135
138
|
const MAX_ADMITTED_RUN_STEPS = 64;
|
|
136
139
|
const MAX_ADMITTED_SNAPSHOT_NODES = 25_000;
|
|
@@ -948,6 +951,23 @@ export function validateWorkflow(wf) {
|
|
|
948
951
|
errors.push(`steps[${i}].maxIterations must be a positive integer`);
|
|
949
952
|
}
|
|
950
953
|
}
|
|
954
|
+
// forEach expands `stepId` into concrete runtime ids such as
|
|
955
|
+
// `stepId[0]`. A declarative step with the same id would overwrite the
|
|
956
|
+
// child result and make dependency/evidence accounting ambiguous.
|
|
957
|
+
for (const parent of wf.steps) {
|
|
958
|
+
if (parent?.forEach === undefined || typeof parent.id !== "string") {
|
|
959
|
+
continue;
|
|
960
|
+
}
|
|
961
|
+
const escapedParentId = parent.id.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
962
|
+
const childIdPattern = new RegExp(`^${escapedParentId}\\[\\d+\\]$`, "u");
|
|
963
|
+
for (const id of ids) {
|
|
964
|
+
if (childIdPattern.test(id)) {
|
|
965
|
+
errors.push(
|
|
966
|
+
`step id '${id}' collides with dynamic children of '${parent.id}'`,
|
|
967
|
+
);
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
}
|
|
951
971
|
// Check dependsOn references exist
|
|
952
972
|
for (const s of wf.steps) {
|
|
953
973
|
for (const dep of s.dependsOn || []) {
|
|
@@ -1682,7 +1702,7 @@ export async function runLoopStep({
|
|
|
1682
1702
|
}
|
|
1683
1703
|
const outcome = {
|
|
1684
1704
|
id: recordId,
|
|
1685
|
-
status: last ? last.status : "skipped",
|
|
1705
|
+
status: stopReason === "cap" ? "exhausted" : last ? last.status : "skipped",
|
|
1686
1706
|
taskId: last?.taskId ?? null,
|
|
1687
1707
|
result: {
|
|
1688
1708
|
...(last?.result || {}),
|
|
@@ -1694,6 +1714,35 @@ export async function runLoopStep({
|
|
|
1694
1714
|
return admitted ? normalizeAdmittedOutcome(outcome) : outcome;
|
|
1695
1715
|
}
|
|
1696
1716
|
|
|
1717
|
+
function dependencyBlock(step, resultsById) {
|
|
1718
|
+
const blocked = (step.dependsOn || [])
|
|
1719
|
+
.map((id) => resultsById.get(id))
|
|
1720
|
+
.filter((outcome) => outcome && outcome.status !== "completed");
|
|
1721
|
+
if (blocked.length === 0) return null;
|
|
1722
|
+
|
|
1723
|
+
const blockedRootCut = [
|
|
1724
|
+
...new Set(
|
|
1725
|
+
blocked.flatMap((outcome) =>
|
|
1726
|
+
Array.isArray(outcome.result?.blockedRootCut)
|
|
1727
|
+
? outcome.result.blockedRootCut
|
|
1728
|
+
: [outcome.id],
|
|
1729
|
+
),
|
|
1730
|
+
),
|
|
1731
|
+
];
|
|
1732
|
+
const allSkipped = blocked.every((outcome) => outcome.status === "skipped");
|
|
1733
|
+
return {
|
|
1734
|
+
id: step.id,
|
|
1735
|
+
status: allSkipped ? "skipped" : "upstream_failed",
|
|
1736
|
+
taskId: null,
|
|
1737
|
+
result: {
|
|
1738
|
+
summary: allSkipped
|
|
1739
|
+
? "skipped because an upstream dependency was skipped"
|
|
1740
|
+
: "blocked by an unsuccessful upstream dependency",
|
|
1741
|
+
blockedRootCut,
|
|
1742
|
+
},
|
|
1743
|
+
};
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1697
1746
|
// ─── Step node + no-barrier pipeline ──────────────────────────────────────────
|
|
1698
1747
|
|
|
1699
1748
|
/**
|
|
@@ -1726,6 +1775,12 @@ export async function runStepNode(step, ctx) {
|
|
|
1726
1775
|
};
|
|
1727
1776
|
};
|
|
1728
1777
|
|
|
1778
|
+
const blocked = dependencyBlock(step, resultsById);
|
|
1779
|
+
if (blocked) {
|
|
1780
|
+
resultsById.set(recordId, blocked);
|
|
1781
|
+
return { outcomes: [blocked], failed: blocked.status !== "skipped" };
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1729
1784
|
let runThis;
|
|
1730
1785
|
try {
|
|
1731
1786
|
runThis = shouldRunStep(step, resultsById);
|
|
@@ -1834,9 +1889,10 @@ export async function runStepNode(step, ctx) {
|
|
|
1834
1889
|
* No-barrier pipeline scheduler: start each step the instant *its own*
|
|
1835
1890
|
* dependencies finish, rather than waiting for the whole dependency level.
|
|
1836
1891
|
* Up to `maxParallel` step nodes run concurrently. On failure with
|
|
1837
|
-
* `continueOnError` off, no new steps are scheduled (in-flight ones finish)
|
|
1838
|
-
*
|
|
1839
|
-
*
|
|
1892
|
+
* `continueOnError` off, no new steps are scheduled (in-flight ones finish).
|
|
1893
|
+
* Unscheduled descendants receive the same dependency-derived terminal state
|
|
1894
|
+
* as the batch executor; unrelated work is marked skipped. Only the wall-clock
|
|
1895
|
+
* idle between levels differs.
|
|
1840
1896
|
*/
|
|
1841
1897
|
export async function runPipeline({
|
|
1842
1898
|
steps,
|
|
@@ -1886,9 +1942,9 @@ export async function runPipeline({
|
|
|
1886
1942
|
reject(fatalError);
|
|
1887
1943
|
return;
|
|
1888
1944
|
}
|
|
1889
|
-
for (const s of steps) {
|
|
1945
|
+
for (const s of topoSort(steps)) {
|
|
1890
1946
|
if (scheduled.has(s.id)) continue;
|
|
1891
|
-
const o = {
|
|
1947
|
+
const o = dependencyBlock(s, resultsById) || {
|
|
1892
1948
|
id: s.id,
|
|
1893
1949
|
status: "skipped",
|
|
1894
1950
|
taskId: null,
|
|
@@ -2196,6 +2252,13 @@ export async function executeWorkflow(options = {}) {
|
|
|
2196
2252
|
const runnable = []; // { step, message, recordId, parentId }
|
|
2197
2253
|
const preOutcomes = []; // outcomes produced synchronously (skipped)
|
|
2198
2254
|
for (const step of chunk) {
|
|
2255
|
+
const blocked = dependencyBlock(step, resultsById);
|
|
2256
|
+
if (blocked) {
|
|
2257
|
+
if (blocked.status !== "skipped") anyFailure = true;
|
|
2258
|
+
resultsById.set(step.id, blocked);
|
|
2259
|
+
preOutcomes.push(blocked);
|
|
2260
|
+
continue;
|
|
2261
|
+
}
|
|
2199
2262
|
if (anyFailure && !continueOnError) {
|
|
2200
2263
|
const outcome = {
|
|
2201
2264
|
id: step.id,
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import process from "node:process";
|
|
8
|
+
import {
|
|
9
|
+
samePathHandleFileIdentity,
|
|
10
|
+
withTrustedFileParentSync,
|
|
11
|
+
} from "./secure-file-identity.js";
|
|
12
|
+
|
|
13
|
+
const MEBIBYTE = 1024 * 1024;
|
|
14
|
+
const MAX_CAPTURED_MARKER_BYTES = 256;
|
|
15
|
+
const MAX_STDIN_BYTES = 64 * 1024 * 1024;
|
|
16
|
+
const CPU_LIMIT_SIGNALS = new Set(["SIGKILL", "SIGXCPU"]);
|
|
17
|
+
|
|
18
|
+
function parseArguments(argv) {
|
|
19
|
+
const separator = argv.indexOf("--");
|
|
20
|
+
assert.ok(separator >= 0, "local target supervisor requires --");
|
|
21
|
+
const control = argv.slice(0, separator);
|
|
22
|
+
const command = argv.slice(separator + 1);
|
|
23
|
+
const options = {};
|
|
24
|
+
for (let index = 0; index < control.length; index += 2) {
|
|
25
|
+
const key = control[index];
|
|
26
|
+
const value = control[index + 1];
|
|
27
|
+
assert.ok(key?.startsWith("--") && value, `invalid argument: ${key}`);
|
|
28
|
+
options[
|
|
29
|
+
key
|
|
30
|
+
.slice(2)
|
|
31
|
+
.replace(/-([a-z])/gu, (_, character) => character.toUpperCase())
|
|
32
|
+
] = value;
|
|
33
|
+
}
|
|
34
|
+
assert.ok(options.cwd && options.entry && command.length > 0);
|
|
35
|
+
const cpuSeconds = Number(options.cpuSeconds);
|
|
36
|
+
const memoryBytes = Number(options.memoryBytes);
|
|
37
|
+
assert.ok(
|
|
38
|
+
Number.isSafeInteger(cpuSeconds) && cpuSeconds >= 1 && cpuSeconds <= 86_400,
|
|
39
|
+
);
|
|
40
|
+
assert.ok(
|
|
41
|
+
Number.isSafeInteger(memoryBytes) &&
|
|
42
|
+
memoryBytes >= 64 * MEBIBYTE &&
|
|
43
|
+
memoryBytes <= 64 * 1024 * MEBIBYTE,
|
|
44
|
+
);
|
|
45
|
+
return { ...options, cpuSeconds, memoryBytes, command };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function boundedHeapMebibytes(memoryBytes) {
|
|
49
|
+
// V8's old-space boundary is a real child-process limit and is intentionally
|
|
50
|
+
// allowed to be stricter than the runner's total-memory ceiling. Keeping the
|
|
51
|
+
// probe at or below 256 MiB avoids consuming a multi-GiB hosted runner merely
|
|
52
|
+
// to prove that the target-side supervisor terminates the workload.
|
|
53
|
+
return Math.max(64, Math.min(256, Math.floor(memoryBytes / MEBIBYTE)));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function openStagedReplicaInput(inputPath) {
|
|
57
|
+
let descriptor = null;
|
|
58
|
+
try {
|
|
59
|
+
return withTrustedFileParentSync(
|
|
60
|
+
fs,
|
|
61
|
+
inputPath,
|
|
62
|
+
({ canonicalPath, parentDevice }) => {
|
|
63
|
+
const requested = fs.lstatSync(canonicalPath, { bigint: true });
|
|
64
|
+
assert.ok(
|
|
65
|
+
requested.isFile() &&
|
|
66
|
+
!requested.isSymbolicLink() &&
|
|
67
|
+
requested.size > 0n &&
|
|
68
|
+
requested.size <= BigInt(MAX_STDIN_BYTES),
|
|
69
|
+
"local target stdin file is invalid",
|
|
70
|
+
);
|
|
71
|
+
descriptor = fs.openSync(
|
|
72
|
+
canonicalPath,
|
|
73
|
+
fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0),
|
|
74
|
+
);
|
|
75
|
+
const opened = fs.fstatSync(descriptor, { bigint: true });
|
|
76
|
+
assert.ok(
|
|
77
|
+
opened.isFile() &&
|
|
78
|
+
opened.nlink === 1n &&
|
|
79
|
+
samePathHandleFileIdentity(requested, opened, parentDevice),
|
|
80
|
+
"local target stdin file changed while opening",
|
|
81
|
+
);
|
|
82
|
+
const stagedInput = fs.readFileSync(descriptor);
|
|
83
|
+
assert.equal(
|
|
84
|
+
BigInt(stagedInput.length),
|
|
85
|
+
requested.size,
|
|
86
|
+
"local target stdin file changed while reading",
|
|
87
|
+
);
|
|
88
|
+
return Object.freeze({ descriptor, stagedInput });
|
|
89
|
+
},
|
|
90
|
+
);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (descriptor !== null) fs.closeSync(descriptor);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function main() {
|
|
98
|
+
const options = parseArguments(process.argv.slice(2));
|
|
99
|
+
const resourceKind =
|
|
100
|
+
options.command[0] === "session" &&
|
|
101
|
+
options.command[1] === "location" &&
|
|
102
|
+
options.command[2] === "resource-probe"
|
|
103
|
+
? options.command[3]
|
|
104
|
+
: null;
|
|
105
|
+
const resume =
|
|
106
|
+
options.command[0] === "session" && options.command[1] === "resume";
|
|
107
|
+
const forwardsInput =
|
|
108
|
+
options.command[0] === "session" &&
|
|
109
|
+
options.command[1] === "location" &&
|
|
110
|
+
options.command[2] === "prepare";
|
|
111
|
+
if (options.stdinFile) {
|
|
112
|
+
assert.ok(
|
|
113
|
+
forwardsInput && path.isAbsolute(options.stdinFile),
|
|
114
|
+
"local target stdin file is invalid",
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
let inputDescriptor = null;
|
|
118
|
+
let stagedInput = null;
|
|
119
|
+
if (options.stdinFile) {
|
|
120
|
+
({ descriptor: inputDescriptor, stagedInput } = openStagedReplicaInput(
|
|
121
|
+
options.stdinFile,
|
|
122
|
+
));
|
|
123
|
+
}
|
|
124
|
+
const heapMebibytes = boundedHeapMebibytes(options.memoryBytes);
|
|
125
|
+
const childEnvironment = {
|
|
126
|
+
...process.env,
|
|
127
|
+
CC_EXECUTION_LOCATION_OBSERVED_CPU_SECONDS: String(options.cpuSeconds),
|
|
128
|
+
CC_EXECUTION_LOCATION_OBSERVED_MEMORY_BYTES: String(
|
|
129
|
+
heapMebibytes * MEBIBYTE,
|
|
130
|
+
),
|
|
131
|
+
CC_EXECUTION_LOCATION_RESOURCE_ENFORCEMENT: "target-supervisor",
|
|
132
|
+
};
|
|
133
|
+
let child;
|
|
134
|
+
try {
|
|
135
|
+
child = spawn(
|
|
136
|
+
process.execPath,
|
|
137
|
+
[
|
|
138
|
+
`--max-old-space-size=${heapMebibytes}`,
|
|
139
|
+
options.entry,
|
|
140
|
+
...options.command,
|
|
141
|
+
],
|
|
142
|
+
{
|
|
143
|
+
cwd: options.cwd,
|
|
144
|
+
env: childEnvironment,
|
|
145
|
+
shell: false,
|
|
146
|
+
stdio: [
|
|
147
|
+
resume || stagedInput !== null
|
|
148
|
+
? "pipe"
|
|
149
|
+
: forwardsInput
|
|
150
|
+
? "inherit"
|
|
151
|
+
: "ignore",
|
|
152
|
+
"pipe",
|
|
153
|
+
"inherit",
|
|
154
|
+
],
|
|
155
|
+
windowsHide: true,
|
|
156
|
+
},
|
|
157
|
+
);
|
|
158
|
+
} finally {
|
|
159
|
+
if (inputDescriptor !== null) fs.closeSync(inputDescriptor);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (resume) child.stdin.end("/exit\n", "utf8");
|
|
163
|
+
else if (stagedInput !== null) child.stdin.end(stagedInput);
|
|
164
|
+
let outputPrefix = "";
|
|
165
|
+
let cpuLimitReached = false;
|
|
166
|
+
let cpuTimer = null;
|
|
167
|
+
const armCpuLimit = () => {
|
|
168
|
+
if (cpuTimer !== null) return;
|
|
169
|
+
cpuTimer = setTimeout(() => {
|
|
170
|
+
cpuLimitReached = true;
|
|
171
|
+
child.kill("SIGKILL");
|
|
172
|
+
}, options.cpuSeconds * 1_000);
|
|
173
|
+
};
|
|
174
|
+
child.stdout.on("data", (chunk) => {
|
|
175
|
+
process.stdout.write(chunk);
|
|
176
|
+
if (outputPrefix.length < MAX_CAPTURED_MARKER_BYTES) {
|
|
177
|
+
outputPrefix += chunk
|
|
178
|
+
.toString("utf8")
|
|
179
|
+
.slice(0, MAX_CAPTURED_MARKER_BYTES - outputPrefix.length);
|
|
180
|
+
}
|
|
181
|
+
if (
|
|
182
|
+
resourceKind === "cpu" &&
|
|
183
|
+
outputPrefix.includes("CC_EXECUTION_LOCATION_RESOURCE_PROBE_ARMED:cpu")
|
|
184
|
+
) {
|
|
185
|
+
// Startup and module loading are not the probed workload. Arm the
|
|
186
|
+
// target-side CPU boundary only after the fixed command proves that its
|
|
187
|
+
// busy loop is live; otherwise slow filesystem I/O could masquerade as
|
|
188
|
+
// CPU enforcement on hosted Windows or macOS.
|
|
189
|
+
armCpuLimit();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const forwardSignal = () => child.kill("SIGTERM");
|
|
194
|
+
process.once("SIGTERM", forwardSignal);
|
|
195
|
+
const result = await new Promise((resolve, reject) => {
|
|
196
|
+
child.once("error", reject);
|
|
197
|
+
child.once("exit", (code, signal) => resolve({ code, signal }));
|
|
198
|
+
});
|
|
199
|
+
if (cpuTimer !== null) clearTimeout(cpuTimer);
|
|
200
|
+
process.removeListener("SIGTERM", forwardSignal);
|
|
201
|
+
|
|
202
|
+
const expectedMarker = resourceKind
|
|
203
|
+
? `CC_EXECUTION_LOCATION_RESOURCE_PROBE_ARMED:${resourceKind}`
|
|
204
|
+
: null;
|
|
205
|
+
const armed =
|
|
206
|
+
expectedMarker !== null && outputPrefix.includes(expectedMarker);
|
|
207
|
+
if (
|
|
208
|
+
resourceKind === "cpu" &&
|
|
209
|
+
armed &&
|
|
210
|
+
(cpuLimitReached || CPU_LIMIT_SIGNALS.has(result.signal))
|
|
211
|
+
) {
|
|
212
|
+
process.exitCode = 152;
|
|
213
|
+
} else if (
|
|
214
|
+
resourceKind === "memory" &&
|
|
215
|
+
armed &&
|
|
216
|
+
(result.code !== 0 || result.signal !== null)
|
|
217
|
+
) {
|
|
218
|
+
process.exitCode = 137;
|
|
219
|
+
} else if (result.signal !== null) {
|
|
220
|
+
process.exitCode = 128;
|
|
221
|
+
} else {
|
|
222
|
+
process.exitCode = Number(result.code || 0);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
await main();
|