chainlesschain 0.166.10 → 0.166.14

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 (244) hide show
  1. package/README.md +33 -0
  2. package/bin/chainlesschain.js +5 -0
  3. package/package.json +4 -2
  4. package/src/assets/web-panel/assets/{AIOps-CLYBDAGv.js → AIOps-C8SyFhOo.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Dup5gFK0.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-8FyOWA7V.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-DBzdU9dg.js} +3 -3
  8. package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-C_0Z8gNy.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-Cf2a-58m.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-M7w-2zgB.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-CCTHQXoL.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-DjXpeFwJ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-cAvchsJU.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-DvEvxlZv.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DKs6qvOn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-DlkA7b9X.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-CkfdKhyJ.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-iNXMHzj6.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-DQxPEd09.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-CSKvMCjs.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-CkWqazpD.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-k6W8IzhB.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-C8MS1OuY.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-DJuCcgiQ.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-LeThKzp3.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-BvxwgpE4.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-n3e_a1M3.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-509W6W6v.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-xgZReQm0.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-jZOhKcQx.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-Jo0ULzHv.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-BsRcyWQP.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-JlpMYTAk.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CUEz872-.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-DgrvvEDU.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-Df-KY4U3.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-kPZDTOeI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-CRRzPqNX.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-D6pNSkg9.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-g-pvtwRC.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-Bzayfrfe.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-B7S3W-XL.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-B8OMEWVb.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-CowRp7GH.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-BkQNyi4c.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-Cm7gtkKz.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-CbPTVh9m.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-Dswi26mJ.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-BkjQ9yy7.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-DmRFXP7Y.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-DQE1toAu.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-BujyoDRG.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-xSjfOaiU.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-B9ICLqVP.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-CUNwyN9E.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-SOoCricX.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-CSaFul0F.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-CueiB_oe.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-BOeXvU7y.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-CTqf_31h.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-C8ZP31E9.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-CPgn4713.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-8_e0zw0i.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-iT7lbGqw.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-B4q9SUOz.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-CA_nASyL.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cwb0E3yv.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-D9iVsOxJ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-DPLbYchG.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-DGMVL_LF.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-B_6kym0D.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-Ds6r0dXB.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-BLHAbBhb.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-CZuddd14.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-CdBq7oSl.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-DfT60Nyl.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-RLfsKy2V.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-Cw8xCNLE.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-BOUkNu4f.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CgGZWaRm.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-CpwjVyir.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DL21H-eb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-B3ffFclW.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-CkBeb5aI.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-U2iVaE3r.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-CQk2wzYd.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYIuIYzT.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-tg1c2mZQ.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-CtL61spq.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-DKpbeo8s.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-gPZsrswt.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CfHlwzVr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-MV47g_6X.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-6G0ETFTW.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BBw52sEl.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BN-wxSQ8.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-BOyGUuBE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BQp5M0s1.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BcK8o4ke.js +1 -0
  102. package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-BjlPD7GO.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-C4lF-f_z.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C6nC_DyY.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-C9RF4ieu.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-C9gtY4nG.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-CB1HnbNK.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-CRv_uMLV.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-C_B9LiKs.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Cjv0kKCU.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-CmM9jqwe.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-CmPJpLoD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-CzfxTSPW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-D1XB5-t5.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-DGtEBodr.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-DIeJmlAA.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-DMMvlLp9.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-DU4rZpiK.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D_Pl1GnW.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-Dd19vRwy.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-Ddcpj1El.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-Df9sWKpl.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-DfLyHCWi.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DnZ_zS1M.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-DsH-i_3d.js} +1 -1
  126. package/src/assets/web-panel/assets/index-DvbAjyYI.js +1 -0
  127. package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-ExAGPAnX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-Rb7CRMw9.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-Zvkt9xqi.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-bSFrAszw.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-fYcS7NS0.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-srBc9U_s.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-xUlgG0Xe.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-yxxXlqBA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-BeOZoSZ4.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-BXE8VMKx.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-I9sdvPGX.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-d25zrJd0.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-D71V_T4e.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-BNZKpIAR.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-jOcgxTTz.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-pta_O8AU.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-Dlq6om7z.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-BnkO_yRv.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-p8NfWmcG.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-KcjZZ5U7.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-gqonDMWB.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-jIIfE4go.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-Dyo7fBrM.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-6l8BMg9W.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +5 -5
  153. package/src/commands/agent.js +76 -23
  154. package/src/commands/compact.js +349 -3
  155. package/src/commands/context.js +72 -1
  156. package/src/commands/graph.js +26 -15
  157. package/src/commands/hmemory.js +21 -0
  158. package/src/commands/hook.js +256 -28
  159. package/src/commands/memory.js +209 -42
  160. package/src/commands/promcomp.js +17 -0
  161. package/src/commands/record-replay.js +772 -0
  162. package/src/commands/serve.js +94 -10
  163. package/src/commands/session.js +2 -3
  164. package/src/commands/skill.js +3 -0
  165. package/src/commands/team.js +7 -1
  166. package/src/data/changelog.json +41 -2
  167. package/src/gateways/ws/session-core-protocol.js +62 -3
  168. package/src/gateways/ws/session-protocol.js +123 -15
  169. package/src/gateways/ws/ws-agent-handler.js +157 -9
  170. package/src/gateways/ws/ws-session-gateway.js +204 -30
  171. package/src/generated/cc-agent-protocol.schema.json +2094 -4
  172. package/src/harness/prompt-compressor.js +5 -55
  173. package/src/lib/agent-sandbox.js +8 -2
  174. package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
  175. package/src/lib/agent-team/team-message-tools.js +23 -5
  176. package/src/lib/app-server/context-memory-notifications.js +54 -0
  177. package/src/lib/app-server/rollout-store-factory.js +115 -0
  178. package/src/lib/app-server/rollout-store.js +310 -23
  179. package/src/lib/app-server/server.js +184 -7
  180. package/src/lib/app-server/sqlite-rollout-store.js +59 -16
  181. package/src/lib/auto-mode-config.js +26 -0
  182. package/src/lib/causal-observability.js +13 -1
  183. package/src/lib/context-memory-kernel/authority.js +95 -0
  184. package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
  185. package/src/lib/context-memory-kernel/index.js +8 -0
  186. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
  187. package/src/lib/context-memory-kernel/live-compaction.js +375 -0
  188. package/src/lib/context-memory-kernel/memory-service.js +667 -0
  189. package/src/lib/context-memory-kernel/message-adapter.js +451 -0
  190. package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
  191. package/src/lib/context-memory-kernel/provider-context.js +192 -0
  192. package/src/lib/context-memory-kernel/runtime.js +61 -0
  193. package/src/lib/direct-model-usage.js +22 -18
  194. package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
  195. package/src/lib/graph-kernel/cutover-ledger.js +2 -2
  196. package/src/lib/graph-kernel/event-store.js +3 -5
  197. package/src/lib/graph-kernel/migration-saga.js +2 -2
  198. package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
  199. package/src/lib/hierarchical-memory.js +22 -0
  200. package/src/lib/hook-audit-store.js +170 -0
  201. package/src/lib/hook-event-bus.cjs +0 -0
  202. package/src/lib/hook-manager.js +25 -83
  203. package/src/lib/hook-runtime-adapters.js +233 -0
  204. package/src/lib/hook-runtime-contract.cjs +291 -0
  205. package/src/lib/hook-runtime-contract.js +21 -0
  206. package/src/lib/hook-trust.js +210 -0
  207. package/src/lib/hooks-v2-producers.js +52 -6
  208. package/src/lib/hooks-v2-runtime.js +443 -178
  209. package/src/lib/llm-pricing.js +10 -0
  210. package/src/lib/memory-manager.js +29 -4
  211. package/src/lib/model-context-window.js +52 -0
  212. package/src/lib/permanent-memory.js +17 -0
  213. package/src/lib/plan-mode.js +8 -4
  214. package/src/lib/process-execution-broker/credential-transport.js +31 -0
  215. package/src/lib/process-execution-broker/index.js +282 -16
  216. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  217. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  218. package/src/lib/process-execution-broker/windows-sandbox.cs +7 -3
  219. package/src/lib/record-replay/browser-target-policy.js +406 -0
  220. package/src/lib/record-replay/index.js +4 -0
  221. package/src/lib/record-replay/playwright-ui-driver.js +83 -20
  222. package/src/lib/record-replay/playwright-ui-recorder.js +611 -0
  223. package/src/lib/record-replay/recorded-skill-package.js +486 -0
  224. package/src/lib/record-replay/recorded-skill-store.js +1166 -0
  225. package/src/lib/record-replay/skill-recorder.js +634 -64
  226. package/src/lib/runtime-usage-ledger.js +20 -0
  227. package/src/lib/session-consolidator.js +59 -0
  228. package/src/lib/session-core-singletons.js +17 -4
  229. package/src/lib/session-hooks.js +29 -2
  230. package/src/lib/session-transcript-migration.js +188 -0
  231. package/src/lib/settings-hook-events.cjs +37 -401
  232. package/src/lib/settings-hook-events.js +210 -8
  233. package/src/lib/settings-hooks.cjs +42 -83
  234. package/src/lib/ws-session-manager.js +4 -1
  235. package/src/repl/agent-repl.js +186 -53
  236. package/src/runtime/agent-core.js +376 -350
  237. package/src/runtime/headless-runner.js +112 -84
  238. package/src/runtime/headless-stream.js +131 -30
  239. package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
  240. package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
  241. package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
  242. package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
  243. package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
  244. package/src/assets/web-panel/assets/index-DL2EFx7m.js +0 -1
