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
@@ -37,7 +37,9 @@ export function collectPluginSettings(opts = {}) {
37
37
  } catch {
38
38
  return { env: {}, model: null, sources: [] };
39
39
  }
40
- const { trusted, skipped } = partitionByTrust(plugins);
40
+ const { trusted, skipped } = partitionByTrust(plugins, {
41
+ workspaceRoot: opts.cwd,
42
+ });
41
43
  warnUntrustedOnce(
42
44
  skipped.filter((p) => p.manifest?.components?.settings).map((p) => p.name),
43
45
  "settings",
@@ -22,12 +22,21 @@
22
22
  */
23
23
 
24
24
  import path from "path";
25
+ import { createHash } from "node:crypto";
25
26
  import { getElectronUserDataDir } from "../paths.js";
26
27
  import { withFileLock } from "../with-file-lock.js";
27
28
  import {
28
29
  mutateSecurityStore,
29
30
  readSecurityStore,
30
31
  } from "../durable-security-store.js";
32
+ import {
33
+ checkRecordedWorkspaceTrust,
34
+ evaluateWorkspaceTrustDecision,
35
+ projectWorkspaceTrustAudit,
36
+ recordWorkspaceTrustConsent,
37
+ resolveCanonicalWorkspaceRepoIdentity,
38
+ revokeRecordedWorkspaceTrust,
39
+ } from "../workspace-trust.js";
31
40
 
32
41
  export const _deps = {
33
42
  now: () => new Date().toISOString(),
@@ -35,10 +44,16 @@ export const _deps = {
35
44
  // Path of the trust store; injectable so unit tests never touch the real
36
45
  // user-data dir.
37
46
  storePath: () => path.join(getElectronUserDataDir(), "plugin-trust.json"),
47
+ // Test-only seam. Production uses workspace-trust.js's one shared ledger.
48
+ workspaceTrustStorePath: () => null,
38
49
  };
39
50
 
40
51
  const AUTO_TRUSTED_SCOPES = new Set(["user", "local"]);
41
52
 
53
+ function defaultPluginTrustStorePath() {
54
+ return path.join(getElectronUserDataDir(), "plugin-trust.json");
55
+ }
56
+
42
57
  export function loadTrustStore() {
43
58
  return readSecurityStore(_deps.storePath(), "plugin trust");
44
59
  }
@@ -47,26 +62,228 @@ function trustKey(scope, name) {
47
62
  return `${scope}:${name}`;
48
63
  }
49
64
 
65
+ const PLUGIN_WORKSPACE_TRUST_SOURCE = "plugin";
66
+
67
+ function workspaceTrustStoreOptions(options = {}) {
68
+ const sourceStore = options.storePath || _deps.storePath();
69
+ let usesDefaultSourceStore = false;
70
+ try {
71
+ usesDefaultSourceStore =
72
+ path.resolve(sourceStore) === path.resolve(defaultPluginTrustStorePath());
73
+ } catch {
74
+ // Let the source-specific mutation/check fail closed later. This helper
75
+ // must not turn an invalid custom path into the production shared ledger.
76
+ }
77
+ const store =
78
+ options.workspaceTrustStorePath ||
79
+ process.env.CC_WORKSPACE_TRUST_STORE ||
80
+ _deps.workspaceTrustStorePath() ||
81
+ (!usesDefaultSourceStore && typeof sourceStore === "string"
82
+ ? path.join(path.dirname(sourceStore), "workspace-trust-v1.json")
83
+ : null);
84
+ return store ? { storePath: store } : {};
85
+ }
86
+
87
+ function pluginWorkspaceRoot(plugin, options = {}) {
88
+ return (
89
+ options.workspaceRoot ||
90
+ plugin?.workspaceRoot ||
91
+ plugin?.projectRoot ||
92
+ plugin?.cwd ||
93
+ process.cwd()
94
+ );
95
+ }
96
+
97
+ function pluginWorkspaceTrustContext(plugin, options = {}) {
98
+ const scope = String(plugin?.scope || "");
99
+ const name = String(plugin?.name || "");
100
+ const version = String(plugin?.version || "");
101
+ if (!scope || !name || !version) {
102
+ throw new Error("plugin trust requires scope, name, and version");
103
+ }
104
+ const identity = resolveCanonicalWorkspaceRepoIdentity(
105
+ pluginWorkspaceRoot(plugin, options),
106
+ );
107
+ const subject = `${scope}:${name}`;
108
+ const fingerprint = createHash("sha256")
109
+ .update(`${scope}\0${name}\0${version}`, "utf8")
110
+ .digest("hex");
111
+ return { identity, subject, fingerprint };
112
+ }
113
+
114
+ function workspaceTrustKey(plugin, context) {
115
+ const nameDigest = createHash("sha256")
116
+ .update(String(plugin.name), "utf8")
117
+ .digest("hex");
118
+ return `workspace-v1:${context.identity.workspaceId}:${nameDigest}`;
119
+ }
120
+
121
+ function pluginDecision(status, context, consent = "explicit") {
122
+ const decision = evaluateWorkspaceTrustDecision({
123
+ identity: context.identity,
124
+ evidence: [
125
+ {
126
+ source: PLUGIN_WORKSPACE_TRUST_SOURCE,
127
+ consent,
128
+ fingerprint: context.fingerprint,
129
+ decision:
130
+ status === "trusted"
131
+ ? "allow"
132
+ : status === "first-use"
133
+ ? "ask"
134
+ : "deny",
135
+ },
136
+ ],
137
+ });
138
+ return Object.freeze({
139
+ status,
140
+ decision: decision.decision,
141
+ audit: projectWorkspaceTrustAudit(decision),
142
+ });
143
+ }
144
+
50
145
  /**
51
- * May this plugin's code-bearing components run?
52
- * @param {{ scope, name, version }} plugin
146
+ * Evaluate one plugin against the shared canonical workspace trust lattice.
147
+ * User/local scope keeps its established local-install consent model; project
148
+ * scope requires both the source-specific record and the shared v1 record.
53
149
  */
54
- export function isPluginTrusted(plugin) {
55
- if (!plugin || !plugin.name) return false;
56
- if (AUTO_TRUSTED_SCOPES.has(plugin.scope)) return true;
150
+ export function checkPluginWorkspaceTrust(plugin, options = {}) {
151
+ if (!plugin || !plugin.name) {
152
+ return Object.freeze({
153
+ status: "changed",
154
+ decision: "deny",
155
+ audit: projectWorkspaceTrustAudit(null),
156
+ });
157
+ }
158
+ const scope = String(plugin.scope || "");
57
159
  try {
58
- const entry = loadTrustStore()[trustKey(plugin.scope, plugin.name)];
59
- return Boolean(entry && entry.version === plugin.version);
160
+ const context = pluginWorkspaceTrustContext(plugin, options);
161
+ if (AUTO_TRUSTED_SCOPES.has(scope)) {
162
+ return pluginDecision("trusted", context, "scope-default");
163
+ }
164
+ if (scope !== "project") return pluginDecision("changed", context);
165
+
166
+ const store = loadTrustStore();
167
+ const record = store[workspaceTrustKey(plugin, context)];
168
+ const legacy = store[trustKey(scope, plugin.name)];
169
+ if (!record || typeof record !== "object" || Array.isArray(record)) {
170
+ // Old scope:name records have no canonical workspace identity. They
171
+ // remain visible to listTrust(), but require explicit re-consent.
172
+ const shared = checkRecordedWorkspaceTrust({
173
+ identity: context.identity,
174
+ source: PLUGIN_WORKSPACE_TRUST_SOURCE,
175
+ subject: context.subject,
176
+ evidenceFingerprint: context.fingerprint,
177
+ ...workspaceTrustStoreOptions(options),
178
+ });
179
+ if (shared.status === "changed") {
180
+ return Object.freeze({
181
+ status: "changed",
182
+ decision: shared.decision,
183
+ audit: shared.audit,
184
+ });
185
+ }
186
+ if (legacy?.version) {
187
+ // Match the shared migration contract: a legacy allow is downgraded
188
+ // to `ask`, never silently reused. `isPluginTrusted` still refuses to
189
+ // run it until trustPlugin writes canonical v1 consent.
190
+ return Object.freeze({
191
+ ...pluginDecision("first-use", context, "legacy"),
192
+ status: "changed",
193
+ });
194
+ }
195
+ return Object.freeze({
196
+ status: "first-use",
197
+ decision: shared.decision,
198
+ audit: shared.audit,
199
+ });
200
+ }
201
+ const binding = record.workspaceTrust;
202
+ if (
203
+ record.version !== plugin.version ||
204
+ !binding ||
205
+ binding.workspaceId !== context.identity.workspaceId ||
206
+ binding.repositoryId !== context.identity.repositoryId ||
207
+ binding.subject !== context.subject
208
+ ) {
209
+ return pluginDecision("changed", context);
210
+ }
211
+ const shared = checkRecordedWorkspaceTrust({
212
+ identity: context.identity,
213
+ source: PLUGIN_WORKSPACE_TRUST_SOURCE,
214
+ subject: context.subject,
215
+ evidenceFingerprint: context.fingerprint,
216
+ ...workspaceTrustStoreOptions(options),
217
+ });
218
+ return Object.freeze({
219
+ status: shared.status === "trusted" ? "trusted" : "changed",
220
+ decision: shared.decision,
221
+ audit: shared.audit,
222
+ });
60
223
  } catch {
61
- // Project code must stay disabled when the trust store is unavailable.
62
- return false;
224
+ return Object.freeze({
225
+ status: "changed",
226
+ decision: "deny",
227
+ audit: projectWorkspaceTrustAudit(null),
228
+ });
63
229
  }
64
230
  }
65
231
 
232
+ /**
233
+ * May this plugin's code-bearing components run?
234
+ * @param {{ scope, name, version }} plugin
235
+ */
236
+ export function isPluginTrusted(plugin) {
237
+ return checkPluginWorkspaceTrust(plugin).decision === "allow";
238
+ }
239
+
66
240
  /** Trust a plugin (records the exact version). */
67
- export function trustPlugin(name, { scope = "project", version } = {}) {
241
+ export function trustPlugin(
242
+ name,
243
+ { scope = "project", version, workspaceRoot, workspaceTrustStorePath } = {},
244
+ ) {
68
245
  if (!version) throw new Error("trustPlugin requires a version");
69
246
  const file = _deps.storePath();
247
+ const plugin = { scope, name, version, workspaceRoot };
248
+ if (scope === "project") {
249
+ const context = pluginWorkspaceTrustContext(plugin, { workspaceRoot });
250
+ recordWorkspaceTrustConsent({
251
+ identity: context.identity,
252
+ source: PLUGIN_WORKSPACE_TRUST_SOURCE,
253
+ subject: context.subject,
254
+ evidenceFingerprint: context.fingerprint,
255
+ consent: "explicit",
256
+ ...workspaceTrustStoreOptions({
257
+ workspaceTrustStorePath,
258
+ storePath: file,
259
+ }),
260
+ });
261
+ return mutateSecurityStore(
262
+ file,
263
+ "plugin trust",
264
+ (store) => {
265
+ store[workspaceTrustKey(plugin, context)] = {
266
+ name,
267
+ scope,
268
+ version,
269
+ trustedAt: _deps.now(),
270
+ workspaceTrust: {
271
+ schemaVersion: context.identity.schemaVersion,
272
+ workspaceId: context.identity.workspaceId,
273
+ repositoryId: context.identity.repositoryId,
274
+ subject: context.subject,
275
+ },
276
+ };
277
+ return {
278
+ name,
279
+ scope,
280
+ version,
281
+ workspaceId: context.identity.workspaceId,
282
+ };
283
+ },
284
+ { lock: _deps.withFileLock },
285
+ );
286
+ }
70
287
  return mutateSecurityStore(
71
288
  file,
72
289
  "plugin trust",
@@ -79,8 +296,38 @@ export function trustPlugin(name, { scope = "project", version } = {}) {
79
296
  }
80
297
 
81
298
  /** Revoke trust for a plugin at a scope. */
82
- export function untrustPlugin(name, { scope = "project" } = {}) {
299
+ export function untrustPlugin(
300
+ name,
301
+ { scope = "project", workspaceRoot, workspaceTrustStorePath } = {},
302
+ ) {
83
303
  const file = _deps.storePath();
304
+ if (scope === "project") {
305
+ const plugin = { scope, name, version: "trust-revocation", workspaceRoot };
306
+ const context = pluginWorkspaceTrustContext(plugin, { workspaceRoot });
307
+ const result = mutateSecurityStore(
308
+ file,
309
+ "plugin trust",
310
+ (store) => {
311
+ const key = workspaceTrustKey(plugin, context);
312
+ const existed = Object.prototype.hasOwnProperty.call(store, key);
313
+ delete store[key];
314
+ return { name, scope, removed: existed };
315
+ },
316
+ { lock: _deps.withFileLock },
317
+ );
318
+ // Local removal happens first, so a shared-ledger write failure cannot
319
+ // leave the code-bearing plugin authorized.
320
+ revokeRecordedWorkspaceTrust({
321
+ identity: context.identity,
322
+ source: PLUGIN_WORKSPACE_TRUST_SOURCE,
323
+ subject: context.subject,
324
+ ...workspaceTrustStoreOptions({
325
+ workspaceTrustStorePath,
326
+ storePath: file,
327
+ }),
328
+ });
329
+ return result;
330
+ }
84
331
  return mutateSecurityStore(
85
332
  file,
86
333
  "plugin trust",
@@ -97,12 +344,23 @@ export function untrustPlugin(name, { scope = "project" } = {}) {
97
344
  /** All trust entries (for `cc plugin trust --list`). */
98
345
  export function listTrust() {
99
346
  return Object.entries(loadTrustStore()).map(([key, v]) => {
347
+ if (key.startsWith("workspace-v1:") && v?.workspaceTrust) {
348
+ return {
349
+ scope: "project",
350
+ name: typeof v.name === "string" ? v.name : null,
351
+ version: v?.version || null,
352
+ trustedAt: v?.trustedAt || null,
353
+ workspaceId: v.workspaceTrust.workspaceId || null,
354
+ repositoryId: v.workspaceTrust.repositoryId || null,
355
+ };
356
+ }
100
357
  const idx = key.indexOf(":");
101
358
  return {
102
359
  scope: key.slice(0, idx),
103
360
  name: key.slice(idx + 1),
104
361
  version: v?.version || null,
105
362
  trustedAt: v?.trustedAt || null,
363
+ legacy: key.startsWith("project:"),
106
364
  };
107
365
  });
108
366
  }
@@ -111,11 +369,14 @@ export function listTrust() {
111
369
  * Split discovered plugins into those whose code may run and those gated out.
112
370
  * @returns {{ trusted: any[], skipped: any[] }}
113
371
  */
114
- export function partitionByTrust(plugins) {
372
+ export function partitionByTrust(plugins, options = {}) {
115
373
  const trusted = [];
116
374
  const skipped = [];
117
375
  for (const p of plugins || []) {
118
- (isPluginTrusted(p) ? trusted : skipped).push(p);
376
+ (checkPluginWorkspaceTrust(p, options).decision === "allow"
377
+ ? trusted
378
+ : skipped
379
+ ).push(p);
119
380
  }
120
381
  return { trusted, skipped };
121
382
  }