chainlesschain 0.166.103 → 0.166.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/package.json +2 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BLrXpdnP.js → AIOps-CcD-AVDw.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C0xy9uFy.js → ActionButton-CYy-g36A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C6EephQP.js → Analytics-DPFDNaBL.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-ZCXdOD9y.js → AppLayout-PVIuRdgN.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-D4MfZ-pl.js → Artifacts-BXGD3bM-.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BQ8c3bBu.js → Audit-Bu5s_4tu.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BOA7_ljM.js → BackgroundAgents-BHmgpnzo.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-60uiQjGT.js → Backup-C872jURx.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BDvEbGs_.js → BaseInput-Bh7xO30H.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B3IkAuFQ.js → Chat-DaacK53T.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-PYrSKMM_.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-njGbfJWq.js → Checkbox-Cnt7_8I2.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CF7DtdxC.js → Codegen-AZRz6kmW.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C_3Zix40.js → Col-BtOXzMFt.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CzU-ZC2d.js → Community-BFmFygS7.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BgeqsPRh.js → Compact-2z5CfKpR.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-6l7cwiqp.js → Compliance-B5hKrPVF.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D4s905fI.js → Cowork-CxEyp2ww.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CGTYSxRS.js → Cron-B-8f9_qF.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BnSo-Yt3.js → Crosschain-XARMOcc4.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Dm4vk2X1.js → DID-DwLtEKAe.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D7H-PZ_N.js → Dashboard-Cjw0L_iA.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COslkgxn.js → Dropdown-BBGWIP7l.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CJWEetmk.js → EmailListRenderer-DG4kZFkm.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BbzebAWe.js → EvolutionSettings-D8vuNDde.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BsoTOXwk.js → FamilyGuardDashboard-COXCzDXI.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Ck5kM_5H.js → Federation-Btb-aMhW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-gShxCqtF.js → FormItemContext-TO-E6l6e.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DarN1G-z.js → GenericCardRenderer-BWXdJCT0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CJfpLyP5.js → Git-B6icGhEv.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CVcJmpQz.js → Governance-C5Y__K6S.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-ComU_ig8.js → Inference-DZGEKnbN.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-35hprFJy.js → KnowledgeGraph--Kga5yvm.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BQDqBTz0.js → Logs-BXs3EPKj.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BsSiyE-A.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B9O9OKnn.js → Marketplace-JSEAu0su.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-VMKxA4Wc.js → McpTools-BUBifkKP.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CcBbf3Bc.js → Memory-Cb7sE4a-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-D7myz46N.js → MobileBridge-BOzmmNV2.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Da5KBXyx.js → MobileProjects-ClRlavdF.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-x3NPZfuL.js → Mtc-DmMWErG1.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-CwnzptEC.js → MtcAudit-DnGkRVXF.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CCAxf4Ye.js → Multisig-C3mzascL.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CptHKz-Q.js → NLProgramming-CrmMZZ1t.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-0uEp4DCJ.js → Notes-4S6uts9Q.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DthvrOLd.js → NotificationSettings-gn3UrWwW.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CDVAlBUf.js +1 -0
- package/src/assets/web-panel/assets/{Organization-BWf2tmQQ.js → Organization-fMlkdgpW.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BbvAtEth.js → Overflow-DGwCUPU1.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-zBo6enit.js → P2P-BDGcpPmf.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-D_LMQ4A4.js → PdhVaultBrowser-CccRPAB9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C1ucb2ck.js → Permissions-C33dNECx.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bz64RddJ.js → PersonalDataHub-BeqbCStc.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DXJt3y3_.js → Pipeline-CTmasgbQ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DiZ8b_ut.js → Privacy-ktd37BSp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DfLKKrJ4.js → ProjectInit-KOGvQtBX.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ct6kJuIY.js → ProjectSettings-CUvH_hC6.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BBUMlZ3m.js → Projects-BvP_Os-1.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DYVQPHvc.js → Providers-C-hmLXlO.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-23Il7iPp.js → QrScannerModal-DzG_rbSL.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-WgOZKrv1.js → QuickAsk-ShwiATg4.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CRIka6xT.js → Recommend-DkV8Ruep.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DOy3GjVZ.js → RemoteSession-Ca2dOx_G.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BXyi6xeR.js → Reputation-DYA5BJ6A.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CoMxuIcR.js → Row-DvGDgxLS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-87hPkoM6.js → RssFeed-DbwTBSPw.js} +3 -3
- package/src/assets/web-panel/assets/{Search-B1EqFCO4.js → Search-C5XAMQ9T.js} +1 -1
- package/src/assets/web-panel/assets/{Security-HcC41eGs.js → Security-CKWT60Qt.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BqLwmvCM.js → Services-CZvASlWL.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CIMmjW4r.js → Skeleton-DFkMVqws.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CgurezJU.js → Skills-hslZ_GyP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CJuRuqPE.js → Sla-BLW5rmZ5.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BUwsbd1o.js → SpeechSettings-Cn4ffCi5.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-qo04TOX-.js → SyncSettings-D1K0nJuo.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CCRu0xoN.js +1 -0
- package/src/assets/web-panel/assets/{Templates-D1PTczPW.js → Templates-L19GYuS4.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Bi0FkEPR.js → Tenant-CZ6HE3PF.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DfSt3bIF.js → Terminal-BiAwzaBT.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-B7bIVs4R.js → TimelineRenderer-DRHSWQT5.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B6w5XrMb.js → Tokens-Cm-XATgh.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-XXVSDWiF.js → Trigger-BVXtx3kn.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DYvlgcK-.js → Trust-Bb0TmkLJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-XyYwJMBM.js → UkeySign-Dbt9R7l0.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C47WbtHH.js → VideoEditing-z0-Ti8eJ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CYfqTj_C.js → Wallet-BZh31tI-.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-3AduFn1l.js → WebAuthn-DQ0yIr5K.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DHYEHjMJ.js → WorkflowEditor-DCt_yuWG.js} +1 -1
- package/src/assets/web-panel/assets/{chat-AeehErSw.js → chat-BLgtmFeS.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKXJ8paX.js → colors-xU4UH8M1.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BOlCiomD.js → compact-item-C4w4v16T.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BAP6U85b.js → createContext-CZM9hAaj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BZUZgMkO.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BLmeL1Xe.js → hasIn-DvHqEpE7.js} +1 -1
- package/src/assets/web-panel/assets/index--_-pNhk0.js +1 -0
- package/src/assets/web-panel/assets/{index-wyKpTsGM.js → index-55Rkd1KA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaHhfpBi.js → index-B0IvKEVO.js} +1 -1
- package/src/assets/web-panel/assets/{index-EKNODw4P.js → index-B4jIcYSv.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5AKY6bJ.js → index-B64Vf-8H.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8qi53Ki.js → index-B6AQ2b5U.js} +1 -1
- package/src/assets/web-panel/assets/{index-FPXLIXoy.js → index-BHK3CQHq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRa4pAaM.js → index-BHg9NoJ5.js} +3 -3
- package/src/assets/web-panel/assets/{index-Bn54FU3i.js → index-BIWumeQl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdNSmvog.js → index-BRhD9RMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-De2fPxdb.js → index-BTxhDCtg.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgtaOzMo.js → index-BaQZvM4m.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFKzWIo8.js → index-Bf8Wm4ks.js} +1 -1
- package/src/assets/web-panel/assets/{index-OLKhib9T.js → index-Bh14b1k0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0IjlB9m.js → index-BkTKWAgq.js} +1 -1
- package/src/assets/web-panel/assets/{index-PEe9OWEQ.js → index-BlN5KPq6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpZqbc4w.js → index-C6ZrTSw5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bpx54vfs.js → index-C9YnZFv2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsQ38fVY.js → index-CExiTobS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTnp4Nt3.js → index-CF9ebAIB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuUwKmEI.js → index-CKugxsw3.js} +1 -1
- package/src/assets/web-panel/assets/{index-IlzfIRNh.js → index-CPC7OGCe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSOenF5s.js → index-CPDw21XY.js} +1 -1
- package/src/assets/web-panel/assets/{index-T28naovw.js → index-CQEzxnYS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWYqOI1A.js → index-CRLP56-W.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZMbXl5lo.js → index-CYrQnkqA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQLQuwpA.js → index-Cm00787d.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co7pjF53.js → index-CpiuuIww.js} +1 -1
- package/src/assets/web-panel/assets/{index-urPvyUVk.js → index-CqDiY-jl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhcpWl5z.js → index-CyV8fNBg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAS2QqLn.js → index-DGdLkss8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRcJlKSa.js → index-DifMvnMQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dv8-g1pY.js → index-Ds1tM734.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE7cbDDe.js → index-Ds6wKTMh.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bt-FCVzh.js → index-QHmhwgfc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs2O3f81.js → index-SNV95Zen.js} +1 -1
- package/src/assets/web-panel/assets/index-ftwO31cp.js +1 -0
- package/src/assets/web-panel/assets/{index-ClpwxOXo.js → index-n6SAUmmI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiqeF0Pf.js → index-wYRjvvbl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CDWa1rnn.js → initDefaultProps-C44ZER6c.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CX2Cnsd5.js → motion-DbNzzScd.js} +1 -1
- package/src/assets/web-panel/assets/{move-Bfe1NcEF.js → move-BrRrDH2u.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DbdqleHE.js → mtc-parser-DZ_T_Pw8.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CE2K7NVv.js → omit-5QHHk_V3.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-y_bZgxWG.js → pickAttrs-BdxEl0G2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOHR4zwr.js → placementArrow-CGyD615D.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B8Jwq05-.js → responsiveObserve-QqcWAQmN.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BD7RJ3Kn.js → slide-BumQrJ5R.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BuxDJeDx.js → statusUtils-Pf64olM7.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DgYQ2Q0o.js → styleChecker-DNwm5SQZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DAHF0Fwi.js → useFlexGapSupport-c3gLKs6e.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D4kDyLFp.js → useFs-TzTd6NDM.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BHtSxW4A.js → usePersonalDataHub-BP5E_0Fe.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CHKtdqW0.js → vnode-CVEkRfZU.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CIZAMma9.js → zoom-C18X_8TJ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +56 -20
- package/src/commands/batch.js +17 -12
- package/src/commands/eval.js +24 -8
- package/src/data/changelog.json +26 -0
- package/src/harness/mcp-client.js +187 -26
- package/src/lib/background-session-transport.js +21 -5
- package/src/lib/coding-task-guidance.js +13 -0
- package/src/lib/decision-layer/runtime.js +180 -10
- package/src/lib/direct-model-usage.js +34 -0
- package/src/lib/evolution/agent-evolution-ingress.js +63 -7
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +10 -0
- package/src/lib/evolution/evolution-evidence-projector.js +46 -7
- package/src/lib/evolution/skill-decision-projection.js +211 -0
- package/src/lib/evolution/skill-retrieval-revocation-authority.js +17 -2
- package/src/lib/file-import-diagnostics.js +246 -0
- package/src/lib/skill-loader.js +16 -0
- package/src/lib/transport-error-details.js +83 -0
- package/src/repl/agent-repl.js +86 -7
- package/src/runtime/agent-core.js +248 -15
- package/src/runtime/headless-runner.js +295 -71
- package/src/runtime/headless-stream.js +197 -27
- package/src/runtime/mcp-config.js +26 -17
- package/src/runtime/mcp-tool-search.js +44 -14
- package/src/assets/web-panel/assets/ChatBubbleRenderer-n6BVStHf.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BpdGAVCC.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CxXuPzZg.js +0 -1
- package/src/assets/web-panel/assets/Tasks-QEFENVsp.js +0 -1
- package/src/assets/web-panel/assets/devWarning-rGldFhxo.js +0 -1
- package/src/assets/web-panel/assets/index-Cw-lfvvV.js +0 -1
- package/src/assets/web-panel/assets/index-QBXRSyoZ.js +0 -1
package/src/repl/agent-repl.js
CHANGED
|
@@ -86,7 +86,9 @@ import {
|
|
|
86
86
|
} from "../lib/session-host-snapshot.js";
|
|
87
87
|
import { acquireSessionHostLease } from "../lib/session-host-lease.js";
|
|
88
88
|
import {
|
|
89
|
+
normalizeSessionBudgetRootConfig,
|
|
89
90
|
openProductionSessionBudgetRoot,
|
|
91
|
+
readProductionSessionBudget,
|
|
90
92
|
sessionBudgetAdmissionError,
|
|
91
93
|
} from "../lib/session-budget-production-root.js";
|
|
92
94
|
import {
|
|
@@ -2265,9 +2267,25 @@ export function prepareReplJsonlResumeCandidate(sessionId, dependencies = {}) {
|
|
|
2265
2267
|
error.code = "CC_REPL_SESSION_AUTHORITY_MISMATCH";
|
|
2266
2268
|
throw error;
|
|
2267
2269
|
}
|
|
2270
|
+
const declaredBudget = dataDescriptorValue(
|
|
2271
|
+
stateDescriptors,
|
|
2272
|
+
"sessionBudgetRoot",
|
|
2273
|
+
"REPL session host resume state",
|
|
2274
|
+
{ required: false },
|
|
2275
|
+
);
|
|
2276
|
+
const sessionBudgetRoot =
|
|
2277
|
+
declaredBudget == null
|
|
2278
|
+
? null
|
|
2279
|
+
: normalizeSessionBudgetRootConfig(
|
|
2280
|
+
snapshotReplMessageValue(
|
|
2281
|
+
declaredBudget,
|
|
2282
|
+
"REPL session budget declaration",
|
|
2283
|
+
),
|
|
2284
|
+
);
|
|
2268
2285
|
return brandedFrozenCandidate(REPL_JSONL_RESUME_CANDIDATES, {
|
|
2269
2286
|
ok: true,
|
|
2270
2287
|
sessionId,
|
|
2288
|
+
sessionBudgetRoot,
|
|
2271
2289
|
rebuiltMessages,
|
|
2272
2290
|
replayMessages: normalizedReplay.replayMessages,
|
|
2273
2291
|
canonicalSystemMessages: normalizedReplay.canonicalSystemMessages,
|
|
@@ -2786,8 +2804,60 @@ export async function runReplStartupBoundary(options, startupDependencies) {
|
|
|
2786
2804
|
) {
|
|
2787
2805
|
leaseScope.lease = acquireHostLease(leaseSessionId, { hostKind: "repl" });
|
|
2788
2806
|
}
|
|
2789
|
-
|
|
2790
|
-
|
|
2807
|
+
const injectedBudgetReader = dependencyDataFunction(
|
|
2808
|
+
startupDependencies,
|
|
2809
|
+
"readProductionSessionBudget",
|
|
2810
|
+
null,
|
|
2811
|
+
);
|
|
2812
|
+
const sidecar =
|
|
2813
|
+
leaseSessionId &&
|
|
2814
|
+
(process.platform === "linux" || injectedBudgetReader !== null)
|
|
2815
|
+
? synchronousReplRecoveryValue(
|
|
2816
|
+
(injectedBudgetReader || readProductionSessionBudget)(leaseSessionId),
|
|
2817
|
+
"REPL budget sidecar",
|
|
2818
|
+
)
|
|
2819
|
+
: null;
|
|
2820
|
+
let effectiveBudgetConfig = options.sessionBudgetRoot;
|
|
2821
|
+
const declaredBudgetConfig = startupCandidate?.sessionBudgetRoot;
|
|
2822
|
+
const requestedBudgetConfig = options.sessionBudgetRoot?.enabled
|
|
2823
|
+
? normalizeSessionBudgetRootConfig(options.sessionBudgetRoot)
|
|
2824
|
+
: null;
|
|
2825
|
+
if (startupCandidate?.ok === true) {
|
|
2826
|
+
if (declaredBudgetConfig?.enabled) {
|
|
2827
|
+
if (!sidecar) {
|
|
2828
|
+
throw Object.assign(
|
|
2829
|
+
new Error("budgeted REPL session is missing its budget sidecar"),
|
|
2830
|
+
{ code: "CC_SESSION_BUDGET_SIDECAR_REQUIRED" },
|
|
2831
|
+
);
|
|
2832
|
+
}
|
|
2833
|
+
if (
|
|
2834
|
+
requestedBudgetConfig &&
|
|
2835
|
+
JSON.stringify(requestedBudgetConfig) !==
|
|
2836
|
+
JSON.stringify(declaredBudgetConfig)
|
|
2837
|
+
) {
|
|
2838
|
+
throw Object.assign(
|
|
2839
|
+
new Error("REPL budget does not match its JSONL declaration"),
|
|
2840
|
+
{ code: "CC_SESSION_BUDGET_CONFIG_MISMATCH" },
|
|
2841
|
+
);
|
|
2842
|
+
}
|
|
2843
|
+
effectiveBudgetConfig = declaredBudgetConfig;
|
|
2844
|
+
} else if (requestedBudgetConfig || sidecar) {
|
|
2845
|
+
throw Object.assign(
|
|
2846
|
+
new Error("existing REPL session has no canonical budget declaration"),
|
|
2847
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
2848
|
+
);
|
|
2849
|
+
}
|
|
2850
|
+
} else if (sidecar) {
|
|
2851
|
+
throw Object.assign(
|
|
2852
|
+
new Error("budget sidecar has no canonical REPL session"),
|
|
2853
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
2854
|
+
);
|
|
2855
|
+
}
|
|
2856
|
+
let workspaceOptions = {
|
|
2857
|
+
...options,
|
|
2858
|
+
sessionBudgetRoot: effectiveBudgetConfig,
|
|
2859
|
+
};
|
|
2860
|
+
if (effectiveBudgetConfig?.enabled === true) {
|
|
2791
2861
|
if (!leaseSessionId || !leaseScope?.lease) {
|
|
2792
2862
|
throw Object.assign(
|
|
2793
2863
|
new Error(
|
|
@@ -2813,10 +2883,10 @@ export async function runReplStartupBoundary(options, startupDependencies) {
|
|
|
2813
2883
|
"CC_REPL_STARTUP_DEPENDENCY_INVALID",
|
|
2814
2884
|
);
|
|
2815
2885
|
}
|
|
2816
|
-
const root = openBudgetRoot(leaseSessionId,
|
|
2886
|
+
const root = openBudgetRoot(leaseSessionId, effectiveBudgetConfig, {
|
|
2817
2887
|
persist: true,
|
|
2818
2888
|
signal: combineReplSignals(options.signal, leaseScope.lease.signal),
|
|
2819
|
-
table:
|
|
2889
|
+
table: effectiveBudgetConfig.table,
|
|
2820
2890
|
});
|
|
2821
2891
|
if (
|
|
2822
2892
|
root?.enabled !== true ||
|
|
@@ -2850,7 +2920,7 @@ export async function runReplStartupBoundary(options, startupDependencies) {
|
|
|
2850
2920
|
throw admissionError;
|
|
2851
2921
|
}
|
|
2852
2922
|
budgetScope.root = root;
|
|
2853
|
-
workspaceOptions = { ...
|
|
2923
|
+
workspaceOptions = { ...workspaceOptions, ...root.options };
|
|
2854
2924
|
}
|
|
2855
2925
|
const trustedWorkspaceRoot = readCwd();
|
|
2856
2926
|
return enterWorkspace(trustedWorkspaceRoot, () =>
|
|
@@ -2867,11 +2937,17 @@ export function startReplJsonlSession(
|
|
|
2867
2937
|
options = {},
|
|
2868
2938
|
) {
|
|
2869
2939
|
const requireDurable =
|
|
2870
|
-
observabilityScope != null ||
|
|
2940
|
+
observabilityScope != null ||
|
|
2941
|
+
options.requireDurable === true ||
|
|
2942
|
+
options.sessionBudgetRoot?.enabled === true;
|
|
2871
2943
|
try {
|
|
2944
|
+
const budgetDeclaration = options.sessionBudgetRoot?.enabled
|
|
2945
|
+
? normalizeSessionBudgetRootConfig(options.sessionBudgetRoot)
|
|
2946
|
+
: null;
|
|
2872
2947
|
const sessionId = startSession(requestedId, {
|
|
2873
2948
|
...meta,
|
|
2874
2949
|
...(observabilityScope != null ? { observabilityScope } : {}),
|
|
2950
|
+
...(budgetDeclaration ? { sessionBudgetRoot: budgetDeclaration } : {}),
|
|
2875
2951
|
});
|
|
2876
2952
|
if (requireDurable && (typeof sessionId !== "string" || !sessionId)) {
|
|
2877
2953
|
throw new Error("JSONL session creation returned no durable session id");
|
|
@@ -3966,7 +4042,10 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
3966
4042
|
options.sessionId || null,
|
|
3967
4043
|
meta,
|
|
3968
4044
|
options.observabilityScope,
|
|
3969
|
-
{
|
|
4045
|
+
{
|
|
4046
|
+
requireDurable: Boolean(_sessionBudget),
|
|
4047
|
+
sessionBudgetRoot: options.sessionBudgetRoot,
|
|
4048
|
+
},
|
|
3970
4049
|
);
|
|
3971
4050
|
if (
|
|
3972
4051
|
sessionId &&
|
|
@@ -49,6 +49,7 @@ import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
|
|
|
49
49
|
import { gitToolInputError } from "../lib/git-tool-input.js";
|
|
50
50
|
import { shellOutputPage, shellOutputPreview } from "../lib/shell-output.js";
|
|
51
51
|
import { DIAGNOSTIC_WORKFLOW_GUIDANCE } from "../lib/diagnostic-workflow.js";
|
|
52
|
+
import { CODING_TASK_QUALITY_GUIDANCE } from "../lib/coding-task-guidance.js";
|
|
52
53
|
import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
|
|
53
54
|
import {
|
|
54
55
|
isPrActionRequest,
|
|
@@ -1167,6 +1168,8 @@ export function getBaseSystemPrompt(cwd) {
|
|
|
1167
1168
|
You have access to tools that let you read files, write files, edit files, run shell commands, and search the codebase. When the user asks you to do something, USE THE TOOLS to actually do it — don't just describe what should be done.
|
|
1168
1169
|
|
|
1169
1170
|
Key behaviors:
|
|
1171
|
+
${CODING_TASK_QUALITY_GUIDANCE}
|
|
1172
|
+
|
|
1170
1173
|
- A new user message may arrive before the previous task finishes. Incorporate corrections and added requests while preserving unfinished authorized work, unless the user cancels or replaces it. Use the completed tool results already in history; do not restart the investigation.
|
|
1171
1174
|
- When asked to modify code, read the file first, then edit it
|
|
1172
1175
|
- When asked to create something, use write_file to create it
|
|
@@ -4927,19 +4930,63 @@ export async function _withPostEditDiagnostics(
|
|
|
4927
4930
|
cwd,
|
|
4928
4931
|
additionalDirectories,
|
|
4929
4932
|
managedCheckpoint = false,
|
|
4933
|
+
writtenContent = null,
|
|
4930
4934
|
) {
|
|
4935
|
+
// Parsing the bytes we just wrote is safe even when starting a language
|
|
4936
|
+
// server is forbidden. Feed definite local import mistakes back in the same
|
|
4937
|
+
// tool result; a successful write still means persistence, not test success.
|
|
4938
|
+
let enriched = result;
|
|
4939
|
+
if (
|
|
4940
|
+
result?.success === true &&
|
|
4941
|
+
typeof writtenContent === "string" &&
|
|
4942
|
+
/\.(?:js|mjs|cjs)$/i.test(filePath) &&
|
|
4943
|
+
process.env.CC_EDIT_DIAGNOSTICS !== "0"
|
|
4944
|
+
) {
|
|
4945
|
+
try {
|
|
4946
|
+
const root = pickRootForFile(
|
|
4947
|
+
path.resolve(cwd || process.cwd(), filePath),
|
|
4948
|
+
workspaceRootsFor(cwd, additionalDirectories),
|
|
4949
|
+
);
|
|
4950
|
+
if (root) {
|
|
4951
|
+
const { collectFileImportDiagnostics } = await import(
|
|
4952
|
+
"../lib/file-import-diagnostics.js"
|
|
4953
|
+
);
|
|
4954
|
+
const checked = collectFileImportDiagnostics({
|
|
4955
|
+
filePath,
|
|
4956
|
+
content: writtenContent,
|
|
4957
|
+
workspaceRoot: root,
|
|
4958
|
+
});
|
|
4959
|
+
if (checked.diagnostics.length) {
|
|
4960
|
+
enriched = {
|
|
4961
|
+
...result,
|
|
4962
|
+
newDiagnostics: [
|
|
4963
|
+
...(result.newDiagnostics || []),
|
|
4964
|
+
...checked.diagnostics.slice(0, 8),
|
|
4965
|
+
],
|
|
4966
|
+
};
|
|
4967
|
+
}
|
|
4968
|
+
}
|
|
4969
|
+
} catch {
|
|
4970
|
+
// Optional diagnostics must not turn a persisted edit into a failed one.
|
|
4971
|
+
}
|
|
4972
|
+
}
|
|
4931
4973
|
// A cold language server is a long-lived child process. Starting one inside
|
|
4932
4974
|
// a managed workspace transaction would keep a writer bound past tool
|
|
4933
4975
|
// settlement and make commit/rollback unverifiable. Managed edits therefore
|
|
4934
4976
|
// skip this best-effort enrichment; callers can request diagnostics after the
|
|
4935
4977
|
// checkpoint has sealed.
|
|
4936
|
-
if (managedCheckpoint) return
|
|
4978
|
+
if (managedCheckpoint) return enriched;
|
|
4937
4979
|
const newDiagnostics = await _postEditDiagnostics(
|
|
4938
4980
|
filePath,
|
|
4939
4981
|
cwd,
|
|
4940
4982
|
additionalDirectories,
|
|
4941
4983
|
);
|
|
4942
|
-
return newDiagnostics
|
|
4984
|
+
return newDiagnostics
|
|
4985
|
+
? {
|
|
4986
|
+
...enriched,
|
|
4987
|
+
newDiagnostics: [...(enriched.newDiagnostics || []), ...newDiagnostics],
|
|
4988
|
+
}
|
|
4989
|
+
: enriched;
|
|
4943
4990
|
}
|
|
4944
4991
|
|
|
4945
4992
|
// ─── Lazy subtree instruction injection (large-monorepo lever) ─────────────
|
|
@@ -5791,6 +5838,7 @@ async function executeToolInner(
|
|
|
5791
5838
|
cwd,
|
|
5792
5839
|
additionalDirectories,
|
|
5793
5840
|
managedCheckpoint || hermeticExecution,
|
|
5841
|
+
args.content,
|
|
5794
5842
|
),
|
|
5795
5843
|
filePath,
|
|
5796
5844
|
cwd,
|
|
@@ -5992,6 +6040,7 @@ async function executeToolInner(
|
|
|
5992
6040
|
cwd,
|
|
5993
6041
|
additionalDirectories,
|
|
5994
6042
|
managedCheckpoint || hermeticExecution,
|
|
6043
|
+
newContent,
|
|
5995
6044
|
),
|
|
5996
6045
|
filePath,
|
|
5997
6046
|
cwd,
|
|
@@ -6094,6 +6143,7 @@ async function executeToolInner(
|
|
|
6094
6143
|
cwd,
|
|
6095
6144
|
additionalDirectories,
|
|
6096
6145
|
managedCheckpoint || hermeticExecution,
|
|
6146
|
+
result.content,
|
|
6097
6147
|
),
|
|
6098
6148
|
filePath,
|
|
6099
6149
|
cwd,
|
|
@@ -9289,24 +9339,122 @@ async function executeToolInner(
|
|
|
9289
9339
|
? null
|
|
9290
9340
|
: captureSkillDecisionRuntime(skillDecisionRuntime);
|
|
9291
9341
|
if (decisionRuntime !== null && routing.candidates.length > 0) {
|
|
9292
|
-
const
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9342
|
+
const decisionInputsFor = (result, descriptors) => {
|
|
9343
|
+
const descriptorsByDigest = new Map(
|
|
9344
|
+
descriptors.map((skill) => [
|
|
9345
|
+
skill.executionIdentity?.contentDigest,
|
|
9346
|
+
skill,
|
|
9347
|
+
]),
|
|
9348
|
+
);
|
|
9349
|
+
return result.candidates.slice(0, 5).map((candidate) => {
|
|
9350
|
+
const descriptor = descriptorsByDigest.get(candidate.digest);
|
|
9296
9351
|
return {
|
|
9297
|
-
|
|
9298
|
-
|
|
9299
|
-
|
|
9300
|
-
|
|
9301
|
-
|
|
9302
|
-
|
|
9352
|
+
candidate: {
|
|
9353
|
+
id: candidate.id,
|
|
9354
|
+
displayName: candidate.displayName,
|
|
9355
|
+
description: descriptor?.description || candidate.displayName,
|
|
9356
|
+
category: candidate.category,
|
|
9357
|
+
digest: candidate.digest,
|
|
9358
|
+
tags: Array.isArray(descriptor?.tags)
|
|
9359
|
+
? [...descriptor.tags]
|
|
9360
|
+
: [],
|
|
9361
|
+
},
|
|
9362
|
+
// Scope and compatibility are local routing inputs. They never
|
|
9363
|
+
// leave the process, but changes invalidate the old advice.
|
|
9364
|
+
identity: {
|
|
9365
|
+
namespace: candidate.namespace,
|
|
9366
|
+
version: candidate.version,
|
|
9367
|
+
paths: descriptor?.paths ?? null,
|
|
9368
|
+
os: descriptor?.os ?? null,
|
|
9369
|
+
capabilities: descriptor?.capabilities ?? null,
|
|
9370
|
+
},
|
|
9303
9371
|
};
|
|
9304
|
-
})
|
|
9372
|
+
});
|
|
9373
|
+
};
|
|
9374
|
+
const decisionInputs = decisionInputsFor(routing, skills);
|
|
9375
|
+
const snapshotFor = (result, inputs) =>
|
|
9376
|
+
JSON.stringify({
|
|
9377
|
+
candidates: inputs,
|
|
9378
|
+
selectedDigest: result.selected?.digest ?? null,
|
|
9379
|
+
conflicts: result.conflicts,
|
|
9380
|
+
});
|
|
9381
|
+
const decisionSnapshot = snapshotFor(routing, decisionInputs);
|
|
9382
|
+
const contextRevision = `routing-${createHash("sha256")
|
|
9383
|
+
.update(
|
|
9384
|
+
JSON.stringify({
|
|
9385
|
+
query: args.query,
|
|
9386
|
+
category: args.category ?? null,
|
|
9387
|
+
cwd,
|
|
9388
|
+
turnId: turnId || toolCallId || "list-skills",
|
|
9389
|
+
toolCallId: toolCallId ?? null,
|
|
9390
|
+
decisionSnapshot,
|
|
9391
|
+
}),
|
|
9392
|
+
)
|
|
9393
|
+
.digest("hex")}`;
|
|
9394
|
+
const decision = await decisionRuntime.suggest({
|
|
9395
|
+
query: args.query,
|
|
9396
|
+
candidates: decisionInputs.map(({ candidate }) => candidate),
|
|
9305
9397
|
turnId: turnId || toolCallId || "list-skills",
|
|
9306
|
-
contextRevision
|
|
9398
|
+
contextRevision,
|
|
9307
9399
|
signal,
|
|
9308
9400
|
});
|
|
9309
|
-
|
|
9401
|
+
signal?.throwIfAborted();
|
|
9402
|
+
// The provider result belongs to the captured candidate set. Recheck
|
|
9403
|
+
// the persisted revocations and live loader before exposing advice.
|
|
9404
|
+
await skillRetrievalRevocationReader?.refresh();
|
|
9405
|
+
signal?.throwIfAborted();
|
|
9406
|
+
const refreshedSkills =
|
|
9407
|
+
typeof skillLoader.refreshResolvedSkills === "function"
|
|
9408
|
+
? await skillLoader.refreshResolvedSkills()
|
|
9409
|
+
: skillLoader.getResolvedSkills();
|
|
9410
|
+
signal?.throwIfAborted();
|
|
9411
|
+
let currentSkills = await filterSkillsByCwd(
|
|
9412
|
+
refreshedSkills.filter(skillAllowed),
|
|
9413
|
+
cwd,
|
|
9414
|
+
);
|
|
9415
|
+
if (args.category) {
|
|
9416
|
+
currentSkills = currentSkills.filter(
|
|
9417
|
+
(s) => s.category.toLowerCase() === args.category.toLowerCase(),
|
|
9418
|
+
);
|
|
9419
|
+
}
|
|
9420
|
+
// The vector index can change while the decision provider is in
|
|
9421
|
+
// flight. Score the refreshed corpus again before comparing routing.
|
|
9422
|
+
vector =
|
|
9423
|
+
vectorAuthority === null
|
|
9424
|
+
? null
|
|
9425
|
+
: await vectorAuthority.score({
|
|
9426
|
+
query: args.query,
|
|
9427
|
+
skills: currentSkills,
|
|
9428
|
+
});
|
|
9429
|
+
signal?.throwIfAborted();
|
|
9430
|
+
const currentRouting = routeSkillDescriptors({
|
|
9431
|
+
skills: currentSkills,
|
|
9432
|
+
query: args.query,
|
|
9433
|
+
target: { os: process.platform },
|
|
9434
|
+
vectorScores: vector?.scores ?? null,
|
|
9435
|
+
outcomeMetrics: outcomeAuthority.metrics,
|
|
9436
|
+
revocationReader: skillRetrievalRevocationReader ?? null,
|
|
9437
|
+
topK: Math.min(64, Math.max(1, currentSkills.length)),
|
|
9438
|
+
});
|
|
9439
|
+
const currentByDigest = new Map(
|
|
9440
|
+
currentSkills.map((skill) => [
|
|
9441
|
+
skill.executionIdentity?.contentDigest,
|
|
9442
|
+
skill,
|
|
9443
|
+
]),
|
|
9444
|
+
);
|
|
9445
|
+
const currentDecisionSnapshot = snapshotFor(
|
|
9446
|
+
currentRouting,
|
|
9447
|
+
decisionInputsFor(currentRouting, currentSkills),
|
|
9448
|
+
);
|
|
9449
|
+
routing = currentRouting;
|
|
9450
|
+
skills = routing.candidates
|
|
9451
|
+
.map(({ digest }) => currentByDigest.get(digest))
|
|
9452
|
+
.filter(Boolean);
|
|
9453
|
+
signal?.throwIfAborted();
|
|
9454
|
+
if (
|
|
9455
|
+
decision.visible &&
|
|
9456
|
+
currentDecisionSnapshot === decisionSnapshot
|
|
9457
|
+
) {
|
|
9310
9458
|
routing = Object.freeze({
|
|
9311
9459
|
...routing,
|
|
9312
9460
|
decisionSuggestion: Object.freeze({
|
|
@@ -14524,6 +14672,53 @@ export async function* agentLoop(messages, options) {
|
|
|
14524
14672
|
options.hostResourceBudget || new HostResourceBudget();
|
|
14525
14673
|
const taskProgressTracker =
|
|
14526
14674
|
options.taskProgressTracker || new TaskProgressTracker();
|
|
14675
|
+
// A subtree preflight is deliberately not an executed mutation. Keep this
|
|
14676
|
+
// obligation outside transcript compaction and never replay it automatically.
|
|
14677
|
+
const pendingSubtreeMutations = new Map();
|
|
14678
|
+
let subtreeMutationReprompted = false;
|
|
14679
|
+
const recordSubtreeMutation = (tool, args, result) => {
|
|
14680
|
+
if (!GUARDED_FILE_MUTATION_TOOLS.has(tool)) return;
|
|
14681
|
+
if (!args || typeof args !== "object" || Array.isArray(args)) return;
|
|
14682
|
+
// Invalid tool arguments/results must retain their existing error path;
|
|
14683
|
+
// bookkeeping must not introduce a new exception or completion verdict.
|
|
14684
|
+
const requestedPaths = fileMutationPaths(tool, args);
|
|
14685
|
+
if (
|
|
14686
|
+
!requestedPaths.length ||
|
|
14687
|
+
requestedPaths.some((target) => typeof target !== "string")
|
|
14688
|
+
)
|
|
14689
|
+
return;
|
|
14690
|
+
const targets = [
|
|
14691
|
+
...new Set(
|
|
14692
|
+
requestedPaths.map((target) =>
|
|
14693
|
+
path.resolve(options.cwd || process.cwd(), target),
|
|
14694
|
+
),
|
|
14695
|
+
),
|
|
14696
|
+
].sort();
|
|
14697
|
+
// These tools are alternative ways to deliver content to the same target.
|
|
14698
|
+
// A successful explicit replacement must settle a deferred edit (and vice
|
|
14699
|
+
// versa); move/delete/notebook effects retain their distinct obligations.
|
|
14700
|
+
const effect = ["write_file", "edit_file", "edit_file_hashed"].includes(tool)
|
|
14701
|
+
? "file-content"
|
|
14702
|
+
: tool;
|
|
14703
|
+
const key = JSON.stringify([effect, targets]);
|
|
14704
|
+
if (
|
|
14705
|
+
result?.policy?.via === "subtree-instructions" &&
|
|
14706
|
+
result.policy.decision === "deferred" &&
|
|
14707
|
+
result.mutationPerformed === false
|
|
14708
|
+
) {
|
|
14709
|
+
pendingSubtreeMutations.set(key, { tool, targets });
|
|
14710
|
+
} else if (
|
|
14711
|
+
result &&
|
|
14712
|
+
!result.error &&
|
|
14713
|
+
result.success === true &&
|
|
14714
|
+
result.isError !== true &&
|
|
14715
|
+
result.policy?.decision !== "deny" &&
|
|
14716
|
+
result.policy?.decision !== "deferred" &&
|
|
14717
|
+
result.mutationPerformed !== false
|
|
14718
|
+
) {
|
|
14719
|
+
pendingSubtreeMutations.delete(key);
|
|
14720
|
+
}
|
|
14721
|
+
};
|
|
14527
14722
|
const signal = options.signal || null;
|
|
14528
14723
|
const workflowEffectId = _normalizeWorkflowEffectId(options.workflowEffectId);
|
|
14529
14724
|
// Optional OpenTelemetry recorder (TelemetryRecorder). When present, the loop
|
|
@@ -16299,6 +16494,42 @@ export async function* agentLoop(messages, options) {
|
|
|
16299
16494
|
}
|
|
16300
16495
|
continue;
|
|
16301
16496
|
}
|
|
16497
|
+
if (pendingSubtreeMutations.size) {
|
|
16498
|
+
const pending = [...pendingSubtreeMutations.values()];
|
|
16499
|
+
if (!subtreeMutationReprompted && budget.remaining() > 0) {
|
|
16500
|
+
subtreeMutationReprompted = true;
|
|
16501
|
+
messages.push({ role: "assistant", content: msg.content || "" });
|
|
16502
|
+
messages.push({
|
|
16503
|
+
role: "user",
|
|
16504
|
+
content:
|
|
16505
|
+
"Runtime status: these mutations were deferred before any effect: " +
|
|
16506
|
+
JSON.stringify(pending) +
|
|
16507
|
+
". Review the authoritative subtree instructions already returned. " +
|
|
16508
|
+
"If still authorized and appropriate, explicitly issue the required tool call. " +
|
|
16509
|
+
"Do not bypass rules or perform a prohibited write. Otherwise report the unfinished work and its blocker. " +
|
|
16510
|
+
"A promise to retry does not execute the mutation.",
|
|
16511
|
+
});
|
|
16512
|
+
yield {
|
|
16513
|
+
type: "iteration-warning",
|
|
16514
|
+
message:
|
|
16515
|
+
"Subtree-deferred mutations remain unexecuted; one recovery turn requested.",
|
|
16516
|
+
};
|
|
16517
|
+
continue;
|
|
16518
|
+
}
|
|
16519
|
+
yield {
|
|
16520
|
+
type: "response-complete",
|
|
16521
|
+
content:
|
|
16522
|
+
(msg.content ? msg.content + "\n\n" : "") +
|
|
16523
|
+
"Incomplete: subtree-deferred mutations remain unexecuted.",
|
|
16524
|
+
};
|
|
16525
|
+
yield {
|
|
16526
|
+
type: "run-ended",
|
|
16527
|
+
runId,
|
|
16528
|
+
reason: "deferred-mutation-unresolved",
|
|
16529
|
+
pendingMutations: pending,
|
|
16530
|
+
};
|
|
16531
|
+
return;
|
|
16532
|
+
}
|
|
16302
16533
|
// Surface the final answer's extended-thinking reasoning (Anthropic, when
|
|
16303
16534
|
// --think is on) so non-streaming consumers (the REPL) can show it. The
|
|
16304
16535
|
// streaming path forwards reasoning live via onThinking instead.
|
|
@@ -16540,6 +16771,7 @@ export async function* agentLoop(messages, options) {
|
|
|
16540
16771
|
} = await promise;
|
|
16541
16772
|
if (fatalError) throw fatalError;
|
|
16542
16773
|
throwIfAborted(signal);
|
|
16774
|
+
recordSubtreeMutation(call.function.name, toolArgs, toolResult);
|
|
16543
16775
|
const taskAdvanced = taskProgressTracker.record(
|
|
16544
16776
|
call.function.name,
|
|
16545
16777
|
toolResult,
|
|
@@ -17083,6 +17315,7 @@ export async function* agentLoop(messages, options) {
|
|
|
17083
17315
|
// context — but tell the model when we cut it (no more silent
|
|
17084
17316
|
// mid-content slice). See MAX_TOOL_RESULT_CHARS / capToolResultString.
|
|
17085
17317
|
const resultStr = toolResultForModel(toolName, toolResult, messages);
|
|
17318
|
+
recordSubtreeMutation(toolName, toolArgs, toolResult);
|
|
17086
17319
|
const taskAdvanced = taskProgressTracker.record(
|
|
17087
17320
|
toolName,
|
|
17088
17321
|
toolResult,
|