chainlesschain 0.166.1 → 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-DwdhBUBc.js → AIOps-DZTvbk_H.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dd1lBEeo.js → ActionButton-IaEVUN3o.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DuGuuI36.js → Analytics-CCQab0gl.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CvHpSs3M.js → AppLayout-Bs_0GVpx.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BU9F3wJh.js → Artifacts-Bm83-yJv.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DK_n_WFm.js → Audit-Bah1XDR5.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-qKsxF5tv.js → BackgroundAgents-BPZA0B5d.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-JS58pSyV.js → Backup-BMydWFiM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-gGl6Ray1.js → BaseInput-lhopFSZz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B2FZNq3U.js → Chat-Bbbs5BP1.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZS_bLAr.js → ChatBubbleRenderer-BIAfOKCj.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-tsI0TE22.js → Checkbox-CLEMA9J4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D5kqhfAr.js → Codegen-deCSwmnK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DdN1TrqS.js → Col-CH-n8haq.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DgbEeh6V.js → Community-DJuAl6dw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-FIm-fRB_.js → Compact-BMyLBmgs.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B-N0pudf.js → Compliance-BK75Ss93.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CuMafBpi.js → Cowork-5XbJwKYq.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BTwzNFHR.js → Cron-Ezgir7IZ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DRoYbLOd.js → Crosschain-CKuMoYA7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CPhnNkz_.js → DID-CxS244cH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DJQftix2.js → Dashboard-wrUKrsJy.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-PSAH1Kfy.js → Dropdown-A6I91Z2J.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-PVRqeMiZ.js → EmailListRenderer-BofaiRYY.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CYtnjqjl.js → FamilyGuardDashboard-D3eeNA64.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-_-53kTDz.js → Federation-DzK-3AjS.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DTQ4qGuE.js → FormItemContext-Dm6mYA8b.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-ON_NfX8k.js → GenericCardRenderer-BeWL-Q1b.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DUc3w_Bf.js → Git-CtGCxg9p.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CktsJ2ku.js → Governance-DZvFB46G.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-4wUHQvju.js → Inference-ntqp4cmw.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Dq4saPnZ.js → KnowledgeGraph-CrLYbqLe.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Btb50m5s.js → Logs-CKA1PRhC.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-D3rSncxx.js → Marketplace-B8aPsXYv.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bc6Mori_.js → McpTools-DQOgNdGS.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-C-ottUdN.js → Memory-i9IK9B0M.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0DITBmP.js → MobileBridge-BynYvpv9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-O6cr0Nal.js → MobileProjects-DixivGuQ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B_MXKXvY.js → Mtc-OWPvWVNr.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BDkUqWIT.js → MtcAudit-Cqpg5C4A.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-BaxNWm8c.js → Multisig-CT5kMJIZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-UD2GndZc.js → NLProgramming-BXD0Dz0h.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-pU7wtMwB.js → Notes-T1w5p8N5.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BIs6ULr3.js → NotificationSettings-DFCThpKJ.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BJOuM0Kl.js +1 -0
- package/src/assets/web-panel/assets/{Organization-C9o-n2lq.js → Organization-CSFcw86q.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CEvMXxCS.js → Overflow-BxVMuLTk.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C3gQMTK3.js → P2P-B8qxY_yX.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-D1LVpBOr.js → PdhVaultBrowser-Bcq27Exy.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Dj5nIi0Y.js → Permissions-CGBvJVXP.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-uiLYuFcu.js → PersonalDataHub-DM9IEeJ3.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-CIrmF89x.js → Pipeline-wEskx2-p.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B3K1CUBa.js → Privacy-DIA02lLJ.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C_wCZ0zW.js → ProjectInit-uMXlNLHV.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-iCitfuNJ.js → ProjectSettings-Sy3NOtt7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BwimeXkW.js → Projects-xFjfOkQM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BLpepgr6.js → Providers-CNyOpbg8.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DPy8tjXV.js → QrScannerModal-Dk1UVRwI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CRq8VhID.js → QuickAsk-B-UqLoLG.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CirlWIiK.js → Recommend-CiTBVZvN.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-nlnJlKXO.js → RemoteSession-BhABd516.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B5aaxee5.js → Reputation-Dq1xTCcN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-lzsTQZlq.js → Row-DbFc4sc7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C41AzjgC.js → RssFeed-D7IBkkLm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-1Hxx3TZ3.js → Search-BVyMlGoa.js} +1 -1
- package/src/assets/web-panel/assets/{Security-8VqwRxAp.js → Security-BzMm9Be_.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DCm0HHAD.js → Services-Dfk0kied.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D6w5gpmW.js → Skeleton-C8B5mUit.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +1 -0
- package/src/assets/web-panel/assets/{Sla-BkMj8Dxu.js → Sla-gnFelKfT.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BOmLqW44.js → SpeechSettings-B12gCQkK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-2xKSqFDO.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-CcOGWgZz.js → Templates-PjdppQrI.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CAyzzQWN.js → Tenant-CH3aARxE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Daagerkm.js → Terminal-BqqrYyg3.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-1jGbMj7I.js → TimelineRenderer-Dx9soq9f.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CYQ-FQju.js → Tokens-C66KpDDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C70zRwuR.js → Trigger-DHxgGsap.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CeqXfiX_.js → Trust-3cct4QxN.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D0j6m1bU.js → UkeySign-Cs6UfDEH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DFHpM7Yd.js → VideoEditing-jbu2EAQa.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BVC2J0Yx.js → Wallet-BIykFB9D.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BceIN2Gn.js → WebAuthn-DFgqKmHG.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bgeb-i-S.js → WorkflowEditor-CNg5bBiH.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BmMBqgvz.js → chat-B-6wzojE.js} +1 -1
- package/src/assets/web-panel/assets/{colors-sjRzwnyw.js → colors-BHAq7y9y.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DNt6m2bM.js → compact-item-CGJnSTnu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DELaLit3.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-dfwk9O8x.js → hasIn-DibIw3z7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du62m6pG.js → index-0NWSa3Xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-LMfsEdLk.js → index-746-mNhw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbu3-zFd.js → index-Aaeca8o4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXJ68ObJ.js → index-B1jAbIxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4Z4HZcf.js → index-B28jdxwR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs-mWOWt.js → index-B2rOMBeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0wkOqE9.js → index-BAoFiV3n.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtfYPnsY.js → index-BCtW4F8-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpVt6M_8.js → index-BEXM3qSV.js} +1 -1
- package/src/assets/web-panel/assets/{index-1w7dha_a.js → index-BFTGp-aF.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2Sxf7yC.js → index-BJhS6i02.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7qiZc2Z.js → index-BO-XxBD5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlYL8VP8.js → index-BR2BiNtx.js} +1 -1
- package/src/assets/web-panel/assets/{index-dAF9qRVa.js → index-BRflLAdr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMnvNNEd.js → index-BTWb3sbj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvIQ9sZa.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-DC6FlHlP.js → index-BiMLsIwd.js} +1 -1
- package/src/assets/web-panel/assets/{index-6bjBUhoH.js → index-Bmqjip63.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSB9Gin8.js → index-BoySHSgZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-fNwu9CU_.js → index-Bz3J0eVB.js} +1 -1
- package/src/assets/web-panel/assets/{index-dpDeFZNt.js → index-C6M2yHVE.js} +1 -1
- package/src/assets/web-panel/assets/{index-WpEDoyTv.js → index-CH2A_Fdn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CujMHspH.js → index-CUX9mq3M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFOYbzg-.js → index-CY2E4Y99.js} +1 -1
- package/src/assets/web-panel/assets/index-CkH9UQQL.js +1 -0
- package/src/assets/web-panel/assets/{index-CAIn5cS9.js → index-CoKu7Q9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-OC3qYV4-.js → index-CrjkH_QU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzddvOOb.js → index-Cuity3gy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Rt-fym5b.js → index-CwcWpW1q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLbvXsxf.js → index-Cz5ety6j.js} +1 -1
- package/src/assets/web-panel/assets/{index-aj9ObF2R.js → index-DXNcm44v.js} +1 -1
- package/src/assets/web-panel/assets/{index-vCQ3l6DX.js → index-DjCJIttz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Clrqtycd.js → index-DnsVRqCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnQOc5wo.js → index-SbQacweG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLSqyAcE.js → index-g0V_mLQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX3wwu3G.js → index-puIs3mTs.js} +3 -3
- package/src/assets/web-panel/assets/{index-DY2G1Th2.js → index-sI_1E0co.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV8q_Hki.js → index-woOjtit-.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DUt9Xj8y.js → initDefaultProps-Gbl9QOqg.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DdiFPnv7.js → motion-BHh6ZzZu.js} +1 -1
- package/src/assets/web-panel/assets/{move-BJ2VH7Y2.js → move-mX6Rwrd1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BCnX6oOJ.js → mtc-parser-CuzZa_kI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CyHxlDLV.js → omit-DjANYkpi.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BJiGW3bY.js → pickAttrs-C_3v40wY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DhJ9Rhx8.js → placementArrow-L2HgRede.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C6zpL9bC.js → responsiveObserve-DIkGMHyT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DCbMFRF-.js → slide-C1hp5tD0.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CNtVLsIq.js → statusUtils-DH1W2uFA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Z078OtUc.js → styleChecker-dEaKQcv2.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-w4RVmcGs.js → useFlexGapSupport-CD7j1zxt.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D4Xw1XRt.js → useFs-C8jXMvEM.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Bnbd1PgY.js → usePersonalDataHub-C4r-8mys.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DSOQxMFN.js → vnode-DDuI6wgY.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DNPE1Wca.js → zoom-Dd-DteT6.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/team.js +239 -55
- package/src/data/changelog.json +26 -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-mailbox.js +508 -2
- package/src/lib/agent-team/team-message-bridge.js +722 -0
- package/src/lib/agent-team/team-message-tools.js +231 -0
- package/src/lib/agent-team/team-runner.js +1186 -10
- 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/lib/subagent-inheritance.js +5 -3
- package/src/runtime/agent-core.js +38 -0
- package/src/runtime/headless-runner.js +36 -3
- package/src/runtime/headless-stream.js +184 -19
- package/src/assets/web-panel/assets/MarkdownRenderer-Cre8P8HG.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-0NuumnfG.js +0 -1
- package/src/assets/web-panel/assets/Skills-Bw_pUTJB.js +0 -1
- package/src/assets/web-panel/assets/Tasks-BPAnzVau.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Ct8o3bu_.js +0 -1
- package/src/assets/web-panel/assets/index-D685kO6L.js +0 -1
- package/src/assets/web-panel/assets/index-DTlIRMqX.js +0 -1
package/src/commands/team.js
CHANGED
|
@@ -24,7 +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";
|
|
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";
|
|
28
35
|
import { resolveTeamTaskContract } from "../lib/agent-team/team-task-contract.js";
|
|
29
36
|
import {
|
|
30
37
|
TeamScopeLock,
|
|
@@ -727,6 +734,7 @@ export function buildTeamAgentPrompt(prompt, { inbox = [] } = {}) {
|
|
|
727
734
|
const messages = inbox
|
|
728
735
|
.slice(-MAX_TEAM_AGENT_INBOX_MESSAGES)
|
|
729
736
|
.map((message) => ({
|
|
737
|
+
id: Number.isSafeInteger(message?.id) ? message.id : null,
|
|
730
738
|
from: String(message?.from || "unknown").slice(0, 128),
|
|
731
739
|
to: String(message?.to || "").slice(0, 128),
|
|
732
740
|
subject:
|
|
@@ -1016,7 +1024,7 @@ export function makeShellRunTask() {
|
|
|
1016
1024
|
}
|
|
1017
1025
|
|
|
1018
1026
|
/** Spawn a headless `cc agent -p` for one prompt in `cwd`; resolve on exit 0. */
|
|
1019
|
-
|
|
1027
|
+
function spawnAgentProcess(prompt, cwd, opts = {}) {
|
|
1020
1028
|
return new Promise((resolve, reject) => {
|
|
1021
1029
|
const parser = new TeamAgentStreamParser({
|
|
1022
1030
|
maxLineBytes: opts.maxStreamLineBytes,
|
|
@@ -1043,7 +1051,11 @@ export function spawnAgent(prompt, cwd, opts = {}) {
|
|
|
1043
1051
|
try {
|
|
1044
1052
|
child = _deps.spawn(process.execPath, args, {
|
|
1045
1053
|
cwd,
|
|
1046
|
-
env: {
|
|
1054
|
+
env: {
|
|
1055
|
+
...process.env,
|
|
1056
|
+
CLAUDECODE: "1",
|
|
1057
|
+
...(opts.childEnv || {}),
|
|
1058
|
+
},
|
|
1047
1059
|
windowsHide: true,
|
|
1048
1060
|
detached:
|
|
1049
1061
|
opts.managedCheckpoint === true
|
|
@@ -1311,6 +1323,33 @@ export function spawnAgent(prompt, cwd, opts = {}) {
|
|
|
1311
1323
|
});
|
|
1312
1324
|
}
|
|
1313
1325
|
|
|
1326
|
+
export function spawnAgent(prompt, cwd, opts = {}) {
|
|
1327
|
+
if (!opts.messageBridge) return spawnAgentProcess(prompt, cwd, opts);
|
|
1328
|
+
return (async () => {
|
|
1329
|
+
let bridge;
|
|
1330
|
+
try {
|
|
1331
|
+
bridge = new TeamMessageBridge(opts.messageBridge);
|
|
1332
|
+
await bridge.start();
|
|
1333
|
+
} catch (error) {
|
|
1334
|
+
throw teamAgentError(
|
|
1335
|
+
"TEAM_AGENT_MESSAGE_BRIDGE_FAILED",
|
|
1336
|
+
error?.message || "Could not start teammate message bridge",
|
|
1337
|
+
);
|
|
1338
|
+
}
|
|
1339
|
+
try {
|
|
1340
|
+
return await spawnAgentProcess(bridge.decoratePrompt(prompt), cwd, {
|
|
1341
|
+
...opts,
|
|
1342
|
+
childEnv: {
|
|
1343
|
+
...(opts.childEnv || {}),
|
|
1344
|
+
...bridge.childEnvironment(),
|
|
1345
|
+
},
|
|
1346
|
+
});
|
|
1347
|
+
} finally {
|
|
1348
|
+
await bridge.close();
|
|
1349
|
+
}
|
|
1350
|
+
})();
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1314
1353
|
/** Real executor: hand a task's `prompt` to a headless `cc agent -p` in cwd. */
|
|
1315
1354
|
function applyBudgetReservation(contract, budgetReservation) {
|
|
1316
1355
|
const effectiveContract = { ...contract };
|
|
@@ -1333,7 +1372,14 @@ export function makeAgentRunTask(opts = {}) {
|
|
|
1333
1372
|
return function runTask({
|
|
1334
1373
|
key,
|
|
1335
1374
|
task,
|
|
1375
|
+
holder,
|
|
1336
1376
|
inbox = [],
|
|
1377
|
+
sendMessage = null,
|
|
1378
|
+
messageAuthority = null,
|
|
1379
|
+
recipientState = null,
|
|
1380
|
+
requestFollowupWake = null,
|
|
1381
|
+
requestHandoff = null,
|
|
1382
|
+
mailbox = null,
|
|
1337
1383
|
budgetReservation = null,
|
|
1338
1384
|
signal = null,
|
|
1339
1385
|
}) {
|
|
@@ -1357,8 +1403,23 @@ export function makeAgentRunTask(opts = {}) {
|
|
|
1357
1403
|
);
|
|
1358
1404
|
return spawnAgent(buildTeamAgentPrompt(prompt, { inbox }), process.cwd(), {
|
|
1359
1405
|
...effectiveContract,
|
|
1360
|
-
sessionId: opts.sessionIdForTask?.(key) || null,
|
|
1406
|
+
sessionId: opts.sessionIdForTask?.(key, task) || null,
|
|
1361
1407
|
signal,
|
|
1408
|
+
...(mailbox && holder
|
|
1409
|
+
? {
|
|
1410
|
+
messageBridge: {
|
|
1411
|
+
mailbox,
|
|
1412
|
+
holder,
|
|
1413
|
+
sendMessage,
|
|
1414
|
+
assertAuthority: messageAuthority,
|
|
1415
|
+
recipientState,
|
|
1416
|
+
requestFollowupWake,
|
|
1417
|
+
requestHandoff,
|
|
1418
|
+
onMutation: opts.onMailboxMutation,
|
|
1419
|
+
durable: opts.mailboxDurable === true,
|
|
1420
|
+
},
|
|
1421
|
+
}
|
|
1422
|
+
: {}),
|
|
1362
1423
|
});
|
|
1363
1424
|
};
|
|
1364
1425
|
}
|
|
@@ -2109,8 +2170,17 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2109
2170
|
return;
|
|
2110
2171
|
}
|
|
2111
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;
|
|
2112
2177
|
let reg;
|
|
2113
|
-
let mailbox =
|
|
2178
|
+
let mailbox = options.state
|
|
2179
|
+
? new TeamSessionMessageAdapter({
|
|
2180
|
+
statePath: messageStatePath,
|
|
2181
|
+
teamId: stateId,
|
|
2182
|
+
})
|
|
2183
|
+
: new TeamMailbox();
|
|
2114
2184
|
let budget = new TeamBudget({
|
|
2115
2185
|
maxTasks: limits.maxTasks,
|
|
2116
2186
|
maxTokens: limits.maxTokens,
|
|
@@ -2130,7 +2200,32 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2130
2200
|
const isV2 = snap && snap.version >= 2 && snap.registry;
|
|
2131
2201
|
reg = TaskLeaseRegistry.restore(isV2 ? snap.registry : snap);
|
|
2132
2202
|
if (isV2) {
|
|
2133
|
-
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
|
+
}
|
|
2134
2229
|
budget = TeamBudget.restore(snap.budget, {
|
|
2135
2230
|
// Resume flags may only tighten prior caps; omitted flags keep
|
|
2136
2231
|
// the persisted authority.
|
|
@@ -2234,6 +2329,11 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2234
2329
|
}),
|
|
2235
2330
|
]),
|
|
2236
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));
|
|
2237
2337
|
if ((options.agent || options.exec) && !options.worktree) {
|
|
2238
2338
|
const isolatedTask = reg
|
|
2239
2339
|
.list()
|
|
@@ -2301,7 +2401,6 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2301
2401
|
);
|
|
2302
2402
|
}
|
|
2303
2403
|
}
|
|
2304
|
-
const stateId = resumeSnapshot?.stateId || `team_state_${randomUUID()}`;
|
|
2305
2404
|
let controlCursor = resumeSnapshot?.controlCursor || null;
|
|
2306
2405
|
let adjudicationCursor = resumeSnapshot?.adjudicationCursor || null;
|
|
2307
2406
|
let adjudicationRunId = resumeSnapshot?.adjudicationRunId || null;
|
|
@@ -2480,37 +2579,40 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2480
2579
|
checkpointRequired:
|
|
2481
2580
|
options.agent === true || options.managedCheckpoint === true,
|
|
2482
2581
|
worktreeRequired: options.worktree === true,
|
|
2483
|
-
units: reg
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
:
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
:
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
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
|
+
})),
|
|
2514
2616
|
});
|
|
2515
2617
|
} catch (err) {
|
|
2516
2618
|
(log.error || console.error)(
|
|
@@ -2522,8 +2624,27 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2522
2624
|
const collaborationUnits = new Map(
|
|
2523
2625
|
collaborationRun.units.map((unit) => [unit.key, unit]),
|
|
2524
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
|
+
});
|
|
2525
2645
|
const settleGovernance = (key, status, extra = {}) => {
|
|
2526
|
-
const
|
|
2646
|
+
const governanceKey = sessionTaskKeyFor(key);
|
|
2647
|
+
const unit = collaborationUnits.get(governanceKey);
|
|
2527
2648
|
let sideEffects = null;
|
|
2528
2649
|
if (unit?.sessionId) {
|
|
2529
2650
|
try {
|
|
@@ -2536,7 +2657,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2536
2657
|
}
|
|
2537
2658
|
const updated = _deps.collaborationStore.updateUnit(
|
|
2538
2659
|
collaborationRun.id,
|
|
2539
|
-
|
|
2660
|
+
governanceKey,
|
|
2540
2661
|
{
|
|
2541
2662
|
status,
|
|
2542
2663
|
...extra,
|
|
@@ -2544,7 +2665,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2544
2665
|
},
|
|
2545
2666
|
{ returnUnit: true },
|
|
2546
2667
|
);
|
|
2547
|
-
if (updated) collaborationUnits.set(
|
|
2668
|
+
if (updated) collaborationUnits.set(governanceKey, updated);
|
|
2548
2669
|
};
|
|
2549
2670
|
|
|
2550
2671
|
// Persist a snapshot after each task settles so a crash mid-run is
|
|
@@ -2575,6 +2696,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2575
2696
|
adjudicationRunId,
|
|
2576
2697
|
adjudicationCursor,
|
|
2577
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
|
+
}),
|
|
2578
2707
|
});
|
|
2579
2708
|
};
|
|
2580
2709
|
|
|
@@ -2661,8 +2790,15 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2661
2790
|
runInWorktree: async ({
|
|
2662
2791
|
key,
|
|
2663
2792
|
task,
|
|
2793
|
+
holder,
|
|
2664
2794
|
cwd,
|
|
2665
2795
|
inbox = [],
|
|
2796
|
+
sendMessage = null,
|
|
2797
|
+
messageAuthority = null,
|
|
2798
|
+
recipientState = null,
|
|
2799
|
+
requestFollowupWake = null,
|
|
2800
|
+
requestHandoff = null,
|
|
2801
|
+
mailbox: taskMailbox = null,
|
|
2666
2802
|
budgetReservation = null,
|
|
2667
2803
|
signal = null,
|
|
2668
2804
|
managedCheckpoint = false,
|
|
@@ -2672,7 +2808,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2672
2808
|
throw new Error(`task "${key}" has no \`prompt\` to --agent`);
|
|
2673
2809
|
}
|
|
2674
2810
|
const contract = applyBudgetReservation(
|
|
2675
|
-
|
|
2811
|
+
taskContractFor(key, task),
|
|
2676
2812
|
budgetReservation,
|
|
2677
2813
|
);
|
|
2678
2814
|
return spawnAgent(
|
|
@@ -2687,8 +2823,25 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2687
2823
|
? false
|
|
2688
2824
|
: contract.checkpointRequired,
|
|
2689
2825
|
managedCheckpoint,
|
|
2690
|
-
sessionId: collaborationUnits.get(
|
|
2826
|
+
sessionId: collaborationUnits.get(
|
|
2827
|
+
sessionTaskKeyFor(key, task),
|
|
2828
|
+
)?.sessionId,
|
|
2691
2829
|
signal,
|
|
2830
|
+
...(taskMailbox && holder
|
|
2831
|
+
? {
|
|
2832
|
+
messageBridge: {
|
|
2833
|
+
mailbox: taskMailbox,
|
|
2834
|
+
holder,
|
|
2835
|
+
sendMessage,
|
|
2836
|
+
assertAuthority: messageAuthority,
|
|
2837
|
+
recipientState,
|
|
2838
|
+
requestFollowupWake,
|
|
2839
|
+
requestHandoff,
|
|
2840
|
+
onMutation: persist,
|
|
2841
|
+
durable: Boolean(options.state),
|
|
2842
|
+
},
|
|
2843
|
+
}
|
|
2844
|
+
: {}),
|
|
2692
2845
|
},
|
|
2693
2846
|
);
|
|
2694
2847
|
},
|
|
@@ -2706,9 +2859,12 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2706
2859
|
runTask = makeShellRunTask(log);
|
|
2707
2860
|
} else if (options.agent)
|
|
2708
2861
|
runTask = makeAgentRunTask({
|
|
2709
|
-
contractForTask: (key) =>
|
|
2862
|
+
contractForTask: (key, task) => taskContractFor(key, task),
|
|
2710
2863
|
worktreeEnabled: false,
|
|
2711
|
-
sessionIdForTask: (key) =>
|
|
2864
|
+
sessionIdForTask: (key, task) =>
|
|
2865
|
+
collaborationUnits.get(sessionTaskKeyFor(key, task))?.sessionId,
|
|
2866
|
+
onMailboxMutation: persist,
|
|
2867
|
+
mailboxDurable: Boolean(options.state),
|
|
2712
2868
|
});
|
|
2713
2869
|
else runTask = async () => ({ dryRun: true });
|
|
2714
2870
|
|
|
@@ -2767,7 +2923,7 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2767
2923
|
}
|
|
2768
2924
|
const binding = adjudicationBindingFor(
|
|
2769
2925
|
task,
|
|
2770
|
-
collaborationUnits.get(key) || null,
|
|
2926
|
+
collaborationUnits.get(sessionTaskKeyFor(key, task)) || null,
|
|
2771
2927
|
);
|
|
2772
2928
|
const opened = adjudicationStore.openCase(binding, {
|
|
2773
2929
|
anchor: adjudicationCursor,
|
|
@@ -2794,9 +2950,10 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2794
2950
|
runTask,
|
|
2795
2951
|
budget,
|
|
2796
2952
|
budgetForTask: options.agent
|
|
2797
|
-
? (task) =>
|
|
2953
|
+
? (task) => taskContractFor(task.key, task)
|
|
2798
2954
|
: () => ({ reserveUsage: false }),
|
|
2799
2955
|
mailbox,
|
|
2956
|
+
realtimeMessaging: options.agent === true,
|
|
2800
2957
|
scopeLock,
|
|
2801
2958
|
recorder,
|
|
2802
2959
|
beforeTask: ({ key }) => {
|
|
@@ -2823,9 +2980,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2823
2980
|
? "pending"
|
|
2824
2981
|
: retry
|
|
2825
2982
|
? "pending"
|
|
2826
|
-
: status
|
|
2983
|
+
: options.agent === true && status === "completed"
|
|
2984
|
+
? "running"
|
|
2985
|
+
: status;
|
|
2827
2986
|
settleGovernance(key, governanceStatus, {
|
|
2828
|
-
endedAt:
|
|
2987
|
+
endedAt:
|
|
2988
|
+
governanceStatus === "pending" || governanceStatus === "running"
|
|
2989
|
+
? null
|
|
2990
|
+
: Date.now(),
|
|
2829
2991
|
});
|
|
2830
2992
|
ensureTaskAdjudicationCase(key);
|
|
2831
2993
|
persist();
|
|
@@ -2833,6 +2995,14 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2833
2995
|
onLeaseChanged: () => {
|
|
2834
2996
|
persist();
|
|
2835
2997
|
},
|
|
2998
|
+
onFollowupMutation: () => {
|
|
2999
|
+
persist();
|
|
3000
|
+
},
|
|
3001
|
+
onHandoffMutation: () => {
|
|
3002
|
+
persist();
|
|
3003
|
+
},
|
|
3004
|
+
graphRevisionDigest: teamGraphRevisionDigest,
|
|
3005
|
+
graphAuthorityDigest: teamGraphAuthorityDigest,
|
|
2836
3006
|
onEvent: (e) => {
|
|
2837
3007
|
if (options.json) console.log(JSON.stringify(e));
|
|
2838
3008
|
else if (e.type === "task:claimed")
|
|
@@ -2939,18 +3109,32 @@ export function registerTeamCommand(program, { logger } = {}) {
|
|
|
2939
3109
|
persist();
|
|
2940
3110
|
let governanceFailed = false;
|
|
2941
3111
|
try {
|
|
2942
|
-
//
|
|
2943
|
-
//
|
|
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
|
+
);
|
|
2944
3119
|
for (const task of reg.list()) {
|
|
2945
|
-
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
|
+
);
|
|
2946
3127
|
const status =
|
|
2947
|
-
|
|
3128
|
+
states.length > 0 &&
|
|
3129
|
+
states.every((state) => state === "completed")
|
|
2948
3130
|
? "completed"
|
|
2949
|
-
:
|
|
3131
|
+
: states.some(
|
|
3132
|
+
(state) => state === "cancelled" || state === "pending",
|
|
3133
|
+
)
|
|
2950
3134
|
? "cancelled"
|
|
2951
3135
|
: "failed";
|
|
2952
|
-
if (collaborationUnits.get(
|
|
2953
|
-
settleGovernance(
|
|
3136
|
+
if (collaborationUnits.get(key)?.status === status) continue;
|
|
3137
|
+
settleGovernance(key, status, {
|
|
2954
3138
|
endedAt: Date.now(),
|
|
2955
3139
|
});
|
|
2956
3140
|
}
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
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
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.166.2",
|
|
20
|
+
"cliVersions": ["0.166.1", "0.166.2"],
|
|
21
|
+
"date": "2026-08-25",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Added - cc CLI 0.166.2: lease-bound real-time team messaging",
|
|
26
|
+
"body": "> `chainlesschain` **0.166.1 -> 0.166.2** (CLI-only release candidate,\n> 2026-08-25). `@chainlesschain/agent-protocol` remains **0.1.1**,\n> `@chainlesschain/agent-sdk` remains **0.2.1**, and\n> `chainlesschain-agent-sdk` remains **0.2.1**.\n\n- **Live teammate tools**: real `cc team --agent` children receive host-owned\n `team_send`, `team_receive`, `team_ack`, and `team_followup` tools over a\n private local bridge instead of relying only on a startup inbox snapshot.\n- **Retry-safe delivery**: the bounded mailbox persists at-least-once delivery\n receipts, stable-consumer ACKs, idempotent message keys, payload digests,\n causation/correlation metadata, processed/dead-letter states, and monotonic\n cursors across team-state restore.\n- **Attempt-scoped authority**: every bridge operation revalidates the current\n holder, task, attempt, lease, and fencing token; stale attempts fail closed,\n bridge credentials never enter the prompt, and nested subagents cannot\n inherit the parent-bound tools.\n- **Honest durability and wake semantics**: `--state` checkpoints every bridge\n mutation, runs without state declare process-local delivery, and follow-up\n results distinguish an active target from a request queued for a future turn.\n- **Release validation**: publication requires this candidate's exact commit\n to pass the complete Linux, Windows, and macOS `CLI CI` and\n `CLI Strict Sandbox` matrices before an immutable npm tag is created."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
4
30
|
{
|
|
5
31
|
"productVersion": null,
|
|
6
32
|
"cliVersion": "0.166.1",
|