chainlesschain 0.165.2 → 0.165.4

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 (210) hide show
  1. package/README.md +151 -29
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/assets/{AIOps-lS1R0Cza.js → AIOps-C__nnraW.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BmlgBPsj.js → ActionButton-CsKWHEZ-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CNKczv1S.js → Analytics-BhIjfjWO.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BuZGJARQ.js → AppLayout-BjuXFzWZ.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Dm73Sl-O.js → Artifacts-k6whDkZJ.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BGMW7A5e.js → Audit-C4FBMYRh.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BQ6M54JR.js → BackgroundAgents-C_vRrSXk.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DBzGP0bR.js → Backup-CngFZeVp.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D1mLCoOV.js → BaseInput-B_H9EBRm.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BUfcN7p8.js → Chat-DLEC5kt7.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Du0Yg5Pi.js → Checkbox-m3ClR4xh.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B2RXziHW.js → Codegen-CmLSFrgp.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DWhekOrR.js → Col-DFGQteHN.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-HQhrkon4.js → Community-EUUVORHE.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-izHNb4uz.js → Compact-2PSg0Yr7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BDwLy41-.js → Compliance-CcKur7gB.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DFJhLa7K.js → Cowork-DK_Fezfa.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DYY9RG7-.js → Cron-Dbw89xl7.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-rr7tJTtv.js → Crosschain-CH66h_Ec.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D2sfHRLi.js → DID-D1igRb17.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-q_eGdhha.js → Dashboard-DVAsrobk.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Cufrh2Bz.js → Dropdown-Dl7W8AQs.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-B-kdv10f.js → EmailListRenderer-D5tpaEQC.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D21XjgfG.js → FamilyGuardDashboard-O_VQf8gq.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-CAwRTLZH.js → Federation-BTVcgS9n.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-vx3daNDF.js → FormItemContext-BRnkJAIz.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-CRWY2wU4.js → GenericCardRenderer-8OWSCkDj.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Q6SwauyD.js → Git-WXLYTQj2.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BJ1q4IQZ.js → Governance-BezaUhtc.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CSWjROgD.js → Inference-CuRay3Gu.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-fzuQsWuY.js → KnowledgeGraph-DfWLDW1m.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DVF8Mnns.js → Logs-C55y2pPY.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-BQP7LOA4.js → Marketplace-Dk08Uycg.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BNlJCmNc.js → McpTools-C11fSB5V.js} +4 -4
  39. package/src/assets/web-panel/assets/{Memory-DLLg5WQ4.js → Memory-mr0eZc97.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CR2skNAF.js → MobileBridge-C0iCSRbb.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-BxVavObl.js → MobileProjects-CY-xMG8Z.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-B17pgqMI.js → Mtc-Bplqc_Wc.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-4UmV5cIL.js → MtcAudit-BlzwsoSM.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-DoMEXEcU.js → Multisig-BBLmTty6.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-h9DMXFX4.js → NLProgramming-DtT1uf1W.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Cihn-xX8.js → Notes-DcqQAxTK.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BE6ZGa3R.js → NotificationSettings-cb0kWoZe.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-CnwojoSI.js → OrderTableRenderer-kw9HZQNN.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B2vpwmjb.js → Organization-DlTlbkUN.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-C4z28R0-.js → Overflow-pp1qs-oY.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BVlFkwhW.js → P2P-BESLnyYz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-BXbEdL5B.js → PdhVaultBrowser-B-J1mGuf.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C28xs4lp.js → Permissions-B36PeT1_.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dgl_rBjM.js → PersonalDataHub-CTK2ad-3.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-3QUIhrKI.js → Pipeline-zJNGXsac.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-8Gh33OZ5.js → Privacy-b9fz0Qf0.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BNmg4tZi.js → ProjectInit-DjZbZgiB.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-vgMfeCf9.js → ProjectSettings-C-hHJXlD.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CXoOa8eX.js → Providers-Dz-CAYYU.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-BhfTF0oS.js → QrScannerModal-A0yoQ3-3.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-C746HEAj.js → QuickAsk-DrFgFJNC.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-BSej8Eo0.js → Recommend-KC8hF1g4.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-f3gmnlG3.js → RemoteSession-DGTPIk6u.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-CyvybpkN.js → Reputation-QmbwM7Yk.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DwV2PeYn.js → Row-BxjJylia.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-11GrzjZy.js → RssFeed-B7Wda1J6.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-BjKXkrAY.js → Search-_plQ_YSA.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-eWiFb9Yk.js → Security-CD2YJZfx.js} +2 -2
  70. package/src/assets/web-panel/assets/{Services-CdCsMAtt.js → Services-qQE7NmwE.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-4Q2UTKQ5.js → Skeleton-DgQqkFf7.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-v4rtYrRj.js → Skills-C4C0oFFt.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-CRhsFvd_.js → Sla-Px2N2B5c.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-DN6C3lQd.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-D16zonl7.js → SyncSettings-jm5aH_m7.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-Xxozz0i_.js → Tasks-DlkJcv67.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CXJpPtCT.js → Templates-DyrTHUBs.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-XRV0L1ZF.js → Tenant-mC434PtL.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-CYuO1i_w.js → Terminal-o0_s3NgK.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-BXqitWsu.js → TimelineRenderer-DAGlAXOw.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BvPrDHIy.js → Tokens-BnulS_bs.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DhCrSTf5.js → Trigger-suQbVXYM.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DmsuZD6K.js → Trust-DbIJAPo5.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D_yrts5C.js → UkeySign-CQNpbIHi.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-B01ihPrm.js → VideoEditing-D8aWCERk.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-DpUjKa-N.js → Wallet-CuLpYfZc.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CL07yON6.js → WebAuthn-CsfG8ZMc.js} +2 -2
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CLMflnRr.js → WorkflowEditor-BYsEAZbd.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DtUqe8h_.js → chat-FT4Um3-I.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DPKrgVfy.js → colors-CKbS_Wlt.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BTt2GtOm.js → compact-item-CFJtzuJM.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-D_VeUc1J.js → createContext-B9kSRW6K.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-1kndiylj.js → hasIn-DR-x0Xpi.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-dVc-CXY4.js → index-7jHr_A_k.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DFIZ_1Sf.js → index-B3ZX81mK.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-fk2Rjacw.js → index-B7osrXqy.js} +3 -3
  98. package/src/assets/web-panel/assets/{index-CHG-KcS4.js → index-BGbPnC5x.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Dbbymxpj.js → index-BI5hP_qy.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BaZAbw9A.js → index-BK3TiKVq.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CzjkKUmR.js → index-BVPU43b1.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BAXfRKfG.js → index-BW-t9n-q.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-8nz_fmlj.js → index-BfFCQHL3.js} +1 -1
  104. package/src/assets/web-panel/assets/index-Bizb4hkw.js +1 -0
  105. package/src/assets/web-panel/assets/{index-DdkplL9R.js → index-Bt4fS2eL.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DG2MZQ3f.js → index-BwR7yc2h.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DfKBRdSS.js → index-Bzz0C1BZ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-GsoUQ2M7.js → index-C2JvmYRc.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-l1BETrDb.js → index-CGaXUsIs.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-4bna2_SR.js → index-CJmIQ9XR.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DfGl8CqG.js → index-C_enk9I_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D95OFht7.js → index-Cr2FLUsD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DsJCDUJG.js → index-CvrCCqJt.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-sDoMHTNA.js → index-D4LfPvWA.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-By5n8up9.js → index-DMGmg497.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-ocf06EVQ.js → index-DShSkww-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bhudc_Ez.js → index-DTxNy0ZU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CX81qSM4.js → index-DW4BWjTk.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BlDNVgBt.js → index-DWdqx7zI.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CcO04eDn.js → index-Dap9c3eD.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dwqmtk65.js → index-DcfxhKXR.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-2eyAXE3d.js → index-DdkIhfi-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-brCInrzq.js → index-DeSgw-WV.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DJ8vXGOa.js → index-DiNUEpSQ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BHpBMWCh.js → index-DjEP7WkH.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-m31Ka8hZ.js → index-DtkFqPVA.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CtF7EN49.js → index-KqDaCApw.js} +1 -1
  128. package/src/assets/web-panel/assets/index-OHSl-xCh.js +1 -0
  129. package/src/assets/web-panel/assets/{index-B9KvcS7R.js → index-OSzjTzGM.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CauoBQkH.js → index-QBSeNVO3.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-FzdwcSy2.js → index-WE08gMJP.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DxdTdBix.js → index-r2VI1Ikk.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BepLZwgB.js → index-tqSEHPRT.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CvyYJd7z.js → initDefaultProps-Dd7n7VgI.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-DYZkhUdz.js → motion-BwxouRw1.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-slnJRVT1.js → move-DObN0PG9.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-DVc0CKmy.js → mtc-parser-B3nOUQc7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BCXAtHCq.js → omit-o9WU2Nbl.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DBsemz_K.js → pickAttrs-CL_vvfQ_.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BRtkJ-nv.js → placementArrow-CYrM2tyK.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-Cebq7EZn.js → responsiveObserve-k_06cQ96.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DT7qvId2.js → slide-CPKG0pxS.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-pQiITLkG.js → statusUtils-BDDEeLTw.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-c-19BVKQ.js → styleChecker-Cmb7RTh7.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DsS5-0bE.js → useFlexGapSupport-e2IedC4N.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-CxGiMe5n.js → useFs-CE_gxVnm.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-D9btVID5.js → usePersonalDataHub-BkMIIKMz.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CUYFsFEN.js → vnode-DW886XV1.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CXmn_35j.js → zoom-Dwo_adaf.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +105 -35
  153. package/src/commands/artifacts.js +363 -33
  154. package/src/commands/cowork.js +202 -36
  155. package/src/commands/session-budget.js +155 -0
  156. package/src/commands/session-location.js +948 -0
  157. package/src/commands/session.js +72 -46
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/artifact-protocol.js +77 -13
  160. package/src/gateways/ws/session-protocol.js +391 -24
  161. package/src/gateways/ws/ws-agent-handler.js +191 -14
  162. package/src/gateways/ws/ws-server.js +14 -3
  163. package/src/gateways/ws/ws-session-gateway.js +101 -5
  164. package/src/harness/jsonl-session-store.js +1210 -0
  165. package/src/lib/agent-team/team-runner.js +43 -13
  166. package/src/lib/artifact-access-ledger.js +461 -0
  167. package/src/lib/artifact-cleanup-ledger.js +861 -0
  168. package/src/lib/artifact-deletion-ledger.js +677 -0
  169. package/src/lib/artifact-store.js +256 -51
  170. package/src/lib/background-agent-keeper-protocol.js +75 -4
  171. package/src/lib/background-agent-launch-barrier.js +74 -0
  172. package/src/lib/background-agent-supervisor.js +149 -5
  173. package/src/lib/background-turn-bootstrap-protocol.js +4 -0
  174. package/src/lib/command-lifecycle-report.js +8 -4
  175. package/src/lib/cowork-adapter.js +9 -5
  176. package/src/lib/cowork-task-runner.js +20 -0
  177. package/src/lib/cowork-workflow.js +178 -20
  178. package/src/lib/direct-model-usage.js +62 -22
  179. package/src/lib/dynamic-workflow-runtime.js +3184 -111
  180. package/src/lib/execution-location-result-apply.js +339 -0
  181. package/src/lib/execution-location-result-artifact.js +271 -0
  182. package/src/lib/execution-location-result-review.js +253 -0
  183. package/src/lib/execution-location-result-store.js +331 -0
  184. package/src/lib/execution-location-result.js +617 -0
  185. package/src/lib/execution-location-target.js +236 -1
  186. package/src/lib/managed-tool-checkpoint.js +47 -4
  187. package/src/lib/process-execution-broker/workspace-transaction.js +3 -0
  188. package/src/lib/session-budget-production-root.js +376 -0
  189. package/src/lib/session-budget-runtime.js +109 -18
  190. package/src/lib/session-budget-usage.js +63 -0
  191. package/src/lib/session-host-snapshot.js +19 -2
  192. package/src/lib/session-resource-budget.js +766 -105
  193. package/src/lib/sub-agent-context.js +69 -22
  194. package/src/lib/web-ui-server.js +12 -1
  195. package/src/lib/with-file-lock.js +175 -26
  196. package/src/repl/agent-repl.js +237 -16
  197. package/src/runtime/agent-core.js +123 -0
  198. package/src/runtime/headless-runner.js +135 -46
  199. package/src/runtime/headless-stream.js +133 -25
  200. package/src/runtime/policies/agent-policy.js +10 -0
  201. package/src/workers/background-agent-keeper.js +112 -19
  202. package/src/workers/background-agent-worker.js +383 -134
  203. package/src/workers/background-turn-bootstrap.js +13 -8
  204. package/src/assets/web-panel/assets/ChatBubbleRenderer-CY5m8ZHg.js +0 -1
  205. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +0 -1
  206. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +0 -1
  207. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +0 -1
  208. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +0 -1
  209. package/src/assets/web-panel/assets/index-CPcM-eqo.js +0 -1
  210. package/src/assets/web-panel/assets/index-xeSyVoRe.js +0 -1
@@ -5,10 +5,10 @@
5
5
  * `~/.chainlesschain/artifacts/`; this command is the user-facing surface:
6
6
  *
7
7
  * cc artifacts list [--session <id>] [--kind <k>] [--json]
8
- * cc artifacts show <id> [--json] metadata + stored path
9
- * cc artifacts open <id> print the stored path (pipe/open)
10
- * cc artifacts remove <id>
11
- * cc artifacts clean [--json] drop expired artifacts (TTL)
8
+ * cc artifacts show <id> [--json] public metadata + integrity
9
+ * cc artifacts open <id> audit access, then print local path
10
+ * cc artifacts remove <id> settle managed-copy removal
11
+ * cc artifacts clean [--cleanup-id <id>] settle expired-artifact batch
12
12
  */
13
13
 
14
14
  import chalk from "chalk";
@@ -18,6 +18,21 @@ import {
18
18
  ArtifactStore,
19
19
  publicArtifactMetadata,
20
20
  } from "../lib/artifact-store.js";
21
+ import {
22
+ ARTIFACT_ACCESS_ACTIONS,
23
+ ARTIFACT_ACCESS_CLIENTS,
24
+ authorizeArtifactContentAccess,
25
+ readArtifactAccessLedger,
26
+ } from "../lib/artifact-access-ledger.js";
27
+ import {
28
+ ARTIFACT_DELETION_CLIENTS,
29
+ readArtifactDeletionLedger,
30
+ settleArtifactDeletion,
31
+ } from "../lib/artifact-deletion-ledger.js";
32
+ import {
33
+ readArtifactCleanupLedger,
34
+ settleArtifactCleanup,
35
+ } from "../lib/artifact-cleanup-ledger.js";
21
36
  import {
22
37
  assessDeliveryEvidence,
23
38
  createDeliveryEvidenceRecord,
@@ -58,7 +73,7 @@ export function registerArtifactsCommand(program) {
58
73
 
59
74
  cmd
60
75
  .command("show <id>")
61
- .description("Show one artifact's metadata + stored path")
76
+ .description("Show one artifact's public metadata and integrity")
62
77
  .option("--json", "Machine-readable JSON output")
63
78
  .action((id, options) => {
64
79
  process.exitCode = runArtifactsShow(id, options);
@@ -66,28 +81,92 @@ export function registerArtifactsCommand(program) {
66
81
 
67
82
  cmd
68
83
  .command("open <id>")
69
- .description("Print the artifact's stored file path (for piping/opening)")
84
+ .description("Authorize local content access and print the stored path")
70
85
  .action((id) => {
71
86
  process.exitCode = runArtifactsOpen(id);
72
87
  });
73
88
 
89
+ cmd
90
+ .command("access <id>")
91
+ .description(
92
+ "Authorize one official client action and record content-free access lineage",
93
+ )
94
+ .requiredOption(
95
+ "--client <client>",
96
+ `Declared client (${ARTIFACT_ACCESS_CLIENTS.join("|")})`,
97
+ )
98
+ .requiredOption(
99
+ "--action <action>",
100
+ `Requested action (${ARTIFACT_ACCESS_ACTIONS.join("|")})`,
101
+ )
102
+ .option("--access-id <id>", "Stable id for response-loss retry")
103
+ .option("--json", "Machine-readable authorization and local path")
104
+ .action((id, options) => {
105
+ process.exitCode = runArtifactsAccess(id, options);
106
+ });
107
+
108
+ cmd
109
+ .command("access-log")
110
+ .description("Verify and display the content-free artifact access ledger")
111
+ .option("--artifact <id>", "Only events for one artifact id")
112
+ .option("--json", "Machine-readable verified ledger projection")
113
+ .action((options) => {
114
+ process.exitCode = runArtifactsAccessLog(options);
115
+ });
116
+
74
117
  cmd
75
118
  .command("remove <id>")
76
119
  .alias("rm")
77
- .description("Remove one artifact (stored copy + metadata)")
120
+ .description("Settle and audit removal of one managed artifact copy")
121
+ .option(
122
+ "--client <client>",
123
+ `Declared client (${ARTIFACT_DELETION_CLIENTS.join("|")})`,
124
+ "cli",
125
+ )
126
+ .option("--deletion-id <id>", "Stable id for response-loss recovery")
78
127
  .option("--json", "Machine-readable JSON output")
79
128
  .action((id, options) => {
80
129
  process.exitCode = runArtifactsRemove(id, options);
81
130
  });
82
131
 
132
+ cmd
133
+ .command("deletion-log")
134
+ .description(
135
+ "Verify and display the content-free deletion settlement ledger",
136
+ )
137
+ .option("--artifact <id>", "Only events for one artifact id")
138
+ .option("--deletion <id>", "Only events for one deletion id")
139
+ .option("--json", "Machine-readable verified ledger projection")
140
+ .action((options) => {
141
+ process.exitCode = runArtifactsDeletionLog(options);
142
+ });
143
+
83
144
  cmd
84
145
  .command("clean")
85
- .description("Remove expired artifacts (past their TTL)")
146
+ .description("Settle and audit one frozen batch of expired artifacts")
147
+ .option(
148
+ "--client <client>",
149
+ `Declared client (${ARTIFACT_DELETION_CLIENTS.join("|")})`,
150
+ "cli",
151
+ )
152
+ .option("--cleanup-id <id>", "Stable batch id for response-loss recovery")
86
153
  .option("--json", "Machine-readable JSON output")
87
154
  .action((options) => {
88
155
  process.exitCode = runArtifactsClean(options);
89
156
  });
90
157
 
158
+ cmd
159
+ .command("cleanup-log")
160
+ .description(
161
+ "Verify and display the content-free cleanup settlement ledger",
162
+ )
163
+ .option("--cleanup <id>", "Only events for one cleanup id")
164
+ .option("--artifact <id>", "Only batches containing one artifact id")
165
+ .option("--json", "Machine-readable verified ledger projection")
166
+ .action((options) => {
167
+ process.exitCode = runArtifactsCleanupLog(options);
168
+ });
169
+
91
170
  cmd
92
171
  .command("select-gates <input>")
93
172
  .description(
@@ -193,7 +272,13 @@ export function runArtifactsList(options = {}, deps = {}) {
193
272
  entries = entries.filter((e) => e.kind === String(options.kind));
194
273
  }
195
274
  if (options.json) {
196
- console.log(JSON.stringify({ artifacts: entries }, null, 2));
275
+ console.log(
276
+ JSON.stringify(
277
+ { artifacts: entries.map(publicArtifactMetadata) },
278
+ null,
279
+ 2,
280
+ ),
281
+ );
197
282
  return 0;
198
283
  }
199
284
  if (entries.length === 0) {
@@ -227,8 +312,7 @@ export function runArtifactsShow(id, options = {}, deps = {}) {
227
312
  return 1;
228
313
  }
229
314
  const payload = {
230
- ...entry,
231
- storedPath: store.storedPath(entry),
315
+ ...publicArtifactMetadata(entry),
232
316
  integrity: store.verifyIntegrity(entry),
233
317
  };
234
318
  if (options.json) {
@@ -242,44 +326,290 @@ export function runArtifactsShow(id, options = {}, deps = {}) {
242
326
  }
243
327
 
244
328
  export function runArtifactsOpen(id, deps = {}) {
329
+ return runArtifactsAccess(id, { client: "cli", action: "open" }, deps);
330
+ }
331
+
332
+ export function runArtifactsAccess(id, options = {}, deps = {}) {
245
333
  const store = deps.store || new ArtifactStore();
246
- const entry = store.get(id);
247
- if (!entry) {
248
- console.error(chalk.red(`No artifact with id "${id}".`));
334
+ try {
335
+ const authorization = (
336
+ deps.authorizeArtifactContentAccess || authorizeArtifactContentAccess
337
+ )(
338
+ store,
339
+ {
340
+ artifactId: id,
341
+ client: options.client,
342
+ action: options.action,
343
+ accessId: options.accessId,
344
+ },
345
+ deps.accessOptions || {},
346
+ );
347
+ const payload = {
348
+ schema: "cc-artifact-content-access-authorization/v1",
349
+ access: authorization.access,
350
+ recorded: authorization.recorded,
351
+ storedPath: authorization.storedPath,
352
+ integrity: authorization.integrity,
353
+ };
354
+ if (options.json) {
355
+ console.log(JSON.stringify(payload, null, 2));
356
+ } else {
357
+ console.log(authorization.storedPath);
358
+ }
359
+ return 0;
360
+ } catch (error) {
361
+ if (options.json) {
362
+ console.error(
363
+ JSON.stringify({
364
+ schema: "cc-artifact-content-access-authorization-error/v1",
365
+ authorized: false,
366
+ error: error.message,
367
+ }),
368
+ );
369
+ } else {
370
+ console.error(chalk.red(`Artifact access failed: ${error.message}`));
371
+ }
372
+ return 1;
373
+ }
374
+ }
375
+
376
+ export function runArtifactsAccessLog(options = {}, deps = {}) {
377
+ const store = deps.store || new ArtifactStore();
378
+ try {
379
+ const ledger = (deps.readArtifactAccessLedger || readArtifactAccessLedger)(
380
+ store,
381
+ deps.accessOptions || {},
382
+ );
383
+ const events = options.artifact
384
+ ? ledger.events.filter(
385
+ (event) => event.artifactId === String(options.artifact),
386
+ )
387
+ : ledger.events;
388
+ const projection = {
389
+ ...ledger,
390
+ filtered: Boolean(options.artifact),
391
+ matchedEventCount: events.length,
392
+ events,
393
+ };
394
+ if (options.json) {
395
+ console.log(JSON.stringify(projection, null, 2));
396
+ } else if (events.length === 0) {
397
+ console.log(chalk.dim("No artifact content access events."));
398
+ } else {
399
+ for (const event of events) {
400
+ console.log(
401
+ `${chalk.cyan(event.sequence)} ${event.artifactId} ${event.client}/${event.action} ${event.authorizedAt} ${event.eventDigest}`,
402
+ );
403
+ }
404
+ }
405
+ return 0;
406
+ } catch (error) {
407
+ if (options.json) {
408
+ console.error(
409
+ JSON.stringify({
410
+ schema: "cc-artifact-content-access-ledger-error/v1",
411
+ verified: false,
412
+ error: error.message,
413
+ }),
414
+ );
415
+ } else {
416
+ console.error(chalk.red(`Artifact access log failed: ${error.message}`));
417
+ }
249
418
  return 1;
250
419
  }
251
- console.log(store.storedPath(entry));
252
- return 0;
253
420
  }
254
421
 
255
422
  export function runArtifactsRemove(id, options = {}, deps = {}) {
256
423
  const store = deps.store || new ArtifactStore();
257
- const found = store.remove(id);
258
- if (options.json) {
259
- console.log(JSON.stringify({ removed: found ? id : null, found }));
260
- return found ? 0 : 1;
424
+ const deletionId = String(
425
+ options.deletionId || `delete_${randomUUID().replaceAll("-", "")}`,
426
+ );
427
+ try {
428
+ const result = (deps.settleArtifactDeletion || settleArtifactDeletion)(
429
+ store,
430
+ {
431
+ deletionId,
432
+ artifactId: id,
433
+ reason: "explicit",
434
+ client: options.client || "cli",
435
+ },
436
+ deps.deletionOptions || {},
437
+ );
438
+ if (options.json) {
439
+ console.log(JSON.stringify(result, null, 2));
440
+ return result.found ? 0 : 1;
441
+ }
442
+ if (!result.found) {
443
+ console.error(chalk.red(`No artifact with id "${id}".`));
444
+ return 1;
445
+ }
446
+ console.log(
447
+ chalk.green(`Removed managed copy ${id} (deletion ${deletionId}).`),
448
+ );
449
+ return 0;
450
+ } catch (error) {
451
+ if (options.json) {
452
+ console.error(
453
+ JSON.stringify({
454
+ schema: "cc-artifact-deletion-error/v1",
455
+ deletionId: error.deletionId || deletionId,
456
+ artifactId: String(id),
457
+ settled: false,
458
+ error: error.message,
459
+ }),
460
+ );
461
+ } else {
462
+ console.error(
463
+ chalk.red(
464
+ `Artifact removal ${error.deletionId || deletionId} is not settled: ${error.message}`,
465
+ ),
466
+ );
467
+ }
468
+ return 1;
261
469
  }
262
- if (!found) {
263
- console.error(chalk.red(`No artifact with id "${id}".`));
470
+ }
471
+
472
+ export function runArtifactsDeletionLog(options = {}, deps = {}) {
473
+ const store = deps.store || new ArtifactStore();
474
+ try {
475
+ const ledger = (
476
+ deps.readArtifactDeletionLedger || readArtifactDeletionLedger
477
+ )(store, deps.deletionOptions || {});
478
+ const events = ledger.events.filter(
479
+ (event) =>
480
+ (!options.artifact || event.artifactId === String(options.artifact)) &&
481
+ (!options.deletion || event.deletionId === String(options.deletion)),
482
+ );
483
+ const projection = {
484
+ ...ledger,
485
+ filtered: Boolean(options.artifact || options.deletion),
486
+ matchedEventCount: events.length,
487
+ events,
488
+ };
489
+ if (options.json) {
490
+ console.log(JSON.stringify(projection, null, 2));
491
+ } else if (events.length === 0) {
492
+ console.log(chalk.dim("No artifact deletion settlement events."));
493
+ } else {
494
+ for (const event of events) {
495
+ console.log(
496
+ `${event.sequence}\t${event.phase}\t${event.artifactId}\t${event.deletionId}\t${event.eventDigest}`,
497
+ );
498
+ }
499
+ }
500
+ return 0;
501
+ } catch (error) {
502
+ if (options.json) {
503
+ console.error(
504
+ JSON.stringify({
505
+ schema: "cc-artifact-deletion-ledger-error/v1",
506
+ verified: false,
507
+ error: error.message,
508
+ }),
509
+ );
510
+ } else {
511
+ console.error(
512
+ chalk.red(`Artifact deletion log failed: ${error.message}`),
513
+ );
514
+ }
264
515
  return 1;
265
516
  }
266
- console.log(chalk.green(`Removed ${id}.`));
267
- return 0;
268
517
  }
269
518
 
270
519
  export function runArtifactsClean(options = {}, deps = {}) {
271
520
  const store = deps.store || new ArtifactStore();
272
- const { removed } = store.cleanupExpired();
273
- if (options.json) {
274
- console.log(JSON.stringify({ removed }));
521
+ const cleanupId = String(
522
+ options.cleanupId || `cleanup_${randomUUID().replaceAll("-", "")}`,
523
+ );
524
+ try {
525
+ const result = (deps.settleArtifactCleanup || settleArtifactCleanup)(
526
+ store,
527
+ {
528
+ cleanupId,
529
+ client: options.client || "cli",
530
+ },
531
+ deps.cleanupOptions || {},
532
+ );
533
+ if (options.json) {
534
+ console.log(JSON.stringify(result, null, 2));
535
+ return 0;
536
+ }
537
+ console.log(
538
+ result.removed > 0
539
+ ? chalk.green(
540
+ `Settled cleanup ${cleanupId}: removed ${result.removed} expired artifact(s).`,
541
+ )
542
+ : chalk.dim(`Settled cleanup ${cleanupId}: nothing expired.`),
543
+ );
275
544
  return 0;
545
+ } catch (error) {
546
+ if (options.json) {
547
+ console.error(
548
+ JSON.stringify({
549
+ schema: "cc-artifact-cleanup-error/v1",
550
+ cleanupId: error.cleanupId || cleanupId,
551
+ settled: false,
552
+ ...(error.cleanup ? { cleanup: error.cleanup } : {}),
553
+ error: error.message,
554
+ }),
555
+ );
556
+ } else {
557
+ console.error(
558
+ chalk.red(
559
+ `Artifact cleanup ${error.cleanupId || cleanupId} is not settled: ${error.message}`,
560
+ ),
561
+ );
562
+ }
563
+ return 1;
564
+ }
565
+ }
566
+
567
+ export function runArtifactsCleanupLog(options = {}, deps = {}) {
568
+ const store = deps.store || new ArtifactStore();
569
+ try {
570
+ const ledger = (
571
+ deps.readArtifactCleanupLedger || readArtifactCleanupLedger
572
+ )(store, deps.cleanupOptions || {});
573
+ const events = ledger.events.filter(
574
+ (event) =>
575
+ (!options.cleanup || event.cleanupId === String(options.cleanup)) &&
576
+ (!options.artifact ||
577
+ event.items.some(
578
+ (item) => item.artifactId === String(options.artifact),
579
+ )),
580
+ );
581
+ const projection = {
582
+ ...ledger,
583
+ filtered: Boolean(options.cleanup || options.artifact),
584
+ matchedEventCount: events.length,
585
+ events,
586
+ };
587
+ if (options.json) {
588
+ console.log(JSON.stringify(projection, null, 2));
589
+ } else if (events.length === 0) {
590
+ console.log(chalk.dim("No artifact cleanup settlement events."));
591
+ } else {
592
+ for (const event of events) {
593
+ console.log(
594
+ `${event.sequence}\t${event.phase}\t${event.itemCount}\t${event.cleanupId}\t${event.eventDigest}`,
595
+ );
596
+ }
597
+ }
598
+ return 0;
599
+ } catch (error) {
600
+ if (options.json) {
601
+ console.error(
602
+ JSON.stringify({
603
+ schema: "cc-artifact-cleanup-ledger-error/v1",
604
+ verified: false,
605
+ error: error.message,
606
+ }),
607
+ );
608
+ } else {
609
+ console.error(chalk.red(`Artifact cleanup log failed: ${error.message}`));
610
+ }
611
+ return 1;
276
612
  }
277
- console.log(
278
- removed > 0
279
- ? chalk.green(`Removed ${removed} expired artifact(s).`)
280
- : chalk.dim("Nothing expired."),
281
- );
282
- return 0;
283
613
  }
284
614
 
285
615
  function readJsonFile(inputPath, deps = {}) {