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
@@ -29,6 +29,7 @@ import path from "node:path";
29
29
  import * as fs from "node:fs";
30
30
  import * as tty from "node:tty";
31
31
  import { createRequire } from "node:module";
32
+ import { AsyncLocalStorage } from "node:async_hooks";
32
33
 
33
34
  const require = createRequire(import.meta.url);
34
35
 
@@ -964,12 +965,19 @@ class ProcessExecutionBroker extends EventEmitter {
964
965
  sandboxed: 0,
965
966
  credFiltered: 0,
966
967
  };
967
- this._logPath = path.join(
968
- os.homedir(),
969
- ".chainlesschain",
970
- "logs",
971
- "process-audit.log",
972
- );
968
+ this._logPath =
969
+ process.env.NODE_ENV === "test"
970
+ ? path.join(
971
+ os.tmpdir(),
972
+ "chainlesschain-process-audit-tests",
973
+ `${process.pid}.log`,
974
+ )
975
+ : path.join(
976
+ os.homedir(),
977
+ ".chainlesschain",
978
+ "logs",
979
+ "process-audit.log",
980
+ );
973
981
 
974
982
  // P0-1: Platform sandbox functions (applySandbox/postSpawnSandbox imported above)
975
983
  // No instance needed — stateless functional API per platform
