chainlesschain 0.162.188 → 0.162.189

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 (188) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DbZft8w0.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-DoOZpwfN.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-B0J0KLTW.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-D9eIR0qq.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-BnZXEVeo.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-X1ce4Bjn.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-BvWR-y5v.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BublSGEd.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-CR_77Hso.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-DixW52tq.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CCv1C87K.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-B03Cc3dd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CA06-6pU.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-Bj881J52.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-UZLTPoaL.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-kGwzRb_0.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-KundoYM8.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-BYZyoqDe.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BhrrppBX.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-CdC6EguZ.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-CcQx3J4y.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-BpijtEzQ.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-DfZjeZTe.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-Okdi3pJm.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-mH-HebKW.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-xivV69x7.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-1rh_YBwg.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-eAXkNxdY.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-CS6dMVTN.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-KchHtiHt.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-CsmGcX5X.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-BaPFnnyz.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-2m-sUUf7.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-D5nVZBRu.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-3GDvamGa.js} +6 -6
  42. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-D2zGuZCH.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-BBVQ4t6t.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-BIOCyOGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DVwBGpzc.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-BDnHfIfX.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BU2Yqq5H.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D3SRKaa7.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-C2B8ahyn.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-2iwQzG65.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-69ca_WeR.js → PdhVaultBrowser-CoPiWqMN.js} +4 -4
  52. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-yV5XNXo5.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-uCDJhMUF.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-hN7ucMOA.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-CgU0ptN4.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-CfYPiT6j.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-B0A2C4nw.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-BE5C0ajn.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-CstQPf8W.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-Co3z_ynk.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-DMTS6pQ6.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-ETw4odUa.js} +1 -1
  63. package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
  64. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-BTVqQgKq.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CBKKwwtO.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BHUQ438I.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-B4NqeUsF.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-BRjoYG5_.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-CxQzu3p3.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton-BKzwwmWO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-DrsFcgth.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-D21tmXCH.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-CjyjLfp8.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-Cu45-tnx.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-oMcILYOj.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-Bh-Zcr5R.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-68ns63aI.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BLJkFykE.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-xcrJLq-O.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-C6PpFJtf.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-BaKA7tdM.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-BzhA57Jc.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-4_U3JkIR.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-162AANxX.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-B1viuql_.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-ZVWazhCy.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-tzdyUk-1.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-DmrHNuwq.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-DAJ_M-PK.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-uIzmYwLs.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-D_ZmuLwb.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-CDt_shTL.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-BAvSmJXW.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-BDF6EQBs.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-BHvlm0In.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-BRa4kJ_S.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-BTCXf1t-.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Bbxjfstq.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-Bx4d6c1k.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-ByzGvpR9.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-C16fYKFD.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-C5WcdJH2.js} +3 -3
  104. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-CG0lY4h3.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-CKyd472S.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-CaelyMgF.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CbD_WW_6.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-CcZ9xJI9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CeUpKjvi.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-Cvak6Oe2.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-CzXqvMuP.js} +1 -1
  112. package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-D4n1lGTB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-D9OE8B3d.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-DBFmcaCQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-DdUMcwRB.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-DeGBoLQA.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-DfSSy9uy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-DqDSF2RW.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-DvFhhe6r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-DwfvPe-j.js} +1 -1
  122. package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
  123. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-FyplHuNt.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-GcKOHD_c.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-OzTxFIJP.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-QsgfSZrV.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-Z8P4BexE.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-clSX4PEc.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-ifxmu8SY.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-rS3gl_68.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-rXdwUeE3.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-saf3VNeP.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-pmfaD-aK.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-CaQ2CpYF.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-CkKTqNbI.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-Dd4xsgRI.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-BFuA5YEs.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-DDfxOAJc.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-Be595JCp.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-7byljUM3.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-CTWfOTaY.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-CNZOuIxM.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-DwOcBV78.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-CzyQjH9r.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-DVfZiS5N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-BYme7fbY.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agent.js +22 -0
  151. package/src/commands/checkpoint-managed.js +1059 -0
  152. package/src/commands/checkpoint.js +3 -0
  153. package/src/commands/team-distributed.js +3324 -0
  154. package/src/commands/team.js +1130 -74
  155. package/src/data/changelog.json +13 -0
  156. package/src/lib/agent-core.js +1 -0
  157. package/src/lib/agent-team/task-lease.js +271 -3
  158. package/src/lib/agent-team/team-adjudication.js +1501 -0
  159. package/src/lib/agent-team/team-budget.js +4 -1
  160. package/src/lib/agent-team/team-control-store.js +582 -0
  161. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  162. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  163. package/src/lib/agent-team/team-runner.js +319 -22
  164. package/src/lib/agent-team/team-worktree.js +1403 -95
  165. package/src/lib/managed-checkpoint-render.js +60 -0
  166. package/src/lib/managed-tool-checkpoint.js +194 -0
  167. package/src/lib/process-execution-broker/index.js +438 -5
  168. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  169. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  170. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  171. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  172. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  173. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  174. package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
  175. package/src/lib/secure-file-identity.js +433 -0
  176. package/src/lib/turn-binding.js +160 -2
  177. package/src/lib/with-file-lock.js +140 -23
  178. package/src/repl/agent-repl.js +19 -1
  179. package/src/runtime/agent-core.js +366 -122
  180. package/src/runtime/headless-runner.js +12 -0
  181. package/src/runtime/headless-stream.js +3 -0
  182. package/src/runtime/policies/agent-policy.js +14 -0
  183. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  184. package/src/assets/web-panel/assets/MobileProjects-COBbEOlj.js +0 -1
  185. package/src/assets/web-panel/assets/RemoteSession-oOVIv9wq.js +0 -5
  186. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  187. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  188. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -0,0 +1,60 @@
