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
@@ -72,10 +72,13 @@ import {
72
72
  startSession as jsonlStartSession,
73
73
  appendUserMessage as jsonlAppendUserMessage,
74
74
  appendAssistantMessage as jsonlAppendAssistantMessage,
75
+ appendEvent as jsonlAppendEvent,
76
+ readEvents as jsonlReadEvents,
75
77
  rebuildMessages as jsonlRebuildMessages,
76
78
  sessionExists as jsonlSessionExists,
77
79
  } from "../harness/jsonl-session-store.js";
78
80
  import {
81
+ SideEffectLedger,
79
82
  reconcileSideEffects,
80
83
  classifyToolSideEffect,
81
84
  } from "../lib/side-effect-ledger.js";
@@ -85,7 +88,14 @@ import {
85
88
  persistSideEffectLedger,
86
89
  } from "../lib/side-effect-ledger-store.js";
87
90
  import { operationIdempotencyKey } from "../lib/idempotency.js";
91
+ import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
92
+ import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
88
93
  import { getPlanModeManager } from "../lib/plan-mode.js";
94
+ import {
95
+ SESSION_SLASH_COMMANDS,
96
+ executeSessionSlashCommand,
97
+ parseSessionSlashCommandEvent,
98
+ } from "./session-slash-commands.js";
89
99
 
