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
@@ -69,6 +69,31 @@ export function openMemoryEditor(editor, filePath, deps = _deps) {
69
69
  });
70
70
  }
71
71
 
72
+ async function resolveCanonicalMemory(ctx) {
73
+ const { createCliCanonicalMemoryService } =
74
+ await import("../lib/context-memory-kernel/index.js");
75
+ const legacyDb = ctx?.db?.getDatabase?.() || null;
76
+ const service = createCliCanonicalMemoryService({ legacyDb });
77
+ if (service.decision.canonical && ctx?.db) {
78
+ await service.migrateLegacyEntries(exportMemory(ctx.db.getDatabase()));
79
+ }
80
+ return service;
81
+ }
82
+
83
+ async function resolveScopedMemory() {
84
+ const [{ createCliCanonicalMemoryService }, { getMemoryStore }] =
85
+ await Promise.all([
86
+ import("../lib/context-memory-kernel/index.js"),
87
+ import("../lib/session-core-singletons.js"),
88
+ ]);
89
+ const service = createCliCanonicalMemoryService();
90
+ const legacyStore = getMemoryStore();
91
+ if (service.decision.canonical) {
92
+ await service.migrateLegacyScopedEntries(legacyStore.list());
93
+ }
94
+ return { service, legacyStore };
95
+ }
96
+
72
97
  export function registerMemoryCommand(program) {
73
98
  const memory = program
74
99
  .command("memory")
@@ -145,15 +170,20 @@ export function registerMemoryCommand(program) {
145
170
  .action(async (options) => {
146
171
  try {
147
172
  const ctx = await bootstrap({ verbose: program.opts().verbose });
148
- if (!ctx.db) {
173
+ const service = await resolveCanonicalMemory(ctx);
174
+ if (!ctx.db && !service.decision.canonical) {
149
175
  logger.error("Database not available");
150
176
  process.exit(1);
151
177
  }
152
- const db = ctx.db.getDatabase();
153
- const entries = listMemory(db, {
154
- limit: Math.max(1, parseInt(options.limit) || 20),
155
- category: options.category,
156
- });
178
+ const entries = service.decision.canonical
179
+ ? await service.list({
180
+ limit: Math.max(1, parseInt(options.limit) || 20),
181
+ category: options.category,
182
+ })
183
+ : listMemory(ctx.db.getDatabase(), {
184
+ limit: Math.max(1, parseInt(options.limit) || 20),
185
+ category: options.category,
186
+ });
157
187
 
158
188
  if (options.json) {
159
189
  console.log(JSON.stringify(entries, null, 2));
@@ -193,11 +223,14 @@ export function registerMemoryCommand(program) {
193
223
  .action(async (options) => {
194
224
  try {
195
225
  const ctx = await bootstrap({ verbose: program.opts().verbose });
196
- if (!ctx.db) {
226
+ const service = await resolveCanonicalMemory(ctx);
227
+ if (!ctx.db && !service.decision.canonical) {
197
228
  logger.error("Database not available");
198
229
  process.exit(1);
199
230
  }
200
- const entries = exportMemory(ctx.db.getDatabase());
231
+ const entries = service.decision.canonical
232
+ ? await service.export()
233
+ : exportMemory(ctx.db.getDatabase());
201
234
  if (options.output) {
202
235
  const fs = await import("fs");
203
236
  fs.writeFileSync(options.output, JSON.stringify(entries), "utf-8");
@@ -240,11 +273,14 @@ export function registerMemoryCommand(program) {
240
273
  throw new Error("import: expected a JSON array of memory entries");
241
274
  }
242
275
  const ctx = await bootstrap({ verbose: program.opts().verbose });
243
- if (!ctx.db) {
276
+ const service = await resolveCanonicalMemory(ctx);
277
+ if (!ctx.db && !service.decision.canonical) {
244
278
  logger.error("Database not available");
245
279
  process.exit(1);
246
280
  }
247
- const result = importMemory(ctx.db.getDatabase(), entries);
281
+ const result = service.decision.canonical
282
+ ? await service.import(entries)
283
+ : importMemory(ctx.db.getDatabase(), entries);
248
284
  if (options.json) {
249
285
  console.log(JSON.stringify(result));
250
286
  } else {
@@ -269,18 +305,27 @@ export function registerMemoryCommand(program) {
269
305
  .action(async (text, options) => {
270
306
  try {
271
307
  const ctx = await bootstrap({ verbose: program.opts().verbose });
272
- if (!ctx.db) {
308
+ const service = await resolveCanonicalMemory(ctx);
309
+ if (!ctx.db && !service.decision.canonical) {
273
310
  logger.error("Database not available");
274
311
  process.exit(1);
275
312
  }
276
- const db = ctx.db.getDatabase();
277
- const entry = addMemory(db, text, {
313
+ const normalizedOptions = {
278
314
  category: options.category,
279
315
  importance: Math.max(
280
316
  1,
281
317
  Math.min(5, parseInt(options.importance) || 3),
282
318
  ),
283
- });
319
+ };
320
+ let entry;
321
+ if (service.decision.canonical) {
322
+ entry = await service.add(text, normalizedOptions);
323
+ } else {
324
+ if (service.decision.shadow) {
325
+ service.validateLegacyProposal(text, normalizedOptions);
326
+ }
327
+ entry = addMemory(ctx.db.getDatabase(), text, normalizedOptions);
328
+ }
284
329
 
285
330
  if (options.json) {
286
331
  console.log(JSON.stringify(entry, null, 2));
@@ -307,14 +352,18 @@ export function registerMemoryCommand(program) {
307
352
  .action(async (query, options) => {
308
353
  try {
309
354
  const ctx = await bootstrap({ verbose: program.opts().verbose });
310
- if (!ctx.db) {
355
+ const service = await resolveCanonicalMemory(ctx);
356
+ if (!ctx.db && !service.decision.canonical) {
311
357
  logger.error("Database not available");
312
358
  process.exit(1);
313
359
  }
314
- const db = ctx.db.getDatabase();
315
- const results = searchMemory(db, query, {
316
- limit: Math.max(1, parseInt(options.limit) || 20),
317
- });
360
+ const limit = Math.max(1, parseInt(options.limit) || 20);
361
+ const recalled = service.decision.canonical
362
+ ? await service.search(query, { limit })
363
+ : null;
364
+ const results = service.decision.canonical
365
+ ? recalled.entries
366
+ : searchMemory(ctx.db.getDatabase(), query, { limit });
318
367
 
319
368
  if (options.json) {
320
369
  console.log(JSON.stringify(results, null, 2));
@@ -351,14 +400,28 @@ export function registerMemoryCommand(program) {
351
400
  .action(async (id) => {
352
401
  try {
353
402
  const ctx = await bootstrap({ verbose: program.opts().verbose });
354
- if (!ctx.db) {
403
+ const service = await resolveCanonicalMemory(ctx);
404
+ if (!ctx.db && !service.decision.canonical) {
355
405
  logger.error("Database not available");
356
406
  process.exit(1);
357
407
  }
358
- const db = ctx.db.getDatabase();
359
- const ok = deleteMemory(db, id);
408
+ const deletion = service.decision.canonical
409
+ ? await service.delete(id)
410
+ : null;
411
+ const ok = service.decision.canonical
412
+ ? deletion?.status === "purged"
413
+ : deleteMemory(ctx.db.getDatabase(), id);
360
414
  if (ok) {
361
- logger.success("Memory entry deleted");
415
+ logger.success(
416
+ service.decision.canonical
417
+ ? `Memory entry deleted (${deletion.digest})`
418
+ : "Memory entry deleted",
419
+ );
420
+ } else if (deletion) {
421
+ logger.warn(
422
+ `Memory deletion is ${deletion.status}; reconcile request ${deletion.requestId} before treating it as globally purged`,
423
+ );
424
+ process.exitCode = 2;
362
425
  } else {
363
426
  logger.error(`Memory entry not found: ${id}`);
364
427
  }
@@ -370,6 +433,35 @@ export function registerMemoryCommand(program) {
370
433
  }
371
434
  });
372
435
 
436
+ memory
437
+ .command("reconcile")
438
+ .description("Resume a pending canonical memory deletion")
439
+ .argument("<operation-id>", "Deletion request ID")
440
+ .option("--json", "Output the reconciliation receipt as JSON")
441
+ .action(async (operationId, options) => {
442
+ try {
443
+ const ctx = await bootstrap({ verbose: program.opts().verbose });
444
+ const service = await resolveCanonicalMemory(ctx);
445
+ if (!service.decision.canonical) {
446
+ throw new Error("memory reconcile requires canonical Context/Memory");
447
+ }
448
+ const result = await service.reconcile(operationId);
449
+ if (options.json) console.log(JSON.stringify(result, null, 2));
450
+ else if (result.status === "purged") {
451
+ logger.success(`Memory deletion reconciled: ${result.digest}`);
452
+ } else {
453
+ logger.warn(
454
+ `Memory deletion remains ${result.status}: ${result.reason || operationId}`,
455
+ );
456
+ process.exitCode = 2;
457
+ }
458
+ await shutdown();
459
+ } catch (err) {
460
+ logger.error(`Failed: ${err.message}`);
461
+ process.exit(1);
462
+ }
463
+ });
464
+
373
465
  // memory daily
374
466
  memory
375
467
  .command("daily")
@@ -382,6 +474,7 @@ export function registerMemoryCommand(program) {
382
474
  try {
383
475
  const ctx = await bootstrap({ verbose: program.opts().verbose });
384
476
  const memoryDir = getMemoryDir(ctx.env.dataDir);
477
+ const service = await resolveCanonicalMemory(ctx);
385
478
 
386
479
  if (options.list) {
387
480
  const notes = listDailyNotes(memoryDir);
@@ -402,8 +495,21 @@ export function registerMemoryCommand(program) {
402
495
  }
403
496
 
404
497
  if (options.append) {
405
- const result = appendDailyNote(memoryDir, options.append);
406
- logger.success(`Added to daily note: ${chalk.cyan(result.date)}`);
498
+ const today = new Date().toISOString().slice(0, 10);
499
+ if (service.decision.canonical) {
500
+ await service.addScoped(options.append, {
501
+ scope: "user",
502
+ scopeId: "local-user",
503
+ category: "daily-note",
504
+ tags: ["daily-note", `date:${today}`],
505
+ source: "cli-memory-daily",
506
+ evidenceStore: "cli-command",
507
+ evidenceId: `daily-${today}`,
508
+ });
509
+ } else {
510
+ appendDailyNote(memoryDir, options.append);
511
+ }
512
+ logger.success(`Added to daily note: ${chalk.cyan(today)}`);
407
513
  await shutdown();
408
514
  return;
409
515
  }
@@ -443,23 +549,23 @@ export function registerMemoryCommand(program) {
443
549
  .option("--json", "Output as JSON")
444
550
  .action(async (query, options) => {
445
551
  try {
446
- const { getMemoryStore } =
447
- await import("../lib/session-core-singletons.js");
448
- const store = getMemoryStore();
552
+ const { service, legacyStore } = await resolveScopedMemory();
449
553
  const tags = options.tags
450
554
  ? options.tags
451
555
  .split(",")
452
556
  .map((t) => t.trim())
453
557
  .filter(Boolean)
454
558
  : null;
455
- const results = store.recall({
456
- query: query || "",
559
+ const recallOptions = {
457
560
  scope: options.scope,
458
561
  scopeId: options.scopeId,
459
562
  category: options.category,
460
563
  tags,
461
564
  limit: Math.max(1, parseInt(options.limit) || 10),
462
- });
565
+ };
566
+ const results = service.decision.canonical
567
+ ? (await service.recallScoped(query || "", recallOptions)).results
568
+ : legacyStore.recall({ query: query || "", ...recallOptions });
463
569
 
464
570
  if (options.json) {
465
571
  console.log(JSON.stringify(results, null, 2));
@@ -494,22 +600,28 @@ export function registerMemoryCommand(program) {
494
600
  .option("--json", "Output as JSON")
495
601
  .action(async (content, options) => {
496
602
  try {
497
- const { getMemoryStore } =
498
- await import("../lib/session-core-singletons.js");
499
- const store = getMemoryStore();
603
+ const { service, legacyStore } = await resolveScopedMemory();
500
604
  const tags = options.tags
501
605
  ? options.tags
502
606
  .split(",")
503
607
  .map((t) => t.trim())
504
608
  .filter(Boolean)
505
609
  : [];
506
- const m = store.add({
610
+ const proposal = {
507
611
  scope: options.scope,
508
612
  scopeId: options.scopeId || null,
509
613
  category: options.category,
510
- content,
511
614
  tags,
512
- });
615
+ };
616
+ let m;
617
+ if (service.decision.canonical) {
618
+ m = await service.addScoped(content, proposal);
619
+ } else {
620
+ if (service.decision.shadow) {
621
+ service.validateLegacyScopedProposal(content, proposal);
622
+ }
623
+ m = legacyStore.add({ content, ...proposal });
624
+ }
513
625
  if (options.json) console.log(JSON.stringify(m, null, 2));
514
626
  else
515
627
  logger.success(
@@ -576,11 +688,58 @@ export function registerMemoryCommand(program) {
576
688
  return;
577
689
  }
578
690
 
579
- const result = await consolidateJsonlSession(options.session, {
580
- scope: options.scope,
581
- scopeId: options.scopeId || null,
582
- agentId: options.agentId || null,
583
- });
691
+ const { service } = await resolveScopedMemory();
692
+ let result;
693
+ if (service.decision.canonical) {
694
+ const { readEvents } =
695
+ await import("../harness/jsonl-session-store.js");
696
+ const { defaultMemoryExtractor } =
697
+ await import("@chainlesschain/session-core");
698
+ const events = readEvents(options.session);
699
+ const trace = buildTraceStoreFromJsonl(options.session, events);
700
+ const traceEvents = trace.query(options.session, {
701
+ limit: Number.MAX_SAFE_INTEGER,
702
+ });
703
+ const facts = defaultMemoryExtractor(traceEvents);
704
+ const scope = options.scope || "agent";
705
+ const scopeId =
706
+ scope === "global"
707
+ ? null
708
+ : options.scopeId ||
709
+ (scope === "session"
710
+ ? options.session
711
+ : options.agentId || options.session);
712
+ const written = [];
713
+ for (const [index, fact] of facts.entries()) {
714
+ written.push(
715
+ await service.addScoped(String(fact.content || ""), {
716
+ scope,
717
+ scopeId,
718
+ category: fact.category || "general",
719
+ tags: fact.tags || [],
720
+ score: fact.score,
721
+ source: "cli-session-consolidator",
722
+ evidenceStore: "cli-jsonl-session",
723
+ evidenceId: `${options.session}-${index}`,
724
+ }),
725
+ );
726
+ }
727
+ result = {
728
+ sessionId: options.session,
729
+ scope,
730
+ scopeId,
731
+ eventCount: traceEvents.length,
732
+ factCount: facts.length,
733
+ writtenCount: written.length,
734
+ written,
735
+ };
736
+ } else {
737
+ result = await consolidateJsonlSession(options.session, {
738
+ scope: options.scope,
739
+ scopeId: options.scopeId || null,
740
+ agentId: options.agentId || null,
741
+ });
742
+ }
584
743
  await new Promise((r) => setImmediate(r)); // let adapter flush
585
744
 
586
745
  if (options.json) {
@@ -613,8 +772,16 @@ export function registerMemoryCommand(program) {
613
772
  const ctx = await bootstrap({ verbose: program.opts().verbose });
614
773
  const memoryDir = getMemoryDir(ctx.env.dataDir);
615
774
  const content = getMemoryFile(memoryDir);
775
+ const service = await resolveCanonicalMemory(ctx);
616
776
 
617
777
  if (options.edit) {
778
+ if (service.decision.canonical) {
779
+ const error = new Error(
780
+ "MEMORY.md is a read-only legacy projection after canonical cutover; use 'cc memory add' instead",
781
+ );
782
+ error.code = "legacy_writer_fenced";
783
+ throw error;
784
+ }
618
785
  const editor =
619
786
  process.env.EDITOR ||
620
787
  process.env.VISUAL ||
@@ -31,12 +31,29 @@ import {
31
31
  autoFailStuckPcompRunsV2,
32
32
  getPromptCompressorGovStatsV2,
33
33
  } from "../lib/prompt-compressor.js";
34
+ import {
35
+ assertLegacyMutationAllowed,
36
+ resolveCliContextMemoryCutover,
37
+ } from "../lib/context-memory-kernel/authority.js";
34
38
 
35
39
  export function registerPromcompCommand(program) {
36
40
  const pc = program
37
41
  .command("promcomp")
38
42
  .description("Prompt Compressor V2 governance (in-memory, CLI v0.143.0)");
39
43
 
44
+ pc.hook("preAction", (_thisCommand, actionCommand) => {
45
+ const decision = resolveCliContextMemoryCutover({
46
+ scopeKey: `cli:promcomp:${actionCommand.name()}`,
47
+ });
48
+ try {
49
+ assertLegacyMutationAllowed(decision);
50
+ } catch (error) {
51
+ error.message += "; use `cc context` or `cc compact`";
52
+ error.replacement = "cc compact";
53
+ throw error;
54
+ }
55
+ });
56
+
40
57
  pc.command("enums-v2")
41
58
  .description("Show V2 enums")
42
59
  .action(() =>
@@ -8,7 +8,7 @@ import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
8
8
  import path from "node:path";
9
9
 
10
10
  export function registerServeCommand(program) {
11
- program
11
+ const serve = program
12
12
  .command("serve")
13
13
  .description("Start WebSocket server for remote CLI access")
14
14
  .option(
@@ -21,7 +21,15 @@ export function registerServeCommand(program) {
21
21
  )
22
22
  .option(
23
23
  "--app-server-state-dir <path>",
24
- "Owner-controlled rollout directory for --app-server",
24
+ "Owner-controlled rollout directory (JSONL directory or SQLite parent)",
25
+ )
26
+ .option(
27
+ "--app-server-state-path <path>",
28
+ "Exact JSONL directory or SQLite database path for --app-server",
29
+ )
30
+ .option(
31
+ "--app-server-store <backend>",
32
+ "Physical rollout adapter: jsonl or sqlite (default: jsonl)",
25
33
  )
26
34
  .option(
27
35
  "--app-server-queue-cap <n>",
@@ -74,20 +82,32 @@ export function registerServeCommand(program) {
74
82
  if (opts.appServerWebsocket && !opts.appServer) {
75
83
  throw new Error("--app-server-websocket requires --app-server");
76
84
  }
85
+ if (opts.appServerStateDir && opts.appServerStatePath) {
86
+ throw new Error(
87
+ "--app-server-state-dir and --app-server-state-path are mutually exclusive",
88
+ );
89
+ }
77
90
  if (opts.appServer) {
78
91
  const [
79
92
  { runStdioAppServer },
80
- { JsonlRolloutStore },
93
+ { closeRolloutStore, createRolloutStore },
81
94
  { CliAgentKernelAdapter },
82
95
  ] = await Promise.all([
83
96
  import("../lib/app-server/stdio-transport.js"),
84
- import("../lib/app-server/rollout-store.js"),
97
+ import("../lib/app-server/rollout-store-factory.js"),
85
98
  import("../lib/app-server/cli-agent-kernel-adapter.js"),
86
99
  ]);
87
100
  const stateDirectory = opts.appServerStateDir
88
101
  ? path.resolve(opts.appServerStateDir)
89
102
  : undefined;
90
- const store = new JsonlRolloutStore({ directory: stateDirectory });
103
+ const statePath = opts.appServerStatePath
104
+ ? path.resolve(opts.appServerStatePath)
105
+ : undefined;
106
+ const store = createRolloutStore({
107
+ backend: opts.appServerStore,
108
+ directory: stateDirectory,
109
+ location: statePath,
110
+ });
91
111
  const cwd = opts.project ? path.resolve(opts.project) : process.cwd();
92
112
  const maxQueuedRequests = Math.max(
93
113
  1,
@@ -127,14 +147,19 @@ export function registerServeCommand(program) {
127
147
  process.off("SIGTERM", shutdown);
128
148
  host.off("error", fail);
129
149
  await host.close();
150
+ closeRolloutStore(store);
130
151
  }
131
152
  return;
132
153
  }
133
- await runStdioAppServer({
134
- store,
135
- kernel: new CliAgentKernelAdapter({ cwd }),
136
- maxQueuedRequests,
137
- });
154
+ try {
155
+ await runStdioAppServer({
156
+ store,
157
+ kernel: new CliAgentKernelAdapter({ cwd }),
158
+ maxQueuedRequests,
159
+ });
160
+ } finally {
161
+ closeRolloutStore(store);
162
+ }
138
163
  return;
139
164
  }
140
165
  const runtime = createAgentRuntimeFactory().createServerRuntime({
@@ -156,4 +181,63 @@ export function registerServeCommand(program) {
156
181
  process.exit(1);
157
182
  }
158
183
  });
184
+
185
+ serve
186
+ .command("migrate-rollouts")
187
+ .description(
188
+ "Verify or copy canonical rollouts between physical storage adapters",
189
+ )
190
+ .requiredOption("--from <backend>", "Source adapter: jsonl or sqlite")
191
+ .requiredOption(
192
+ "--from-path <path>",
193
+ "Source JSONL directory or SQLite database file",
194
+ )
195
+ .requiredOption("--to <backend>", "Target adapter: jsonl or sqlite")
196
+ .requiredOption(
197
+ "--to-path <path>",
198
+ "Target JSONL directory or SQLite database file",
199
+ )
200
+ .option(
201
+ "--thread <id...>",
202
+ "Migrate only the named thread ids (otherwise enumerate the source)",
203
+ )
204
+ .option(
205
+ "--apply",
206
+ "Copy verified records; without this flag the command is a dry run",
207
+ )
208
+ .action(async (opts) => {
209
+ const { closeRolloutStore, createRolloutStore } =
210
+ await import("../lib/app-server/rollout-store-factory.js");
211
+ let source;
212
+ let target;
213
+ try {
214
+ source = createRolloutStore({
215
+ backend: opts.from,
216
+ location: path.resolve(opts.fromPath),
217
+ });
218
+ target = createRolloutStore({
219
+ backend: opts.to,
220
+ location: path.resolve(opts.toPath),
221
+ });
222
+ const result = source.migrate({
223
+ targetStore: target,
224
+ threadIds: opts.thread || null,
225
+ dryRun: opts.apply !== true,
226
+ });
227
+ process.stdout.write(
228
+ `${JSON.stringify(
229
+ {
230
+ ...result,
231
+ source: { backend: source.backend, location: source.location },
232
+ target: { backend: target.backend, location: target.location },
233
+ },
234
+ null,
235
+ 2,
236
+ )}\n`,
237
+ );
238
+ } finally {
239
+ closeRolloutStore(target);
240
+ closeRolloutStore(source);
241
+ }
242
+ });
159
243
  }
@@ -1463,9 +1463,8 @@ export function registerSessionCommand(program) {
1463
1463
  await import("../lib/session-core-singletons.js");
1464
1464
  const gate = await getApprovalGate();
1465
1465
  if (options.set) {
1466
- gate.setSessionPolicy(id, options.set);
1467
- // give persistence a tick before the CLI process exits
1468
- await new Promise((r) => setImmediate(r));
1466
+ await gate.setSessionPolicy(id, options.set);
1467
+ await gate.awaitPersistence?.();
1469
1468
  logger.success(
1470
1469
  `Session ${chalk.gray(id.slice(0, 12))} policy → ${chalk.cyan(options.set)}`,
1471
1470
  );
@@ -3283,6 +3283,13 @@ export function registerTeamCommand(program, { logger } = {}) {
3283
3283
  tasksByGovernanceKey.get(governanceKey)?.push(task);
3284
3284
  }
3285
3285
  for (const [key, tasks] of tasksByGovernanceKey) {
3286
+ // A unit settled by afterTask is immutable. Graph cancellation can
3287
+ // subsequently project the registry task as cancelled; do not mask
3288
+ // the original terminal outcome with a forbidden second settlement.
3289
+ const currentStatus = collaborationUnits.get(key)?.status;
3290
+ if (["completed", "failed", "cancelled"].includes(currentStatus)) {
3291
+ continue;
3292
+ }
3286
3293
  const states = tasks.map((task) =>
3287
3294
  String(task.status || "").toLowerCase(),
3288
3295
  );
@@ -3295,7 +3302,6 @@ export function registerTeamCommand(program, { logger } = {}) {
3295
3302
  )
3296
3303
  ? "cancelled"
3297
3304
  : "failed";
3298
- if (collaborationUnits.get(key)?.status === status) continue;
3299
3305
  settleGovernance(key, status, {
3300
3306
  endedAt: Date.now(),
3301
3307
  });