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
@@ -1,5 +1,6 @@
1
1
  const MAX_LABEL_LENGTH = 160;
2
2
  const MAX_CALL_ID_LENGTH = 128;
3
+ const MAX_OPERATION_ID_LENGTH = 160;
3
4
  const MAX_ATTRIBUTION_ID_LENGTH = 256;
4
5
  let fallbackToolSequence = 0;
5
6
  const USAGE_FIELDS = Object.freeze([
@@ -65,6 +66,21 @@ function callId(value, { required = false } = {}) {
65
66
  return value.trim();
66
67
  }
67
68
 
69
+ function operationId(value) {
70
+ if (value === undefined) return null;
71
+ if (
72
+ typeof value !== "string" ||
73
+ !value.trim() ||
74
+ value.length > MAX_OPERATION_ID_LENGTH ||
75
+ /\p{Cc}/u.test(value)
76
+ ) {
77
+ throw new TypeError(
78
+ "runtime usage boundary requires a bounded operation id",
79
+ );
80
+ }
81
+ return value.trim();
82
+ }
83
+
68
84
  function projectAttribution(value) {
69
85
  if (!value || typeof value !== "object" || Array.isArray(value)) return null;
70
86
  const projected = {};
@@ -120,12 +136,14 @@ export function projectRuntimeTokenUsage(event = {}) {
120
136
  }
121
137
  }
122
138
  const projectedCallId = callId(event.callId);
139
+ const projectedOperationId = operationId(event.operationId);
123
140
  const attribution = projectAttribution(event.attribution);
124
141
  return {
125
142
  provider: cleanLabel(event.provider),
126
143
  model: cleanLabel(event.model),
127
144
  usage,
128
145
  ...(projectedCallId ? { callId: projectedCallId } : {}),
146
+ ...(projectedOperationId ? { operationId: projectedOperationId } : {}),
129
147
  ...(event.source ? { source: source(event.source) } : {}),
130
148
  ...(attribution ? { attribution } : {}),
131
149
  };
@@ -138,11 +156,13 @@ export function projectRuntimeUsageBoundary(event = {}, outcome) {
138
156
  "runtime usage boundary outcome must be started or unknown",
139
157
  );
140
158
  }
159
+ const projectedOperationId = operationId(event.operationId);
141
160
  const projected = {
142
161
  callId: callId(event.callId, { required: true }),
143
162
  provider: cleanLabel(event.provider),
144
163
  model: cleanLabel(event.model),
145
164
  source: source(event.source),
165
+ ...(projectedOperationId ? { operationId: projectedOperationId } : {}),
146
166
  };
147
167
  const attribution = projectAttribution(event.attribution);
148
168
  if (attribution) projected.attribution = attribution;
@@ -20,6 +20,8 @@ import {
20
20
  } from "@chainlesschain/session-core";
21
21
  import { readEvents, sessionExists } from "../harness/jsonl-session-store.js";
22
22
  import { getMemoryStore } from "./session-core-singletons.js";
23
+ import { createCliCanonicalMemoryService } from "./context-memory-kernel/memory-service.js";
24
+ import { resolveCliContextMemoryCutover } from "./context-memory-kernel/authority.js";
23
25
 
24
26
  /**
25
27
  * Build an in-memory TraceStore populated with events from a JSONL session.
@@ -108,6 +110,63 @@ export async function consolidateJsonlSession(sessionId, options = {}) {
108
110
  }
109
111
 
110
112
  const trace = buildTraceStoreFromJsonl(sessionId, options.events);
113
+ const decision = resolveCliContextMemoryCutover({
114
+ env: options.env,
115
+ scopeKey: `cli:session-consolidator:${sessionId}`,
116
+ });
117
+ if (decision.canonical) {
118
+ const traceEvents = trace.query(sessionId, {
119
+ limit: Number.MAX_SAFE_INTEGER,
120
+ });
121
+ const { defaultMemoryExtractor } = await import(
122
+ "@chainlesschain/session-core"
123
+ );
124
+ const facts = defaultMemoryExtractor(traceEvents);
125
+ const scope = options.scope || "agent";
126
+ const scopeId =
127
+ scope === "global"
128
+ ? null
129
+ : options.scopeId ||
130
+ (scope === "session" ? sessionId : options.agentId || sessionId);
131
+ if (options.dryRun) {
132
+ return {
133
+ sessionId,
134
+ scope,
135
+ scopeId,
136
+ eventCount: traceEvents.length,
137
+ factCount: facts.length,
138
+ writtenCount: 0,
139
+ written: [],
140
+ facts,
141
+ dryRun: true,
142
+ };
143
+ }
144
+ const service = createCliCanonicalMemoryService({ env: options.env });
145
+ const written = [];
146
+ for (const [index, fact] of facts.entries()) {
147
+ written.push(
148
+ await service.addScoped(String(fact.content || ""), {
149
+ scope,
150
+ scopeId,
151
+ category: fact.category || "general",
152
+ tags: fact.tags || [],
153
+ score: fact.score,
154
+ source: "cli-session-consolidator",
155
+ evidenceStore: "cli-jsonl-session",
156
+ evidenceId: `${sessionId}-${index}`,
157
+ }),
158
+ );
159
+ }
160
+ return {
161
+ sessionId,
162
+ scope,
163
+ scopeId,
164
+ eventCount: traceEvents.length,
165
+ factCount: facts.length,
166
+ writtenCount: written.length,
167
+ written,
168
+ };
169
+ }
111
170
  const memoryStore = options.memoryStore || getMemoryStore();
112
171
  const consolidator = new MemoryConsolidator({
113
172
  memoryStore,
@@ -10,6 +10,10 @@
10
10
  import { join } from "node:path";
11
11
  import { promises as fsp, existsSync, mkdirSync } from "node:fs";
12
12
  import { getHomeDir } from "./paths.js";
13
+ import {
14
+ assertLegacyMutationAllowed,
15
+ resolveCliContextMemoryCutover,
16
+ } from "./context-memory-kernel/authority.js";
13
17
  import {
14
18
  ensureTrustedSessionLifecycleScope,
15
19
  resolveTrustedSessionLifecycleScope,
@@ -50,7 +54,15 @@ export function getApprovalPoliciesPath() {
50
54
  export function getMemoryStore() {
51
55
  if (_memoryStore) return _memoryStore;
52
56
  const adapter = createMemoryFileAdapter(getMemoryStorePath());
53
- _memoryStore = new MemoryStore({ adapter });
57
+ _memoryStore = new MemoryStore({
58
+ adapter,
59
+ writeGuard: () =>
60
+ assertLegacyMutationAllowed(
61
+ resolveCliContextMemoryCutover({
62
+ scopeKey: "cli:legacy-session-core-memory",
63
+ }),
64
+ ),
65
+ });
54
66
  hydrateMemoryStore(_memoryStore, adapter);
55
67
  return _memoryStore;
56
68
  }
@@ -66,12 +78,13 @@ export async function getBetaFlags() {
66
78
  export async function getApprovalGate() {
67
79
  if (_approvalGate) return _approvalGate;
68
80
  const store = createApprovalGateFileAdapter(getApprovalPoliciesPath());
69
- _approvalGate = new ApprovalGate({
81
+ const gate = new ApprovalGate({
70
82
  defaultPolicy: APPROVAL_POLICY.STRICT,
71
83
  store,
72
84
  });
73
- await _approvalGate.load();
74
- return _approvalGate;
85
+ await gate.load();
86
+ _approvalGate = gate;
87
+ return gate;
75
88
  }
76
89
 
77
90
  export function getParkedSessionsPath(options = {}) {
@@ -9,7 +9,34 @@
9
9
  * - Notification
10
10
  */
11
11
 
12
- import { HookEvents, executeHooks } from "./hook-manager.js";
12
+ import { HookEvents } from "./hook-manager.js";
13
+ import { executeHooksV2Event } from "./hooks-v2-producers.js";
14
+
15
+ async function executeCanonicalDatabaseHooks(db, event, context) {
16
+ const outcome = await executeHooksV2Event(event, context, { hookDb: db });
17
+ return (outcome.results || [])
18
+ .filter(
19
+ (entry) =>
20
+ !String(entry?.hookId || "").startsWith(
21
+ "database:adapter-read-failure:",
22
+ ),
23
+ )
24
+ .map((entry) => ({
25
+ hookId: entry.hookId,
26
+ hookName: entry.hookName || entry.hookId,
27
+ success: entry.status === "success",
28
+ result: entry.result,
29
+ stdout:
30
+ typeof entry.result === "string"
31
+ ? entry.result
32
+ : entry.result?.raw ||
33
+ (entry.result && typeof entry.result === "object"
34
+ ? JSON.stringify(entry.result)
35
+ : null),
36
+ error: entry.error || null,
37
+ executionTime: entry.durationMs || 0,
38
+ }));
39
+ }
13
40
 
14
41
  // 会话钩子白名单
15
42
  export const SESSION_HOOK_EVENTS = Object.freeze([
@@ -22,7 +49,7 @@ export const SESSION_HOOK_EVENTS = Object.freeze([
22
49
 
23
50
  // 依赖注入点(用于测试)
24
51
  export const _deps = {
25
- executeHooks,
52
+ executeHooks: executeCanonicalDatabaseHooks,
26
53
  logFailure: (_db, event, error) => {
27
54
  console.error(`[session-hooks] Failed to fire ${event}:`, error);
28
55
  },
@@ -0,0 +1,188 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import {
4
+ appendEvent,
5
+ findLatestEvent,
6
+ listSessionAuthoritySummaries,
7
+ readVerifiedMessages,
8
+ sessionHasPersistedEvidence,
9
+ startSession,
10
+ } from "../harness/jsonl-session-store.js";
11
+ import {
12
+ getSession as getDatabaseSession,
13
+ listSessions as listDatabaseSessions,
14
+ } from "./session-manager.js";
15
+ import { sanitizePersistedMessages } from "./session-message-provenance.js";
16
+
17
+ export const SESSION_STORE_MIGRATION_EVENT = "session_store_migrated";
18
+ export const SESSION_STORE_MIGRATION_SCHEMA =
19
+ "chainlesschain.session-store-migration/v1";
20
+
21
+ function migrationError(code, message, details = {}) {
22
+ const error = new Error(message);
23
+ error.name = "SessionTranscriptMigrationError";
24
+ error.code = code;
25
+ Object.assign(error, details);
26
+ return error;
27
+ }
28
+
29
+ function timestampEpoch(value) {
30
+ if (typeof value !== "string" || !value) return 0;
31
+ const normalized =
32
+ value.includes(" ") && !value.includes("T")
33
+ ? `${value.replace(" ", "T")}Z`
34
+ : value;
35
+ const parsed = Date.parse(normalized);
36
+ return Number.isFinite(parsed) ? parsed : 0;
37
+ }
38
+
39
+ function canonicalMessages(messages, { stripLeadingSystem = true } = {}) {
40
+ const sanitized = sanitizePersistedMessages(messages || [], { strict: true });
41
+ let start = 0;
42
+ // Legacy WS sessions own exactly the first system message as their host
43
+ // prompt. Later leading system messages can be recovery notices or compacted
44
+ // summaries and therefore remain logical transcript content.
45
+ if (stripLeadingSystem && sanitized[0]?.role === "system") start = 1;
46
+ return sanitized.slice(start);
47
+ }
48
+
49
+ function messagesDigest(messages) {
50
+ return `sha256:${createHash("sha256")
51
+ .update(JSON.stringify(messages))
52
+ .digest("hex")}`;
53
+ }
54
+
55
+ /**
56
+ * Import a legacy physical session snapshot into the verified canonical
57
+ * transcript. The two-event sequence is restartable: a crash after
58
+ * session_start leaves an empty verified prefix which a retry can complete.
59
+ */
60
+ export function ensureCanonicalSessionTranscript(
61
+ {
62
+ sessionId,
63
+ title = "Untitled",
64
+ provider = "",
65
+ model = "",
66
+ messages = [],
67
+ source = "legacy",
68
+ stripLeadingSystem = true,
69
+ },
70
+ dependencies = {},
71
+ ) {
72
+ const deps = {
73
+ appendEvent,
74
+ findLatestEvent,
75
+ readVerifiedMessages,
76
+ sessionHasPersistedEvidence,
77
+ startSession,
78
+ ...dependencies,
79
+ };
80
+ const id = String(sessionId || "").trim();
81
+ if (!id) {
82
+ throw migrationError(
83
+ "CC_SESSION_MIGRATION_INVALID",
84
+ "sessionId is required for transcript migration",
85
+ );
86
+ }
87
+ const importedMessages = canonicalMessages(messages, { stripLeadingSystem });
88
+ const digest = messagesDigest(importedMessages);
89
+
90
+ const existed = deps.sessionHasPersistedEvidence(id);
91
+ if (!existed) {
92
+ deps.startSession(id, { title, provider, model });
93
+ }
94
+
95
+ const completed = deps.findLatestEvent(id, SESSION_STORE_MIGRATION_EVENT);
96
+ if (completed) {
97
+ if (
98
+ completed.data?.source !== source ||
99
+ completed.data?.messagesDigest !== digest
100
+ ) {
101
+ throw migrationError(
102
+ "CC_SESSION_MIGRATION_CONFLICT",
103
+ `session ${id} was already imported from different content`,
104
+ { sessionId: id },
105
+ );
106
+ }
107
+ return Object.freeze({
108
+ sessionId: id,
109
+ migrated: false,
110
+ messages: deps.readVerifiedMessages(id),
111
+ source,
112
+ messagesDigest: digest,
113
+ });
114
+ }
115
+
116
+ const currentMessages = deps.readVerifiedMessages(id);
117
+ if (currentMessages.length > 0) {
118
+ if (messagesDigest(currentMessages) !== digest) {
119
+ throw migrationError(
120
+ "CC_SESSION_MIGRATION_CONFLICT",
121
+ `canonical transcript already contains different messages: ${id}`,
122
+ { sessionId: id },
123
+ );
124
+ }
125
+ } else if (importedMessages.length > 0) {
126
+ deps.appendEvent(id, "compact", {
127
+ messages: importedMessages,
128
+ originalMessages: importedMessages.length,
129
+ compressedMessages: importedMessages.length,
130
+ reason: "physical-store-import",
131
+ });
132
+ }
133
+
134
+ deps.appendEvent(id, SESSION_STORE_MIGRATION_EVENT, {
135
+ schema: SESSION_STORE_MIGRATION_SCHEMA,
136
+ source,
137
+ messagesDigest: digest,
138
+ messageCount: importedMessages.length,
139
+ });
140
+ return Object.freeze({
141
+ sessionId: id,
142
+ migrated: true,
143
+ messages: deps.readVerifiedMessages(id),
144
+ source,
145
+ messagesDigest: digest,
146
+ });
147
+ }
148
+
149
+ export function ensureCanonicalSessionFromDatabase(
150
+ database,
151
+ sessionId,
152
+ dependencies = {},
153
+ ) {
154
+ if (!database) return null;
155
+ const readDatabaseSession =
156
+ dependencies.getDatabaseSession || getDatabaseSession;
157
+ const session = readDatabaseSession(database, sessionId);
158
+ if (!session) return null;
159
+ return ensureCanonicalSessionTranscript(
160
+ {
161
+ sessionId: session.id,
162
+ title: session.title || "Untitled",
163
+ provider: session.provider || "",
164
+ model: session.model || "",
165
+ messages: session.messages || [],
166
+ source: "sqlite:llm_sessions",
167
+ stripLeadingSystem: true,
168
+ },
169
+ dependencies,
170
+ );
171
+ }
172
+
173
+ /** Resolve the newest readable logical session across JSONL and legacy DB. */
174
+ export function getLastLogicalSessionId(database = null, dependencies = {}) {
175
+ const listCanonical =
176
+ dependencies.listSessionAuthoritySummaries || listSessionAuthoritySummaries;
177
+ const listLegacy = dependencies.listDatabaseSessions || listDatabaseSessions;
178
+ const canonical = listCanonical({ limit: 1 }).find(
179
+ (session) => session?._blocked !== true,
180
+ );
181
+ const legacy = database ? listLegacy(database, { limit: 1 })[0] : null;
182
+ if (!canonical) return legacy?.id || null;
183
+ if (!legacy || canonical.id === legacy.id) return canonical.id;
184
+ return timestampEpoch(legacy.updated_at) >
185
+ timestampEpoch(canonical.updated_at)
186
+ ? legacy.id
187
+ : canonical.id;
188
+ }