chainlesschain 0.162.197 → 0.162.200
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/chainlesschain.js +14 -6
- package/package.json +4 -1
- package/scripts/command-lifecycle-report.mjs +94 -0
- package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
- package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
- package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
- package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
- package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
- package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
- package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
- package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
- package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
- package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
- package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
- package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
- package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
- package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +4 -4
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +145 -0
- package/src/commands/mcp.js +244 -7
- package/src/commands/serve.js +1 -1
- package/src/commands/session-show.js +129 -0
- package/src/commands/session.js +97 -145
- package/src/commands/skill.js +87 -50
- package/src/data/changelog.json +40 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +39 -1
- package/src/harness/jsonl-session-store.js +1547 -127
- package/src/harness/mcp-client.js +2690 -409
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +210 -7
- package/src/lazy-dispatch.js +76 -8
- package/src/lib/abort-utils.js +68 -0
- package/src/lib/agent-core.js +1 -59
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/chat-core.js +24 -6
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/cowork-mcp-tools.js +47 -2
- package/src/lib/cowork-task-runner.js +11 -3
- package/src/lib/doctor-checkup.js +9 -7
- package/src/lib/learning/skill-improver.js +21 -2
- package/src/lib/mcp-call-ledger-store.js +116 -3
- package/src/lib/mcp-call-ledger.js +59 -14
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +1133 -0
- package/src/lib/mcp-stdio-execution-authority.js +363 -0
- package/src/lib/mcp-stdio-package-materialization.js +1424 -0
- package/src/lib/mcp-tool-metadata.js +436 -0
- package/src/lib/mcp-tool-result.js +367 -0
- package/src/lib/observability/index.js +71 -0
- package/src/lib/packer/native-update-state.js +979 -1
- package/src/lib/packer/pack-update-applier.js +1050 -125
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/paths.js +53 -0
- package/src/lib/pr-link-ledger.js +8 -27
- package/src/lib/pr-link-store.js +26 -0
- package/src/lib/process-execution-broker/index.js +192 -35
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- package/src/lib/process-tree-termination.js +253 -0
- package/src/lib/recent-session.js +17 -17
- package/src/lib/secure-file-identity.js +47 -0
- package/src/lib/secure-fs.js +21 -2
- package/src/lib/session-anti-rollback-anchor.js +766 -0
- package/src/lib/session-host-lease.js +492 -0
- package/src/lib/session-host-snapshot.js +9 -5
- package/src/lib/session-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-projection.js +5 -1
- package/src/lib/session-search.js +25 -11
- package/src/lib/session-tail.js +31 -1
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-budget.js +222 -0
- package/src/lib/skill-execution-authority.js +385 -0
- package/src/lib/skill-execution-identity.js +39 -2
- package/src/lib/skill-loader.js +322 -86
- package/src/lib/skill-mcp.js +43 -1
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +483 -77
- package/src/repl/bg-dashboard.js +81 -28
- package/src/repl/chat-repl.js +77 -12
- package/src/runtime/agent-core.js +428 -113
- package/src/runtime/agent-runtime.js +26 -3
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +494 -149
- package/src/runtime/headless-stream.js +504 -75
- package/src/runtime/mcp-config.js +157 -10
- package/src/runtime/mcp-tool-search.js +0 -0
- package/src/runtime/output-backpressure.js +419 -0
- package/src/runtime/pipe-safety.js +56 -21
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
- package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
- package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
- package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
- package/src/lib/skill-process-broker.js +0 -85
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import fs from "fs";
|
|
15
15
|
import { firstBalancedJson } from "../json-schema-output.js";
|
|
16
16
|
import path from "path";
|
|
17
|
+
import { assertSkillFileSize, resolveSkillLimits } from "../skill-budget.js";
|
|
17
18
|
|
|
18
19
|
// ── _deps for test injection ────────────────────────────
|
|
19
20
|
const _deps = { fs, path };
|
|
@@ -187,13 +188,14 @@ export class SkillImprover {
|
|
|
187
188
|
* @param {import("better-sqlite3").Database} db
|
|
188
189
|
* @param {function} llmChat — async (messages) => string
|
|
189
190
|
* @param {import("./trajectory-store.js").TrajectoryStore} trajectoryStore
|
|
190
|
-
* @param {{skillsDir?:string}} [config]
|
|
191
|
+
* @param {{skillsDir?:string, limits?:object}} [config]
|
|
191
192
|
*/
|
|
192
193
|
constructor(db, llmChat, trajectoryStore, config = {}) {
|
|
193
194
|
this.db = db;
|
|
194
195
|
this.llmChat = llmChat;
|
|
195
196
|
this.trajectoryStore = trajectoryStore;
|
|
196
197
|
this.skillsDir = config.skillsDir || null;
|
|
198
|
+
this.skillLimits = resolveSkillLimits(config.limits);
|
|
197
199
|
}
|
|
198
200
|
|
|
199
201
|
/**
|
|
@@ -392,7 +394,19 @@ export class SkillImprover {
|
|
|
392
394
|
if (!this.skillsDir) return null;
|
|
393
395
|
const skillFile = _deps.path.join(this.skillsDir, skillName, "SKILL.md");
|
|
394
396
|
try {
|
|
395
|
-
|
|
397
|
+
if (typeof _deps.fs.promises.lstat === "function") {
|
|
398
|
+
const stat = await _deps.fs.promises.lstat(skillFile);
|
|
399
|
+
if (stat.isSymbolicLink() || !stat.isFile()) return null;
|
|
400
|
+
assertSkillFileSize("SKILL.md", stat.size, this.skillLimits);
|
|
401
|
+
}
|
|
402
|
+
const content = await _deps.fs.promises.readFile(skillFile, "utf-8");
|
|
403
|
+
if (typeof content !== "string") return null;
|
|
404
|
+
assertSkillFileSize(
|
|
405
|
+
"SKILL.md",
|
|
406
|
+
Buffer.byteLength(content, "utf8"),
|
|
407
|
+
this.skillLimits,
|
|
408
|
+
);
|
|
409
|
+
return content;
|
|
396
410
|
} catch {
|
|
397
411
|
return null;
|
|
398
412
|
}
|
|
@@ -405,6 +419,11 @@ export class SkillImprover {
|
|
|
405
419
|
*/
|
|
406
420
|
async _writeSkill(skillName, content) {
|
|
407
421
|
if (!this.skillsDir) return;
|
|
422
|
+
assertSkillFileSize(
|
|
423
|
+
"SKILL.md",
|
|
424
|
+
Buffer.byteLength(String(content), "utf8"),
|
|
425
|
+
this.skillLimits,
|
|
426
|
+
);
|
|
408
427
|
const skillDir = _deps.path.join(this.skillsDir, skillName);
|
|
409
428
|
const skillFile = _deps.path.join(skillDir, "SKILL.md");
|
|
410
429
|
await _deps.fs.promises.mkdir(skillDir, { recursive: true });
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { isProxy } from "node:util/types";
|
|
11
11
|
import {
|
|
12
12
|
appendAuthorityEvent as storeAppendAuthorityEvent,
|
|
13
|
+
appendAuthorityEventWithVerifiedProjection as storeAppendAuthorityEventWithVerifiedProjection,
|
|
13
14
|
readVerifiedEvents as storeReadVerifiedEvents,
|
|
14
15
|
readVerifiedProjection as storeReadVerifiedProjection,
|
|
15
16
|
} from "../harness/jsonl-session-store.js";
|
|
@@ -514,6 +515,53 @@ export function computeMcpRecoveryDigest(recovery = {}) {
|
|
|
514
515
|
});
|
|
515
516
|
}
|
|
516
517
|
|
|
518
|
+
/**
|
|
519
|
+
* Stable host generation fence. Ordinary transcript messages and this host's
|
|
520
|
+
* own started/settled records do not rotate it; adjudication, replay denies or
|
|
521
|
+
* integrity incidents do. A host must reload a newly verified projection to
|
|
522
|
+
* adopt a changed fence.
|
|
523
|
+
*/
|
|
524
|
+
export function computeMcpRecoveryFenceDigest(recovery = {}) {
|
|
525
|
+
const incidents = Array.isArray(recovery.incidents) ? recovery.incidents : [];
|
|
526
|
+
const adjudications = Array.isArray(recovery.adjudications)
|
|
527
|
+
? recovery.adjudications
|
|
528
|
+
: [];
|
|
529
|
+
const replayDenied = Array.isArray(recovery.replayDenied)
|
|
530
|
+
? recovery.replayDenied
|
|
531
|
+
: [];
|
|
532
|
+
return sha256PayloadDigest({
|
|
533
|
+
schemaVersion: 1,
|
|
534
|
+
sessionId: recovery.sessionId || null,
|
|
535
|
+
incidents: stableSorted(
|
|
536
|
+
incidents.map((entry) => ({
|
|
537
|
+
code: entry?.code || null,
|
|
538
|
+
ledgerId: entry?.ledgerId || null,
|
|
539
|
+
})),
|
|
540
|
+
),
|
|
541
|
+
adjudications: stableSorted(
|
|
542
|
+
adjudications.map((entry) => ({
|
|
543
|
+
requestId: entry?.requestId || null,
|
|
544
|
+
ledgerId: entry?.ledgerId || null,
|
|
545
|
+
decision: entry?.decision || null,
|
|
546
|
+
authority: entry?.authority || null,
|
|
547
|
+
confirmation: entry?.confirmation || null,
|
|
548
|
+
reasonDigest: entry?.reasonDigest || null,
|
|
549
|
+
})),
|
|
550
|
+
),
|
|
551
|
+
replayDenied: stableSorted(
|
|
552
|
+
replayDenied.map((entry) => ({
|
|
553
|
+
ledgerId: entry?.ledgerId || null,
|
|
554
|
+
serverName: entry?.serverName || null,
|
|
555
|
+
toolName: entry?.toolName || null,
|
|
556
|
+
inputBytes: Number.isSafeInteger(entry?.inputBytes)
|
|
557
|
+
? entry.inputBytes
|
|
558
|
+
: null,
|
|
559
|
+
replayDigest: entry?.replayDigest || null,
|
|
560
|
+
})),
|
|
561
|
+
),
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
|
|
517
565
|
function immutableRecordMatches(started, settled) {
|
|
518
566
|
return IMMUTABLE_RECORD_FIELDS.every(
|
|
519
567
|
(field) =>
|
|
@@ -634,6 +682,18 @@ export function snapshotMcpLedgerRecoveryProjection(sessionId, recovery) {
|
|
|
634
682
|
/** Create the async sink accepted by `McpCallLedger`. */
|
|
635
683
|
export function createSessionMcpLedgerSink(sessionId, options = {}) {
|
|
636
684
|
const appendEvent = options.appendEvent || storeAppendAuthorityEvent;
|
|
685
|
+
const appendFencedEvent =
|
|
686
|
+
options.appendFencedEvent ||
|
|
687
|
+
storeAppendAuthorityEventWithVerifiedProjection;
|
|
688
|
+
let recoveryFenceDigest = Object.prototype.hasOwnProperty.call(
|
|
689
|
+
options,
|
|
690
|
+
"recovery",
|
|
691
|
+
)
|
|
692
|
+
? computeMcpRecoveryFenceDigest({
|
|
693
|
+
...(options.recovery || {}),
|
|
694
|
+
sessionId,
|
|
695
|
+
})
|
|
696
|
+
: null;
|
|
637
697
|
if (
|
|
638
698
|
!isCanonicalProtocolText(
|
|
639
699
|
sessionId,
|
|
@@ -645,8 +705,11 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
|
|
|
645
705
|
if (typeof appendEvent !== "function") {
|
|
646
706
|
throw new TypeError("MCP ledger session sink requires appendEvent");
|
|
647
707
|
}
|
|
708
|
+
if (typeof appendFencedEvent !== "function") {
|
|
709
|
+
throw new TypeError("MCP ledger session sink requires appendFencedEvent");
|
|
710
|
+
}
|
|
648
711
|
|
|
649
|
-
|
|
712
|
+
const sink = async (record, metadata = {}) => {
|
|
650
713
|
const canonical = canonicalRecord(record);
|
|
651
714
|
if (!canonical) {
|
|
652
715
|
throw new McpCallLedgerStoreError(
|
|
@@ -678,16 +741,57 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
|
|
|
678
741
|
);
|
|
679
742
|
}
|
|
680
743
|
try {
|
|
681
|
-
const
|
|
744
|
+
const eventData = {
|
|
682
745
|
schemaVersion: MCP_CALL_LEDGER_EVENT_SCHEMA_VERSION,
|
|
683
746
|
phase,
|
|
684
747
|
record: canonical,
|
|
685
|
-
}
|
|
748
|
+
};
|
|
749
|
+
const written = recoveryFenceDigest
|
|
750
|
+
? await appendFencedEvent(sessionId, MCP_CALL_LEDGER_EVENT, eventData, {
|
|
751
|
+
createProjection: () => {
|
|
752
|
+
const reducer = createMcpLedgerEventReducer({
|
|
753
|
+
sessionId,
|
|
754
|
+
verified: true,
|
|
755
|
+
});
|
|
756
|
+
let acceptedCount = 0;
|
|
757
|
+
return Object.freeze({
|
|
758
|
+
accept: (event) => {
|
|
759
|
+
acceptedCount += 1;
|
|
760
|
+
return reducer.accept(event);
|
|
761
|
+
},
|
|
762
|
+
finish: (authority) => {
|
|
763
|
+
const recovery = reducer.finish();
|
|
764
|
+
assertMcpVerifiedProjectionAuthority(authority, {
|
|
765
|
+
acceptedCount,
|
|
766
|
+
headHash: recovery.headHash,
|
|
767
|
+
});
|
|
768
|
+
return recovery;
|
|
769
|
+
},
|
|
770
|
+
});
|
|
771
|
+
},
|
|
772
|
+
validateProjection: (recovery) => {
|
|
773
|
+
const currentFence = computeMcpRecoveryFenceDigest(recovery);
|
|
774
|
+
if (currentFence !== recoveryFenceDigest) {
|
|
775
|
+
throw new McpCallLedgerStoreError(
|
|
776
|
+
"CC_MCP_LEDGER_HOST_FENCE_STALE",
|
|
777
|
+
"MCP host recovery authority changed; restart or resume before executing MCP calls",
|
|
778
|
+
{ sessionId, ledgerId: canonical.ledgerId },
|
|
779
|
+
);
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
})
|
|
783
|
+
: await appendEvent(sessionId, MCP_CALL_LEDGER_EVENT, eventData);
|
|
686
784
|
if (written === false) {
|
|
687
785
|
throw new Error("canonical session store rejected the event");
|
|
688
786
|
}
|
|
689
787
|
return true;
|
|
690
788
|
} catch (cause) {
|
|
789
|
+
if (
|
|
790
|
+
cause instanceof McpCallLedgerStoreError &&
|
|
791
|
+
cause.code === "CC_MCP_LEDGER_HOST_FENCE_STALE"
|
|
792
|
+
) {
|
|
793
|
+
throw cause;
|
|
794
|
+
}
|
|
691
795
|
throw new McpCallLedgerStoreError(
|
|
692
796
|
"CC_MCP_LEDGER_EVENT_PERSIST_FAILED",
|
|
693
797
|
`MCP ledger event persistence failed for ${sessionId}: ${cause.message}`,
|
|
@@ -695,6 +799,15 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
|
|
|
695
799
|
);
|
|
696
800
|
}
|
|
697
801
|
};
|
|
802
|
+
sink.replaceRecoveryFence = (recovery) => {
|
|
803
|
+
recoveryFenceDigest = computeMcpRecoveryFenceDigest({
|
|
804
|
+
...(recovery || {}),
|
|
805
|
+
sessionId,
|
|
806
|
+
});
|
|
807
|
+
return recoveryFenceDigest;
|
|
808
|
+
};
|
|
809
|
+
sink.getRecoveryFenceDigest = () => recoveryFenceDigest;
|
|
810
|
+
return sink;
|
|
698
811
|
}
|
|
699
812
|
|
|
700
813
|
/**
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { createHash, randomUUID as nodeRandomUUID } from "node:crypto";
|
|
2
2
|
import { isProxy } from "node:util/types";
|
|
3
|
+
import {
|
|
4
|
+
admitMcpToolResult,
|
|
5
|
+
resolveMcpToolResultLimits,
|
|
6
|
+
} from "./mcp-tool-result.js";
|
|
3
7
|
|
|
4
8
|
export const MCP_CALL_LEDGER_SCHEMA_VERSION = 1;
|
|
5
9
|
|
|
@@ -413,16 +417,41 @@ function frozenSnapshot(record) {
|
|
|
413
417
|
return Object.freeze(snapshot);
|
|
414
418
|
}
|
|
415
419
|
|
|
420
|
+
function safeOwnDataProperty(value, property) {
|
|
421
|
+
if (!value || (typeof value !== "object" && typeof value !== "function")) {
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
if (isProxy(value)) return undefined;
|
|
426
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, property);
|
|
427
|
+
return descriptor && Object.hasOwn(descriptor, "value")
|
|
428
|
+
? descriptor.value
|
|
429
|
+
: undefined;
|
|
430
|
+
} catch {
|
|
431
|
+
return undefined;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
416
435
|
function summarizeError(error) {
|
|
417
|
-
const
|
|
436
|
+
const errorMessage = safeOwnDataProperty(error, "message");
|
|
437
|
+
const message =
|
|
438
|
+
typeof error === "string" && error
|
|
439
|
+
? error
|
|
440
|
+
: typeof errorMessage === "string" && errorMessage
|
|
441
|
+
? errorMessage
|
|
442
|
+
: "unknown error";
|
|
443
|
+
const errorName = safeOwnDataProperty(error, "name");
|
|
444
|
+
const errorCode = safeOwnDataProperty(error, "code");
|
|
418
445
|
return Object.freeze({
|
|
419
446
|
name: safeIdentifier(
|
|
420
|
-
|
|
447
|
+
typeof errorName === "string" ? errorName : null,
|
|
421
448
|
"Error",
|
|
422
449
|
MCP_CALL_LEDGER_PROTOCOL_LIMITS.errorName,
|
|
423
450
|
),
|
|
424
451
|
code: safeIdentifier(
|
|
425
|
-
|
|
452
|
+
typeof errorCode === "string" || Number.isSafeInteger(errorCode)
|
|
453
|
+
? errorCode
|
|
454
|
+
: null,
|
|
426
455
|
null,
|
|
427
456
|
MCP_CALL_LEDGER_PROTOCOL_LIMITS.errorCode,
|
|
428
457
|
),
|
|
@@ -431,19 +460,22 @@ function summarizeError(error) {
|
|
|
431
460
|
}
|
|
432
461
|
|
|
433
462
|
function normalizeStatus(outcome = {}) {
|
|
434
|
-
|
|
435
|
-
|
|
463
|
+
const explicitStatus = safeOwnDataProperty(outcome, "status");
|
|
464
|
+
if (typeof explicitStatus === "string" && explicitStatus) {
|
|
465
|
+
const status = explicitStatus.toLowerCase();
|
|
436
466
|
if (!TERMINAL_STATUSES.has(status)) {
|
|
437
|
-
throw new TypeError(
|
|
438
|
-
`Invalid MCP ledger terminal status "${outcome.status}"`,
|
|
439
|
-
);
|
|
467
|
+
throw new TypeError(`Invalid MCP ledger terminal status "${status}"`);
|
|
440
468
|
}
|
|
441
469
|
return status;
|
|
442
470
|
}
|
|
443
|
-
|
|
471
|
+
const error = safeOwnDataProperty(outcome, "error");
|
|
472
|
+
if (
|
|
473
|
+
safeOwnDataProperty(outcome, "cancelled") === true ||
|
|
474
|
+
safeOwnDataProperty(error, "name") === "AbortError"
|
|
475
|
+
) {
|
|
444
476
|
return McpCallStatus.CANCELLED;
|
|
445
477
|
}
|
|
446
|
-
return
|
|
478
|
+
return error ? McpCallStatus.FAILED : McpCallStatus.COMPLETED;
|
|
447
479
|
}
|
|
448
480
|
|
|
449
481
|
function resolveSinkWriter(sink) {
|
|
@@ -492,6 +524,14 @@ export class McpCallLedger {
|
|
|
492
524
|
this._randomUUID = options.randomUUID || nodeRandomUUID;
|
|
493
525
|
this._sequence = 0;
|
|
494
526
|
this._records = new Map();
|
|
527
|
+
const toolResultLimits = resolveMcpToolResultLimits(
|
|
528
|
+
options.toolResultConfig,
|
|
529
|
+
);
|
|
530
|
+
this._toolResultConfig = Object.freeze({
|
|
531
|
+
maxToolResultBytes: toolResultLimits.maxBytes,
|
|
532
|
+
maxToolResultDepth: toolResultLimits.maxDepth,
|
|
533
|
+
maxToolResultNodes: toolResultLimits.maxNodes,
|
|
534
|
+
});
|
|
495
535
|
|
|
496
536
|
const requested = options.prewriteFailurePolicy || {};
|
|
497
537
|
for (const [effect, action] of Object.entries(requested)) {
|
|
@@ -670,12 +710,17 @@ export class McpCallLedger {
|
|
|
670
710
|
Object.prototype.hasOwnProperty.call(outcome, "result");
|
|
671
711
|
const output = hasOutput
|
|
672
712
|
? summarizeMcpPayload(
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
713
|
+
admitMcpToolResult(
|
|
714
|
+
null,
|
|
715
|
+
Object.prototype.hasOwnProperty.call(outcome, "output")
|
|
716
|
+
? outcome.output
|
|
717
|
+
: outcome.result,
|
|
718
|
+
this._toolResultConfig,
|
|
719
|
+
).result,
|
|
676
720
|
)
|
|
677
721
|
: null;
|
|
678
|
-
const
|
|
722
|
+
const outcomeError = safeOwnDataProperty(outcome, "error");
|
|
723
|
+
const errorSummary = outcomeError ? summarizeError(outcomeError) : null;
|
|
679
724
|
const settlementPersistence =
|
|
680
725
|
current.prewritePersistence === "failed-open"
|
|
681
726
|
? "skipped-no-prewrite"
|
package/src/lib/mcp-client.js
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment policy shared by MCP stdio materialization and runtime launch.
|
|
3
|
+
* These variables can cause a language runtime or native loader to execute
|
|
4
|
+
* bytes that are outside the approved executable/package identity.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const CODE_INJECTION_ENV_KEYS = new Set([
|
|
8
|
+
"CLASSPATH",
|
|
9
|
+
"DOTNET_ADDITIONAL_DEPS",
|
|
10
|
+
"DOTNET_ROOT",
|
|
11
|
+
"JAVA_TOOL_OPTIONS",
|
|
12
|
+
"LD_AUDIT",
|
|
13
|
+
"LD_LIBRARY_PATH",
|
|
14
|
+
"LD_PRELOAD",
|
|
15
|
+
"NODE_OPTIONS",
|
|
16
|
+
"NODE_PATH",
|
|
17
|
+
"NPM_CONFIG_NODE_OPTIONS",
|
|
18
|
+
"PERL5LIB",
|
|
19
|
+
"PERL5OPT",
|
|
20
|
+
"PYTHONHOME",
|
|
21
|
+
"PYTHONPATH",
|
|
22
|
+
"RUBYLIB",
|
|
23
|
+
"RUBYOPT",
|
|
24
|
+
"_JAVA_OPTIONS",
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
export function isMcpStdioCodeInjectionEnvironmentKey(key) {
|
|
28
|
+
const normalized = String(key || "").toUpperCase();
|
|
29
|
+
return (
|
|
30
|
+
CODE_INJECTION_ENV_KEYS.has(normalized) ||
|
|
31
|
+
normalized.startsWith("DYLD_") ||
|
|
32
|
+
normalized.startsWith("COMPLUS_") ||
|
|
33
|
+
normalized.startsWith("CORECLR_")
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function sanitizeMcpStdioHostEnvironment(env) {
|
|
38
|
+
const safe = {};
|
|
39
|
+
for (const [key, value] of Object.entries(env || {})) {
|
|
40
|
+
if (
|
|
41
|
+
!isMcpStdioCodeInjectionEnvironmentKey(key) &&
|
|
42
|
+
typeof value === "string"
|
|
43
|
+
) {
|
|
44
|
+
safe[key] = value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return safe;
|
|
48
|
+
}
|