@@ -464,65 +464,86 @@ async function withHeadlessSessionHostLease(options, deps, task) {
464
464
  `Invalid --output-format "${outputFormat}". Expected one of: ${VALID_OUTPUT_FORMATS.join(", ")}`,
465
465
  );
466
466
  }
467
- const hasInjectedSessionStore =
468
- typeof deps.sessionHasPersistedEvidence === "function" ||
469
- typeof deps.sessionExists === "function" ||
470
- typeof deps.rebuildMessages === "function" ||
471
- typeof deps.appendEvent === "function" ||
472
- typeof deps.appendAuthorityEvent === "function" ||
473
- typeof deps.readVerifiedEvents === "function";
474
- const resolution = resolveHeadlessSession(
475
- options,
476
- {
477
- getLastSessionId: deps.getLastSessionId || jsonlGetLastSessionId,
478
- resolveSessionAuthority:
479
- deps.resolveSessionAuthority ||
480
- (!hasInjectedSessionStore ? jsonlResolveSessionAuthority : undefined),
481
- },
482
- `headless-${Date.now()}-${process.pid}`,
483
- );
484
- const authoritySessionId =
485
- resolution.resumeId || (resolution.persist ? resolution.sessionId : null);
486
- const acquireHostLease =
487
- deps.acquireSessionHostLease ||
488
- (!hasInjectedSessionStore ? acquireSessionHostLease : null);
467
+ let resolution = null;
489
468
  let lease = null;
