chainlesschain 0.166.10 → 0.166.13

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 (230) 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-BN25cNOD.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Da9IP-m5.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-D7hkEvQm.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-CCV4Xnbc.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-CVSnVJeA.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-CuYdw5Ag.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-DZCnK-Tf.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-cV9FdpTy.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-BRnv6YSp.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-Bw5w87P4.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-C0GjtUAw.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DaoTqcdt.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-B4dYcEIi.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-mAhuOeuD.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-BK6KEdBk.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-CCglmNu5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-Cm8S4of7.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-Dhs1QLMe.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-CLlhmXWk.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-BnHVbaNs.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-UzQP9-0O.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-CBdlPClz.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-axIRPdq1.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-DUalW5rx.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-Bl4W9luY.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-C1yP-uEu.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-Xh6Ig5q8.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-C2cz3bt2.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-C_z63ixg.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-BYqB33_3.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CEULuArm.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-fgMsu-0H.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-DO9Hdcec.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-B8zyLiFe.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-BLAN2mWW.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-CrQcFM7u.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-DVnyiiU-.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-qjCME5OD.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-4JE3C3It.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-CjBuak9I.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-BtPcYQcC.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-Cx653_Ba.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-CkuD3YzS.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-BgNgU7HH.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-BTC8W0a-.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-Dmd4Hjxz.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-C_5DA-G0.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-uwslV4XC.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-CuNgwVnX.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-CJayVX9H.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-Cb05H5go.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-BZlGKapZ.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-BIzZWYzd.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-vEYYyQXQ.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-MZqTy5CC.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-CRARUOl8.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-80VAK8PX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-CzRSoIwK.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-BpwQ2n4C.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-BC03TZ79.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-DE59-jaa.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-DOHmeWyA.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-hc5RZl1D.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cv5uMP7E.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-qohu7Ug0.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-drCPFWV5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-BAEgUeRy.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-CkJkKBlo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-bMuKEpez.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-DxWQVHRC.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-BpS8idmV.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-BPBLlW5v.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-C4SLEeUh.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-r-wfU39U.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-C7vjRmLN.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-DdzeFCV2.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CYyWN2KD.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-D8A9osUg.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DBvrNlyS.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-DBVAGc7o.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-C1vQUCRJ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-BKs4dah4.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-ByIuj3lD.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYlAFCm9.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-Dwyadd0c.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-Bm2f3s08.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-C8ORSh7V.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-1iVlnsM-.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CmqNyUSL.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-rUMaX3Ul.js} +1 -1
  96. package/src/assets/web-panel/assets/index-9biMQ-tw.js +1 -0
  97. package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-B53c3diB.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-B59OWAs7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-B8BrB0Ls.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-BC32_0xT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-BC8Wb6cy.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BCOhTILd.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-BFniLMn9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BIvM-uAX.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-BK-RY0-7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-BQL9r73Y.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BVtnizyC.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-Bf1PlIHp.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Bgw4Y2rU.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-BgwLNxmr.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-C-J5-pGH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-C-ZIHi42.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-C3B1S-mW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C5RfRciU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-CCEyz58d.js} +1 -1
  116. package/src/assets/web-panel/assets/index-COie87kl.js +1 -0
  117. package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-CTfEmKK0.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-CfiHyVyl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-CkFvuAex.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D98FXb0w.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DDHk911Q.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-DJxtPFOh.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-DVJ1uKf4.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-Dcck8QfW.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-DgUE51Pz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-Dsve5Gkv.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-DvedhJeM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-DwMdWKiF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-OcbzdRpT.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-fPK6GFEg.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-geQinnns.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-pHWA7bmM.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-reUHhuz8.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-tqTx5wXo.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-CuA-cpkL.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-CimmE_9b.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-DlGlrltz.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-CK6BJQ07.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-BKjBfZfB.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-B2chVYw9.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-BW8aLJJ3.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-dXlPl66S.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-hSa89S4G.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-DM6KLt-s.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-C9MQAK15.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-BpQDpP0z.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-C7rtRViA.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-Dm15xafq.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-mEiEytw4.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-DzPxflhY.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 +51 -20
  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/serve.js +94 -10
  162. package/src/commands/session.js +2 -3
  163. package/src/commands/team.js +7 -1
  164. package/src/data/changelog.json +28 -2
  165. package/src/gateways/ws/session-core-protocol.js +62 -3
  166. package/src/gateways/ws/session-protocol.js +123 -15
  167. package/src/gateways/ws/ws-agent-handler.js +157 -9
  168. package/src/gateways/ws/ws-session-gateway.js +204 -30
  169. package/src/generated/cc-agent-protocol.schema.json +2094 -4
  170. package/src/harness/prompt-compressor.js +5 -55
  171. package/src/lib/agent-sandbox.js +14 -4
  172. package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
  173. package/src/lib/app-server/context-memory-notifications.js +54 -0
  174. package/src/lib/app-server/rollout-store-factory.js +115 -0
  175. package/src/lib/app-server/rollout-store.js +310 -23
  176. package/src/lib/app-server/server.js +184 -7
  177. package/src/lib/app-server/sqlite-rollout-store.js +59 -16
  178. package/src/lib/auto-mode-config.js +26 -0
  179. package/src/lib/causal-observability.js +13 -1
  180. package/src/lib/context-memory-kernel/authority.js +95 -0
  181. package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
  182. package/src/lib/context-memory-kernel/index.js +8 -0
  183. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
  184. package/src/lib/context-memory-kernel/live-compaction.js +375 -0
  185. package/src/lib/context-memory-kernel/memory-service.js +667 -0
  186. package/src/lib/context-memory-kernel/message-adapter.js +451 -0
  187. package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
  188. package/src/lib/context-memory-kernel/provider-context.js +192 -0
  189. package/src/lib/context-memory-kernel/runtime.js +61 -0
  190. package/src/lib/direct-model-usage.js +22 -18
  191. package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
  192. package/src/lib/graph-kernel/cutover-ledger.js +2 -2
  193. package/src/lib/graph-kernel/event-store.js +3 -5
  194. package/src/lib/graph-kernel/migration-saga.js +2 -2
  195. package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
  196. package/src/lib/hierarchical-memory.js +22 -0
  197. package/src/lib/hook-audit-store.js +170 -0
  198. package/src/lib/hook-event-bus.cjs +0 -0
  199. package/src/lib/hook-manager.js +25 -83
  200. package/src/lib/hook-runtime-adapters.js +233 -0
  201. package/src/lib/hook-runtime-contract.cjs +291 -0
  202. package/src/lib/hook-runtime-contract.js +21 -0
  203. package/src/lib/hook-trust.js +210 -0
  204. package/src/lib/hooks-v2-producers.js +52 -6
  205. package/src/lib/hooks-v2-runtime.js +443 -178
  206. package/src/lib/llm-pricing.js +10 -0
  207. package/src/lib/memory-manager.js +29 -4
  208. package/src/lib/model-context-window.js +52 -0
  209. package/src/lib/permanent-memory.js +17 -0
  210. package/src/lib/plan-mode.js +8 -4
  211. package/src/lib/process-execution-broker/index.js +208 -16
  212. package/src/lib/runtime-usage-ledger.js +20 -0
  213. package/src/lib/session-consolidator.js +59 -0
  214. package/src/lib/session-core-singletons.js +17 -4
  215. package/src/lib/session-hooks.js +29 -2
  216. package/src/lib/session-transcript-migration.js +188 -0
  217. package/src/lib/settings-hook-events.cjs +37 -401
  218. package/src/lib/settings-hook-events.js +210 -8
  219. package/src/lib/settings-hooks.cjs +42 -83
  220. package/src/lib/ws-session-manager.js +4 -1
  221. package/src/repl/agent-repl.js +186 -53
  222. package/src/runtime/agent-core.js +376 -350
  223. package/src/runtime/headless-runner.js +40 -33
  224. package/src/runtime/headless-stream.js +131 -30
  225. package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
  226. package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
  227. package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
  228. package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
  229. package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
  230. package/src/assets/web-panel/assets/index-DL2EFx7m.js +0 -1
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Canonical Hook runtime contract.
5
+ *
6
+ * Every Hook surface (Hooks v2, settings adapters, the SQLite registry, the
7
+ * replay bus and product producers) projects from this file. Keep this module
8
+ * CommonJS so both the legacy CJS settings loader and ESM runtime can consume
9
+ * the exact same frozen objects without maintaining parallel registries.
10
+ */
11
+
12
+ const HOOK_EVENT_SCHEMA_VERSION = 1;
13
+ const MAX_HOOK_CONTEXT_BYTES = 1024 * 1024;
14
+ const MIN_HOOK_TIMEOUT_MS = 1;
15
+ const MAX_HOOK_TIMEOUT_MS = 10 * 60 * 1000;
16
+ const DEFAULT_HOOK_TIMEOUT_MS = 30 * 1000;
17
+
18
+ const HOOK_PRIORITY = Object.freeze({
19
+ SYSTEM: 0,
20
+ HIGH: 100,
21
+ NORMAL: 500,
22
+ LOW: 900,
23
+ MONITOR: 1000,
24
+ });
25
+
26
+ const HOOK_EXECUTION_MODE = Object.freeze({
27
+ BLOCKING: "blocking",
28
+ ASYNC: "async",
29
+ });
30
+
31
+ const EVENT_GROUPS = Object.freeze({
32
+ system: ["Setup", "Notification", "TimelineEntry"],
33
+ tool: [
34
+ "PreToolUse",
35
+ "PostToolUse",
36
+ "PostToolUseFailure",
37
+ "PostToolBatch",
38
+ "ToolError",
39
+ ],
40
+ session: [
41
+ "UserPromptSubmit",
42
+ "UserPromptExpansion",
43
+ "AssistantResponse",
44
+ "SessionStart",
45
+ "SessionResume",
46
+ "SessionPause",
47
+ "SessionEnd",
48
+ "Stop",
49
+ "StopFailure",
50
+ "PreCompact",
51
+ "PostCompact",
52
+ "ModelSelection",
53
+ ],
54
+ permission: [
55
+ "PermissionRequest",
56
+ "PermissionAllow",
57
+ "PermissionDeny",
58
+ "PermissionDenied",
59
+ "ComplianceCheck",
60
+ ],
61
+ agent: [
62
+ "AgentStart",
63
+ "AgentStop",
64
+ "SubagentStart",
65
+ "SubagentStop",
66
+ "TaskAssigned",
67
+ "TaskCreated",
68
+ "TaskCompleted",
69
+ "TeammateIdle",
70
+ ],
71
+ plan: [
72
+ "PlanModeEnter",
73
+ "PlanRevised",
74
+ "PlanApproved",
75
+ "PlanItemExecute",
76
+ "PlanRejected",
77
+ ],
78
+ workspace: [
79
+ "InstructionsLoaded",
80
+ "CwdChanged",
81
+ "WorktreeCreate",
82
+ "WorktreeRemove",
83
+ "FileChanged",
84
+ "FileModified",
85
+ "PreFileAccess",
86
+ "PostFileAccess",
87
+ ],
88
+ git: [
89
+ "PreCommit",
90
+ "PostCommit",
91
+ "PreGitCommit",
92
+ "PostGitCommit",
93
+ "PreGitPush",
94
+ "CIFailure",
95
+ ],
96
+ mcp: [
97
+ "McpRequest",
98
+ "McpResponse",
99
+ "MCPElicitation",
100
+ "Elicitation",
101
+ "ElicitationResult",
102
+ ],
103
+ ipc: ["PreIPCCall", "PostIPCCall", "IPCError"],
104
+ memory: ["MemorySave", "MemoryLoad"],
105
+ governance: [
106
+ "ConfigChange",
107
+ "AuditLog",
108
+ "DataSubjectRequest",
109
+ "IterationWarning",
110
+ "IterationBudgetExhausted",
111
+ ],
112
+ });
113
+
114
+ const DECISION_EVENT_NAMES = new Set([
115
+ "Setup",
116
+ "PreToolUse",
117
+ "UserPromptSubmit",
118
+ "UserPromptExpansion",
119
+ "Stop",
120
+ "PermissionRequest",
121
+ "ModelSelection",
122
+ "PreCompact",
123
+ "ComplianceCheck",
124
+ "SubagentStart",
125
+ "SubagentStop",
126
+ ]);
127
+
128
+ const CONTEXT_EVENT_NAMES = new Set([
129
+ "Setup",
130
+ "UserPromptSubmit",
131
+ "UserPromptExpansion",
132
+ "SessionStart",
133
+ "PostCompact",
134
+ "InstructionsLoaded",
135
+ ]);
136
+
137
+ const eventEntries = [];
138
+ for (const [group, names] of Object.entries(EVENT_GROUPS)) {
139
+ for (const event of names) eventEntries.push([event, group]);
140
+ }
141
+
142
+ const HOOK_EVENT_TYPES = Object.freeze(
143
+ Object.fromEntries(eventEntries.map(([event]) => [event, event])),
144
+ );
145
+
146
+ const DEFAULT_ALLOWED_EXECUTORS = Object.freeze([
147
+ "command",
148
+ "http",
149
+ "mcp_tool",
150
+ "prompt",
151
+ "agent",
152
+ "js",
153
+ ]);
154
+
155
+ const HOOK_EVENT_CONTRACTS = Object.freeze(
156
+ Object.fromEntries(
157
+ eventEntries.map(([event, group]) => {
158
+ const decisionCapable = DECISION_EVENT_NAMES.has(event);
159
+ return [
160
+ event,
161
+ Object.freeze({
162
+ schemaVersion: HOOK_EVENT_SCHEMA_VERSION,
163
+ event,
164
+ group,
165
+ allowedExecutors: DEFAULT_ALLOWED_EXECUTORS,
166
+ decisionCapable,
167
+ contextCapable: CONTEXT_EVENT_NAMES.has(event),
168
+ blockingSemantics: decisionCapable
169
+ ? "strictest:block>ask>allow>continue"
170
+ : "observe-only",
171
+ asyncDecisionSemantics: "observe-only",
172
+ }),
173
+ ];
174
+ }),
175
+ ),
176
+ );
177
+
178
+ const DECISION_EVENTS = Object.freeze(new Set(DECISION_EVENT_NAMES));
179
+
180
+ function stableStringify(value, seen = new Set()) {
181
+ if (value === null || typeof value !== "object") {
182
+ const encoded = JSON.stringify(value);
183
+ if (encoded === undefined) {
184
+ throw new TypeError("Hook event context contains a non-JSON value");
185
+ }
186
+ return encoded;
187
+ }
188
+ if (seen.has(value)) {
189
+ throw new TypeError("Hook event context must not contain cycles");
190
+ }
191
+ seen.add(value);
192
+ let encoded;
193
+ if (Array.isArray(value)) {
194
+ encoded = `[${value.map((item) => stableStringify(item, seen)).join(",")}]`;
195
+ } else {
196
+ const prototype = Object.getPrototypeOf(value);
197
+ if (prototype !== Object.prototype && prototype !== null) {
198
+ seen.delete(value);
199
+ throw new TypeError("Hook event context must contain only plain objects");
200
+ }
201
+ const keys = Object.keys(value).sort();
202
+ encoded = `{${keys
203
+ .map(
204
+ (key) => `${JSON.stringify(key)}:${stableStringify(value[key], seen)}`,
205
+ )
206
+ .join(",")}}`;
207
+ }
208
+ seen.delete(value);
209
+ return encoded;
210
+ }
211
+
212
+ function validateHookEvent(event, context = {}) {
213
+ const contract = HOOK_EVENT_CONTRACTS[event];
214
+ if (!contract) {
215
+ const error = new Error(`Invalid hook event: ${event}`);
216
+ error.code = "CC_HOOK_EVENT_UNKNOWN";
217
+ throw error;
218
+ }
219
+ if (
220
+ context === null ||
221
+ typeof context !== "object" ||
222
+ Array.isArray(context)
223
+ ) {
224
+ const error = new TypeError("Hook event context must be a plain object");
225
+ error.code = "CC_HOOK_EVENT_CONTEXT_INVALID";
226
+ throw error;
227
+ }
228
+ let serialized;
229
+ try {
230
+ serialized = stableStringify(context);
231
+ } catch (cause) {
232
+ const error = new TypeError(
233
+ `Invalid hook event context: ${cause.message}`,
234
+ {
235
+ cause,
236
+ },
237
+ );
238
+ error.code = "CC_HOOK_EVENT_CONTEXT_INVALID";
239
+ throw error;
240
+ }
241
+ if (Buffer.byteLength(serialized, "utf8") > MAX_HOOK_CONTEXT_BYTES) {
242
+ const error = new RangeError(
243
+ `Hook event context exceeds ${MAX_HOOK_CONTEXT_BYTES} bytes`,
244
+ );
245
+ error.code = "CC_HOOK_EVENT_CONTEXT_TOO_LARGE";
246
+ throw error;
247
+ }
248
+ return contract;
249
+ }
250
+
251
+ function normalizeHookPriority(value, fallback = HOOK_PRIORITY.NORMAL) {
252
+ const parsed = Number(value);
253
+ if (!Number.isFinite(parsed)) return fallback;
254
+ return Math.max(
255
+ HOOK_PRIORITY.SYSTEM,
256
+ Math.min(HOOK_PRIORITY.MONITOR, parsed),
257
+ );
258
+ }
259
+
260
+ function normalizeHookTimeoutMs(value, fallback = DEFAULT_HOOK_TIMEOUT_MS) {
261
+ const parsed = Number(value);
262
+ if (!Number.isFinite(parsed) || parsed <= 0) return fallback;
263
+ return Math.max(
264
+ MIN_HOOK_TIMEOUT_MS,
265
+ Math.min(MAX_HOOK_TIMEOUT_MS, Math.floor(parsed)),
266
+ );
267
+ }
268
+
269
+ function normalizeHookExecutionMode(value) {
270
+ return value === HOOK_EXECUTION_MODE.ASYNC || value === true
271
+ ? HOOK_EXECUTION_MODE.ASYNC
272
+ : HOOK_EXECUTION_MODE.BLOCKING;
273
+ }
274
+
275
+ module.exports = {
276
+ HOOK_EVENT_SCHEMA_VERSION,
277
+ HOOK_EVENT_TYPES,
278
+ HOOK_EVENT_CONTRACTS,
279
+ DECISION_EVENTS,
280
+ HOOK_PRIORITY,
281
+ HOOK_EXECUTION_MODE,
282
+ DEFAULT_HOOK_TIMEOUT_MS,
283
+ MIN_HOOK_TIMEOUT_MS,
284
+ MAX_HOOK_TIMEOUT_MS,
285
+ MAX_HOOK_CONTEXT_BYTES,
286
+ stableStringify,
287
+ validateHookEvent,
288
+ normalizeHookPriority,
289
+ normalizeHookTimeoutMs,
290
+ normalizeHookExecutionMode,
291
+ };
@@ -0,0 +1,21 @@
1
+ import contract from "./hook-runtime-contract.cjs";
2
+
3
+ export const {
4
+ HOOK_EVENT_SCHEMA_VERSION,
5
+ HOOK_EVENT_TYPES,
6
+ HOOK_EVENT_CONTRACTS,
7
+ DECISION_EVENTS,
8
+ HOOK_PRIORITY,
9
+ HOOK_EXECUTION_MODE,
10
+ DEFAULT_HOOK_TIMEOUT_MS,
11
+ MIN_HOOK_TIMEOUT_MS,
12
+ MAX_HOOK_TIMEOUT_MS,
13
+ MAX_HOOK_CONTEXT_BYTES,
14
+ stableStringify,
15
+ validateHookEvent,
16
+ normalizeHookPriority,
17
+ normalizeHookTimeoutMs,
18
+ normalizeHookExecutionMode,
19
+ } = contract;
20
+
21
+ export default contract;
@@ -0,0 +1,210 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import {
5
+ checkRecordedWorkspaceTrust,
6
+ recordWorkspaceTrustConsent,
7
+ revokeRecordedWorkspaceTrust,
8
+ } from "./workspace-trust.js";
9
+ import { stableStringify } from "./hook-runtime-contract.js";
10
+
11
+ export const HOOK_TRUST_SCHEMA = "chainlesschain.hook-trust/v1";
12
+
13
+ function sha256(label, value) {
14
+ return crypto
15
+ .createHash("sha256")
16
+ .update(`${label}\0`, "utf8")
17
+ .update(String(value), "utf8")
18
+ .digest("hex");
19
+ }
20
+
21
+ function serializableDefinition(hook = {}) {
22
+ return {
23
+ event: hook.event || null,
24
+ type: hook.type || null,
25
+ command: hook.command || null,
26
+ args: Array.isArray(hook.args) ? hook.args.map(String) : [],
27
+ url: hook.url || null,
28
+ method: hook.method || null,
29
+ headers: hook.headers || null,
30
+ server: hook.server || null,
31
+ tool: hook.tool || null,
32
+ template: hook.template || null,
33
+ agentName: hook.agentName || null,
34
+ skillName: hook.skillName || null,
35
+ matcher: hook.matcher || null,
36
+ priority: hook.priority ?? null,
37
+ timeoutMs: hook.timeoutMs ?? null,
38
+ executionMode: hook.executionMode || null,
39
+ sandboxPolicy: hook.sandboxPolicy || null,
40
+ requiredBoundaries: hook.requiredBoundaries || null,
41
+ };
42
+ }
43
+
44
+ export function computeHookDefinitionDigest(hook = {}) {
45
+ return sha256(
46
+ "chainlesschain.hook-definition.v1",
47
+ stableStringify(serializableDefinition(hook)),
48
+ );
49
+ }
50
+
51
+ export function normalizeHookAuthority(hook = {}) {
52
+ const raw = hook.authority || hook.authoritySource || {};
53
+ const kind = String(raw.kind || hook.origin || "programmatic").toLowerCase();
54
+ const sourceFile =
55
+ typeof raw.sourceFile === "string" && raw.sourceFile
56
+ ? path.resolve(raw.sourceFile)
57
+ : null;
58
+ const definitionDigest = computeHookDefinitionDigest(hook);
59
+ const sourceDigest =
60
+ typeof (raw.digest || raw.sourceDigest) === "string" &&
61
+ /^[a-f0-9]{64}$/iu.test(raw.digest || raw.sourceDigest)
62
+ ? String(raw.digest || raw.sourceDigest).toLowerCase()
63
+ : definitionDigest;
64
+ const requiresConsent =
65
+ raw.requiresConsent === true ||
66
+ (raw.requiresConsent !== false &&
67
+ new Set(["settings", "config", "project"]).has(kind));
68
+ const subject = String(
69
+ raw.subject || sourceFile || `${kind}:${hook.id || definitionDigest}`,
70
+ );
71
+ return Object.freeze({
72
+ schema: HOOK_TRUST_SCHEMA,
73
+ kind,
74
+ sourceFile,
75
+ sourceDigest,
76
+ definitionDigest,
77
+ subject,
78
+ requiresConsent,
79
+ });
80
+ }
81
+
82
+ function trustFailure(authority, status, error = null) {
83
+ return Object.freeze({
84
+ schema: HOOK_TRUST_SCHEMA,
85
+ trusted: false,
86
+ status,
87
+ decision: "deny",
88
+ authority,
89
+ audit: null,
90
+ errorCode: error?.code || null,
91
+ });
92
+ }
93
+
94
+ function verifyAuthoritySource(authority) {
95
+ if (!authority.requiresConsent || !authority.sourceFile) {
96
+ return { matches: true, error: null };
97
+ }
98
+ try {
99
+ const currentDigest = crypto
100
+ .createHash("sha256")
101
+ .update(fs.readFileSync(authority.sourceFile))
102
+ .digest("hex");
103
+ return {
104
+ matches: currentDigest === authority.sourceDigest,
105
+ error: null,
106
+ };
107
+ } catch (error) {
108
+ return { matches: false, error };
109
+ }
110
+ }
111
+
112
+ export function assessHookTrust(hook, { workspaceRoot } = {}) {
113
+ const authority = normalizeHookAuthority(hook);
114
+ if (!authority.requiresConsent) {
115
+ return Object.freeze({
116
+ schema: HOOK_TRUST_SCHEMA,
117
+ trusted: true,
118
+ status: "host-trusted",
119
+ decision: "allow",
120
+ authority,
121
+ audit: null,
122
+ errorCode: null,
123
+ });
124
+ }
125
+ const source = verifyAuthoritySource(authority);
126
+ if (!source.matches) {
127
+ return trustFailure(
128
+ authority,
129
+ source.error ? "source-unavailable" : "changed",
130
+ source.error,
131
+ );
132
+ }
133
+ if (typeof workspaceRoot !== "string" || !path.isAbsolute(workspaceRoot)) {
134
+ return trustFailure(authority, "workspace-unavailable");
135
+ }
136
+ try {
137
+ const result = checkRecordedWorkspaceTrust({
138
+ workspaceRoot,
139
+ source: "hooks",
140
+ subject: authority.subject,
141
+ evidenceFingerprint: authority.sourceDigest,
142
+ });
143
+ return Object.freeze({
144
+ schema: HOOK_TRUST_SCHEMA,
145
+ trusted: result.decision === "allow" && result.status === "trusted",
146
+ status: result.status,
147
+ decision: result.decision,
148
+ authority,
149
+ audit: result.audit,
150
+ errorCode: null,
151
+ });
152
+ } catch (error) {
153
+ return trustFailure(authority, "trust-store-unavailable", error);
154
+ }
155
+ }
156
+
157
+ export function approveHookAuthority(
158
+ authorityInput,
159
+ { workspaceRoot, now } = {},
160
+ ) {
161
+ const authority = normalizeHookAuthority({
162
+ id: authorityInput?.id || "approval",
163
+ event: authorityInput?.event || "Setup",
164
+ type: authorityInput?.type || "command",
165
+ command: authorityInput?.command || null,
166
+ authority: authorityInput,
167
+ });
168
+ const source = verifyAuthoritySource(authority);
169
+ if (!source.matches) {
170
+ const error = new Error(
171
+ source.error
172
+ ? `Hook authority source is unavailable: ${authority.sourceFile}`
173
+ : `Hook authority source changed: ${authority.sourceFile}`,
174
+ source.error ? { cause: source.error } : undefined,
175
+ );
176
+ error.code = source.error
177
+ ? "CC_HOOK_SOURCE_UNAVAILABLE"
178
+ : "CC_HOOK_SOURCE_CHANGED";
179
+ throw error;
180
+ }
181
+ if (!authority.requiresConsent) {
182
+ return assessHookTrust(
183
+ { authority, id: "approval", event: "Setup", type: "command" },
184
+ { workspaceRoot },
185
+ );
186
+ }
187
+ return recordWorkspaceTrustConsent({
188
+ workspaceRoot,
189
+ source: "hooks",
190
+ subject: authority.subject,
191
+ evidenceFingerprint: authority.sourceDigest,
192
+ consent: "explicit",
193
+ now,
194
+ });
195
+ }
196
+
197
+ export function revokeHookAuthority(authorityInput, { workspaceRoot } = {}) {
198
+ const authority = normalizeHookAuthority({
199
+ id: authorityInput?.id || "revocation",
200
+ event: authorityInput?.event || "Setup",
201
+ type: authorityInput?.type || "command",
202
+ command: authorityInput?.command || null,
203
+ authority: authorityInput,
204
+ });
205
+ return revokeRecordedWorkspaceTrust({
206
+ workspaceRoot,
207
+ source: "hooks",
208
+ subject: authority.subject,
209
+ });
210
+ }
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Best-effort bridge from real runtime producers to Hooks v2.
3
- * Hook failures never change the surrounding agent or interaction result.
2
+ * Canonical bridge from real runtime producers to Hooks v2. Decision-capable
3
+ * callers await and enforce the result; observation-only callers may emit in
4
+ * the background.
4
5
  *
