chainlesschain 0.164.0 → 0.165.2

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 (228) hide show
  1. package/README.md +248 -2
  2. package/package.json +7 -4
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-lS1R0Cza.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-BmlgBPsj.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-CNKczv1S.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-BuZGJARQ.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-Dm73Sl-O.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-BGMW7A5e.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-BQ6M54JR.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-DBzGP0bR.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-D1mLCoOV.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-BUfcN7p8.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-Du0Yg5Pi.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-B2RXziHW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-DWhekOrR.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-HQhrkon4.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-izHNb4uz.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BDwLy41-.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-DFJhLa7K.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DYY9RG7-.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-rr7tJTtv.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-D2sfHRLi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-q_eGdhha.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-Cufrh2Bz.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-B-kdv10f.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-CAwRTLZH.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-vx3daNDF.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Q6SwauyD.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-BJ1q4IQZ.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-CSWjROgD.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-DVF8Mnns.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-BQP7LOA4.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-BNlJCmNc.js} +4 -4
  40. package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-DLLg5WQ4.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-CR2skNAF.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-BxVavObl.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-B17pgqMI.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-4UmV5cIL.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-DoMEXEcU.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-h9DMXFX4.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-Cihn-xX8.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BE6ZGa3R.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-CnwojoSI.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-B2vpwmjb.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-C4z28R0-.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-BVlFkwhW.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-C28xs4lp.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-Dgl_rBjM.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-3QUIhrKI.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-8Gh33OZ5.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-BNmg4tZi.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-vgMfeCf9.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CXoOa8eX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-BhfTF0oS.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C746HEAj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-BSej8Eo0.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-f3gmnlG3.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-CyvybpkN.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-DwV2PeYn.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-11GrzjZy.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-BjKXkrAY.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-eWiFb9Yk.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CdCsMAtt.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-4Q2UTKQ5.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-v4rtYrRj.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-CRhsFvd_.js} +1 -1
  75. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
  76. package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-D16zonl7.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-Xxozz0i_.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-CXJpPtCT.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-XRV0L1ZF.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-CYuO1i_w.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-BXqitWsu.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-BvPrDHIy.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-DhCrSTf5.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-DmsuZD6K.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-D_yrts5C.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-B01ihPrm.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-DpUjKa-N.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-CL07yON6.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-CLMflnRr.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DtUqe8h_.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-DPKrgVfy.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTt2GtOm.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-D_VeUc1J.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-1kndiylj.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-2eyAXE3d.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-4bna2_SR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-8nz_fmlj.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-B9KvcS7R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BAXfRKfG.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BHpBMWCh.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-BaZAbw9A.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-BepLZwgB.js} +1 -1
  104. package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-Bhudc_Ez.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-BlDNVgBt.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BtobShro.js → index-By5n8up9.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-CHG-KcS4.js} +1 -1
  108. package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
  109. package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-CX81qSM4.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-CauoBQkH.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-CcO04eDn.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CtF7EN49.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CzjkKUmR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-D95OFht7.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-DFIZ_1Sf.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-DG2MZQ3f.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-DJ8vXGOa.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-Dbbymxpj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DdkplL9R.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-DfGl8CqG.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DfKBRdSS.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-DsJCDUJG.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-Dwqmtk65.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-DxdTdBix.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C484EJiS.js → index-FzdwcSy2.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-GsoUQ2M7.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-brCInrzq.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-dVc-CXY4.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-fk2Rjacw.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-l1BETrDb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-m31Ka8hZ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-ocf06EVQ.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-sDoMHTNA.js} +1 -1
  134. package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-CvyYJd7z.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-DYZkhUdz.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-slnJRVT1.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-DVc0CKmy.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-BCXAtHCq.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DBsemz_K.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-BRtkJ-nv.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-Cebq7EZn.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-DT7qvId2.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-pQiITLkG.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-c-19BVKQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-CxGiMe5n.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-D9btVID5.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-CUYFsFEN.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-CXmn_35j.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/cowork.js +559 -62
  154. package/src/commands/plugin.js +819 -64
  155. package/src/commands/session-location.js +318 -7
  156. package/src/constants.js +2 -2
  157. package/src/data/changelog.json +28 -2
  158. package/src/gateways/ws/action-protocol.js +293 -19
  159. package/src/gateways/ws/message-dispatcher.js +30 -0
  160. package/src/gateways/ws/remote-session-protocol.js +542 -35
  161. package/src/gateways/ws/ws-approval-gate.js +5 -0
  162. package/src/gateways/ws/ws-server.js +462 -38
  163. package/src/harness/jsonl-session-store.js +638 -2
  164. package/src/harness/prompt-compressor.js +4 -0
  165. package/src/harness/remote-session-audit.js +1 -0
  166. package/src/harness/remote-session-crypto.js +750 -50
  167. package/src/harness/remote-session-registry.js +795 -27
  168. package/src/lib/auto-mode-config.js +98 -3
  169. package/src/lib/background-agent-keeper-client.js +29 -0
  170. package/src/lib/background-agent-keeper-protocol.js +158 -10
  171. package/src/lib/background-agent-supervisor.js +870 -48
  172. package/src/lib/background-session-transport.js +23 -6
  173. package/src/lib/background-turn-bootstrap-protocol.js +64 -0
  174. package/src/lib/cowork-task-runner.js +70 -0
  175. package/src/lib/cowork-workflow.js +887 -62
  176. package/src/lib/delivery-production-adapter.js +38 -2
  177. package/src/lib/doctor-checkup.js +34 -10
  178. package/src/lib/dynamic-workflow-draft.js +535 -0
  179. package/src/lib/dynamic-workflow-facade.js +1105 -17
  180. package/src/lib/dynamic-workflow-runtime.js +2974 -0
  181. package/src/lib/execution-location-contract.js +111 -7
  182. package/src/lib/execution-location-runtime.js +3 -1
  183. package/src/lib/execution-location-target.js +910 -0
  184. package/src/lib/llm-providers.js +1 -0
  185. package/src/lib/mcp-call-ledger-store.js +35 -0
  186. package/src/lib/mcp-call-ledger.js +30 -0
  187. package/src/lib/mcp-stdio-package-materialization.js +1 -1
  188. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
  189. package/src/lib/plugin-runtime/install.js +4956 -657
  190. package/src/lib/plugin-runtime/manifest.js +3 -1
  191. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
  192. package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
  193. package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
  194. package/src/lib/plugin-runtime/marketplace-network.js +317 -0
  195. package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
  196. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
  197. package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
  198. package/src/lib/plugin-runtime/policy.js +21 -6
  199. package/src/lib/plugin-runtime/publisher-trust.js +332 -0
  200. package/src/lib/plugin-runtime/remote-source.js +323 -27
  201. package/src/lib/plugin-runtime/scopes.js +317 -41
  202. package/src/lib/plugin-runtime/transaction-journal.js +806 -0
  203. package/src/lib/public-ide-capability-manifest.js +1 -1
  204. package/src/lib/remote-approval-bridge.js +745 -108
  205. package/src/lib/remote-control.js +2 -0
  206. package/src/lib/remote-membership-coordinator.js +612 -46
  207. package/src/lib/remote-membership-host-store.js +59 -10
  208. package/src/lib/runtime-provenance-ledger.js +171 -46
  209. package/src/lib/shell-approval.js +169 -6
  210. package/src/lib/sub-agent-context.js +268 -2
  211. package/src/lib/task-model-selector.js +1 -1
  212. package/src/lib/with-file-lock.js +167 -42
  213. package/src/repl/agent-repl.js +70 -29
  214. package/src/repl/remote-approval.js +29 -7
  215. package/src/runtime/agent-core.js +1695 -194
  216. package/src/runtime/headless-runner.js +22 -5
  217. package/src/runtime/headless-stream.js +19 -3
  218. package/src/workers/background-agent-keeper.js +279 -58
  219. package/src/workers/background-agent-worker.js +7 -0
  220. package/src/workers/background-turn-bootstrap.js +29 -2
  221. package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +0 -1
  222. package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +0 -1
  223. package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +0 -1
  224. package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
  225. package/src/assets/web-panel/assets/SpeechSettings-D6UL3dA5.js +0 -1
  226. package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +0 -1
  227. package/src/assets/web-panel/assets/index-C61cnl3K.js +0 -1
  228. package/src/assets/web-panel/assets/index-D4XFHxBr.js +0 -1
