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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DbZft8w0.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-DoOZpwfN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-B0J0KLTW.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-D9eIR0qq.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-BnZXEVeo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-X1ce4Bjn.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-BvWR-y5v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BublSGEd.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-CR_77Hso.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-DixW52tq.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CCv1C87K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-B03Cc3dd.js} +1 -1
- package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CA06-6pU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-Bj881J52.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-UZLTPoaL.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-kGwzRb_0.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-KundoYM8.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-BYZyoqDe.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BhrrppBX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-CdC6EguZ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-CcQx3J4y.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-BpijtEzQ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-DfZjeZTe.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-Okdi3pJm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-mH-HebKW.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-xivV69x7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-1rh_YBwg.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-eAXkNxdY.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-CS6dMVTN.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-KchHtiHt.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-CsmGcX5X.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-BaPFnnyz.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-2m-sUUf7.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-D5nVZBRu.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-3GDvamGa.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-D2zGuZCH.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-BBVQ4t6t.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-BIOCyOGp.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DVwBGpzc.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-BDnHfIfX.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BU2Yqq5H.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D3SRKaa7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-C2B8ahyn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-2iwQzG65.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-69ca_WeR.js → PdhVaultBrowser-CoPiWqMN.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-yV5XNXo5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-uCDJhMUF.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-hN7ucMOA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-CgU0ptN4.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-CfYPiT6j.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-B0A2C4nw.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-BE5C0ajn.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-CstQPf8W.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-Co3z_ynk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-DMTS6pQ6.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-ETw4odUa.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-BTVqQgKq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CBKKwwtO.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BHUQ438I.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-B4NqeUsF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-BRjoYG5_.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-CxQzu3p3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton-BKzwwmWO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-DrsFcgth.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-D21tmXCH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-CjyjLfp8.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-Cu45-tnx.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-oMcILYOj.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-Bh-Zcr5R.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-68ns63aI.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BLJkFykE.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-xcrJLq-O.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-C6PpFJtf.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-BaKA7tdM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-BzhA57Jc.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-4_U3JkIR.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-162AANxX.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-B1viuql_.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-ZVWazhCy.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-tzdyUk-1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-DmrHNuwq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-DAJ_M-PK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-uIzmYwLs.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C-2MZnFq.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-BQIBjcnB.js → hasIn-CDt_shTL.js} +1 -1
- package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-BAvSmJXW.js} +1 -1
- package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-BDF6EQBs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-BHvlm0In.js} +1 -1
- package/src/assets/web-panel/assets/{index-COG61sRv.js → index-BRa4kJ_S.js} +1 -1
- package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-BTCXf1t-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Bbxjfstq.js} +1 -1
- package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-Bx4d6c1k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-ByzGvpR9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-C16fYKFD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-C5WcdJH2.js} +3 -3
- package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-CG0lY4h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-CKyd472S.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-CaelyMgF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CbD_WW_6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-CcZ9xJI9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CeUpKjvi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-Cvak6Oe2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvo_bp0.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-BdXnYMCZ.js → index-D4n1lGTB.js} +1 -1
- package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-D9OE8B3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-DBFmcaCQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-DdUMcwRB.js} +1 -1
- package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-DeGBoLQA.js} +1 -1
- package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-DfSSy9uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-DqDSF2RW.js} +1 -1
- package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-DvFhhe6r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaslYch6.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-B5pgtZnY.js → index-FyplHuNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-GcKOHD_c.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-OzTxFIJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-QsgfSZrV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-Z8P4BexE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-clSX4PEc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-ifxmu8SY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-rS3gl_68.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-rXdwUeE3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-saf3VNeP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-pmfaD-aK.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-CaQ2CpYF.js} +1 -1
- package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-CkKTqNbI.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-Dd4xsgRI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-BFuA5YEs.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-DDfxOAJc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-Be595JCp.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-7byljUM3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-CTWfOTaY.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-CNZOuIxM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-DwOcBV78.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-CzyQjH9r.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-DVfZiS5N.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D4XrrO0R.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/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/changelog.json +13 -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/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/MarkdownRenderer-7iWGwZ-r.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-COBbEOlj.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-oOVIv9wq.js +0 -5
- package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
- package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
- package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.162.189",
|
|
7
|
+
"cliVersions": ["0.162.188", "0.162.189"],
|
|
8
|
+
"date": "2026-07-31",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added — cc CLI 0.162.189: managed rollback and distributed Agent Teams closure",
|
|
13
|
+
"body": "> `chainlesschain` **0.162.188 → 0.162.189** (2026-07-31).\n> CLI-only release metadata; `@chainlesschain/personal-data-hub` remains\n> **0.4.57** and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Managed workspace rollback**: Process Broker-managed workspace write paths\n record durable recovery evidence, establish checkpoints at accepted\n boundaries, and apply fenced rollback after failure, cancellation, or\n timeout. `full`, `partial`, and `none` coverage outcomes remain explicit,\n while unsupported external side effects stay outside the rollback guarantee.\n- **Distributed Agent Teams authority**: local schema v6 is the current state\n authority, with v5 accepted only through CLI-owned resume migration. The\n separate distributed queue schema v1 uses queue authority digests, leases,\n and compare-and-swap fences for supported shared-filesystem coordination; it\n is not a consensus or network-partition-tolerant queue.\n- **Wall-clock lifecycle fence**: linearized `startedAt` and `observedAt`\n checks surround executor activity, active managed shell and agent work is\n aborted when the wall-clock budget expires, and commit/checkpoint publication\n is fenced so late results cannot become completed tasks. Accepted committed\n evidence instead enters explicit adjudication.\n- **CLI-owned IDE controls**: VS Code and JetBrains surfaces observe the raw\n local v6 or distributed queue v1 JSON as read-only state and route takeover,\n recovery, and adjudication through CLI-owned authority, digest, lease, and\n evidence fences.\n- **Validated implementation candidate**: candidate\n `7df6feced4670ac71d19548752d18ac4cc225025` completed the\n [CLI CI](https://github.com/chainlesschain/chainlesschain/actions/runs/30549100935),\n [CLI Strict Sandbox](https://github.com/chainlesschain/chainlesschain/actions/runs/30549100289),\n [short distributed soak](https://github.com/chainlesschain/chainlesschain/actions/runs/30549100307),\n and [long distributed soak](https://github.com/chainlesschain/chainlesschain/actions/runs/30549142504)\n gates successfully.\n- **Final release-SHA gate remains mandatory**: this version and changelog\n preparation creates a distinct final release commit. Publication still\n requires that exact final release SHA to pass the authoritative required\n matrices; candidate and local results do not authorize publication."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
4
17
|
{
|
|
5
18
|
"productVersion": null,
|
|
6
19
|
"cliVersion": "0.162.188",
|
package/src/lib/agent-core.js
CHANGED
|
@@ -28,6 +28,11 @@ import { randomUUID } from "node:crypto";
|
|
|
28
28
|
|
|
29
29
|
export const DEFAULT_LEASE_TTL_MS = 60000;
|
|
30
30
|
export const DEFAULT_MAX_ATTEMPTS = 3;
|
|
31
|
+
export const ADJUDICATION_DECISIONS = Object.freeze({
|
|
32
|
+
RETRY: "retry",
|
|
33
|
+
ACCEPT: "accept",
|
|
34
|
+
CANCEL: "cancel",
|
|
35
|
+
});
|
|
31
36
|
|
|
32
37
|
export class TaskLeaseRegistry {
|
|
33
38
|
constructor({
|
|
@@ -423,7 +428,14 @@ export class TaskLeaseRegistry {
|
|
|
423
428
|
*/
|
|
424
429
|
fail(
|
|
425
430
|
key,
|
|
426
|
-
{
|
|
431
|
+
{
|
|
432
|
+
holder,
|
|
433
|
+
leaseId,
|
|
434
|
+
error = null,
|
|
435
|
+
retryable = true,
|
|
436
|
+
adjudication = null,
|
|
437
|
+
now = this._now(),
|
|
438
|
+
} = {},
|
|
427
439
|
) {
|
|
428
440
|
const id = this._byKey.get(key);
|
|
429
441
|
const task = id ? this._tasks.get(id) : null;
|
|
@@ -434,6 +446,23 @@ export class TaskLeaseRegistry {
|
|
|
434
446
|
}
|
|
435
447
|
const attempts = (task.metadata?.attempts || 0) + 1;
|
|
436
448
|
const willRetry = retryable !== false && attempts < this.maxAttempts;
|
|
449
|
+
const adjudicationRequest =
|
|
450
|
+
!willRetry && adjudication && typeof adjudication === "object"
|
|
451
|
+
? {
|
|
452
|
+
required: true,
|
|
453
|
+
code:
|
|
454
|
+
adjudication.code ||
|
|
455
|
+
"TEAM_TASK_SIDE_EFFECT_ADJUDICATION_REQUIRED",
|
|
456
|
+
reason:
|
|
457
|
+
adjudication.reason ||
|
|
458
|
+
(error ? String(error) : "task outcome requires adjudication"),
|
|
459
|
+
evidenceDigest: adjudication.evidenceDigest || null,
|
|
460
|
+
requestedAt: Number.isFinite(adjudication.requestedAt)
|
|
461
|
+
? adjudication.requestedAt
|
|
462
|
+
: now,
|
|
463
|
+
decision: null,
|
|
464
|
+
}
|
|
465
|
+
: task.metadata?.adjudication || null;
|
|
437
466
|
const ok = this._write(task, {
|
|
438
467
|
status: willRetry ? TASK_STATUS.PENDING : TASK_STATUS.CANCELLED,
|
|
439
468
|
assignee: null,
|
|
@@ -442,6 +471,7 @@ export class TaskLeaseRegistry {
|
|
|
442
471
|
lease: null,
|
|
443
472
|
attempts,
|
|
444
473
|
lastError: error ? String(error) : null,
|
|
474
|
+
...(adjudicationRequest ? { adjudication: adjudicationRequest } : {}),
|
|
445
475
|
},
|
|
446
476
|
});
|
|
447
477
|
if (!ok) return { ok: false, reason: "concurrent" };
|
|
@@ -529,6 +559,14 @@ export class TaskLeaseRegistry {
|
|
|
529
559
|
if (!candidate.retry) {
|
|
530
560
|
metadata.attempts = (fresh.metadata?.attempts || 0) + 1;
|
|
531
561
|
metadata.lastError = String(error);
|
|
562
|
+
metadata.adjudication = {
|
|
563
|
+
required: true,
|
|
564
|
+
code: "TEAM_TASK_ABANDONED_ADJUDICATION_REQUIRED",
|
|
565
|
+
reason: String(error),
|
|
566
|
+
evidenceDigest: null,
|
|
567
|
+
requestedAt: this._now(),
|
|
568
|
+
decision: null,
|
|
569
|
+
};
|
|
532
570
|
}
|
|
533
571
|
if (
|
|
534
572
|
this._write(fresh, {
|
|
@@ -550,6 +588,234 @@ export class TaskLeaseRegistry {
|
|
|
550
588
|
return { reclaimed, adjudicationRequired };
|
|
551
589
|
}
|
|
552
590
|
|
|
591
|
+
/**
|
|
592
|
+
* Resolve a fail-closed task after a durable human decision has been
|
|
593
|
+
* authenticated by the adjudication log.
|
|
594
|
+
*
|
|
595
|
+
* This is deliberately the only TaskLeaseRegistry operation allowed to move
|
|
596
|
+
* a CANCELLED task out of a terminal state. The generic SharedTaskList keeps
|
|
597
|
+
* its terminal-state invariant; this method performs a compare-by-revision
|
|
598
|
+
* replacement and records the exceptional transition in task history.
|
|
599
|
+
*/
|
|
600
|
+
resolveAdjudication(
|
|
601
|
+
key,
|
|
602
|
+
{
|
|
603
|
+
decision,
|
|
604
|
+
decisionId,
|
|
605
|
+
actor = "human",
|
|
606
|
+
reason = null,
|
|
607
|
+
evidenceDigest = null,
|
|
608
|
+
result = null,
|
|
609
|
+
now = this._now(),
|
|
610
|
+
} = {},
|
|
611
|
+
) {
|
|
612
|
+
const allowed = new Set(Object.values(ADJUDICATION_DECISIONS));
|
|
613
|
+
if (!allowed.has(decision)) {
|
|
614
|
+
return { ok: false, reason: "invalid_decision" };
|
|
615
|
+
}
|
|
616
|
+
if (!decisionId || typeof decisionId !== "string") {
|
|
617
|
+
return { ok: false, reason: "decision_id_required" };
|
|
618
|
+
}
|
|
619
|
+
const id = this._byKey.get(key);
|
|
620
|
+
const task = id ? this._tasks.get(id) : null;
|
|
621
|
+
if (!task) return { ok: false, reason: "not_found" };
|
|
622
|
+
const pending = task.metadata?.adjudication || null;
|
|
623
|
+
if (pending?.required !== true) {
|
|
624
|
+
const prior = pending?.decision || null;
|
|
625
|
+
if (prior?.id === decisionId && prior?.action === decision) {
|
|
626
|
+
return {
|
|
627
|
+
ok: true,
|
|
628
|
+
idempotent: true,
|
|
629
|
+
decision,
|
|
630
|
+
status: task.status,
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
return { ok: false, reason: "adjudication_not_required" };
|
|
634
|
+
}
|
|
635
|
+
if (task.status !== TASK_STATUS.CANCELLED) {
|
|
636
|
+
return { ok: false, reason: "invalid_task_state" };
|
|
637
|
+
}
|
|
638
|
+
if (pending.evidenceDigest && pending.evidenceDigest !== evidenceDigest) {
|
|
639
|
+
return { ok: false, reason: "evidence_mismatch" };
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
const status =
|
|
643
|
+
decision === ADJUDICATION_DECISIONS.RETRY
|
|
644
|
+
? TASK_STATUS.PENDING
|
|
645
|
+
: decision === ADJUDICATION_DECISIONS.ACCEPT
|
|
646
|
+
? TASK_STATUS.COMPLETED
|
|
647
|
+
: TASK_STATUS.CANCELLED;
|
|
648
|
+
const decidedAt = Number.isFinite(now) ? now : this._now();
|
|
649
|
+
const decisionRecord = {
|
|
650
|
+
id: decisionId,
|
|
651
|
+
action: decision,
|
|
652
|
+
actor: actor ? String(actor) : "human",
|
|
653
|
+
reason: reason == null ? null : String(reason),
|
|
654
|
+
evidenceDigest: evidenceDigest || pending.evidenceDigest || null,
|
|
655
|
+
decidedAt,
|
|
656
|
+
};
|
|
657
|
+
const snapshot = this._tasks.snapshot();
|
|
658
|
+
const stored = snapshot.tasks.find((candidate) => candidate.id === task.id);
|
|
659
|
+
if (!stored || stored.rev !== task.rev) {
|
|
660
|
+
return { ok: false, reason: "concurrent" };
|
|
661
|
+
}
|
|
662
|
+
stored.status = status;
|
|
663
|
+
stored.assignee = null;
|
|
664
|
+
stored.updatedAt = decidedAt;
|
|
665
|
+
stored.rev += 1;
|
|
666
|
+
stored.metadata = {
|
|
667
|
+
...stored.metadata,
|
|
668
|
+
lease: null,
|
|
669
|
+
...(decision === ADJUDICATION_DECISIONS.ACCEPT
|
|
670
|
+
? {
|
|
671
|
+
result: result ?? {
|
|
672
|
+
adjudicated: true,
|
|
673
|
+
decisionId,
|
|
674
|
+
},
|
|
675
|
+
}
|
|
676
|
+
: {}),
|
|
677
|
+
adjudication: {
|
|
678
|
+
...pending,
|
|
679
|
+
required: false,
|
|
680
|
+
decision: decisionRecord,
|
|
681
|
+
},
|
|
682
|
+
};
|
|
683
|
+
stored.history = [
|
|
684
|
+
...(stored.history || []),
|
|
685
|
+
{
|
|
686
|
+
ts: decidedAt,
|
|
687
|
+
actor: decisionRecord.actor,
|
|
688
|
+
action: "adjudicated",
|
|
689
|
+
changes: ["status", "assignee", "metadata"],
|
|
690
|
+
decision: decisionRecord.action,
|
|
691
|
+
decisionId,
|
|
692
|
+
},
|
|
693
|
+
];
|
|
694
|
+
this._tasks = SharedTaskList.restore(snapshot, { now: this._now });
|
|
695
|
+
this._rebuildIndexes();
|
|
696
|
+
if (status === TASK_STATUS.PENDING) {
|
|
697
|
+
this._enqueueIfReady(key, decidedAt);
|
|
698
|
+
} else if (status === TASK_STATUS.COMPLETED) {
|
|
699
|
+
for (const dependent of this._dependentsByKey.get(key) || []) {
|
|
700
|
+
this._enqueueIfReady(dependent, decidedAt);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
return { ok: true, decision, status };
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Force any recovery-ambiguous task into the fail-closed adjudication state.
|
|
708
|
+
* This exceptional transition is used only when durable collaboration
|
|
709
|
+
* evidence contradicts or weakens the registry snapshot.
|
|
710
|
+
*/
|
|
711
|
+
requireAdjudication(
|
|
712
|
+
key,
|
|
713
|
+
{
|
|
714
|
+
code = "TEAM_TASK_SIDE_EFFECT_ADJUDICATION_REQUIRED",
|
|
715
|
+
reason = "task outcome requires adjudication",
|
|
716
|
+
evidenceDigest = null,
|
|
717
|
+
now = this._now(),
|
|
718
|
+
} = {},
|
|
719
|
+
) {
|
|
720
|
+
const id = this._byKey.get(key);
|
|
721
|
+
const task = id ? this._tasks.get(id) : null;
|
|
722
|
+
if (!task) return { ok: false, reason: "not_found" };
|
|
723
|
+
if (task.metadata?.adjudication?.required === true) {
|
|
724
|
+
return { ok: true, idempotent: true };
|
|
725
|
+
}
|
|
726
|
+
const snapshot = this._tasks.snapshot();
|
|
727
|
+
const stored = snapshot.tasks.find((candidate) => candidate.id === task.id);
|
|
728
|
+
if (!stored || stored.rev !== task.rev) {
|
|
729
|
+
return { ok: false, reason: "concurrent" };
|
|
730
|
+
}
|
|
731
|
+
const requestedAt = Number.isFinite(now) ? now : this._now();
|
|
732
|
+
const priorStatus = stored.status;
|
|
733
|
+
stored.status = TASK_STATUS.CANCELLED;
|
|
734
|
+
stored.assignee = null;
|
|
735
|
+
stored.updatedAt = requestedAt;
|
|
736
|
+
stored.rev += 1;
|
|
737
|
+
stored.metadata = {
|
|
738
|
+
...stored.metadata,
|
|
739
|
+
lease: null,
|
|
740
|
+
lastError: String(reason),
|
|
741
|
+
adjudication: {
|
|
742
|
+
required: true,
|
|
743
|
+
code: String(code),
|
|
744
|
+
reason: String(reason),
|
|
745
|
+
evidenceDigest: evidenceDigest || null,
|
|
746
|
+
requestedAt,
|
|
747
|
+
priorStatus,
|
|
748
|
+
decision: null,
|
|
749
|
+
},
|
|
750
|
+
};
|
|
751
|
+
stored.history = [
|
|
752
|
+
...(stored.history || []),
|
|
753
|
+
{
|
|
754
|
+
ts: requestedAt,
|
|
755
|
+
actor: "recovery",
|
|
756
|
+
action: "adjudication-required",
|
|
757
|
+
changes: ["status", "assignee", "metadata"],
|
|
758
|
+
},
|
|
759
|
+
];
|
|
760
|
+
this._tasks = SharedTaskList.restore(snapshot, { now: this._now });
|
|
761
|
+
this._rebuildIndexes();
|
|
762
|
+
return { ok: true, priorStatus };
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/** Bind a pending adjudication to its immutable durable case evidence. */
|
|
766
|
+
bindAdjudicationCase(key, { caseId, registryDigest, sideEffectDigest } = {}) {
|
|
767
|
+
const id = this._byKey.get(key);
|
|
768
|
+
const task = id ? this._tasks.get(id) : null;
|
|
769
|
+
if (!task) return { ok: false, reason: "not_found" };
|
|
770
|
+
const adjudication = task.metadata?.adjudication || null;
|
|
771
|
+
if (adjudication?.required !== true) {
|
|
772
|
+
return { ok: false, reason: "adjudication_not_required" };
|
|
773
|
+
}
|
|
774
|
+
for (const [name, value] of Object.entries({
|
|
775
|
+
caseId,
|
|
776
|
+
registryDigest,
|
|
777
|
+
sideEffectDigest,
|
|
778
|
+
})) {
|
|
779
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
780
|
+
return { ok: false, reason: `${name}_required` };
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
const current = adjudication.case || null;
|
|
784
|
+
if (current) {
|
|
785
|
+
if (
|
|
786
|
+
current.caseId === caseId &&
|
|
787
|
+
current.registryDigest === registryDigest &&
|
|
788
|
+
current.sideEffectDigest === sideEffectDigest
|
|
789
|
+
) {
|
|
790
|
+
return { ok: true, idempotent: true, case: { ...current } };
|
|
791
|
+
}
|
|
792
|
+
return { ok: false, reason: "case_binding_conflict" };
|
|
793
|
+
}
|
|
794
|
+
const binding = { caseId, registryDigest, sideEffectDigest };
|
|
795
|
+
const ok = this._write(task, {
|
|
796
|
+
metadata: {
|
|
797
|
+
...task.metadata,
|
|
798
|
+
adjudication: {
|
|
799
|
+
...adjudication,
|
|
800
|
+
case: binding,
|
|
801
|
+
},
|
|
802
|
+
},
|
|
803
|
+
});
|
|
804
|
+
return ok
|
|
805
|
+
? { ok: true, case: { ...binding } }
|
|
806
|
+
: { ok: false, reason: "concurrent" };
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
pendingAdjudications() {
|
|
810
|
+
return this.list()
|
|
811
|
+
.filter((task) => task.metadata?.adjudication?.required === true)
|
|
812
|
+
.map((task) => ({
|
|
813
|
+
key: task.key,
|
|
814
|
+
status: task.status,
|
|
815
|
+
...task.metadata.adjudication,
|
|
816
|
+
}));
|
|
817
|
+
}
|
|
818
|
+
|
|
553
819
|
stats({ now = this._now() } = {}) {
|
|
554
820
|
const base = this._tasks.stats();
|
|
555
821
|
let leased = 0;
|
|
@@ -566,6 +832,7 @@ export class TaskLeaseRegistry {
|
|
|
566
832
|
leased,
|
|
567
833
|
expiredLeases: expired,
|
|
568
834
|
claimable: this.claimable({ now }).length,
|
|
835
|
+
adjudicationRequired: this.pendingAdjudications().length,
|
|
569
836
|
};
|
|
570
837
|
}
|
|
571
838
|
|
|
@@ -575,8 +842,9 @@ export class TaskLeaseRegistry {
|
|
|
575
842
|
.list()
|
|
576
843
|
.every(
|
|
577
844
|
(t) =>
|
|
578
|
-
t.status === TASK_STATUS.COMPLETED ||
|
|
579
|
-
|
|
845
|
+
(t.status === TASK_STATUS.COMPLETED ||
|
|
846
|
+
t.status === TASK_STATUS.CANCELLED) &&
|
|
847
|
+
t.metadata?.adjudication?.required !== true,
|
|
580
848
|
);
|
|
581
849
|
}
|
|
582
850
|
|