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
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { randomUUID } from "node:crypto";
|
|
20
|
+
import { transportErrorDetails } from "../lib/transport-error-details.js";
|
|
20
21
|
import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
|
|
21
22
|
import { TaskWorklog } from "../lib/context-memory-kernel/task-worklog-port.js";
|
|
22
23
|
import { isProxy } from "node:util/types";
|
|
@@ -151,7 +152,9 @@ import {
|
|
|
151
152
|
} from "../lib/session-host-snapshot.js";
|
|
152
153
|
import { acquireSessionHostLease } from "../lib/session-host-lease.js";
|
|
153
154
|
import {
|
|
155
|
+
normalizeSessionBudgetRootConfig,
|
|
154
156
|
openProductionSessionBudgetRoot,
|
|
157
|
+
readProductionSessionBudget,
|
|
155
158
|
sessionBudgetAdmissionError,
|
|
156
159
|
} from "../lib/session-budget-production-root.js";
|
|
157
160
|
import {
|
|
@@ -1441,6 +1444,7 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1441
1444
|
let lease = null;
|
|
1442
1445
|
let budgetRoot = null;
|
|
1443
1446
|
let onLeaseAbort = null;
|
|
1447
|
+
let taskStarted = false;
|
|
1444
1448
|
try {
|
|
1445
1449
|
if (persist && typeof acquireHostLease === "function") {
|
|
1446
1450
|
lease = acquireHostLease(sessionId, { hostKind: "headless-stream" });
|
|
@@ -1461,13 +1465,109 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1461
1465
|
: lease.signal,
|
|
1462
1466
|
}
|
|
1463
1467
|
: options;
|
|
1468
|
+
const canReadCanonical =
|
|
1469
|
+
!hasInjectedSessionStore ||
|
|
1470
|
+
typeof deps.readVerifiedEvents === "function" ||
|
|
1471
|
+
typeof deps.readVerifiedProjection === "function";
|
|
1472
|
+
const budgetStore = deps.sessionBudgetStore;
|
|
1473
|
+
const sidecar =
|
|
1474
|
+
persist && (process.platform === "linux" || budgetStore)
|
|
1475
|
+
? readProductionSessionBudget(sessionId, { store: budgetStore })
|
|
1476
|
+
: null;
|
|
1477
|
+
const needsBudgetAdmission =
|
|
1478
|
+
persist &&
|
|
1479
|
+
(!hasInjectedSessionStore ||
|
|
1480
|
+
options.sessionBudgetRoot?.enabled === true ||
|
|
1481
|
+
Boolean(budgetStore) ||
|
|
1482
|
+
Boolean(deps.openSessionBudget) ||
|
|
1483
|
+
Boolean(sidecar));
|
|
1484
|
+
let effectiveBudgetConfig = options.sessionBudgetRoot;
|
|
1485
|
+
if (needsBudgetAdmission) {
|
|
1486
|
+
const existing = (
|
|
1487
|
+
deps.sessionHasPersistedEvidence ||
|
|
1488
|
+
deps.sessionExists ||
|
|
1489
|
+
jsonlSessionHasPersistedEvidence
|
|
1490
|
+
)(sessionId);
|
|
1491
|
+
if (typeof existing !== "boolean") {
|
|
1492
|
+
throw Object.assign(
|
|
1493
|
+
new Error("stream session existence must be checked synchronously"),
|
|
1494
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1495
|
+
);
|
|
1496
|
+
}
|
|
1497
|
+
if (existing && !canReadCanonical) {
|
|
1498
|
+
throw Object.assign(
|
|
1499
|
+
new Error("budgeted stream resume requires verified session events"),
|
|
1500
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1501
|
+
);
|
|
1502
|
+
}
|
|
1503
|
+
const canonical = existing
|
|
1504
|
+
? readSessionHostResumeState(sessionId, {
|
|
1505
|
+
sessionExists: () => true,
|
|
1506
|
+
readVerifiedEvents:
|
|
1507
|
+
deps.readVerifiedEvents || jsonlReadVerifiedEvents,
|
|
1508
|
+
...(!hasInjectedSessionStore || deps.readVerifiedProjection
|
|
1509
|
+
? {
|
|
1510
|
+
readVerifiedProjection:
|
|
1511
|
+
deps.readVerifiedProjection || jsonlReadVerifiedProjection,
|
|
1512
|
+
}
|
|
1513
|
+
: {}),
|
|
1514
|
+
})
|
|
1515
|
+
: null;
|
|
1516
|
+
if (canonical && !isVerifiedSessionHostSnapshot(canonical.snapshot)) {
|
|
1517
|
+
throw Object.assign(
|
|
1518
|
+
new Error("canonical stream session could not be verified"),
|
|
1519
|
+
{ code: "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED" },
|
|
1520
|
+
);
|
|
1521
|
+
}
|
|
1522
|
+
if (!canonical && sidecar) {
|
|
1523
|
+
throw Object.assign(
|
|
1524
|
+
new Error("budget sidecar has no canonical JSONL session"),
|
|
1525
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1526
|
+
);
|
|
1527
|
+
}
|
|
1528
|
+
if (canonical) {
|
|
1529
|
+
const declared = canonical.sessionBudgetRoot;
|
|
1530
|
+
const requested = options.sessionBudgetRoot?.enabled
|
|
1531
|
+
? normalizeSessionBudgetRootConfig(options.sessionBudgetRoot)
|
|
1532
|
+
: null;
|
|
1533
|
+
if (declared?.enabled) {
|
|
1534
|
+
if (!sidecar) {
|
|
1535
|
+
throw Object.assign(
|
|
1536
|
+
new Error(
|
|
1537
|
+
"budgeted stream session is missing its budget sidecar",
|
|
1538
|
+
),
|
|
1539
|
+
{ code: "CC_SESSION_BUDGET_SIDECAR_REQUIRED" },
|
|
1540
|
+
);
|
|
1541
|
+
}
|
|
1542
|
+
if (
|
|
1543
|
+
requested &&
|
|
1544
|
+
JSON.stringify(requested) !== JSON.stringify(declared)
|
|
1545
|
+
) {
|
|
1546
|
+
throw Object.assign(
|
|
1547
|
+
new Error("stream budget does not match its JSONL declaration"),
|
|
1548
|
+
{ code: "CC_SESSION_BUDGET_CONFIG_MISMATCH" },
|
|
1549
|
+
);
|
|
1550
|
+
}
|
|
1551
|
+
effectiveBudgetConfig = declared;
|
|
1552
|
+
} else if (requested || sidecar) {
|
|
1553
|
+
throw Object.assign(
|
|
1554
|
+
new Error("existing stream has no canonical budget declaration"),
|
|
1555
|
+
{ code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
|
|
1556
|
+
);
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
scopedOptions = {
|
|
1561
|
+
...scopedOptions,
|
|
1562
|
+
sessionBudgetRoot: effectiveBudgetConfig,
|
|
1563
|
+
};
|
|
1464
1564
|
budgetRoot = openProductionSessionBudgetRoot(
|
|
1465
1565
|
persist ? sessionId : null,
|
|
1466
|
-
|
|
1566
|
+
effectiveBudgetConfig,
|
|
1467
1567
|
{
|
|
1468
1568
|
persist,
|
|
1469
1569
|
signal: scopedOptions.signal || null,
|
|
1470
|
-
table:
|
|
1570
|
+
table: effectiveBudgetConfig?.table,
|
|
1471
1571
|
open: deps.openSessionBudget,
|
|
1472
1572
|
store: deps.sessionBudgetStore,
|
|
1473
1573
|
registry: deps.sessionBudgetRegistry,
|
|
@@ -1476,11 +1576,40 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
|
|
|
1476
1576
|
if (budgetRoot.enabled) {
|
|
1477
1577
|
scopedOptions = { ...scopedOptions, ...budgetRoot.options };
|
|
1478
1578
|
}
|
|
1579
|
+
taskStarted = true;
|
|
1479
1580
|
return await task(scopedOptions, {
|
|
1480
1581
|
...deps,
|
|
1481
1582
|
[STREAM_SESSION_ID]: sessionId,
|
|
1482
1583
|
[STREAM_SESSION_HOST_LEASE]: lease,
|
|
1483
1584
|
});
|
|
1585
|
+
} catch (error) {
|
|
1586
|
+
// Admission can write a lease or take the Linux budget-sidecar read lock
|
|
1587
|
+
// before the workspace runner installs its persistence boundary. Preserve
|
|
1588
|
+
// the lock's filesystem cause, but never reclassify an executing task.
|
|
1589
|
+
if (taskStarted) throw error;
|
|
1590
|
+
const persistence = projectSessionPersistenceFailure(
|
|
1591
|
+
createSessionPersistenceFailure(error, {
|
|
1592
|
+
sessionId,
|
|
1593
|
+
operation: "session-start",
|
|
1594
|
+
}),
|
|
1595
|
+
{ phase: "before-model" },
|
|
1596
|
+
);
|
|
1597
|
+
if (!persistence) throw error;
|
|
1598
|
+
deps.writeOut(
|
|
1599
|
+
`${JSON.stringify({
|
|
1600
|
+
type: "result",
|
|
1601
|
+
subtype: "error_persistence",
|
|
1602
|
+
is_error: true,
|
|
1603
|
+
code: persistence.code,
|
|
1604
|
+
error: "Canonical stream admission failed",
|
|
1605
|
+
session_id: sessionId,
|
|
1606
|
+
persistence,
|
|
1607
|
+
})}\n`,
|
|
1608
|
+
);
|
|
1609
|
+
deps.writeErr(
|
|
1610
|
+
`${persistence.code}: canonical stream admission was refused\n`,
|
|
1611
|
+
);
|
|
1612
|
+
return { exitCode: 1, turns: 0, persistence };
|
|
1484
1613
|
} finally {
|
|
1485
1614
|
budgetRoot?.close?.();
|
|
1486
1615
|
if (lease?.signal && onLeaseAbort) {
|
|
@@ -1914,7 +2043,29 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1914
2043
|
};
|
|
1915
2044
|
}
|
|
1916
2045
|
}
|
|
1917
|
-
} catch {
|
|
2046
|
+
} catch (error) {
|
|
2047
|
+
const persistence = projectSessionPersistenceFailure(
|
|
2048
|
+
createSessionPersistenceFailure(error, {
|
|
2049
|
+
sessionId,
|
|
2050
|
+
operation: "session-start",
|
|
2051
|
+
}),
|
|
2052
|
+
{ phase: "before-model" },
|
|
2053
|
+
);
|
|
2054
|
+
if (persistence) {
|
|
2055
|
+
emit({
|
|
2056
|
+
type: "result",
|
|
2057
|
+
subtype: "error_persistence",
|
|
2058
|
+
is_error: true,
|
|
2059
|
+
code: persistence.code,
|
|
2060
|
+
error: "Canonical stream session preparation failed",
|
|
2061
|
+
session_id: sessionId,
|
|
2062
|
+
persistence,
|
|
2063
|
+
});
|
|
2064
|
+
writeErr(
|
|
2065
|
+
`${persistence.code}: canonical stream preparation was refused\n`,
|
|
2066
|
+
);
|
|
2067
|
+
return { exitCode: 1, turns: 0, persistence };
|
|
2068
|
+
}
|
|
1918
2069
|
const code = "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED";
|
|
1919
2070
|
emit({
|
|
1920
2071
|
type: "result",
|
|
@@ -1986,8 +2137,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
1986
2137
|
const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
|
|
1987
2138
|
await import("../lib/settings-hooks.cjs");
|
|
1988
2139
|
const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
|
|
1989
|
-
const { mergePluginHooks } =
|
|
1990
|
-
|
|
2140
|
+
const { mergePluginHooks } = await import(
|
|
2141
|
+
"../lib/plugin-runtime/hooks.js"
|
|
2142
|
+
);
|
|
1991
2143
|
const effectiveHooks = mergePluginHooks(
|
|
1992
2144
|
attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
|
|
1993
2145
|
{ cwd },
|
|
@@ -2069,8 +2221,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2069
2221
|
});
|
|
2070
2222
|
|
|
2071
2223
|
if (managedSettings) {
|
|
2072
|
-
const { assertManagedPermissionMode } =
|
|
2073
|
-
|
|
2224
|
+
const { assertManagedPermissionMode } = await import(
|
|
2225
|
+
"../lib/settings-loader.cjs"
|
|
2226
|
+
);
|
|
2074
2227
|
assertManagedPermissionMode(options.permissionMode, managedSettings);
|
|
2075
2228
|
}
|
|
2076
2229
|
const perm = resolvePermissionMode(options.permissionMode);
|
|
@@ -2909,8 +3062,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2909
3062
|
: null;
|
|
2910
3063
|
if (!instructionExcludes) {
|
|
2911
3064
|
try {
|
|
2912
|
-
const { readStringArraySetting } =
|
|
2913
|
-
|
|
3065
|
+
const { readStringArraySetting } = await import(
|
|
3066
|
+
"../lib/settings-loader.cjs"
|
|
3067
|
+
);
|
|
2914
3068
|
const fromSettings = readStringArraySetting("instructionExcludes", {
|
|
2915
3069
|
cwd,
|
|
2916
3070
|
settingsFile: options.settingsFile,
|
|
@@ -2975,8 +3129,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
2975
3129
|
// Best-effort; no-op when project memory is off or no hook is registered.
|
|
2976
3130
|
if (settingsHooks && _loadedInstructions) {
|
|
2977
3131
|
try {
|
|
2978
|
-
const { runInstructionsLoadedHooks } =
|
|
2979
|
-
|
|
3132
|
+
const { runInstructionsLoadedHooks } = await import(
|
|
3133
|
+
"../lib/settings-hook-events.js"
|
|
3134
|
+
);
|
|
2980
3135
|
const ctx = (
|
|
2981
3136
|
await runInstructionsLoadedHooks(settingsHooks, {
|
|
2982
3137
|
files: _loadedInstructions.files,
|
|
@@ -3018,8 +3173,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3018
3173
|
// settings.json SessionStart hooks → inject session context once (observe-only).
|
|
3019
3174
|
if (settingsHooks) {
|
|
3020
3175
|
try {
|
|
3021
|
-
const { runSessionStartHooks } =
|
|
3022
|
-
|
|
3176
|
+
const { runSessionStartHooks } = await import(
|
|
3177
|
+
"../lib/settings-hook-events.js"
|
|
3178
|
+
);
|
|
3023
3179
|
const ctx = (
|
|
3024
3180
|
await runSessionStartHooks(settingsHooks, {
|
|
3025
3181
|
source: "startup",
|
|
@@ -3069,6 +3225,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3069
3225
|
provider,
|
|
3070
3226
|
model,
|
|
3071
3227
|
observabilityScope: options.observabilityScope,
|
|
3228
|
+
...(options.sessionBudgetRoot?.enabled === true
|
|
3229
|
+
? { sessionBudgetRoot: options.sessionBudgetRoot }
|
|
3230
|
+
: {}),
|
|
3072
3231
|
executionLocation: captureAmbientExecutionLocation({
|
|
3073
3232
|
provider,
|
|
3074
3233
|
model,
|
|
@@ -3453,8 +3612,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
3453
3612
|
// the single-prompt runner + the REPL /add-dir path. Best-effort.
|
|
3454
3613
|
if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
|
|
3455
3614
|
try {
|
|
3456
|
-
const { notifyMcpRootsChanged, workspaceRootDirs } =
|
|
3457
|
-
|
|
3615
|
+
const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
|
|
3616
|
+
"../repl/add-dir.js"
|
|
3617
|
+
);
|
|
3458
3618
|
notifyMcpRootsChanged(
|
|
3459
3619
|
[hostMcp.mcpClient],
|
|
3460
3620
|
workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
|
|
@@ -4376,15 +4536,17 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4376
4536
|
return compactionCallId;
|
|
4377
4537
|
},
|
|
4378
4538
|
};
|
|
4379
|
-
const { resolveCliContextMemoryCutover } =
|
|
4380
|
-
|
|
4539
|
+
const { resolveCliContextMemoryCutover } = await import(
|
|
4540
|
+
"../lib/context-memory-kernel/authority.js"
|
|
4541
|
+
);
|
|
4381
4542
|
const cutover = resolveCliContextMemoryCutover({
|
|
4382
4543
|
env: options.contextMemoryEnv || process.env,
|
|
4383
4544
|
scopeKey: `cli:session:${sessionId}`,
|
|
4384
4545
|
});
|
|
4385
4546
|
if (cutover.canonical) {
|
|
4386
|
-
const { compactLiveMessagesCanonical } =
|
|
4387
|
-
|
|
4547
|
+
const { compactLiveMessagesCanonical } = await import(
|
|
4548
|
+
"../lib/context-memory-kernel/live-compaction.js"
|
|
4549
|
+
);
|
|
4388
4550
|
const canonical = await compactLiveMessagesCanonical(messages, {
|
|
4389
4551
|
compressor: {
|
|
4390
4552
|
maxTokens: Math.max(
|
|
@@ -4472,8 +4634,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4472
4634
|
} catch (error) {
|
|
4473
4635
|
if (isAbortError(error) || options.signal?.aborted) throw error;
|
|
4474
4636
|
if (error?.runtimeLedgerPersistence === true) throw error;
|
|
4475
|
-
const { getRejectedCompactionUsage } =
|
|
4476
|
-
|
|
4637
|
+
const { getRejectedCompactionUsage } = await import(
|
|
4638
|
+
"../lib/context-memory-kernel/live-compaction.js"
|
|
4639
|
+
);
|
|
4477
4640
|
const rejectedUsage = getRejectedCompactionUsage(error);
|
|
4478
4641
|
if (
|
|
4479
4642
|
rejectedUsage &&
|
|
@@ -4901,8 +5064,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
4901
5064
|
// session can honour the user's standing preferences ("越用越聪明"
|
|
4902
5065
|
// flywheel). Best-effort — a learning ledger must never break the chat.
|
|
4903
5066
|
try {
|
|
4904
|
-
const { appendFeedback } =
|
|
4905
|
-
|
|
5067
|
+
const { appendFeedback } = await import(
|
|
5068
|
+
"../lib/pdh-feedback-ledger.js"
|
|
5069
|
+
);
|
|
4906
5070
|
appendFeedback({ sessionId, turnId, kind, comment });
|
|
4907
5071
|
} catch {
|
|
4908
5072
|
/* persistence is best-effort */
|
|
@@ -5074,8 +5238,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5074
5238
|
// settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
|
|
5075
5239
|
if (settingsHooks) {
|
|
5076
5240
|
try {
|
|
5077
|
-
const { runUserPromptSubmitHooks } =
|
|
5078
|
-
|
|
5241
|
+
const { runUserPromptSubmitHooks } = await import(
|
|
5242
|
+
"../lib/settings-hook-events.js"
|
|
5243
|
+
);
|
|
5079
5244
|
const ups = await runUserPromptSubmitHooks(settingsHooks, {
|
|
5080
5245
|
prompt: userContent,
|
|
5081
5246
|
cwd,
|
|
@@ -5382,6 +5547,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5382
5547
|
},
|
|
5383
5548
|
);
|
|
5384
5549
|
} catch (err) {
|
|
5550
|
+
const turnWasAborted = currentAbort?.signal.aborted === true;
|
|
5385
5551
|
currentAbort = null;
|
|
5386
5552
|
if (err?.code === AGENT_EVOLUTION_INGRESS_FAILED_CODE) {
|
|
5387
5553
|
emit({
|
|
@@ -5459,8 +5625,9 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5459
5625
|
sawError = true;
|
|
5460
5626
|
break;
|
|
5461
5627
|
}
|
|
5462
|
-
|
|
5463
|
-
|
|
5628
|
+
// Providers can abort their own transport/timeouts, even with AbortError
|
|
5629
|
+
// or ABORT_ERR. Only our owned signals establish user/caller cancellation.
|
|
5630
|
+
const isAbort = turnWasAborted || options.signal?.aborted === true;
|
|
5464
5631
|
if (isAbort && !options.signal?.aborted) {
|
|
5465
5632
|
// User-initiated turn interrupt — not an error; no assistant message
|
|
5466
5633
|
// is recorded (the dangling user turn is fine for the next exchange).
|
|
@@ -5489,11 +5656,13 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5489
5656
|
continue;
|
|
5490
5657
|
}
|
|
5491
5658
|
if (isAbort) break; // outer options.signal — caller is shutting down
|
|
5659
|
+
const transportDetails = transportErrorDetails(err);
|
|
5492
5660
|
emit({
|
|
5493
5661
|
type: "result",
|
|
5494
5662
|
subtype: "error",
|
|
5495
5663
|
is_error: true,
|
|
5496
5664
|
error: err?.message || String(err),
|
|
5665
|
+
...(transportDetails ? { error_details: transportDetails } : {}),
|
|
5497
5666
|
turn: turns,
|
|
5498
5667
|
});
|
|
5499
5668
|
sawError = true;
|
|
@@ -5606,6 +5775,7 @@ async function runAgentHeadlessStreamInWorkspace(
|
|
|
5606
5775
|
exhausted ||
|
|
5607
5776
|
costStopped ||
|
|
5608
5777
|
outcome.endReason === "no-response" ||
|
|
5778
|
+
outcome.endReason === "deferred-mutation-unresolved" ||
|
|
5609
5779
|
Boolean(persistenceFailure);
|
|
5610
5780
|
if (isError) sawError = true;
|
|
5611
5781
|
const transcriptRefs = !persistenceFailure
|
|
@@ -712,8 +712,9 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
712
712
|
if (typeof mcpClient.setReconnector === "function") {
|
|
713
713
|
const baseCfg = cfg;
|
|
714
714
|
mcpClient.setReconnector(name, async () => {
|
|
715
|
-
const { ensureValidToken: reauth } =
|
|
716
|
-
|
|
715
|
+
const { ensureValidToken: reauth } = await import(
|
|
716
|
+
"../lib/mcp-oauth.js"
|
|
717
|
+
);
|
|
717
718
|
const fresh = await reauth(baseCfg.url, { forceRefresh: true });
|
|
718
719
|
if (!fresh) return null;
|
|
719
720
|
return {
|
|
@@ -1224,20 +1225,24 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
1224
1225
|
const out = await setupMcpFromConfig({ ide: cfg }, deps);
|
|
1225
1226
|
// Hot reconnect: a window reload / extension update restarts the editor's
|
|
1226
1227
|
// MCP server on a NEW port with a NEW token. Register a reconnector so a
|
|
1227
|
-
//
|
|
1228
|
-
//
|
|
1229
|
-
//
|
|
1228
|
+
// connection failure re-scans the lockfiles mid-session. An unknown tool
|
|
1229
|
+
// outcome is returned without replay; the next explicit call can use the
|
|
1230
|
+
// recovered bridge. Note the stale CHAINLESSCHAIN_IDE_PORT in
|
|
1230
1231
|
// our env no longer matches any live lock, so discovery falls through to
|
|
1231
1232
|
// the workspace scan — exactly the path that finds the restarted instance.
|
|
1232
1233
|
if (out?.mcpClient?.setReconnector) {
|
|
1233
|
-
out.mcpClient.setReconnector(
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1234
|
+
out.mcpClient.setReconnector(
|
|
1235
|
+
"ide",
|
|
1236
|
+
() => {
|
|
1237
|
+
const fresh = discover({
|
|
1238
|
+
cwd: opts.cwd,
|
|
1239
|
+
env: opts.env,
|
|
1240
|
+
force: opts.force === true,
|
|
1241
|
+
});
|
|
1242
|
+
return fresh ? toCfg(fresh) : null;
|
|
1243
|
+
},
|
|
1244
|
+
{ recoverUnknownOutcome: true },
|
|
1245
|
+
);
|
|
1241
1246
|
}
|
|
1242
1247
|
return out;
|
|
1243
1248
|
}
|
|
@@ -1323,10 +1328,14 @@ export async function loadJetbrainsMcp(opts = {}, deps = {}) {
|
|
|
1323
1328
|
// re-injects a fresh CHAINLESSCHAIN_JETBRAINS_MCP_URL into the next spawn —
|
|
1324
1329
|
// though within one run the env is fixed, so this just re-validates it).
|
|
1325
1330
|
if (out?.mcpClient?.setReconnector) {
|
|
1326
|
-
out.mcpClient.setReconnector(
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1331
|
+
out.mcpClient.setReconnector(
|
|
1332
|
+
"idea",
|
|
1333
|
+
() => {
|
|
1334
|
+
const fresh = discover({ env: opts.env });
|
|
1335
|
+
return fresh ? toCfg(fresh) : null;
|
|
1336
|
+
},
|
|
1337
|
+
{ recoverUnknownOutcome: true },
|
|
1338
|
+
);
|
|
1330
1339
|
}
|
|
1331
1340
|
return out;
|
|
1332
1341
|
}
|
|
@@ -416,7 +416,10 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
416
416
|
if (config.enabled === false) return null;
|
|
417
417
|
|
|
418
418
|
const estimate = opts.estimate || defaultEstimateTokens;
|
|
419
|
-
|
|
419
|
+
// Once a session has a deferred catalog, later connections must keep using
|
|
420
|
+
// it even when the compact stubs bring the current request below threshold.
|
|
421
|
+
// Rechecking only the shrunken request would expose late schemas in full.
|
|
422
|
+
if (config.enabled === "auto" && !mcp.toolSearchRegistry) {
|
|
420
423
|
const window = getContextWindow(opts.model, opts.provider);
|
|
421
424
|
let mcpTokens = 0;
|
|
422
425
|
for (const def of mcp.extraToolDefinitions) {
|
|
@@ -472,10 +475,13 @@ function normalizeTerms(query) {
|
|
|
472
475
|
*/
|
|
473
476
|
export function searchDeferredTools(registry, query, opts = {}) {
|
|
474
477
|
const q = String(query || "").trim();
|
|
478
|
+
const configuredMaxResults = registry?.maxResults;
|
|
475
479
|
const maxResults =
|
|
476
480
|
Number.isInteger(opts.maxResults) && opts.maxResults > 0
|
|
477
481
|
? Math.min(opts.maxResults, 50)
|
|
478
|
-
:
|
|
482
|
+
: Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
|
|
483
|
+
? Math.min(configuredMaxResults, 50)
|
|
484
|
+
: TOOL_SEARCH_DEFAULTS.maxResults;
|
|
479
485
|
const entries = new Map(
|
|
480
486
|
[...(registry?.deferred || [])].filter(([, entry]) => entry.stale !== true),
|
|
481
487
|
);
|
|
@@ -488,22 +494,31 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
488
494
|
.filter(Boolean);
|
|
489
495
|
const results = [];
|
|
490
496
|
const notFound = [];
|
|
497
|
+
const seen = new Set();
|
|
498
|
+
let omittedCount = 0;
|
|
491
499
|
for (const w of wanted) {
|
|
500
|
+
let match = null;
|
|
492
501
|
if (entries.has(w)) {
|
|
493
|
-
|
|
494
|
-
continue;
|
|
495
|
-
}
|
|
496
|
-
// bare tool name → unique suffix match
|
|
497
|
-
const matches = [...entries.keys()].filter(
|
|
498
|
-
(k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
|
|
499
|
-
);
|
|
500
|
-
if (matches.length === 1) {
|
|
501
|
-
results.push({ name: matches[0], entry: entries.get(matches[0]) });
|
|
502
|
+
match = w;
|
|
502
503
|
} else {
|
|
504
|
+
// bare tool name → unique suffix match
|
|
505
|
+
const matches = [...entries.keys()].filter(
|
|
506
|
+
(k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
|
|
507
|
+
);
|
|
508
|
+
if (matches.length === 1) match = matches[0];
|
|
509
|
+
}
|
|
510
|
+
if (!match) {
|
|
503
511
|
notFound.push(w);
|
|
512
|
+
} else if (!seen.has(match)) {
|
|
513
|
+
seen.add(match);
|
|
514
|
+
if (results.length < maxResults) {
|
|
515
|
+
results.push({ name: match, entry: entries.get(match) });
|
|
516
|
+
} else {
|
|
517
|
+
omittedCount += 1;
|
|
518
|
+
}
|
|
504
519
|
}
|
|
505
520
|
}
|
|
506
|
-
return { mode: "select", results, notFound };
|
|
521
|
+
return { mode: "select", results, notFound, omittedCount };
|
|
507
522
|
}
|
|
508
523
|
|
|
509
524
|
const terms = normalizeTerms(q);
|
|
@@ -549,7 +564,18 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
549
564
|
'tool_search requires a "query" argument — use "select:<tool_name>" or keywords.',
|
|
550
565
|
};
|
|
551
566
|
}
|
|
552
|
-
|
|
567
|
+
if (query.length > 8192) {
|
|
568
|
+
return {
|
|
569
|
+
error:
|
|
570
|
+
"tool_search query is too long; select fewer tool names or use shorter keywords.",
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
const {
|
|
574
|
+
mode,
|
|
575
|
+
results,
|
|
576
|
+
notFound,
|
|
577
|
+
omittedCount = 0,
|
|
578
|
+
} = searchDeferredTools(registry, query, {
|
|
553
579
|
maxResults:
|
|
554
580
|
typeof args.max_results === "number"
|
|
555
581
|
? Math.floor(args.max_results)
|
|
@@ -579,6 +605,7 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
579
605
|
tools,
|
|
580
606
|
};
|
|
581
607
|
if (notFound.length > 0) payload.notFound = notFound;
|
|
608
|
+
if (omittedCount > 0) payload.omittedCount = omittedCount;
|
|
582
609
|
if (tools.length === 0) {
|
|
583
610
|
payload.note =
|
|
584
611
|
mode === "select"
|
|
@@ -590,7 +617,10 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
590
617
|
.slice(0, 100);
|
|
591
618
|
} else {
|
|
592
619
|
payload.note =
|
|
593
|
-
"Schemas loaded — call these tools directly with arguments matching `parameters`."
|
|
620
|
+
"Schemas loaded — call these tools directly with arguments matching `parameters`." +
|
|
621
|
+
(omittedCount > 0
|
|
622
|
+
? " Some selected tools were omitted by max_results; select those tools in a separate search before calling them."
|
|
623
|
+
: "");
|
|
594
624
|
}
|
|
595
625
|
return payload;
|
|
596
626
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-CRa4pAaM.js";import"./icons-DG5UD-6K.js";const T={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},M={class:"meta"},O={class:"actor"},R={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",N,[n("div",M,[n("span",O,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(T,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-CRa4pAaM.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as y,b as a}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-CRa4pAaM.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),g=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:g,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):y("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):y("v-if",!0)])}const J=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as B,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S,V as T,o as I,x as O,P as i,Q as k,R as r,F as x,Z as F}from"./vendor-Bn1JzzAn.js";import{u as P,_ as E}from"./index-CRa4pAaM.js";import{R as U}from"./icons-DG5UD-6K.js";const V=B("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),C()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function C(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=V(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),O(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:O,get ReloadOutlined(){return U},get useTasksStore(){return V}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},J={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Y={class:"task-meta"},Z=["title"],q={key:0,class:"error-text"},G={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),C=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),S(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",J,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):T("v-if",!0)]),_:1},8,["type"])):T("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),S(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(x,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(C,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Y,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):T("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),S(C,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,Z)):o.key==="duration"?(i(),c(x,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(x,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(x,{key:4},[e.error?(i(),c("span",q,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",G,r(t.truncate(String(e.result),60)),1)):(i(),c("span",H,"-"))],64)):o.key==="action"?(i(),c(x,{key:5},[e.status==="running"?(i(),S(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):T("v-if",!0)],64)):T("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(L,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-CRa4pAaM.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-C_3Zix40.js";import{a0 as t}from"./index-CRa4pAaM.js";import"./vendor-Bn1JzzAn.js";import"./index-FPXLIXoy.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-CoMxuIcR.js";import{a0 as t}from"./index-CRa4pAaM.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-B8Jwq05-.js";import"./useFlexGapSupport-DAHF0Fwi.js";import"./styleChecker-DgYQ2Q0o.js";import"./index-FPXLIXoy.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|