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
@@ -16,12 +16,21 @@ import {
16
16
  } from "./secure-file-identity.js";
17
17
  import { canonicalJson } from "./scheduler-kernel/contract.js";
18
18
  import { executionBroker } from "./process-execution-broker/index.js";
19
+ import {
20
+ MAX_EXECUTION_LOCATION_RESULT_BUNDLE_BYTES,
21
+ normalizeExecutionLocationResultBundle,
22
+ verifyExecutionLocationResultBundle,
23
+ } from "./execution-location-result.js";
19
24
 
20
25
  export const EXECUTION_LOCATION_PROFILE_SCHEMA =
21
26
  "cc-execution-location-profile/v1";
22
27
  export { EXECUTION_LOCATION_TARGET_ATTESTATION_SCHEMA };
23
28
  export const EXECUTION_LOCATION_TARGET_RESUME_SCHEMA =
24
29
  "cc-execution-location-target-resume/v1";
30
+ export const EXECUTION_LOCATION_TARGET_RESULT_COLLECTION_SCHEMA =
31
+ "cc-execution-location-target-result-collection/v1";
32
+ export const EXECUTION_LOCATION_TARGET_RESULT_COLLECTION_REQUEST_SCHEMA =
33
+ "cc-execution-location-target-result-collection-request/v1";
25
34
 
26
35
  const SESSION_LOCATION_AUTHORITY_SCHEMA =
27
36
  "cc-session-execution-location-authority/v1";
@@ -34,6 +43,8 @@ const COMMIT_RE = /^[a-f0-9]{40,64}$/u;
34
43
  const MAX_PROFILE_BYTES = 1024 * 1024;
35
44
  const MAX_PROBE_BYTES = 1024 * 1024;
36
45
  const MAX_REPLICA_BYTES = 64 * 1024 * 1024;
