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
package/src/lib/paths.js CHANGED
@@ -1,49 +1,277 @@
1
+ import { existsSync, lstatSync } from "node:fs";
1
2
  import { homedir } from "node:os";
2
- import { isAbsolute, join, relative, resolve } from "node:path";
3
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
3
4
  import { CONFIG_DIR_NAME } from "../constants.js";
4
5
  import { getPlatform } from "./platform.js";
6
+ import {
7
+ CLAUDE_CONFIG_DIR_ENV,
8
+ resolveClaudeProjectStorageDir,
9
+ usesClaudeConfigDirectory,
10
+ } from "./claude-project-storage-layout.js";
5
11
  import {
6
12
  assertSafeOwnerOnlyPath,
7
13
  ensurePrivateDirectory,
8
14
  repairPrivatePaths,
9
15
  } from "./secure-fs.js";
10
16
 
17
+ const securedClaudeProjectStorageEntries = new Map();
18
+
19
+ function pathContains(parent, candidate) {
20
+ const relation = relative(parent, candidate);
21
+ return (
22
+ relation === "" ||
23
+ (!relation.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) &&
24
+ relation !== ".." &&
25
+ !isAbsolute(relation))
26
+ );
27
+ }
28
+
29
+ function nearestGitWorktreeRoot(cwd) {
30
+ let current = resolve(cwd);
31
+ for (;;) {
32
+ if (existsSync(join(current, ".git"))) return current;
33
+ const parent = dirname(current);
34
+ if (parent === current) return null;
35
+ current = parent;
36
+ }
37
+ }
38
+
39
+ function configHomeError(message) {
40
+ const error = new Error(message);
41
+ error.code = "CONFIG_HOME_UNSAFE";
42
+ return error;
43
+ }
44
+
45
+ function isBroadSharedConfigRoot(resolvedHome, env) {
46
+ const platform = getPlatform();
47
+ const candidates =
48
+ platform === "win32"
49
+ ? [
50
+ "C:\\Users",
51
+ "C:\\Users\\Public",
52
+ "C:\\Windows",
53
+ "C:\\ProgramData",
54
+ "C:\\Program Files",
55
+ "C:\\Program Files (x86)",
56
+ env?.PUBLIC,
57
+ env?.ProgramData,
58
+ env?.PROGRAMDATA,
59
+ env?.SystemRoot,
60
+ env?.WINDIR,
61
+ ]
62
+ : [
63
+ "/tmp",
64
+ "/var/tmp",
65
+ "/usr",
66
+ "/etc",
67
+ "/var",
68
+ "/home",
69
+ "/root",
70
+ "/run",
71
+ "/opt",
72
+ "/srv",
73
+ "/mnt",
74
+ "/media",
75
+ ];
76
+ return candidates.some((candidate) => {
77
+ if (typeof candidate !== "string" || !candidate) return false;
78
+ try {
79
+ const normalized = resolve(candidate);
80
+ return platform === "win32"
81
+ ? normalized.toLowerCase() === resolvedHome.toLowerCase()
82
+ : normalized === resolvedHome;
83
+ } catch {
84
+ return false;
85
+ }
86
+ });
87
+ }
88
+
89
+ /**
90
+ * Reject broad shared directories before any owner-only chmod/DACL repair.
91
+ * Unlike the generic secure-fs guard, config/data roots are high-value and
92
+ * must never target a shared system parent such as C:\\Users or /home.
93
+ */
94
+ export function assertSafeConfigDataRoot(dirPath, options = {}) {
95
+ const resolvedPath = resolve(dirPath);
96
+ if (isBroadSharedConfigRoot(resolvedPath, options.env || process.env)) {
97
+ throw configHomeError(
98
+ "Config/data root must not be a broad shared system directory",
99
+ );
100
+ }
101
+ assertSafeOwnerOnlyPath(resolvedPath);
102
+ return resolvedPath;
103
+ }
104
+
105
+ function resolveConfiguredHome(configured, variableName, cwd, env) {
106
+ const windowsLiteral = configured.replaceAll("/", "\\");
107
+ if (
108
+ windowsLiteral.startsWith("\\\\?\\") ||
109
+ windowsLiteral.startsWith("\\\\.\\")
110
+ ) {
111
+ throw configHomeError(
112
+ `${variableName} must not use a Windows device namespace`,
113
+ );
114
+ }
115
+ if (!isAbsolute(configured)) {
116
+ throw configHomeError(
117
+ `${variableName} must be an absolute path for owner-only storage`,
118
+ );
119
+ }
120
+ const resolvedHome = resolve(configured);
121
+ try {
122
+ assertSafeConfigDataRoot(resolvedHome, { env });
123
+ } catch (error) {
124
+ if (error?.code === "CONFIG_HOME_UNSAFE") throw error;
125
+ throw configHomeError(
126
+ `${variableName} must not be a broad shared system directory`,
127
+ );
128
+ }
129
+ const resolvedCwd = resolve(cwd);
130
+ const worktreeRoot = nearestGitWorktreeRoot(resolvedCwd);
131
+ if (
132
+ pathContains(resolvedHome, resolvedCwd) ||
133
+ pathContains(resolvedCwd, resolvedHome) ||
134
+ (worktreeRoot &&
135
+ (pathContains(worktreeRoot, resolvedHome) ||
136
+ pathContains(resolvedHome, worktreeRoot)))
137
+ ) {
138
+ throw configHomeError(
139
+ `${variableName} must not be the current working directory, its worktree, or any nested/ancestor path`,
140
+ );
141
+ }
142
+ // This is deliberately a no-IO validation. Directory creation/ACL repair
143
+ // remains in ensureHomeDir(), but broad roots and device aliases are refused
144
+ // before any caller can ask the secure-fs layer to mutate them.
145
+ return resolvedHome;
146
+ }
147
+
148
+ /**
149
+ * Resolve the CLI's authoritative config/data root. CHAINLESSCHAIN_HOME is a
150
+ * native explicit override and takes precedence over CLAUDE_CONFIG_DIR; the
151
+ * latter is only a compatible fallback for an otherwise unconfigured CLI.
152
+ */
153
+ export function resolveConfigDataRoot(options = {}) {
154
+ const env = options.env || process.env;
155
+ const cwd = options.cwd || process.cwd();
156
+ const nativeHome = env.CHAINLESSCHAIN_HOME;
157
+ if (nativeHome) {
158
+ return Object.freeze({
159
+ path: resolveConfiguredHome(nativeHome, "CHAINLESSCHAIN_HOME", cwd, env),
160
+ source: "chainlesschain",
161
+ });
162
+ }
163
+ if (usesClaudeConfigDirectory(env)) {
164
+ const configured = env[CLAUDE_CONFIG_DIR_ENV].trim();
165
+ return Object.freeze({
166
+ path: resolveConfiguredHome(configured, CLAUDE_CONFIG_DIR_ENV, cwd, env),
167
+ source: "claude",
168
+ });
169
+ }
170
+ return Object.freeze({
171
+ path: join(homedir(), CONFIG_DIR_NAME),
172
+ source: "default",
173
+ });
174
+ }
175
+
11
176
  export function getHomeDir() {
12
- const configured = process.env.CHAINLESSCHAIN_HOME;
13
- if (configured) {
14
- const windowsLiteral = configured.replaceAll("/", "\\");
15
- if (
16
- windowsLiteral.startsWith("\\\\?\\") ||
17
- windowsLiteral.startsWith("\\\\.\\")
18
- ) {
19
- const error = new Error(
20
- "CHAINLESSCHAIN_HOME must not use a Windows device namespace",
21
- );
22
- error.code = "CONFIG_HOME_UNSAFE";
23
- throw error;
177
+ return resolveConfigDataRoot().path;
178
+ }
179
+
180
+ /**
181
+ * Claude-compatible session storage is opt-in and only activates when the
182
+ * launcher supplied both CLAUDE_CONFIG_DIR and a safe project directory name.
183
+ * Legacy callers continue to use `<home>/sessions`.
184
+ */
185
+ export function getClaudeProjectStorageDir(options = {}) {
186
+ const env = options.env || process.env;
187
+ const root = resolveConfigDataRoot({ ...options, env });
188
+ if (root.source !== "claude") return null;
189
+ return resolveClaudeProjectStorageDir(root.path, { env });
190
+ }
191
+
192
+ export function getSessionStoreDir(options = {}) {
193
+ return (
194
+ getClaudeProjectStorageDir(options) ||
195
+ join(resolveConfigDataRoot(options).path, "sessions")
196
+ );
197
+ }
198
+
199
+ /**
200
+ * Secure a Claude-compatible project storage tree without trusting inherited
201
+ * Windows ACLs on pre-existing descendants. The config root is repaired
202
+ * first, then every child is created below that verified boundary and repaired
203
+ * together in one Windows ACL batch. This keeps the security invariant while
204
+ * avoiding a PowerShell process for every storage subdirectory.
205
+ */
206
+ export function ensureClaudeProjectStorageTree(
207
+ homeDir,
208
+ projectDir,
209
+ options = {},
210
+ ) {
211
+ const home = resolve(homeDir);
212
+ const projectsDir = join(home, "projects");
213
+ const project = resolve(projectDir);
214
+ const extraDirectories = Array.isArray(options.extraDirectories)
215
+ ? options.extraDirectories.map((entry) => resolve(entry))
216
+ : [];
217
+ if (!pathContains(projectsDir, project) || project === projectsDir) {
218
+ throw configHomeError(
219
+ "Claude project storage path must remain below projects",
220
+ );
221
+ }
222
+ if (extraDirectories.some((entry) => !pathContains(project, entry))) {
223
+ throw configHomeError(
224
+ "Claude project storage descendants must remain below the project root",
225
+ );
226
+ }
227
+
228
+ ensurePrivateDirectory(home, {
229
+ applyWindowsAcl: true,
230
+ failIfUnavailable: true,
231
+ });
232
+ const descendants = [projectsDir, project, ...extraDirectories];
233
+ if (getPlatform() === "win32") {
234
+ const repairTargets = [];
235
+ for (const directory of descendants) {
236
+ ensurePrivateDirectory(directory, {
237
+ applyWindowsAcl: false,
238
+ failIfUnavailable: true,
239
+ });
240
+ let current = null;
241
+ try {
242
+ const entry = lstatSync(directory);
243
+ current = `${entry.dev}:${entry.ino}`;
244
+ } catch {
245
+ // ensurePrivateDirectory above either created the directory or threw;
246
+ // retain a fail-closed repair target if a filesystem race removed it.
247
+ }
248
+ // The secure-fs layer caches verified Windows ACLs per path. Keep a
249
+ // matching tree cache so repeated session writes do not re-run a batch,
250
+ // but force a repair whenever this helper first observes a descendant.
251
+ if (securedClaudeProjectStorageEntries.get(directory) !== current) {
252
+ repairTargets.push(directory);
253
+ }
24
254
  }
25
- if (!isAbsolute(configured)) {
26
- const error = new Error(
27
- "CHAINLESSCHAIN_HOME must be an absolute path for owner-only storage",
28
- );
29
- error.code = "CONFIG_HOME_UNSAFE";
30
- throw error;
255
+ if (repairTargets.length > 0) {
256
+ // A private parent is not proof that an older child has no broad explicit
257
+ // ACE. Repair all newly observed descendants in one fail-closed batch.
258
+ repairPrivatePaths(repairTargets, { platform: "win32" });
259
+ for (const directory of repairTargets) {
260
+ securedClaudeProjectStorageEntries.set(
261
+ directory,
262
+ (() => {
263
+ const entry = lstatSync(directory);
264
+ return `${entry.dev}:${entry.ino}`;
265
+ })(),
266
+ );
267
+ }
31
268
  }
32
- const resolvedHome = resolve(configured);
33
- const relativeCwd = relative(resolvedHome, resolve(process.cwd()));
34
- if (
35
- relativeCwd === "" ||
36
- (!relativeCwd.startsWith("..") && !isAbsolute(relativeCwd))
37
- ) {
38
- const error = new Error(
39
- "CHAINLESSCHAIN_HOME must not be the current working directory or one of its ancestors",
40
- );
41
- error.code = "CONFIG_HOME_UNSAFE";
42
- throw error;
269
+ } else {
270
+ for (const directory of descendants) {
271
+ ensurePrivateDirectory(directory, { failIfUnavailable: true });
43
272
  }
44
- return configured;
45
273
  }
46
- return join(homedir(), CONFIG_DIR_NAME);
274
+ return project;
47
275
  }
48
276
 
49
277
  export function getBinDir() {
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Canonicalize the part of a tool request that is classified and shown to the
3
+ * user for approval. Keeping this in one place prevents the safety classifier
4
+ * and the permission prompt from silently reasoning about different inputs.
5
+ */
6
+
7
+ function quoteArgvToken(value) {
8
+ const token = String(value);
9
+ if (token && !/[\s|;&"'\\]/u.test(token)) return token;
10
+ return `"${token.replace(/\\/gu, "\\\\").replace(/"/gu, '\\"')}"`;
11
+ }
12
+
13
+ export function normalizePermissionRequest({ tool, args } = {}) {
14
+ const normalizedArgs = args && typeof args === "object" ? args : {};
15
+ const command =
16
+ typeof normalizedArgs.command === "string"
17
+ ? normalizedArgs.command
18
+ : Array.isArray(normalizedArgs.argv)
19
+ ? normalizedArgs.argv.map(quoteArgvToken).join(" ")
20
+ : "";
21
+ const source = String(
22
+ normalizedArgs.path ??
23
+ normalizedArgs.file_path ??
24
+ normalizedArgs.source ??
25
+ normalizedArgs.from ??
26
+ "",
27
+ );
28
+ const destination = String(
29
+ normalizedArgs.destination ??
30
+ normalizedArgs.new_path ??
31
+ normalizedArgs.to ??
32
+ "",
33
+ );
34
+ const detail =
35
+ command ||
36
+ (source && destination
37
+ ? `${source} -> ${destination}`
38
+ : source || destination);
39
+
40
+ return Object.freeze({
41
+ tool: String(tool || "unknown").trim() || "unknown",
42
+ args: normalizedArgs,
43
+ command,
44
+ source,
45
+ destination,
46
+ detail,
47
+ });
48
+ }
@@ -81,7 +81,9 @@ export function collectPluginBinCommands(opts = {}) {
81
81
  }
82
82
  return [];
83
83
  }
84
- const { trusted, skipped } = partitionByTrust(plugins);
84
+ const { trusted, skipped } = partitionByTrust(plugins, {
85
+ workspaceRoot: opts.cwd,
86
+ });
85
87
  warnUntrustedOnce(
86
88
  skipped
87
89
  .filter((p) => p.manifest?.components?.bin?.length)
@@ -215,7 +215,9 @@ export function collectPluginHooks(opts = {}) {
215
215
  }
216
216
  // A hook runs a shell command — gate it behind trust so a cloned repo's
217
217
  // project plugin can't run commands the moment the agent starts.
218
- const { trusted, skipped } = partitionByTrust(plugins);
218
+ const { trusted, skipped } = partitionByTrust(plugins, {
219
+ workspaceRoot: opts.cwd,
220
+ });
219
221
  warnUntrustedOnce(
220
222
  skipped.filter((p) => p.manifest?.components?.hooks).map((p) => p.name),
221
223
  "hooks",