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
@@ -28,11 +28,10 @@
28
28
  * - tree-reaping of every child on stopAll() / process 'exit', so a session
29
29
  * never leaves an orphan hook process.
30
30
  *
31
- * `_deps.spawn` / `_deps.now` are injected so the whole supervisor is unit-
31
+ * Process runners and `_deps.now` are injected so the whole supervisor is unit-
32
32
  * testable with fake child processes (no real shell).
33
33
  */
34
34
 
35
- const cpDefault = require("node:child_process");
36
35
  const { tryParseDecision } = require("./hook-runner.cjs");
37
36
 
38
37
  const DEFAULT_TIMEOUT_MS = 60000;
@@ -52,8 +51,10 @@ class AsyncHookSupervisor {
52
51
  ? Number(opts.maxConcurrent)
53
52
  : DEFAULT_MAX_CONCURRENT;
54
53
  this._deps = {
55
- spawn: opts.spawn || cpDefault.spawn,
56
- spawnSync: opts.spawnSync || cpDefault.spawnSync,
54
+ run: opts.run || opts.spawn || null,
55
+ runSync: opts.runSync || opts.spawnSync || null,
56
+ killProcess: opts.killProcess || process.kill.bind(process),
57
+ platform: opts.platform || process.platform,
57
58
  now: opts.now || (() => Date.now()),
58
59
  };
59
60
  this._running = new Map(); // key -> { child, timer }
@@ -125,8 +126,12 @@ class AsyncHookSupervisor {
125
126
  return;
126
127
  }
127
128
  try {
128
- if (process.platform === "win32") {
129
- const r = this._deps.spawnSync(
129
+ if (this._deps.platform === "win32") {
130
+ // Snapshot before taskkill: a policy-restricted taskkill may terminate
131
+ // the shell and then fail on its descendants, orphaning them so a
132
+ // parent-PID query performed afterward can no longer find the tree.
133
+ const descendants = this._windowsDescendantPids(pid);
134
+ const r = this._deps.runSync(
130
135
  "taskkill",
131
136
  ["/PID", String(pid), "/T", "/F"],
132
137
  { windowsHide: true },
@@ -135,20 +140,27 @@ class AsyncHookSupervisor {
135
140
  // tree snapshot and termination. Repeat once so that race cannot
136
141
  // leave a short-lived hook grandchild orphaned.
137
142
  if (!r?.error && r?.status === 0) {
138
- this._deps.spawnSync(
139
- "taskkill",
140
- ["/PID", String(pid), "/T", "/F"],
141
- { windowsHide: true },
142
- );
143
+ this._deps.runSync("taskkill", ["/PID", String(pid), "/T", "/F"], {
144
+ windowsHide: true,
145
+ });
143
146
  }
144
- // If taskkill couldn't launch, fall back to a direct kill.
147
+ // Restricted runners can launch taskkill but still receive a non-zero
148
+ // access/policy result. Enumerate the tree while it is still alive,
149
+ // then terminate descendants leaf-first before killing the shell.
145
150
  if (r && (r.error || (r.status != null && r.status !== 0))) {
151
+ for (const descendant of descendants.reverse()) {
152
+ try {
153
+ this._deps.killProcess(descendant, "SIGKILL");
154
+ } catch {
155
+ /* already gone */
156
+ }
157
+ }
146
158
  child.kill(signal);
147
159
  }
148
160
  } else {
149
161
  // Negative pid → the whole process group (requires the detached spawn).
150
162
  try {
151
- process.kill(-pid, signal);
163
+ this._deps.killProcess(-pid, signal);
152
164
  } catch {
153
165
  child.kill(signal);
154
166
  }
@@ -162,6 +174,102 @@ class AsyncHookSupervisor {
162
174
  }
163
175
  }
164
176
 
177
+ /**
178
+ * Snapshot a Windows process tree for the taskkill-denied fallback. Query the
179
+ * process table once instead of issuing a quoted WMIC `where` expression for
180
+ * every level: Node/cmd quoting can silently turn that expression into an
181
+ * invalid WMIC alias query. PowerShell/CIM covers systems where WMIC has been
182
+ * removed. Traversal is bounded + cycle-safe so corrupt data cannot stall
183
+ * session teardown.
184
+ */
185
+ _windowsDescendantPids(rootPid) {
186
+ if (this._deps.platform !== "win32") return [];
187
+ const root = Number(rootPid);
188
+ if (!Number.isInteger(root) || root <= 0) return [];
189
+ let output = "";
190
+ let shouldTryCim = false;
191
+ try {
192
+ const result = this._deps.runSync(
193
+ "wmic",
194
+ [
195
+ "path",
196
+ "Win32_Process",
197
+ "get",
198
+ "ParentProcessId,ProcessId",
199
+ "/format:csv",
200
+ ],
201
+ {
202
+ encoding: "utf8",
203
+ windowsHide: true,
204
+ timeout: 3000,
205
+ },
206
+ );
207
+ if (!result?.error && result?.status === 0) {
208
+ output = String(result.stdout || "");
209
+ } else if (result?.error?.code === "ENOENT") {
210
+ shouldTryCim = true;
211
+ }
212
+ } catch {
213
+ shouldTryCim = true;
214
+ }
215
+ if (!output && shouldTryCim) {
216
+ try {
217
+ const result = this._deps.runSync(
218
+ "powershell.exe",
219
+ [
220
+ "-NoProfile",
221
+ "-NonInteractive",
222
+ "-Command",
223
+ "Get-CimInstance Win32_Process | ForEach-Object { '{0},{1}' -f $_.ParentProcessId,$_.ProcessId }",
224
+ ],
225
+ {
226
+ encoding: "utf8",
227
+ windowsHide: true,
228
+ timeout: 3000,
229
+ },
230
+ );
231
+ if (!result?.error && result?.status === 0) {
232
+ output = String(result.stdout || "");
233
+ }
234
+ } catch {
235
+ return [];
236
+ }
237
+ }
238
+
239
+ const childrenByParent = new Map();
240
+ for (const line of output.split(/\r?\n/)) {
241
+ const fields = line.trim().split(",");
242
+ if (fields.length < 2) continue;
243
+ const parentPid = Number(fields.at(-2));
244
+ const childPid = Number(fields.at(-1));
245
+ if (
246
+ !Number.isInteger(parentPid) ||
247
+ parentPid < 0 ||
248
+ !Number.isInteger(childPid) ||
249
+ childPid <= 0
250
+ ) {
251
+ continue;
252
+ }
253
+ const children = childrenByParent.get(parentPid) || [];
254
+ children.push(childPid);
255
+ childrenByParent.set(parentPid, children);
256
+ }
257
+
258
+ const seen = new Set([root]);
259
+ const pending = [root];
260
+ const descendants = [];
261
+ while (pending.length > 0 && seen.size <= 256) {
262
+ const parentPid = pending.shift();
263
+ for (const childPid of childrenByParent.get(parentPid) || []) {
264
+ if (seen.has(childPid)) continue;
265
+ seen.add(childPid);
266
+ descendants.push(childPid);
267
+ pending.push(childPid);
268
+ }
269
+ }
270
+ return descendants;
271
+ }
272
+
165
273
  /** Install the process-exit reaper exactly once, only when a child exists. */
166
274
  _installExitHook() {
167
275
  if (this._exitHookInstalled) return;
@@ -257,22 +365,24 @@ class AsyncHookSupervisor {
257
365
  // POSIX: own process group so a timeout / stopAll can signal the whole
258
366
  // tree (shell + the real hook command), not just the shell wrapper.
259
367
  // No-op on Windows, where the tree is reaped via `taskkill /T` instead.
260
- detached: process.platform !== "win32",
368
+ detached: this._deps.platform !== "win32",
261
369
  env: {
262
370
  ...process.env,
263
371
  CLAUDE_HOOK_EVENT: hook.event || payload.hook_event_name || "",
264
372
  },
265
373
  };
266
- child = opts.broker && hook.origin === "plugin:hook"
267
- ? opts.broker.spawn(hook.command, [], {
268
- ...spawnOptions,
269
- origin: hook.origin,
270
- policy: "allow",
271
- pluginId: hook.pluginId || null,
272
- pluginVersion: hook.pluginVersion || null,
273
- pluginSource: hook.pluginSource || null,
274
- })
275
- : this._deps.spawn(hook.command, spawnOptions);
374
+ if (typeof this._deps.run !== "function") {
375
+ throw new Error("async hook process runner unavailable");
376
+ }
377
+ child = this._deps.run(hook.command, {
378
+ ...spawnOptions,
379
+ origin: hook.origin || "async-hook:command",
380
+ policy: "allow",
381
+ scope: "async-hook",
382
+ pluginId: hook.pluginId || null,
383
+ pluginVersion: hook.pluginVersion || null,
384
+ pluginSource: hook.pluginSource || null,
385
+ });
276
386
  } catch (err) {
277
387
  this._record(hook, {
278
388
  ok: false,
@@ -0,0 +1,47 @@
1
+ import supervisor from "./async-hook-supervisor.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 runAsyncHook(command, options = {}) {
13
+ return _processDeps.run(command, [], {
14
+ ...options,
15
+ origin: options.origin || "async-hook:command",
16
+ policy: "allow",
17
+ scope: "async-hook",
18
+ });
19
+ }
20
+
21
+ function runAsyncHookSupervisorCommand(command, args, options = {}) {
22
+ return _processDeps.runSync(command, args, {
23
+ ...options,
24
+ origin: options.origin || "async-hook:supervisor",
25
+ policy: "allow",
26
+ scope: "async-hook",
27
+ });
28
+ }
29
+
30
+ export class AsyncHookSupervisor extends supervisor.AsyncHookSupervisor {
31
+ constructor(options = {}) {
32
+ super({
33
+ ...options,
34
+ run: options.run || options.spawn || runAsyncHook,
35
+ runSync:
36
+ options.runSync || options.spawnSync || runAsyncHookSupervisorCommand,
37
+ });
38
+ }
39
+ }
40
+
41
+ export const { DEFAULT_TIMEOUT_MS, DEFAULT_MAX_CONCURRENT } = supervisor;
42
+
43
+ export default {
44
+ AsyncHookSupervisor,
45
+ DEFAULT_TIMEOUT_MS,
46
+ DEFAULT_MAX_CONCURRENT,
47
+ };
@@ -1,4 +1,3 @@
1
- import { spawn, spawnSync } from "node:child_process";
2
1
  import {
3
2
  closeSync,
4
3
  existsSync,
@@ -21,6 +20,7 @@ import {
21
20
  finishAgentWorktree,
22
21
  validateAgentWorktree,
23
22
  } from "./agent-worktree.js";
23
+ import executionBroker from "./process-execution-broker/index.js";
24
24
 
25
25
  export const DEFAULT_HEARTBEAT_INTERVAL_MS = 5000;
26
26
  export const DEFAULT_HEARTBEAT_STALE_MS = 120000;
@@ -42,6 +42,16 @@ export const PID_IDENTITY_TOLERANCE_MS = 60000;
42
42
  const START_TIME_CACHE_TTL_MS = 10000;
43
43
  const _startTimeCache = new Map();
44
44
 
45
+ function runSupervisorCommand(file, args, options, origin) {
46
+ return _deps.spawnSync(file, args, {
47
+ ...options,
48
+ origin,
49
+ policy: "allow",
50
+ scope: "background-agent",
51
+ shell: false,
52
+ });
53
+ }
54
+
45
55
  /** CIM_DATETIME (`20260711120000.500000+480`) → epoch ms, null when unparseable. */
46
56
  export function parseCimDateToMs(raw) {
47
57
  const m =
@@ -77,7 +87,7 @@ function defaultReadProcessStartTimeMs(pid) {
77
87
  // wmic first (fast, ~100-300ms); PowerShell CIM as fallback (wmic is
78
88
  // removed from recent Windows 11 builds).
79
89
  try {
80
- const r = spawnSync(
90
+ const r = runSupervisorCommand(
81
91
  "wmic",
82
92
  [
83
93
  "process",
@@ -88,6 +98,7 @@ function defaultReadProcessStartTimeMs(pid) {
88
98
  "/value",
89
99
  ],
90
100
  { windowsHide: true, encoding: "utf8", timeout: 5000 },
101
+ "background-agent:process-start-time",
91
102
  );
92
103
  if (!r.error && r.status === 0) {
93
104
  const m = /CreationDate=([^\r\n]+)/.exec(r.stdout || "");
@@ -101,10 +112,11 @@ function defaultReadProcessStartTimeMs(pid) {
101
112
  const script =
102
113
  `$p = Get-CimInstance Win32_Process -Filter 'ProcessId=${target}' -ErrorAction SilentlyContinue; ` +
103
114
  "if ($p -and $p.CreationDate) { [DateTimeOffset]::new($p.CreationDate).ToUnixTimeMilliseconds() }";
104
- const r = spawnSync(
115
+ const r = runSupervisorCommand(
105
116
  "powershell",
106
117
  ["-NoProfile", "-NonInteractive", "-Command", script],
107
118
  { windowsHide: true, encoding: "utf8", timeout: 10000 },
119
+ "background-agent:process-start-time",
108
120
  );
109
121
  if (!r.error && r.status === 0) {
110
122
  const n = Number(String(r.stdout || "").trim());
@@ -118,10 +130,15 @@ function defaultReadProcessStartTimeMs(pid) {
118
130
  // POSIX: `ps -o lstart=` gives an absolute start timestamp on Linux + macOS
119
131
  // (procps and BSD ps both support it; busybox ps does not → null → open).
120
132
  try {
121
- const r = spawnSync("ps", ["-o", "lstart=", "-p", String(target)], {
122
- encoding: "utf8",
123
- timeout: 5000,
124
- });
133
+ const r = runSupervisorCommand(
134
+ "ps",
135
+ ["-o", "lstart=", "-p", String(target)],
136
+ {
137
+ encoding: "utf8",
138
+ timeout: 5000,
139
+ },
140
+ "background-agent:process-start-time",
141
+ );
125
142
  if (!r.error && r.status === 0) {
126
143
  const t = Date.parse(String(r.stdout || "").trim());
127
144
  if (Number.isFinite(t) && t > 0) return t;
@@ -147,13 +164,14 @@ function defaultKillProcessTree(pid, signal = "SIGKILL") {
147
164
  if (target === process.pid) return false;
148
165
  try {
149
166
  if (process.platform === "win32") {
150
- const r = _deps.spawnSync(
167
+ const r = runSupervisorCommand(
151
168
  "taskkill",
152
169
  ["/PID", String(target), "/T", "/F"],
153
170
  {
154
171
  windowsHide: true,
155
172
  encoding: "utf8",
156
173
  },
174
+ "background-agent:process-tree-kill",
157
175
  );
158
176
  return !r.error && r.status === 0;
159
177
  }
@@ -170,8 +188,8 @@ function defaultKillProcessTree(pid, signal = "SIGKILL") {
170
188
  }
171
189
 
172
190
  export const _deps = {
173
- spawn,
174
- spawnSync,
191
+ spawn: executionBroker.spawn.bind(executionBroker),
192
+ spawnSync: executionBroker.spawnSync.bind(executionBroker),
175
193
  // Single POSIX signal seam: every kill this module issues goes through here
176
194
  // so tests can stub it — a bare `process.kill` is NOT interceptable and a
177
195
  // fixture recording a live pid would eat a REAL signal (the shard-2/4
@@ -741,7 +759,7 @@ export function resumeBackgroundAgent(id, prompt, options = {}) {
741
759
  }
742
760
 
743
761
  /**
744
- * Fail fast on an unusable cwd. Without this, spawn() surfaces a bad cwd as
762
+ * Fail fast on an unusable cwd. Without this, process launch surfaces a bad cwd as
745
763
  * an ASYNC 'error' event on the detached child — which nothing listened to
746
764
  * (uncaught exception with no context) — and the pre-written state/job files
747
765
  * stayed behind as a phantom "running" session. Deleted, file-replaced, and
@@ -826,6 +844,10 @@ export function launchBackgroundAgent({
826
844
  detached: true,
827
845
  stdio: "ignore",
828
846
  windowsHide: true,
847
+ origin: "background-agent:worker",
848
+ policy: "allow",
849
+ scope: "background-agent",
850
+ shell: false,
829
851
  });
830
852
  } catch (error) {
831
853
  rmSync(jobFile, { force: true });
@@ -922,13 +944,14 @@ export function stopBackgroundAgent(id) {
922
944
  return { ...lost, stopped: false };
923
945
  }
924
946
  if (process.platform === "win32") {
925
- const killed = _deps.spawnSync(
947
+ const killed = runSupervisorCommand(
926
948
  "taskkill",
927
949
  ["/PID", String(state.pid), "/T", "/F"],
928
950
  {
929
951
  windowsHide: true,
930
952
  encoding: "utf8",
931
953
  },
954
+ "background-agent:stop-tree",
932
955
  );
933
956
  if (killed.error || (killed.status !== 0 && isProcessAlive(state.pid))) {
934
957
  throw new Error(