90
100
  /**
91
101
  * Resolve the streaming-delta coalesce window (ms). Adjacent partial-message
@@ -429,6 +439,11 @@ export function parseInputEvent(line) {
429
439
  if (obj.features !== undefined) offer.features = obj.features;
430
440
  return { hello: offer };
431
441
  }
442
+ // Session-scoped slash commands (IDE panel / SDK control plane). These are
443
+ // dispatched against live session state and never become model turns:
444
+ // {"type":"slash_command","command":"status","args":"","request_id":"r1"}
445
+ const slashCommand = parseSessionSlashCommandEvent(obj);
446
+ if (slashCommand) return { slashCommand };
432
447
  // Plan-mode control events (chat-panel plan UI):
433
448
  // {"type":"plan","action":"enter"|"approve"|"reject"}
434
449
  if (obj && typeof obj === "object" && obj.type === "plan") {
@@ -687,7 +702,15 @@ function buildSideEffectRecovery(ledger) {
687
702
  async function runTurn(
688
703
  messages,
689
704
  loopOptions,
690
- { runLoop, emit, costBudget, nextToolUseId, sideEffects, turnNumber },
705
+ {
706
+ runLoop,
707
+ emit,
708
+ costBudget,
709
+ nextToolUseId,
710
+ sideEffects,
711
+ turnNumber,
712
+ turnBindingFeed,
713
+ },
691
714
  ) {
692
715
  const usage = {
693
716
  input_tokens: 0,
@@ -731,12 +754,15 @@ async function runTurn(
731
754
  collapseConsecutiveMessagesInPlace(messages);
732
755
  }
733
756
  for await (const event of runLoop(messages, loopOptions)) {
757
+ turnBindingFeed?.handleEvent(event);
734
758
  switch (event.type) {
735
759
  case "tool-executing": {
736
760
  // Additive protocol-v1 correlation id ("tu-<n>", session-scoped —
737
761
  // agent-sdk docs/PROTOCOL.md §1.2.1): the matching tool_result below
738
762
  // echoes the same id so UIs can pair calls without adjacency.
739
- const toolUseId = nextToolUseId ? nextToolUseId() : undefined;
763
+ const toolUseId =
764
+ event.tool_use_id ||
765
+ (nextToolUseId ? nextToolUseId() : undefined);
740
766
  const pm = getPlanModeManager();
741
767
  const planItem = pm.startPlanItemForTool(event.tool, {
742
768
  toolUseId,
@@ -816,7 +842,10 @@ async function runTurn(
816
842
  // recent tool_use (same adjacency rule the is_error attribution
817
843
  // below has always used).
818
844
  const lastCall =
819
- toolCalls.length > 0 ? toolCalls[toolCalls.length - 1] : null;
845
+ (event.tool_use_id
846
+ ? toolCalls.find((call) => call.id === event.tool_use_id)
847
+ : null) ||
848
+ (toolCalls.length > 0 ? toolCalls[toolCalls.length - 1] : null);
820
849
  if (lastCall) lastCall.is_error = Boolean(err);
821
850
  const pm = getPlanModeManager();
822
851
  const settledItem = lastCall?.planItemId
@@ -943,6 +972,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
943
972
  // runAgentHeadless for the full semantics. null = no file → unchanged.
944
973
  let permissionRules = options.permissionRules || null;
945
974
  let managedSettings = null;
975
+ let settingsFiles = [];
946
976
  try {
947
977
  const { loadSettings, applyManagedPermissionPolicy } =
948
978
  await import("../lib/settings-loader.cjs");
@@ -952,6 +982,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
952
982
  managedSettingsFile: options.managedSettingsFile,
953
983
  });
954
984
  managedSettings = loaded.managed;
985
+ settingsFiles = Array.isArray(loaded.files) ? loaded.files : [];
955
986
  if (!permissionRules) {
956
987
  const total =
957
988
  loaded.rules.allow.length +
@@ -1016,6 +1047,8 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1016
1047
  const runLoop = deps.agentLoop || coreAgentLoop;
1017
1048
  const doBootstrap = deps.bootstrap || bootstrap;
1018
1049
  const doExpand = deps.expandFileRefs || expandFileRefsAsync;
1050
+ const runSessionSlashCommand =
1051
+ deps.executeSessionSlashCommand || executeSessionSlashCommand;
1019
1052
  const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
1020
1053
  const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
1021
1054
  // Guard the real stdout/stderr against a downstream `| head` closing the pipe
@@ -1093,6 +1126,8 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1093
1126
  appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
1094
1127
  appendAssistantMessage:
1095
1128
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
1129
+ appendEvent: deps.appendEvent || jsonlAppendEvent,
1130
+ readEvents: deps.readEvents || jsonlReadEvents,
1096
1131
  rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
1097
1132
  };
1098
1133
  // --ephemeral forces persistence OFF even with an explicit session id (the
@@ -1111,12 +1146,15 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1111
1146
  const loadLedger = deps.loadSideEffectLedger || loadSideEffectLedger;
1112
1147
  const persistLedger = deps.persistSideEffectLedger || persistSideEffectLedger;
1113
1148
  let sideEffectLedger = null;
1149
+ let sideEffectLedgerLoadError = null;
1114
1150
  if (persist) {
1115
1151
  try {
1116
1152
  sideEffectLedger = loadLedger(sessionId);
1117
- } catch {
1118
- // ledger is best-effort — never block the stream over it
1119
- sideEffectLedger = null;
1153
+ } catch (error) {
1154
+ // Read-only turns remain available, but the first classified side effect
1155
+ // fails before the generator can resume into the actual operation.
1156
+ sideEffectLedger = new SideEffectLedger();
1157
+ sideEffectLedgerLoadError = error;
1120
1158
  }
1121
1159
  }
1122
1160
  let sideEffectSeq = 0;
@@ -1127,11 +1165,111 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1127
1165
  const sideEffects = sideEffectLedger
1128
1166
  ? {
1129
1167
  ledger: sideEffectLedger,
1130
- persist: () => persistLedger(sessionId, sideEffectLedger),
1168
+ persist: () => {
1169
+ if (sideEffectLedgerLoadError) throw sideEffectLedgerLoadError;
1170
+ const persisted = persistLedger(sessionId, sideEffectLedger);
1171
+ if (persisted === false) {
1172
+ const error = new Error(
1173
+ `Side-effect ledger persistence was rejected for ${sessionId}`,
1174
+ );
1175
+ error.code = "SIDE_EFFECT_LEDGER_PERSIST_FAILED";
1176
+ throw error;
1177
+ }
1178
+ return persisted;
1179
+ },
1131
1180
  nextOpId: () => `${sideEffectRunNonce}:${sideEffectSeq++}`,
1132
1181
  }
1133
1182
  : null;
1134
1183
 
1184
+ // P1 unified turn/checkpoint producer for long-lived stream sessions. Load
1185
+ // the latest snapshot on resume, then append one explicit coverage record
1186
+ // for every input turn (including tool-free turns).
1187
+ let turnBindingLog = new TurnBindingLog();
1188
+ let turnBindingPersistenceError = null;
1189
+ let turnBindingDegradationEmitted = false;
1190
+ let turnBindingTerminalEmitted = false;
1191
+ const recordTurnBindingFailure = (error, operation) => {
1192
+ if (turnBindingPersistenceError) return turnBindingPersistenceError;
1193
+ const wrapped = new Error(
1194
+ `Turn binding ${operation} failed for ${sessionId}: ${
1195
+ error?.message || String(error)
1196
+ }`,
1197
+ { cause: error },
1198
+ );
1199
+ wrapped.code =
1200
+ operation === "read"
1201
+ ? "TURN_BINDING_READ_FAILED"
1202
+ : "TURN_BINDING_PERSIST_FAILED";
1203
+ turnBindingPersistenceError = wrapped;
1204
+ return wrapped;
1205
+ };
1206
+ const emitTurnBindingFailure = () => {
1207
+ if (!turnBindingPersistenceError) return false;
1208
+ if (!turnBindingDegradationEmitted) {
1209
+ emit({
1210
+ type: "recovery_degraded",
1211
+ component: "turn_binding",
1212
+ session_id: sessionId,
1213
+ error: turnBindingPersistenceError.message,
1214
+ });
1215
+ turnBindingDegradationEmitted = true;
1216
+ }
1217
+ if (!turnBindingTerminalEmitted) {
1218
+ emit({
1219
+ type: "result",
1220
+ subtype: "error",
1221
+ is_error: true,
1222
+ error: turnBindingPersistenceError.message,
1223
+ session_id: sessionId,
1224
+ });
1225
+ turnBindingTerminalEmitted = true;
1226
+ }
1227
+ return true;
1228
+ };
1229
+ if (persist) {
1230
+ try {
1231
+ const priorEvents = store.readEvents(sessionId) || [];
1232
+ for (let index = priorEvents.length - 1; index >= 0; index--) {
1233
+ const event = priorEvents[index];
1234
+ if (
1235
+ event?.type === TURN_BINDING_EVENT &&
1236
+ event.data &&
1237
+ typeof event.data === "object"
1238
+ ) {
1239
+ turnBindingLog = TurnBindingLog.fromJSON(event.data);
1240
+ break;
1241
+ }
1242
+ }
1243
+ } catch (error) {
1244
+ recordTurnBindingFailure(error, "read");
1245
+ }
1246
+ }
1247
+ const turnBindingFeed = persist
1248
+ ? createTurnBindingFeed({
1249
+ log: turnBindingLog,
1250
+ nonce: sideEffectRunNonce,
1251
+ })
1252
+ : null;
1253
+ const persistTurnBindingLog = () => {
1254
+ if (!turnBindingFeed?.isDirty()) return true;
1255
+ if (turnBindingPersistenceError) return false;
1256
+ try {
1257
+ const persisted = store.appendEvent(
1258
+ sessionId,
1259
+ TURN_BINDING_EVENT,
1260
+ turnBindingLog.toJSON(),
1261
+ );
1262
+ if (persisted === false) {
1263
+ throw new Error("session store rejected the binding snapshot");
1264
+ }
1265
+ turnBindingFeed.clearDirty();
1266
+ return true;
1267
+ } catch (error) {
1268
+ recordTurnBindingFailure(error, "persistence");
1269
+ return false;
1270
+ }
1271
+ };
1272
+
1135
1273
  // ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
1136
1274
  // CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
1137
1275
  // `ask`) normally fail closed in headless. With this opt-in they become a
@@ -1395,7 +1533,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1395
1533
  if (settingsHooks && _loadedInstructions) {
1396
1534
  try {
1397
1535
  const { runInstructionsLoadedHooks } =
1398
- await import("../lib/settings-hook-events.cjs");
1536
+ await import("../lib/settings-hook-events.js");
1399
1537
  const ctx = runInstructionsLoadedHooks(settingsHooks, {
1400
1538
  files: _loadedInstructions.files,
1401
1539
  cwd,
@@ -1436,7 +1574,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1436
1574
  if (settingsHooks) {
1437
1575
  try {
1438
1576
  const { runSessionStartHooks } =
1439
- await import("../lib/settings-hook-events.cjs");
1577
+ await import("../lib/settings-hook-events.js");
1440
1578
  const ctx = runSessionStartHooks(settingsHooks, {
1441
1579
  source: "startup",
1442
1580
  cwd,
@@ -1520,6 +1658,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1520
1658
  mcp: Boolean(options.mcpConfig) || options.useRegisteredMcp !== false,
1521
1659
  enabledToolNames,
1522
1660
  }),
1661
+ slash_commands: [...SESSION_SLASH_COMMANDS],
1523
1662
  input_format: "stream-json",
1524
1663
  additional_directories: additionalDirectories,
1525
1664
  resumed_messages: resumedMessages,
@@ -1858,6 +1997,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1858
1997
  let wakeQueue = null;
1859
1998
  let inputDone = false;
1860
1999
  let currentAbort = null;
2000
+ let slashRequestSeq = 0;
1861
2001
  (async () => {
1862
2002
  try {
1863
2003
  for await (const line of readJsonLines(input)) {
@@ -1946,6 +2086,65 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1946
2086
  for (;;) {
1947
2087
  const parsed = await nextEvent();
1948
2088
  if (parsed == null) break; // stdin closed
2089
+ if (turnBindingPersistenceError) {
2090
+ emitTurnBindingFailure();
2091
+ sawError = true;
2092
+ break;
2093
+ }
2094
+
2095
+ if (parsed.slashCommand) {
2096
+ const requestId =
2097
+ parsed.slashCommand.requestId || `slash-${++slashRequestSeq}`;
2098
+ let result;
2099
+ try {
2100
+ result = await runSessionSlashCommand(
2101
+ parsed.slashCommand,
2102
+ {
2103
+ sessionId,
2104
+ cwd,
2105
+ provider,
2106
+ model,
2107
+ apiKey,
2108
+ messages,
2109
+ messageCount: messages.length,
2110
+ additionalDirectories,
2111
+ extraRoots: additionalDirectories.length,
2112
+ mcp,
2113
+ permissionRules,
2114
+ permissionMode: options.permissionMode || "default",
2115
+ settingsHooks,
2116
+ settingsFiles,
2117
+ loadedInstructions: _loadedInstructions,
2118
+ projectMemoryEnabled:
2119
+ options.projectMemory !== false &&
2120
+ process.env.CC_PROJECT_MEMORY !== "0",
2121
+ },
2122
+ deps.sessionSlashCommandDeps || {},
2123
+ );
2124
+ } catch (error) {
2125
+ result = {
2126
+ ok: false,
2127
+ code: "COMMAND_FAILED",
2128
+ error: String(error?.message || error),
2129
+ };
2130
+ }
2131
+ emit({
2132
+ type: "slash_command_result",
2133
+ request_id: requestId,
2134
+ command: parsed.slashCommand.command,
2135
+ session_id: sessionId,
2136
+ ok: result?.ok === true,
2137
+ ...(result?.ok === true
2138
+ ? { text: String(result.output || "") }
2139
+ : {
2140
+ error: {
2141
+ code: result?.code || "COMMAND_FAILED",
2142
+ message: String(result?.error || "Slash command failed"),
2143
+ },
2144
+ }),
2145
+ });
2146
+ continue;
2147
+ }
1949
2148
 
1950
2149
  // One-time version-skew reminder (see flag declaration above). Best-effort;
1951
2150
  // never blocks a turn. detectVersionSkew() returns null when this process is
@@ -2244,7 +2443,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2244
2443
  if (settingsHooks) {
2245
2444
  try {
2246
2445
  const { runUserPromptSubmitHooks } =
2247
- await import("../lib/settings-hook-events.cjs");
2446
+ await import("../lib/settings-hook-events.js");
2248
2447
  const ups = runUserPromptSubmitHooks(settingsHooks, {
2249
2448
  prompt: userContent,
2250
2449
  cwd,
@@ -2348,6 +2547,9 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2348
2547
  }
2349
2548
  }
2350
2549
  turns += 1;
2550
+ turnBindingFeed?.beginTurn(messages.length, {
2551
+ worktreeId: options.worktreeId ?? null,
2552
+ });
2351
2553
 
2352
2554
  // Per-turn abort scope: an {"type":"interrupt"} from the pump above
2353
2555
  // aborts THIS turn (LLM fetch included — the signal reaches chatWithTools)
@@ -2418,6 +2620,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2418
2620
  nextToolUseId,
2419
2621
  sideEffects,
2420
2622
  turnNumber: turns,
2623
+ turnBindingFeed,
2421
2624
  },
2422
2625
  );
2423
2626
  } catch (err) {
@@ -2461,6 +2664,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2461
2664
  });
2462
2665
  sawError = true;
2463
2666
  continue;
2667
+ } finally {
2668
+ persistTurnBindingLog();
2669
+ }
2670
+ if (turnBindingPersistenceError) {
2671
+ emitTurnBindingFailure();
2672
+ sawError = true;
2673
+ break;
2464
2674
  }
2465
2675
  currentAbort = null;
2466
2676
 
@@ -2596,7 +2806,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
2596
2806
  if (settingsHooks) {
2597
2807
  try {
2598
2808
  const { runObserveHooks } =
2599
- await import("../lib/settings-hook-events.cjs");
2809
+ await import("../lib/settings-hook-events.js");
2600
2810
  runObserveHooks(
2601
2811
  settingsHooks,
2602
2812
  "SessionEnd",