@@ -989,6 +997,7 @@ class ProcessExecutionBroker extends EventEmitter {
989
997
  this._ptyAdapter = createNativePtyAdapter();
990
998
  this._hooksEventSink = null;
991
999
  this._workspaceTransactionManagers = new Map();
1000
+ this._ambientProcessContext = new AsyncLocalStorage();
992
1001
 
993
1002
  this._ensureLogDir();
994
1003
  this._loadPermissions();
@@ -998,7 +1007,8 @@ class ProcessExecutionBroker extends EventEmitter {
998
1007
  try {
999
1008
  fs.mkdirSync(path.dirname(this._logPath), { recursive: true });
1000
1009
  } catch {
1001
- // Audit persistence is best-effort; in-memory audit remains available.
1010
+ // Legacy callers may retain in-memory audit. Required-audit executions
1011
+ // independently prove appendability before native spawn and fail closed.
1002
1012
  }
1003
1013
  }
1004
1014
 
@@ -1021,6 +1031,76 @@ class ProcessExecutionBroker extends EventEmitter {
1021
1031
  return "prompt";
1022
1032
  }
1023
1033
 
1034
+ _withAmbientProcessContext(command, options = {}) {
1035
+ const context = this._ambientProcessContext.getStore();
1036
+ if (!context) return options;
1037
+ const commandIdentity = (() => {
1038
+ if (typeof command !== "string" || !command) return "";
1039
+ const normalized = path.isAbsolute(command)
1040
+ ? path.resolve(command)
1041
+ : command;
1042
+ return process.platform === "win32"
1043
+ ? normalized.toLowerCase()
1044
+ : normalized;
1045
+ })();
1046
+ const allowed = context.allowedCommands.includes(commandIdentity);
1047
+ return {
1048
+ ...options,
1049
+ origin: context.origin,
1050
+ scope: context.scope,
1051
+ policy: allowed ? context.policy : "deny",
1052
+ auditContext: context.auditContext,
1053
+ };
1054
+ }
1055
+
1056
+ runWithProcessContext(
1057
+ {
1058
+ origin,
1059
+ policy = "allow",
1060
+ scope = "default",
1061
+ allowedCommands = [],
1062
+ auditContext,
1063
+ } = {},
1064
+ operation,
1065
+ ) {
1066
+ const safeOrigin = String(origin || "");
1067
+ if (
1068
+ !/^[A-Za-z][A-Za-z0-9:._-]{0,127}$/u.test(safeOrigin) ||
1069
+ !["allow", "deny", "prompt"].includes(policy) ||
1070
+ typeof operation !== "function" ||
1071
+ !Array.isArray(allowedCommands) ||
1072
+ allowedCommands.length < 1 ||
1073
+ allowedCommands.length > 16
1074
+ ) {
1075
+ const error = new Error("Process execution context is invalid");
1076
+ error.code = "PROCESS_CONTEXT_INVALID";
1077
+ throw error;
1078
+ }
1079
+ const normalizedCommands = allowedCommands.map((command) => {
1080
+ if (typeof command !== "string" || !path.isAbsolute(command)) {
1081
+ const error = new Error(
1082
+ "Process execution context commands must be absolute paths",
1083
+ );
1084
+ error.code = "PROCESS_CONTEXT_INVALID";
1085
+ throw error;
1086
+ }
1087
+ const normalized = path.resolve(command);
1088
+ return process.platform === "win32"
1089
+ ? normalized.toLowerCase()
1090
+ : normalized;
1091
+ });
1092
+ return this._ambientProcessContext.run(
1093
+ Object.freeze({
1094
+ origin: safeOrigin,
1095
+ policy,
1096
+ scope: String(scope || "default").slice(0, 128),
1097
+ allowedCommands: Object.freeze([...new Set(normalizedCommands)]),
1098
+ auditContext,
1099
+ }),
1100
+ operation,
1101
+ );
1102
+ }
1103
+
1024
1104
  _isDangerousCommand(command) {
1025
1105
  if (typeof command !== "string") return false;
1026
1106
  const lower = command.toLowerCase();
@@ -1033,6 +1113,14 @@ class ProcessExecutionBroker extends EventEmitter {
1033
1113
  }
1034
1114
 
1035
1115
  _recordAudit(entry) {
1116
+ try {
1117
+ fs.appendFileSync(this._logPath, JSON.stringify(entry) + "\n");
1118
+ } catch (cause) {
1119
+ if (entry.persistentAuditRequired === true) {
1120
+ throw this._persistentAuditError(cause, entry);
1121
+ }
1122
+ // Non-sensitive legacy callers retain best-effort persistence.
1123
+ }
1036
1124
  this._auditLog.push(entry);
1037
1125
  if (this._auditLog.length > 10000) this._auditLog.shift();
1038
1126
  this._stats.totalSpawned++;
@@ -1046,12 +1134,54 @@ class ProcessExecutionBroker extends EventEmitter {
1046
1134
  }
1047
1135
  this._stats.byOrigin[entry.origin] =
1048
1136
  (this._stats.byOrigin[entry.origin] || 0) + 1;
1137
+ this.emit("spawn", entry);
1138
+ }
1139
+
1140
+ _persistentAuditError(cause, entry) {
1141
+ const error = new Error(
1142
+ `Persistent process audit is unavailable: ${cause.message}`,
1143
+ );
1144
+ error.code = "ERR_PROCESS_AUDIT_UNAVAILABLE";
1145
+ error.auditFailClosed = true;
1146
+ error.cause = cause;
1147
+ error.auditEntry = entry;
1148
+ return error;
1149
+ }
1150
+
1151
+ _requirePersistentAuditAdmission(entry) {
1152
+ const admission = {
1153
+ ...entry,
1154
+ auditPhase: "admission",
1155
+ persistentAuditRequired: true,
1156
+ admittedAt: Date.now(),
1157
+ };
1049
1158
  try {
1050
- fs.appendFileSync(this._logPath, JSON.stringify(entry) + "\n");
1051
- } catch {
1052
- // Audit persistence is best-effort; the in-memory entry is retained.
1159
+ fs.appendFileSync(this._logPath, JSON.stringify(admission) + "\n");
1160
+ } catch (cause) {
1161
+ throw this._persistentAuditError(cause, entry);
1162
+ }
1163
+ entry.persistentAuditRequired = true;
1164
+ entry.persistentAuditAdmitted = true;
1165
+ }
1166
+
1167
+ _recordRequiredAuditOutcome(entry, auditPhase) {
1168
+ if (entry.persistentAuditRequired !== true) return;
1169
+ try {
1170
+ fs.appendFileSync(
1171
+ this._logPath,
1172
+ JSON.stringify({ ...entry, auditPhase }) + "\n",
1173
+ );
1174
+ } catch (cause) {
1175
+ const error = this._persistentAuditError(cause, entry);
1176
+ entry.persistentAuditFailure = error.message;
1177
+ if (this.listenerCount("audit-error") > 0) {
1178
+ this.emit("audit-error", { auditEntry: entry, error });
1179
+ }
1180
+ process.emitWarning(error.message, {
1181
+ code: error.code,
1182
+ detail: `executionId=${entry.executionId}`,
1183
+ });
1053
1184
  }
1054
- this.emit("spawn", entry);
1055
1185
  }
1056
1186
 
1057
1187
  _sanitizeOptions(options) {
@@ -3965,8 +4095,68 @@ class ProcessExecutionBroker extends EventEmitter {
3965
4095
  return sanitized;
3966
4096
  }
3967
4097
 
4098
+ _auditCommand(command, redact = false) {
4099
+ if (!redact) return command;
4100
+ const digest = crypto
4101
+ .createHash("sha256")
4102
+ .update(String(command ?? ""), "utf8")
4103
+ .digest("hex");
4104
+ return `[REDACTED sha256:${digest}]`;
4105
+ }
4106
+
4107
+ _normalizeAuditContext(value, origin) {
4108
+ if (value === undefined || value === null) {
4109
+ return {
4110
+ actor: origin,
4111
+ sessionId: null,
4112
+ authorization: null,
4113
+ policyDigest: null,
4114
+ };
4115
+ }
4116
+ if (typeof value !== "object" || Array.isArray(value)) {
4117
+ throw new TypeError("auditContext must be an object");
4118
+ }
4119
+ const snapshot = ownDataObjectSnapshot(value);
4120
+ if (!snapshot)
4121
+ throw new TypeError("auditContext must contain data properties");
4122
+ const authorization = snapshot.authorization;
4123
+ if (
4124
+ authorization !== undefined &&
4125
+ authorization !== null &&
4126
+ (typeof authorization !== "object" || Array.isArray(authorization))
4127
+ ) {
4128
+ throw new TypeError("auditContext.authorization must be an object");
4129
+ }
4130
+ const authorizationSnapshot = authorization
4131
+ ? ownDataObjectSnapshot(authorization)
4132
+ : null;
4133
+ if (authorization && !authorizationSnapshot) {
4134
+ throw new TypeError(
4135
+ "auditContext.authorization must contain data properties",
4136
+ );
4137
+ }
4138
+ const text = (input, fallback = null) =>
4139
+ typeof input === "string" && input ? input.slice(0, 512) : fallback;
4140
+ return {
4141
+ actor: text(snapshot.actor, origin),
4142
+ sessionId: text(snapshot.sessionId),
4143
+ authorization: authorizationSnapshot
4144
+ ? {
4145
+ decision: text(authorizationSnapshot.decision, "unknown"),
4146
+ via: text(authorizationSnapshot.via, "unknown"),
4147
+ riskLevel: text(authorizationSnapshot.riskLevel),
4148
+ policy: text(authorizationSnapshot.policy),
4149
+ }
4150
+ : null,
4151
+ policyDigest: text(snapshot.policyDigest),
4152
+ };
4153
+ }
4154
+
3968
4155
  _stripAuditControlOptions(options) {
3969
4156
  delete options.auditRedactArgIndexes;
4157
+ delete options.auditRedactCommand;
4158
+ delete options.auditContext;
4159
+ delete options.requirePersistentAudit;
3970
4160
  }
3971
4161
 
3972
4162
  _applyCredentialBoundary(command, args, spawnOptions, origin) {
@@ -4352,6 +4542,7 @@ class ProcessExecutionBroker extends EventEmitter {
4352
4542
  }
4353
4543
 
4354
4544
  spawn(command, args, options = {}) {
4545
+ options = this._withAmbientProcessContext(command, options);
4355
4546
  const executionId = crypto.randomUUID();
4356
4547
  const startTime = Date.now();
4357
4548
  const origin = options.origin || "unknown";
@@ -4380,12 +4571,20 @@ class ProcessExecutionBroker extends EventEmitter {
4380
4571
  );
4381
4572
 
4382
4573
  const traceCtx = this._getTraceContext();
4574
+ const auditContext = this._normalizeAuditContext(
4575
+ options.auditContext,
4576
+ origin,
4577
+ );
4383
4578
  const auditEntry = {
4384
4579
  executionId,
4385
4580
  traceId: traceCtx?.traceId || null,
4386
4581
  origin,
4387
4582
  scope,
4388
- command,
4583
+ actor: auditContext.actor,
4584
+ sessionId: auditContext.sessionId,
4585
+ authorization: auditContext.authorization,
4586
+ approvalPolicyDigest: auditContext.policyDigest,
4587
+ command: this._auditCommand(command, options.auditRedactCommand === true),
4389
4588
  args: this._auditArgs(args, auditRedactArgIndexes),
4390
4589
  cwd,
4391
4590
  startTime,
@@ -4533,6 +4732,16 @@ class ProcessExecutionBroker extends EventEmitter {
4533
4732
  throw transactionError;
4534
4733
  }
4535
4734
 
4735
+ if (options.requirePersistentAudit === true) {
4736
+ try {
4737
+ this._requirePersistentAuditAdmission(auditEntry);
4738
+ } catch (auditError) {
4739
+ sandboxPlan.cleanup?.();
4740
+ auditError.auditEntry = auditEntry;
4741
+ throw auditError;
4742
+ }
4743
+ }
4744
+
4536
4745
  // Use native spawn from _native (set by patch-child-process.js)
4537
4746
  const nativeSpawnFn = this._native?.spawn || nativeSpawn;
4538
4747
  let proc;
@@ -4680,6 +4889,7 @@ class ProcessExecutionBroker extends EventEmitter {
4680
4889
  auditEntry.signal = signal;
4681
4890
  auditEntry.endTime = endTime;
4682
4891
  auditEntry.durationMs = endTime - startTime;
4892
+ this._recordRequiredAuditOutcome(auditEntry, "completed");
4683
4893
  this._writeRplEntry(auditEntry, "completed");
4684
4894
  this._emitHooksEvent("tool:end", {
4685
4895
  executionId,
@@ -4695,6 +4905,7 @@ class ProcessExecutionBroker extends EventEmitter {
4695
4905
  auditEntry.error = err.message;
4696
4906
  auditEntry.endTime = Date.now();
4697
4907
  auditEntry.durationMs = auditEntry.endTime - startTime;
4908
+ this._recordRequiredAuditOutcome(auditEntry, "error");
4698
4909
  this._writeRplEntry(auditEntry, "error", err);
4699
4910
  this._emitHooksEvent("tool:end", {
4700
4911
  executionId,
@@ -4719,6 +4930,7 @@ class ProcessExecutionBroker extends EventEmitter {
4719
4930
  }
4720
4931
 
4721
4932
  spawnSync(command, args, options = {}) {
4933
+ options = this._withAmbientProcessContext(command, options);
4722
4934
  const executionId = crypto.randomUUID();
4723
4935
  const startTime = Date.now();
4724
4936
  const origin = options.origin || "unknown";
@@ -4743,12 +4955,20 @@ class ProcessExecutionBroker extends EventEmitter {
4743
4955
  );
4744
4956
 
4745
4957
  const traceCtx = this._getTraceContext();
4958
+ const auditContext = this._normalizeAuditContext(
4959
+ options.auditContext,
4960
+ origin,
4961
+ );
4746
4962
  const auditEntry = {
4747
4963
  executionId,
4748
4964
  traceId: traceCtx?.traceId || null,
4749
4965
  origin,
4750
4966
  scope,
4751
- command,
4967
+ actor: auditContext.actor,
4968
+ sessionId: auditContext.sessionId,
4969
+ authorization: auditContext.authorization,
4970
+ approvalPolicyDigest: auditContext.policyDigest,
4971
+ command: this._auditCommand(command, options.auditRedactCommand === true),
4752
4972
  args: this._auditArgs(args, auditRedactArgIndexes),
4753
4973
  cwd,
4754
4974
  startTime,
@@ -4880,6 +5100,16 @@ class ProcessExecutionBroker extends EventEmitter {
4880
5100
  throw transactionError;
4881
5101
  }
4882
5102
 
5103
+ if (options.requirePersistentAudit === true) {
5104
+ try {
5105
+ this._requirePersistentAuditAdmission(auditEntry);
5106
+ } catch (auditError) {
5107
+ sandboxPlan.cleanup?.();
5108
+ auditError.auditEntry = auditEntry;
5109
+ throw auditError;
5110
+ }
5111
+ }
5112
+
4883
5113
  const nativeSpawnSyncFn = this._native?.spawnSync || nativeSpawnSync;
4884
5114
  try {
4885
5115
  const macPlanBindingDeclared =
@@ -4957,12 +5187,20 @@ class ProcessExecutionBroker extends EventEmitter {
4957
5187
  options.auditRedactArgIndexes,
4958
5188
  Array.isArray(args) ? args.length : 0,
4959
5189
  );
5190
+ const auditContext = this._normalizeAuditContext(
5191
+ options.auditContext,
5192
+ origin,
5193
+ );
4960
5194
  const auditEntry = {
4961
5195
  executionId,
4962
5196
  traceId: this._getTraceContext()?.traceId || null,
4963
5197
  origin,
4964
5198
  scope,
4965
- command,
5199
+ actor: auditContext.actor,
5200
+ sessionId: auditContext.sessionId,
5201
+ authorization: auditContext.authorization,
5202
+ approvalPolicyDigest: auditContext.policyDigest,
5203
+ command: this._auditCommand(command, options.auditRedactCommand === true),
4966
5204
  args: this._auditArgs(args, auditRedactArgIndexes),
4967
5205
  cwd: options.cwd || process.cwd(),
4968
5206
  startTime,
@@ -5051,6 +5289,9 @@ class ProcessExecutionBroker extends EventEmitter {
5051
5289
  const filteredArgs = spawnOptions.args || [];
5052
5290
  delete spawnOptions.args;
5053
5291
  this._prepareWorkspaceTransactionAudit(auditEntry);
5292
+ if (options.requirePersistentAudit === true) {
5293
+ this._requirePersistentAuditAdmission(auditEntry);
5294
+ }
5054
5295
 
5055
5296
  if (sandboxPolicy.requiredBoundaries.length === 0) {
5056
5297
  delete spawnOptions.origin;
@@ -5070,7 +5311,18 @@ class ProcessExecutionBroker extends EventEmitter {
5070
5311
  auditEntry.pid = proc?.pid ?? null;
5071
5312
  auditEntry.endTime = Date.now();
5072
5313
  auditEntry.durationMs = auditEntry.endTime - startTime;
5073
- this._recordAudit(auditEntry);
5314
+ try {
5315
+ this._recordAudit(auditEntry);
5316
+ } catch (auditError) {
5317
+ try {
5318
+ proc.kill?.();
5319
+ } catch {
5320
+ // Preserve the required-audit failure after requesting teardown.
5321
+ }
5322
+ auditError.spawnedProcess = proc;
5323
+ auditError.processTerminationRequested = true;
5324
+ throw auditError;
5325
+ }
5074
5326
  this._writeRplEntry(auditEntry, "started");
5075
5327
  return proc;
5076
5328
  }
@@ -5216,6 +5468,7 @@ class ProcessExecutionBroker extends EventEmitter {
5216
5468
  auditEntry.signal = signal;
5217
5469
  auditEntry.endTime = Date.now();
5218
5470
  auditEntry.durationMs = auditEntry.endTime - startTime;
5471
+ this._recordRequiredAuditOutcome(auditEntry, "completed");
5219
5472
  this._writeRplEntry(auditEntry, "completed");
5220
5473
  this.emit("exit", auditEntry);
5221
5474
  });
@@ -5224,13 +5477,26 @@ class ProcessExecutionBroker extends EventEmitter {
5224
5477
  auditEntry.error = error.message;
5225
5478
  auditEntry.endTime = Date.now();
5226
5479
  auditEntry.durationMs = auditEntry.endTime - startTime;
5480
+ this._recordRequiredAuditOutcome(auditEntry, "error");
5227
5481
  this._writeRplEntry(auditEntry, "error", error);
5228
5482
  if (this.listenerCount("error") > 0) this.emit("error", auditEntry);
5229
5483
  });
5230
5484
  auditEntry.pid = proc?.pid ?? null;
5231
5485
  auditEntry.endTime = Date.now();
5232
5486
  auditEntry.durationMs = auditEntry.endTime - startTime;
5233
- this._recordAudit(auditEntry);
5487
+ try {
5488
+ this._recordAudit(auditEntry);
5489
+ } catch (auditError) {
5490
+ try {
5491
+ child.kill?.();
5492
+ } catch {
5493
+ // Preserve the required-audit failure after requesting teardown.
5494
+ }
5495
+ releaseTerminal();
5496
+ auditError.spawnedProcess = proc;
5497
+ auditError.processTerminationRequested = true;
5498
+ throw auditError;
5499
+ }
5234
5500
  this._writeRplEntry(auditEntry, "started");
5235
5501
  return proc;
5236
5502
  } catch (error) {
@@ -1683,8 +1683,12 @@ namespace ChainlessChain.WindowsSandbox
1683
1683
  string[] configured = pathExt.Split(
1684
1684
  new[] { ';' },
1685
1685
  StringSplitOptions.RemoveEmptyEntries);
1686
- extensions = new string[configured.Length + 1];
1687
- extensions[0] = String.Empty;
1686
+ // Match Windows command lookup: a bare command name is
1687
+ // resolved through PATHEXT. Trying an extensionless file first
1688
+ // can select Docker's adjacent POSIX `docker` shell script
1689
+ // instead of docker.exe, which CreateProcessAsUser rejects
1690
+ // with ERROR_BAD_EXE_FORMAT (193).
1691
+ extensions = new string[configured.Length];
1688
1692
  for (int index = 0; index < configured.Length; index++)
1689
1693
  {
1690
1694
  string extension = configured[index].Trim();
@@ -1697,7 +1701,7 @@ namespace ChainlessChain.WindowsSandbox
1697
1701
  throw new InvalidDataException(
1698
1702
  "Target PATHEXT contains an invalid extension");
1699
1703
  }
1700
- extensions[index + 1] = extension;
1704
+ extensions[index] = extension;
1701
1705
  }
1702
1706
  }
1703
1707