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
@@ -84,6 +84,29 @@ function asText(value) {
84
84
  return typeof value === "string" && value.trim() ? value.trim() : null;
85
85
  }
86
86
 
87
+ function boundedText(value, maxChars = 240) {
88
+ let text = null;
89
+ if (typeof value === "string") text = value;
90
+ else if (value && typeof value === "object") {
91
+ text =
92
+ value.summary ||
93
+ value.title ||
94
+ value.question ||
95
+ value.text ||
96
+ value.answer ||
97
+ null;
98
+ }
99
+ if (typeof text !== "string") return null;
100
+ const normalized = text
101
+ .replace(/[\u0000-\u001f\u007f]+/gu, " ")
102
+ .replace(/\s+/gu, " ")
103
+ .trim();
104
+ if (!normalized) return null;
105
+ return normalized.length <= maxChars
106
+ ? normalized
107
+ : `${normalized.slice(0, Math.max(0, maxChars - 1))}…`;
108
+ }
109
+
87
110
  function asCount(value) {
88
111
  const number = Number(value);
89
112
  return Number.isFinite(number) && number > 0 ? Math.floor(number) : 0;
@@ -615,6 +638,209 @@ function approvalSummary(source, state) {
615
638
  };
616
639
  }
617
640
 
641
+ function messagingSummary(sessionIds, fabric) {
642
+ const linked = new Set(
643
+ (Array.isArray(sessionIds) ? sessionIds : [sessionIds]).filter(Boolean),
644
+ );
645
+ const endpoints = Array.isArray(fabric?.endpoints)
646
+ ? fabric.endpoints
647
+ .filter((endpoint) => linked.has(endpoint?.sessionId))
648
+ .map((endpoint) => ({
649
+ name: asText(endpoint?.name),
650
+ address: asText(endpoint?.address),
651
+ policy: ["accept", "hold", "refuse"].includes(endpoint?.policy)
652
+ ? endpoint.policy
653
+ : "refuse",
654
+ online: endpoint?.online === true,
655
+ idle: endpoint?.idle === true,
656
+ unread: asCount(endpoint?.unread),
657
+ held: asCount(endpoint?.held),
658
+ }))
659
+ .filter((endpoint) => endpoint.name && endpoint.address)
660
+ .sort((left, right) => left.name.localeCompare(right.name))
661
+ : [];
662
+ return {
663
+ authority: "cli",
664
+ registered: endpoints.length > 0,
665
+ revision: Number.isSafeInteger(fabric?.revision) ? fabric.revision : 0,
666
+ unread: endpoints.reduce((total, endpoint) => total + endpoint.unread, 0),
667
+ held: endpoints.reduce((total, endpoint) => total + endpoint.held, 0),
668
+ endpoints,
669
+ };
670
+ }
671
+
672
+ function pendingInteractionCount(source) {
673
+ if (Array.isArray(source?.pendingInteractions)) {
674
+ return Math.min(1_000, source.pendingInteractions.length);
675
+ }
676
+ return Math.min(1_000, asCount(source?.pendingInteractions));
677
+ }
678
+
679
+ function liveToolSummary(source) {
680
+ const candidate =
681
+ source?.liveTool || source?.currentTool || source?.recent?.call || null;
682
+ const name = boundedText(candidate?.name || candidate?.tool || candidate, 96);
683
+ if (!name) return null;
684
+ return {
685
+ name,
686
+ status: boundedText(candidate?.status || source?.toolStatus, 48),
687
+ };
688
+ }
689
+
690
+ function focusSummary(source, state) {
691
+ const pendingQuestion = boundedText(source?.pendingQuestion, 240);
692
+ const todos = Array.isArray(source?.todos) ? source.todos : [];
693
+ const latestTodo = boundedText(
694
+ source?.latestTodo || source?.todo?.latest || todos.at(-1),
695
+ 240,
696
+ );
697
+ const settledAnswer = boundedText(
698
+ source?.settledAnswer || source?.lastAnswer || source?.answerSummary,
699
+ 240,
700
+ );
701
+ const liveTool = liveToolSummary(source);
702
+ return {
703
+ active: ["working", "needs_input", "blocked"].includes(state),
704
+ liveTool,
705
+ latestTodo,
706
+ pendingQuestion,
707
+ settledAnswer,
708
+ };
709
+ }
710
+
711
+ function locationSummary(source, kind) {
712
+ const hint = String(
713
+ source?.executionLocation?.kind ||
714
+ source?.executionLocation ||
715
+ source?.location?.kind ||
716
+ source?.location ||
717
+ source?.origin ||
718
+ "",
719
+ )
720
+ .trim()
721
+ .toLowerCase();
722
+ const locationKind =
723
+ source?.cloud === true || hint === "cloud"
724
+ ? "cloud"
725
+ : kind === "remote"
726
+ ? "remote"
727
+ : "local";
728
+ const connection = String(source?.connection || source?.connectivity || "")
729
+ .trim()
730
+ .toLowerCase();
731
+ const offline =
732
+ source?.offline === true ||
733
+ source?.online === false ||
734
+ ["offline", "disconnected", "unreachable"].includes(connection) ||
735
+ (kind === "remote" && source?.alive !== true);
736
+ const online =
737
+ !offline &&
738
+ (source?.online === true ||
739
+ ["online", "connected"].includes(connection) ||
740
+ (kind === "remote" && source?.alive === true) ||
741
+ locationKind === "cloud");
742
+ return {
743
+ kind: locationKind,
744
+ status: offline ? "offline" : online ? "online" : "local",
745
+ };
746
+ }
747
+
748
+ function groupingSummary(workbench, error) {
749
+ if (error) {
750
+ return {
751
+ authority: "cli",
752
+ connected: false,
753
+ revision: null,
754
+ generation: 0,
755
+ reason: String(error).slice(0, 240),
756
+ items: [],
757
+ assignments: [],
758
+ };
759
+ }
760
+ if (workbench == null) {
761
+ const items = [];
762
+ const assignments = [];
763
+ return {
764
+ authority: "cli",
765
+ connected: true,
766
+ revision: projectionRevision({
767
+ schema: "chainlesschain.session-workbench-state/v1",
768
+ generation: 0,
769
+ groups: [],
770
+ memberships: {},
771
+ }),
772
+ generation: 0,
773
+ items,
774
+ assignments,
775
+ };
776
+ }
777
+ if (
778
+ typeof workbench !== "object" ||
779
+ workbench.authority !== "cli" ||
780
+ workbench.connected !== true ||
781
+ typeof workbench.revision !== "string" ||
782
+ !Number.isSafeInteger(workbench.generation) ||
783
+ workbench.generation < 0 ||
784
+ !Array.isArray(workbench.items) ||
785
+ workbench.items.length > 128 ||
786
+ !Array.isArray(workbench.assignments) ||
787
+ workbench.assignments.length > 4096
788
+ ) {
789
+ return groupingSummary(null, "session group projection is malformed");
790
+ }
791
+ const ids = new Set();
792
+ const items = [];
793
+ for (const raw of workbench.items) {
794
+ const id = asText(raw?.id);
795
+ const name = boundedText(raw?.name, 80);
796
+ const order = Number(raw?.order);
797
+ if (
798
+ !id ||
799
+ !/^group-[a-zA-Z0-9_-]+$/u.test(id) ||
800
+ !name ||
801
+ !Number.isSafeInteger(order) ||
802
+ order < 0 ||
803
+ ids.has(id)
804
+ ) {
805
+ return groupingSummary(null, "session group projection is malformed");
806
+ }
807
+ ids.add(id);
808
+ items.push({ id, name, order });
809
+ }
810
+ items.sort(
811
+ (left, right) =>
812
+ left.order - right.order || left.name.localeCompare(right.name),
813
+ );
814
+ const assignments = [];
815
+ const seenSessions = new Set();
816
+ for (const raw of workbench.assignments) {
817
+ const sessionId = asText(raw?.sessionId);
818
+ const groupId = asText(raw?.groupId);
819
+ if (
820
+ !sessionId ||
821
+ sessionId.length > 512 ||
822
+ !groupId ||
823
+ !ids.has(groupId) ||
824
+ seenSessions.has(sessionId)
825
+ ) {
826
+ return groupingSummary(null, "session group projection is malformed");
827
+ }
828
+ seenSessions.add(sessionId);
829
+ assignments.push({ sessionId, groupId });
830
+ }
831
+ assignments.sort((left, right) =>
832
+ left.sessionId.localeCompare(right.sessionId),
833
+ );
834
+ return {
835
+ authority: "cli",
836
+ connected: true,
837
+ revision: workbench.revision,
838
+ generation: workbench.generation,
839
+ items,
840
+ assignments,
841
+ };
842
+ }
843
+
618
844
  function lastEventFor(source, state) {
619
845
  const at =
620
846
  toIso(source?.lastEvent?.at) ||
@@ -629,7 +855,11 @@ function lastEventFor(source, state) {
629
855
  };
630
856
  }
