chainlesschain 0.165.5 → 0.165.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-B3gWmXjo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-G9pdT-0e.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-Ca30J7m2.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BtVTm8PU.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-BhViNa6u.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DhKq-FnY.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-BL0SVbnE.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-BWkblnFi.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-ClaRNrF8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-sZE2Z77o.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BAfKOnRe.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-Cvhay5WM.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-BpejL-4N.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-g2Ki6g_1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-D2xKbNo9.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DbL1Pds3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-DGtZCV4c.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-4kQpoNsI.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-BxTYXXAN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-k0J0LT2N.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-BaqhoPgN.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-T4RVPIM1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-DszOToWq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9KJU7HF.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-Cmr0JnsA.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-BI-_2xZX.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-DsnDEPsl.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-BLncAKKK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BPQhGXDn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-CyElbUQW.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-CcSntBQD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-p6e7HZ2r.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-CNEtr-wz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Bj9xI0YH.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Dd2notAJ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-BBsN2CSW.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-Dg2uTvwx.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-r1YMRiJV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-C-89kSm4.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-CrPZcVgf.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-sxi7hqJb.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-CAgOMfF1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-DafaPts3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CJM-xUW_.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-L0ZjfAh_.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-BB1CvCK0.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-DeLtgAD8.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-CKC2b10z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-eyf2rzY1.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-5upNIOW8.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-B8p3W6JK.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-BnRMxTq3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-DjCNI1li.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-u6gXLbWT.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BZAw4tkM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-B1Tr72q7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-DO7HFuBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BjCztyhj.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-ZWyCUbR1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-DhDjeW4G.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-R_CN2MuU.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-uxFcujeu.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-DX8D7rks.js} +1 -1
- package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-BYahQILD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CUSQ2tm-.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-CnN_S8Cs.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-DcZlh-O4.js} +4 -4
- package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-ZhBOjzIX.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-D5Qnq_lI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-BC9cZ3Be.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-DauJ3E8_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DbNeZ_fh.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-DUvJbSct.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-BXa-5noQ.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-JxaiUt_3.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BW4ERQN8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-DltUbdtv.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-CMoZz0Tc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-D_VEV60K.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-CCXTCs0R.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-lkGRIPcG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BfGeQ9HX.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-BEC7pYvc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-BZdG24o0.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-yoEddedp.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-BXZEprOW.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-gg0bzZal.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DjRVRuin.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-su-dieAc.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-Ci3S8oKF.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CxbFX9uH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-D8F10heH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-11wtYQiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-1IgxgALJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-1agckWSq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-5JqhujnR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-6Tniqk1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-8Z-8BIlN.js} +1 -1
- package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-BCI5v0yB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BDJntYmJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-BGzixOGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BMMOVoLD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-BTFpdBtt.js} +1 -1
- package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-Ba_HyPnE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-BbF1IHof.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-BgT9su_e.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-BzPB6kGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-C6ygzplr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-CC3ZDjzY.js} +1 -1
- package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-CEmXRhAE.js} +1 -1
- package/src/assets/web-panel/assets/index-CJGOlduY.js +1 -0
- package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-CMPqd5Cv.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-COWd8uGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CPIYSp4H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-CR0h6seT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-CUmDhC4j.js} +1 -1
- package/src/assets/web-panel/assets/index-CkBCN5yH.js +1 -0
- package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-CusgZPtc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-DBAETXft.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-DIJ2qFOC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-Dbq4NMET.js} +1 -1
- package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-DkMEF5VT.js} +1 -1
- package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-DkfQR3hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-DnLucOn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-DugB_aKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-DyLUarhZ.js} +3 -3
- package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-T6_6ygJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-Tu8eWqh-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-W7XUgdVL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-dHZinfko.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-jyNgp5FI.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-Cv4p8e4w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-B8EwmMOw.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-B8R9F8TK.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-DoFYz5Bp.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CHWYLBjI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-CXuPDO77.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-BaAtUUon.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-DCc4zcDD.js} +1 -1
- package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-B_lx89oZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-DE8DPmR0.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-1ktXOsL_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-xH89-wjh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-DscvfW5p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-RdMKQta7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-Z3wTni2T.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-B0iChCsm.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +105 -62
- package/src/commands/background-session.js +100 -10
- package/src/commands/git.js +39 -0
- package/src/commands/mcp.js +5 -0
- package/src/commands/plugin.js +160 -29
- package/src/commands/remote-control.js +295 -110
- package/src/commands/session-group.js +131 -0
- package/src/commands/session-location.js +48 -0
- package/src/commands/session-message.js +171 -0
- package/src/commands/session.js +22 -0
- package/src/commands/sync-providers.js +4 -1
- package/src/commands/update.js +1 -0
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/ws-agent-handler.js +20 -12
- package/src/harness/jsonl-session-store.js +279 -37
- package/src/harness/mcp-client.js +832 -91
- package/src/harness/session-index.js +15 -4
- package/src/lib/agent-worktree.js +8 -1
- package/src/lib/auto-mode-safety-classifier.js +3 -17
- package/src/lib/background-agent-keeper-protocol.js +26 -6
- package/src/lib/background-agent-supervisor.js +17 -1
- package/src/lib/background-session-transport.js +153 -27
- package/src/lib/browser-evidence.js +1405 -0
- package/src/lib/chrome-connector.js +465 -79
- package/src/lib/claude-project-auto-memory.js +481 -0
- package/src/lib/claude-project-storage-layout.js +104 -0
- package/src/lib/cloud/cloud-client.js +40 -0
- package/src/lib/execution-location-local-supervisor.mjs +226 -0
- package/src/lib/execution-location-runner-lifecycle.js +991 -0
- package/src/lib/execution-location-target-preflight.js +333 -0
- package/src/lib/execution-location-target.js +783 -13
- package/src/lib/file-lines.js +6 -1
- package/src/lib/gateway-client-resilience.js +571 -0
- package/src/lib/gitlab-mr-worktree.js +176 -0
- package/src/lib/hooks-v2-producers.js +119 -15
- package/src/lib/hooks-v2-workspace-context.js +44 -1
- package/src/lib/host-resource-budget.js +295 -0
- package/src/lib/ide-context.js +15 -2
- package/src/lib/llm-config-defaults.js +43 -0
- package/src/lib/mcp-client.js +2 -0
- package/src/lib/mcp-headers-helper.js +47 -5
- package/src/lib/mcp-lifecycle-authority.js +887 -0
- package/src/lib/mcp-oauth.js +156 -26
- package/src/lib/mcp-tls.js +330 -0
- package/src/lib/output-styles.js +12 -0
- package/src/lib/paths.js +260 -32
- package/src/lib/permission-request.js +48 -0
- package/src/lib/plugin-runtime/bin.js +3 -1
- package/src/lib/plugin-runtime/hooks.js +3 -1
- package/src/lib/plugin-runtime/install.js +730 -71
- package/src/lib/plugin-runtime/lsp.js +4 -4
- package/src/lib/plugin-runtime/marketplace-archive-source.js +366 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +63 -6
- package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
- package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +188 -0
- package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
- package/src/lib/plugin-runtime/mcp.js +3 -1
- package/src/lib/plugin-runtime/monitors.js +3 -1
- package/src/lib/plugin-runtime/remote-source.js +583 -58
- package/src/lib/plugin-runtime/settings.js +3 -1
- package/src/lib/plugin-runtime/trust.js +274 -13
- package/src/lib/plugin-security.js +393 -41
- package/src/lib/plugin-source-identity.js +850 -0
- package/src/lib/process-execution-broker/credential-agent.js +210 -41
- package/src/lib/process-execution-broker/index.js +15 -1
- package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
- package/src/lib/project-mcp-trust.js +165 -10
- package/src/lib/remote-approval-bridge.js +136 -46
- package/src/lib/remote-control.js +217 -31
- package/src/lib/resume-session.js +9 -6
- package/src/lib/session-core-singletons.js +26 -11
- package/src/lib/session-host-lease.js +52 -16
- package/src/lib/session-lifecycle-scope.js +153 -0
- package/src/lib/session-message-fabric.js +1252 -0
- package/src/lib/session-projection.js +286 -3
- package/src/lib/session-runtime-retention.js +155 -0
- package/src/lib/session-store-guard.js +3 -1
- package/src/lib/session-workbench-store.js +466 -0
- package/src/lib/settings-loader.cjs +29 -0
- package/src/lib/spellcheck.js +211 -0
- package/src/lib/sub-agent-context.js +9 -9
- package/src/lib/sync-cli-db.js +485 -129
- package/src/lib/sync-credentials.js +31 -20
- package/src/lib/web-fetch.js +112 -40
- package/src/lib/web-search.js +127 -61
- package/src/lib/workspace-trust.js +793 -0
- package/src/repl/agent-repl.js +175 -19
- package/src/repl/permission-prompt.js +29 -8
- package/src/repl/repl-keybindings.js +55 -0
- package/src/runtime/agent-core.js +362 -20
- package/src/runtime/bootstrap.js +37 -13
- package/src/runtime/coding-agent-contract-shared.cjs +11 -4
- package/src/runtime/headless-runner.js +281 -102
- package/src/runtime/headless-stream.js +199 -30
- package/src/runtime/mcp-config.js +298 -6
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/runtime/status-diagnostics-lite.js +9 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DPy1XMYh.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
- package/src/assets/web-panel/assets/index-z1kFadaX.js +0 -1
|
@@ -24,7 +24,8 @@ import fs, {
|
|
|
24
24
|
import { join, basename, dirname, resolve } from "node:path";
|
|
25
25
|
import { createHash, randomUUID } from "node:crypto";
|
|
26
26
|
import { TextDecoder } from "node:util";
|
|
27
|
-
import { getHomeDir } from "../lib/paths.js";
|
|
27
|
+
import { ensureClaudeProjectStorageTree, getHomeDir } from "../lib/paths.js";
|
|
28
|
+
import { resolveClaudeProjectStorageDir } from "../lib/claude-project-storage-layout.js";
|
|
28
29
|
import { ensurePrivateDirectory, ensurePrivateFile } from "../lib/secure-fs.js";
|
|
29
30
|
import {
|
|
30
31
|
isAffectedWindowsZeroDeviceStatRuntime,
|
|
@@ -78,9 +79,9 @@ import {
|
|
|
78
79
|
} from "../lib/execution-location-contract.js";
|
|
79
80
|
import { canonicalJson } from "../lib/scheduler-kernel/contract.js";
|
|
80
81
|
import {
|
|
81
|
-
listSessionAntiRollbackIds,
|
|
82
|
-
publishSessionAntiRollbackAnchor,
|
|
83
|
-
readSessionAntiRollbackAnchor,
|
|
82
|
+
listSessionAntiRollbackIds as listSessionAntiRollbackIdsForStore,
|
|
83
|
+
publishSessionAntiRollbackAnchor as publishSessionAntiRollbackAnchorForStore,
|
|
84
|
+
readSessionAntiRollbackAnchor as readSessionAntiRollbackAnchorForStore,
|
|
84
85
|
sessionAntiRollbackPredecessorWitness,
|
|
85
86
|
} from "../lib/session-anti-rollback-anchor.js";
|
|
86
87
|
import { normalizeSessionBudgetRootConfig } from "../lib/session-budget-production-root.js";
|
|
@@ -92,6 +93,8 @@ import { normalizeExecutionLocationResultStoreReceipt } from "../lib/execution-l
|
|
|
92
93
|
|
|
93
94
|
let securedSessionsDir = null;
|
|
94
95
|
let securedSessionsDirIdentity = null;
|
|
96
|
+
let securedSessionHostLeaseRoot = null;
|
|
97
|
+
let securedSessionHostLeaseRootIdentity = null;
|
|
95
98
|
|
|
96
99
|
// Deterministic process-crash injection for the independent session-scale
|
|
97
100
|
// gate. The hooks are inert unless the dedicated child process opts in; this
|
|
@@ -169,6 +172,21 @@ const WS_TURN_REQUEST_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/;
|
|
|
169
172
|
const WS_TURN_INPUT_DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/;
|
|
170
173
|
const WS_TURN_CLAIM_ID_PATTERN = /^claim-[0-9a-f-]{36}$/;
|
|
171
174
|
const WS_TURN_FAILURE_CODE_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
175
|
+
// Windows antivirus and directory-replacement latency make a legitimate
|
|
176
|
+
// cross-process append queue materially longer than on POSIX. Keep the same
|
|
177
|
+
// strict owner/token protocol, but give a live owner enough time to drain a
|
|
178
|
+
// high-contention queue instead of reporting a false lock-unavailable error.
|
|
179
|
+
const SESSION_APPEND_LOCK_TIMEOUT_MS =
|
|
180
|
+
process.platform === "win32" ? 120_000 : 30_000;
|
|
181
|
+
const SESSION_APPEND_LOCK_YIELD_AFTER_RELEASE_MS =
|
|
182
|
+
// Every append releases the directory lock before this bounded handoff.
|
|
183
|
+
// On a two-core hosted Windows runner, an 8 ms pause lets the just-released
|
|
184
|
+
// writer reacquire before waiters that are still in their 1–12 ms backoff.
|
|
185
|
+
// The resulting writer starvation makes the formal 20×1000 matrix time out
|
|
186
|
+
// despite every individual operation being healthy. Leave enough room for
|
|
187
|
+
// an existing contender to wake, while retaining the same strict lock and
|
|
188
|
+
// the full append workload.
|
|
189
|
+
process.platform === "win32" ? 32 : 2;
|
|
172
190
|
|
|
173
191
|
export {
|
|
174
192
|
SESSION_GENERATION_AUTHORITY_FIELD,
|
|
@@ -678,7 +696,9 @@ function fsyncParentDirectory(filePath, payload, beforeHook, afterHook) {
|
|
|
678
696
|
}
|
|
679
697
|
|
|
680
698
|
function getSessionsDir() {
|
|
681
|
-
const
|
|
699
|
+
const homeDir = getHomeDir();
|
|
700
|
+
const claudeProjectDir = resolveClaudeProjectStorageDir(homeDir);
|
|
701
|
+
const dir = claudeProjectDir || join(homeDir, "sessions");
|
|
682
702
|
let current = null;
|
|
683
703
|
try {
|
|
684
704
|
current = lstatSync(dir);
|
|
@@ -697,7 +717,11 @@ function getSessionsDir() {
|
|
|
697
717
|
currentIdentity !== securedSessionsDirIdentity ||
|
|
698
718
|
unsafePosixMode
|
|
699
719
|
) {
|
|
700
|
-
|
|
720
|
+
if (claudeProjectDir) {
|
|
721
|
+
ensureClaudeProjectStorageTree(homeDir, claudeProjectDir);
|
|
722
|
+
} else {
|
|
723
|
+
ensurePrivateDirectory(dir);
|
|
724
|
+
}
|
|
701
725
|
securedSessionsDir = dir;
|
|
702
726
|
const secured = lstatSync(dir);
|
|
703
727
|
securedSessionsDirIdentity = `${secured.dev}:${secured.ino}`;
|
|
@@ -705,6 +729,71 @@ function getSessionsDir() {
|
|
|
705
729
|
return dir;
|
|
706
730
|
}
|
|
707
731
|
|
|
732
|
+
/**
|
|
733
|
+
* Keep the legacy anchor namespace keyed by CHAINLESSCHAIN_HOME, while a
|
|
734
|
+
* Claude project gets an independent namespace keyed by its project bucket.
|
|
735
|
+
* Otherwise two project buckets using the same session id would conflict in
|
|
736
|
+
* the machine-local anti-rollback witness.
|
|
737
|
+
*/
|
|
738
|
+
function sessionAntiRollbackPathOptions() {
|
|
739
|
+
const homeDir = getHomeDir();
|
|
740
|
+
return {
|
|
741
|
+
homeDir: resolveClaudeProjectStorageDir(homeDir) || homeDir,
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
function readSessionAntiRollbackAnchor(sessionId) {
|
|
746
|
+
return readSessionAntiRollbackAnchorForStore(
|
|
747
|
+
sessionId,
|
|
748
|
+
sessionAntiRollbackPathOptions(),
|
|
749
|
+
);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function listSessionAntiRollbackIds() {
|
|
753
|
+
return listSessionAntiRollbackIdsForStore(sessionAntiRollbackPathOptions());
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* The legacy lease authority intentionally stays at the historical global
|
|
758
|
+
* state root. Claude project transcripts instead receive a lease directory
|
|
759
|
+
* beside their JSONL so identical ids in separate project buckets cannot
|
|
760
|
+
* fence one another. Cache the verified directory identity to avoid repeated
|
|
761
|
+
* ACL batches on every append.
|
|
762
|
+
*/
|
|
763
|
+
function sessionHostLeaseOptions() {
|
|
764
|
+
const homeDir = getHomeDir();
|
|
765
|
+
const projectDir = resolveClaudeProjectStorageDir(homeDir);
|
|
766
|
+
if (!projectDir) return null;
|
|
767
|
+
const stateRoot = join(projectDir, "session-host-leases");
|
|
768
|
+
let current = null;
|
|
769
|
+
try {
|
|
770
|
+
current = lstatSync(stateRoot);
|
|
771
|
+
} catch {
|
|
772
|
+
// The secure tree helper creates a missing root below.
|
|
773
|
+
}
|
|
774
|
+
const identity = current ? `${current.dev}:${current.ino}` : null;
|
|
775
|
+
const unsafePosixMode =
|
|
776
|
+
process.platform !== "win32" &&
|
|
777
|
+
current !== null &&
|
|
778
|
+
(current.mode & 0o777) !== 0o700;
|
|
779
|
+
if (
|
|
780
|
+
!current ||
|
|
781
|
+
!current.isDirectory() ||
|
|
782
|
+
current.isSymbolicLink() ||
|
|
783
|
+
unsafePosixMode ||
|
|
784
|
+
stateRoot !== securedSessionHostLeaseRoot ||
|
|
785
|
+
identity !== securedSessionHostLeaseRootIdentity
|
|
786
|
+
) {
|
|
787
|
+
ensureClaudeProjectStorageTree(homeDir, projectDir, {
|
|
788
|
+
extraDirectories: [stateRoot],
|
|
789
|
+
});
|
|
790
|
+
const secured = lstatSync(stateRoot);
|
|
791
|
+
securedSessionHostLeaseRoot = stateRoot;
|
|
792
|
+
securedSessionHostLeaseRootIdentity = `${secured.dev}:${secured.ino}`;
|
|
793
|
+
}
|
|
794
|
+
return { stateRoot };
|
|
795
|
+
}
|
|
796
|
+
|
|
708
797
|
/**
|
|
709
798
|
* A session id must be a single safe path segment. Ids are generated as
|
|
710
799
|
* `session-<ts>-<hex>`, but also arrive from CLI args (`cc agent --resume <id>`,
|
|
@@ -799,7 +888,11 @@ function samePhysicalTranscriptState(left, right, { content = true } = {}) {
|
|
|
799
888
|
);
|
|
800
889
|
}
|
|
801
890
|
|
|
802
|
-
function samePhysicalTranscriptContentState(
|
|
891
|
+
function samePhysicalTranscriptContentState(
|
|
892
|
+
left,
|
|
893
|
+
right,
|
|
894
|
+
{ includeCtime = true } = {},
|
|
895
|
+
) {
|
|
803
896
|
if (!left || !right) return left === right;
|
|
804
897
|
const sameField = (exactField, legacyField) => {
|
|
805
898
|
if (left[exactField] != null && right[exactField] != null) {
|
|
@@ -810,7 +903,7 @@ function samePhysicalTranscriptContentState(left, right) {
|
|
|
810
903
|
return (
|
|
811
904
|
sameField("sizeExact", "size") &&
|
|
812
905
|
sameField("mtimeNs", "mtimeMs") &&
|
|
813
|
-
sameField("ctimeNs", "ctimeMs")
|
|
906
|
+
(!includeCtime || sameField("ctimeNs", "ctimeMs"))
|
|
814
907
|
);
|
|
815
908
|
}
|
|
816
909
|
|
|
@@ -1072,7 +1165,12 @@ function appendVerifiedWsAuthorityEventLocked(
|
|
|
1072
1165
|
function withSessionHostWriterLock(sessionId, filePath, task, options) {
|
|
1073
1166
|
return withFileLock(
|
|
1074
1167
|
filePath,
|
|
1075
|
-
() =>
|
|
1168
|
+
() =>
|
|
1169
|
+
withSessionHostWriteAuthority(
|
|
1170
|
+
sessionId,
|
|
1171
|
+
task,
|
|
1172
|
+
sessionHostLeaseOptions() || undefined,
|
|
1173
|
+
),
|
|
1076
1174
|
options,
|
|
1077
1175
|
);
|
|
1078
1176
|
}
|
|
@@ -1459,7 +1557,8 @@ function publishSessionAntiRollbackWitness(
|
|
|
1459
1557
|
error.code = "CC_SESSION_ANTI_ROLLBACK_UNAVAILABLE";
|
|
1460
1558
|
throw error;
|
|
1461
1559
|
}
|
|
1462
|
-
return
|
|
1560
|
+
return publishSessionAntiRollbackAnchorForStore(sessionId, candidate, {
|
|
1561
|
+
...sessionAntiRollbackPathOptions(),
|
|
1463
1562
|
provePrefix: (current) =>
|
|
1464
1563
|
current.status === "live" &&
|
|
1465
1564
|
existsSync(filePath) &&
|
|
@@ -1710,11 +1809,11 @@ function appendEventLocked(
|
|
|
1710
1809
|
},
|
|
1711
1810
|
{
|
|
1712
1811
|
failIfUnavailable: true,
|
|
1713
|
-
timeoutMs:
|
|
1812
|
+
timeoutMs: SESSION_APPEND_LOCK_TIMEOUT_MS,
|
|
1714
1813
|
retryMs: 1,
|
|
1715
1814
|
maxRetryMs: 8,
|
|
1716
1815
|
retryJitterMs: 4,
|
|
1717
|
-
yieldAfterReleaseMs:
|
|
1816
|
+
yieldAfterReleaseMs: SESSION_APPEND_LOCK_YIELD_AFTER_RELEASE_MS,
|
|
1718
1817
|
},
|
|
1719
1818
|
);
|
|
1720
1819
|
}
|
|
@@ -3655,6 +3754,101 @@ function sessionReplicaReceipt(sessionId, expected, installed) {
|
|
|
3655
3754
|
});
|
|
3656
3755
|
}
|
|
3657
3756
|
|
|
3757
|
+
/**
|
|
3758
|
+
* Windows ACL enforcement can advance ctime without changing a transcript's
|
|
3759
|
+
* bytes, mtime, or file identity. A target process normally observes that only
|
|
3760
|
+
* after a prior replica install has already sealed the sidecar witness. Before
|
|
3761
|
+
* accepting that narrow drift, re-verify the full hash chain and retain the
|
|
3762
|
+
* independent anti-rollback witness check performed by
|
|
3763
|
+
* assertVerifiedTranscriptAnchor(). Any content, identity, head, or count
|
|
3764
|
+
* mismatch remains fail-closed.
|
|
3765
|
+
*
|
|
3766
|
+
* Callers must already hold the session host writer lock.
|
|
3767
|
+
*/
|
|
3768
|
+
function resealWindowsAclMetadataWitnessUnlocked(
|
|
3769
|
+
sessionId,
|
|
3770
|
+
sessionsDir,
|
|
3771
|
+
filePath,
|
|
3772
|
+
meta,
|
|
3773
|
+
) {
|
|
3774
|
+
if (
|
|
3775
|
+
process.platform !== "win32" ||
|
|
3776
|
+
meta?.deleted === true ||
|
|
3777
|
+
!meta?.transcript
|
|
3778
|
+
) {
|
|
3779
|
+
return null;
|
|
3780
|
+
}
|
|
3781
|
+
|
|
3782
|
+
let before;
|
|
3783
|
+
try {
|
|
3784
|
+
before = readPhysicalTranscriptState(filePath);
|
|
3785
|
+
} catch {
|
|
3786
|
+
return null;
|
|
3787
|
+
}
|
|
3788
|
+
if (samePhysicalTranscriptState(meta.transcript, before)) {
|
|
3789
|
+
return null;
|
|
3790
|
+
}
|
|
3791
|
+
if (
|
|
3792
|
+
!samePhysicalTranscriptState(meta.transcript, before, {
|
|
3793
|
+
content: false,
|
|
3794
|
+
}) ||
|
|
3795
|
+
!samePhysicalTranscriptContentState(meta.transcript, before, {
|
|
3796
|
+
includeCtime: false,
|
|
3797
|
+
})
|
|
3798
|
+
) {
|
|
3799
|
+
return null;
|
|
3800
|
+
}
|
|
3801
|
+
|
|
3802
|
+
const verification = verifyTranscriptFile(filePath);
|
|
3803
|
+
const after = readPhysicalTranscriptState(filePath);
|
|
3804
|
+
if (!samePhysicalTranscriptState(before, after)) {
|
|
3805
|
+
throw transcriptIdentityError(
|
|
3806
|
+
"not-committed",
|
|
3807
|
+
"the transcript changed while its ACL metadata drift was verified",
|
|
3808
|
+
);
|
|
3809
|
+
}
|
|
3810
|
+
if (
|
|
3811
|
+
verification.status !== TRANSCRIPT_CHAIN_STATUS.VERIFIED ||
|
|
3812
|
+
verification.malformedLines > 0 ||
|
|
3813
|
+
verification.truncatedTail ||
|
|
3814
|
+
verification.lastHash !== meta.last_hash ||
|
|
3815
|
+
verification.chainedEvents !== Number(meta.event_count)
|
|
3816
|
+
) {
|
|
3817
|
+
return null;
|
|
3818
|
+
}
|
|
3819
|
+
|
|
3820
|
+
const resealed = rebuildSessionMetaUnlocked(sessionsDir, sessionId, filePath);
|
|
3821
|
+
assertVerifiedTranscriptAnchor(sessionId, verification, resealed.transcript);
|
|
3822
|
+
return resealed;
|
|
3823
|
+
}
|
|
3824
|
+
|
|
3825
|
+
function resealWindowsAclMetadataWitness(sessionId) {
|
|
3826
|
+
if (process.platform !== "win32") return null;
|
|
3827
|
+
const filePath = sessionPath(sessionId);
|
|
3828
|
+
const sessionsDir = getSessionsDir();
|
|
3829
|
+
return withSessionHostWriterLock(
|
|
3830
|
+
sessionId,
|
|
3831
|
+
filePath,
|
|
3832
|
+
() => {
|
|
3833
|
+
const meta = readSessionMeta(sessionsDir, sessionId);
|
|
3834
|
+
return resealWindowsAclMetadataWitnessUnlocked(
|
|
3835
|
+
sessionId,
|
|
3836
|
+
sessionsDir,
|
|
3837
|
+
filePath,
|
|
3838
|
+
meta,
|
|
3839
|
+
);
|
|
3840
|
+
},
|
|
3841
|
+
{
|
|
3842
|
+
failIfUnavailable: true,
|
|
3843
|
+
timeoutMs: 30_000,
|
|
3844
|
+
retryMs: 1,
|
|
3845
|
+
maxRetryMs: 8,
|
|
3846
|
+
retryJitterMs: 4,
|
|
3847
|
+
yieldAfterReleaseMs: 2,
|
|
3848
|
+
},
|
|
3849
|
+
);
|
|
3850
|
+
}
|
|
3851
|
+
|
|
3658
3852
|
function sessionLocationDigest(domain, value) {
|
|
3659
3853
|
return `sha256:${createHash("sha256")
|
|
3660
3854
|
.update(domain, "utf8")
|
|
@@ -4005,7 +4199,7 @@ function createSessionResultCollectionSettlementData(
|
|
|
4005
4199
|
gaps: collection.gaps,
|
|
4006
4200
|
};
|
|
4007
4201
|
if (
|
|
4008
|
-
!["wsl", "ssh", "container"].includes(collection.target) ||
|
|
4202
|
+
!["local", "wsl", "ssh", "container"].includes(collection.target) ||
|
|
4009
4203
|
collection.continuity !== "single-fixed-command-response" ||
|
|
4010
4204
|
JSON.stringify(collection.gaps) !==
|
|
4011
4205
|
JSON.stringify([
|
|
@@ -4085,7 +4279,9 @@ function normalizeSessionResultCollectionSettlementData(sessionId, data) {
|
|
|
4085
4279
|
!isLegacy &&
|
|
4086
4280
|
data.schema !== SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_SCHEMA
|
|
4087
4281
|
) {
|
|
4088
|
-
throw new TypeError(
|
|
4282
|
+
throw new TypeError(
|
|
4283
|
+
"session result collection settlement schema is invalid",
|
|
4284
|
+
);
|
|
4089
4285
|
}
|
|
4090
4286
|
const source = normalizeSessionResultCollectionSource(data.source, sessionId);
|
|
4091
4287
|
const target = exactRecord(
|
|
@@ -4216,7 +4412,9 @@ function projectSessionResultCollectionSettlement(
|
|
|
4216
4412
|
!legacy &&
|
|
4217
4413
|
data.schema !== SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_SCHEMA
|
|
4218
4414
|
) {
|
|
4219
|
-
throw new TypeError(
|
|
4415
|
+
throw new TypeError(
|
|
4416
|
+
"session result collection settlement schema is invalid",
|
|
4417
|
+
);
|
|
4220
4418
|
}
|
|
4221
4419
|
const normalized = normalizeSessionResultCollectionSettlementData(
|
|
4222
4420
|
sessionId,
|
|
@@ -4295,7 +4493,9 @@ export function readVerifiedSessionExecutionLocationResultSettlement(
|
|
|
4295
4493
|
return {
|
|
4296
4494
|
accept(event) {
|
|
4297
4495
|
eventCount += 1;
|
|
4298
|
-
if (
|
|
4496
|
+
if (
|
|
4497
|
+
event?.type !== SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_EVENT
|
|
4498
|
+
) {
|
|
4299
4499
|
return;
|
|
4300
4500
|
}
|
|
4301
4501
|
const settlement = projectSessionResultCollectionSettlement(
|
|
@@ -4403,11 +4603,7 @@ export function settleSessionExecutionLocationResultCollection(
|
|
|
4403
4603
|
}
|
|
4404
4604
|
|
|
4405
4605
|
function normalizeSessionResultApplyId(value) {
|
|
4406
|
-
const applyId = boundedAuthorityString(
|
|
4407
|
-
value,
|
|
4408
|
-
"result apply id",
|
|
4409
|
-
128,
|
|
4410
|
-
);
|
|
4606
|
+
const applyId = boundedAuthorityString(value, "result apply id", 128);
|
|
4411
4607
|
if (!/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/u.test(applyId)) {
|
|
4412
4608
|
throw new TypeError("result apply id is invalid");
|
|
4413
4609
|
}
|
|
@@ -4445,7 +4641,11 @@ function normalizeSessionResultApplyPreparedTransaction(input) {
|
|
|
4445
4641
|
],
|
|
4446
4642
|
"result apply prepared transaction",
|
|
4447
4643
|
);
|
|
4448
|
-
const id = boundedAuthorityString(
|
|
4644
|
+
const id = boundedAuthorityString(
|
|
4645
|
+
value.id,
|
|
4646
|
+
"result apply transaction id",
|
|
4647
|
+
192,
|
|
4648
|
+
);
|
|
4449
4649
|
const checkpointId = boundedAuthorityString(
|
|
4450
4650
|
value.checkpointId,
|
|
4451
4651
|
"result apply checkpoint id",
|
|
@@ -4628,7 +4828,9 @@ function projectSessionResultApplyReservation(
|
|
|
4628
4828
|
eventCount !== settlement.eventCount + 1 ||
|
|
4629
4829
|
data.applied !== false
|
|
4630
4830
|
) {
|
|
4631
|
-
throw new TypeError(
|
|
4831
|
+
throw new TypeError(
|
|
4832
|
+
"session result apply reservation predecessor is invalid",
|
|
4833
|
+
);
|
|
4632
4834
|
}
|
|
4633
4835
|
const material = {
|
|
4634
4836
|
schema: SESSION_EXECUTION_LOCATION_RESULT_APPLY_RESERVATION_SCHEMA,
|
|
@@ -4838,7 +5040,9 @@ export function readVerifiedSessionExecutionLocationResultApply(
|
|
|
4838
5040
|
return {
|
|
4839
5041
|
accept(event) {
|
|
4840
5042
|
eventCount += 1;
|
|
4841
|
-
if (
|
|
5043
|
+
if (
|
|
5044
|
+
event?.type === SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_EVENT
|
|
5045
|
+
) {
|
|
4842
5046
|
const settlement = projectSessionResultCollectionSettlement(
|
|
4843
5047
|
sessionId,
|
|
4844
5048
|
event,
|
|
@@ -4847,7 +5051,10 @@ export function readVerifiedSessionExecutionLocationResultApply(
|
|
|
4847
5051
|
settlements.set(settlement.settlementId, settlement);
|
|
4848
5052
|
return;
|
|
4849
5053
|
}
|
|
4850
|
-
if (
|
|
5054
|
+
if (
|
|
5055
|
+
event?.type ===
|
|
5056
|
+
SESSION_EXECUTION_LOCATION_RESULT_APPLY_RESERVATION_EVENT
|
|
5057
|
+
) {
|
|
4851
5058
|
const settlement = settlements.get(event?.data?.settlementId) || null;
|
|
4852
5059
|
const reservation = projectSessionResultApplyReservation(
|
|
4853
5060
|
sessionId,
|
|
@@ -4866,7 +5073,9 @@ export function readVerifiedSessionExecutionLocationResultApply(
|
|
|
4866
5073
|
reservations.set(reservation.applyId, reservation);
|
|
4867
5074
|
return;
|
|
4868
5075
|
}
|
|
4869
|
-
if (
|
|
5076
|
+
if (
|
|
5077
|
+
event?.type === SESSION_EXECUTION_LOCATION_RESULT_APPLY_TERMINAL_EVENT
|
|
5078
|
+
) {
|
|
4870
5079
|
const reservation = reservations.get(event?.data?.applyId) || null;
|
|
4871
5080
|
const terminal = projectSessionResultApplyTerminal(
|
|
4872
5081
|
sessionId,
|
|
@@ -4924,7 +5133,11 @@ export function reserveSessionExecutionLocationResultApply(
|
|
|
4924
5133
|
if (prior.reservation.reservationId !== data.reservationId) {
|
|
4925
5134
|
throw new Error("result apply id is already bound to different inputs");
|
|
4926
5135
|
}
|
|
4927
|
-
return Object.freeze({
|
|
5136
|
+
return Object.freeze({
|
|
5137
|
+
...prior,
|
|
5138
|
+
reservationAppended: false,
|
|
5139
|
+
recovered: true,
|
|
5140
|
+
});
|
|
4928
5141
|
}
|
|
4929
5142
|
appendAuthorityEventIfHead(
|
|
4930
5143
|
sessionId,
|
|
@@ -4934,7 +5147,11 @@ export function reserveSessionExecutionLocationResultApply(
|
|
|
4934
5147
|
);
|
|
4935
5148
|
runSessionScaleFaultHook(
|
|
4936
5149
|
"afterResultApplyReservationAppend",
|
|
4937
|
-
Object.freeze({
|
|
5150
|
+
Object.freeze({
|
|
5151
|
+
sessionId,
|
|
5152
|
+
applyId: data.applyId,
|
|
5153
|
+
reservationId: data.reservationId,
|
|
5154
|
+
}),
|
|
4938
5155
|
);
|
|
4939
5156
|
const receipt = readVerifiedSessionExecutionLocationResultApply(
|
|
4940
5157
|
sessionId,
|
|
@@ -4946,7 +5163,11 @@ export function reserveSessionExecutionLocationResultApply(
|
|
|
4946
5163
|
) {
|
|
4947
5164
|
throw new Error("result apply reservation is not canonical");
|
|
4948
5165
|
}
|
|
4949
|
-
return Object.freeze({
|
|
5166
|
+
return Object.freeze({
|
|
5167
|
+
...receipt,
|
|
5168
|
+
reservationAppended: true,
|
|
5169
|
+
recovered: false,
|
|
5170
|
+
});
|
|
4950
5171
|
}
|
|
4951
5172
|
|
|
4952
5173
|
export function settleSessionExecutionLocationResultApply(
|
|
@@ -4956,13 +5177,15 @@ export function settleSessionExecutionLocationResultApply(
|
|
|
4956
5177
|
transaction,
|
|
4957
5178
|
) {
|
|
4958
5179
|
const applyId = normalizeSessionResultApplyId(applyIdInput);
|
|
4959
|
-
const prior = readVerifiedSessionExecutionLocationResultApply(
|
|
5180
|
+
const prior = readVerifiedSessionExecutionLocationResultApply(
|
|
5181
|
+
sessionId,
|
|
5182
|
+
applyId,
|
|
5183
|
+
);
|
|
4960
5184
|
if (prior === null) {
|
|
4961
5185
|
throw new Error("result apply reservation was not found");
|
|
4962
5186
|
}
|
|
4963
|
-
const normalizedTransaction =
|
|
4964
|
-
transaction
|
|
4965
|
-
);
|
|
5187
|
+
const normalizedTransaction =
|
|
5188
|
+
normalizeSessionResultApplyTerminalTransaction(transaction);
|
|
4966
5189
|
if (prior.terminal !== null) {
|
|
4967
5190
|
if (
|
|
4968
5191
|
prior.status !== outcome ||
|
|
@@ -4971,7 +5194,11 @@ export function settleSessionExecutionLocationResultApply(
|
|
|
4971
5194
|
) {
|
|
4972
5195
|
throw new Error("result apply is already settled differently");
|
|
4973
5196
|
}
|
|
4974
|
-
return Object.freeze({
|
|
5197
|
+
return Object.freeze({
|
|
5198
|
+
...prior,
|
|
5199
|
+
terminalAppended: false,
|
|
5200
|
+
recovered: true,
|
|
5201
|
+
});
|
|
4975
5202
|
}
|
|
4976
5203
|
const current = getVerifiedSessionExecutionLocationAuthority(sessionId);
|
|
4977
5204
|
const reservation = Object.freeze({
|
|
@@ -5010,17 +5237,28 @@ export function settleSessionExecutionLocationResultApply(
|
|
|
5010
5237
|
) {
|
|
5011
5238
|
throw error;
|
|
5012
5239
|
}
|
|
5013
|
-
return Object.freeze({
|
|
5240
|
+
return Object.freeze({
|
|
5241
|
+
...raced,
|
|
5242
|
+
terminalAppended: false,
|
|
5243
|
+
recovered: true,
|
|
5244
|
+
});
|
|
5014
5245
|
}
|
|
5015
5246
|
runSessionScaleFaultHook(
|
|
5016
5247
|
"afterResultApplyTerminalAppend",
|
|
5017
5248
|
Object.freeze({ sessionId, applyId, terminalId: data.terminalId }),
|
|
5018
5249
|
);
|
|
5019
|
-
const receipt = readVerifiedSessionExecutionLocationResultApply(
|
|
5250
|
+
const receipt = readVerifiedSessionExecutionLocationResultApply(
|
|
5251
|
+
sessionId,
|
|
5252
|
+
applyId,
|
|
5253
|
+
);
|
|
5020
5254
|
if (receipt?.terminal?.terminalId !== data.terminalId) {
|
|
5021
5255
|
throw new Error("result apply terminal is not canonical");
|
|
5022
5256
|
}
|
|
5023
|
-
return Object.freeze({
|
|
5257
|
+
return Object.freeze({
|
|
5258
|
+
...receipt,
|
|
5259
|
+
terminalAppended: true,
|
|
5260
|
+
recovered: false,
|
|
5261
|
+
});
|
|
5024
5262
|
}
|
|
5025
5263
|
|
|
5026
5264
|
/**
|
|
@@ -5059,6 +5297,9 @@ export function installSessionReplica(sessionId, input, expectedInput) {
|
|
|
5059
5297
|
sessionsDir,
|
|
5060
5298
|
`.${basename(filePath)}.replica.pending`,
|
|
5061
5299
|
);
|
|
5300
|
+
if (getSessionPresence(sessionId) === SESSION_PRESENCE.PRESENT) {
|
|
5301
|
+
resealWindowsAclMetadataWitness(sessionId);
|
|
5302
|
+
}
|
|
5062
5303
|
return withSessionHostWriterLock(
|
|
5063
5304
|
sessionId,
|
|
5064
5305
|
filePath,
|
|
@@ -5212,6 +5453,7 @@ export function installSessionReplicaWithLocationHandoff(
|
|
|
5212
5453
|
);
|
|
5213
5454
|
|
|
5214
5455
|
if (getSessionPresence(sessionId) === SESSION_PRESENCE.PRESENT) {
|
|
5456
|
+
resealWindowsAclMetadataWitness(sessionId);
|
|
5215
5457
|
const current = getVerifiedSessionExecutionLocationAuthority(sessionId);
|
|
5216
5458
|
if (current.locationHandoff !== null) {
|
|
5217
5459
|
if (current.locationHandoff.handoffId !== handoff.handoffId) {
|