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
package/src/commands/mcp.js
CHANGED
|
@@ -39,6 +39,19 @@ import {
|
|
|
39
39
|
checkProjectMcpTrust,
|
|
40
40
|
issueProjectMcpWorkspaceAuthority,
|
|
41
41
|
} from "../lib/project-mcp-trust.js";
|
|
42
|
+
import {
|
|
43
|
+
consumeMcpStdioExecutionAuthority,
|
|
44
|
+
MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
|
|
45
|
+
issueMcpStdioExecutionAuthority,
|
|
46
|
+
materializeApprovedMcpStdioInvocation,
|
|
47
|
+
resolveMcpStdioExecutionApproval,
|
|
48
|
+
} from "../lib/mcp-stdio-execution-authority.js";
|
|
49
|
+
import { prepareMcpStdioExecutableIdentity } from "../lib/mcp-stdio-executable-identity.js";
|
|
50
|
+
import {
|
|
51
|
+
materializeMcpStdioNpmPackage,
|
|
52
|
+
parseExactNpmPackageSpec,
|
|
53
|
+
} from "../lib/mcp-stdio-package-materialization.js";
|
|
54
|
+
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
42
55
|
import {
|
|
43
56
|
CATALOG as REGISTRY_CATALOG,
|
|
44
57
|
CATEGORIES as REGISTRY_CATEGORIES,
|
|
@@ -77,6 +90,32 @@ export function isHeadlessEnv(env = process.env, platform = process.platform) {
|
|
|
77
90
|
|
|
78
91
|
// Singleton MCP client for session reuse
|
|
79
92
|
let mcpClient = null;
|
|
93
|
+
const PROJECT_MCP_FILE_TRUST = Symbol("projectMcpFileTrust");
|
|
94
|
+
|
|
95
|
+
export function authorizeMcpRowForConnect(row, overrides = {}) {
|
|
96
|
+
const config = { ...row, ...overrides };
|
|
97
|
+
if (inferTransport(config) !== "stdio") return config;
|
|
98
|
+
if (row?.[PROJECT_MCP_FILE_TRUST] === false) {
|
|
99
|
+
const error = new Error(
|
|
100
|
+
`Project MCP server "${String(row?.name)}" can execute local code; trust the current .mcp.json before connecting`,
|
|
101
|
+
);
|
|
102
|
+
error.code = MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE;
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
const approvalKind =
|
|
106
|
+
row?.configScope === "managed"
|
|
107
|
+
? "managed-settings"
|
|
108
|
+
: row?.configScope === "project"
|
|
109
|
+
? "project-config"
|
|
110
|
+
: "registered-config";
|
|
111
|
+
config.mcpStdioExecutionAuthority = issueMcpStdioExecutionAuthority({
|
|
112
|
+
serverName: row.name,
|
|
113
|
+
config,
|
|
114
|
+
approvalKind,
|
|
115
|
+
approvalSource: `${row?.configScope || "user"}:${row?.configSource || "database"}:${row.name}`,
|
|
116
|
+
});
|
|
117
|
+
return config;
|
|
118
|
+
}
|
|
80
119
|
|
|
81
120
|
function commandWorkspaceBinding() {
|
|
82
121
|
return registerHostHooksV2Workspace(projectMcpLocation(process.cwd()).root);
|
|
@@ -150,7 +189,7 @@ async function connectForQuery(program, serverName) {
|
|
|
150
189
|
for (const row of rows) {
|
|
151
190
|
if (!row) continue;
|
|
152
191
|
try {
|
|
153
|
-
await client.connect(row.name, row);
|
|
192
|
+
await client.connect(row.name, authorizeMcpRowForConnect(row));
|
|
154
193
|
connected.push(row.name);
|
|
155
194
|
} catch (err) {
|
|
156
195
|
logger.log(
|
|
@@ -339,6 +378,7 @@ export function readProjectMcpRows(cwd = process.cwd()) {
|
|
|
339
378
|
configSource: file,
|
|
340
379
|
projectPath: root,
|
|
341
380
|
};
|
|
381
|
+
Object.defineProperty(row, PROJECT_MCP_FILE_TRUST, { value: trusted });
|
|
342
382
|
if (trusted && row.headersHelper) {
|
|
343
383
|
row.projectMcpWorkspaceAuthority = issueProjectMcpWorkspaceAuthority({
|
|
344
384
|
file,
|
|
@@ -773,6 +813,198 @@ export function registerMcpCommand(program) {
|
|
|
773
813
|
}
|
|
774
814
|
});
|
|
775
815
|
|
|
816
|
+
mcp
|
|
817
|
+
.command("materialize-package <name>")
|
|
818
|
+
.description(
|
|
819
|
+
"Replace one exact JavaScript package launcher with a content-addressed, guarded dependency capsule",
|
|
820
|
+
)
|
|
821
|
+
.requiredOption(
|
|
822
|
+
"--package <name@version>",
|
|
823
|
+
"Exact npm registry package version to install (ranges and tags are rejected)",
|
|
824
|
+
)
|
|
825
|
+
.option(
|
|
826
|
+
"--bin <name>",
|
|
827
|
+
"Select one exported bin when the package has several",
|
|
828
|
+
)
|
|
829
|
+
.option(
|
|
830
|
+
"--scope <scope>",
|
|
831
|
+
`Configuration scope: ${MCP_CONFIG_SCOPES.join(" | ")}`,
|
|
832
|
+
)
|
|
833
|
+
.option(
|
|
834
|
+
"--json",
|
|
835
|
+
"Output the materialized generation and closure identity as JSON",
|
|
836
|
+
)
|
|
837
|
+
.action(async (name, options) => {
|
|
838
|
+
try {
|
|
839
|
+
const exact = parseExactNpmPackageSpec(options.package);
|
|
840
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
841
|
+
if (!ctx.db) throw new Error("Database not available");
|
|
842
|
+
const configStore = new MCPServerConfig(ctx.db.getDatabase());
|
|
843
|
+
const scope = options.scope
|
|
844
|
+
? normalizeMcpConfigScope(options.scope)
|
|
845
|
+
: undefined;
|
|
846
|
+
const rows = await effectiveMcpRows(configStore, { scope });
|
|
847
|
+
const row = rows.find((entry) => entry.name === name);
|
|
848
|
+
if (!row) {
|
|
849
|
+
throw new Error(
|
|
850
|
+
`${notFoundWithSuggestion(
|
|
851
|
+
name,
|
|
852
|
+
rows.map((entry) => entry.name),
|
|
853
|
+
{ noun: "Server" },
|
|
854
|
+
)}. Use 'mcp add' first.`,
|
|
855
|
+
);
|
|
856
|
+
}
|
|
857
|
+
if (inferTransport(row) !== "stdio") {
|
|
858
|
+
throw new Error(
|
|
859
|
+
`MCP server "${name}" does not use the stdio transport`,
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
const authorized = authorizeMcpRowForConnect(row);
|
|
864
|
+
const approval = consumeMcpStdioExecutionAuthority(
|
|
865
|
+
authorized.mcpStdioExecutionAuthority,
|
|
866
|
+
{ serverName: name, config: authorized },
|
|
867
|
+
);
|
|
868
|
+
const invocation = materializeApprovedMcpStdioInvocation(approval);
|
|
869
|
+
const approvalRecord = resolveMcpStdioExecutionApproval(approval);
|
|
870
|
+
const materialized = materializeMcpStdioNpmPackage({
|
|
871
|
+
approvalRecord,
|
|
872
|
+
config: invocation,
|
|
873
|
+
packageSpec: exact.spec,
|
|
874
|
+
...(options.bin ? { binName: options.bin } : {}),
|
|
875
|
+
env: process.env,
|
|
876
|
+
processBrokerRunSync: (command, args, spawnOptions) =>
|
|
877
|
+
executionBroker.spawnSync(command, args, {
|
|
878
|
+
...spawnOptions,
|
|
879
|
+
origin: `mcp:package-materialization:${name}`,
|
|
880
|
+
policy: "allow",
|
|
881
|
+
scope: "mcp",
|
|
882
|
+
shell: false,
|
|
883
|
+
}),
|
|
884
|
+
});
|
|
885
|
+
const prepared = prepareMcpStdioExecutableIdentity({
|
|
886
|
+
serverName: name,
|
|
887
|
+
config: invocation,
|
|
888
|
+
approval,
|
|
889
|
+
cwd: process.cwd(),
|
|
890
|
+
env: process.env,
|
|
891
|
+
retrust: true,
|
|
892
|
+
});
|
|
893
|
+
const result = {
|
|
894
|
+
name,
|
|
895
|
+
package: exact.spec,
|
|
896
|
+
generation: materialized.generation,
|
|
897
|
+
manifestDigest: materialized.manifestDigest,
|
|
898
|
+
identityDigest: prepared.identityDigest,
|
|
899
|
+
closure: materialized.identity,
|
|
900
|
+
command: prepared.identity.command,
|
|
901
|
+
entrypoints: prepared.identity.entrypoints,
|
|
902
|
+
};
|
|
903
|
+
if (options.json) {
|
|
904
|
+
console.log(JSON.stringify(result, null, 2));
|
|
905
|
+
} else {
|
|
906
|
+
logger.log(
|
|
907
|
+
chalk.green(
|
|
908
|
+
`Materialized and trusted ${exact.spec} for MCP server "${name}".`,
|
|
909
|
+
),
|
|
910
|
+
);
|
|
911
|
+
logger.log(
|
|
912
|
+
` ${chalk.gray("Generation:")} ${materialized.generation}`,
|
|
913
|
+
);
|
|
914
|
+
logger.log(
|
|
915
|
+
` ${chalk.gray("Dependency closure:")} sha256:${materialized.identity.closureDigest} (${materialized.identity.fileCount} files, ${materialized.identity.totalBytes} bytes)`,
|
|
916
|
+
);
|
|
917
|
+
logger.log(
|
|
918
|
+
` ${chalk.gray("Execution capsule:")} sha256:${materialized.identity.capsule.sha256} (${materialized.identity.capsule.bytes} bytes, ${materialized.identity.capsule.inputCount} bundled inputs)`,
|
|
919
|
+
);
|
|
920
|
+
}
|
|
921
|
+
await shutdown();
|
|
922
|
+
} catch (err) {
|
|
923
|
+
logger.error(`Failed: ${err.message}`);
|
|
924
|
+
process.exitCode = 1;
|
|
925
|
+
await shutdown();
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
mcp
|
|
930
|
+
.command("trust-executable <name>")
|
|
931
|
+
.description(
|
|
932
|
+
"Review and trust the current executable and interpreter-entrypoint bytes for one stdio MCP server",
|
|
933
|
+
)
|
|
934
|
+
.option(
|
|
935
|
+
"--scope <scope>",
|
|
936
|
+
`Configuration scope: ${MCP_CONFIG_SCOPES.join(" | ")}`,
|
|
937
|
+
)
|
|
938
|
+
.option("--json", "Output the trusted paths and SHA-256 identities as JSON")
|
|
939
|
+
.action(async (name, options) => {
|
|
940
|
+
try {
|
|
941
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
942
|
+
if (!ctx.db) throw new Error("Database not available");
|
|
943
|
+
const configStore = new MCPServerConfig(ctx.db.getDatabase());
|
|
944
|
+
const scope = options.scope
|
|
945
|
+
? normalizeMcpConfigScope(options.scope)
|
|
946
|
+
: undefined;
|
|
947
|
+
const rows = await effectiveMcpRows(configStore, { scope });
|
|
948
|
+
const row = rows.find((entry) => entry.name === name);
|
|
949
|
+
if (!row) {
|
|
950
|
+
throw new Error(
|
|
951
|
+
`${notFoundWithSuggestion(
|
|
952
|
+
name,
|
|
953
|
+
rows.map((entry) => entry.name),
|
|
954
|
+
{ noun: "Server" },
|
|
955
|
+
)}. Use 'mcp add' first.`,
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
if (inferTransport(row) !== "stdio") {
|
|
959
|
+
throw new Error(
|
|
960
|
+
`MCP server "${name}" does not use the stdio transport`,
|
|
961
|
+
);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
const authorized = authorizeMcpRowForConnect(row);
|
|
965
|
+
const approval = consumeMcpStdioExecutionAuthority(
|
|
966
|
+
authorized.mcpStdioExecutionAuthority,
|
|
967
|
+
{ serverName: name, config: authorized },
|
|
968
|
+
);
|
|
969
|
+
const invocation = materializeApprovedMcpStdioInvocation(approval);
|
|
970
|
+
const prepared = prepareMcpStdioExecutableIdentity({
|
|
971
|
+
serverName: name,
|
|
972
|
+
config: invocation,
|
|
973
|
+
approval,
|
|
974
|
+
cwd: process.cwd(),
|
|
975
|
+
env: process.env,
|
|
976
|
+
retrust: true,
|
|
977
|
+
});
|
|
978
|
+
const result = {
|
|
979
|
+
name,
|
|
980
|
+
status: prepared.trustStatus,
|
|
981
|
+
identityDigest: prepared.identityDigest,
|
|
982
|
+
command: prepared.identity.command,
|
|
983
|
+
entrypoints: prepared.identity.entrypoints,
|
|
984
|
+
};
|
|
985
|
+
if (options.json) {
|
|
986
|
+
console.log(JSON.stringify(result, null, 2));
|
|
987
|
+
} else {
|
|
988
|
+
logger.log(
|
|
989
|
+
chalk.green(`Trusted MCP stdio executable identity for "${name}".`),
|
|
990
|
+
);
|
|
991
|
+
logger.log(
|
|
992
|
+
` ${chalk.gray("Command:")} ${result.command.realPath} sha256:${result.command.sha256}`,
|
|
993
|
+
);
|
|
994
|
+
for (const entrypoint of result.entrypoints) {
|
|
995
|
+
logger.log(
|
|
996
|
+
` ${chalk.gray(`${entrypoint.role}:`)} ${entrypoint.realPath} sha256:${entrypoint.sha256}`,
|
|
997
|
+
);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
await shutdown();
|
|
1001
|
+
} catch (err) {
|
|
1002
|
+
logger.error(`Failed: ${err.message}`);
|
|
1003
|
+
process.exitCode = 1;
|
|
1004
|
+
await shutdown();
|
|
1005
|
+
}
|
|
1006
|
+
});
|
|
1007
|
+
|
|
776
1008
|
// mcp add — add/update a server config
|
|
777
1009
|
mcp
|
|
778
1010
|
.command("add")
|
|
@@ -1207,11 +1439,13 @@ export function registerMcpCommand(program) {
|
|
|
1207
1439
|
workspaceBinding: commandWorkspaceBinding(),
|
|
1208
1440
|
});
|
|
1209
1441
|
try {
|
|
1210
|
-
const connected = await client.connect(
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1442
|
+
const connected = await client.connect(
|
|
1443
|
+
row.name,
|
|
1444
|
+
authorizeMcpRowForConnect(row, {
|
|
1445
|
+
connectTimeoutMs: timeoutMs,
|
|
1446
|
+
requestTimeoutMs: timeoutMs,
|
|
1447
|
+
}),
|
|
1448
|
+
);
|
|
1215
1449
|
diagnostics.push({
|
|
1216
1450
|
...record,
|
|
1217
1451
|
ok: true,
|
|
@@ -1301,7 +1535,10 @@ export function registerMcpCommand(program) {
|
|
|
1301
1535
|
const spinner = ora(`Connecting to ${name}...`).start();
|
|
1302
1536
|
const client = getClient();
|
|
1303
1537
|
|
|
1304
|
-
const result = await client.connect(
|
|
1538
|
+
const result = await client.connect(
|
|
1539
|
+
name,
|
|
1540
|
+
authorizeMcpRowForConnect(serverConfig),
|
|
1541
|
+
);
|
|
1305
1542
|
spinner.stop();
|
|
1306
1543
|
|
|
1307
1544
|
if (options.json) {
|
package/src/commands/serve.js
CHANGED
|
@@ -41,7 +41,7 @@ export function registerServeCommand(program) {
|
|
|
41
41
|
)
|
|
42
42
|
.option(
|
|
43
43
|
"--bundle <path>",
|
|
44
|
-
"Agent bundle directory
|
|
44
|
+
"Agent bundle directory; may execute local MCP commands from mcp.json",
|
|
45
45
|
)
|
|
46
46
|
.action(async (opts) => {
|
|
47
47
|
try {
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { numericOption } from "../lib/cli-numeric.js";
|
|
3
|
+
import { logger } from "../lib/logger.js";
|
|
4
|
+
import { getPrLinks } from "../lib/pr-link-store.js";
|
|
5
|
+
import {
|
|
6
|
+
getJsonlSessionMetadata,
|
|
7
|
+
rebuildMessages,
|
|
8
|
+
resolveSessionAuthority,
|
|
9
|
+
} from "../harness/jsonl-session-store.js";
|
|
10
|
+
|
|
11
|
+
export function registerSessionShowSubcommand(session, program) {
|
|
12
|
+
session
|
|
13
|
+
.command("show")
|
|
14
|
+
.description("Show a session's messages")
|
|
15
|
+
.argument("<id>", "Session ID (or prefix)")
|
|
16
|
+
.option("-n, --limit <n>", "Max messages to show")
|
|
17
|
+
.option("--json", "Output as JSON")
|
|
18
|
+
.action(async (id, options) => {
|
|
19
|
+
let ctx = null;
|
|
20
|
+
let shutdown = null;
|
|
21
|
+
try {
|
|
22
|
+
let sess = null;
|
|
23
|
+
|
|
24
|
+
// The feature flag controls creation/migration, not authority. Once a
|
|
25
|
+
// canonical namespace witness exists it must fence the legacy DB even
|
|
26
|
+
// if JSONL_SESSION is later disabled.
|
|
27
|
+
const authority = resolveSessionAuthority(id);
|
|
28
|
+
const jsonlId = authority?.readable ? authority.id : null;
|
|
29
|
+
if (authority && !authority.readable) {
|
|
30
|
+
logger.error(
|
|
31
|
+
`Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence}).`,
|
|
32
|
+
);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (jsonlId) {
|
|
37
|
+
const metadata = getJsonlSessionMetadata(jsonlId);
|
|
38
|
+
const messages = rebuildMessages(jsonlId);
|
|
39
|
+
sess = {
|
|
40
|
+
id: jsonlId,
|
|
41
|
+
title: metadata?.title || "Untitled",
|
|
42
|
+
provider: metadata?.provider || "",
|
|
43
|
+
model: metadata?.model || "",
|
|
44
|
+
message_count: messages.length,
|
|
45
|
+
messages,
|
|
46
|
+
_store: "jsonl",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Keep SQLite and the application bootstrap outside the canonical
|
|
51
|
+
// JSONL read path. Legacy sessions still retain the original fallback.
|
|
52
|
+
if (!sess) {
|
|
53
|
+
const runtime = await import("../runtime/bootstrap.js");
|
|
54
|
+
const sessionManager = await import("../lib/session-manager.js");
|
|
55
|
+
shutdown = runtime.shutdown;
|
|
56
|
+
ctx = await runtime.bootstrap({ verbose: program.opts().verbose });
|
|
57
|
+
if (ctx?.db) {
|
|
58
|
+
sess = sessionManager.getSession(ctx.db.getDatabase(), id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!sess) {
|
|
63
|
+
logger.error(`Session not found: ${id}`);
|
|
64
|
+
process.exitCode = 1;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const prLinks = getPrLinks(sess.id);
|
|
70
|
+
if (prLinks.length > 0) sess.prLinks = prLinks;
|
|
71
|
+
} catch {
|
|
72
|
+
// PR decoration is cosmetic.
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (options.json) {
|
|
76
|
+
console.log(JSON.stringify(sess, null, 2));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
logger.log(chalk.bold(sess.title));
|
|
81
|
+
logger.log(
|
|
82
|
+
chalk.gray(
|
|
83
|
+
`ID: ${sess.id} Provider: ${sess.provider} Model: ${sess.model} Messages: ${sess.message_count}`,
|
|
84
|
+
),
|
|
85
|
+
);
|
|
86
|
+
if (sess.prLinks) {
|
|
87
|
+
for (const pr of sess.prLinks) {
|
|
88
|
+
logger.log(
|
|
89
|
+
chalk.magenta(
|
|
90
|
+
`PR: #${pr.number}${pr.state ? ` ${pr.state}` : ""}${pr.url ? ` ${pr.url}` : ""}`,
|
|
91
|
+
),
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
logger.log("");
|
|
96
|
+
|
|
97
|
+
let messages = sess.messages;
|
|
98
|
+
if (options.limit) {
|
|
99
|
+
messages = messages.slice(
|
|
100
|
+
-numericOption(options.limit, {
|
|
101
|
+
name: "--limit",
|
|
102
|
+
integer: true,
|
|
103
|
+
min: 1,
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
for (const message of messages) {
|
|
109
|
+
if (message.role === "system") continue;
|
|
110
|
+
const label =
|
|
111
|
+
message.role === "user" ? chalk.green("you> ") : chalk.blue("ai> ");
|
|
112
|
+
logger.log(`${label}${(message.content || "").substring(0, 500)}`);
|
|
113
|
+
logger.log("");
|
|
114
|
+
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
logger.error(`Failed: ${error.message}`);
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
} finally {
|
|
119
|
+
if (ctx && shutdown) await shutdown();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function registerSessionShowCommand(program) {
|
|
125
|
+
const session = program
|
|
126
|
+
.command("session")
|
|
127
|
+
.description("Conversation session management");
|
|
128
|
+
registerSessionShowSubcommand(session, program);
|
|
129
|
+
}
|