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.
- package/README.md +151 -29
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-lS1R0Cza.js → AIOps-C__nnraW.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BmlgBPsj.js → ActionButton-CsKWHEZ-.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CNKczv1S.js → Analytics-BhIjfjWO.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BuZGJARQ.js → AppLayout-BjuXFzWZ.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Dm73Sl-O.js → Artifacts-k6whDkZJ.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BGMW7A5e.js → Audit-C4FBMYRh.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BQ6M54JR.js → BackgroundAgents-C_vRrSXk.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DBzGP0bR.js → Backup-CngFZeVp.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D1mLCoOV.js → BaseInput-B_H9EBRm.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BUfcN7p8.js → Chat-DLEC5kt7.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Du0Yg5Pi.js → Checkbox-m3ClR4xh.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B2RXziHW.js → Codegen-CmLSFrgp.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DWhekOrR.js → Col-DFGQteHN.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HQhrkon4.js → Community-EUUVORHE.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-izHNb4uz.js → Compact-2PSg0Yr7.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BDwLy41-.js → Compliance-CcKur7gB.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DFJhLa7K.js → Cowork-DK_Fezfa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DYY9RG7-.js → Cron-Dbw89xl7.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-rr7tJTtv.js → Crosschain-CH66h_Ec.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D2sfHRLi.js → DID-D1igRb17.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-q_eGdhha.js → Dashboard-DVAsrobk.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Cufrh2Bz.js → Dropdown-Dl7W8AQs.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-B-kdv10f.js → EmailListRenderer-D5tpaEQC.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D21XjgfG.js → FamilyGuardDashboard-O_VQf8gq.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CAwRTLZH.js → Federation-BTVcgS9n.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-vx3daNDF.js → FormItemContext-BRnkJAIz.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CRWY2wU4.js → GenericCardRenderer-8OWSCkDj.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Q6SwauyD.js → Git-WXLYTQj2.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJ1q4IQZ.js → Governance-BezaUhtc.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CSWjROgD.js → Inference-CuRay3Gu.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-fzuQsWuY.js → KnowledgeGraph-DfWLDW1m.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DVF8Mnns.js → Logs-C55y2pPY.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BQP7LOA4.js → Marketplace-Dk08Uycg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BNlJCmNc.js → McpTools-C11fSB5V.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-DLLg5WQ4.js → Memory-mr0eZc97.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CR2skNAF.js → MobileBridge-C0iCSRbb.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BxVavObl.js → MobileProjects-CY-xMG8Z.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B17pgqMI.js → Mtc-Bplqc_Wc.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-4UmV5cIL.js → MtcAudit-BlzwsoSM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DoMEXEcU.js → Multisig-BBLmTty6.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-h9DMXFX4.js → NLProgramming-DtT1uf1W.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cihn-xX8.js → Notes-DcqQAxTK.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BE6ZGa3R.js → NotificationSettings-cb0kWoZe.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CnwojoSI.js → OrderTableRenderer-kw9HZQNN.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B2vpwmjb.js → Organization-DlTlbkUN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C4z28R0-.js → Overflow-pp1qs-oY.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BVlFkwhW.js → P2P-BESLnyYz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BXbEdL5B.js → PdhVaultBrowser-B-J1mGuf.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C28xs4lp.js → Permissions-B36PeT1_.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dgl_rBjM.js → PersonalDataHub-CTK2ad-3.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-3QUIhrKI.js → Pipeline-zJNGXsac.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-8Gh33OZ5.js → Privacy-b9fz0Qf0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BNmg4tZi.js → ProjectInit-DjZbZgiB.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-vgMfeCf9.js → ProjectSettings-C-hHJXlD.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CXoOa8eX.js → Providers-Dz-CAYYU.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BhfTF0oS.js → QrScannerModal-A0yoQ3-3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-C746HEAj.js → QuickAsk-DrFgFJNC.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BSej8Eo0.js → Recommend-KC8hF1g4.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-f3gmnlG3.js → RemoteSession-DGTPIk6u.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CyvybpkN.js → Reputation-QmbwM7Yk.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DwV2PeYn.js → Row-BxjJylia.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-11GrzjZy.js → RssFeed-B7Wda1J6.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BjKXkrAY.js → Search-_plQ_YSA.js} +1 -1
- package/src/assets/web-panel/assets/{Security-eWiFb9Yk.js → Security-CD2YJZfx.js} +2 -2
- package/src/assets/web-panel/assets/{Services-CdCsMAtt.js → Services-qQE7NmwE.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-4Q2UTKQ5.js → Skeleton-DgQqkFf7.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-v4rtYrRj.js → Skills-C4C0oFFt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CRhsFvd_.js → Sla-Px2N2B5c.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DN6C3lQd.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-D16zonl7.js → SyncSettings-jm5aH_m7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Xxozz0i_.js → Tasks-DlkJcv67.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CXJpPtCT.js → Templates-DyrTHUBs.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-XRV0L1ZF.js → Tenant-mC434PtL.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CYuO1i_w.js → Terminal-o0_s3NgK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BXqitWsu.js → TimelineRenderer-DAGlAXOw.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BvPrDHIy.js → Tokens-BnulS_bs.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DhCrSTf5.js → Trigger-suQbVXYM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmsuZD6K.js → Trust-DbIJAPo5.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D_yrts5C.js → UkeySign-CQNpbIHi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B01ihPrm.js → VideoEditing-D8aWCERk.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DpUjKa-N.js → Wallet-CuLpYfZc.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CL07yON6.js → WebAuthn-CsfG8ZMc.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CLMflnRr.js → WorkflowEditor-BYsEAZbd.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DtUqe8h_.js → chat-FT4Um3-I.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DPKrgVfy.js → colors-CKbS_Wlt.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BTt2GtOm.js → compact-item-CFJtzuJM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D_VeUc1J.js → createContext-B9kSRW6K.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-1kndiylj.js → hasIn-DR-x0Xpi.js} +1 -1
- package/src/assets/web-panel/assets/{index-dVc-CXY4.js → index-7jHr_A_k.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFIZ_1Sf.js → index-B3ZX81mK.js} +1 -1
- package/src/assets/web-panel/assets/{index-fk2Rjacw.js → index-B7osrXqy.js} +3 -3
- package/src/assets/web-panel/assets/{index-CHG-KcS4.js → index-BGbPnC5x.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbbymxpj.js → index-BI5hP_qy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaZAbw9A.js → index-BK3TiKVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzjkKUmR.js → index-BVPU43b1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAXfRKfG.js → index-BW-t9n-q.js} +1 -1
- package/src/assets/web-panel/assets/{index-8nz_fmlj.js → index-BfFCQHL3.js} +1 -1
- package/src/assets/web-panel/assets/index-Bizb4hkw.js +1 -0
- package/src/assets/web-panel/assets/{index-DdkplL9R.js → index-Bt4fS2eL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DG2MZQ3f.js → index-BwR7yc2h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfKBRdSS.js → index-Bzz0C1BZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-GsoUQ2M7.js → index-C2JvmYRc.js} +1 -1
- package/src/assets/web-panel/assets/{index-l1BETrDb.js → index-CGaXUsIs.js} +1 -1
- package/src/assets/web-panel/assets/{index-4bna2_SR.js → index-CJmIQ9XR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfGl8CqG.js → index-C_enk9I_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D95OFht7.js → index-Cr2FLUsD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsJCDUJG.js → index-CvrCCqJt.js} +1 -1
- package/src/assets/web-panel/assets/{index-sDoMHTNA.js → index-D4LfPvWA.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5n8up9.js → index-DMGmg497.js} +1 -1
- package/src/assets/web-panel/assets/{index-ocf06EVQ.js → index-DShSkww-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bhudc_Ez.js → index-DTxNy0ZU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX81qSM4.js → index-DW4BWjTk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlDNVgBt.js → index-DWdqx7zI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcO04eDn.js → index-Dap9c3eD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dwqmtk65.js → index-DcfxhKXR.js} +1 -1
- package/src/assets/web-panel/assets/{index-2eyAXE3d.js → index-DdkIhfi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-brCInrzq.js → index-DeSgw-WV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJ8vXGOa.js → index-DiNUEpSQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHpBMWCh.js → index-DjEP7WkH.js} +1 -1
- package/src/assets/web-panel/assets/{index-m31Ka8hZ.js → index-DtkFqPVA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtF7EN49.js → index-KqDaCApw.js} +1 -1
- package/src/assets/web-panel/assets/index-OHSl-xCh.js +1 -0
- package/src/assets/web-panel/assets/{index-B9KvcS7R.js → index-OSzjTzGM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CauoBQkH.js → index-QBSeNVO3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FzdwcSy2.js → index-WE08gMJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxdTdBix.js → index-r2VI1Ikk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BepLZwgB.js → index-tqSEHPRT.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CvyYJd7z.js → initDefaultProps-Dd7n7VgI.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DYZkhUdz.js → motion-BwxouRw1.js} +1 -1
- package/src/assets/web-panel/assets/{move-slnJRVT1.js → move-DObN0PG9.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DVc0CKmy.js → mtc-parser-B3nOUQc7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCXAtHCq.js → omit-o9WU2Nbl.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DBsemz_K.js → pickAttrs-CL_vvfQ_.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BRtkJ-nv.js → placementArrow-CYrM2tyK.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Cebq7EZn.js → responsiveObserve-k_06cQ96.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DT7qvId2.js → slide-CPKG0pxS.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-pQiITLkG.js → statusUtils-BDDEeLTw.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-c-19BVKQ.js → styleChecker-Cmb7RTh7.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DsS5-0bE.js → useFlexGapSupport-e2IedC4N.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CxGiMe5n.js → useFs-CE_gxVnm.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D9btVID5.js → usePersonalDataHub-BkMIIKMz.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CUYFsFEN.js → vnode-DW886XV1.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CXmn_35j.js → zoom-Dwo_adaf.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +105 -35
- package/src/commands/artifacts.js +363 -33
- package/src/commands/cowork.js +202 -36
- package/src/commands/session-budget.js +155 -0
- package/src/commands/session-location.js +948 -0
- package/src/commands/session.js +72 -46
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/artifact-protocol.js +77 -13
- package/src/gateways/ws/session-protocol.js +391 -24
- package/src/gateways/ws/ws-agent-handler.js +191 -14
- package/src/gateways/ws/ws-server.js +14 -3
- package/src/gateways/ws/ws-session-gateway.js +101 -5
- package/src/harness/jsonl-session-store.js +1210 -0
- package/src/lib/agent-team/team-runner.js +43 -13
- package/src/lib/artifact-access-ledger.js +461 -0
- package/src/lib/artifact-cleanup-ledger.js +861 -0
- package/src/lib/artifact-deletion-ledger.js +677 -0
- package/src/lib/artifact-store.js +256 -51
- package/src/lib/background-agent-keeper-protocol.js +75 -4
- package/src/lib/background-agent-launch-barrier.js +74 -0
- package/src/lib/background-agent-supervisor.js +149 -5
- package/src/lib/background-turn-bootstrap-protocol.js +4 -0
- package/src/lib/command-lifecycle-report.js +8 -4
- package/src/lib/cowork-adapter.js +9 -5
- package/src/lib/cowork-task-runner.js +20 -0
- package/src/lib/cowork-workflow.js +178 -20
- package/src/lib/direct-model-usage.js +62 -22
- package/src/lib/dynamic-workflow-runtime.js +3184 -111
- package/src/lib/execution-location-result-apply.js +339 -0
- package/src/lib/execution-location-result-artifact.js +271 -0
- package/src/lib/execution-location-result-review.js +253 -0
- package/src/lib/execution-location-result-store.js +331 -0
- package/src/lib/execution-location-result.js +617 -0
- package/src/lib/execution-location-target.js +236 -1
- package/src/lib/managed-tool-checkpoint.js +47 -4
- package/src/lib/process-execution-broker/workspace-transaction.js +3 -0
- package/src/lib/session-budget-production-root.js +376 -0
- package/src/lib/session-budget-runtime.js +109 -18
- package/src/lib/session-budget-usage.js +63 -0
- package/src/lib/session-host-snapshot.js +19 -2
- package/src/lib/session-resource-budget.js +766 -105
- package/src/lib/sub-agent-context.js +69 -22
- package/src/lib/web-ui-server.js +12 -1
- package/src/lib/with-file-lock.js +175 -26
- package/src/repl/agent-repl.js +237 -16
- package/src/runtime/agent-core.js +123 -0
- package/src/runtime/headless-runner.js +135 -46
- package/src/runtime/headless-stream.js +133 -25
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/workers/background-agent-keeper.js +112 -19
- package/src/workers/background-agent-worker.js +383 -134
- package/src/workers/background-turn-bootstrap.js +13 -8
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CY5m8ZHg.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +0 -1
- package/src/assets/web-panel/assets/Projects-BhtAVilc.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +0 -1
- package/src/assets/web-panel/assets/index-CPcM-eqo.js +0 -1
- 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 :
|
|
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
|
-
|
|
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);
|