chainlesschain 0.162.176 → 0.162.178

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 (260) hide show
  1. package/README.md +10 -0
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DRftcSue.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-BFvUaMKR.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-C0-Rru4P.js} +3 -3
  7. package/src/assets/web-panel/assets/AppLayout-bx-BCljj.js +9 -0
  8. package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DAJ8B3Un.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-hOk4L1lr.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-3pbDpM9z.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-BtziGDn9.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-kmshphJ3.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-d7tGSosA.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CGHYrugQ.js → ChatBubbleRenderer-p-_PBpX_.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-C4Eh4Tz5.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-r7gmhZyA.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-U7mDaGlL.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-Bpu8aH1T.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CHb2XBJe.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-Cn_r4dey.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-CdMWfDcz.js} +4 -4
  22. package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BtnREHWy.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BKI9TSzr.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-pkNubzzJ.js} +2 -2
  25. package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
  26. package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-DLyFVxDc.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-CtUWfYVq.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D8lsDGus.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-CRYt_aIw.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-BXj5Dney.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-Cm-I8RMz.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-CPvbhvgt.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-BZY_3CRZ.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-up0BW6pv.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-C5MEJ2Qe.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-ihdrn43I.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-Br8bPMlh.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-BNntgrYW.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-BdV915mw.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-A3wDmlqL.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CF-mBLWM.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-Iy2k_MSo.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-kk0W7HUb.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-B5u5t_4S.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-BN0POf6_.js} +1 -1
  49. package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
  50. package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DwWQESuN.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-DG6klrcC.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-BwJcKkgZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
  54. package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-CGMXe4TX.js} +4 -4
  55. package/src/assets/web-panel/assets/PersonalDataHub-ziYqg7-A.js +8 -0
  56. package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-BzJfeoGt.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-DLh3Bblx.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-USVWW36c.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-CiiOn62h.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-6V-PNmcA.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-CBPWWzpu.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-QVwoRUq3.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-CXnR-2Vn.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-ClaNzjmF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C3rGw8vJ.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-Ci-OWAoP.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-DRhAwXOS.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-BQLJQ2_y.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-QQUpkfFd.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-DdXKzuKT.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-x2Zh62Qd.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-GdY4KwRz.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-BDHh17P0.js → Skills-Bv4tY1Fd.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-C3QnM-11.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-Bl3ytvmI.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-Wp9IwTsP.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DYQ_6lxj.js → Tasks-CF3rIrDe.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-CGfvVVM9.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-CVXmwQ3U.js} +1 -1
  80. package/src/assets/web-panel/assets/Terminal-bvwrt03E.js +3 -0
  81. package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-D0g74KhH.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-BH4IwzlT.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-DJOpM533.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-B43EPRLr.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-BmBFG-em.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-n9oJwB8k.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-D5QeivHp.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-DcNy7igO.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BVjc7-5-.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-Dy5Tfj3m.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C4c2CNZU.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-DPa3O5vN.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-TLcfNA6_.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BAwdDA_5.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-D41LVFkp.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-0oevYjfT.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-388pLGJ1.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-B8nLBZbv.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-BPTGAjee.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BPtrOBmW.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-BQiIxHBy.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BSM1cHVK.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-BYPr9fkz.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-BsQ7Ev6i.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-Btk9qLL2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-BvmziZSG.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BvopLC_T.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-C7xhTVyP.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-CNk_ZooP.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CQrEHoOG.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CSxex23J.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-CVjgm992.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CWK4zOPe.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-CX0VsoP4.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-CXl0YPNG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-Cip7LWml.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-Cq_hlWNt.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-CzZ49YZL.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-D2Nkivlm.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-DBUgRs4D.js} +1 -1
  121. package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
  122. package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-DNsBj2Ob.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Di4X8cfI.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-DljFsVGI.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-Korc3QIe.js} +1 -1
  126. package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
  127. package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-MKZDje0H.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-OHAfRu_3.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-WEJr8PL5.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-WinCp6du.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-Yjr6cqSK.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-iQ6gtFih.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-pt3s7yvV.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-tQ3igERQ.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-BFZu87WZ.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-DJIo7qvt.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-Cfr5qknL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-Bgc-OadH.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-X3WI-TNp.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-pJhU9IxK.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-BNg_Vj3T.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-TeSEGQ5-.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-D_t_P0bv.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-DrrIMwAT.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-BjZCuFRm.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BidCpfLX.js} +1 -1
  148. package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
  149. package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-BrbcRiHZ.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-PISX7AkR.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/commands/__tests__/hub-wechat.test.js +45 -0
  153. package/src/commands/agenda.js +22 -6
  154. package/src/commands/agent.js +3 -3
  155. package/src/commands/background-session.js +16 -6
  156. package/src/commands/batch.js +79 -27
  157. package/src/commands/changelog.js +15 -4
  158. package/src/commands/context.js +33 -1
  159. package/src/commands/eval.js +21 -6
  160. package/src/commands/hook.js +2 -2
  161. package/src/commands/hub.js +473 -39
  162. package/src/commands/init.js +212 -110
  163. package/src/commands/llm.js +22 -6
  164. package/src/commands/loop.js +9 -2
  165. package/src/commands/skill.js +13 -1
  166. package/src/commands/statusline.js +3 -3
  167. package/src/data/changelog.json +53 -5
  168. package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
  169. package/src/harness/background-task-manager.js +18 -6
  170. package/src/harness/background-task-worker.js +11 -18
  171. package/src/harness/golden-transcript.js +3 -0
  172. package/src/harness/mcp-client.js +9 -15
  173. package/src/harness/worktree-isolator.js +18 -21
  174. package/src/index.js +18 -7
  175. package/src/lib/agent-core.js +5 -0
  176. package/src/lib/agent-ipc-bus.js +12 -3
  177. package/src/lib/agent-team/team-worktree.js +28 -6
  178. package/src/lib/agent-worktree.js +20 -19
  179. package/src/lib/approval-authority-store.js +891 -0
  180. package/src/lib/async-hook-supervisor.cjs +134 -24
  181. package/src/lib/async-hook-supervisor.js +47 -0
  182. package/src/lib/background-agent-supervisor.js +35 -12
  183. package/src/lib/background-interaction-resolver.js +399 -54
  184. package/src/lib/background-session-transport.js +3 -1
  185. package/src/lib/background-task-manager.js +5 -1
  186. package/src/lib/changelog.js +57 -0
  187. package/src/lib/chrome-connector.js +6 -2
  188. package/src/lib/claude-code-bridge.js +24 -8
  189. package/src/lib/cli-anything-bridge.js +82 -25
  190. package/src/lib/context-breakdown.js +82 -3
  191. package/src/lib/doctor-checkup.js +18 -6
  192. package/src/lib/eval/tasks.js +25 -31
  193. package/src/lib/event-runtime-host.js +225 -0
  194. package/src/lib/event-runtime-store.js +102 -21
  195. package/src/lib/event-runtime-worker.js +70 -2
  196. package/src/lib/hook-runner.cjs +71 -36
  197. package/src/lib/hook-runner.js +55 -0
  198. package/src/lib/hooks-v2-producers.js +33 -8
  199. package/src/lib/hooks-v2-runtime.js +360 -40
  200. package/src/lib/host-adb-bridge.js +18 -3
  201. package/src/lib/interaction-adapter.js +66 -0
  202. package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
  203. package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
  204. package/src/lib/lsp/benchmark.js +20 -4
  205. package/src/lib/lsp/lsp-client.js +6 -4
  206. package/src/lib/lsp/lsp-server-registry.js +0 -2
  207. package/src/lib/operation-fingerprint.js +107 -2
  208. package/src/lib/orchestrator.js +8 -2
  209. package/src/lib/packer/pack-update-applier.js +14 -2
  210. package/src/lib/packer/smoke-runner.js +18 -5
  211. package/src/lib/paths.js +1 -1
  212. package/src/lib/pdh-dedicated-batch-collectors.js +124 -0
  213. package/src/lib/personal-data-hub-wiring.js +327 -52
  214. package/src/lib/plugin-monitor-supervisor.js +20 -13
  215. package/src/lib/plugin-runtime/install.js +10 -3
  216. package/src/lib/process-execution-broker/credential-agent.js +954 -111
  217. package/src/lib/process-execution-broker/index.js +369 -85
  218. package/src/lib/process-execution-broker/platform-sandbox.js +320 -140
  219. package/src/lib/provider-http-error.js +94 -0
  220. package/src/lib/remote-approval-bridge.js +222 -26
  221. package/src/lib/repl-bang-memorize.js +10 -2
  222. package/src/lib/repl-goal.js +19 -2
  223. package/src/lib/settings-hook-events.cjs +13 -8
  224. package/src/lib/settings-hook-events.js +20 -0
  225. package/src/lib/side-effect-ledger-store.js +65 -14
  226. package/src/lib/skill-loader.js +215 -12
  227. package/src/lib/skill-packs/generator.js +18 -9
  228. package/src/lib/skill-process-broker.js +85 -0
  229. package/src/lib/slash-commands.js +10 -2
  230. package/src/lib/status-line.cjs +28 -7
  231. package/src/lib/status-line.js +33 -0
  232. package/src/lib/sub-agent-context.js +42 -0
  233. package/src/lib/turn-binding-store.js +64 -15
  234. package/src/lib/turn-binding.js +85 -16
  235. package/src/repl/agent-repl.js +88 -49
  236. package/src/repl/remote-approval.js +13 -13
  237. package/src/repl/repl-turn-binding.js +46 -16
  238. package/src/runtime/agent-core.js +419 -84
  239. package/src/runtime/coding-agent-contract-shared.cjs +16 -0
  240. package/src/runtime/headless-runner.js +172 -44
  241. package/src/runtime/headless-stream.js +221 -11
  242. package/src/runtime/session-slash-commands.js +506 -0
  243. package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
  244. package/src/skills/video-editing/extractors/video-extractor.js +13 -3
  245. package/src/skills/video-editing/media-process.js +20 -0
  246. package/src/skills/video-editing/render/audio-mix.js +13 -3
  247. package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
  248. package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
  249. package/src/workers/background-agent-worker.js +76 -40
  250. package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +0 -9
  251. package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +0 -3
  252. package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
  253. package/src/assets/web-panel/assets/OrderTableRenderer-C48mu09U.js +0 -1
  254. package/src/assets/web-panel/assets/PersonalDataHub-AX3ypUDV.js +0 -9
  255. package/src/assets/web-panel/assets/Projects-Cc7FC9-e.js +0 -1
  256. package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
  257. package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
  258. package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
  259. package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
  260. package/src/assets/web-panel/assets/usePersonalDataHub-B4NkcLaP.js +0 -1