490
469
  let budgetRoot = null;
470
+ let scopedOptions = options;
491
471
  try {
492
- if (authoritySessionId && typeof acquireHostLease === "function") {
493
- lease = acquireHostLease(authoritySessionId, { hostKind: "headless" });
494
- }
495
- let scopedOptions = lease?.signal
496
- ? {
497
- ...options,
498
- signal: options.signal
499
- ? AbortSignal.any([options.signal, lease.signal])
500
- : lease.signal,
501
- }
502
- : options;
503
- budgetRoot = openProductionSessionBudgetRoot(
504
- authoritySessionId,
505
- options.sessionBudgetRoot,
506
- {
507
- persist: resolution.persist,
508
- signal: scopedOptions.signal || null,
509
- table: options.sessionBudgetRoot?.table,
510
- open: deps.openSessionBudget,
511
- store: deps.sessionBudgetStore,
512
- registry: deps.sessionBudgetRegistry,
513
- },
514
- );
515
- if (budgetRoot.enabled) {
516
- scopedOptions = { ...scopedOptions, ...budgetRoot.options };
517
- }
472
+ // Session authority/lease/budget setup can lazily initialize AppConfig and
473
+ // DatabaseManager. Those legacy diagnostics use console.info (stdout), and
474
+ // therefore used to precede the first NDJSON event for a persisted
475
+ // `--output-format stream-json` run. Keep the task itself outside this
476
+ // scope so only bootstrap chatter is redirected, never protocol payloads.
477
+ await withQuietStdout(() => {
478
+ const hasInjectedSessionStore =
479
+ typeof deps.sessionHasPersistedEvidence === "function" ||
480
+ typeof deps.sessionExists === "function" ||
481
+ typeof deps.rebuildMessages === "function" ||
482
+ typeof deps.appendEvent === "function" ||
483
+ typeof deps.appendAuthorityEvent === "function" ||
484
+ typeof deps.readVerifiedEvents === "function";
485
+ resolution = resolveHeadlessSession(
486
+ options,
487
+ {
488
+ getLastSessionId: deps.getLastSessionId || jsonlGetLastSessionId,
489
+ resolveSessionAuthority:
490
+ deps.resolveSessionAuthority ||
491
+ (!hasInjectedSessionStore
492
+ ? jsonlResolveSessionAuthority
493
+ : undefined),
494
+ },
495
+ `headless-${Date.now()}-${process.pid}`,
496
+ );
497
+ const authoritySessionId =
498
+ resolution.resumeId ||
499
+ (resolution.persist ? resolution.sessionId : null);
500
+ const acquireHostLease =
501
+ deps.acquireSessionHostLease ||
502
+ (!hasInjectedSessionStore ? acquireSessionHostLease : null);
503
+ if (authoritySessionId && typeof acquireHostLease === "function") {
504
+ lease = acquireHostLease(authoritySessionId, {
505
+ hostKind: "headless",
506
+ });
507
+ }
508
+ scopedOptions = lease?.signal
509
+ ? {
510
+ ...options,
511
+ signal: options.signal
512
+ ? AbortSignal.any([options.signal, lease.signal])
513
+ : lease.signal,
514
+ }
515
+ : options;
516
+ budgetRoot = openProductionSessionBudgetRoot(
517
+ authoritySessionId,
518
+ options.sessionBudgetRoot,
519
+ {
520
+ persist: resolution.persist,
521
+ signal: scopedOptions.signal || null,
522
+ table: options.sessionBudgetRoot?.table,
523
+ open: deps.openSessionBudget,
524
+ store: deps.sessionBudgetStore,
525
+ registry: deps.sessionBudgetRegistry,
526
+ },
527
+ );
528
+ if (budgetRoot.enabled) {
529
+ scopedOptions = { ...scopedOptions, ...budgetRoot.options };
530
+ }
531
+ });
518
532
  return await task(scopedOptions, {
519
533
  ...deps,
520
534
  [HEADLESS_SESSION_RESOLUTION]: resolution,
521
535
  [HEADLESS_SESSION_HOST_LEASE]: lease,
522
536
  });
523
537
  } finally {
524
- budgetRoot?.close?.();
525
- lease?.release?.();
538
+ // Cleanup can touch the same lazy stores. Keep late diagnostics out of a
539
+ // completed JSON/NDJSON payload while preserving release-on-close failure.
540
+ await withQuietStdout(() => {
541
+ try {
542
+ budgetRoot?.close?.();
543
+ } finally {
544
+ lease?.release?.();
545
+ }
546
+ });
526
547
  }
