chainlesschain 0.166.138 → 0.166.140
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 +37 -11
- package/package.json +1 -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-CHItp4vg.js → AIOps-BefmcZw2.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-nhMNWW_d.js → ActionButton-BBlS9rmj.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DRc81BBI.js → Analytics-DfNjXT9e.js} +1 -1
- package/src/assets/web-panel/assets/{AppLayout-CVt7HMkp.js → AppLayout-CIBZPPMS.js} +2 -2
- package/src/assets/web-panel/assets/{Artifacts-BuJgG5jf.js → Artifacts-CE66rTTZ.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-msNg0aH-.js → Audit-DOC8Lt8U.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BpcV8yWC.js → BackgroundAgents-9TMG041Q.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-P53DADwG.js → Backup-us3KWb9F.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DFxT2yWN.js → BaseInput-D6Q95Wr5.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BXoHisHW.js → Chat-BPrM5ARp.js} +1 -1
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DMGtSdDx.js → ChatBubbleRenderer-Drs9vSc4.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B4g_ckJq.js → Checkbox-DqZGMV0o.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C6SSSOfp.js → Codegen-CmolL6wr.js} +1 -1
- package/src/assets/web-panel/assets/{Col-IO1NEUYL.js → Col-BwHSmoYQ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CdEBl93F.js → Community-DGWqobpd.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DYs0a9k7.js → Compact-t_yy09-r.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BPnk7948.js → Compliance-D0S8-EsN.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-VLOTGbza.js → Cowork-Y1LiuRwP.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-_9GgQLJo.js → Cron-FTqEw7QV.js} +1 -1
- package/src/assets/web-panel/assets/{Crosschain-B21yn0qy.js → Crosschain-C3rPZ4Qu.js} +1 -1
- package/src/assets/web-panel/assets/{DID-mBeDgRZ7.js → DID-Ba2zySM-.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-BckYYzhP.js → Dashboard-D6xyN2ND.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DEedqFiE.js → Dropdown-BF4QuXJw.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CMs0k9TB.js → EmailListRenderer-s9dUxq14.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-B00Qd0fN.js → EvolutionSettings-CoAKOfqZ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DxMTAMa8.js → FamilyGuardDashboard-CEznwH1c.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B-UZw0LO.js → Federation-rIzOt8-a.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CkafazEw.js → FormItemContext-BARFiExr.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DEUG25ZJ.js → GenericCardRenderer-DI0A4swS.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D7dr9oz9.js → Git-DdmysND4.js} +1 -1
- package/src/assets/web-panel/assets/{Governance-DKlUJ1wg.js → Governance-DrdhwUz2.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BJKqplap.js → Inference-Scm8tumd.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B78fB-bz.js → KnowledgeGraph-_6bgPs4W.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DJGcHYH_.js → Logs-DW_v7bSo.js} +1 -1
- package/src/assets/web-panel/assets/{MarkdownRenderer-DkcG_MxW.js → MarkdownRenderer-7JABuv1j.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-ucTbwByD.js → Marketplace-0h3YSvME.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cu1xZYYk.js → McpTools-Byrg0Y3e.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-DCGpXmi-.js → Memory-Cyoq-o29.js} +1 -1
- package/src/assets/web-panel/assets/{MobileBridge-BnKr0aAS.js → MobileBridge-ISIlploU.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C5UvYJTP.js → MobileProjects-04EncaRx.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D1UUl4WH.js → Mtc-BMzkpyOF.js} +1 -1
- package/src/assets/web-panel/assets/{MtcAudit-D3aa8XP4.js → MtcAudit-Cx7BR5sz.js} +1 -1
- package/src/assets/web-panel/assets/{Multisig-DiXdfJjO.js → Multisig-D4pmkSX4.js} +1 -1
- package/src/assets/web-panel/assets/{NLProgramming-DbWABgSE.js → NLProgramming-CCfaaWNu.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BP1DPl-R.js → Notes-Mq-1ZyaH.js} +1 -1
- package/src/assets/web-panel/assets/{NotificationSettings-xaB6ONe7.js → NotificationSettings-rzf5V1TR.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D1uNcz3b.js → OrderTableRenderer-OREUs5ue.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DMLDGaf1.js → Organization-BQfOATgw.js} +1 -1
- package/src/assets/web-panel/assets/{Overflow-DH4QPEoI.js → Overflow-D7Pa6aaA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bl4OS10o.js → P2P-CaJ79ZsC.js} +1 -1
- package/src/assets/web-panel/assets/{PdhVaultBrowser-D9XSE2YI.js → PdhVaultBrowser-CtimQQN3.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-CUaPlr6d.js → Permissions-AzmmkLZ0.js} +1 -1
- package/src/assets/web-panel/assets/{PersonalDataHub-Ba92dZk-.js → PersonalDataHub-BRU8ME7z.js} +1 -1
- package/src/assets/web-panel/assets/{Pipeline-Bh2okm-8.js → Pipeline-BnNqutXh.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bmq3p4gC.js → Privacy-gMyZcxsz.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BPu2fdKR.js → ProjectInit-CkK-Fvr0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectSettings-D6ABLpmt.js → ProjectSettings-CGY_uiIX.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-qWHEve0z.js → Projects-DBNC7xXG.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-D9DI-2hc.js → Providers-BVgWawtE.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CxifoeD5.js → QrScannerModal-DZILESCa.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DC1BvwR7.js → QuickAsk-DwRBzFWW.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CKqbMB5o.js → Recommend-B3VxvUih.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BGGzPdS5.js → RemoteSession-DM74lufU.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-DH90O9-5.js → Reputation-DOOEuGHh.js} +1 -1
- package/src/assets/web-panel/assets/{Row-h7ovueJc.js → Row-BZJYAo0S.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DaHxXTZg.js → RssFeed-CYw44jcD.js} +1 -1
- package/src/assets/web-panel/assets/{Search-Bn6Nqpn4.js → Search-CbypjDNG.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ClbBmPJi.js → Security-0rSBDrXh.js} +1 -1
- package/src/assets/web-panel/assets/{Services-ChHLQwRn.js → Services-kqP79CBD.js} +1 -1
- package/src/assets/web-panel/assets/{Skeleton-DfN6BFzt.js → Skeleton-BjxvGVfI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C926wDev.js → Skills-SOoWyPCO.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DJzi1l1M.js → Sla-kdRVAT19.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-_GSyVjm_.js → SpeechSettings-DILtcMaJ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B67xnERe.js → SyncSettings-C98Jauc4.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-BaYZadcG.js → Tasks-Bw-KaQAs.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bu8kN1Xt.js → Templates-CDJ027Hd.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BM9qufw1.js → Tenant-BqNV62UA.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-MEdd5DjB.js → Terminal-B8aQ3GLO.js} +1 -1
- package/src/assets/web-panel/assets/{TimelineRenderer-C27kL2oU.js → TimelineRenderer-BSpccq11.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Cvjd98VC.js → Tokens-BbGMoFO6.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CLym84HI.js → Trigger-D75Mawa_.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Bv2JTaNN.js → Trust-BiK_Pk05.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CSCkNbtm.js → UkeySign-Dv2xX_b9.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BFDXB4xh.js → VideoEditing-CdBWfeEE.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CMEFrG_b.js → Wallet-Cvrp4agg.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-x4eO_Q4y.js → WebAuthn-D0Htlf3v.js} +1 -1
- package/src/assets/web-panel/assets/{WorkflowEditor-ClWEPgV1.js → WorkflowEditor-nuUBOHIF.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BdYOI4gM.js → chat-C6MLShIo.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DcTBrGvS.js → colors-9G5FqFOC.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dn2ktVuj.js → compact-item-0M49EurU.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-XTreuyqp.js → createContext-CiDDLED_.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-CFRNsYQd.js → hasIn-wZvUczmn.js} +1 -1
- package/src/assets/web-panel/assets/{index-ir2ZwWz5.js → index-8jz-X3xg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFl_a0n5.js → index-B0JZ_ccM.js} +1 -1
- package/src/assets/web-panel/assets/{index-kzyCd8a0.js → index-B6TAOS4G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsnYp4qF.js → index-BCfxxScC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbaPXyNc.js → index-BTCIIdoS.js} +1 -1
- package/src/assets/web-panel/assets/{index-ma-rJkfE.js → index-BVV2mBbo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQEu7uW0.js → index-BWTcG128.js} +1 -1
- package/src/assets/web-panel/assets/{index-DW9XncMy.js → index-BXIY2BIN.js} +1 -1
- package/src/assets/web-panel/assets/{index-D45vulkq.js → index-B_XOMujL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNdiAymC.js → index-BfwJm0DU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjHA_Q7s.js → index-BlcOkfzz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Daa1yCt_.js → index-BmS2P_eX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdVpoNEQ.js → index-BzeA3eRQ.js} +1 -1
- package/src/assets/web-panel/assets/index-C101Sec6.js +1 -0
- package/src/assets/web-panel/assets/{index-BBd64wj8.js → index-C63qiwQz.js} +1 -1
- package/src/assets/web-panel/assets/{index-lnTt0Jps.js → index-CTy9gD3m.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRW3AWdS.js → index-CdUmgLxP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Vo7A4aiN.js → index-CdaLWIz-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUT4h5JB.js → index-CoxzvhoN.js} +1 -1
- package/src/assets/web-panel/assets/{index-3RqDry-K.js → index-Cs66y4oC.js} +3 -3
- package/src/assets/web-panel/assets/{index-BMLpP8QQ.js → index-CtbFv3Et.js} +1 -1
- package/src/assets/web-panel/assets/{index-CG9YLDmI.js → index-Cz1SAgnb.js} +1 -1
- package/src/assets/web-panel/assets/index-D23TaGOp.js +1 -0
- package/src/assets/web-panel/assets/{index-Brc0BF-k.js → index-D2wN6VIq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSqydcDa.js → index-D51V5vmz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXMa7Z-S.js → index-D9J_tLGk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BV6LojRv.js → index-DN9t1qjW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNHWMMDX.js → index-DOxTmc3k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEyVNbNE.js → index-DcZxOXd8.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9kPBEqD.js → index-Dclwd_lj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDTSgpXz.js → index-DeHSwWVG.js} +1 -1
- package/src/assets/web-panel/assets/{index-XdlYkgCa.js → index-DvWRS-s7.js} +1 -1
- package/src/assets/web-panel/assets/{index-r5sNECM5.js → index-DwUOiN8M.js} +1 -1
- package/src/assets/web-panel/assets/{index-8METW_Wr.js → index-DwX9cOL6.js} +1 -1
- package/src/assets/web-panel/assets/{index-uT4fRDzU.js → index-JhfNEldK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbMWvjLZ.js → index-dJ_V_Fqy.js} +1 -1
- package/src/assets/web-panel/assets/{index-COuEJdmr.js → index-k0BVfcwQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dhi4Oybt.js → index-qJcOtd8J.js} +1 -1
- package/src/assets/web-panel/assets/{index-oE4jTpHK.js → index-sBsJaBmM.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-mdL0oeZa.js → initDefaultProps-DyIyjurJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-ZgVCKcEX.js → motion-B2D0PuTM.js} +1 -1
- package/src/assets/web-panel/assets/{move-A_28O5T2.js → move-B22T5MnN.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-0zlMjabo.js → mtc-parser-i4b7HNzF.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DF7mU3yG.js → omit-ByNIr_gz.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Cmt8liJP.js → pickAttrs-_xP2RvxA.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DaMDC57b.js → placementArrow-CVDvzK0z.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CHw_f2d3.js → responsiveObserve-CI1toXJ_.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DJS9fFQq.js → slide-2_VosSRQ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bk3XdZwh.js → statusUtils-CMiWWrZC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DMybAFsA.js → styleChecker-DY8wTVCe.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-_tbIIFMu.js → useFlexGapSupport-DkdcgIyl.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-KPklVptS.js → useFs-gpl11PEF.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C7FrKDhD.js → usePersonalDataHub-DqnQ0H9y.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DB3JBusp.js → vnode-CgY9xUvr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C8rAdf81.js → zoom-Ch0jan5_.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/ws-server.js +16 -0
- package/src/lib/coding-change-review-context.js +51 -0
- package/src/lib/coding-task-guidance.js +1 -1
- package/src/lib/evolution/agent-model-projection.js +17 -0
- package/src/lib/evolution/evolution-evidence-projector.js +85 -8
- package/src/lib/read-file-loop-guard.js +13 -10
- package/src/lib/read-file-page.js +4 -1
- package/src/lib/source-read-recovery.js +89 -0
- package/src/lib/tool-result-preview.js +7 -3
- package/src/runtime/agent-core.js +104 -52
- package/src/runtime/tool-argument-recovery.js +111 -0
- package/src/assets/web-panel/assets/index-DoVoNjtJ.js +0 -1
- package/src/assets/web-panel/assets/index-xlS8pDS2.js +0 -1
|
@@ -33,7 +33,7 @@ const PREVIEW_HINT =
|
|
|
33
33
|
"Tool output truncated. Narrow the request: filter/count locally, select fields, search_files, or read_file with offset/limit. Omitted text is not full-output evidence.";
|
|
34
34
|
|
|
35
35
|
/** Check only host-created excerpts; original uncut tool text still reaches ingress. */
|
|
36
|
-
function
|
|
36
|
+
export function canProjectHostToolExcerpt(text, tool) {
|
|
37
37
|
const scan = createEvidenceJsonTextBoundary((message) => new Error(message), {
|
|
38
38
|
...EVIDENCE_JSON_POLICY,
|
|
39
39
|
sourceLiteralPolicy: "explicit-source-containers-v1",
|
|
@@ -239,7 +239,8 @@ export function safeHostToolResultForModel(tool, result) {
|
|
|
239
239
|
let safe = result;
|
|
240
240
|
for (const field of fields) {
|
|
241
241
|
const text = result[field];
|
|
242
|
-
if (typeof text !== "string" ||
|
|
242
|
+
if (typeof text !== "string" || canProjectHostToolExcerpt(text, tool))
|
|
243
|
+
continue;
|
|
243
244
|
if (safe === result) safe = { ...result };
|
|
244
245
|
safe[field] =
|
|
245
246
|
tool === "read_file"
|
|
@@ -268,7 +269,10 @@ export function boundedCommandOutput(output, max, tool = "run_code") {
|
|
|
268
269
|
output,
|
|
269
270
|
Math.max(1, Math.floor(max / 2)),
|
|
270
271
|
);
|
|
271
|
-
if (
|
|
272
|
+
if (
|
|
273
|
+
JSON.stringify(preview).length <= max &&
|
|
274
|
+
canProjectHostToolExcerpt(preview, tool)
|
|
275
|
+
)
|
|
272
276
|
return preview;
|
|
273
277
|
} else if (!/[{}\[\]"']/u.test(output)) {
|
|
274
278
|
let low = 0;
|
|
@@ -64,6 +64,11 @@ import {
|
|
|
64
64
|
import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
|
|
65
65
|
const READ_FILE_REQUEST_CONTEXT = Symbol("read-file-request-context");
|
|
66
66
|
import { gitToolInputError } from "../lib/git-tool-input.js";
|
|
67
|
+
import {
|
|
68
|
+
parseToolArguments,
|
|
69
|
+
projectRejectedToolArguments,
|
|
70
|
+
TOOL_ARGUMENTS_INVALID_CODE,
|
|
71
|
+
} from "./tool-argument-recovery.js";
|
|
67
72
|
import { shellOutputPage, shellOutputPreview } from "../lib/shell-output.js";
|
|
68
73
|
import {
|
|
69
74
|
boundedToolResultText,
|
|
@@ -77,7 +82,12 @@ import {
|
|
|
77
82
|
CODING_TASK_QUALITY_GUIDANCE,
|
|
78
83
|
CODING_CHANGE_REVIEW_PROMPT,
|
|
79
84
|
} from "../lib/coding-task-guidance.js";
|
|
80
|
-
import {
|
|
85
|
+
import {
|
|
86
|
+
CodingChangeReviewContext,
|
|
87
|
+
changeReviewBudgetNotice,
|
|
88
|
+
changeReviewBudgetInsufficientError,
|
|
89
|
+
canReserveChangeReview,
|
|
90
|
+
} from "../lib/coding-change-review-context.js";
|
|
81
91
|
import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
|
|
82
92
|
import {
|
|
83
93
|
isPrActionRequest,
|
|
@@ -12257,6 +12267,7 @@ function _openAIProviderRequestReceipt(response, data, clientRequestId) {
|
|
|
12257
12267
|
* @returns {Promise<object>} response with .message
|
|
12258
12268
|
*/
|
|
12259
12269
|
export async function chatWithTools(rawMessages, options) {
|
|
12270
|
+
rawMessages = projectRejectedToolArguments(rawMessages);
|
|
12260
12271
|
if (options.serviceTier != null) {
|
|
12261
12272
|
resolveModelServiceTier(
|
|
12262
12273
|
resolveModelCapabilityProfile(options),
|
|
@@ -15608,6 +15619,37 @@ export async function* agentLoop(messages, options) {
|
|
|
15608
15619
|
toolContext.readFileLoopGuard = readFileLoopGuard;
|
|
15609
15620
|
let lastTaskProgressIntervention = null;
|
|
15610
15621
|
|
|
15622
|
+
// Both an author completion and the reserved review window enter the same
|
|
15623
|
+
// phase. Neither path manufactures an author response or adds request budget.
|
|
15624
|
+
const beginChangeReview = (draft = null) => {
|
|
15625
|
+
throwIfAborted(signal);
|
|
15626
|
+
if (budget.remaining() < 2)
|
|
15627
|
+
throw changeReviewBudgetInsufficientError(budget.remaining());
|
|
15628
|
+
if (independentReviewSetupError) throw independentReviewSetupError;
|
|
15629
|
+
changeReviewState.requested = true;
|
|
15630
|
+
const reviewPrompt = markRuntimeOnlySessionMessage({
|
|
15631
|
+
role: "user",
|
|
15632
|
+
content: CODING_CHANGE_REVIEW_PROMPT,
|
|
15633
|
+
});
|
|
15634
|
+
if (draft)
|
|
15635
|
+
appendMessages(
|
|
15636
|
+
markRuntimeOnlySessionMessage({
|
|
15637
|
+
role: "assistant",
|
|
15638
|
+
content: draft.content || "",
|
|
15639
|
+
}),
|
|
15640
|
+
);
|
|
15641
|
+
appendMessages(reviewPrompt);
|
|
15642
|
+
if (independentReviewContext) {
|
|
15643
|
+
independentReviewContext.activate(reviewPrompt);
|
|
15644
|
+
changeReviewState.independentReviewPending = true;
|
|
15645
|
+
readFileLoopGuard = new ReadFileLoopGuard();
|
|
15646
|
+
remoteReadLoopGuard = new RemoteReadLoopGuard();
|
|
15647
|
+
taskProgressTracker = new TaskProgressTracker();
|
|
15648
|
+
toolContext.readFileLoopGuard = readFileLoopGuard;
|
|
15649
|
+
lastTaskProgressIntervention = null;
|
|
15650
|
+
}
|
|
15651
|
+
};
|
|
15652
|
+
|
|
15611
15653
|
while (budget.hasRemaining()) {
|
|
15612
15654
|
if (loopMcpCatalog) {
|
|
15613
15655
|
currentMcpSnapshot = readMcpToolCatalog(loopMcpCatalog);
|
|
@@ -15654,6 +15696,24 @@ export async function* agentLoop(messages, options) {
|
|
|
15654
15696
|
return;
|
|
15655
15697
|
}
|
|
15656
15698
|
readFileLoopGuard.finishBatch();
|
|
15699
|
+
if (
|
|
15700
|
+
canReserveChangeReview({
|
|
15701
|
+
enabled: options.reviewChanges,
|
|
15702
|
+
changed: hasFileContentChanges,
|
|
15703
|
+
requested: changeReviewState.requested,
|
|
15704
|
+
usageKnown: changeReviewState.usageKnown,
|
|
15705
|
+
pendingMutations: pendingSubtreeMutations.size,
|
|
15706
|
+
pendingChildren: backgroundSubAgents.size,
|
|
15707
|
+
remaining: budget.remaining(),
|
|
15708
|
+
limit: budget.limit,
|
|
15709
|
+
})
|
|
15710
|
+
) {
|
|
15711
|
+
beginChangeReview();
|
|
15712
|
+
yield {
|
|
15713
|
+
type: "iteration-warning",
|
|
15714
|
+
message: "Reviewing changed files against the task before finishing.",
|
|
15715
|
+
};
|
|
15716
|
+
}
|
|
15657
15717
|
if (remoteReadLoopGuard.stalled && !remoteReadLoopGuard.synthesisRequired) {
|
|
15658
15718
|
await _awaitBackgroundUsageSettlement(
|
|
15659
15719
|
backgroundSubAgents,
|
|
@@ -16585,7 +16645,10 @@ export async function* agentLoop(messages, options) {
|
|
|
16585
16645
|
`Execution budget: this request plus ${furtherRequests} further model requests. ` +
|
|
16586
16646
|
"For requested changes, reserve requests for implementation, focused validation, and repair or an accurate unfinished-work report. " +
|
|
16587
16647
|
"Reading or an existing passing baseline does not deliver requested changes. " +
|
|
16588
|
-
"For research or monitoring, use the remaining requests for evidence and the requested answer; do not create files just to show activity."
|
|
16648
|
+
"For research or monitoring, use the remaining requests for evidence and the requested answer; do not create files just to show activity." +
|
|
16649
|
+
(options.reviewChanges === true
|
|
16650
|
+
? changeReviewBudgetNotice(budget, changeReviewState.requested)
|
|
16651
|
+
: ""),
|
|
16589
16652
|
},
|
|
16590
16653
|
];
|
|
16591
16654
|
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
@@ -16988,7 +17051,7 @@ export async function* agentLoop(messages, options) {
|
|
|
16988
17051
|
}
|
|
16989
17052
|
throwIfAborted(signal);
|
|
16990
17053
|
if (
|
|
16991
|
-
|
|
17054
|
+
options.reviewChanges === true &&
|
|
16992
17055
|
changeReviewState.usageKnown === false
|
|
16993
17056
|
) {
|
|
16994
17057
|
const error = new Error(
|
|
@@ -17247,42 +17310,14 @@ export async function* agentLoop(messages, options) {
|
|
|
17247
17310
|
};
|
|
17248
17311
|
return;
|
|
17249
17312
|
}
|
|
17250
|
-
//
|
|
17251
|
-
// Never emit a provisional completion or turn this self-check into an
|
|
17252
|
-
// acceptance verdict. Failed/deferred writes do not arm the review.
|
|
17313
|
+
// Author completion is provisional until the independent review phase.
|
|
17253
17314
|
if (
|
|
17254
17315
|
options.reviewChanges === true &&
|
|
17255
17316
|
hasFileContentChanges &&
|
|
17256
17317
|
!changeReviewState.requested &&
|
|
17257
|
-
changeReviewState.usageKnown !== false
|
|
17258
|
-
budget.hasRemaining()
|
|
17318
|
+
changeReviewState.usageKnown !== false
|
|
17259
17319
|
) {
|
|
17260
|
-
|
|
17261
|
-
if (independentReviewSetupError) throw independentReviewSetupError;
|
|
17262
|
-
changeReviewState.requested = true;
|
|
17263
|
-
const reviewPrompt = markRuntimeOnlySessionMessage({
|
|
17264
|
-
role: "user",
|
|
17265
|
-
content: CODING_CHANGE_REVIEW_PROMPT,
|
|
17266
|
-
});
|
|
17267
|
-
appendMessages(
|
|
17268
|
-
markRuntimeOnlySessionMessage({
|
|
17269
|
-
role: "assistant",
|
|
17270
|
-
content: msg.content || "",
|
|
17271
|
-
}),
|
|
17272
|
-
reviewPrompt,
|
|
17273
|
-
);
|
|
17274
|
-
if (independentReviewContext) {
|
|
17275
|
-
independentReviewContext.activate(reviewPrompt);
|
|
17276
|
-
changeReviewState.independentReviewPending = true;
|
|
17277
|
-
// These are phase-local discovery hints, not permission or spend
|
|
17278
|
-
// authorities. Fresh inspection must not inherit author assertions,
|
|
17279
|
-
// old visible file pages, or a pause caused by author exploration.
|
|
17280
|
-
readFileLoopGuard = new ReadFileLoopGuard();
|
|
17281
|
-
remoteReadLoopGuard = new RemoteReadLoopGuard();
|
|
17282
|
-
taskProgressTracker = new TaskProgressTracker();
|
|
17283
|
-
toolContext.readFileLoopGuard = readFileLoopGuard;
|
|
17284
|
-
lastTaskProgressIntervention = null;
|
|
17285
|
-
}
|
|
17320
|
+
beginChangeReview(msg);
|
|
17286
17321
|
yield {
|
|
17287
17322
|
type: "iteration-warning",
|
|
17288
17323
|
message: "Reviewing changed files against the task before finishing.",
|
|
@@ -17448,6 +17483,7 @@ export async function* agentLoop(messages, options) {
|
|
|
17448
17483
|
toolCalls.every(
|
|
17449
17484
|
(c) =>
|
|
17450
17485
|
typeof c?.function?.name === "string" &&
|
|
17486
|
+
parseToolArguments(c.function.arguments) !== null &&
|
|
17451
17487
|
!pausedTools.has(c.function.name) &&
|
|
17452
17488
|
_CHECKPOINT_READ_ONLY.has(c.function.name),
|
|
17453
17489
|
);
|
|
@@ -17456,15 +17492,7 @@ export async function* agentLoop(messages, options) {
|
|
|
17456
17492
|
const turnId = `${runId}:t${budget.consumed}`;
|
|
17457
17493
|
const toolBatchRecords = [];
|
|
17458
17494
|
const prepared = toolCalls.map((call) => {
|
|
17459
|
-
|
|
17460
|
-
try {
|
|
17461
|
-
toolArgs =
|
|
17462
|
-
typeof call.function.arguments === "string"
|
|
17463
|
-
? JSON.parse(call.function.arguments)
|
|
17464
|
-
: call.function.arguments;
|
|
17465
|
-
} catch {
|
|
17466
|
-
toolArgs = {};
|
|
17467
|
-
}
|
|
17495
|
+
const toolArgs = parseToolArguments(call.function.arguments);
|
|
17468
17496
|
const workflowBinding = _workflowToolEffectBinding(
|
|
17469
17497
|
workflowEffectId,
|
|
17470
17498
|
workflowEffectId ? (workflowChildEffectSequence += 1) : 0,
|
|
@@ -17669,15 +17697,39 @@ export async function* agentLoop(messages, options) {
|
|
|
17669
17697
|
});
|
|
17670
17698
|
continue;
|
|
17671
17699
|
}
|
|
17672
|
-
|
|
17673
|
-
|
|
17674
|
-
|
|
17675
|
-
|
|
17676
|
-
|
|
17677
|
-
|
|
17678
|
-
|
|
17679
|
-
|
|
17680
|
-
|
|
17700
|
+
const toolArgs = parseToolArguments(fn.arguments);
|
|
17701
|
+
if (toolArgs === null) {
|
|
17702
|
+
const result = {
|
|
17703
|
+
code: TOOL_ARGUMENTS_INVALID_CODE,
|
|
17704
|
+
execution_started: false,
|
|
17705
|
+
error:
|
|
17706
|
+
"Tool arguments must be a valid JSON object. No tool was executed. " +
|
|
17707
|
+
"Issue a new call with valid arguments if still appropriate.",
|
|
17708
|
+
};
|
|
17709
|
+
yield {
|
|
17710
|
+
type: "tool-pre-execution-denied",
|
|
17711
|
+
tool: toolName,
|
|
17712
|
+
tool_use_id: call.id,
|
|
17713
|
+
turn_id: turnId,
|
|
17714
|
+
preExecutionDenied: true,
|
|
17715
|
+
execution_started: false,
|
|
17716
|
+
};
|
|
17717
|
+
yield {
|
|
17718
|
+
type: "tool-result",
|
|
17719
|
+
tool: toolName,
|
|
17720
|
+
result,
|
|
17721
|
+
error: result.error,
|
|
17722
|
+
tool_use_id: call.id,
|
|
17723
|
+
turn_id: turnId,
|
|
17724
|
+
preExecutionDenied: true,
|
|
17725
|
+
execution_started: false,
|
|
17726
|
+
};
|
|
17727
|
+
appendMessages({
|
|
17728
|
+
role: "tool",
|
|
17729
|
+
content: JSON.stringify(result),
|
|
17730
|
+
tool_call_id: call.id,
|
|
17731
|
+
});
|
|
17732
|
+
continue;
|
|
17681
17733
|
}
|
|
17682
17734
|
|
|
17683
17735
|
// Capability and exact-path authority must settle before any checkpoint,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export const TOOL_ARGUMENTS_INVALID_CODE = "CC_TOOL_ARGUMENTS_INVALID";
|
|
2
|
+
|
|
3
|
+
// Never infer executable arguments from a partial provider response. In
|
|
4
|
+
// particular, a parse failure must not become an executable empty object.
|
|
5
|
+
export function parseToolArguments(value) {
|
|
6
|
+
try {
|
|
7
|
+
const args = typeof value === "string" ? JSON.parse(value) : value;
|
|
8
|
+
if (!args || typeof args !== "object" || Array.isArray(args)) return null;
|
|
9
|
+
const prototype = Object.getPrototypeOf(args);
|
|
10
|
+
return prototype === Object.prototype || prototype === null ? args : null;
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function isUnexecutedArgumentRejection(result) {
|
|
17
|
+
return (
|
|
18
|
+
(result?.code === TOOL_ARGUMENTS_INVALID_CODE &&
|
|
19
|
+
result.execution_started === false) ||
|
|
20
|
+
(result?.policy?.code === "CC_RUN_CODE_EXECUTION_SNAPSHOT_INVALID" &&
|
|
21
|
+
result.policy.via === "run-code-execution-snapshot" &&
|
|
22
|
+
result.policy.decision === "blocked")
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Old sessions can contain a malformed provider call paired with a dispatch
|
|
27
|
+
// rejection. Keep the durable transcript intact; derive a model-only copy so
|
|
28
|
+
// that strict JSON projection and strict providers can admit the next turn.
|
|
29
|
+
// This grants no execution authority and never repairs or forwards the bad text.
|
|
30
|
+
export function projectRejectedToolArguments(messages) {
|
|
31
|
+
const callCounts = new Map();
|
|
32
|
+
const resultCounts = new Map();
|
|
33
|
+
for (const message of messages) {
|
|
34
|
+
if (message.role === "assistant" && Array.isArray(message.tool_calls)) {
|
|
35
|
+
for (const call of message.tool_calls) {
|
|
36
|
+
callCounts.set(call?.id, (callCounts.get(call?.id) || 0) + 1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (message.role === "tool") {
|
|
40
|
+
const id = message.tool_call_id;
|
|
41
|
+
resultCounts.set(id, (resultCounts.get(id) || 0) + 1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let output = messages;
|
|
45
|
+
for (let index = 0; index < messages.length; index++) {
|
|
46
|
+
const message = messages[index];
|
|
47
|
+
if (message.role !== "assistant" || !Array.isArray(message.tool_calls))
|
|
48
|
+
continue;
|
|
49
|
+
for (
|
|
50
|
+
let callIndex = 0;
|
|
51
|
+
callIndex < message.tool_calls.length;
|
|
52
|
+
callIndex++
|
|
53
|
+
) {
|
|
54
|
+
const call = message.tool_calls[callIndex];
|
|
55
|
+
if (
|
|
56
|
+
typeof call?.id !== "string" ||
|
|
57
|
+
!call.id ||
|
|
58
|
+
callCounts.get(call.id) !== 1 ||
|
|
59
|
+
resultCounts.get(call.id) !== 1 ||
|
|
60
|
+
!call.function ||
|
|
61
|
+
(call.function.arguments !== null &&
|
|
62
|
+
typeof call.function.arguments === "object" &&
|
|
63
|
+
!Array.isArray(call.function.arguments)) ||
|
|
64
|
+
["function", "symbol", "bigint"].includes(
|
|
65
|
+
typeof call.function.arguments,
|
|
66
|
+
) ||
|
|
67
|
+
parseToolArguments(call.function.arguments) !== null
|
|
68
|
+
)
|
|
69
|
+
continue;
|
|
70
|
+
let resultIndex = index + 1;
|
|
71
|
+
while (
|
|
72
|
+
resultIndex < messages.length &&
|
|
73
|
+
messages[resultIndex].role === "tool" &&
|
|
74
|
+
messages[resultIndex].tool_call_id !== call.id
|
|
75
|
+
)
|
|
76
|
+
resultIndex++;
|
|
77
|
+
const result = messages[resultIndex];
|
|
78
|
+
if (result?.role !== "tool" || result.tool_call_id !== call.id) continue;
|
|
79
|
+
let content;
|
|
80
|
+
try {
|
|
81
|
+
content = JSON.parse(result.content);
|
|
82
|
+
} catch {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (!isUnexecutedArgumentRejection(content)) continue;
|
|
86
|
+
// The legacy dispatch code belongs only to run_code.
|
|
87
|
+
if (
|
|
88
|
+
content.code !== TOOL_ARGUMENTS_INVALID_CODE &&
|
|
89
|
+
call.function.name !== "run_code"
|
|
90
|
+
)
|
|
91
|
+
continue;
|
|
92
|
+
if (output === messages) output = [...messages];
|
|
93
|
+
const calls = [...output[index].tool_calls];
|
|
94
|
+
calls[callIndex] = {
|
|
95
|
+
...call,
|
|
96
|
+
function: { ...call.function, arguments: "{}" },
|
|
97
|
+
};
|
|
98
|
+
output[index] = { ...output[index], tool_calls: calls };
|
|
99
|
+
output[resultIndex] = {
|
|
100
|
+
...result,
|
|
101
|
+
content: JSON.stringify({
|
|
102
|
+
...content,
|
|
103
|
+
argumentRecovery:
|
|
104
|
+
"Malformed original arguments were omitted from this model request. " +
|
|
105
|
+
"The call was rejected before execution. Issue a new call with a valid JSON object if still appropriate.",
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return output;
|
|
111
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-h7ovueJc.js";import{$ as t}from"./index-3RqDry-K.js";import"./responsiveObserve-CHw_f2d3.js";import"./vendor-BXcBOG8b.js";import"./useFlexGapSupport-_tbIIFMu.js";import"./styleChecker-DMybAFsA.js";import"./index-CjHA_Q7s.js";import"./icons-DlxlFL4g.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-IO1NEUYL.js";import{$ as t}from"./index-3RqDry-K.js";import"./index-CjHA_Q7s.js";import"./vendor-BXcBOG8b.js";import"./icons-DlxlFL4g.js";const s=t(o);export{s as default};
|