631
857
 
632
- function projectOne(kind, source, { artifacts, prLinks }) {
858
+ function projectOne(
859
+ kind,
860
+ source,
861
+ { artifacts, prLinks, sessionMessageFabric, groupAssignments },
862
+ ) {
633
863
  let sourceId;
634
864
  if (kind === "remote") {
635
865
  const stateFile = asText(source?.stateFile);
@@ -672,6 +902,11 @@ function projectOne(kind, source, { artifacts, prLinks }) {
672
902
  sourceId,
673
903
  linkedSessionId,
674
904
  );
905
+ const approval = approvalSummary(source, state);
906
+ const messaging = messagingSummary(linkedSessionIds, sessionMessageFabric);
907
+ const focus = focusSummary(source, state);
908
+ const groupId =
909
+ groupAssignments.get(canonicalSessionId(kind, sourceId)) || null;
675
910
  const projected = {
676
911
  id: canonicalSessionId(kind, sourceId),
677
912
  sourceId,
@@ -700,7 +935,19 @@ function projectOne(kind, source, { artifacts, prLinks }) {
700
935
  kind === "dynamic_workflow"
701
936
  ? { count: asCount(source?.artifacts?.count), latest: null }
702
937
  : artifactSummary(linkedSessionIds, artifacts),
703
- approval: approvalSummary(source, state),
938
+ approval,
939
+ messaging,
940
+ groupId,
941
+ attention: {
942
+ unread: messaging.unread,
943
+ needsApproval: approval.pending,
944
+ pendingInteractions: Math.min(
945
+ 1_000,
946
+ pendingInteractionCount(source) + (focus.pendingQuestion ? 1 : 0),
947
+ ),
948
+ },
949
+ focus,
950
+ location: locationSummary(source, kind),
704
951
  pr: prSummary(linkedSessionIds, prLinks),
705
952
  workflow: dynamicWorkflowSummary(source),
706
953
  lastEvent: lastEventFor(source, state),
@@ -726,10 +973,24 @@ export function buildSessionProjection({
726
973
  dynamicWorkflow = [],
727
974
  artifacts = [],
728
975
  prLinks = {},
976
+ sessionMessageFabric = null,
977
+ sessionWorkbench = null,
729
978
  sourceErrors = {},
730
979
  generatedAt = new Date().toISOString(),
731
980
  } = {}) {
732
- const context = { artifacts, prLinks };
981
+ const groups = groupingSummary(
982
+ sessionWorkbench,
983
+ sourceErrors.sessionWorkbench,
984
+ );
985
+ const groupAssignments = new Map(
986
+ groups.assignments.map((entry) => [entry.sessionId, entry.groupId]),
987
+ );
988
+ const context = {
989
+ artifacts,
990
+ prLinks,
991
+ sessionMessageFabric,
992
+ groupAssignments,
993
+ };
733
994
  const sessions = [
734
995
  ...(Array.isArray(local) ? local : []).map((source) =>
735
996
  projectOne("local", source, context),
@@ -785,6 +1046,17 @@ export function buildSessionProjection({
785
1046
  Array.isArray(dynamicWorkflow) ? dynamicWorkflow.length : 0,
786
1047
  sourceErrors.dynamicWorkflow,
787
1048
  ),
1049
+ sessionMessageFabric: sourceStatus(
1050
+ Array.isArray(sessionMessageFabric?.endpoints)
1051
+ ? sessionMessageFabric.endpoints.length
1052
+ : 0,
1053
+ sourceErrors.sessionMessageFabric,
1054
+ ),
1055
+ sessionWorkbench: sourceStatus(
1056
+ groups.connected ? groups.items.length : 0,
1057
+ sourceErrors.sessionWorkbench ||
1058
+ (groups.connected ? null : groups.reason),
1059
+ ),
788
1060
  };
789
1061
  const revision = projectionRevision({
790
1062
  schema: SESSION_PROJECTION_SCHEMA,
@@ -793,6 +1065,7 @@ export function buildSessionProjection({
793
1065
  id: session.id,
794
1066
  revision: session.revision,
795
1067
  })),
1068
+ groupRevision: groups.revision,
796
1069
  });
797
1070
  return {
798
1071
  schema: SESSION_PROJECTION_SCHEMA,
@@ -802,6 +1075,7 @@ export function buildSessionProjection({
802
1075
  generatedAt: toIso(generatedAt) || new Date().toISOString(),
803
1076
  revision,
804
1077
  sources,
1078
+ groups,
805
1079
  sessions,
806
1080
  };
807
1081
  }
@@ -919,6 +1193,15 @@ export function disconnectedSessionProjection(reasonText = "CLI unavailable") {
919
1193
  revision: projectionRevision({ connected: false, reason }),
920
1194
  reason,
921
1195
  sources: {},
1196
+ groups: {
1197
+ authority: "cli",
1198
+ connected: false,
1199
+ revision: null,
1200
+ generation: 0,
1201
+ reason,
1202
+ items: [],
1203
+ assignments: [],
1204
+ },
922
1205
  sessions: [],
923
1206
  };
924
1207
  }
@@ -0,0 +1,155 @@
1
+ /** Bounded live-state retention for long-running agent conversations. */
2
+
3
+ import { createHash } from "node:crypto";
4
+
5
+ export const SESSION_RUNTIME_RETENTION_LIMITS = Object.freeze({
6
+ recentResults: 32,
7
+ retainedResultChars: 512,
8
+ markerHeadChars: 128,
9
+ markerTailChars: 128,
10
+ });
11
+
12
+ export const SESSION_RUNTIME_RELEASE_MARKER = "…[live result released:";
13
+ const BACKGROUND_RESULT_PREFIX = '[Background sub-agent "';
14
+
15
+ function normalizedLimit(value, fallback, minimum = 0) {
16
+ return Number.isFinite(value)
17
+ ? Math.max(minimum, Math.floor(value))
18
+ : fallback;
19
+ }
20
+
21
+ function resultContent(message) {
22
+ if (!message || typeof message.content !== "string") return null;
23
+ if (message.role === "tool") return message.content;
24
+ if (
25
+ message.role === "user" &&
26
+ message.content.startsWith(BACKGROUND_RESULT_PREFIX)
27
+ ) {
28
+ return message.content;
29
+ }
30
+ return null;
31
+ }
32
+
33
+ // V8 may represent `slice()` as a view that keeps the entire source string's
34
+ // backing store alive. Joining individual UTF-16 code units forces a small,
35
+ // independent flat string while preserving even unpaired surrogate units.
36
+ function detachedSlice(content, start, end) {
37
+ const length = Math.max(0, end - start);
38
+ const units = new Array(length);
39
+ for (let index = 0; index < length; index += 1) {
40
+ units[index] = content.charAt(start + index);
41
+ }
42
+ return units.join("");
43
+ }
44
+
45
+ function releaseProjection(content, options) {
46
+ const digest = createHash("sha256").update(content, "utf8").digest("hex");
47
+ const marker =
48
+ `${SESSION_RUNTIME_RELEASE_MARKER} ${content.length} chars; sha256:${digest}; ` +
49
+ "full evidence remains in the durable transcript]";
50
+ const maxChars = options.retainedResultChars;
51
+ if (marker.length >= maxChars) {
52
+ return { content: marker.slice(0, maxChars), digest };
53
+ }
54
+ const remaining = maxChars - marker.length - 2;
55
+ const headChars = Math.min(
56
+ options.markerHeadChars,
57
+ Math.max(0, Math.floor(remaining / 2)),
58
+ );
59
+ const tailChars = Math.min(
60
+ options.markerTailChars,
61
+ Math.max(0, remaining - headChars),
62
+ );
63
+ const head = detachedSlice(content, 0, headChars);
64
+ const tail =
65
+ tailChars > 0
66
+ ? detachedSlice(content, content.length - tailChars, content.length)
67
+ : "";
68
+ return {
69
+ content: `${head}\n${marker}\n${tail}`.slice(0, maxChars),
70
+ digest,
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Replace old live tool/subagent result bodies with a bounded head/tail,
76
+ * digest, and durable-transcript locator. The message and pairing structure is
77
+ * retained; only old result content is released. The returned array is new and
78
+ * the input is never mutated.
79
+ */
80
+ export function releaseOldLiveSessionResults(messages, configured = {}) {
81
+ if (!Array.isArray(messages)) {
82
+ return {
83
+ messages,
84
+ stats: {
85
+ strategy: "session-runtime-retention",
86
+ released: 0,
87
+ savedChars: 0,
88
+ recentResults: 0,
89
+ durableReferences: [],
90
+ },
91
+ };
92
+ }
93
+ const options = {
94
+ recentResults: normalizedLimit(
95
+ configured.recentResults,
96
+ SESSION_RUNTIME_RETENTION_LIMITS.recentResults,
97
+ ),
98
+ retainedResultChars: normalizedLimit(
99
+ configured.retainedResultChars,
100
+ SESSION_RUNTIME_RETENTION_LIMITS.retainedResultChars,
101
+ 256,
102
+ ),
103
+ markerHeadChars: normalizedLimit(
104
+ configured.markerHeadChars,
105
+ SESSION_RUNTIME_RETENTION_LIMITS.markerHeadChars,
106
+ ),
107
+ markerTailChars: normalizedLimit(
108
+ configured.markerTailChars,
109
+ SESSION_RUNTIME_RETENTION_LIMITS.markerTailChars,
110
+ ),
111
+ };
112
+ const resultIndexes = [];
113
+ for (let index = 0; index < messages.length; index += 1) {
114
+ if (resultContent(messages[index]) != null) resultIndexes.push(index);
115
+ }
116
+ const releaseCount = Math.max(
117
+ 0,
118
+ resultIndexes.length - options.recentResults,
119
+ );
120
+ const releaseIndexes = new Set(resultIndexes.slice(0, releaseCount));
121
+ let released = 0;
122
+ let savedChars = 0;
123
+ const durableReferences = [];
124
+ const output = messages.map((message, index) => {
125
+ if (!releaseIndexes.has(index)) return message;
126
+ const content = resultContent(message);
127
+ if (content.length <= options.retainedResultChars) {
128
+ return message;
129
+ }
130
+ const projection = releaseProjection(content, options);
131
+ released += 1;
132
+ savedChars += content.length - projection.content.length;
133
+ durableReferences.push({
134
+ messageIndex: index,
135
+ digest: `sha256:${projection.digest}`,
136
+ originalChars: content.length,
137
+ retainedChars: projection.content.length,
138
+ });
139
+ return { ...message, content: projection.content };
140
+ });
141
+ return {
142
+ messages: output,
143
+ stats: {
144
+ strategy: "session-runtime-retention",
145
+ released,
146
+ savedChars,
147
+ saved: savedChars,
148
+ recentResults: Math.min(options.recentResults, resultIndexes.length),
149
+ retainedResultChars: options.retainedResultChars,
150
+ originalMessages: messages.length,
151
+ compressedMessages: output.length,
152
+ durableReferences,
153
+ },
154
+ };
155
+ }
@@ -11,9 +11,11 @@
11
11
 
12
12
  import { resolve, relative, isAbsolute, join } from "node:path";
13
13
  import { getHomeDir } from "./paths.js";
14
+ import { resolveClaudeProjectStorageDir } from "./claude-project-storage-layout.js";
14
15
 
15
16
  export function sessionStoreDir() {
16
- return join(getHomeDir(), "sessions");
17
+ const homeDir = getHomeDir();
18
+ return resolveClaudeProjectStorageDir(homeDir) || join(homeDir, "sessions");
17
19
  }
18
20
 
19
21
  /**