527
548
  }
528
549
 
@@ -901,8 +922,8 @@ async function runAgentHeadlessInWorkspace(
901
922
  effectiveHooks._authorityErrors.length > 0
902
923
  ? effectiveHooks
903
924
  : null;
904
- // First-run trust notice for an untrusted/cloned repo's shell-running
905
- // hooks (Claude-Code 2.1.195 parity). Best-effort, stderr-only.
925
+ // Explain the explicit content-bound trust gate. Displaying this notice
926
+ // never authorizes execution.
906
927
  try {
907
928
  const notice = projectHookTrustNotice({
908
929
  cwd,
@@ -910,7 +931,7 @@ async function runAgentHeadlessInWorkspace(
910
931
  });
911
932
  if (notice) writeErr(notice + "\n");
912
933
  } catch {
913
- /* trust notice is best-effort */
934
+ /* notice output is best-effort; the runtime gate is fail-closed */
914
935
  }
915
936
  } catch (error) {
916
937
  settingsHooks = {};
@@ -1605,7 +1626,8 @@ async function runAgentHeadlessInWorkspace(
1605
1626
  if (approvalGate) {
1606
1627
  approvalGate.setAuthorizationConsumer?.(null);
1607
1628
  if (typeof approvalGate.setSessionPolicy === "function") {
1608
- approvalGate.setSessionPolicy(sessionId, perm.sessionPolicy);
1629
+ await approvalGate.setSessionPolicy(sessionId, perm.sessionPolicy);
1630
+ await approvalGate.awaitPersistence?.();
1609
1631
  }
1610
1632
  if (typeof approvalGate.setConfirmer === "function") {
1611
1633
  approvalGate.setConfirmer(perm.confirmer);
@@ -1708,7 +1730,7 @@ async function runAgentHeadlessInWorkspace(
1708
1730
  try {
1709
1731
  const { runUserPromptSubmitHooks } =
1710
1732
  await import("../lib/settings-hook-events.js");
1711
- const ups = runUserPromptSubmitHooks(settingsHooks, {
1733
+ const ups = await runUserPromptSubmitHooks(settingsHooks, {
1712
1734
  prompt: userContent,
1713
1735
  cwd,
1714
1736
  sessionId,
@@ -1739,11 +1761,13 @@ async function runAgentHeadlessInWorkspace(
1739
1761
  try {
1740
1762
  const { runInstructionsLoadedHooks } =
1741
1763
  await import("../lib/settings-hook-events.js");
1742
- instructionsLoadedContext = runInstructionsLoadedHooks(settingsHooks, {
1743
- files: _loadedInstructions.files,
1744
- cwd,
1745
- sessionId,
1746
- }).additionalContext;
1764
+ instructionsLoadedContext = (
1765
+ await runInstructionsLoadedHooks(settingsHooks, {
1766
+ files: _loadedInstructions.files,
1767
+ cwd,
1768
+ sessionId,
1769
+ })
1770
+ ).additionalContext;
1747
1771
  } catch (_err) {
1748
1772
  instructionsLoadedContext = null;
1749
1773
  }
@@ -1755,11 +1779,13 @@ async function runAgentHeadlessInWorkspace(
1755
1779
  try {
1756
1780
  const { runSessionStartHooks } =
1757
1781
  await import("../lib/settings-hook-events.js");
1758
- sessionStartContext = runSessionStartHooks(settingsHooks, {
1759
- source: resumeId ? "resume" : "startup",
1760
- cwd,
1761
- sessionId,
1762
- }).additionalContext;
1782
+ sessionStartContext = (
1783
+ await runSessionStartHooks(settingsHooks, {
1784
+ source: resumeId ? "resume" : "startup",
1785
+ cwd,
1786
+ sessionId,
1787
+ })
1788
+ ).additionalContext;
1763
1789
  } catch (_err) {
1764
1790
  sessionStartContext = null;
1765
1791
  }
@@ -1774,7 +1800,7 @@ async function runAgentHeadlessInWorkspace(
1774
1800
  try {
1775
1801
  const { runObserveHooks } =
1776
1802
  await import("../lib/settings-hook-events.js");
1777
- runObserveHooks(
1803
+ await runObserveHooks(
1778
1804
  settingsHooks,
1779
1805
  "SessionResume",
1780
1806
  {
@@ -2001,7 +2027,7 @@ async function runAgentHeadlessInWorkspace(
2001
2027
  : null;
2002
2028
  let teamMessageTools = null;
2003
2029
  try {
2004
- teamMessageTools = (
2030
+ teamMessageTools = await (
2005
2031
  deps.resolveTeamMessageToolBundle || resolveTeamMessageToolBundle
2006
2032
  )({ env: options.teamMessageEnv || process.env });
2007
2033
  } catch (error) {
@@ -2631,12 +2657,14 @@ async function runAgentHeadlessInWorkspace(
2631
2657
  // --max-budget-usd: a hard USD spend cap (Claude-Code parity). Accumulates
2632
2658
  // per-call cost from token-usage events and stops the loop before the next
2633
2659
  // paid call once the cap is reached. null → no cap (unchanged behavior).
2634
- const costBudget = options.maxCostUsd
2635
- ? new CostBudget({
2636
- limitUsd: options.maxCostUsd,
2637
- table: options.priceTable,
2638
- })
2639
- : null;
2660
+ // Track priced usage even when no hard cap is configured so every machine
2661
+ // readable terminal result can carry authoritative cost evidence. A null
2662
+ // limit never warns or stops the run; it only accumulates the same estimates
2663
+ // that an enabled --max-budget-usd guard would use.
2664
+ const costBudget = new CostBudget({
2665
+ limitUsd: options.maxCostUsd,
2666
+ table: options.priceTable,
2667
+ });
2640
2668
 
2641
2669
  const startedAt = deps.now ? deps.now() : Date.now();
2642
2670
  const toolCalls = [];
@@ -2770,9 +2798,8 @@ async function runAgentHeadlessInWorkspace(
2770
2798
  let _asyncStopHandled = false;
2771
2799
  const _settleAsyncStop = async () => {
2772
2800
  if (!settingsHooks || !_hookSupervisor) return { rewakes: [], results: [] };
2773
- const { dispatchAsyncHooks } =
2774
- await import("../lib/settings-hook-events.js");
2775
- dispatchAsyncHooks(
2801
+ const { runObserveHooks } = await import("../lib/settings-hook-events.js");
2802
+ await runObserveHooks(
2776
2803
  settingsHooks,
2777
2804
  "Stop",
2778
2805
  { reason: endReason, cwd, session_id: sessionId },
@@ -3613,21 +3640,22 @@ async function runAgentHeadlessInWorkspace(
3613
3640
  await cleanupDeadline.run("settings-hooks", async () => {
3614
3641
  if (settingsHooks) {
3615
3642
  try {
3616
- const { runObserveHooks, dispatchAsyncHooks } =
3643
+ const { runObserveHooks } =
3617
3644
  await import("../lib/settings-hook-events.js");
3618
3645
  const stopPayload = {
3619
3646
  reason: pipeState.closed ? "pipe_closed" : endReason,
3620
3647
  cwd,
3621
3648
  session_id: sessionId,
3622
3649
  };
3623
- const stopOutcome = runObserveHooks(
3650
+ const stopOutcome = await runObserveHooks(
3624
3651
  settingsHooks,
3625
3652
  "Stop",
3626
3653
  stopPayload,
3627
- { cwd },
3654
+ { cwd, supervisor: _hookSupervisor },
3628
3655
  );
3629
3656
  const stopFailures = (stopOutcome?.results || []).filter(
3630
3657
  (result) =>
3658
+ result?.status === "error" ||
3631
3659
  result?.nonBlockingError === true ||
3632
3660
  result?.malformedDecision === true ||
3633
3661
  result?.breakerOpen === true,
@@ -3647,10 +3675,6 @@ async function runAgentHeadlessInWorkspace(
3647
3675
  // Skip the async Stop dispatch/settle here if the auto-rewake re-drive
3648
3676
  // loop already fired + drained it this run (avoids double-execution).
3649
3677
  if (_hookSupervisor && !_asyncStopHandled) {
3650
- dispatchAsyncHooks(settingsHooks, "Stop", stopPayload, {
3651
- cwd,
3652
- supervisor: _hookSupervisor,
3653
- });
3654
3678
  // Bounded settle: wait for in-flight async hooks (Stop + any
3655
3679
  // PostToolUse dispatched during the loop) to finish, capped so a
3656
3680
  // slow/hung check can never stall the run. Default 5s; tunable.
@@ -3694,7 +3718,7 @@ async function runAgentHeadlessInWorkspace(
3694
3718
  // Always reap the supervisor (kills any straggler child + detaches the
3695
3719
  // exit reaper), whether the async Stop was handled here or in re-drive.
3696
3720
  if (_hookSupervisor) _hookSupervisor.stopAll();
3697
- runObserveHooks(
3721
+ await runObserveHooks(
3698
3722
  settingsHooks,
3699
3723
  "SessionEnd",
3700
3724
  {
@@ -3901,6 +3925,7 @@ async function runAgentHeadlessInWorkspace(
3901
3925
  num_turns: budget.consumed,
3902
3926
  duration_ms: durationMs,
3903
3927
  usage,
3928
+ total_cost_usd: costBudget.spentUsd,
3904
3929
  ...(compactionDegradations.length
3905
3930
  ? { compaction_degradations: compactionDegradations }
3906
3931
  : {}),
@@ -3916,6 +3941,7 @@ async function runAgentHeadlessInWorkspace(
3916
3941
  sessionId,
3917
3942
  toolCalls,
3918
3943
  usage,
3944
+ totalCostUsd: costBudget.spentUsd,
3919
3945
  numTurns: budget.consumed,
3920
3946
  durationMs,
3921
3947
  denials,
@@ -3976,6 +4002,7 @@ function buildResultEnvelope({
3976
4002
  sessionId,
3977
4003
  toolCalls,
3978
4004
  usage,
4005
+ totalCostUsd,
3979
4006
  numTurns,
3980
4007
  durationMs,
3981
4008
  denials,
@@ -3992,6 +4019,7 @@ function buildResultEnvelope({
3992
4019
  duration_ms: durationMs,
3993
4020
  tool_calls: toolCalls,
3994
4021
  usage,
4022
+ total_cost_usd: totalCostUsd,
3995
4023
  };
3996
4024
  // Only present when something was blocked — keeps the no-denial envelope
3997
4025
  // byte-identical to before (Claude-Code 2.1.193 denial reasons, json mode).
@@ -51,7 +51,10 @@ import {
51
51
  } from "./agent-core.js";
52
52
  import { composeSystemPrompt } from "./system-prompt.js";
53
53
  import { collapseConsecutiveMessagesInPlace } from "./message-roles.js";
54
- import { sanitizeToolPairs } from "../harness/prompt-compressor.js";
54
+ import {
55
+ estimateMessagesTokens,
56
+ sanitizeToolPairs,
57
+ } from "../harness/prompt-compressor.js";
55
58
  import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
56
59
  import { HostResourceBudget } from "../lib/host-resource-budget.js";
57
60
  import { projectCanonicalResumeMessages } from "../lib/session-message-provenance.js";
@@ -1549,7 +1552,10 @@ async function runAgentHeadlessStreamInWorkspace(
1549
1552
  seq: true,
1550
1553
  trace_id: true,
1551
1554
  tool_use_id: true,
1552
- permission_decision: true,
1555
+ // Hook lifecycle events can occur before the optional first-line hello.
1556
+ // Buffer their additive policy projection until negotiation either accepts
1557
+ // or disables this feature.
1558
+ permission_decision: null,
1553
1559
  };
1554
1560
  const streamCoalescer =
1555
1561
  deps.streamCoalescer ||
@@ -1560,13 +1566,24 @@ async function runAgentHeadlessStreamInWorkspace(
1560
1566
  fieldGate,
1561
1567
  });
1562
1568
  const emit = streamCoalescer.emit;
1569
+ const pendingHookPolicyEvents = [];
1570
+ const settlePermissionDecisionGate = (enabled) => {
1571
+ fieldGate.permission_decision = enabled === true;
1572
+ if (fieldGate.permission_decision) {
1573
+ for (const event of pendingHookPolicyEvents.splice(0)) emit(event);
1574
+ } else {
1575
+ pendingHookPolicyEvents.length = 0;
1576
+ }
1577
+ };
1563
1578
  const removeHookObserver =
1564
1579
  options.includeHookEvents === true
1565
1580
  ? addHooksV2EventObserver(sessionId, (event) => {
1566
1581
  emit(event);
1567
- if (fieldGate.permission_decision !== false) {
1568
- const policyEvent = projectHookPolicyDecision(event);
1569
- if (policyEvent) emit(policyEvent);
1582
+ const policyEvent = projectHookPolicyDecision(event);
1583
+ if (!policyEvent) return;
1584
+ if (fieldGate.permission_decision === true) emit(policyEvent);
1585
+ else if (fieldGate.permission_decision == null) {
1586
+ pendingHookPolicyEvents.push(policyEvent);
1570
1587
  }
1571
1588
  })
1572
1589
  : null;
@@ -1792,8 +1809,8 @@ async function runAgentHeadlessStreamInWorkspace(
1792
1809
  effectiveHooks._authorityErrors.length > 0
1793
1810
  ? effectiveHooks
1794
1811
  : null;
1795
- // First-run trust notice for an untrusted/cloned repo's shell-running
1796
- // hooks (Claude-Code 2.1.195 parity). stderr keeps the NDJSON stdout clean.
1812
+ // Explain the explicit content-bound trust gate. stderr keeps NDJSON
1813
+ // stdout clean; the notice itself never grants Hook authority.
1797
1814
  try {
1798
1815
  const notice = projectHookTrustNotice({
1799
1816
  cwd,
@@ -1801,7 +1818,7 @@ async function runAgentHeadlessStreamInWorkspace(
1801
1818
  });
1802
1819
  if (notice) writeErr(notice + "\n");
1803
1820
  } catch {
1804
- /* trust notice is best-effort */
1821
+ /* notice output is best-effort; the runtime gate is fail-closed */
1805
1822
  }
1806
1823
  } catch (error) {
1807
1824
  settingsHooks = {};
@@ -1847,7 +1864,7 @@ async function runAgentHeadlessStreamInWorkspace(
1847
1864
  const runObserveHooks =
1848
1865
  deps.runObserveHooks ||
1849
1866
  (await import("../lib/settings-hook-events.js")).runObserveHooks;
1850
- runObserveHooks(
1867
+ await runObserveHooks(
1851
1868
  settingsHooks,
1852
1869
  "SessionEnd",
1853
1870
  { reason, cwd, session_id: sessionId },
@@ -2358,7 +2375,8 @@ async function runAgentHeadlessStreamInWorkspace(
2358
2375
  }
2359
2376
  if (approvalGate) {
2360
2377
  approvalGate.setAuthorizationConsumer?.(null);
2361
- approvalGate.setSessionPolicy?.(sessionId, perm.sessionPolicy);
2378
+ await approvalGate.setSessionPolicy?.(sessionId, perm.sessionPolicy);
2379
+ await approvalGate.awaitPersistence?.();
2362
2380
  approvalGate.setConfirmer?.(
2363
2381
  interactive && perm.allowInteractiveApprovals
2364
2382
  ? interactiveConfirm
@@ -2562,11 +2580,13 @@ async function runAgentHeadlessStreamInWorkspace(
2562
2580
  try {
2563
2581
  const { runInstructionsLoadedHooks } =
2564
2582
  await import("../lib/settings-hook-events.js");
2565
- const ctx = runInstructionsLoadedHooks(settingsHooks, {
2566
- files: _loadedInstructions.files,
2567
- cwd,
2568
- sessionId,
2569
- }).additionalContext;
2583
+ const ctx = (
2584
+ await runInstructionsLoadedHooks(settingsHooks, {
2585
+ files: _loadedInstructions.files,
2586
+ cwd,
2587
+ sessionId,
2588
+ })
2589
+ ).additionalContext;
2570
2590
  if (ctx) messages.push({ role: "system", content: ctx });
2571
2591
  } catch (_err) {
2572
2592
  // best-effort
@@ -2603,11 +2623,13 @@ async function runAgentHeadlessStreamInWorkspace(
2603
2623
  try {
2604
2624
  const { runSessionStartHooks } =
2605
2625
  await import("../lib/settings-hook-events.js");
2606
- const ctx = runSessionStartHooks(settingsHooks, {
2607
- source: "startup",
2608
- cwd,
2609
- sessionId,
2610
- }).additionalContext;
2626
+ const ctx = (
2627
+ await runSessionStartHooks(settingsHooks, {
2628
+ source: "startup",
2629
+ cwd,
2630
+ sessionId,
2631
+ })
2632
+ ).additionalContext;
2611
2633
  if (ctx) messages.push({ role: "system", content: ctx });
2612
2634
  } catch (_err) {
2613
2635
  // best-effort
@@ -3453,6 +3475,7 @@ async function runAgentHeadlessStreamInWorkspace(
3453
3475
  parsed.hello,
3454
3476
  );
3455
3477
  applyNegotiationToGate(negotiated, fieldGate);
3478
+ settlePermissionDecisionGate(fieldGate.permission_decision !== false);
3456
3479
  emit({
3457
3480
  type: "system",
3458
3481
  subtype: "negotiated",
@@ -3466,6 +3489,9 @@ async function runAgentHeadlessStreamInWorkspace(
3466
3489
  });
3467
3490
  continue;
3468
3491
  }
3492
+ if (fieldGate.permission_decision == null) {
3493
+ settlePermissionDecisionGate(true);
3494
+ }
3469
3495
  if (parsed.interrupt) {
3470
3496
  currentAbort?.abort();
3471
3497
  continue;
@@ -3706,13 +3732,7 @@ async function runAgentHeadlessStreamInWorkspace(
3706
3732
  const compactionCallId = `compact-${++slashRequestSeq}`;
3707
3733
  let compactionProviderStarted = false;
3708
3734
  try {
3709
- ({
3710
- messages: compacted,
3711
- stats,
3712
- degradedEvent,
3713
- usageEvent,
3714
- usageUnknownEvent,
3715
- } = await compactConversationWithProvider(messages, {
3735
+ const providerCompactionOptions = {
3716
3736
  provider,
3717
3737
  model,
3718
3738
  baseUrl,
@@ -3746,7 +3766,84 @@ async function runAgentHeadlessStreamInWorkspace(
3746
3766
  compactionProviderStarted = true;
3747
3767
  return compactionCallId;
3748
3768
  },
3749
- }));
3769
+ };
3770
+ const { resolveCliContextMemoryCutover } =
3771
+ await import("../lib/context-memory-kernel/authority.js");
3772
+ const cutover = resolveCliContextMemoryCutover({
3773
+ env: options.contextMemoryEnv || process.env,
3774
+ scopeKey: `cli:session:${sessionId}`,
3775
+ });
3776
+ if (cutover.canonical) {
3777
+ const { compactLiveMessagesCanonical } =
3778
+ await import("../lib/context-memory-kernel/live-compaction.js");
3779
+ let compatibilityResult = null;
3780
+ const canonical = await compactLiveMessagesCanonical(messages, {
3781
+ compressor: {
3782
+ maxTokens: Math.max(
3783
+ 256,
3784
+ Math.floor(estimateMessagesTokens(messages) * 0.6),
3785
+ ),
3786
+ compress: async (dropped) => {
3787
+ compatibilityResult = await compactConversationWithProvider(
3788
+ dropped,
3789
+ providerCompactionOptions,
3790
+ );
3791
+ return compatibilityResult;
3792
+ },
3793
+ },
3794
+ sessionId,
3795
+ operationId: `manual-${randomUUID()}`,
3796
+ provider,
3797
+ model,
3798
+ env: options.contextMemoryEnv || process.env,
3799
+ persist,
3800
+ trigger: "manual",
3801
+ ...(persist
3802
+ ? {
3803
+ commit: (canonicalStats, output, settlement = {}) => {
3804
+ sessionHostLease?.assert?.();
3805
+ return requireSynchronousRecoveryResult(
3806
+ store.appendCompactEventIfMessagesMatch(
3807
+ sessionId,
3808
+ {
3809
+ ...canonicalStats,
3810
+ trigger: "manual",
3811
+ messages: projectCanonicalResumeMessages(output, {
3812
+ strict: true,
3813
+ }),
3814
+ },
3815
+ settlement.expectedMessages,
3816
+ ),
3817
+ "appendCompactEventIfMessagesMatch",
3818
+ );
3819
+ },
3820
+ }
3821
+ : {}),
3822
+ });
3823
+ compacted = canonical.messages;
3824
+ stats = canonical.stats;
3825
+ degradedEvent = compatibilityResult?.degradedEvent || null;
3826
+ usageEvent = compatibilityResult?.usageEvent || null;
3827
+ usageUnknownEvent = compatibilityResult?.usageUnknownEvent || null;
3828
+ if (canonical.receipt.status === "stale") {
3829
+ const error = new Error(
3830
+ "session messages changed during canonical compaction",
3831
+ );
3832
+ error.code = "SESSION_REVISION_STALE";
3833
+ throw error;
3834
+ }
3835
+ } else {
3836
+ ({
3837
+ messages: compacted,
3838
+ stats,
3839
+ degradedEvent,
3840
+ usageEvent,
3841
+ usageUnknownEvent,
3842
+ } = await compactConversationWithProvider(
3843
+ messages,
3844
+ providerCompactionOptions,
3845
+ ));
3846
+ }
3750
3847
  } catch (error) {
3751
3848
  if (isAbortError(error) || options.signal?.aborted) throw error;
3752
3849
  if (error?.runtimeLedgerPersistence === true) throw error;
@@ -3840,7 +3937,11 @@ async function runAgentHeadlessStreamInWorkspace(
3840
3937
  const shouldPersistCompact = stats?.strategy !== "none";
3841
3938
  let settlementError = null;
3842
3939
  let persistenceFailure = null;
3843
- if (persist && shouldPersistCompact) {
3940
+ if (
3941
+ persist &&
3942
+ shouldPersistCompact &&
3943
+ stats?.canonicalAlreadySettled !== true
3944
+ ) {
3844
3945
  try {
3845
3946
  sessionHostLease?.assert?.();
3846
3947
  requireSynchronousRecoveryResult(
@@ -4218,7 +4319,7 @@ async function runAgentHeadlessStreamInWorkspace(
4218
4319
  try {
4219
4320
  const { runUserPromptSubmitHooks } =
4220
4321
  await import("../lib/settings-hook-events.js");
4221
- const ups = runUserPromptSubmitHooks(settingsHooks, {
4322
+ const ups = await runUserPromptSubmitHooks(settingsHooks, {
4222
4323
  prompt: userContent,
4223
4324
  cwd,
4224
4325
  sessionId,
@@ -1 +0,0 @@
1
- import{P as a,J as p,b as c}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-3_CEBEEf.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=c(()=>s(e.content||"")),n={props:e,rendered:r,computed:c,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return a(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-Ix5cmp/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as c,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as m}from"./vendor-Bn1JzzAn.js";import{_ as v,b}from"./index-3_CEBEEf.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const x={__name:"MobileProjects",setup(p,{expose:i}){i();const n=u(),{t:e}=b();function a(){n.push("/projects")}function _(){n.push("/mobile-bridge")}const s={router:n,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return b},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},B={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,n,e,a,_){const s=c("a-alert"),d=c("a-button"),f=c("a-space"),P=c("a-empty"),j=c("a-card");return h(),g("div",B,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),m(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),m(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(x,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-Ix5cmp/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};