1
+ const MANAGED_EVENT_TYPES = new Set([
2
+ "managed-checkpoint",
3
+ "managed-checkpoint-settled",
4
+ "managed-checkpoint-error",
5
+ ]);
6
+
7
+ function token(value, maxLength = 96) {
8
+ if (value == null) return null;
9
+ const normalized = String(value)
10
+ .replace(/[\r\n\t]+/g, " ")
11
+ .replace(/[^\p{L}\p{N}._:/@+-]+/gu, "_")
12
+ .slice(0, maxLength);
13
+ return normalized || null;
14
+ }
15
+
16
+ function shortDigest(value) {
17
+ const normalized = token(value, 96);
18
+ if (!normalized) return null;
19
+ return normalized.length > 24 ? `${normalized.slice(0, 24)}...` : normalized;
20
+ }
21
+
22
+ /**
23
+ * Render only bounded checkpoint metadata. Tool arguments, file contents,
24
+ * arbitrary event fields and raw failure messages are intentionally omitted.
25
+ */
26
+ export function formatManagedCheckpointEvent(event) {
27
+ if (!event || !MANAGED_EVENT_TYPES.has(event.type)) return null;
28
+
29
+ const parts = ["[managed checkpoint]"];
30
+ if (event.type === "managed-checkpoint-error") {
31
+ parts.push(
32
+ event.recovery_required === true
33
+ ? "recovery required"
34
+ : event.phase === "prepare"
35
+ ? "preparation blocked"
36
+ : "settlement failed",
37
+ );
38
+ } else {
39
+ parts.push(token(event.phase, 32) || "status");
40
+ }
41
+
42
+ const tool = token(event.tool, 96);
43
+ const coverage = token(event.coverage, 16);
44
+ const fileCoverage = token(event.file_coverage, 16);
45
+ const reason = token(event.reason, 128);
46
+ const code = token(event.code, 96);
47
+ const transactionId = token(event.transaction_id, 96);
48
+ const checkpointId = token(event.id || event.checkpoint_id, 96);
49
+ const evidenceDigest = shortDigest(event.evidence_digest);
50
+
51
+ if (tool) parts.push(`tool=${tool}`);
52
+ if (coverage) parts.push(`coverage=${coverage}`);
53
+ if (fileCoverage) parts.push(`files=${fileCoverage}`);
54
+ if (reason) parts.push(`reason=${reason}`);
55
+ if (code) parts.push(`code=${code}`);
56
+ if (transactionId) parts.push(`transaction=${transactionId}`);
57
+ if (checkpointId) parts.push(`checkpoint=${checkpointId}`);
58
+ if (evidenceDigest) parts.push(`evidence=${evidenceDigest}`);
59
+ return ` ${parts.join(" ")}`;
60
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Agent tool adapter for Process Broker workspace transactions.
3
+ *
4
+ * This module deliberately keeps policy separate from the transaction engine:
5
+ * callers opt in, provide the trusted workspace root, and decide whether they
6
+ * can assert an exclusive-writer contract. Unknown/background/external-host
7
+ * writers are reported as coverage=none instead of being wrapped in a
8
+ * misleading "recoverable" checkpoint.
9
+ */
10
+
11
+ import { WORKSPACE_TRANSACTION_COVERAGE } from "./process-execution-broker/workspace-transaction.js";
12
+
13
+ export const MANAGED_TOOL_CHECKPOINT_ERROR = Object.freeze({
14
+ INVALID_ARGUMENT: "MANAGED_TOOL_CHECKPOINT_INVALID_ARGUMENT",
15
+ SETTLEMENT_FAILED: "MANAGED_TOOL_CHECKPOINT_SETTLEMENT_FAILED",
16
+ });
17
+
18
+ const DIRECT_FILE_ONLY_TOOLS = new Set([
19
+ "write_file",
20
+ "edit_file",
21
+ "edit_file_hashed",
22
+ "delete_file",
23
+ "move_file",
24
+ "notebook_edit",
25
+ ]);
26
+
27
+ const DEFAULT_READ_ONLY_TOOLS = new Set([
28
+ "read_file",
29
+ "search_files",
30
+ "code_intelligence",
31
+ "list_dir",
32
+ "list_skills",
33
+ "search_sessions",
34
+ ]);
35
+
36
+ function checkpointError(code, message, details = {}, cause = null) {
37
+ const error = new Error(message, cause ? { cause } : undefined);
38
+ error.name = "ManagedToolCheckpointError";
39
+ error.code = code;
40
+ Object.assign(error, details);
41
+ return error;
42
+ }
43
+
44
+ function boundedBinding(value, fallback) {
45
+ const text =
46
+ typeof value === "string" && value.trim() ? value.trim() : fallback;
47
+ return text.slice(0, 256);
48
+ }
49
+
50
+ function isBackgroundTool(toolName, toolArgs = {}) {
51
+ if (toolName === "run_shell") return toolArgs.run_in_background === true;
52
+ if (toolName === "spawn_sub_agent") {
53
+ return (
54
+ toolArgs.run_in_background === true ||
55
+ toolArgs.background === true ||
56
+ toolArgs.mode === "background"
57
+ );
58
+ }
59
+ return false;
60
+ }
61
+
62
+ function skippedCheckpoint(reason, toolName) {
63
+ return Object.freeze({
64
+ skipped: true,
65
+ toolName,
66
+ coverage: WORKSPACE_TRANSACTION_COVERAGE.NONE,
67
+ fileCoverage: WORKSPACE_TRANSACTION_COVERAGE.NONE,
68
+ reason,
69
+ });
70
+ }
71
+
72
+ /**
73
+ * Prepare one managed checkpoint before a mutating agent tool call.
74
+ *
75
+ * A returned `skipped:true` result is an intentional coverage decision, not an
76
+ * error. Transaction preparation errors throw and must block strict callers
77
+ * before the tool is allowed to mutate the workspace.
78
+ */
79
+ export function beginManagedToolCheckpoint(options = {}) {
80
+ if (options.enabled !== true) return null;
81
+ 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;
86
+ if (
87
+ typeof options.unmanagedWriterReason === "string" &&
88
+ options.unmanagedWriterReason.trim()
89
+ ) {
90
+ return skippedCheckpoint(
91
+ options.unmanagedWriterReason.trim().slice(0, 256),
92
+ toolName,
93
+ );
94
+ }
95
+ if (isBackgroundTool(toolName, options.toolArgs)) {
96
+ return skippedCheckpoint("background_writer_not_quiescent", toolName);
97
+ }
98
+ if (options.externalToolExecutor) {
99
+ return skippedCheckpoint("external_writer_lifetime_unmanaged", toolName);
100
+ }
101
+ if (
102
+ !options.broker ||
103
+ typeof options.broker.beginWorkspaceTransaction !== "function"
104
+ ) {
105
+ throw checkpointError(
106
+ MANAGED_TOOL_CHECKPOINT_ERROR.INVALID_ARGUMENT,
107
+ "managed tool checkpoint requires a Process Broker transaction API",
108
+ );
109
+ }
110
+ if (
111
+ typeof options.workspaceRoot !== "string" ||
112
+ !options.workspaceRoot.trim()
113
+ ) {
114
+ throw checkpointError(
115
+ MANAGED_TOOL_CHECKPOINT_ERROR.INVALID_ARGUMENT,
116
+ "managed tool checkpoint requires a trusted workspace root",
117
+ );
118
+ }
119
+
120
+ const coverageTarget =
121
+ options.coverageTarget || WORKSPACE_TRANSACTION_COVERAGE.PARTIAL;
122
+ const writerIsolation =
123
+ options.writerIsolation === "exclusive-workspace"
124
+ ? "exclusive-workspace"
125
+ : "unknown";
126
+ const transaction = options.broker.beginWorkspaceTransaction({
127
+ ...(options.stateDir ? { stateDir: options.stateDir } : {}),
128
+ ...(options.id ? { id: options.id } : {}),
129
+ runId: boundedBinding(options.runId, "agent-run"),
130
+ taskKey: boundedBinding(options.taskKey, `tool-${toolName}`),
131
+ workspaceRoot: options.workspaceRoot,
132
+ coverageTarget,
133
+ writerIsolation,
134
+ externalSideEffects:
135
+ options.externalSideEffects === undefined
136
+ ? !DIRECT_FILE_ONLY_TOOLS.has(toolName)
137
+ : options.externalSideEffects !== false,
138
+ exclusions: Array.isArray(options.exclusions) ? options.exclusions : [],
139
+ limits: options.limits || {},
140
+ });
141
+
142
+ return {
143
+ skipped: false,
144
+ toolName,
145
+ transaction,
146
+ transactionId: transaction.id,
147
+ checkpointId: transaction.checkpointId,
148
+ prepared: transaction.snapshot(),
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Commit a successful tool checkpoint or roll it back after a failed tool.
154
+ * Settlement errors retain the durable transaction snapshot for adjudication.
155
+ */
156
+ export function settleManagedToolCheckpoint(handle, { success, reason } = {}) {
157
+ if (!handle) return null;
158
+ if (handle.skipped) return { ...handle };
159
+ if (!handle.transaction) {
160
+ throw checkpointError(
161
+ MANAGED_TOOL_CHECKPOINT_ERROR.INVALID_ARGUMENT,
162
+ "managed tool checkpoint handle has no transaction",
163
+ );
164
+ }
165
+ try {
166
+ const evidence =
167
+ success === true
168
+ ? handle.transaction.accept()
169
+ : handle.transaction.rollback({
170
+ reason: boundedBinding(reason, "agent tool failed"),
171
+ });
172
+ return {
173
+ skipped: false,
174
+ toolName: handle.toolName,
175
+ transactionId: handle.transactionId,
176
+ checkpointId: handle.checkpointId,
177
+ evidence,
178
+ coverage: evidence.coverage,
179
+ fileCoverage: evidence.fileCoverage,
180
+ };
181
+ } catch (cause) {
182
+ throw checkpointError(
183
+ MANAGED_TOOL_CHECKPOINT_ERROR.SETTLEMENT_FAILED,
184
+ `managed checkpoint could not ${success === true ? "commit" : "roll back"}: ${cause.message}`,
185
+ {
186
+ transactionId: handle.transactionId,
187
+ checkpointId: handle.checkpointId,
188
+ transaction: handle.transaction.snapshot(),
189
+ settlement: success === true ? "commit" : "rollback",
190
+ },
191
+ cause,
192
+ );
193
+ }
194
+ }