46
+ const RESULT_MEDIA_TYPE_RE =
47
+ /^[a-z0-9][a-z0-9!#$&^_.+-]{0,126}\/[a-z0-9][a-z0-9!#$&^_.+-]{0,126}$/u;
37
48
 
38
49
  function digest(domain, value) {
39
50
  return `sha256:${createHash("sha256")
@@ -480,6 +491,14 @@ function runTargetCommand(profile, cliArgs, deps = {}, options = {}) {
480
491
  ((file, args, spawnOptions) =>
481
492
  executionBroker.spawnSync(file, args, spawnOptions));
482
493
  try {
494
+ const maxBuffer = Number(options.maxBuffer ?? MAX_PROBE_BYTES);
495
+ if (
496
+ !Number.isSafeInteger(maxBuffer) ||
497
+ maxBuffer < 1 ||
498
+ maxBuffer > MAX_EXECUTION_LOCATION_RESULT_BUNDLE_BYTES
499
+ ) {
500
+ throw new Error("target command output boundary is invalid");
501
+ }
483
502
  const result = spawnSync(invocation.file, invocation.args, {
484
503
  origin: "execution-location:target",
485
504
  scope: "execution-location",
@@ -487,7 +506,7 @@ function runTargetCommand(profile, cliArgs, deps = {}, options = {}) {
487
506
  shell: false,
488
507
  encoding: "utf8",
489
508
  timeout: options.interactive ? undefined : 30000,
490
- maxBuffer: options.interactive ? undefined : MAX_PROBE_BYTES,
509
+ maxBuffer: options.interactive ? undefined : maxBuffer,
491
510
  ...(options.input == null ? {} : { input: options.input }),
492
511
  stdio: options.interactive
493
512
  ? "inherit"
@@ -839,6 +858,222 @@ function verifySourceAuthorityBeforeResume(handoff, readSourceAuthority) {
839
858
  });
840
859
  }
841
860
 
861
+ function normalizeResultCollectionItem(entry, label) {
862
+ const mediaType = String(entry?.mediaType || "").toLowerCase();
863
+ const filePath = safePath(entry?.path, `${label} path`);
864
+ if (!RESULT_MEDIA_TYPE_RE.test(mediaType)) {
865
+ throw new TypeError(`${label} media type is invalid`);
866
+ }
867
+ return { mediaType, path: filePath };
868
+ }
869
+
870
+ export function createExecutionLocationTargetResultCollectionRequest(
871
+ input = {},
872
+ ) {
873
+ const profile = normalizeExecutionLocationProfile(input.profile);
874
+ const target = safeName(
875
+ input.target ?? profile.target,
876
+ "result collection target",
877
+ 32,
878
+ );
879
+ if (target !== profile.target) {
880
+ throw new TypeError("result collection target does not match profile");
881
+ }
882
+ const requestId = safeName(
883
+ input.requestId,
884
+ "result collection request id",
885
+ 128,
886
+ );
887
+ const sessionId = safeName(input.sessionId, "result collection session id");
888
+ const resultId = safeName(input.resultId, "result id", 128);
889
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(resultId)) {
890
+ throw new TypeError("result id is invalid");
891
+ }
892
+ const targetFactsDigest = String(
893
+ input.expectedTargetFactsDigest || "",
894
+ ).toLowerCase();
895
+ const handoffId = String(input.expectedHandoffId || "").toLowerCase();
896
+ if (!SHA256_RE.test(targetFactsDigest)) {
897
+ throw new TypeError("expected target facts digest is invalid");
898
+ }
899
+ if (!SHA256_RE.test(handoffId)) {
900
+ throw new TypeError("expected result handoff id is invalid");
901
+ }
902
+ const artifacts = (input.artifacts ?? []).map((entry, index) =>
903
+ normalizeResultCollectionItem(entry, `result artifact ${index}`),
904
+ );
905
+ const evidence = (input.evidence ?? []).map((entry, index) =>
906
+ normalizeResultCollectionItem(entry, `result evidence ${index}`),
907
+ );
908
+ if (artifacts.length + evidence.length > 64) {
909
+ throw new TypeError("result collection item list is invalid");
910
+ }
911
+ const material = {
912
+ schema: EXECUTION_LOCATION_TARGET_RESULT_COLLECTION_REQUEST_SCHEMA,
913
+ requestId,
914
+ sessionId,
915
+ target,
916
+ profileDigest: profile.profileDigest,
917
+ targetFactsDigest,
918
+ handoffId,
919
+ resultId,
920
+ summaryPath: safePath(input.summaryPath, "result summary path"),
921
+ diffPath: safePath(input.diffPath, "result diff path"),
922
+ artifacts,
923
+ evidence,
924
+ };
925
+ return Object.freeze({
926
+ ...material,
927
+ requestDigest: digest(
928
+ "chainlesschain.execution-location.target-result-collection-request.v1\0",
929
+ material,
930
+ ),
931
+ });
932
+ }
933
+
934
+ export function collectExecutionLocationTargetResult(input = {}, deps = {}) {
935
+ const profile = normalizeExecutionLocationProfile(input.profile);
936
+ validateProfileHandoff(profile, input.handoff);
937
+ const expectedTargetFactsDigest = safeString(
938
+ input.expectedTargetFactsDigest,
939
+ "expected target facts digest",
940
+ 80,
941
+ ).toLowerCase();
942
+ if (!SHA256_RE.test(expectedTargetFactsDigest)) {
943
+ throw new Error("expected target facts digest is invalid");
944
+ }
945
+ const sourceBefore = verifySourceAuthorityBeforeResume(
946
+ input.handoff,
947
+ input.readSourceAuthority,
948
+ );
949
+ const attestation = attestExecutionLocationTarget(
950
+ { profile, handoff: input.handoff },
951
+ deps,
952
+ );
953
+ if (attestation.targetFactsDigest !== expectedTargetFactsDigest) {
954
+ throw new Error("target facts digest changed before result collection");
955
+ }
956
+ const resultId = safeName(input.resultId, "result id", 128);
957
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(resultId)) {
958
+ throw new TypeError("result id is invalid");
959
+ }
960
+ const expectedHandoffId = String(input.expectedHandoffId || "");
961
+ if (!SHA256_RE.test(expectedHandoffId)) {
962
+ throw new TypeError("expected result handoff id is invalid");
963
+ }
964
+ const summaryPath = safePath(input.summaryPath, "result summary path");
965
+ const diffPath = safePath(input.diffPath, "result diff path");
966
+ const artifactInput = input.artifacts ?? [];
967
+ const evidenceInput = input.evidence ?? [];
968
+ if (!Array.isArray(artifactInput) || !Array.isArray(evidenceInput)) {
969
+ throw new TypeError("result collection item list is invalid");
970
+ }
971
+ const artifacts = artifactInput.map((entry, index) =>
972
+ normalizeResultCollectionItem(entry, `result artifact ${index}`),
973
+ );
974
+ const evidence = evidenceInput.map((entry, index) =>
975
+ normalizeResultCollectionItem(entry, `result evidence ${index}`),
976
+ );
977
+ if (artifacts.length + evidence.length > 64) {
978
+ throw new TypeError("result collection item list is invalid");
979
+ }
980
+ const request = createExecutionLocationTargetResultCollectionRequest({
981
+ requestId: input.requestId,
982
+ sessionId: input.handoff?.session?.sessionId,
983
+ target: profile.target,
984
+ profile,
985
+ expectedTargetFactsDigest,
986
+ expectedHandoffId,
987
+ resultId,
988
+ summaryPath,
989
+ diffPath,
990
+ artifacts,
991
+ evidence,
992
+ });
993
+ const args = [
994
+ "session",
995
+ "location",
996
+ "result-pack",
997
+ input.handoff.session.sessionId,
998
+ "--result-id",
999
+ resultId,
1000
+ "--summary",
1001
+ summaryPath,
1002
+ "--diff",
1003
+ diffPath,
1004
+ ];
1005
+ for (const entry of artifacts) {
1006
+ args.push("--artifact", `${entry.mediaType}=${entry.path}`);
1007
+ }
1008
+ for (const entry of evidence) {
1009
+ args.push("--evidence", `${entry.mediaType}=${entry.path}`);
1010
+ }
1011
+ args.push("--json");
1012
+ const raw = runTargetCommand(profile, args, deps, {
1013
+ maxBuffer: MAX_EXECUTION_LOCATION_RESULT_BUNDLE_BYTES,
1014
+ });
1015
+ let bundleInput;
1016
+ try {
1017
+ bundleInput = JSON.parse(String(raw));
1018
+ } catch {
1019
+ throw new Error("target result bundle output is not one exact JSON object");
1020
+ }
1021
+ const bundle = normalizeExecutionLocationResultBundle(bundleInput);
1022
+ const sourceAfter = verifySourceAuthorityBeforeResume(
1023
+ input.handoff,
1024
+ input.readSourceAuthority,
1025
+ );
1026
+ const verification = verifyExecutionLocationResultBundle({
1027
+ bundle,
1028
+ sourceAuthority: sourceAfter,
1029
+ expectedHandoffId,
1030
+ });
1031
+ if (
1032
+ bundle.session.handoffId !== expectedHandoffId ||
1033
+ bundle.session.target.profileDigest !== profile.profileDigest ||
1034
+ bundle.session.target.targetEvidenceId !== profile.evidenceId ||
1035
+ bundle.session.target.targetFactsDigest !== expectedTargetFactsDigest ||
1036
+ sourceBefore.headHash !== sourceAfter.headHash ||
1037
+ sourceBefore.eventCount !== sourceAfter.eventCount
1038
+ ) {
1039
+ throw new Error(
1040
+ "target result bundle does not match the accepted handoff authority",
1041
+ );
1042
+ }
1043
+ const material = {
1044
+ schema: EXECUTION_LOCATION_TARGET_RESULT_COLLECTION_SCHEMA,
1045
+ requestId: request.requestId,
1046
+ requestDigest: request.requestDigest,
1047
+ resultId,
1048
+ target: profile.target,
1049
+ profileDigest: profile.profileDigest,
1050
+ targetFactsDigest: expectedTargetFactsDigest,
1051
+ collectionAttestationDigest: attestation.attestationDigest,
1052
+ handoffId: bundle.session.handoffId,
1053
+ sourceAuthority: sourceAfter,
1054
+ targetHeadHash: bundle.session.target.headHash,
1055
+ targetEventCount: bundle.session.target.eventCount,
1056
+ bundleDigest: bundle.bundleDigest,
1057
+ verificationDigest: verification.verificationDigest,
1058
+ applied: false,
1059
+ continuity: "single-fixed-command-response",
1060
+ gaps: [
1061
+ "returned-result-bytes-not-durable",
1062
+ "cross-host-concurrent-writer-fencing-not-durable",
1063
+ "returned-result-not-applied",
1064
+ ],
1065
+ };
1066
+ return Object.freeze({
1067
+ ...material,
1068
+ bundle,
1069
+ verification,
1070
+ collectionDigest: digest(
1071
+ "chainlesschain.execution-location.target-result-collection.v1\0",
1072
+ material,
1073
+ ),
1074
+ });
1075
+ }
1076
+
842
1077
  export function resumeExecutionLocationTarget(input = {}, deps = {}) {
843
1078
  const profile = normalizeExecutionLocationProfile(input.profile);
844
1079
  validateProfileHandoff(profile, input.handoff);
@@ -15,6 +15,9 @@ export const MANAGED_TOOL_CHECKPOINT_ERROR = Object.freeze({
15
15
  SETTLEMENT_FAILED: "MANAGED_TOOL_CHECKPOINT_SETTLEMENT_FAILED",
16
16
  });
17
17
 
18
+ export const MANAGED_TOOL_CHECKPOINT_BINDING_SCHEMA =
19
+ "cc-managed-tool-checkpoint-binding/v1";
20
+
18
21
  const DIRECT_FILE_ONLY_TOOLS = new Set([
19
22
  "write_file",
20
23
  "edit_file",
@@ -33,6 +36,14 @@ const DEFAULT_READ_ONLY_TOOLS = new Set([
33
36
  "search_sessions",
34
37
  ]);
35
38
 
39
+ export function managedToolCheckpointRequired(toolName, readOnly = undefined) {
40
+ const normalized = boundedBinding(toolName, "unknown-tool");
41
+ return !(
42
+ readOnly === true ||
43
+ (readOnly !== false && DEFAULT_READ_ONLY_TOOLS.has(normalized))
44
+ );
45
+ }
46
+
36
47
  function checkpointError(code, message, details = {}, cause = null) {
37
48
  const error = new Error(message, cause ? { cause } : undefined);
38
49
  error.name = "ManagedToolCheckpointError";
@@ -69,6 +80,41 @@ function skippedCheckpoint(reason, toolName) {
69
80
  });
70
81
  }
71
82
 
83
+ export function managedToolCheckpointBinding(handle) {
84
+ if (!handle || handle.skipped === true) return null;
85
+ const prepared = handle.prepared;
86
+ if (
87
+ !prepared ||
88
+ prepared.id !== handle.transactionId ||
89
+ prepared.checkpointId !== handle.checkpointId ||
90
+ typeof prepared.checkpoint?.digest !== "string" ||
91
+ typeof prepared.stateDigest !== "string" ||
92
+ !Object.values(WORKSPACE_TRANSACTION_COVERAGE).includes(
93
+ prepared.coverage,
94
+ ) ||
95
+ !Object.values(WORKSPACE_TRANSACTION_COVERAGE).includes(
96
+ prepared.fileCoverage,
97
+ ) ||
98
+ typeof prepared.externalSideEffects !== "boolean"
99
+ ) {
100
+ throw checkpointError(
101
+ MANAGED_TOOL_CHECKPOINT_ERROR.INVALID_ARGUMENT,
102
+ "managed tool checkpoint prepared binding is malformed",
103
+ );
104
+ }
105
+ return Object.freeze({
106
+ schema: MANAGED_TOOL_CHECKPOINT_BINDING_SCHEMA,
107
+ authority: "process-broker-workspace-transaction-prepared",
108
+ transactionId: handle.transactionId,
109
+ checkpointId: handle.checkpointId,
110
+ checkpointDigest: prepared.checkpoint.digest,
111
+ preparedStateDigest: prepared.stateDigest,
112
+ coverage: prepared.coverage,
113
+ fileCoverage: prepared.fileCoverage,
114
+ externalSideEffects: prepared.externalSideEffects,
115
+ });
116
+ }
117
+
72
118
  /**
73
119
  * Prepare one managed checkpoint before a mutating agent tool call.
74
120
  *
@@ -79,10 +125,7 @@ function skippedCheckpoint(reason, toolName) {
79
125
  export function beginManagedToolCheckpoint(options = {}) {
80
126
  if (options.enabled !== true) return null;
81
127
  const toolName = boundedBinding(options.toolName, "unknown-tool");
82
- const readOnly =
83
- options.readOnly === true ||
84
- (options.readOnly !== false && DEFAULT_READ_ONLY_TOOLS.has(toolName));
85
- if (readOnly) return null;
128
+ if (!managedToolCheckpointRequired(toolName, options.readOnly)) return null;
86
129
  if (
87
130
  typeof options.unmanagedWriterReason === "string" &&
88
131
  options.unmanagedWriterReason.trim()
@@ -4286,6 +4286,8 @@ export class WorkspaceTransactionManager {
4286
4286
  recoverPending(options = {}) {
4287
4287
  this._ensureStateRoot();
4288
4288
  this._ensureLockRoot();
4289
+ const requestedId =
4290
+ options.id == null ? null : normalizeId(options.id, "transaction id");
4289
4291
  const requestedRoot = options.workspaceRoot
4290
4292
  ? assertSafeDirectory(options.workspaceRoot, "workspace root")
4291
4293
  : null;
@@ -4293,6 +4295,7 @@ export class WorkspaceTransactionManager {
4293
4295
  const names = fs.readdirSync(this.transactionsDir).sort();
4294
4296
  for (const name of names) {
4295
4297
  if (!SAFE_ID.test(name)) continue;
4298
+ if (requestedId !== null && name !== requestedId) continue;
4296
4299
  let loaded;
4297
4300
  try {
4298
4301
  loaded = this._loadTransaction(name);