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
@@ -0,0 +1,33 @@
1
+ import statusLine from "./status-line.cjs";
2
+ import executionBroker from "./process-execution-broker/index.js";
3
+
4
+ const brokerRunner = executionBroker.spawnSync.bind(executionBroker);
5
+
6
+ export function renderStatusLine(config, context, options = {}) {
7
+ return statusLine.renderStatusLine(config, context, {
8
+ ...options,
9
+ runProcess:
10
+ options.runProcess || statusLine._deps.runProcess || brokerRunner,
11
+ });
12
+ }
13
+
14
+ export function getStatusLine(options = {}) {
15
+ return statusLine.getStatusLine({
16
+ ...options,
17
+ runProcess:
18
+ options.runProcess || statusLine._deps.runProcess || brokerRunner,
19
+ });
20
+ }
21
+
22
+ export const {
23
+ loadStatusLineConfig,
24
+ buildContext,
25
+ formatTokens,
26
+ shortenPath,
27
+ renderDefaultStatusLine,
28
+ isStatusLineDisabled,
29
+ terminalSize,
30
+ _deps,
31
+ } = statusLine;
32
+
33
+ export default { ...statusLine, renderStatusLine, getStatusLine };
@@ -110,6 +110,11 @@ export class SubAgentContext {
110
110
  // symlinkDirectories } — only materialize the needed packages and reuse
111
111
  // approved dep dirs. null → full checkout (byte-identical default).
112
112
  this._worktreeOptions = options.worktreeOptions || null;
113
+ // Recovery lineage collected from the child agent-loop event stream.
114
+ // These are provider/runtime identifiers, not reconstructed log labels.
115
+ this._runId = null;
116
+ this._checkpointIds = [];
117
+ this._toolUseIds = [];
113
118
 
114
119
  // ── Isolated state ──────────────────────────────────────────────
115
120
  // Independent message history — never shared with parent
@@ -399,6 +404,22 @@ export class SubAgentContext {
399
404
  for await (const event of gen) {
400
405
  this._iterationCount++;
401
406
 
407
+ if (event.type === "run-started" && event.runId) {
408
+ this._runId = String(event.runId);
409
+ }
410
+ if (event.type === "checkpoint" && event.id) {
411
+ const checkpointId = String(event.id);
412
+ if (!this._checkpointIds.includes(checkpointId)) {
413
+ this._checkpointIds.push(checkpointId);
414
+ }
415
+ }
416
+ if (event.type === "tool-executing" && event.tool_use_id) {
417
+ const toolUseId = String(event.tool_use_id);
418
+ if (!this._toolUseIds.includes(toolUseId)) {
419
+ this._toolUseIds.push(toolUseId);
420
+ }
421
+ }
422
+
402
423
  if (event.type === "token-usage" && this._onUsage) {
403
424
  // Forward real usage to the spawner. A nested child's event already
404
425
  // carries its own attribution frame — preserve it (deepest wins).
@@ -604,6 +625,26 @@ export class SubAgentContext {
604
625
  }
605
626
  }
606
627
 
628
+ /**
629
+ * Serializable child→parent recovery lineage. Worktree paths are included
630
+ * for local restore UX; executable merge callbacks and tool payloads are not.
631
+ */
632
+ recoveryBinding(result = this.result) {
633
+ const worktree = result?.worktree || null;
634
+ return {
635
+ childAgentId: this.id,
636
+ parentAgentId: this.parentId || null,
637
+ traceId: this._runId,
638
+ parentTraceId: this._hookParentTraceId || null,
639
+ checkpointIds: [...this._checkpointIds],
640
+ toolUseIds: [...this._toolUseIds],
641
+ worktreeId:
642
+ worktree?.branch || this._worktreeBranch || null,
643
+ worktreePath:
644
+ worktree?.path || this._worktreePath || null,
645
+ };
646
+ }
647
+
607
648
  /**
608
649
  * True when this sub-agent has been asked to stop — either via an external
609
650
  * abort signal or via this context's own `abort()` (precise single-agent
@@ -647,6 +688,7 @@ export class SubAgentContext {
647
688
  iterationCount: this._iterationCount,
648
689
  createdAt: this.createdAt,
649
690
  completedAt: this.completedAt,
691
+ recoveryBinding: this.recoveryBinding(),
650
692
  worktree: this._worktreePath
651
693
  ? { path: this._worktreePath, branch: this._worktreeBranch }
652
694
  : null,
@@ -35,46 +35,85 @@ export const _deps = {
35
35
  readEvents: storeReadEvents,
36
36
  };
37
37
 
38
+ export class TurnBindingPersistenceError extends Error {
39
+ constructor(operation, sessionId, cause) {
40
+ const detail = cause?.message || String(cause || "unknown persistence error");
41
+ super(`Turn binding ${operation} failed for ${sessionId}: ${detail}`, {
42
+ cause,
43
+ });
44
+ this.name = "TurnBindingPersistenceError";
45
+ this.code =
46
+ operation === "read"
47
+ ? "TURN_BINDING_READ_FAILED"
48
+ : "TURN_BINDING_PERSIST_FAILED";
49
+ this.operation = operation;
50
+ this.sessionId = sessionId;
51
+ }
52
+ }
53
+
54
+ function persistenceFailure(operation, sessionId, cause, failIfUnavailable) {
55
+ if (!failIfUnavailable) return false;
56
+ throw new TurnBindingPersistenceError(operation, sessionId, cause);
57
+ }
58
+
38
59
  /**
39
60
  * Append the current binding table as a new chained event. Each call writes the
40
61
  * FULL table (append-only snapshot), so the newest event is authoritative — a
41
62
  * later `loadTurnBindingLog` never has to merge partial deltas across a chain
42
63
  * that a compaction could have truncated.
43
64
  *
44
- * Best-effort: a persistence failure must not crash the turn it is recording, so
45
- * the caller gets `false` instead of a throw.
65
+ * Turn/checkpoint binding is Critical state. Persistence fails closed by
66
+ * default; diagnostic callers may explicitly opt into advisory behavior.
46
67
  *
47
68
  * @param {string} sessionId
48
69
  * @param {TurnBindingLog|object} log a TurnBindingLog or its toJSON() shape
70
+ * @param {{failIfUnavailable?:boolean}} [opts]
49
71
  * @returns {boolean} true when the snapshot was written
50
72
  */
51
- export function persistTurnBinding(sessionId, log) {
52
- if (!sessionId || !log) return false;
53
- const snapshot = log instanceof TurnBindingLog ? log.toJSON() : log;
54
- if (!snapshot || !Array.isArray(snapshot.turns)) return false;
73
+ export function persistTurnBinding(sessionId, log, opts = {}) {
74
+ const failIfUnavailable = opts.failIfUnavailable !== false;
75
+ if (!sessionId || !log) {
76
+ return persistenceFailure(
77
+ "write",
78
+ sessionId || "<missing-session>",
79
+ new TypeError("sessionId and binding log are required"),
80
+ failIfUnavailable,
81
+ );
82
+ }
55
83
  try {
84
+ const snapshot = log instanceof TurnBindingLog ? log.toJSON() : log;
85
+ if (!snapshot || !Array.isArray(snapshot.turns)) {
86
+ throw new TypeError("binding snapshot must contain a turns array");
87
+ }
56
88
  _deps.appendEvent(sessionId, TURN_BINDING_EVENT, snapshot);
57
89
  return true;
58
- } catch {
59
- // Persistence is advisory — never let it break the agent turn.
60
- return false;
90
+ } catch (error) {
91
+ return persistenceFailure("write", sessionId, error, failIfUnavailable);
61
92
  }
62
93
  }
63
94
 
64
95
  /**
65
96
  * Rebuild the TurnBindingLog from the LATEST persisted snapshot in a session
66
- * transcript. Returns an empty log when the session has no binding event (or on
67
- * any read error) so callers can treat "never persisted" and "unreadable" alike.
97
+ * transcript. Returns an empty log when the session has no binding event.
98
+ * Read/corruption errors fail closed unless explicitly marked advisory.
68
99
  *
69
100
  * @param {string} sessionId
101
+ * @param {{failIfUnavailable?:boolean}} [opts]
70
102
  * @returns {TurnBindingLog}
71
103
  */
72
- export function loadTurnBindingLog(sessionId) {
104
+ export function loadTurnBindingLog(sessionId, opts = {}) {
105
+ const failIfUnavailable = opts.failIfUnavailable !== false;
73
106
  let events = [];
74
107
  try {
75
108
  events = _deps.readEvents(sessionId) || [];
76
- } catch {
77
- return new TurnBindingLog();
109
+ } catch (error) {
110
+ const fallback = persistenceFailure(
111
+ "read",
112
+ sessionId || "<missing-session>",
113
+ error,
114
+ failIfUnavailable,
115
+ );
116
+ if (fallback === false) return new TurnBindingLog();
78
117
  }
79
118
  // Newest snapshot wins — scan backwards for the first well-formed one.
80
119
  for (let i = events.length - 1; i >= 0; i--) {
@@ -85,7 +124,17 @@ export function loadTurnBindingLog(sessionId) {
85
124
  e.data &&
86
125
  Array.isArray(e.data.turns)
87
126
  ) {
88
- return TurnBindingLog.fromJSON(e.data);
127
+ try {
128
+ return TurnBindingLog.fromJSON(e.data);
129
+ } catch (error) {
130
+ const fallback = persistenceFailure(
131
+ "read",
132
+ sessionId || "<missing-session>",
133
+ error,
134
+ failIfUnavailable,
135
+ );
136
+ if (fallback === false) return new TurnBindingLog();
137
+ }
89
138
  }
90
139
  }
91
140
  return new TurnBindingLog();
@@ -13,6 +13,7 @@
13
13
  * -> toolCallIds[] (tool_use_ids this turn issued)
14
14
  * -> permissionDecisionIds[] (approval decisions made this turn)
15
15
  * -> childAgentIds[] (sub-agents spawned this turn)
16
+ * -> childBindings[] (child trace/checkpoint/worktree lineage)
16
17
  * -> worktreeId (isolation worktree, if any)
17
18
  * -> coverage: full | partial | none
18
19
  *
@@ -90,6 +91,7 @@ function emptyRecord(turnId, conversationOffset) {
90
91
  toolCallIds: [],
91
92
  permissionDecisionIds: [],
92
93
  childAgentIds: [],
94
+ childBindings: [],
93
95
  worktreeId: null,
94
96
  // side-effect flags → coverage (kept internal; surfaced via `coverage`)
95
97
  _flags: {
@@ -160,6 +162,39 @@ export class TurnBindingLog {
160
162
  return this;
161
163
  }
162
164
 
165
+ recordChildBinding(turnId, binding) {
166
+ if (!binding || typeof binding !== "object") return this;
167
+ const childAgentId =
168
+ binding.childAgentId == null ? null : String(binding.childAgentId);
169
+ if (!childAgentId) return this;
170
+ const normalized = {
171
+ childAgentId,
172
+ parentAgentId:
173
+ binding.parentAgentId == null ? null : String(binding.parentAgentId),
174
+ traceId: binding.traceId == null ? null : String(binding.traceId),
175
+ parentTraceId:
176
+ binding.parentTraceId == null ? null : String(binding.parentTraceId),
177
+ checkpointIds: Array.isArray(binding.checkpointIds)
178
+ ? [...new Set(binding.checkpointIds.map(String))]
179
+ : [],
180
+ toolUseIds: Array.isArray(binding.toolUseIds)
181
+ ? [...new Set(binding.toolUseIds.map(String))]
182
+ : [],
183
+ worktreeId:
184
+ binding.worktreeId == null ? null : String(binding.worktreeId),
185
+ worktreePath:
186
+ binding.worktreePath == null ? null : String(binding.worktreePath),
187
+ };
188
+ const rec = this._rec(turnId);
189
+ const index = rec.childBindings.findIndex(
190
+ (item) => item.childAgentId === childAgentId,
191
+ );
192
+ if (index === -1) rec.childBindings.push(normalized);
193
+ else rec.childBindings[index] = normalized;
194
+ pushUnique(rec.childAgentIds, childAgentId);
195
+ return this;
196
+ }
197
+
163
198
  /** Bind (or re-bind to the earliest) file checkpoint for this turn. */
164
199
  bindCheckpoint(turnId, checkpointId) {
165
200
  const rec = this._rec(turnId);
@@ -231,6 +266,11 @@ export class TurnBindingLog {
231
266
  toolCallIds: [...rec.toolCallIds],
232
267
  permissionDecisionIds: [...rec.permissionDecisionIds],
233
268
  childAgentIds: [...rec.childAgentIds],
269
+ childBindings: rec.childBindings.map((binding) => ({
270
+ ...binding,
271
+ checkpointIds: [...binding.checkpointIds],
272
+ toolUseIds: [...binding.toolUseIds],
273
+ })),
234
274
  worktreeId: rec.worktreeId,
235
275
  coverage: computeCoverage(rec._flags),
236
276
  };
@@ -260,6 +300,22 @@ export class TurnBindingLog {
260
300
  childAgentIds: Array.isArray(r.childAgentIds)
261
301
  ? [...r.childAgentIds]
262
302
  : [],
303
+ childBindings: Array.isArray(r.childBindings)
304
+ ? r.childBindings.map((binding) => ({
305
+ childAgentId: String(binding.childAgentId),
306
+ parentAgentId: binding.parentAgentId ?? null,
307
+ traceId: binding.traceId ?? null,
308
+ parentTraceId: binding.parentTraceId ?? null,
309
+ checkpointIds: Array.isArray(binding.checkpointIds)
310
+ ? binding.checkpointIds.map(String)
311
+ : [],
312
+ toolUseIds: Array.isArray(binding.toolUseIds)
313
+ ? binding.toolUseIds.map(String)
314
+ : [],
315
+ worktreeId: binding.worktreeId ?? null,
316
+ worktreePath: binding.worktreePath ?? null,
317
+ }))
318
+ : [],
263
319
  worktreeId: r.worktreeId ?? null,
264
320
  _flags: { ...emptyRecord(id)._flags, ...(r._flags || {}) },
265
321
  });
@@ -428,16 +484,12 @@ export function buildTurnBindingFromMarks(turns = [], marks = []) {
428
484
  /**
429
485
  * Stateful feeder turning raw agent-loop events into TurnBindingLog records —
430
486
  * the SHARED producer core for every runner (headless and the interactive
431
- * REPL), so id synthesis and the event→table mapping can never drift between
432
- * them. Provider tool_use ids are not visible on the yielded event stream, so
433
- * tool-call ids are synthesized `<nonce>:c<seq>` and turn ids `<nonce>:t<seq>`
434
- * (mirrors the side-effect ledger's op-id scheme — stable within a run, unique
435
- * across resumes as long as `nonce` is per-run unique).
487
+ * REPL). Provider tool ids are consumed directly; ids are synthesized only for
488
+ * legacy/custom event sources that omit `tool_use_id`.
436
489
  *
437
- * Dirty-gating: `beginTurn` alone never marks the table dirty, so a tool-free
438
- * turn costs the caller zero persistence writes; only a recorded signal
439
- * (checkpoint / tool call / permission decision / child agent / a supersede
440
- * prune) does.
490
+ * Every begun turn marks the table dirty. Tool-free turns still need an
491
+ * explicit `full` coverage record; otherwise restore/history consumers cannot
492
+ * distinguish "nothing happened" from "the producer failed to record".
441
493
  *
442
494
  * @param {{log?: TurnBindingLog, nonce?: string}} [opts]
443
495
  */
@@ -458,8 +510,7 @@ export function createTurnBindingFeed({
458
510
  * contract `pickPersistedTurn` relies on). `supersede: true` first prunes
459
511
  * records at/after that offset (live-REPL rewind/clear/compaction rule);
460
512
  * append-only runners leave it off. `worktreeId` stamps the run's isolation
461
- * worktree onto the record (does NOT mark dirty by itself — a tool-free
462
- * turn in a worktree still writes nothing).
513
+ * worktree onto the record.
463
514
  */
464
515
  beginTurn(
465
516
  conversationOffset,
@@ -471,6 +522,7 @@ export function createTurnBindingFeed({
471
522
  currentTurnId = `${nonce}:t${turnSeq++}`;
472
523
  log.startTurn(currentTurnId, { conversationOffset });
473
524
  if (worktreeId != null) log.setWorktree(currentTurnId, worktreeId);
525
+ dirty = true;
474
526
  return currentTurnId;
475
527
  },
476
528
  currentTurnId: () => currentTurnId,
@@ -486,27 +538,41 @@ export function createTurnBindingFeed({
486
538
  }
487
539
  break;
488
540
  case "tool-executing": {
489
- const callId = `${nonce}:c${callSeq++}`;
541
+ const callId =
542
+ event.tool_use_id == null
543
+ ? `${nonce}:c${callSeq++}`
544
+ : String(event.tool_use_id);
490
545
  currentCallId = callId;
491
546
  log.recordToolCall(turnId, callId, { name: event.tool });
492
547
  dirty = true;
493
548
  break;
494
549
  }
495
550
  case "tool-result": {
496
- // A gated tool surfaces its permission decision on `result.policy`;
497
- // re-derive a stable decision id feeder-side (core's own id hangs
498
- // off the provider call id, which the event stream does not expose).
551
+ const callId =
552
+ event.tool_use_id == null
553
+ ? currentCallId
554
+ : String(event.tool_use_id);
555
+ // New core events expose the exact decision id. Legacy/custom event
556
+ // sources retain the deterministic compatibility derivation.
499
557
  const policy = event.result?.policy;
500
558
  if (policy && (policy.via || policy.decision)) {
501
559
  log.recordPermissionDecision(
502
560
  turnId,
503
- `${currentCallId || "call"}:perm:${policy.via || policy.decision}`,
561
+ event.permission_decision_id ||
562
+ `${callId || "call"}:perm:${policy.via || policy.decision}`,
504
563
  );
505
564
  dirty = true;
506
565
  }
566
+ if (event.result?.userEdited === true) {
567
+ log.markUserEdit(turnId);
568
+ dirty = true;
569
+ }
507
570
  // Foreground spawn_sub_agent reports its child id on the result.
508
571
  if (event.result?.subAgentId) {
509
572
  log.recordChildAgent(turnId, event.result.subAgentId);
573
+ if (event.result.childBinding) {
574
+ log.recordChildBinding(turnId, event.result.childBinding);
575
+ }
510
576
  dirty = true;
511
577
  }
512
578
  currentCallId = null;
@@ -515,6 +581,9 @@ export function createTurnBindingFeed({
515
581
  case "background-sub-agent-result":
516
582
  if (event.subAgentId) {
517
583
  log.recordChildAgent(turnId, event.subAgentId);
584
+ if (event.childBinding) {
585
+ log.recordChildBinding(turnId, event.childBinding);
586
+ }
518
587
  dirty = true;
519
588
  }
520
589
  break;