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
@@ -876,6 +876,22 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
876
876
  type: "number",
877
877
  description: "Max wait for user reply in ms (default: 60000)",
878
878
  },
879
+ defaultValue: {
880
+ description:
881
+ "Fallback answer used only when onTimeout/onReject is useDefault",
882
+ },
883
+ onTimeout: {
884
+ type: "string",
885
+ enum: ["error", "useDefault", "skip"],
886
+ description:
887
+ "Timeout policy: error (default), useDefault, or skip with a null answer",
888
+ },
889
+ onReject: {
890
+ type: "string",
891
+ enum: ["error", "useDefault", "skip"],
892
+ description:
893
+ "User-rejection policy: error (default), useDefault, or skip with a null answer",
894
+ },
879
895
  },
880
896
  required: ["question"],
881
897
  },
@@ -61,6 +61,7 @@ import { SIDE_EFFECT_LEDGER_EVENT } from "../lib/side-effect-ledger-store.js";
61
61
  import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
62
62
  import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
63
63
  import { operationIdempotencyKey } from "../lib/idempotency.js";
64
+ import { CLISkillLoader } from "../lib/skill-loader.js";
64
65
  import { expandFileRefsAsync } from "./file-ref-expander.js";
65
66
  import { composeSystemPrompt } from "./system-prompt.js";
66
67
  import { buildUserContent } from "../lib/image-input.js";
@@ -79,6 +80,7 @@ import {
79
80
  } from "../lib/exit-codes.cjs";
80
81
  import { isolationLevel } from "../lib/agent-sandbox.js";
81
82
  import { createBackgroundPhaseReporter } from "../lib/background-phase-reporter.js";
83
+ import { createBackgroundInteractionClient } from "../lib/background-interaction-resolver.js";
82
84
  import { withQuietStdout } from "./quiet-stdout.js";
83
85
  import { CostBudget } from "../lib/cost-budget.js";
84
86
  import { estimateTokens } from "../harness/prompt-compressor.js";
@@ -87,6 +89,23 @@ import {
87
89
  recordDenial,
88
90
  formatDenials,
89
91
  } from "../lib/repl-denials.js";
92
+ import executionBroker from "../lib/process-execution-broker/index.js";
93
+
94
+ const goalBrokerRunner = executionBroker.spawnSync.bind(executionBroker);
95
+
96
+ export const _goalProcessDeps = {
97
+ run: goalBrokerRunner,
98
+ };
99
+
100
+ function runHeadlessGoalCommand(command, options = {}) {
101
+ return _goalProcessDeps.run(command, [], {
102
+ ...options,
103
+ timeout: options.timeout ?? 30000,
104
+ origin: "headless-goal:exit-zero",
105
+ policy: "allow",
106
+ scope: "headless-goal",
107
+ });
108
+ }
90
109
 
91
110
  /** Tools that cannot mutate the filesystem or run commands. */
