chainlesschain 0.162.187 → 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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-CETaO3s8.js → AIOps-DbZft8w0.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CAe7E9TW.js → ActionButton-DoOZpwfN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BGr2mzwO.js → Analytics-B0J0KLTW.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BEoY-NcT.js → AppLayout-D9eIR0qq.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DUZivCgt.js → Artifacts-BnZXEVeo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3yBs68k.js → Audit-X1ce4Bjn.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C9KwiY3O.js → BackgroundAgents-BvWR-y5v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BoSWD_C8.js → Backup-BublSGEd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dp09GkxL.js → BaseInput-CR_77Hso.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-5t9d-Ja0.js → Chat-DixW52tq.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DmVku4GH.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-8QJFlkqI.js → Checkbox-CCv1C87K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BJVFQ3lL.js → Codegen-B03Cc3dd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-6hdLD0oB.js → Col-CA06-6pU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B8opo0uY.js → Community-Bj881J52.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dv8HudiN.js → Compact-UZLTPoaL.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DhxuCS5N.js → Compliance-kGwzRb_0.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Dggy6VIL.js → Cowork-KundoYM8.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DSmDqJTT.js → Cron-BYZyoqDe.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-7bZq0j5f.js → Crosschain-BhrrppBX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BWY4kh-H.js → DID-CdC6EguZ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-bOzPZxlu.js → Dashboard-CcQx3J4y.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BTFJHqQu.js → Dropdown-BpijtEzQ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BC3MOdtT.js → EmailListRenderer-DfZjeZTe.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CFHAdTTY.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DZ_4aF_n.js → Federation-Okdi3pJm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BZje6UTj.js → FormItemContext-mH-HebKW.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D7QfCvjN.js → GenericCardRenderer-xivV69x7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DuG7qANG.js → Git-1rh_YBwg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BDmYAgTh.js → Governance-eAXkNxdY.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DSXAfc1Q.js → Inference-CS6dMVTN.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DusleniP.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CpImmA8p.js → Logs-KchHtiHt.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BZ6LJBkk.js → MarkdownRenderer-TabqHW9B.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DXS8CXkE.js → Marketplace-CsmGcX5X.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D151UfUI.js → McpTools-BaPFnnyz.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DKDxnoA1.js → Memory-2m-sUUf7.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BFZ95iKM.js → MobileBridge-D5nVZBRu.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CDAR-grF.js → MobileProjects-Bo8MLZvT.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-OGJ95xJs.js → Mtc-3GDvamGa.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-BmGTo1XC.js → MtcAudit-D2zGuZCH.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-XumJRqOa.js → Multisig-BBVQ4t6t.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DHhhRZed.js → NLProgramming-BIOCyOGp.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B9rGxNNr.js → Notes-DVwBGpzc.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DClLbMYV.js → NotificationSettings-BDnHfIfX.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-I8OohT7N.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-M6WzaYVa.js → Organization-D3SRKaa7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cb3B5KtM.js → Overflow-C2B8ahyn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BGk57kya.js → P2P-2iwQzG65.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CXcKyPqK.js → PdhVaultBrowser-CoPiWqMN.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-hsfJ-Y0e.js → Permissions-yV5XNXo5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BSBii4js.js → PersonalDataHub-uCDJhMUF.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BNw52rey.js → Pipeline-hN7ucMOA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DUpfue4E.js → Privacy-CgU0ptN4.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C68NsP3h.js → ProjectInit-CfYPiT6j.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BJ2It9v4.js → ProjectSettings-B0A2C4nw.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BE5C0ajn.js +1 -0
- package/src/assets/web-panel/assets/{Providers-EnU4VWwS.js → Providers-CstQPf8W.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BRt5-B_I.js → QrScannerModal-Co3z_ynk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Jd5L9UL2.js → QuickAsk-DMTS6pQ6.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNDhoVIu.js → Recommend-ETw4odUa.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D1wQPUNv.js → Reputation-BTVqQgKq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DnjRegul.js → Row-CBKKwwtO.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C_T4I-nF.js → RssFeed-BHUQ438I.js} +2 -2
- package/src/assets/web-panel/assets/{Search-C4lrxlLh.js → Search-B4NqeUsF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ByYT-VzP.js → Security-BRjoYG5_.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BHpyEqB5.js → Services-CxQzu3p3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-C0I23vG-.js → Skeleton-BKzwwmWO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DGZXz22K.js → Skills-DrsFcgth.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DL_urP9A.js → Sla-D21tmXCH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-6x-hUNQ_.js → SpeechSettings-CjyjLfp8.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Crk5TCXq.js → SyncSettings-Cu45-tnx.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-rZGq5PZs.js → Tasks-oMcILYOj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DT5el8Q8.js → Templates-Bh-Zcr5R.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-mlgeyMK8.js → Tenant-68ns63aI.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C8HEA-lM.js → Terminal-BLJkFykE.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DvlqBayB.js → TimelineRenderer-xcrJLq-O.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C7lDcNmT.js → Tokens-C6PpFJtf.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CM8nCnIJ.js → Trigger-BaKA7tdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BQDLUQ9x.js → Trust-BzhA57Jc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CVqM0OFE.js → UkeySign-4_U3JkIR.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BvAcQpzT.js → VideoEditing-162AANxX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-zFVFaAZ2.js → Wallet-B1viuql_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cc522ums.js → WebAuthn-ZVWazhCy.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bg_wxpDo.js → WorkflowEditor-tzdyUk-1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-jg0QwC8K.js → chat-DmrHNuwq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-ALzYz1gO.js → colors-DAJ_M-PK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DXHYUoqi.js → compact-item-uIzmYwLs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BsGsBM5m.js → createContext-D_ZmuLwb.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BccMLzxA.js → hasIn-CDt_shTL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cg9cOVe9.js → index-BAvSmJXW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTTeAiOP.js → index-BDF6EQBs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3k3ZwkQ.js → index-BHvlm0In.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ1ORdp-.js → index-BRa4kJ_S.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcJzphrP.js → index-BTCXf1t-.js} +1 -1
- package/src/assets/web-panel/assets/{index-rIy96PeM.js → index-Bbxjfstq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSFESurl.js → index-Bx4d6c1k.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmg_Npx5.js → index-ByzGvpR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CahDve8M.js → index-C16fYKFD.js} +1 -1
- package/src/assets/web-panel/assets/{index-2VstcImq.js → index-C5WcdJH2.js} +3 -3
- package/src/assets/web-panel/assets/{index-C3Rf8wIM.js → index-CG0lY4h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-uzykuL_R.js → index-CKyd472S.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBVIFX-x.js → index-CaelyMgF.js} +1 -1
- package/src/assets/web-panel/assets/{index-TeCof1s3.js → index-CbD_WW_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfF0OGKU.js → index-CcZ9xJI9.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWltafBn.js → index-CeUpKjvi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWLWBgfe.js → index-Cvak6Oe2.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0AbXsDy.js → index-CzXqvMuP.js} +1 -1
- package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
- package/src/assets/web-panel/assets/{index-BfV8RDlg.js → index-D4n1lGTB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxqiu9-F.js → index-D9OE8B3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdCmJ_bG.js → index-DBFmcaCQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgjQ-kdT.js → index-DdUMcwRB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBbbr1YB.js → index-DeGBoLQA.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmk7dD-T.js → index-DfSSy9uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-JS2LXdd0.js → index-DqDSF2RW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9oV2iRR.js → index-DvFhhe6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvsII10i.js → index-DwfvPe-j.js} +1 -1
- package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
- package/src/assets/web-panel/assets/{index-CrZHUsOZ.js → index-FyplHuNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLzPzN75.js → index-GcKOHD_c.js} +1 -1
- package/src/assets/web-panel/assets/{index-koT8Q86Z.js → index-OzTxFIJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-08diKcTm.js → index-QsgfSZrV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJg6Wsjc.js → index-Z8P4BexE.js} +1 -1
- package/src/assets/web-panel/assets/{index-srqW5_-X.js → index-clSX4PEc.js} +1 -1
- package/src/assets/web-panel/assets/{index-mIQUoUx1.js → index-ifxmu8SY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz_s25m3.js → index-rS3gl_68.js} +1 -1
- package/src/assets/web-panel/assets/{index-UQXedWQz.js → index-rXdwUeE3.js} +1 -1
- package/src/assets/web-panel/assets/{index-rcwgNMc0.js → index-saf3VNeP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-xafkqrW3.js → initDefaultProps-pmfaD-aK.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BrtyQXLk.js → motion-CaQ2CpYF.js} +1 -1
- package/src/assets/web-panel/assets/{move-BunUyg59.js → move-CkKTqNbI.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BPwjBeuE.js → mtc-parser-Dd4xsgRI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BpyqZlNO.js → omit-BFuA5YEs.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DDrV0XjE.js → pickAttrs-DDfxOAJc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-1A18Pcl2.js → placementArrow-Be595JCp.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B8Fnlmso.js → responsiveObserve-7byljUM3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-x-Fwb2Zm.js → slide-CTWfOTaY.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-aAG5yJl_.js → statusUtils-CNZOuIxM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BRQSTMRL.js → styleChecker-DwOcBV78.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D5X_KozY.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DN_YIjP-.js → useFs-CzyQjH9r.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BizxAvjw.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B5oAxN93.js → vnode-DVfZiS5N.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DJhvyzKv.js → zoom-BYme7fbY.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +22 -0
- package/src/commands/auto-mode.js +47 -0
- package/src/commands/checkpoint-managed.js +1059 -0
- package/src/commands/checkpoint.js +3 -0
- package/src/commands/team-distributed.js +3324 -0
- package/src/commands/team.js +1130 -74
- package/src/data/auto-mode-safety-eval-v1.json +3294 -0
- package/src/data/changelog.json +26 -0
- package/src/lib/agent-core.js +1 -0
- package/src/lib/agent-team/task-lease.js +271 -3
- package/src/lib/agent-team/team-adjudication.js +1501 -0
- package/src/lib/agent-team/team-budget.js +4 -1
- package/src/lib/agent-team/team-control-store.js +582 -0
- package/src/lib/agent-team/team-distributed-queue.js +5246 -0
- package/src/lib/agent-team/team-process-checkpoint.js +211 -0
- package/src/lib/agent-team/team-runner.js +319 -22
- package/src/lib/agent-team/team-worktree.js +1403 -95
- package/src/lib/auto-mode-safety-classifier.js +2034 -0
- package/src/lib/auto-mode-safety-eval.js +1022 -0
- package/src/lib/managed-checkpoint-render.js +60 -0
- package/src/lib/managed-tool-checkpoint.js +194 -0
- package/src/lib/process-execution-broker/index.js +438 -5
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
- package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
- package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
- package/src/lib/secure-file-identity.js +433 -0
- package/src/lib/turn-binding.js +160 -2
- package/src/lib/with-file-lock.js +140 -23
- package/src/repl/agent-repl.js +19 -1
- package/src/runtime/agent-core.js +366 -122
- package/src/runtime/headless-runner.js +12 -0
- package/src/runtime/headless-stream.js +3 -0
- package/src/runtime/policies/agent-policy.js +14 -0
- package/src/assets/web-panel/assets/Projects-D2FHLUa-.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-BII41Mel.js +0 -5
- package/src/assets/web-panel/assets/devWarning-Dy1GJA4S.js +0 -1
- package/src/assets/web-panel/assets/index-8zbMbbuf.js +0 -1
- package/src/assets/web-panel/assets/index-C97f71oi.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
|
+
}
|