@@ -284,6 +284,31 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
284
284
  const isActive =
285
285
  typeof opts.isActive === "function" ? opts.isActive : () => true;
286
286
  let confirm = null;
287
+ let authorizationConsumerRequired = false;
288
+ const authorityConfig = Object.freeze({
289
+ map: Object.freeze(
290
+ Object.fromEntries(
291
+ RISK_LEVELS.map((riskLevel) => [
292
+ riskLevel,
293
+ Object.freeze({
294
+ decision: map[riskLevel]?.decision || null,
295
+ reason: map[riskLevel]?.reason || null,
296
+ source: map[riskLevel]?.source || null,
297
+ }),
298
+ ]),
299
+ ),
300
+ ),
301
+ rules: Object.freeze(
302
+ rules.map((rule) =>
303
+ Object.freeze({
304
+ decision: rule.decision || null,
305
+ reason: rule.reason || null,
306
+ source: rule.source || null,
307
+ match: rule.match ? Object.freeze({ ...rule.match }) : null,
308
+ }),
309
+ ),
310
+ ),
311
+ });
287
312
 
288
313
  return {
289
314
  isAutoModeGate: true,
@@ -303,6 +328,37 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
303
328
  hasConfirmer() {
304
329
  return typeof confirm === "function";
305
330
  },
331
+ setAuthorizationConsumer(fn) {
332
+ authorizationConsumerRequired = typeof fn === "function";
333
+ return inner?.setAuthorizationConsumer?.(fn);
334
+ },
335
+ hasAuthorizationConsumer() {
336
+ return authorizationConsumerRequired;
337
+ },
338
+ getAuthorizationPolicySnapshot(sessionId = null) {
339
+ return Object.freeze({
340
+ schema: "chainlesschain.approval-policy-authority/v1",
341
+ kind: "auto-mode",
342
+ active: isActive() === true,
343
+ config: authorityConfig,
344
+ inner:
345
+ inner?.getAuthorizationPolicySnapshot?.(sessionId) ||
346
+ Object.freeze({
347
+ schema: "chainlesschain.approval-policy-authority/v1",
348
+ kind: "unobserved-inner",
349
+ sessionId: sessionId ? String(sessionId) : null,
350
+ }),
351
+ });
352
+ },
353
+ consumeAuthorization(authorization, ctx) {
354
+ if (typeof inner?.consumeAuthorization !== "function") {
355
+ throw new Error("Approval authorization consumer is unavailable");
356
+ }
357
+ return inner.consumeAuthorization(authorization, ctx);
358
+ },
359
+ createAuthorizationBinder() {
360
+ return inner?.createAuthorizationBinder?.() || null;
361
+ },
306
362
  async decide(ctx = {}) {
307
363
  if (!isActive()) return inner.decide(ctx);
308
364
  const riskLevel = RISK_LEVELS.includes(ctx.riskLevel)
@@ -365,7 +421,15 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
365
421
  }
366
422
  // ask — same confirm semantics as the session-core gate: no confirmer
367
423
  // means fail-closed deny (headless installs a deny-confirmer anyway).
368
- if (typeof confirm !== "function") {
424
+ // Snapshot both mutable callbacks before the first await. A concurrent
425
+ // stop/start or session reconfiguration must not retarget an in-flight
426
+ // remote approval to a different authorization consumer generation.
427
+ const confirmer = confirm;
428
+ const consumerRequired = authorizationConsumerRequired;
429
+ const bindAuthorization = consumerRequired
430
+ ? inner?.createAuthorizationBinder?.()
431
+ : null;
432
+ if (typeof confirmer !== "function") {
369
433
  return {
370
434
  decision: "deny",
371
435
  via: "no-confirmer",
@@ -374,8 +438,38 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
374
438
  };
375
439
  }
376
440
  let ok = false;
441
+ let authorization = null;
442
+ let confirmationVia = null;
377
443
  try {
378
- ok = await confirm(ctx);
444
+ const confirmation = await confirmer(ctx);
445
+ if (confirmation && typeof confirmation === "object") {
446
+ ok = confirmation.approved === true;
447
+ confirmationVia = confirmation.via || null;
448
+ if (ok && !confirmation.authorization) {
449
+ return {
450
+ decision: "deny",
451
+ via: "authorization-missing",
452
+ base: "confirm",
453
+ ...common,
454
+ };
455
+ }
456
+ if (
457
+ ok &&
458
+ (!consumerRequired || typeof bindAuthorization !== "function")
459
+ ) {
460
+ return {
461
+ decision: "deny",
462
+ via: "authorization-consumer-missing",
463
+ base: "confirm",
464
+ ...common,
465
+ };
466
+ }
467
+ if (ok) {
468
+ authorization = bindAuthorization(confirmation.authorization);
469
+ }
470
+ } else {
471
+ ok = confirmation === true;
472
+ }
379
473
  } catch (error) {
380
474
  return {
381
475
  decision: "deny",
@@ -387,8 +481,9 @@ export function createAutoModeApprovalGate(inner, resolved, opts = {}) {
387
481
  }
388
482
  return {
389
483
  decision: ok ? "allow" : "deny",
390
- via: ok ? "user-confirm" : "user-deny",
484
+ via: confirmationVia || (ok ? "user-confirm" : "user-deny"),
391
485
  base: "confirm",
486
+ ...(authorization ? { authorization } : {}),
392
487
  ...common,
393
488
  };
394
489
  },
@@ -5,6 +5,8 @@ import {
5
5
  BACKGROUND_AGENT_KEEPER_ARM,
6
6
  BACKGROUND_AGENT_KEEPER_ARMED,
7
7
  BACKGROUND_AGENT_KEEPER_HELLO,
8
+ BACKGROUND_AGENT_KEEPER_HEARTBEAT,
9
+ BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS,
8
10
  BACKGROUND_AGENT_KEEPER_PROTOCOL_VERSION,
9
11
  BACKGROUND_AGENT_KEEPER_READY,
10
12
  BACKGROUND_AGENT_KEEPER_RETIRE,
@@ -76,11 +78,17 @@ export async function connectBackgroundAgentKeeper(options = {}) {
76
78
  const retireTimeoutMs = resolveBackgroundAgentKeeperRetireTimeoutMs(
77
79
  options.retireTimeoutMs,
78
80
  );
81
+ const heartbeatIntervalMs = Math.max(
82
+ 10,
83
+ Number(options.heartbeatIntervalMs) ||
84
+ BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS,
85
+ );
79
86
  const socket = await connectWithDeadline(options.pipePath, connectTimeoutMs);
80
87
  const pending = new Map();
81
88
  let ready = false;
82
89
  let closing = false;
83
90
  let activeTurn = null;
91
+ let heartbeatTimer = null;
84
92
  let readyResolve;
85
93
  let readyReject;
86
94
  const readyPromise = new Promise((resolve, reject) => {
@@ -89,6 +97,8 @@ export async function connectBackgroundAgentKeeper(options = {}) {
89
97
  });
90
98
 
91
99
  const failPending = (error) => {
100
+ clearInterval(heartbeatTimer);
101
+ heartbeatTimer = null;
92
102
  readyReject(error);
93
103
  for (const entry of pending.values()) {
94
104
  clearTimeout(entry.timer);
@@ -171,6 +181,23 @@ export async function connectBackgroundAgentKeeper(options = {}) {
171
181
  );
172
182
  helloTimer.unref?.();
173
183
  await readyPromise.finally(() => clearTimeout(helloTimer));
184
+ const sendHeartbeat = () => {
185
+ try {
186
+ writeMessage(
187
+ socket,
188
+ createBackgroundAgentKeeperMessage(BACKGROUND_AGENT_KEEPER_HEARTBEAT, {
189
+ id: hello.id,
190
+ workerGeneration: hello.workerGeneration,
191
+ workerPid: hello.workerPid,
192
+ }),
193
+ );
194
+ } catch (error) {
195
+ socket.destroy(error);
196
+ }
197
+ };
198
+ sendHeartbeat();
199
+ heartbeatTimer = setInterval(sendHeartbeat, heartbeatIntervalMs);
200
+ heartbeatTimer.unref?.();
174
201
 
175
202
  const request = (
176
203
  type,
@@ -241,6 +268,8 @@ export async function connectBackgroundAgentKeeper(options = {}) {
241
268
  close() {
242
269
  if (closing) return;
243
270
  closing = true;
271
+ clearInterval(heartbeatTimer);
272
+ heartbeatTimer = null;
244
273
  socket.end();
245
274
  },
246
275
  activeTurn: () => activeTurn,
@@ -1,22 +1,28 @@
1
- import { join } from "node:path";
1
+ import { createHash } from "node:crypto";
2
+ import { lstatSync, mkdirSync, rmdirSync } from "node:fs";
3
+ import { posix } from "node:path";
2
4
 
3
5
  export const BACKGROUND_AGENT_KEEPER_PROTOCOL_VERSION = 1;
4
6
  export const BACKGROUND_AGENT_KEEPER_HELLO = "background-agent-keeper-hello";
5
7
  export const BACKGROUND_AGENT_KEEPER_READY = "background-agent-keeper-ready";
8
+ export const BACKGROUND_AGENT_KEEPER_HEARTBEAT =
9
+ "background-agent-keeper-heartbeat";
6
10
  export const BACKGROUND_AGENT_KEEPER_ARM = "background-agent-keeper-arm";
7
11
  export const BACKGROUND_AGENT_KEEPER_ARMED = "background-agent-keeper-armed";
8
12
  export const BACKGROUND_AGENT_KEEPER_RETIRE = "background-agent-keeper-retire";
9
13
  export const BACKGROUND_AGENT_KEEPER_RETIRED =
10
14
  "background-agent-keeper-retired";
15
+ export const BACKGROUND_AGENT_KEEPER_HEARTBEAT_INTERVAL_MS = 1_000;
16
+ export const BACKGROUND_AGENT_KEEPER_HEARTBEAT_TIMEOUT_MS = 15_000;
11
17
 
12
18
  // RETIRE is the only keeper request that performs destructive OS cleanup. Its
13
19
  // deadline is deliberately independent from the short HELLO/ARM request
14
20
  // deadline and is derived from every synchronous operation on the longest
15
21
  // Windows path:
16
22
  //
17
- // 2 targets * (taskkill + WMIC + PowerShell) +
18
- // 2 durable state-lock acquisitions + cleanup confirmation + scheduling
19
- // margin = 70 seconds.
23
+ // 2 targets * (strict identity + taskkill + cleanup confirmation identity) +
24
+ // 2 cleanup-critical persistence retry windows + cleanup confirmation +
25
+ // scheduling margin = 120 seconds.
20
26
  //
21
27
  // Keeping these limits in the shared protocol contract prevents either side
22
28
  // from silently reintroducing the old 10-second client / longer keeper race.
@@ -24,15 +30,19 @@ export const BACKGROUND_AGENT_KEEPER_CLEANUP_TARGET_LIMIT = 2;
24
30
  export const BACKGROUND_AGENT_KEEPER_TASKKILL_TIMEOUT_MS = 10_000;
25
31
  export const BACKGROUND_AGENT_KEEPER_WMIC_TIMEOUT_MS = 5_000;
26
32
  export const BACKGROUND_AGENT_KEEPER_POWERSHELL_TIMEOUT_MS = 10_000;
33
+ export const BACKGROUND_AGENT_KEEPER_IDENTITY_PROBE_TIMEOUT_MS =
34
+ BACKGROUND_AGENT_KEEPER_WMIC_TIMEOUT_MS +
35
+ BACKGROUND_AGENT_KEEPER_POWERSHELL_TIMEOUT_MS;
27
36
  export const BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS = 5_000;
37
+ export const BACKGROUND_AGENT_KEEPER_PERSIST_RETRY_TIMEOUT_MS =
38
+ 3 * BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS;
28
39
  export const BACKGROUND_AGENT_KEEPER_CLEANUP_CONFIRM_TIMEOUT_MS = 2_000;
29
40
  export const BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MARGIN_MS = 8_000;
30
41
  export const BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MS =
31
42
  BACKGROUND_AGENT_KEEPER_CLEANUP_TARGET_LIMIT *
32
43
  (BACKGROUND_AGENT_KEEPER_TASKKILL_TIMEOUT_MS +
33
- BACKGROUND_AGENT_KEEPER_WMIC_TIMEOUT_MS +
34
- BACKGROUND_AGENT_KEEPER_POWERSHELL_TIMEOUT_MS) +
35
- 2 * BACKGROUND_AGENT_KEEPER_STATE_LOCK_TIMEOUT_MS +
44
+ 2 * BACKGROUND_AGENT_KEEPER_IDENTITY_PROBE_TIMEOUT_MS) +
45
+ 2 * BACKGROUND_AGENT_KEEPER_PERSIST_RETRY_TIMEOUT_MS +
36
46
  BACKGROUND_AGENT_KEEPER_CLEANUP_CONFIRM_TIMEOUT_MS +
37
47
  BACKGROUND_AGENT_KEEPER_RETIRE_TIMEOUT_MARGIN_MS;
38
48
 
@@ -49,6 +59,14 @@ export function resolveBackgroundAgentKeeperRetireTimeoutMs(value) {
49
59
 
50
60
  const SAFE_ID = /^[A-Za-z0-9_-]{1,256}$/u;
51
61
  const SAFE_TOKEN = /^[a-f0-9]{64}$/u;
62
+ const POSIX_LOCAL_PIPE_DIRECTORY = /^cc-bg[ks]-[a-f0-9]{24}$/u;
63
+ const POSIX_LOCAL_PIPE_SOCKET = /^[a-f0-9]{32}\.sock$/u;
64
+
65
+ // Darwin's sockaddr_un.sun_path has 104 bytes including the trailing NUL.
66
+ // Linux allows a few more bytes, but the conservative cross-platform ceiling
67
+ // prevents a long state directory from being silently truncated into the same
68
+ // endpoint as a concurrent keeper.
69
+ export const POSIX_KEEPER_SOCKET_PATH_MAX_BYTES = 103;
52
70
 
53
71
  function requiredSafeString(value, label, pattern = SAFE_ID) {
54
72
  const normalized = typeof value === "string" ? value.trim() : "";
@@ -74,12 +92,142 @@ function requiredTimestamp(value, label) {
74
92
  return normalized;
75
93
  }
76
94
 
77
- export function backgroundAgentKeeperPipePath(id, directory) {
95
+ function digestKeeperPath(value, length) {
96
+ return createHash("sha256").update(value).digest("hex").slice(0, length);
97
+ }
98
+
99
+ function requiredPosixDirectory(value, label) {
100
+ const normalized = typeof value === "string" ? value.trim() : "";
101
+ if (!normalized || normalized.includes("\0")) {
102
+ throw new TypeError(`invalid background agent keeper ${label}`);
103
+ }
104
+ return posix.resolve(normalized.replaceAll("\\", "/"));
105
+ }
106
+
107
+ function backgroundAgentPosixPipePath(
108
+ id,
109
+ directory,
110
+ options,
111
+ { candidateSuffix, fallbackPrefix, tooLongMessage },
112
+ ) {
78
113
  const safeId = requiredSafeString(id, "id");
79
- if (process.platform === "win32") {
114
+ const stateDirectory = requiredPosixDirectory(directory, "state directory");
115
+ const candidate = posix.join(stateDirectory, `${safeId}${candidateSuffix}`);
116
+ if (
117
+ Buffer.byteLength(candidate, "utf8") <= POSIX_KEEPER_SOCKET_PATH_MAX_BYTES
118
+ ) {
119
+ return candidate;
120
+ }
121
+
122
+ // Keep the endpoint inside a private, state-root-specific namespace under
123
+ // the short POSIX /tmp alias. The full directory and id remain collision
124
+ // inputs even though neither long value appears in sockaddr_un.sun_path.
125
+ const uid =
126
+ options.uid ??
127
+ (typeof process.getuid === "function" ? process.getuid() : "unknown");
128
+ const shortTempDirectory = requiredPosixDirectory(
129
+ options.tempDirectory || "/tmp",
130
+ "short temp directory",
131
+ );
132
+ const namespace = digestKeeperPath(`${uid}\0${stateDirectory}`, 24);
133
+ const socketId = digestKeeperPath(safeId, 32);
134
+ const fallback = posix.join(
135
+ shortTempDirectory,
136
+ `${fallbackPrefix}-${namespace}`,
137
+ `${socketId}.sock`,
138
+ );
139
+ if (
140
+ Buffer.byteLength(fallback, "utf8") > POSIX_KEEPER_SOCKET_PATH_MAX_BYTES
141
+ ) {
142
+ throw new Error(tooLongMessage);
143
+ }
144
+ return fallback;
145
+ }
146
+
147
+ export function backgroundAgentKeeperPipePath(id, directory, options = {}) {
148
+ const safeId = requiredSafeString(id, "id");
149
+ const platform = options.platform || process.platform;
150
+ if (platform === "win32") {
80
151
  return `\\\\.\\pipe\\cc-bg-keeper-${safeId}`;
81
152
  }
82
- return join(directory, `${safeId}.keeper.sock`);
153
+ return backgroundAgentPosixPipePath(id, directory, options, {
154
+ candidateSuffix: ".keeper.sock",
155
+ fallbackPrefix: "cc-bgk",
156
+ tooLongMessage: "background agent keeper fallback socket path is too long",
157
+ });
158
+ }
159
+
160
+ export function backgroundAgentSessionPipePath(id, directory, options = {}) {
161
+ const safeId = requiredSafeString(id, "id");
162
+ const platform = options.platform || process.platform;
163
+ if (platform === "win32") {
164
+ return `\\\\.\\pipe\\cc-bg-${safeId}`;
165
+ }
166
+ return backgroundAgentPosixPipePath(id, directory, options, {
167
+ candidateSuffix: ".sock",
168
+ fallbackPrefix: "cc-bgs",
169
+ tooLongMessage: "background agent session fallback socket path is too long",
170
+ });
171
+ }
172
+
173
+ function fallbackLocalPipeDirectory(pipePath) {
174
+ const normalized = posix.resolve(
175
+ String(pipePath || "").replaceAll("\\", "/"),
176
+ );
177
+ const directory = posix.dirname(normalized);
178
+ return POSIX_LOCAL_PIPE_DIRECTORY.test(posix.basename(directory)) &&
179
+ POSIX_LOCAL_PIPE_SOCKET.test(posix.basename(normalized))
180
+ ? directory
181
+ : null;
182
+ }
183
+
184
+ export function prepareBackgroundAgentLocalPipePath(
185
+ pipePath,
186
+ { platform = process.platform } = {},
187
+ ) {
188
+ if (platform === "win32") return pipePath;
189
+ const directory = fallbackLocalPipeDirectory(pipePath);
190
+ if (!directory) return pipePath;
191
+ try {
192
+ mkdirSync(directory, { mode: 0o700 });
193
+ } catch (error) {
194
+ if (error?.code !== "EEXIST") throw error;
195
+ }
196
+ const stat = lstatSync(directory);
197
+ const uid = typeof process.getuid === "function" ? process.getuid() : null;
198
+ if (
199
+ !stat.isDirectory() ||
200
+ stat.isSymbolicLink() ||
201
+ (uid !== null && stat.uid !== uid) ||
202
+ (stat.mode & 0o077) !== 0
203
+ ) {
204
+ throw new Error("background agent socket directory is not private");
205
+ }
206
+ return pipePath;
207
+ }
208
+
209
+ export function cleanupBackgroundAgentLocalPipeDirectory(
210
+ pipePath,
211
+ { platform = process.platform } = {},
212
+ ) {
213
+ if (platform === "win32") return false;
214
+ const directory = fallbackLocalPipeDirectory(pipePath);
215
+ if (!directory) return false;
216
+ try {
217
+ rmdirSync(directory);
218
+ return true;
219
+ } catch (error) {
220
+ if (error?.code === "ENOENT" || error?.code === "ENOTEMPTY") return false;
221
+ throw error;
222
+ }
223
+ }
224
+
225
+ export function prepareBackgroundAgentKeeperPipePath(pipePath, options) {
226
+ return prepareBackgroundAgentLocalPipePath(pipePath, options);
227
+ }
228
+
229
+ export function cleanupBackgroundAgentKeeperPipeDirectory(pipePath, options) {
230
+ return cleanupBackgroundAgentLocalPipeDirectory(pipePath, options);
83
231
  }
84
232
 
85
233
  export function normalizeBackgroundAgentKeeperAuthority(value = {}) {