92
111
  export const READ_ONLY_TOOLS = Object.freeze([
@@ -717,21 +736,51 @@ export async function runAgentHeadless(options = {}, deps = {}) {
717
736
  deps.backgroundPhaseReporter || createBackgroundPhaseReporter();
718
737
 
719
738
  const sideEffectRunNonce = String(deps.now ? deps.now() : Date.now());
739
+ const _backgroundPolicyDigest = _bgPhase.enabled
740
+ ? computePolicyDigest({
741
+ permissionMode: options.permissionMode,
742
+ allowedTools: options.allowedTools,
743
+ disallowedTools: options.disallowedTools,
744
+ permissionRules,
745
+ })
746
+ : null;
747
+ const _backgroundInteraction = _bgPhase.enabled
748
+ ? deps.backgroundInteractionClient ||
749
+ createBackgroundInteractionClient({
750
+ backgroundAgentId: process.env.CC_BACKGROUND_AGENT_ID,
751
+ sessionId,
752
+ // One headless invocation is one user turn even when its model/tool
753
+ // loop contains several internal iterations.
754
+ turnId: options.turnId || sideEffectRunNonce,
755
+ })
756
+ : null;
720
757
  let sideEffectLedger = new SideEffectLedger({ clock: deps.now || null });
758
+ let sideEffectLedgerLoadError = null;
721
759
  let sideEffectSeq = 0;
722
760
  let currentSideEffectOpId = null;
723
761
  let resumeSideEffectContext = null;
724
762
  let resumeAsyncHookContext = null;
725
763
  const persistSideEffectLedger = () => {
726
764
  if (!persist) return;
765
+ if (sideEffectLedgerLoadError) throw sideEffectLedgerLoadError;
727
766
  try {
728
- store.appendEvent(
767
+ const persisted = store.appendEvent(
729
768
  sessionId,
730
769
  SIDE_EFFECT_LEDGER_EVENT,
731
770
  sideEffectLedger.toJSON(),
732
771
  );
733
- } catch {
734
- // best-effort never fail the run over ledger persistence
772
+ if (persisted === false) {
773
+ throw new Error("session store rejected the ledger snapshot");
774
+ }
775
+ } catch (cause) {
776
+ const error = new Error(
777
+ `Side-effect ledger persistence failed for ${sessionId}: ${
778
+ cause?.message || String(cause)
779
+ }`,
780
+ { cause },
781
+ );
782
+ error.code = "SIDE_EFFECT_LEDGER_PERSIST_FAILED";
783
+ throw error;
735
784
  }
736
785
  };
737
786
  // P1 explicit turn→checkpoint binding: feed the TurnBindingLog in real time
@@ -744,6 +793,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
744
793
  // context. Only writes when a turn actually recorded something, and only for
745
794
  // persisted runs — a tool-free Q&A or ephemeral run stays byte-identical.
746
795
  let turnBindingLog = new TurnBindingLog();
796
+ let turnBindingLoadError = null;
747
797
  if (persist) {
748
798
  try {
749
799
  const events = store.readEvents(sessionId) || [];
@@ -759,8 +809,15 @@ export async function runAgentHeadless(options = {}, deps = {}) {
759
809
  break;
760
810
  }
761
811
  }
762
- } catch {
763
- // fresh log best effort
812
+ } catch (cause) {
813
+ const error = new Error(
814
+ `Turn binding read failed for ${sessionId}: ${
815
+ cause?.message || String(cause)
816
+ }`,
817
+ { cause },
818
+ );
819
+ error.code = "TURN_BINDING_READ_FAILED";
820
+ turnBindingLoadError = error;
764
821
  }
765
822
  }
766
823
  // Event→table folding + id synthesis live in the SHARED feeder core
@@ -771,11 +828,26 @@ export async function runAgentHeadless(options = {}, deps = {}) {
771
828
  : null;
772
829
  const persistTurnBindingLog = () => {
773
830
  if (!turnBindingFeed || !turnBindingFeed.isDirty()) return;
831
+ if (turnBindingLoadError) throw turnBindingLoadError;
774
832
  try {
775
- store.appendEvent(sessionId, TURN_BINDING_EVENT, turnBindingLog.toJSON());
833
+ const persisted = store.appendEvent(
834
+ sessionId,
835
+ TURN_BINDING_EVENT,
836
+ turnBindingLog.toJSON(),
837
+ );
838
+ if (persisted === false) {
839
+ throw new Error("session store rejected the binding snapshot");
840
+ }
776
841
  turnBindingFeed.clearDirty();
777
- } catch {
778
- // best-effort never fail the run over binding persistence
842
+ } catch (cause) {
843
+ const error = new Error(
844
+ `Turn binding persistence failed for ${sessionId}: ${
845
+ cause?.message || String(cause)
846
+ }`,
847
+ { cause },
848
+ );
849
+ error.code = "TURN_BINDING_PERSIST_FAILED";
850
+ throw error;
779
851
  }
780
852
  };
781
853
  if (persist) {
@@ -795,8 +867,17 @@ export async function runAgentHeadless(options = {}, deps = {}) {
795
867
  break;
796
868
  }
797
869
  }
798
- } catch {
799
- // fresh ledger best effort
870
+ } catch (cause) {
871
+ const error = new Error(
872
+ `Side-effect ledger read failed for ${sessionId}: ${
873
+ cause?.message || String(cause)
874
+ }`,
875
+ { cause },
876
+ );
877
+ error.code = "SIDE_EFFECT_LEDGER_READ_FAILED";
878
+ // Keep read-only turns available; classified side effects call the
879
+ // persistence gate above before the generator can execute the tool.
880
+ sideEffectLedgerLoadError = error;
800
881
  }
801
882
  // On resume, surface any operation that was in flight when the prior run
802
883
  // died: its outcome is UNKNOWN, so the model is told to VERIFY before any
@@ -951,10 +1032,19 @@ export async function runAgentHeadless(options = {}, deps = {}) {
951
1032
  const _leanNoProjectMemory = options.projectMemory === false;
952
1033
  let _loadedInstructions = null;
953
1034
  let _loadedPersonaSkills = [];
1035
+ let _skillCacheLedger = null;
1036
+ const _runtimeSkillLoader =
1037
+ options.skillLoader || new CLISkillLoader();
954
1038
  const systemContent = composeSystemPrompt(
955
1039
  buildSystemPrompt(cwd, {
956
1040
  additionalDirectories,
957
1041
  projectMemory: options.projectMemory,
1042
+ sessionId,
1043
+ skillLoader: _runtimeSkillLoader,
1044
+ onSkillsLoaded: (skills, cacheLedger) => {
1045
+ _loadedPersonaSkills = Array.isArray(skills) ? skills : [];
1046
+ _skillCacheLedger = cacheLedger || null;
1047
+ },
958
1048
  }),
959
1049
  {
960
1050
  systemPrompt: options.systemPrompt,
@@ -965,9 +1055,6 @@ export async function runAgentHeadless(options = {}, deps = {}) {
965
1055
  onInstructionsLoaded: (loaded) => {
966
1056
  _loadedInstructions = loaded;
967
1057
  },
968
- onSkillsLoaded: (skills) => {
969
- _loadedPersonaSkills = Array.isArray(skills) ? skills : [];
970
- },
971
1058
  },
972
1059
  );
973
1060
 
@@ -975,7 +1062,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
975
1062
  if (settingsHooks) {
976
1063
  try {
977
1064
  const { runUserPromptSubmitHooks } =
978
- await import("../lib/settings-hook-events.cjs");
1065
+ await import("../lib/settings-hook-events.js");
979
1066
  const ups = runUserPromptSubmitHooks(settingsHooks, {
980
1067
  prompt: userContent,
981
1068
  cwd,
@@ -1006,7 +1093,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1006
1093
  if (settingsHooks && _loadedInstructions) {
1007
1094
  try {
1008
1095
  const { runInstructionsLoadedHooks } =
1009
- await import("../lib/settings-hook-events.cjs");
1096
+ await import("../lib/settings-hook-events.js");
1010
1097
  instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
1011
1098
  files: _loadedInstructions.files,
1012
1099
  cwd,
@@ -1022,7 +1109,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1022
1109
  if (settingsHooks) {
1023
1110
  try {
1024
1111
  const { runSessionStartHooks } =
1025
- await import("../lib/settings-hook-events.cjs");
1112
+ await import("../lib/settings-hook-events.js");
1026
1113
  sessionStartContext = runSessionStartHooks(settingsHooks, {
1027
1114
  source: resumeId ? "resume" : "startup",
1028
1115
  cwd,
@@ -1041,7 +1128,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1041
1128
  if (settingsHooks && resumeId && history.length > 0) {
1042
1129
  try {
1043
1130
  const { runObserveHooks } =
1044
- await import("../lib/settings-hook-events.cjs");
1131
+ await import("../lib/settings-hook-events.js");
1045
1132
  runObserveHooks(
1046
1133
  settingsHooks,
1047
1134
  "SessionResume",
@@ -1313,7 +1400,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1313
1400
  if (settingsHooks) {
1314
1401
  try {
1315
1402
  const { AsyncHookSupervisor } =
1316
- await import("../lib/async-hook-supervisor.cjs");
1403
+ await import("../lib/async-hook-supervisor.js");
1317
1404
  _hookSupervisor = new AsyncHookSupervisor({
1318
1405
  persistStats: true,
1319
1406
  // Durably park failed-rewake signals keyed by session so a crash before
@@ -1350,10 +1437,17 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1350
1437
  // Persist the admitted runtime schema surface so `cc context --sources` can
1351
1438
  // attribute MCP cost to the actual server/tool definitions used by this run,
1352
1439
  // rather than guessing from the current environment on a later invocation.
1353
- if (
1354
- persist &&
1355
- (mcp?.extraToolDefinitions?.length || _loadedPersonaSkills.length)
1356
- ) {
1440
+ const persistContextSources = () => {
1441
+ if (!persist) return false;
1442
+ _skillCacheLedger =
1443
+ _runtimeSkillLoader.getCacheLedger?.() || _skillCacheLedger;
1444
+ if (
1445
+ !mcp?.extraToolDefinitions?.length &&
1446
+ !_loadedPersonaSkills.length &&
1447
+ !_skillCacheLedger?.descriptors?.resident
1448
+ ) {
1449
+ return false;
1450
+ }
1357
1451
  try {
1358
1452
  store.appendEvent(sessionId, "context_sources", {
1359
1453
  mcp: (mcp?.extraToolDefinitions || []).map((definition) => ({
@@ -1367,13 +1461,22 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1367
1461
  id: skill?.id || skill?.displayName || "skill",
1368
1462
  displayName: skill?.displayName || skill?.id || "skill",
1369
1463
  source: skill?.source || "skill",
1370
- body: typeof skill?.body === "string" ? skill.body : "",
1464
+ tokens: estimateTokens(
1465
+ `## Persona: ${skill?.displayName || skill?.id || "skill"}\n${
1466
+ typeof skill?.body === "string" ? skill.body : ""
1467
+ }`,
1468
+ ),
1469
+ bodyLoaded: skill?.bodyLoaded === true,
1371
1470
  })),
1471
+ skillCache: _skillCacheLedger,
1372
1472
  });
1473
+ return true;
1373
1474
  } catch {
1374
1475
  // Source attribution is observability-only; never fail the agent run.
1476
+ return false;
1375
1477
  }
1376
- }
1478
+ };
1479
+ persistContextSources();
1377
1480
 
1378
1481
  const loopOptions = {
1379
1482
  model,
@@ -1392,6 +1495,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1392
1495
  baseUrl,
1393
1496
  apiKey,
1394
1497
  cwd,
1498
+ skillLoader: _runtimeSkillLoader,
1395
1499
  additionalDirectories,
1396
1500
  sandbox: options.sandbox || null,
1397
1501
  sessionId,
@@ -1418,27 +1522,39 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1418
1522
  disabledTools,
1419
1523
  iterationBudget: budget,
1420
1524
  toolAdmission: options.toolAdmission || null,
1421
- // `ask_user_question` in a BACKGROUND turn child (P0 state-machine
1422
- // producer for `needs_input`): there is no live channel to a human
1423
- // mid-turn, but the question IS the structured needs-input signal. Park
1424
- // it record `phase: "needs_input"` + the question in the shared state
1425
- // file (dashboard "Needs input" gets real data; the user's reply arrives
1426
- // as the next attach prompt) and tell the model to end the turn. A
1427
- // non-background run supplies no interaction → the handler's existing
1428
- // `user_not_reachable` path stays byte-identical.
1525
+ // `ask_user_question` in a BACKGROUND turn child: send a bound request to
1526
+ // the worker over Node IPC and await the answer here. `executeTool` remains
1527
+ // suspended, so the model continues the SAME turn/tool call after the user
1528
+ // answers instead of receiving the answer as a follow-up turn.
1429
1529
  ...(_bgPhase.enabled
1430
1530
  ? {
1431
1531
  interaction: {
1432
- askUser: async ({ question, options: qOptions } = {}) => {
1532
+ askUser: async ({
1533
+ question,
1534
+ options: qOptions,
1535
+ multiSelect,
1536
+ timeoutMs,
1537
+ defaultValue,
1538
+ toolUseId,
1539
+ turnId,
1540
+ policyDigest,
1541
+ } = {}) => {
1433
1542
  _bgPhase.reportQuestion({
1434
1543
  question: typeof question === "string" ? question : "",
1435
1544
  options: Array.isArray(qOptions) ? qOptions : null,
1436
1545
  });
1437
- throw new Error(
1438
- "question parked for the user (background session). End this " +
1439
- "turn now — the user's reply will arrive as the next " +
1440
- "message. Do not repeat the question.",
1441
- );
1546
+ return _backgroundInteraction.request({
1547
+ kind: "question",
1548
+ question,
1549
+ options: qOptions,
1550
+ multiSelect,
1551
+ timeoutMs,
1552
+ defaultValue,
1553
+ toolUseId,
1554
+ turnId,
1555
+ policyDigest: policyDigest || _backgroundPolicyDigest,
1556
+ sessionId,
1557
+ });
1442
1558
  },
1443
1559
  },
1444
1560
  }
@@ -1603,7 +1719,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1603
1719
  const _settleAsyncStop = async () => {
1604
1720
  if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
1605
1721
  const { dispatchAsyncHooks } =
1606
- await import("../lib/settings-hook-events.cjs");
1722
+ await import("../lib/settings-hook-events.js");
1607
1723
  dispatchAsyncHooks(
1608
1724
  settingsHooks,
1609
1725
  "Stop",
@@ -1783,7 +1899,6 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1783
1899
  process.once("SIGTERM", _onHardSignal);
1784
1900
 
1785
1901
  try {
1786
- // eslint-disable-next-line no-constant-condition
1787
1902
  while (true) {
1788
1903
  // P1 turn→checkpoint binding: one drain of the loop = one turn. Anchor
1789
1904
  // the conversation offset before the model sees the new user turn. A
@@ -1808,10 +1923,15 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1808
1923
  if (isText) writeErr(line + "\n");
1809
1924
  emitStream({
1810
1925
  type: "tool_use",
1926
+ ...(event.tool_use_id ? { id: event.tool_use_id } : {}),
1927
+ tool: event.tool,
1928
+ args: event.args,
1929
+ });
1930
+ toolCalls.push({
1931
+ ...(event.tool_use_id ? { id: event.tool_use_id } : {}),
1811
1932
  tool: event.tool,
1812
1933
  args: event.args,
1813
1934
  });
1814
- toolCalls.push({ tool: event.tool, args: event.args });
1815
1935
  // P0-2: record an irreversible effect as STARTED (persisted before
1816
1936
  // it settles) so a crash before the matching tool-result leaves a
1817
1937
  // reconcilable "in flight" marker instead of a silent replay.
@@ -1866,6 +1986,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1866
1986
  if (isText && err) writeErr(` Error: ${err}\n`);
1867
1987
  emitStream({
1868
1988
  type: "tool_result",
1989
+ ...(event.tool_use_id ? { id: event.tool_use_id } : {}),
1869
1990
  tool: event.tool,
1870
1991
  is_error: Boolean(err),
1871
1992
  error: err,
@@ -2085,8 +2206,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
2085
2206
  try {
2086
2207
  if (_goalHelpers.isDeterministicCondition(cond)) {
2087
2208
  const gc = deps.goalCheck || {};
2088
- const spawnSync =
2089
- gc.spawnSync || (await import("node:child_process")).spawnSync;
2209
+ const spawnSync = gc.spawnSync || runHeadlessGoalCommand;
2090
2210
  const existsSync =
2091
2211
  gc.existsSync || (await import("node:fs")).existsSync;
2092
2212
  evaluation = _goalHelpers.runDeterministicCheck(cond, {
@@ -2183,6 +2303,14 @@ export async function runAgentHeadless(options = {}, deps = {}) {
2183
2303
  // "the model call failed" from "the run itself errored" (1).
2184
2304
  return { exitCode: classifyLoopError(err), result: message, isError: true };
2185
2305
  } finally {
2306
+ // Capture body-cache hits/misses caused by list_skills/run_skill during the
2307
+ // turn. `cc context --sources` reads the newest snapshot.
2308
+ persistContextSources();
2309
+ try {
2310
+ _backgroundInteraction?.close?.();
2311
+ } catch {
2312
+ // Best-effort listener cleanup; never mask the run result.
2313
+ }
2186
2314
  // Drop the signal handlers first — a normal return must not leave a
2187
2315
  // process-wide SIGINT/SIGTERM listener behind (a later Ctrl-C would wrongly
2188
2316
  // exit with 130, and repeated in-process runs would leak listeners).
@@ -2221,7 +2349,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
2221
2349
  if (settingsHooks) {
2222
2350
  try {
2223
2351
  const { runObserveHooks, dispatchAsyncHooks } =
2224
- await import("../lib/settings-hook-events.cjs");
2352
+ await import("../lib/settings-hook-events.js");
2225
2353
  const stopPayload = { reason: endReason, cwd, session_id: sessionId };
2226
2354
  runObserveHooks(settingsHooks, "Stop", stopPayload, { cwd });
2227
2355
  // Skip the async Stop dispatch/settle here if the auto-rewake re-drive