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.
Files changed (256) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-B3gWmXjo.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-G9pdT-0e.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-Ca30J7m2.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BtVTm8PU.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-BhViNa6u.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DhKq-FnY.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-BL0SVbnE.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-BWkblnFi.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-ClaRNrF8.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-sZE2Z77o.js} +4 -4
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-BAfKOnRe.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-Cvhay5WM.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-BpejL-4N.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-g2Ki6g_1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-D2xKbNo9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DbL1Pds3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-DGtZCV4c.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-4kQpoNsI.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-BxTYXXAN.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-k0J0LT2N.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-BaqhoPgN.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-T4RVPIM1.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-DszOToWq.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9KJU7HF.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-Cmr0JnsA.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-BI-_2xZX.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-DsnDEPsl.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-BLncAKKK.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BPQhGXDn.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-CyElbUQW.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-CcSntBQD.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-p6e7HZ2r.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-CNEtr-wz.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-Bj9xI0YH.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Dd2notAJ.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-BBsN2CSW.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-Dg2uTvwx.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-r1YMRiJV.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-C-89kSm4.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-CrPZcVgf.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-sxi7hqJb.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-CAgOMfF1.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-DafaPts3.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CJM-xUW_.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-L0ZjfAh_.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-BB1CvCK0.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-DeLtgAD8.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-CKC2b10z.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-eyf2rzY1.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-5upNIOW8.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-B8p3W6JK.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-BnRMxTq3.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-DjCNI1li.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-u6gXLbWT.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BZAw4tkM.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-B1Tr72q7.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-DO7HFuBQ.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BjCztyhj.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-ZWyCUbR1.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-DhDjeW4G.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-R_CN2MuU.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-uxFcujeu.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-DX8D7rks.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-BYahQILD.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CUSQ2tm-.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-CnN_S8Cs.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-DcZlh-O4.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-ZhBOjzIX.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-D5Qnq_lI.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-BC9cZ3Be.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-DauJ3E8_.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-DbNeZ_fh.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-DUvJbSct.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-BXa-5noQ.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-JxaiUt_3.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BW4ERQN8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-DltUbdtv.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-CMoZz0Tc.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-D_VEV60K.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-CCXTCs0R.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-lkGRIPcG.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BfGeQ9HX.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-BEC7pYvc.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-BZdG24o0.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-yoEddedp.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-BXZEprOW.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-gg0bzZal.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DjRVRuin.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-su-dieAc.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-Ci3S8oKF.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CxbFX9uH.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-D8F10heH.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-11wtYQiF.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-1IgxgALJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-1agckWSq.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-5JqhujnR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-6Tniqk1s.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-8Z-8BIlN.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-BCI5v0yB.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BDJntYmJ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-BGzixOGZ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BMMOVoLD.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-BTFpdBtt.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-Ba_HyPnE.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-BbF1IHof.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-BgT9su_e.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-BzPB6kGZ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-C6ygzplr.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-CC3ZDjzY.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-CEmXRhAE.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CJGOlduY.js +1 -0
  113. package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-CMPqd5Cv.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-COWd8uGx.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CPIYSp4H.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-CR0h6seT.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-CUmDhC4j.js} +1 -1
  118. package/src/assets/web-panel/assets/index-CkBCN5yH.js +1 -0
  119. package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-CusgZPtc.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-DBAETXft.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-DIJ2qFOC.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-Dbq4NMET.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-DkMEF5VT.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-DkfQR3hM.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-DnLucOn9.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-DugB_aKa.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-DyLUarhZ.js} +3 -3
  128. package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-T6_6ygJZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-Tu8eWqh-.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-W7XUgdVL.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-dHZinfko.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-jyNgp5FI.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-Cv4p8e4w.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-B8EwmMOw.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-B8R9F8TK.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-DoFYz5Bp.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CHWYLBjI.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-CXuPDO77.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-BaAtUUon.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-DCc4zcDD.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-B_lx89oZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-DE8DPmR0.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-1ktXOsL_.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-xH89-wjh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-DscvfW5p.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-RdMKQta7.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-Z3wTni2T.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-B0iChCsm.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/agent.js +105 -62
  152. package/src/commands/background-session.js +100 -10
  153. package/src/commands/git.js +39 -0
  154. package/src/commands/mcp.js +5 -0
  155. package/src/commands/plugin.js +160 -29
  156. package/src/commands/remote-control.js +295 -110
  157. package/src/commands/session-group.js +131 -0
  158. package/src/commands/session-location.js +48 -0
  159. package/src/commands/session-message.js +171 -0
  160. package/src/commands/session.js +22 -0
  161. package/src/commands/sync-providers.js +4 -1
  162. package/src/commands/update.js +1 -0
  163. package/src/data/changelog.json +41 -2
  164. package/src/gateways/ws/ws-agent-handler.js +20 -12
  165. package/src/harness/jsonl-session-store.js +279 -37
  166. package/src/harness/mcp-client.js +832 -91
  167. package/src/harness/session-index.js +15 -4
  168. package/src/lib/agent-worktree.js +8 -1
  169. package/src/lib/auto-mode-safety-classifier.js +3 -17
  170. package/src/lib/background-agent-keeper-protocol.js +26 -6
  171. package/src/lib/background-agent-supervisor.js +17 -1
  172. package/src/lib/background-session-transport.js +153 -27
  173. package/src/lib/browser-evidence.js +1405 -0
  174. package/src/lib/chrome-connector.js +465 -79
  175. package/src/lib/claude-project-auto-memory.js +481 -0
  176. package/src/lib/claude-project-storage-layout.js +104 -0
  177. package/src/lib/cloud/cloud-client.js +40 -0
  178. package/src/lib/execution-location-local-supervisor.mjs +226 -0
  179. package/src/lib/execution-location-runner-lifecycle.js +991 -0
  180. package/src/lib/execution-location-target-preflight.js +333 -0
  181. package/src/lib/execution-location-target.js +783 -13
  182. package/src/lib/file-lines.js +6 -1
  183. package/src/lib/gateway-client-resilience.js +571 -0
  184. package/src/lib/gitlab-mr-worktree.js +176 -0
  185. package/src/lib/hooks-v2-producers.js +119 -15
  186. package/src/lib/hooks-v2-workspace-context.js +44 -1
  187. package/src/lib/host-resource-budget.js +295 -0
  188. package/src/lib/ide-context.js +15 -2
  189. package/src/lib/llm-config-defaults.js +43 -0
  190. package/src/lib/mcp-client.js +2 -0
  191. package/src/lib/mcp-headers-helper.js +47 -5
  192. package/src/lib/mcp-lifecycle-authority.js +887 -0
  193. package/src/lib/mcp-oauth.js +156 -26
  194. package/src/lib/mcp-tls.js +330 -0
  195. package/src/lib/output-styles.js +12 -0
  196. package/src/lib/paths.js +260 -32
  197. package/src/lib/permission-request.js +48 -0
  198. package/src/lib/plugin-runtime/bin.js +3 -1
  199. package/src/lib/plugin-runtime/hooks.js +3 -1
  200. package/src/lib/plugin-runtime/install.js +730 -71
  201. package/src/lib/plugin-runtime/lsp.js +4 -4
  202. package/src/lib/plugin-runtime/marketplace-archive-source.js +366 -0
  203. package/src/lib/plugin-runtime/marketplace-catalog.js +63 -6
  204. package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
  205. package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
  206. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
  207. package/src/lib/plugin-runtime/marketplace-source-adapter.js +188 -0
  208. package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
  209. package/src/lib/plugin-runtime/mcp.js +3 -1
  210. package/src/lib/plugin-runtime/monitors.js +3 -1
  211. package/src/lib/plugin-runtime/remote-source.js +583 -58
  212. package/src/lib/plugin-runtime/settings.js +3 -1
  213. package/src/lib/plugin-runtime/trust.js +274 -13
  214. package/src/lib/plugin-security.js +393 -41
  215. package/src/lib/plugin-source-identity.js +850 -0
  216. package/src/lib/process-execution-broker/credential-agent.js +210 -41
  217. package/src/lib/process-execution-broker/index.js +15 -1
  218. package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
  219. package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
  220. package/src/lib/project-mcp-trust.js +165 -10
  221. package/src/lib/remote-approval-bridge.js +136 -46
  222. package/src/lib/remote-control.js +217 -31
  223. package/src/lib/resume-session.js +9 -6
  224. package/src/lib/session-core-singletons.js +26 -11
  225. package/src/lib/session-host-lease.js +52 -16
  226. package/src/lib/session-lifecycle-scope.js +153 -0
  227. package/src/lib/session-message-fabric.js +1252 -0
  228. package/src/lib/session-projection.js +286 -3
  229. package/src/lib/session-runtime-retention.js +155 -0
  230. package/src/lib/session-store-guard.js +3 -1
  231. package/src/lib/session-workbench-store.js +466 -0
  232. package/src/lib/settings-loader.cjs +29 -0
  233. package/src/lib/spellcheck.js +211 -0
  234. package/src/lib/sub-agent-context.js +9 -9
  235. package/src/lib/sync-cli-db.js +485 -129
  236. package/src/lib/sync-credentials.js +31 -20
  237. package/src/lib/web-fetch.js +112 -40
  238. package/src/lib/web-search.js +127 -61
  239. package/src/lib/workspace-trust.js +793 -0
  240. package/src/repl/agent-repl.js +175 -19
  241. package/src/repl/permission-prompt.js +29 -8
  242. package/src/repl/repl-keybindings.js +55 -0
  243. package/src/runtime/agent-core.js +362 -20
  244. package/src/runtime/bootstrap.js +37 -13
  245. package/src/runtime/coding-agent-contract-shared.cjs +11 -4
  246. package/src/runtime/headless-runner.js +281 -102
  247. package/src/runtime/headless-stream.js +199 -30
  248. package/src/runtime/mcp-config.js +298 -6
  249. package/src/runtime/policies/agent-policy.js +10 -0
  250. package/src/runtime/status-diagnostics-lite.js +9 -1
  251. package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
  252. package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
  253. package/src/assets/web-panel/assets/SpeechSettings-DPy1XMYh.js +0 -1
  254. package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
  255. package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
  256. 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 dir = join(getHomeDir(), "sessions");
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
- ensurePrivateDirectory(dir);
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(left, right) {
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
- () => withSessionHostWriteAuthority(sessionId, task),
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 publishSessionAntiRollbackAnchor(sessionId, candidate, {
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: 30_000,
1812
+ timeoutMs: SESSION_APPEND_LOCK_TIMEOUT_MS,
1714
1813
  retryMs: 1,
1715
1814
  maxRetryMs: 8,
1716
1815
  retryJitterMs: 4,
1717
- yieldAfterReleaseMs: 2,
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("session result collection settlement schema is invalid");
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("session result collection settlement schema is invalid");
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 (event?.type !== SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_EVENT) {
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(value.id, "result apply transaction id", 192);
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("session result apply reservation predecessor is invalid");
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 (event?.type === SESSION_EXECUTION_LOCATION_RESULT_COLLECTION_EVENT) {
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 (event?.type === SESSION_EXECUTION_LOCATION_RESULT_APPLY_RESERVATION_EVENT) {
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 (event?.type === SESSION_EXECUTION_LOCATION_RESULT_APPLY_TERMINAL_EVENT) {
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({ ...prior, reservationAppended: false, recovered: true });
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({ sessionId, applyId: data.applyId, reservationId: data.reservationId }),
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({ ...receipt, reservationAppended: true, recovered: false });
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(sessionId, applyId);
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 = normalizeSessionResultApplyTerminalTransaction(
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({ ...prior, terminalAppended: false, recovered: true });
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({ ...raced, terminalAppended: false, recovered: true });
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(sessionId, applyId);
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({ ...receipt, terminalAppended: true, recovered: false });
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) {