chainlesschain 0.166.2 → 0.166.3
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-BnZ24WRk.js → AIOps-DZTvbk_H.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ivXY7MGb.js → ActionButton-IaEVUN3o.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BQS4OD-k.js → Analytics-CCQab0gl.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-wOBuOKTO.js → AppLayout-Bs_0GVpx.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BYuC4nw-.js → Artifacts-Bm83-yJv.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BIeVfBt6.js → Audit-Bah1XDR5.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-hIuyhmJ7.js → BackgroundAgents-BPZA0B5d.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B6ohdgPQ.js → Backup-BMydWFiM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BzgYCw6h.js → BaseInput-lhopFSZz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwahvZU1.js → Chat-Bbbs5BP1.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-B-1IZ_k8.js → ChatBubbleRenderer-BIAfOKCj.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-26EDP2x0.js → Checkbox-CLEMA9J4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DYLw1Zvd.js → Codegen-deCSwmnK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DH_zAvD-.js → Col-CH-n8haq.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DURrTXJu.js → Community-DJuAl6dw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CQyBqN0p.js → Compact-BMyLBmgs.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-a0DfgKHD.js → Compliance-BK75Ss93.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C6fY_5Ke.js → Cowork-5XbJwKYq.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DOwmpbTe.js → Cron-Ezgir7IZ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DEPOIEUs.js → Crosschain-CKuMoYA7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DaKc-CEV.js → DID-CxS244cH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C-0KLXq5.js → Dashboard-wrUKrsJy.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CnsDukzr.js → Dropdown-A6I91Z2J.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bi_ACD4N.js → EmailListRenderer-BofaiRYY.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZASpnx3.js → FamilyGuardDashboard-D3eeNA64.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-43oTtzyp.js → Federation-DzK-3AjS.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-oyVadnkZ.js → FormItemContext-Dm6mYA8b.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Cwvfd6TZ.js → GenericCardRenderer-BeWL-Q1b.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cgi2wvU0.js → Git-CtGCxg9p.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-l8TWDKZ0.js → Governance-DZvFB46G.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dc8j6TaO.js → Inference-ntqp4cmw.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DgcO-Fwz.js → KnowledgeGraph-CrLYbqLe.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DjiZpiwa.js → Logs-CKA1PRhC.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BeDn1hFc.js → Marketplace-B8aPsXYv.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-PGdVfWK6.js → McpTools-DQOgNdGS.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-e76lY3a1.js → Memory-i9IK9B0M.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DKlQqot_.js → MobileBridge-BynYvpv9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C4g6WOEr.js → MobileProjects-DixivGuQ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-1j3NpRQq.js → Mtc-OWPvWVNr.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DgwiVd1C.js → MtcAudit-Cqpg5C4A.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-Dzg5lZZY.js → Multisig-CT5kMJIZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D7GYhst-.js → NLProgramming-BXD0Dz0h.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Blcfvaic.js → Notes-T1w5p8N5.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Dc4Y6vfr.js → NotificationSettings-DFCThpKJ.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BJOuM0Kl.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DBXq024L.js → Organization-CSFcw86q.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CFPbdx1Y.js → Overflow-BxVMuLTk.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-w7z61NR5.js → P2P-B8qxY_yX.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B7eGGZOa.js → PdhVaultBrowser-Bcq27Exy.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Df5Cl50D.js → Permissions-CGBvJVXP.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C-We7RF6.js → PersonalDataHub-DM9IEeJ3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-B6fHPnKy.js → Pipeline-wEskx2-p.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B85BdiIc.js → Privacy-DIA02lLJ.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CcOyazSe.js → ProjectInit-uMXlNLHV.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BE53KfuU.js → ProjectSettings-Sy3NOtt7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DOvMOoe_.js → Projects-xFjfOkQM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-5l7sT9lq.js → Providers-CNyOpbg8.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DE37RXy4.js → QrScannerModal-Dk1UVRwI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BGmGCo7j.js → QuickAsk-B-UqLoLG.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BFdx8Nrm.js → Recommend-CiTBVZvN.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C1w-j_hB.js → RemoteSession-BhABd516.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BOvn-10y.js → Reputation-Dq1xTCcN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-db-a1YO9.js → Row-DbFc4sc7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DeS43ZGM.js → RssFeed-D7IBkkLm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BaQYNfeb.js → Search-BVyMlGoa.js} +1 -1
- package/src/assets/web-panel/assets/{Security-yt1ESHDg.js → Security-BzMm9Be_.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BcNqPUsS.js → Services-Dfk0kied.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-X3ceUQWf.js → Skeleton-C8B5mUit.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +1 -0
- package/src/assets/web-panel/assets/{Sla-C_fdfbuJ.js → Sla-gnFelKfT.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CDqohXXQ.js → SpeechSettings-B12gCQkK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B25maYEY.js → SyncSettings-CHWk9cpj.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_zs9jkJ.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DUH0iuc4.js → Templates-PjdppQrI.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DrvhHf9T.js → Tenant-CH3aARxE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C2lJVYHA.js → Terminal-BqqrYyg3.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C1Hf_jYn.js → TimelineRenderer-Dx9soq9f.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DniS1NpS.js → Tokens-C66KpDDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-4jrcb8oA.js → Trigger-DHxgGsap.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DiBte55w.js → Trust-3cct4QxN.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CZRtc4VB.js → UkeySign-Cs6UfDEH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BtYGJDmg.js → VideoEditing-jbu2EAQa.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D1nrTm7H.js → Wallet-BIykFB9D.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DI91acpx.js → WebAuthn-DFgqKmHG.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BtQjI50d.js → WorkflowEditor-CNg5bBiH.js} +1 -1
- package/src/assets/web-panel/assets/{chat-I4A-f4FC.js → chat-B-6wzojE.js} +1 -1
- package/src/assets/web-panel/assets/{colors-QZkDkFVt.js → colors-BHAq7y9y.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item--FtCdzpr.js → compact-item-CGJnSTnu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CaIKIKxP.js → createContext-Cx0ZF512.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CNq_RRw4.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLYUII6-.js → hasIn-DibIw3z7.js} +1 -1
- package/src/assets/web-panel/assets/{index-OQPIS_am.js → index-0NWSa3Xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-3rVtgqa2.js → index-746-mNhw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxPoPofq.js → index-Aaeca8o4.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4CXFU-w.js → index-B1jAbIxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLGJmgmx.js → index-B28jdxwR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CL4c5D6G.js → index-B2rOMBeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-vfiDxdN2.js → index-BAoFiV3n.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du2wUavy.js → index-BCtW4F8-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAuf8r5o.js → index-BEXM3qSV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGWSmE3G.js → index-BFTGp-aF.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTqL91aV.js → index-BJhS6i02.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ7OBHka.js → index-BO-XxBD5.js} +1 -1
- package/src/assets/web-panel/assets/{index-hfiZ-i2b.js → index-BR2BiNtx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBtII-nl.js → index-BRflLAdr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch0IFpGy.js → index-BTWb3sbj.js} +1 -1
- package/src/assets/web-panel/assets/{index-B65QxJaG.js → index-BZ7GbrgF.js} +1 -1
- package/src/assets/web-panel/assets/index-B_H-RZ9i.js +1 -0
- package/src/assets/web-panel/assets/{index-BebTT7iR.js → index-BiMLsIwd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ygi2rYL1.js → index-Bmqjip63.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGLHSCHM.js → index-BoySHSgZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJrd_CR3.js → index-Bz3J0eVB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DK2r6Bv7.js → index-C6M2yHVE.js} +1 -1
- package/src/assets/web-panel/assets/{index-yayaayEA.js → index-CH2A_Fdn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ooo_5jHo.js → index-CUX9mq3M.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2xETCkj.js → index-CY2E4Y99.js} +1 -1
- package/src/assets/web-panel/assets/index-CkH9UQQL.js +1 -0
- package/src/assets/web-panel/assets/{index-CisYjy88.js → index-CoKu7Q9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA_TPdzX.js → index-CrjkH_QU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs0qPPFb.js → index-Cuity3gy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkJgWW_L.js → index-CwcWpW1q.js} +1 -1
- package/src/assets/web-panel/assets/{index-Deg2S9ZJ.js → index-Cz5ety6j.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXaeZCRP.js → index-DXNcm44v.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVitI3UQ.js → index-DjCJIttz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgMm85BY.js → index-DnsVRqCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-21I79XSf.js → index-SbQacweG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcgtvJbC.js → index-g0V_mLQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvdwNnHC.js → index-puIs3mTs.js} +3 -3
- package/src/assets/web-panel/assets/{index-0DYBQ-6e.js → index-sI_1E0co.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3PnIEOH.js → index-woOjtit-.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DDkTvw8k.js → initDefaultProps-Gbl9QOqg.js} +1 -1
- package/src/assets/web-panel/assets/{motion-fkr96tN5.js → motion-BHh6ZzZu.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGBV0SV2.js → move-mX6Rwrd1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAsCliFt.js → mtc-parser-CuzZa_kI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BM8PMmKN.js → omit-DjANYkpi.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C6SdWoTK.js → pickAttrs-C_3v40wY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BG0EVu-d.js → placementArrow-L2HgRede.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-L10IvfYC.js → responsiveObserve-DIkGMHyT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-TddIkbrn.js → slide-C1hp5tD0.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-FlveF2Yn.js → statusUtils-DH1W2uFA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BrXRyebg.js → styleChecker-dEaKQcv2.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B7_oiDXZ.js → useFlexGapSupport-CD7j1zxt.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CQYeRYWb.js → useFs-C8jXMvEM.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DspIkhVi.js → usePersonalDataHub-C4r-8mys.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BCwmwMAW.js → vnode-DDuI6wgY.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B0cEGluV.js → zoom-Dd-DteT6.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/team.js +165 -53
- package/src/data/changelog.json +13 -0
- package/src/lib/agent-team/task-lease.js +718 -6
- package/src/lib/agent-team/team-graph-projection.js +303 -0
- package/src/lib/agent-team/team-message-bridge.js +83 -5
- package/src/lib/agent-team/team-message-tools.js +34 -1
- package/src/lib/agent-team/team-runner.js +1131 -9
- package/src/lib/agent-team/team-session-message-adapter.js +720 -0
- package/src/lib/app-server/cli-agent-kernel-adapter.js +1 -0
- package/src/lib/app-server/protocol.js +43 -0
- package/src/lib/app-server/server.js +8 -11
- package/src/lib/approval-grant-ledger.js +187 -0
- package/src/lib/session-message-fabric.js +265 -3
- package/src/runtime/headless-stream.js +184 -19
- package/src/assets/web-panel/assets/MarkdownRenderer-B5MFCi0N.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-dgM87XIn.js +0 -1
- package/src/assets/web-panel/assets/Skills-DmYeax6C.js +0 -1
- package/src/assets/web-panel/assets/Tasks-3ILwauYw.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D7qVrkrO.js +0 -1
- package/src/assets/web-panel/assets/index-D9Y_ZwZn.js +0 -1
- package/src/assets/web-panel/assets/index-D_cPes4G.js +0 -1
package/src/commands/team.js
CHANGED
|
@@ -24,8 +24,14 @@ import { TeamRunner } from "../lib/agent-team/team-runner.js";
|
|
|
24
24
|
import { TeamWorktreeCoordinator } from "../lib/agent-team/team-worktree.js";
|
|
25
25
|
import { TeamBudget } from "../lib/agent-team/team-budget.js";
|
|
26
26
|
import { TeamMailbox } from "../lib/agent-team/team-mailbox.js";
|
|
27
|
+
import { TeamSessionMessageAdapter } from "../lib/agent-team/team-session-message-adapter.js";
|
|
27
28
|
import { TeamAgentStreamParser } from "../lib/agent-team/team-agent-stream.js";
|
|
28
29
|
import { TeamMessageBridge } from "../lib/agent-team/team-message-bridge.js";
|
|
30
|
+
import {
|
|
31
|
+
computeTeamGraphAuthorityDigest,
|
|
32
|
+
computeTeamGraphRevisionDigest,
|
|
33
|
+
projectTeamGraphCollaboration,
|
|
34
|
+
} from "../lib/agent-team/team-graph-projection.js";
|
|
29
35
|
import { resolveTeamTaskContract } from "../lib/agent-team/team-task-contract.js";
|
|
30
36
|
import {
|
|
31
37
|
TeamScopeLock,
|
|
@@ -1371,6 +1377,8 @@ export function makeAgentRunTask(opts = {}) {
|
|
|
1371
1377
|
sendMessage = null,
|
|
1372
1378
|
messageAuthority = null,
|
|
1373
1379
|
recipientState = null,
|
|
1380
|
+
requestFollowupWake = null,
|
|
1381
|
+
requestHandoff = null,
|
|
1374
1382
|
mailbox = null,
|
|
1375
1383
|
budgetReservation = null,
|
|
1376
1384
|
signal = null,
|
|
@@ -1395,7 +1403,7 @@ export function makeAgentRunTask(opts = {}) {
|
|
|
1395
1403
|
);
|
|
1396
1404
|
return spawnAgent(buildTeamAgentPrompt(prompt, { inbox }), process.cwd(), {
|
|
1397
1405
|
...effectiveContract,
|
|
1398
|
-
sessionId: opts.sessionIdForTask?.(key) || null,
|
|
1406
|
+
sessionId: opts.sessionIdForTask?.(key, task) || null,
|
|
1399
1407
|
signal,
|
|
1400
1408
|
...(mailbox && holder
|
|
1401
1409
|
? {
|
|
@@ -1405,6 +1413,8 @@ export function makeAgentRunTask(opts = {}) {
|
|
|
1405
1413
|
sendMessage,
|
|
1406
1414
|
assertAuthority: messageAuthority,
|
|
1407
1415
|
recipientState,
|
|
1416
|
+
requestFollowupWake,
|
|
1417
|
+
requestHandoff,
|
|
1408
1418
|
onMutation: opts.onMailboxMutation,
|
|
1409
1419
|
durable: opts.mailboxDurable === true,
|
|
1410
1420
|
},
|
|
@@ -2160,8 +2170,17 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2160
2170
|
return;
|
|
2161
2171
|
}
|
|
2162
2172
|
const ttlMs = limits.ttlMs;
|
|
2173
|
+
const stateId = resumeSnapshot?.stateId || `team_state_${randomUUID()}`;
|
|
2174
|
+
const messageStatePath = options.state
|
|
2175
|
+
? `${options.state}.${stateId}.messages.json`
|
|
2176
|
+
: null;
|
|
2163
2177
|
let reg;
|
|
2164
|
-
let mailbox =
|
|
2178
|
+
let mailbox = options.state
|
|
2179
|
+
? new TeamSessionMessageAdapter({
|
|
2180
|
+
statePath: messageStatePath,
|
|
2181
|
+
teamId: stateId,
|
|
2182
|
+
})
|
|
2183
|
+
: new TeamMailbox();
|
|
2165
2184
|
let budget = new TeamBudget({
|
|
2166
2185
|
maxTasks: limits.maxTasks,
|
|
2167
2186
|
maxTokens: limits.maxTokens,
|
|
@@ -2181,7 +2200,32 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2181
2200
|
const isV2 = snap && snap.version >= 2 && snap.registry;
|
|
2182
2201
|
reg = TaskLeaseRegistry.restore(isV2 ? snap.registry : snap);
|
|
2183
2202
|
if (isV2) {
|
|
2184
|
-
if (snap.mailbox
|
|
2203
|
+
if (snap.mailbox?.authority === "session-message-fabric") {
|
|
2204
|
+
if (
|
|
2205
|
+
!sameFilesystemPath(
|
|
2206
|
+
path.resolve(snap.mailbox.statePath),
|
|
2207
|
+
path.resolve(messageStatePath),
|
|
2208
|
+
)
|
|
2209
|
+
) {
|
|
2210
|
+
throw new Error(
|
|
2211
|
+
"Team message authority path does not match the trusted state identity",
|
|
2212
|
+
);
|
|
2213
|
+
}
|
|
2214
|
+
mailbox = TeamSessionMessageAdapter.restore(snap.mailbox, {
|
|
2215
|
+
statePath: messageStatePath,
|
|
2216
|
+
teamId: stateId,
|
|
2217
|
+
});
|
|
2218
|
+
} else if (snap.mailbox && options.state) {
|
|
2219
|
+
mailbox = TeamSessionMessageAdapter.migrateLegacy(
|
|
2220
|
+
snap.mailbox,
|
|
2221
|
+
{
|
|
2222
|
+
statePath: messageStatePath,
|
|
2223
|
+
teamId: stateId,
|
|
2224
|
+
},
|
|
2225
|
+
);
|
|
2226
|
+
} else if (snap.mailbox) {
|
|
2227
|
+
mailbox = TeamMailbox.restore(snap.mailbox);
|
|
2228
|
+
}
|
|
2185
2229
|
budget = TeamBudget.restore(snap.budget, {
|
|
2186
2230
|
// Resume flags may only tighten prior caps; omitted flags keep
|
|
2187
2231
|
// the persisted authority.
|
|
@@ -2285,6 +2329,11 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2285
2329
|
}),
|
|
2286
2330
|
]),
|
|
2287
2331
|
);
|
|
2332
|
+
const sessionTaskKeyFor = (key, task = reg.getTask(key)) =>
|
|
2333
|
+
task?.metadata?.teamFollowup?.sessionTaskKey || key;
|
|
2334
|
+
const taskContractFor = (key, task = reg.getTask(key)) =>
|
|
2335
|
+
taskContracts.get(key) ||
|
|
2336
|
+
taskContracts.get(sessionTaskKeyFor(key, task));
|
|
2288
2337
|
if ((options.agent || options.exec) && !options.worktree) {
|
|
2289
2338
|
const isolatedTask = reg
|
|
2290
2339
|
.list()
|
|
@@ -2352,7 +2401,6 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2352
2401
|
);
|
|
2353
2402
|
}
|
|
2354
2403
|
}
|
|
2355
|
-
const stateId = resumeSnapshot?.stateId || `team_state_${randomUUID()}`;
|
|
2356
2404
|
let controlCursor = resumeSnapshot?.controlCursor || null;
|
|
2357
2405
|
let adjudicationCursor = resumeSnapshot?.adjudicationCursor || null;
|
|
2358
2406
|
let adjudicationRunId = resumeSnapshot?.adjudicationRunId || null;
|
|
@@ -2531,37 +2579,40 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2531
2579
|
checkpointRequired:
|
|
2532
2580
|
options.agent === true || options.managedCheckpoint === true,
|
|
2533
2581
|
worktreeRequired: options.worktree === true,
|
|
2534
|
-
units: reg
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
:
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
:
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2582
|
+
units: reg
|
|
2583
|
+
.list()
|
|
2584
|
+
.filter((task) => !task.metadata?.teamFollowup)
|
|
2585
|
+
.map((task) => ({
|
|
2586
|
+
key: task.key,
|
|
2587
|
+
branch: options.worktree
|
|
2588
|
+
? priorUnits.get(task.key)?.branch ||
|
|
2589
|
+
branchPlanner.branchFor(task.key)
|
|
2590
|
+
: null,
|
|
2591
|
+
worktreePath: options.worktree
|
|
2592
|
+
? priorUnits.get(task.key)?.worktreePath || null
|
|
2593
|
+
: null,
|
|
2594
|
+
sessionId: options.agent
|
|
2595
|
+
? priorUnits.get(task.key)?.sessionId ||
|
|
2596
|
+
_deps.collaborationStore.createSessionId(runId, task.key)
|
|
2597
|
+
: null,
|
|
2598
|
+
status:
|
|
2599
|
+
String(task.status || "").toLowerCase() === "completed"
|
|
2600
|
+
? "completed"
|
|
2601
|
+
: "pending",
|
|
2602
|
+
permissionMode: taskContracts.get(task.key)?.permissionMode,
|
|
2603
|
+
resourceBudget: {
|
|
2604
|
+
maxTurns: taskContracts.get(task.key)?.maxTurns,
|
|
2605
|
+
maxCostUsd: taskContracts.get(task.key)?.maxBudgetUsd,
|
|
2606
|
+
maxTokens: taskContracts.get(task.key)?.maxTokens,
|
|
2607
|
+
maxWallMs: taskContracts.get(task.key)?.maxWallMs,
|
|
2608
|
+
},
|
|
2609
|
+
checkpointRequired:
|
|
2610
|
+
taskContracts.get(task.key)?.checkpointRequired === true ||
|
|
2611
|
+
options.managedCheckpoint === true,
|
|
2612
|
+
worktreeRequired:
|
|
2613
|
+
taskContracts.get(task.key)?.worktreeRequired === true,
|
|
2614
|
+
scopePaths: task.metadata?.scopePaths || [],
|
|
2615
|
+
})),
|
|
2565
2616
|
});
|
|
2566
2617
|
} catch (err) {
|
|
2567
2618
|
(log.error || console.error)(
|
|
@@ -2573,8 +2624,27 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2573
2624
|
const collaborationUnits = new Map(
|
|
2574
2625
|
collaborationRun.units.map((unit) => [unit.key, unit]),
|
|
2575
2626
|
);
|
|
2627
|
+
const teamGraphRunId =
|
|
2628
|
+
resumeSnapshot?.graphProjection?.runId || `team:${stateId}`;
|
|
2629
|
+
const teamGraphRevisionDigest =
|
|
2630
|
+
resumeSnapshot?.graphProjection?.revisionDigest ||
|
|
2631
|
+
computeTeamGraphRevisionDigest(reg);
|
|
2632
|
+
const teamGraphAuthorityDigest =
|
|
2633
|
+
resumeSnapshot?.graphProjection?.authorityDigest ||
|
|
2634
|
+
computeTeamGraphAuthorityDigest({
|
|
2635
|
+
stateId,
|
|
2636
|
+
permissionMode: options.agent ? permissionMode : "default",
|
|
2637
|
+
worktreeRequired: options.worktree === true,
|
|
2638
|
+
checkpointRequired:
|
|
2639
|
+
options.agent === true || options.managedCheckpoint === true,
|
|
2640
|
+
holders: Array.from(
|
|
2641
|
+
{ length: Math.min(teammates, Math.max(1, reg.list().length)) },
|
|
2642
|
+
(_, index) => `teammate-${index + 1}`,
|
|
2643
|
+
),
|
|
2644
|
+
});
|
|
2576
2645
|
const settleGovernance = (key, status, extra = {}) => {
|
|
2577
|
-
const
|
|
2646
|
+
const governanceKey = sessionTaskKeyFor(key);
|
|
2647
|
+
const unit = collaborationUnits.get(governanceKey);
|
|
2578
2648
|
let sideEffects = null;
|
|
2579
2649
|
if (unit?.sessionId) {
|
|
2580
2650
|
try {
|
|
@@ -2587,7 +2657,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2587
2657
|
}
|
|
2588
2658
|
const updated = _deps.collaborationStore.updateUnit(
|
|
2589
2659
|
collaborationRun.id,
|
|
2590
|
-
|
|
2660
|
+
governanceKey,
|
|
2591
2661
|
{
|
|
2592
2662
|
status,
|
|
2593
2663
|
...extra,
|
|
@@ -2595,7 +2665,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2595
2665
|
},
|
|
2596
2666
|
{ returnUnit: true },
|
|
2597
2667
|
);
|
|
2598
|
-
if (updated) collaborationUnits.set(
|
|
2668
|
+
if (updated) collaborationUnits.set(governanceKey, updated);
|
|
2599
2669
|
};
|
|
2600
2670
|
|
|
2601
2671
|
// Persist a snapshot after each task settles so a crash mid-run is
|
|
@@ -2626,6 +2696,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2626
2696
|
adjudicationRunId,
|
|
2627
2697
|
adjudicationCursor,
|
|
2628
2698
|
execution: executionContract,
|
|
2699
|
+
graphProjection: projectTeamGraphCollaboration({
|
|
2700
|
+
runId: teamGraphRunId,
|
|
2701
|
+
mailbox,
|
|
2702
|
+
registry: reg,
|
|
2703
|
+
recipients: mailbox.status?.().recipients || [],
|
|
2704
|
+
revisionDigest: teamGraphRevisionDigest,
|
|
2705
|
+
authorityDigest: teamGraphAuthorityDigest,
|
|
2706
|
+
}),
|
|
2629
2707
|
});
|
|
2630
2708
|
};
|
|
2631
2709
|
|
|
@@ -2718,6 +2796,8 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2718
2796
|
sendMessage = null,
|
|
2719
2797
|
messageAuthority = null,
|
|
2720
2798
|
recipientState = null,
|
|
2799
|
+
requestFollowupWake = null,
|
|
2800
|
+
requestHandoff = null,
|
|
2721
2801
|
mailbox: taskMailbox = null,
|
|
2722
2802
|
budgetReservation = null,
|
|
2723
2803
|
signal = null,
|
|
@@ -2728,7 +2808,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2728
2808
|
throw new Error(`task "${key}" has no \`prompt\` to --agent`);
|
|
2729
2809
|
}
|
|
2730
2810
|
const contract = applyBudgetReservation(
|
|
2731
|
-
|
|
2811
|
+
taskContractFor(key, task),
|
|
2732
2812
|
budgetReservation,
|
|
2733
2813
|
);
|
|
2734
2814
|
return spawnAgent(
|
|
@@ -2743,7 +2823,9 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2743
2823
|
? false
|
|
2744
2824
|
: contract.checkpointRequired,
|
|
2745
2825
|
managedCheckpoint,
|
|
2746
|
-
sessionId: collaborationUnits.get(
|
|
2826
|
+
sessionId: collaborationUnits.get(
|
|
2827
|
+
sessionTaskKeyFor(key, task),
|
|
2828
|
+
)?.sessionId,
|
|
2747
2829
|
signal,
|
|
2748
2830
|
...(taskMailbox && holder
|
|
2749
2831
|
? {
|
|
@@ -2753,6 +2835,8 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2753
2835
|
sendMessage,
|
|
2754
2836
|
assertAuthority: messageAuthority,
|
|
2755
2837
|
recipientState,
|
|
2838
|
+
requestFollowupWake,
|
|
2839
|
+
requestHandoff,
|
|
2756
2840
|
onMutation: persist,
|
|
2757
2841
|
durable: Boolean(options.state),
|
|
2758
2842
|
},
|
|
@@ -2775,9 +2859,10 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2775
2859
|
runTask = makeShellRunTask(log);
|
|
2776
2860
|
} else if (options.agent)
|
|
2777
2861
|
runTask = makeAgentRunTask({
|
|
2778
|
-
contractForTask: (key) =>
|
|
2862
|
+
contractForTask: (key, task) => taskContractFor(key, task),
|
|
2779
2863
|
worktreeEnabled: false,
|
|
2780
|
-
sessionIdForTask: (key) =>
|
|
2864
|
+
sessionIdForTask: (key, task) =>
|
|
2865
|
+
collaborationUnits.get(sessionTaskKeyFor(key, task))?.sessionId,
|
|
2781
2866
|
onMailboxMutation: persist,
|
|
2782
2867
|
mailboxDurable: Boolean(options.state),
|
|
2783
2868
|
});
|
|
@@ -2838,7 +2923,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2838
2923
|
}
|
|
2839
2924
|
const binding = adjudicationBindingFor(
|
|
2840
2925
|
task,
|
|
2841
|
-
collaborationUnits.get(key) || null,
|
|
2926
|
+
collaborationUnits.get(sessionTaskKeyFor(key, task)) || null,
|
|
2842
2927
|
);
|
|
2843
2928
|
const opened = adjudicationStore.openCase(binding, {
|
|
2844
2929
|
anchor: adjudicationCursor,
|
|
@@ -2865,7 +2950,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2865
2950
|
runTask,
|
|
2866
2951
|
budget,
|
|
2867
2952
|
budgetForTask: options.agent
|
|
2868
|
-
? (task) =>
|
|
2953
|
+
? (task) => taskContractFor(task.key, task)
|
|
2869
2954
|
: () => ({ reserveUsage: false }),
|
|
2870
2955
|
mailbox,
|
|
2871
2956
|
realtimeMessaging: options.agent === true,
|
|
@@ -2895,9 +2980,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2895
2980
|
? "pending"
|
|
2896
2981
|
: retry
|
|
2897
2982
|
? "pending"
|
|
2898
|
-
: status
|
|
2983
|
+
: options.agent === true && status === "completed"
|
|
2984
|
+
? "running"
|
|
2985
|
+
: status;
|
|
2899
2986
|
settleGovernance(key, governanceStatus, {
|
|
2900
|
-
endedAt:
|
|
2987
|
+
endedAt:
|
|
2988
|
+
governanceStatus === "pending" || governanceStatus === "running"
|
|
2989
|
+
? null
|
|
2990
|
+
: Date.now(),
|
|
2901
2991
|
});
|
|
2902
2992
|
ensureTaskAdjudicationCase(key);
|
|
2903
2993
|
persist();
|
|
@@ -2905,6 +2995,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2905
2995
|
onLeaseChanged: () => {
|
|
2906
2996
|
persist();
|
|
2907
2997
|
},
|
|
2998
|
+
onFollowupMutation: () => {
|
|
2999
|
+
persist();
|
|
3000
|
+
},
|
|
3001
|
+
onHandoffMutation: () => {
|
|
3002
|
+
persist();
|
|
3003
|
+
},
|
|
3004
|
+
graphRevisionDigest: teamGraphRevisionDigest,
|
|
3005
|
+
graphAuthorityDigest: teamGraphAuthorityDigest,
|
|
2908
3006
|
onEvent: (e) => {
|
|
2909
3007
|
if (options.json) console.log(JSON.stringify(e));
|
|
2910
3008
|
else if (e.type === "task:claimed")
|
|
@@ -3011,18 +3109,32 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
3011
3109
|
persist();
|
|
3012
3110
|
let governanceFailed = false;
|
|
3013
3111
|
try {
|
|
3014
|
-
//
|
|
3015
|
-
//
|
|
3112
|
+
// Follow-up wake tasks are new lease-bound turns in the same durable
|
|
3113
|
+
// collaboration session/unit as their source task. Aggregate every
|
|
3114
|
+
// such turn before making the unit terminal; otherwise the first
|
|
3115
|
+
// completed turn would freeze governance before a later follow-up.
|
|
3116
|
+
const tasksByGovernanceKey = new Map(
|
|
3117
|
+
[...collaborationUnits.keys()].map((key) => [key, []]),
|
|
3118
|
+
);
|
|
3016
3119
|
for (const task of reg.list()) {
|
|
3017
|
-
const
|
|
3120
|
+
const governanceKey = sessionTaskKeyFor(task.key, task);
|
|
3121
|
+
tasksByGovernanceKey.get(governanceKey)?.push(task);
|
|
3122
|
+
}
|
|
3123
|
+
for (const [key, tasks] of tasksByGovernanceKey) {
|
|
3124
|
+
const states = tasks.map((task) =>
|
|
3125
|
+
String(task.status || "").toLowerCase(),
|
|
3126
|
+
);
|
|
3018
3127
|
const status =
|
|
3019
|
-
|
|
3128
|
+
states.length > 0 &&
|
|
3129
|
+
states.every((state) => state === "completed")
|
|
3020
3130
|
? "completed"
|
|
3021
|
-
:
|
|
3131
|
+
: states.some(
|
|
3132
|
+
(state) => state === "cancelled" || state === "pending",
|
|
3133
|
+
)
|
|
3022
3134
|
? "cancelled"
|
|
3023
3135
|
: "failed";
|
|
3024
|
-
if (collaborationUnits.get(
|
|
3025
|
-
settleGovernance(
|
|
3136
|
+
if (collaborationUnits.get(key)?.status === status) continue;
|
|
3137
|
+
settleGovernance(key, status, {
|
|
3026
3138
|
endedAt: Date.now(),
|
|
3027
3139
|
});
|
|
3028
3140
|
}
|
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.166.3",
|
|
7
|
+
"cliVersions": ["0.1.2", "0.2.2", "0.166.2", "0.166.3"],
|
|
8
|
+
"date": "2026-08-25",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Added - cc CLI 0.166.3 + Agent Protocol 0.1.2 + Agent SDKs 0.2.2: scoped approvals and durable team authority",
|
|
13
|
+
"body": "> `chainlesschain` **0.166.2 -> 0.166.3**,\n> `@chainlesschain/agent-protocol` **0.1.1 -> 0.1.2**,\n> `@chainlesschain/agent-sdk` **0.2.1 -> 0.2.2**, and\n> `chainlesschain-agent-sdk` **0.2.1 -> 0.2.2** (release candidate,\n> 2026-08-25).\n\n- **Canonical approval contract**: the protocol package exports schema-derived\n JavaScript validators and deterministic TypeScript/Python bindings for\n `acceptOnce`, `acceptForTurn`, `acceptForSession`, `decline`, and `cancel`.\n Shared valid/invalid fixtures keep the protocol, both SDKs, and CLI App\n Server on one wire contract.\n- **Fail-closed, exactly scoped grants**: approval responses bind the request,\n requested permission, tool, arguments, working directory, and policy digest.\n Turn grants stay in memory; session grants become effective only after a\n tamper-evident authority event is persisted and verified. Expired, corrupt,\n mismatched, widened, or persistence-failed grants never silently authorize a\n call.\n- **N-1 SDK compatibility**: boolean callbacks normalize to one-shot canonical\n decisions with the request binding, while direct boolean responses retain\n the legacy wire for older callers. Invalid or throwing callbacks decline\n safely in both TypeScript and Python.\n- **Durable Team messaging and custody**: state-backed Team runs now use the\n `SessionMessageFabric` authority for bounded cross-process delivery,\n offline/reconnect, receipts, fencing, dead letters, rate limits, and legacy\n mailbox migration. Idle follow-up turns and offer/accept/commit handoffs keep\n stable message identity while transferring attempt/lease custody explicitly.\n- **Release validation**: publication requires the exact release commit to pass\n Agent Protocol and Python SDK conformance, Linux/Windows/macOS `CLI CI` and\n `CLI Strict Sandbox`, and the desktop E2E matrix before immutable OIDC tags\n are created."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
4
17
|
{
|
|
5
18
|
"productVersion": null,
|
|
6
19
|
"cliVersion": "0.166.2",
|