@@ -100,7 +100,17 @@ export class EventRuntimeStore {
100
100
  );
101
101
  }
102
102
 
103
- enqueue(queue, event, { id = null, metadata = null } = {}) {
103
+ enqueue(
104
+ queue,
105
+ event,
106
+ {
107
+ id = null,
108
+ metadata = null,
109
+ claimOwner = null,
110
+ leaseMs = this.leaseMs,
111
+ availableAt = null,
112
+ } = {},
113
+ ) {
104
114
  const key = eventId(event, id);
105
115
  return this._mutate(queue, (records) => {
106
116
  const existing = records.find((record) => record.id === key);
@@ -118,15 +128,27 @@ export class EventRuntimeStore {
118
128
  error.code = "CC_EVENT_RUNTIME_BACKPRESSURE";
119
129
  throw error;
120
130
  }
131
+ const createdAt = this._now();
132
+ const claimed = claimOwner != null && String(claimOwner);
121
133
  const record = {
122
134
  id: key,
123
135
  event: clone(event || {}),
124
136
  metadata: clone(metadata),
125
- status: "pending",
126
- attempts: 0,
127
- createdAt: this._now(),
128
- nextAttemptAt: this._now(),
129
- lease: null,
137
+ status: claimed ? "processing" : "pending",
138
+ attempts: claimed ? 1 : 0,
139
+ fence: claimed ? 1 : 0,
140
+ createdAt,
141
+ nextAttemptAt:
142
+ availableAt == null ? createdAt : Math.max(createdAt, Number(availableAt)),
143
+ lease: claimed
144
+ ? {
145
+ owner: String(claimOwner),
146
+ fence: 1,
147
+ claimedAt: createdAt,
148
+ expiresAt:
149
+ createdAt + Math.max(1, Number(leaseMs) || this.leaseMs),
150
+ }
151
+ : null,
130
152
  };
131
153
  records.push(record);
132
154
  return clone(record);
@@ -160,7 +182,13 @@ export class EventRuntimeStore {
160
182
  if (Number(record.nextAttemptAt || 0) > t) continue;
161
183
  record.status = "processing";
162
184
  record.attempts = Number(record.attempts || 0) + 1;
163
- record.lease = { owner: this.owner, claimedAt: t, expiresAt: t + ttl };
185
+ record.fence = Number(record.fence || 0) + 1;
186
+ record.lease = {
187
+ owner: this.owner,
188
+ fence: record.fence,
189
+ claimedAt: t,
190
+ expiresAt: t + ttl,
191
+ };
164
192
  claimed.push(clone(record));
165
193
  }
166
194
  return claimed;
@@ -175,16 +203,68 @@ export class EventRuntimeStore {
175
203
  return this.claim("outbox", options);
176
204
  }
177
205
 
178
- acknowledge(queue, id, result = null, { owner = null } = {}) {
206
+ _leaseMatches(record, { owner = null, fence = null, now = this._now() } = {}) {
207
+ const expectedOwner = owner == null ? null : String(owner);
208
+ const expectedFence =
209
+ fence == null || !Number.isFinite(Number(fence)) ? null : Number(fence);
210
+ if (expectedOwner == null && expectedFence == null) return true;
211
+ if (record.status !== "processing" || !record.lease) return false;
212
+ if (expectedOwner != null && record.lease.owner !== expectedOwner) {
213
+ return false;
214
+ }
215
+ if (
216
+ expectedFence != null &&
217
+ Number(record.lease.fence) !== expectedFence
218
+ ) {
219
+ return false;
220
+ }
221
+ // A holder that let its lease expire must renew before it is allowed to
222
+ // commit. This closes the gap where a slow worker could settle just before
223
+ // a recovery worker claims the same record.
224
+ return Number(record.lease.expiresAt) > Number(now);
225
+ }
226
+
227
+ renew(
228
+ queue,
229
+ id,
230
+ {
231
+ owner = this.owner,
232
+ fence = null,
233
+ now = this._now(),
234
+ leaseMs = this.leaseMs,
235
+ } = {},
236
+ ) {
237
+ const t = Number(now);
238
+ const ttl = Math.max(1, Number(leaseMs) || this.leaseMs);
239
+ return this._mutate(queue, (records) => {
240
+ const record = records.find((item) => item.id === String(id));
241
+ if (!record || !this._leaseMatches(record, { owner, fence, now: t })) {
242
+ return null;
243
+ }
244
+ record.lease.expiresAt = t + ttl;
245
+ record.lease.renewedAt = t;
246
+ return clone(record);
247
+ });
248
+ }
249
+
250
+ renewInbox(id, options) {
251
+ return this.renew("inbox", id, options);
252
+ }
253
+
254
+ renewOutbox(id, options) {
255
+ return this.renew("outbox", id, options);
256
+ }
257
+
258
+ acknowledge(
259
+ queue,
260
+ id,
261
+ result = null,
262
+ { owner = null, fence = null, now = this._now() } = {},
263
+ ) {
179
264
  return this._mutate(queue, (records) => {
180
265
  const record = records.find((item) => item.id === String(id));
181
266
  if (!record) return null;
182
- const expectedOwner = owner ? String(owner) : null;
183
- if (
184
- expectedOwner &&
185
- (record.status !== "processing" ||
186
- record.lease?.owner !== expectedOwner)
187
- ) {
267
+ if (!this._leaseMatches(record, { owner, fence, now })) {
188
268
  return null;
189
269
  }
190
270
  record.status = "done";
@@ -207,17 +287,18 @@ export class EventRuntimeStore {
207
287
  queue,
208
288
  id,
209
289
  error,
210
- { retryDelayMs = 1000, maxAttempts = this.maxAttempts, owner = null } = {},
290
+ {
291
+ retryDelayMs = 1000,
292
+ maxAttempts = this.maxAttempts,
293
+ owner = null,
294
+ fence = null,
295
+ now = this._now(),
296
+ } = {},
211
297
  ) {
212
298
  return this._mutate(queue, (records) => {
213
299
  const record = records.find((item) => item.id === String(id));
214
300
  if (!record) return null;
215
- const expectedOwner = owner ? String(owner) : null;
216
- if (
217
- expectedOwner &&
218
- (record.status !== "processing" ||
219
- record.lease?.owner !== expectedOwner)
220
- ) {
301
+ if (!this._leaseMatches(record, { owner, fence, now })) {
221
302
  return null;
222
303
  }
223
304
  record.error = String(error || "event delivery failed").slice(0, 1000);
@@ -16,6 +16,9 @@ export class EventRuntimeWorker {
16
16
  sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
17
17
  batchSize = 50,
18
18
  retryDelayMs = 1000,
19
+ leaseRenewIntervalMs = null,
20
+ setIntervalFn = setInterval,
21
+ clearIntervalFn = clearInterval,
19
22
  } = {}) {
20
23
  if (!store) throw new Error("EventRuntimeWorker requires a store");
21
24
  this.store = store;
@@ -25,6 +28,60 @@ export class EventRuntimeWorker {
25
28
  this.sleep = sleep;
26
29
  this.batchSize = Math.max(1, Number(batchSize) || 50);
27
30
  this.retryDelayMs = Math.max(0, Number(retryDelayMs) || 0);
31
+ const inferredRenewMs = Math.max(
32
+ 1,
33
+ Math.floor(Number(store.leaseMs || 120000) / 3),
34
+ );
35
+ this.leaseRenewIntervalMs =
36
+ leaseRenewIntervalMs == null
37
+ ? inferredRenewMs
38
+ : Math.max(0, Number(leaseRenewIntervalMs) || 0);
39
+ this.setIntervalFn = setIntervalFn;
40
+ this.clearIntervalFn = clearIntervalFn;
41
+ }
42
+
43
+ _settlementOptions(record) {
44
+ if (!record?.lease?.owner) return {};
45
+ return {
46
+ owner: record.lease.owner,
47
+ ...(record.lease.fence == null ? {} : { fence: record.lease.fence }),
48
+ };
49
+ }
50
+
51
+ _startLeaseRenewal(queue, record) {
52
+ const renew =
53
+ queue === "inbox" ? this.store.renewInbox : this.store.renewOutbox;
54
+ if (
55
+ typeof renew !== "function" ||
56
+ !record?.lease?.owner ||
57
+ this.leaseRenewIntervalMs <= 0
58
+ ) {
59
+ return { lost: false, stop() {} };
60
+ }
61
+ const options = this._settlementOptions(record);
62
+ const state = { lost: false, timer: null };
63
+ const tick = () => {
64
+ if (state.lost) return;
65
+ try {
66
+ const renewed = renew.call(this.store, record.id, options);
67
+ if (renewed == null) state.lost = true;
68
+ } catch {
69
+ // Renewal is part of the correctness boundary. A lock/storage failure
70
+ // means this worker can no longer prove it owns the record.
71
+ state.lost = true;
72
+ }
73
+ };
74
+ state.timer = this.setIntervalFn(tick, this.leaseRenewIntervalMs);
75
+ state.timer?.unref?.();
76
+ return {
77
+ get lost() {
78
+ return state.lost;
79
+ },
80
+ stop: () => {
81
+ if (state.timer != null) this.clearIntervalFn(state.timer);
82
+ state.timer = null;
83
+ },
84
+ };
28
85
  }
29
86
 
30
87
  async _drain(queue, handler, stats) {
@@ -33,9 +90,15 @@ export class EventRuntimeWorker {
33
90
  ? this.store.claimInbox({ limit: this.batchSize, now: this.now() })
34
91
  : this.store.claimOutbox({ limit: this.batchSize, now: this.now() });
35
92
  for (const record of claimed) {
93
+ const renewal = this._startLeaseRenewal(queue, record);
36
94
  try {
37
95
  const result = await handler(record.event, record);
38
- const options = { owner: record.lease?.owner };
96
+ renewal.stop();
97
+ if (renewal.lost) {
98
+ stats[`${queue}LeaseLost`] += 1;
99
+ continue;
100
+ }
101
+ const options = this._settlementOptions(record);
39
102
  const settled =
40
103
  queue === "inbox"
41
104
  ? this.store.acknowledgeInbox(record.id, result, options)
@@ -43,9 +106,14 @@ export class EventRuntimeWorker {
43
106
  if (settled === null && options.owner) stats[`${queue}LeaseLost`] += 1;
44
107
  else stats[`${queue}Acked`] += 1;
45
108
  } catch (error) {
109
+ renewal.stop();
110
+ if (renewal.lost) {
111
+ stats[`${queue}LeaseLost`] += 1;
112
+ continue;
113
+ }
46
114
  const options = {
47
115
  retryDelayMs: this.retryDelayMs,
48
- owner: record.lease?.owner,
116
+ ...this._settlementOptions(record),
49
117
  };
50
118
  const settled = this.store.fail(
51
119
  queue,
@@ -17,10 +17,9 @@
17
17
  * agent — only an explicit block decision blocks).
18
18
  *
19
19
  * Returns a normalized `{ decision, reason, exitCode, stdout, stderr, ... }`.
20
- * `_deps.spawnSync` is injected for unit tests (no real process needed).
20
+ * Process runners are injected for unit tests and by the ESM Broker facade.
21
21
  */
22
22
 
23
- const cpDefault = require("node:child_process");
24
23
  const {
25
24
  normalizeShellKind,
26
25
  buildPowershellArgv,
@@ -28,7 +27,27 @@ const {
28
27
  } = require("./shell-selector.cjs");
29
28
  const { mergeHookDecisions } = require("./hook-event-bus.cjs");
30
29
 
31
- const _deps = { spawnSync: cpDefault.spawnSync, spawn: cpDefault.spawn };
30
+ const _deps = { runSync: null, run: null };
31
+ Object.defineProperties(_deps, {
32
+ spawnSync: {
33
+ enumerable: true,
34
+ get() {
35
+ return this.runSync;
36
+ },
37
+ set(value) {
38
+ this.runSync = value;
39
+ },
40
+ },
41
+ spawn: {
42
+ enumerable: true,
43
+ get() {
44
+ return this.run;
45
+ },
46
+ set(value) {
47
+ this.run = value;
48
+ },
49
+ },
50
+ });
32
51
 
33
52
  const HOOK_DECISIONS = Object.freeze({
34
53
  BLOCK: "block",
@@ -232,20 +251,29 @@ function _runCommandHookInner(command, input = {}, opts = {}) {
232
251
  CLAUDE_HOOK_EVENT: event || input.hook_event_name || "",
233
252
  },
234
253
  };
235
- const brokerOptions = {
254
+ const processOptions = {
236
255
  ...common,
237
256
  origin: opts.origin || "hook",
238
- policy: opts.origin === "plugin:hook" ? "allow" : undefined,
257
+ policy: "allow",
258
+ scope: "hook",
239
259
  pluginId: opts.pluginId || null,
240
260
  pluginVersion: opts.pluginVersion || null,
241
261
  pluginSource: opts.pluginSource || null,
242
262
  };
243
- if (opts.broker && opts.origin === "plugin:hook") {
244
- res = opts.broker.spawnSync(
245
- usePowershell ? buildPowershellArgv(command, shellKind, { executionPolicy: loadShellConfig({ cwd: common.cwd }).executionPolicy }).file : command,
246
- usePowershell ? buildPowershellArgv(command, shellKind, { executionPolicy: loadShellConfig({ cwd: common.cwd }).executionPolicy }).argv : [],
247
- brokerOptions,
248
- );
263
+ const brokerRunSync =
264
+ opts.broker &&
265
+ opts.origin === "plugin:hook" &&
266
+ typeof opts.broker["spawnSync"] === "function"
267
+ ? opts.broker["spawnSync"].bind(opts.broker)
268
+ : null;
269
+ if (brokerRunSync) {
270
+ const invocation = usePowershell
271
+ ? buildPowershellArgv(command, shellKind, {
272
+ executionPolicy: loadShellConfig({ cwd: common.cwd })
273
+ .executionPolicy,
274
+ })
275
+ : { file: command, argv: [] };
276
+ res = brokerRunSync(invocation.file, invocation.argv, processOptions);
249
277
  } else if (usePowershell) {
250
278
  // Per-hook `shell: powershell|pwsh` (settings hook entry): explicit argv
251
279
  // instead of the default shell; the enterprise ExecutionPolicy override
@@ -254,9 +282,15 @@ function _runCommandHookInner(command, input = {}, opts = {}) {
254
282
  cwd: common.cwd,
255
283
  });
256
284
  const inv = buildPowershellArgv(command, shellKind, { executionPolicy });
257
- res = _deps.spawnSync(inv.file, inv.argv, common);
285
+ if (typeof _deps.runSync !== "function") {
286
+ throw new Error("hook process runner unavailable");
287
+ }
288
+ res = _deps.runSync(inv.file, inv.argv, processOptions);
258
289
  } else {
259
- res = _deps.spawnSync(command, { ...common, shell: true });
290
+ if (typeof _deps.runSync !== "function") {
291
+ throw new Error("hook process runner unavailable");
292
+ }
293
+ res = _deps.runSync(command, { ...processOptions, shell: true });
260
294
  }
261
295
  } catch (err) {
262
296
  return {
@@ -360,36 +394,37 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
360
394
  ...process.env,
361
395
  CLAUDE_HOOK_EVENT: event || input.hook_event_name || "",
362
396
  };
397
+ const processOptions = {
398
+ cwd: wd,
399
+ env: spawnEnv,
400
+ origin: opts.origin || "hook",
401
+ policy: "allow",
402
+ scope: "hook",
403
+ pluginId: opts.pluginId || null,
404
+ pluginVersion: opts.pluginVersion || null,
405
+ pluginSource: opts.pluginSource || null,
406
+ };
363
407
 
364
408
  let child;
365
409
  try {
410
+ const brokerRun =
411
+ opts.broker &&
412
+ opts.origin === "plugin:hook" &&
413
+ typeof opts.broker["spawn"] === "function"
414
+ ? opts.broker["spawn"].bind(opts.broker)
415
+ : null;
416
+ const run = brokerRun || _deps.run;
417
+ if (typeof run !== "function") {
418
+ throw new Error("hook process runner unavailable");
419
+ }
366
420
  if (usePowershell) {
367
421
  const { executionPolicy } = loadShellConfig({ cwd: wd });
368
422
  const inv = buildPowershellArgv(command, shellKind, { executionPolicy });
369
- child = opts.broker && opts.origin === "plugin:hook"
370
- ? opts.broker.spawn(inv.file, inv.argv, {
371
- cwd: wd,
372
- env: spawnEnv,
373
- origin: opts.origin,
374
- policy: "allow",
375
- pluginId: opts.pluginId || null,
376
- pluginVersion: opts.pluginVersion || null,
377
- pluginSource: opts.pluginSource || null,
378
- })
379
- : _deps.spawn(inv.file, inv.argv, { cwd: wd, env: spawnEnv });
423
+ child = run(inv.file, inv.argv, processOptions);
380
424
  } else {
381
- child = opts.broker && opts.origin === "plugin:hook"
382
- ? opts.broker.spawn(command, [], {
383
- cwd: wd,
384
- env: spawnEnv,
385
- shell: true,
386
- origin: opts.origin,
387
- policy: "allow",
388
- pluginId: opts.pluginId || null,
389
- pluginVersion: opts.pluginVersion || null,
390
- pluginSource: opts.pluginSource || null,
391
- })
392
- : _deps.spawn(command, { cwd: wd, env: spawnEnv, shell: true });
425
+ child = brokerRun
426
+ ? run(command, [], { ...processOptions, shell: true })
427
+ : run(command, { ...processOptions, shell: true });
393
428
  }
394
429
  } catch (err) {
395
430
  return {
@@ -0,0 +1,55 @@
1
+ import runner from "./hook-runner.cjs";
2
+ import executionBroker from "./process-execution-broker/index.js";
3
+
4
+ const brokerRunner = executionBroker.spawn.bind(executionBroker);
5
+ const brokerSyncRunner = executionBroker.spawnSync.bind(executionBroker);
6
+
7
+ export const _processDeps = {
8
+ run: brokerRunner,
9
+ runSync: brokerSyncRunner,
10
+ };
11
+
12
+ function normalizeInvocation(argsOrOptions, maybeOptions) {
13
+ return Array.isArray(argsOrOptions)
14
+ ? { args: argsOrOptions, options: maybeOptions || {} }
15
+ : { args: [], options: argsOrOptions || {} };
16
+ }
17
+
18
+ function runHookProcess(file, argsOrOptions, maybeOptions) {
19
+ const { args, options } = normalizeInvocation(argsOrOptions, maybeOptions);
20
+ return _processDeps.run(file, args, {
21
+ ...options,
22
+ origin: options.origin || "hook",
23
+ policy: "allow",
24
+ scope: "hook",
25
+ });
26
+ }
27
+
28
+ function runHookProcessSync(file, argsOrOptions, maybeOptions) {
29
+ const { args, options } = normalizeInvocation(argsOrOptions, maybeOptions);
30
+ return _processDeps.runSync(file, args, {
31
+ ...options,
32
+ origin: options.origin || "hook",
33
+ policy: "allow",
34
+ scope: "hook",
35
+ });
36
+ }
37
+
38
+ runner._deps.run = runHookProcess;
39
+ runner._deps.runSync = runHookProcessSync;
40
+
41
+ export const {
42
+ runCommandHook,
43
+ runCommandHookAsync,
44
+ runHooks,
45
+ runHooksParallel,
46
+ interpretHookOutcome,
47
+ tryParseDecision,
48
+ HOOK_DECISIONS,
49
+ HOOK_PAYLOAD_SCHEMA_VERSION,
50
+ hookBreakerConfig,
51
+ _resetHookBreaker,
52
+ _deps,
53
+ } = runner;
54
+
55
+ export default runner;
@@ -3,13 +3,38 @@
3
3
  * Hook failures never change the surrounding agent or interaction result.
4
4
  */
5
5
  export function emitHooksV2Event(eventName, context = {}, options = {}) {
6
- void import("./hooks-v2-runtime.js")
7
- .then(({ default: runtime }) => {
8
- if (!runtime || typeof runtime.executeHooks !== "function") return;
9
- return runtime.executeHooks(eventName, context, options);
10
- })
11
- .catch(() => {
12
- // Hooks are an optional extension; producer delivery is best-effort.
13
- });
6
+ void executeHooksV2Event(eventName, context, options);
14
7
  }
15
8
 
9
+ /**
10
+ * Decision-capable producer bridge. Callers at a real gate (PreToolUse,
11
+ * Setup, prompt expansion) await this result; observer producers can keep
12
+ * using emitHooksV2Event().
13
+ */
14
+ export async function executeHooksV2Event(
15
+ eventName,
16
+ context = {},
17
+ options = {},
18
+ ) {
19
+ try {
20
+ const { default: runtime } = await import("./hooks-v2-runtime.js");
21
+ if (!runtime || typeof runtime.executeHooks !== "function") {
22
+ return {
23
+ success: options.failClosed !== true,
24
+ blocked: options.failClosed === true,
25
+ decision: options.failClosed === true ? "block" : "continue",
26
+ unavailable: true,
27
+ results: [],
28
+ };
29
+ }
30
+ return await runtime.executeHooks(eventName, context, options);
31
+ } catch (error) {
32
+ return {
33
+ success: options.failClosed !== true,
34
+ blocked: options.failClosed === true,
35
+ decision: options.failClosed === true ? "block" : "continue",
36
+ error: error?.message || String(error),
37
+ results: [],
38
+ };
39
+ }
40
+ }