chainlesschain 0.162.198 → 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-CSN-D2xb.js → AIOps-DcQ0bWKy.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CBSMlGzv.js → ActionButton-GecwfFPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-3yr3Nt2t.js → Analytics-CD6iSt9v.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-1b-o3lMH.js → AppLayout-CDEtuEYf.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dr8rJi17.js → Artifacts-DS3jAjeW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-2V689HC2.js → Audit-CcSJA048.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DIxkNrD_.js → BackgroundAgents-DRo9Morb.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Pg6BcwrE.js → Backup-Vw5MrWft.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CLUpqyfH.js → BaseInput-DNHIu823.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-qVS8rD4G.js → Chat-DvAsO8-b.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-ti49X12Q.js → ChatBubbleRenderer-9aDuObay.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Bs9AaEay.js → Checkbox-CKCa7tvn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Dvc1mq8q.js → Codegen-CIFvZdaT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C4_biO7A.js → Col-C79yz7bK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-al25XQUV.js → Community-DVvZskLJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D-ZDB8M1.js → Compact-oaew61hV.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-6lIfDz1W.js → Compliance-DqA7wmRx.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DdI48XMJ.js → Cowork-B-qGadxa.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DF5HZd2g.js → Cron-CUlCl4sS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DuxeSvt3.js → Crosschain-CNOlr9DU.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B9yHkUTd.js → DID-DJqFCT_3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Z5EuI3IM.js → Dashboard-CznGpphf.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-vuRfO3dY.js → Dropdown-_cJw218E.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-QFLCc1uL.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZ7EXkFJ.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DycIEg2s.js → Federation-DOiG3i_1.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Ba0H_7yG.js → FormItemContext-BzbMcFB9.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer--JgSTK-C.js → GenericCardRenderer-VbBrYttP.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DEvTbldE.js → Git-CLG8E6ED.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJIljy18.js → Governance-LGJQfk_q.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CVyW3G3q.js → Inference-DlQKx9lF.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-v8-borge.js → KnowledgeGraph-DU8vEouV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BCdS7gGo.js → Logs-FZIQOdln.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-AN6tGA2B.js → Marketplace-C_xd-zZI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DGViXASN.js → McpTools-q-YktphS.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Bpvmx9X4.js → Memory-Cq9OhDin.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CTP-DOTC.js → MobileBridge-B03_R98T.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C8qfktxn.js → MobileProjects-DZrk-qmF.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-ndYr0M1s.js → Mtc-BidCKW28.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Ci0-YK7W.js → MtcAudit-r-iaMVM7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BehSTFW7.js → Multisig-CgTUFvff.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B91_YBLv.js → NLProgramming-B7NvzfAV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BQlJ0-gq.js → Notes-80CWNqJI.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CDgYMjYK.js → NotificationSettings-0H6xdiY3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJkSlKeH.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B-b3cWCp.js → Organization-B8sxCV_h.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CILUL4nL.js → Overflow-CW9JBBhQ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTCFBkF0.js → P2P-bdSQV7oZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BAR6AUx5.js → PdhVaultBrowser-DQad42nW.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-RRf6HbWJ.js → Permissions-CueexxTR.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BGTMiICa.js → PersonalDataHub-fqxflhR8.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-945qY9YF.js → Pipeline-KFwwnIMC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DPZwI6lJ.js → Privacy-ClnD9buY.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BPH2NRKc.js → ProjectInit-CZEz6sm3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BZCRNCvb.js → ProjectSettings-B6NzpmOI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BTI__tBt.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-N6rbqt1r.js → QrScannerModal-BzuOBbqB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrwjPS7M.js → QuickAsk-CmNO9qSj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cog9Wd99.js → Recommend-VJNj3_NF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DC9pynjM.js → RemoteSession-CrbdbSBF.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D4th4gKS.js → Reputation-DTyMd45j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ogiWR6v9.js → Row-DHrQ-Icz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-uYlk-2Oj.js → RssFeed-DqWxY9c5.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DYzzwvtM.js → Search-ctF1Ks3J.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Da7YOyX6.js → Security-BrQz8uo5.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CLI1VM1X.js → Services-D4scVFar.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DK77dzDC.js → Skeleton-oUScaOjv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C_z7Lmhl.js → Skills-CL-y0eLt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-D6413Q8L.js → Sla-DQExhwXj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C07ydbj2.js → SpeechSettings-iNp_I7kN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DGOm2W22.js → SyncSettings-CTDlMo0A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cr_PVyLM.js → Tasks-4kb8l3sc.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BhL2mZ0t.js → Templates-BXcL9oXW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CPk5oyUr.js → Tenant-DLE8eS0D.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-ClhqUsqV.js → Terminal-DGpUZPPK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BCC7MV5a.js → TimelineRenderer-C1pWXGPC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DD1Jt4oO.js → Tokens-BYfbfqhZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BCydFvN2.js → Trigger-K9YfLOCw.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DDHT1noa.js → Trust-Ctkq77Hy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CWPZC7oI.js → UkeySign-C6_CSe9J.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-9Ea0nJR0.js → VideoEditing-Be3rpOWs.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BjxhLxTf.js → Wallet-D0UIplxk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C6uCye67.js → WebAuthn-CF9bM9I3.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-d2g4reYo.js → WorkflowEditor-D0H1XVPY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-frTc6ScX.js → chat-Cgzzbe0o.js} +1 -1
- package/src/assets/web-panel/assets/{colors-B5K6lG3v.js → colors-BwNxEVS0.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cdn46r8D.js → compact-item-D60Z4Hhs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DU1jqVQi.js → createContext-MFk58XB0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DdNH-aW_.js → hasIn-CRj2SvGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DM5FmPZU.js → index--s45_1cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4l82Me1.js → index--tquQ2ZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQorP1Ng.js → index-1T1rhokn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHmkkdfT.js → index-B-M82_rx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGiwfwB9.js → index-BE_el1Zs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwlIxAmX.js → index-BhRkR7IO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj6P9Nst.js → index-Bo0y96-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoFak7le.js → index-CJgu5JUK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dca_i7H8.js → index-CLWwdebO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVLL-mq_.js → index-CNAK5QG_.js} +1 -1
- package/src/assets/web-panel/assets/{index-LaivuXyF.js → index-CQjJjPRD.js} +1 -1
- package/src/assets/web-panel/assets/{index-t_OBzIP4.js → index-CTDbAfae.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcGwGIaR.js → index-CVI_9sRK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D23xGYjM.js → index-CY14oMQK.js} +1 -1
- package/src/assets/web-panel/assets/{index-VDM2KKo9.js → index-CbiTJkZf.js} +1 -1
- package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
- package/src/assets/web-panel/assets/{index-32ajXmTb.js → index-CqWpxMqx.js} +1 -1
- package/src/assets/web-panel/assets/{index-PjAS0sIZ.js → index-CvB8lYUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-7ehytj1K.js → index-D51XwtCY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtBCCkC4.js → index-D6HvK_1O.js} +1 -1
- package/src/assets/web-panel/assets/{index-Be4OtL-N.js → index-D9jVIwLJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUoNAmE8.js → index-DA4tE98u.js} +1 -1
- package/src/assets/web-panel/assets/{index-cYaWV4Mq.js → index-DBwOtXw0.js} +1 -1
- package/src/assets/web-panel/assets/{index-MM4Zz2OE.js → index-DKdNzTIb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIVyTmZ3.js → index-DRySdmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtRPi4YC.js → index-DWzyTev7.js} +1 -1
- package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
- package/src/assets/web-panel/assets/{index-kVO_MDm-.js → index-DYjs7jAP.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4miNkWv.js → index-DbROzMBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-yZRuZpwK.js → index-DhFtk5PR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXKhhx9V.js → index-Di2AbMLg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC4eGkar.js → index-DvmocQsM.js} +1 -1
- package/src/assets/web-panel/assets/{index-NmEXVjzt.js → index-Dw-o0zEF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRzBBdQ0.js → index-DysPoP38.js} +1 -1
- package/src/assets/web-panel/assets/{index-HjCvXHf5.js → index-LX9pJxm_.js} +1 -1
- package/src/assets/web-panel/assets/{index-gg3QPC3i.js → index-OI_fXWx0.js} +3 -3
- package/src/assets/web-panel/assets/{index-mgU3Q-lN.js → index-eDTOX8Xj.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1qIC4GR.js → index-gWKDsTzF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DftZuyA7.js → index-q_GDUVAA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DwLTRNdo.js → initDefaultProps-C61kZqEd.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BchZDXnh.js → motion-DZnT5U1L.js} +1 -1
- package/src/assets/web-panel/assets/{move-e8M-zZFl.js → move-L8wzwbel.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Ci40fQb3.js → mtc-parser-DLdYSejc.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C7110_f2.js → omit-D53cbS59.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-skteMgnM.js → pickAttrs-Bbc5HPtu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-MGZ-lh2B.js → placementArrow-BkvmO860.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-N4Sd7uy-.js → responsiveObserve-u2y1ryS1.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C7HDGRaa.js → slide-BBqj7svU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BhRexlgy.js → statusUtils-GN0mqu2d.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-ChEoQkN2.js → styleChecker-BvwPKoBT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CDbG1s2Y.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUIx0tcJ.js → useFs-DXAxl2SV.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-bkO7L7ec.js → usePersonalDataHub-DihlR2dj.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B_ZvABIG.js → vnode-D7BOX2gi.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D5shjpS8.js → zoom-CVbO-nL7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/mcp.js +119 -0
- package/src/commands/session-show.js +8 -10
- package/src/commands/session.js +60 -52
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/session-protocol.js +14 -4
- package/src/gateways/ws/ws-agent-handler.js +31 -0
- package/src/harness/jsonl-session-store.js +1147 -130
- package/src/harness/mcp-client.js +44 -11
- package/src/harness/session-index.js +80 -80
- package/src/harness/session-list-index.js +147 -2
- package/src/lib/background-interaction-journal.js +2 -2
- package/src/lib/command-lifecycle-report.js +516 -0
- package/src/lib/mcp-stdio-environment.js +48 -0
- package/src/lib/mcp-stdio-executable-identity.js +552 -17
- package/src/lib/mcp-stdio-package-materialization.js +1424 -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/process-execution-broker/index.js +180 -37
- package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
- 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-persistence-failure.js +109 -0
- package/src/lib/session-picker.js +26 -3
- package/src/lib/session-search.js +25 -11
- package/src/lib/side-effect-ledger-store.js +2 -2
- package/src/lib/skill-execution-authority.js +13 -9
- package/src/lib/turn-binding-store.js +2 -2
- package/src/repl/agent-repl.js +309 -39
- package/src/runtime/agent-core.js +88 -5
- package/src/runtime/cleanup-deadline.js +143 -0
- package/src/runtime/headless-runner.js +357 -139
- package/src/runtime/headless-stream.js +207 -28
- package/src/runtime/output-backpressure.js +53 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-CU-JB2Ns.js +0 -1
- package/src/assets/web-panel/assets/Providers-DDCf_nIw.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CP-jEUyw.js +0 -1
- package/src/assets/web-panel/assets/index-CzrCHrFy.js +0 -1
- package/src/assets/web-panel/assets/index-OJsGskZw.js +0 -1
|
@@ -394,6 +394,7 @@ export function generatePkgConfig(ctx) {
|
|
|
394
394
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.dll`,
|
|
395
395
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.exe`,
|
|
396
396
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox.cs`,
|
|
397
|
+
`${posixify(cliRoot)}/install/install.ps1`,
|
|
397
398
|
];
|
|
398
399
|
if (prebuildsDir) assets.push(`${posixify(prebuildsDir)}/**/*`);
|
|
399
400
|
// Project mode: bundle the collected .chainlesschain/ snapshot as an asset.
|
package/src/lib/paths.js
CHANGED
|
@@ -58,6 +58,59 @@ export function getStatePath() {
|
|
|
58
58
|
return join(getHomeDir(), "state");
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/** User-local security state that survives rollback of CHAINLESSCHAIN_HOME. */
|
|
62
|
+
export function getMachineSecurityAnchorDir() {
|
|
63
|
+
const configured = process.env.CHAINLESSCHAIN_SECURITY_ANCHOR_HOME;
|
|
64
|
+
let anchorPath;
|
|
65
|
+
if (configured) {
|
|
66
|
+
if (!isAbsolute(configured)) {
|
|
67
|
+
const error = new Error(
|
|
68
|
+
"CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be an absolute path",
|
|
69
|
+
);
|
|
70
|
+
error.code = "CONFIG_HOME_UNSAFE";
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
anchorPath = resolve(configured);
|
|
74
|
+
} else {
|
|
75
|
+
const platform = getPlatform();
|
|
76
|
+
if (platform === "win32") {
|
|
77
|
+
anchorPath = join(
|
|
78
|
+
process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local"),
|
|
79
|
+
"ChainlessChain",
|
|
80
|
+
"SecurityAnchors",
|
|
81
|
+
);
|
|
82
|
+
} else if (platform === "darwin") {
|
|
83
|
+
anchorPath = join(
|
|
84
|
+
homedir(),
|
|
85
|
+
"Library",
|
|
86
|
+
"Application Support",
|
|
87
|
+
"ChainlessChain",
|
|
88
|
+
"SecurityAnchors",
|
|
89
|
+
);
|
|
90
|
+
} else {
|
|
91
|
+
anchorPath = join(
|
|
92
|
+
process.env.XDG_STATE_HOME || join(homedir(), ".local", "state"),
|
|
93
|
+
"chainlesschain",
|
|
94
|
+
"security-anchors",
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const resolvedAnchor = resolve(anchorPath);
|
|
99
|
+
const resolvedHome = resolve(getHomeDir());
|
|
100
|
+
const relativeToHome = relative(resolvedHome, resolvedAnchor);
|
|
101
|
+
if (
|
|
102
|
+
relativeToHome === "" ||
|
|
103
|
+
(!relativeToHome.startsWith("..") && !isAbsolute(relativeToHome))
|
|
104
|
+
) {
|
|
105
|
+
const error = new Error(
|
|
106
|
+
"CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be outside CHAINLESSCHAIN_HOME",
|
|
107
|
+
);
|
|
108
|
+
error.code = "CONFIG_HOME_UNSAFE";
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
return resolvedAnchor;
|
|
112
|
+
}
|
|
113
|
+
|
|
61
114
|
export function getPidFilePath() {
|
|
62
115
|
return join(getStatePath(), "app.pid");
|
|
63
116
|
}
|
|
@@ -48,7 +48,11 @@ import { consumeIssuedPluginSandboxExecutionContract } from "../plugin-runtime/b
|
|
|
48
48
|
import runtimeProvenanceLedger from "../runtime-provenance-ledger.js";
|
|
49
49
|
import { credentialAgent } from "./credential-agent.js";
|
|
50
50
|
import { WorkspaceTransactionManager } from "./workspace-transaction.js";
|
|
51
|
-
import {
|
|
51
|
+
import {
|
|
52
|
+
consumeMcpStdioCapsuleSandboxExecutionContract,
|
|
53
|
+
consumeMcpStdioExecutableIdentityAuthority,
|
|
54
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
55
|
+
} from "../mcp-stdio-executable-identity.js";
|
|
52
56
|
|
|
53
57
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
54
58
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
@@ -706,22 +710,35 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
706
710
|
}
|
|
707
711
|
return admitted;
|
|
708
712
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
713
|
+
const mcpCapsule = raw?.kind === MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND;
|
|
714
|
+
const consumed = mcpCapsule
|
|
715
|
+
? consumeMcpStdioCapsuleSandboxExecutionContract(raw, {
|
|
716
|
+
origin: options.origin,
|
|
717
|
+
command: launch?.command,
|
|
718
|
+
args: launch?.args,
|
|
719
|
+
cwd: options.cwd,
|
|
720
|
+
shell: options.shell,
|
|
721
|
+
requiredBoundaries,
|
|
722
|
+
sync: launch?.sync === true,
|
|
723
|
+
identityDigest: options.mcpStdioExecutableIdentityDigest,
|
|
724
|
+
})
|
|
725
|
+
: consumeIssuedPluginSandboxExecutionContract(raw, {
|
|
726
|
+
origin: options.origin,
|
|
727
|
+
command: launch?.command,
|
|
728
|
+
args: launch?.args,
|
|
729
|
+
cwd: options.cwd,
|
|
730
|
+
pluginId: options.pluginId,
|
|
731
|
+
pluginVersion: options.pluginVersion,
|
|
732
|
+
pluginSource: options.pluginSource,
|
|
733
|
+
pluginExecutableIdentity: options.pluginExecutableIdentity,
|
|
734
|
+
requiredBoundaries,
|
|
735
|
+
sync: launch?.sync === true,
|
|
736
|
+
});
|
|
737
|
+
if (!consumed) {
|
|
723
738
|
return invalid(
|
|
724
|
-
|
|
739
|
+
mcpCapsule
|
|
740
|
+
? "sandboxExecutionContract was not issued for this MCP capsule launch provenance"
|
|
741
|
+
: "sandboxExecutionContract was not issued for this plugin launch provenance",
|
|
725
742
|
);
|
|
726
743
|
}
|
|
727
744
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
@@ -751,18 +768,22 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
751
768
|
"strict-plugin-node-bin",
|
|
752
769
|
"strict-plugin-native-static-elf-bin",
|
|
753
770
|
"strict-plugin-native-elf-bin",
|
|
771
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
754
772
|
].includes(raw.kind)
|
|
755
773
|
) {
|
|
756
774
|
return invalid("unsupported sandboxExecutionContract kind or version");
|
|
757
775
|
}
|
|
758
776
|
if (
|
|
759
|
-
options.
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
777
|
+
options.shell !== false ||
|
|
778
|
+
(!mcpCapsule &&
|
|
779
|
+
(options.origin !== "plugin:bin" ||
|
|
780
|
+
typeof options.pluginId !== "string" ||
|
|
781
|
+
!options.pluginId))
|
|
763
782
|
) {
|
|
764
783
|
return invalid(
|
|
765
|
-
|
|
784
|
+
mcpCapsule
|
|
785
|
+
? "sandboxExecutionContract is restricted to direct MCP capsule shell:false launches"
|
|
786
|
+
: "sandboxExecutionContract is restricted to direct plugin:bin shell:false launches",
|
|
766
787
|
);
|
|
767
788
|
}
|
|
768
789
|
|
|
@@ -804,17 +825,19 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
804
825
|
);
|
|
805
826
|
}
|
|
806
827
|
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
if (
|
|
811
|
-
!provenanceIdentity ||
|
|
812
|
-
provenanceIdentity.realPath !== entryIdentity.realPath ||
|
|
813
|
-
provenanceIdentity.sha256 !== entryIdentity.sha256
|
|
814
|
-
) {
|
|
815
|
-
return invalid(
|
|
816
|
-
"sandboxExecutionContract entry identity does not match plugin provenance",
|
|
828
|
+
if (!mcpCapsule) {
|
|
829
|
+
const provenanceIdentity = this._normalizePluginExecutableIdentity(
|
|
830
|
+
options.pluginExecutableIdentity,
|
|
817
831
|
);
|
|
832
|
+
if (
|
|
833
|
+
!provenanceIdentity ||
|
|
834
|
+
provenanceIdentity.realPath !== entryIdentity.realPath ||
|
|
835
|
+
provenanceIdentity.sha256 !== entryIdentity.sha256
|
|
836
|
+
) {
|
|
837
|
+
return invalid(
|
|
838
|
+
"sandboxExecutionContract entry identity does not match plugin provenance",
|
|
839
|
+
);
|
|
840
|
+
}
|
|
818
841
|
}
|
|
819
842
|
const entryRelative = path.relative(
|
|
820
843
|
path.resolve(raw.pluginRoot),
|
|
@@ -1181,6 +1204,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1181
1204
|
"pluginTreeSnapshotContractBound",
|
|
1182
1205
|
"pluginTreeSnapshotAtomic",
|
|
1183
1206
|
"initialDynamicLoadClosureDescriptorBound",
|
|
1207
|
+
"sharedLibraryClosure",
|
|
1208
|
+
"entrySnapshotAtomic",
|
|
1209
|
+
"runtimeLaunchAtomic",
|
|
1184
1210
|
]) {
|
|
1185
1211
|
if (
|
|
1186
1212
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1197,6 +1223,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1197
1223
|
"pluginTreeContentSnapshotBytes",
|
|
1198
1224
|
"initialDynamicDependencyCount",
|
|
1199
1225
|
"initialDynamicRuntimeFileCount",
|
|
1226
|
+
"runtimeSnapshotBytes",
|
|
1227
|
+
"runtimeAttestedBytes",
|
|
1228
|
+
"entrySnapshotBytes",
|
|
1200
1229
|
]) {
|
|
1201
1230
|
if (
|
|
1202
1231
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1209,6 +1238,22 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1209
1238
|
);
|
|
1210
1239
|
}
|
|
1211
1240
|
}
|
|
1241
|
+
for (const field of [
|
|
1242
|
+
"runtimeSnapshotSha256",
|
|
1243
|
+
"runtimeAttestedSha256",
|
|
1244
|
+
"entrySnapshotSha256",
|
|
1245
|
+
]) {
|
|
1246
|
+
if (
|
|
1247
|
+
plan.runtimeProbe[field] !== undefined &&
|
|
1248
|
+
(typeof plan.runtimeProbe[field] !== "string" ||
|
|
1249
|
+
!/^[a-f0-9]{64}$/.test(plan.runtimeProbe[field]))
|
|
1250
|
+
) {
|
|
1251
|
+
throw this._sandboxError(
|
|
1252
|
+
"invalid_sandbox_plan",
|
|
1253
|
+
`Sandbox runtime probe ${field} must be a lowercase SHA-256 value`,
|
|
1254
|
+
);
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1212
1257
|
if (
|
|
1213
1258
|
plan.runtimeProbe.pluginTreeContentSnapshotDigest !== undefined &&
|
|
1214
1259
|
(typeof plan.runtimeProbe.pluginTreeContentSnapshotDigest !==
|
|
@@ -1510,6 +1555,78 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1510
1555
|
"Sandbox runtime probe successful dynamic ELF evidence requires a descriptor-bound initial direct system set",
|
|
1511
1556
|
);
|
|
1512
1557
|
}
|
|
1558
|
+
const codeSnapshotGuaranteed = guarantees.includes(
|
|
1559
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
1560
|
+
);
|
|
1561
|
+
if (codeSnapshotGuaranteed) {
|
|
1562
|
+
const exactSnapshotEvidence =
|
|
1563
|
+
plan.applied === true &&
|
|
1564
|
+
candidateBackend === null &&
|
|
1565
|
+
plan.runtimeProbe.attempted === true &&
|
|
1566
|
+
plan.runtimeProbe.runnable === true &&
|
|
1567
|
+
plan.runtimeProbe.reason === null &&
|
|
1568
|
+
plan.runtimeProbe.probeRuntime === "node" &&
|
|
1569
|
+
plan.runtimeProbe.targetRuntime === "node" &&
|
|
1570
|
+
plan.runtimeProbe.contentSnapshot === true &&
|
|
1571
|
+
plan.runtimeProbe.sharedLibraryClosure === false &&
|
|
1572
|
+
/^[a-f0-9]{64}$/.test(plan.runtimeProbe.entrySnapshotSha256 || "") &&
|
|
1573
|
+
Number.isSafeInteger(plan.runtimeProbe.entrySnapshotBytes) &&
|
|
1574
|
+
plan.runtimeProbe.entrySnapshotBytes >= 0 &&
|
|
1575
|
+
plan.runtimeProbe.entrySnapshotBytes <= 64 * 1024 * 1024;
|
|
1576
|
+
const linuxSnapshotEvidence =
|
|
1577
|
+
plan.platform === "linux" &&
|
|
1578
|
+
backend === "linux-fd-code-snapshot" &&
|
|
1579
|
+
plan.enforcement === "linux-fd-code-snapshot" &&
|
|
1580
|
+
policyAttested === true &&
|
|
1581
|
+
policyDigest !== null &&
|
|
1582
|
+
plan.runtimeProbe.kind === "linux-mcp-capsule-code-snapshot-v1" &&
|
|
1583
|
+
plan.runtimeProbe.contentSnapshotScope ===
|
|
1584
|
+
"mcp-capsule-entry-and-node-runtime" &&
|
|
1585
|
+
plan.runtimeProbe.contentSnapshotMechanism ===
|
|
1586
|
+
"verified-o_tmpfile-copy-inherited-fd-exec-v1" &&
|
|
1587
|
+
plan.runtimeProbe.handleAtomic === true &&
|
|
1588
|
+
/^[a-f0-9]{64}$/.test(
|
|
1589
|
+
plan.runtimeProbe.runtimeSnapshotSha256 || "",
|
|
1590
|
+
) &&
|
|
1591
|
+
Number.isSafeInteger(plan.runtimeProbe.runtimeSnapshotBytes) &&
|
|
1592
|
+
plan.runtimeProbe.runtimeSnapshotBytes > 0 &&
|
|
1593
|
+
plan.runtimeProbe.runtimeSnapshotBytes <= 256 * 1024 * 1024 &&
|
|
1594
|
+
/^\/proc\/self\/fd\/\d+$/.test(plan.command) &&
|
|
1595
|
+
/^\/proc\/self\/fd\/\d+$/.test(plan.args[0] || "");
|
|
1596
|
+
const windowsSnapshotEvidence =
|
|
1597
|
+
plan.platform === "win32" &&
|
|
1598
|
+
[
|
|
1599
|
+
"windows-job-restricted-token",
|
|
1600
|
+
"windows-appcontainer-job-restricted-token",
|
|
1601
|
+
].includes(backend) &&
|
|
1602
|
+
plan.enforcement === backend &&
|
|
1603
|
+
[
|
|
1604
|
+
"windows-plugin-node-entry-snapshot-v1",
|
|
1605
|
+
"windows-appcontainer-launch-attestation-v1",
|
|
1606
|
+
].includes(plan.runtimeProbe.kind) &&
|
|
1607
|
+
plan.runtimeProbe.contentSnapshotScope ===
|
|
1608
|
+
"mcp-capsule-entry-source" &&
|
|
1609
|
+
plan.runtimeProbe.contentSnapshotMechanism ===
|
|
1610
|
+
"verified-handle-inherited-pipe-module-compile-v1" &&
|
|
1611
|
+
plan.runtimeProbe.handleAtomic === false &&
|
|
1612
|
+
plan.runtimeProbe.entrySnapshotAtomic === true &&
|
|
1613
|
+
plan.runtimeProbe.runtimeLaunchAtomic === false &&
|
|
1614
|
+
/^[a-f0-9]{64}$/.test(
|
|
1615
|
+
plan.runtimeProbe.runtimeAttestedSha256 || "",
|
|
1616
|
+
) &&
|
|
1617
|
+
Number.isSafeInteger(plan.runtimeProbe.runtimeAttestedBytes) &&
|
|
1618
|
+
plan.runtimeProbe.runtimeAttestedBytes > 0 &&
|
|
1619
|
+
plan.runtimeProbe.runtimeAttestedBytes <= 256 * 1024 * 1024;
|
|
1620
|
+
if (
|
|
1621
|
+
!exactSnapshotEvidence ||
|
|
1622
|
+
(!linuxSnapshotEvidence && !windowsSnapshotEvidence)
|
|
1623
|
+
) {
|
|
1624
|
+
throw this._sandboxError(
|
|
1625
|
+
"invalid_sandbox_plan",
|
|
1626
|
+
"Code snapshot guarantee requires typed atomic MCP capsule evidence",
|
|
1627
|
+
);
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1513
1630
|
const genericWorkspaceEvidenceFields = [
|
|
1514
1631
|
"contractDigest",
|
|
1515
1632
|
"policyDigest",
|
|
@@ -1801,6 +1918,26 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1801
1918
|
plan.runtimeProbe.contentSnapshotMechanism,
|
|
1802
1919
|
}
|
|
1803
1920
|
: {}),
|
|
1921
|
+
...(plan.runtimeProbe.runtimeSnapshotSha256 !== undefined
|
|
1922
|
+
? {
|
|
1923
|
+
runtimeSnapshotSha256: plan.runtimeProbe.runtimeSnapshotSha256,
|
|
1924
|
+
runtimeSnapshotBytes: plan.runtimeProbe.runtimeSnapshotBytes,
|
|
1925
|
+
entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
|
|
1926
|
+
entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
|
|
1927
|
+
sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
|
|
1928
|
+
}
|
|
1929
|
+
: {}),
|
|
1930
|
+
...(plan.runtimeProbe.runtimeAttestedSha256 !== undefined
|
|
1931
|
+
? {
|
|
1932
|
+
runtimeAttestedSha256: plan.runtimeProbe.runtimeAttestedSha256,
|
|
1933
|
+
runtimeAttestedBytes: plan.runtimeProbe.runtimeAttestedBytes,
|
|
1934
|
+
entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
|
|
1935
|
+
entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
|
|
1936
|
+
entrySnapshotAtomic: plan.runtimeProbe.entrySnapshotAtomic,
|
|
1937
|
+
runtimeLaunchAtomic: plan.runtimeProbe.runtimeLaunchAtomic,
|
|
1938
|
+
sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
|
|
1939
|
+
}
|
|
1940
|
+
: {}),
|
|
1804
1941
|
};
|
|
1805
1942
|
for (const field of [
|
|
1806
1943
|
"pluginTreeContentSnapshot",
|
|
@@ -2820,6 +2957,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2820
2957
|
this._stripWorkspaceTransactionOptions(spawnOpts);
|
|
2821
2958
|
this._stripAuditControlOptions(spawnOpts);
|
|
2822
2959
|
delete spawnOpts.mcpStdioExecutableIdentityAuthority;
|
|
2960
|
+
delete spawnOpts.mcpStdioExecutableIdentityDigest;
|
|
2823
2961
|
if (traceCtx) {
|
|
2824
2962
|
spawnOpts.env = { ...(spawnOpts.env || process.env) };
|
|
2825
2963
|
spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
|
|
@@ -2896,7 +3034,11 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2896
3034
|
if (mcpStdioExecutableIdentityAuthority !== undefined) {
|
|
2897
3035
|
const admitted = consumeMcpStdioExecutableIdentityAuthority(
|
|
2898
3036
|
mcpStdioExecutableIdentityAuthority,
|
|
2899
|
-
{
|
|
3037
|
+
{
|
|
3038
|
+
command: identityCommand,
|
|
3039
|
+
args: identityArgs,
|
|
3040
|
+
env: optsForSpawn.env || {},
|
|
3041
|
+
},
|
|
2900
3042
|
);
|
|
2901
3043
|
auditEntry.mcpStdioExecutableIdentityDigest = admitted.identityDigest;
|
|
2902
3044
|
}
|
|
@@ -2934,15 +3076,16 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2934
3076
|
if (
|
|
2935
3077
|
sandboxPlan.applied === true &&
|
|
2936
3078
|
(sandboxPlan.backend === "linux-bwrap-workspace" ||
|
|
2937
|
-
sandboxPlan.backend === "linux-bwrap"
|
|
3079
|
+
sandboxPlan.backend === "linux-bwrap" ||
|
|
3080
|
+
sandboxPlan.backend === "linux-fd-code-snapshot") &&
|
|
2938
3081
|
sandboxPlan.postSpawn.required === false
|
|
2939
3082
|
) {
|
|
2940
3083
|
// child_process.spawn() has synchronously duplicated every stdio entry
|
|
2941
|
-
// into the launched
|
|
2942
|
-
//
|
|
3084
|
+
// into the launched process before returning. The generic/direct bwrap
|
|
3085
|
+
// backends and the MCP anonymous-code snapshot backend are complete
|
|
2943
3086
|
// pre-spawn plans with no parent-side enforcement handle. Retaining
|
|
2944
|
-
// their pinned
|
|
2945
|
-
//
|
|
3087
|
+
// their pinned descriptors until a long-lived process exits would turn
|
|
3088
|
+
// each child into an avoidable FD leak.
|
|
2946
3089
|
cleanupSandbox();
|
|
2947
3090
|
}
|
|
2948
3091
|
try {
|