5
6
  * A headless host may subscribe to a particular session to project a small,
6
7
  * machine-readable lifecycle stream. The projection deliberately excludes
@@ -8,6 +9,10 @@
8
9
  * credentials, paths, and user content. The observer is diagnostic only and
9
10
  * is never allowed to affect a hook decision.
10
11
  */
12
+ import { collectCanonicalAdapterHooks } from "./hook-runtime-adapters.js";
13
+ import path from "node:path";
14
+ import { runWithHostHooksV2Workspace } from "./hooks-v2-workspace-context.js";
15
+
11
16
  const sessionObservers = new Map();
12
17
 
13
18
  function safeId(value, max = 160) {
@@ -100,13 +105,54 @@ async function dispatchHooksV2Event(eventName, context, options) {
100
105
  results: [],
101
106
  };
102
107
  }
103
- return await runtime.executeHooks(eventName, context, options);
108
+ const adapterHooks = collectCanonicalAdapterHooks(eventName, context, {
109
+ settingsHooks: options.settingsHooks,
110
+ hookDb: options.hookDb,
111
+ matchTarget:
112
+ options.matchTarget || context.tool_name || context.tool || "",
113
+ cwd: options.cwd || context.cwd || process.cwd(),
114
+ settingsFailureMode:
115
+ options.failClosed === true ? "fail-closed" : "ignore",
116
+ });
117
+ const runtimeOptions = {
118
+ ...options,
119
+ additionalHooks: [
120
+ ...(Array.isArray(options.additionalHooks)
121
+ ? options.additionalHooks
122
+ : []),
123
+ ...adapterHooks,
124
+ ],
125
+ auditRequired:
126
+ options.auditRequired == null
127
+ ? process.env.NODE_ENV !== "test"
128
+ : options.auditRequired,
129
+ };
130
+ delete runtimeOptions.settingsHooks;
131
+ delete runtimeOptions.hookDb;
132
+ delete runtimeOptions.matchTarget;
133
+ delete runtimeOptions.cwd;
134
+ const workspaceRoot = path.resolve(
135
+ options.workspaceRoot || options.cwd || process.cwd(),
136
+ );
137
+ delete runtimeOptions.workspaceRoot;
138
+ const registeredHooks = runtime.hooks?.get?.(eventName);
139
+ const hasCandidateHooks =
140
+ (Array.isArray(registeredHooks) && registeredHooks.length > 0) ||
141
+ runtimeOptions.additionalHooks.length > 0;
142
+ if (!hasCandidateHooks) {
143
+ return await runtime.executeHooks(eventName, context, runtimeOptions);
144
+ }
145
+ return await runWithHostHooksV2Workspace(workspaceRoot, () =>
146
+ runtime.executeHooks(eventName, context, runtimeOptions),
147
+ );
104
148
  } catch (error) {
149
+ const failClosed = options.failClosed === true;
105
150
  return {
106
- success: options.failClosed !== true,
107
- blocked: options.failClosed === true,
108
- decision: options.failClosed === true ? "block" : "continue",
151
+ success: !failClosed,
152
+ blocked: failClosed,
153
+ decision: failClosed ? "block" : "continue",
109
154
  error: error?.message || String(error),
155
+ errorCode: error?.code || null,
110
156
  results: [],
111
157
  };
112
158
  }