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.
Files changed (166) hide show
  1. package/README.md +37 -11
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CHItp4vg.js → AIOps-BefmcZw2.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-nhMNWW_d.js → ActionButton-BBlS9rmj.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DRc81BBI.js → Analytics-DfNjXT9e.js} +1 -1
  8. package/src/assets/web-panel/assets/{AppLayout-CVt7HMkp.js → AppLayout-CIBZPPMS.js} +2 -2
  9. package/src/assets/web-panel/assets/{Artifacts-BuJgG5jf.js → Artifacts-CE66rTTZ.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-msNg0aH-.js → Audit-DOC8Lt8U.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BpcV8yWC.js → BackgroundAgents-9TMG041Q.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-P53DADwG.js → Backup-us3KWb9F.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-DFxT2yWN.js → BaseInput-D6Q95Wr5.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-BXoHisHW.js → Chat-BPrM5ARp.js} +1 -1
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DMGtSdDx.js → ChatBubbleRenderer-Drs9vSc4.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-B4g_ckJq.js → Checkbox-DqZGMV0o.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-C6SSSOfp.js → Codegen-CmolL6wr.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-IO1NEUYL.js → Col-BwHSmoYQ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CdEBl93F.js → Community-DGWqobpd.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-DYs0a9k7.js → Compact-t_yy09-r.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-BPnk7948.js → Compliance-D0S8-EsN.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-VLOTGbza.js → Cowork-Y1LiuRwP.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cron-_9GgQLJo.js → Cron-FTqEw7QV.js} +1 -1
  24. package/src/assets/web-panel/assets/{Crosschain-B21yn0qy.js → Crosschain-C3rPZ4Qu.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-mBeDgRZ7.js → DID-Ba2zySM-.js} +1 -1
  26. package/src/assets/web-panel/assets/{Dashboard-BckYYzhP.js → Dashboard-D6xyN2ND.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DEedqFiE.js → Dropdown-BF4QuXJw.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CMs0k9TB.js → EmailListRenderer-s9dUxq14.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-B00Qd0fN.js → EvolutionSettings-CoAKOfqZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DxMTAMa8.js → FamilyGuardDashboard-CEznwH1c.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-B-UZw0LO.js → Federation-rIzOt8-a.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CkafazEw.js → FormItemContext-BARFiExr.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DEUG25ZJ.js → GenericCardRenderer-DI0A4swS.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-D7dr9oz9.js → Git-DdmysND4.js} +1 -1
  35. package/src/assets/web-panel/assets/{Governance-DKlUJ1wg.js → Governance-DrdhwUz2.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-BJKqplap.js → Inference-Scm8tumd.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-B78fB-bz.js → KnowledgeGraph-_6bgPs4W.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-DJGcHYH_.js → Logs-DW_v7bSo.js} +1 -1
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-DkcG_MxW.js → MarkdownRenderer-7JABuv1j.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-ucTbwByD.js → Marketplace-0h3YSvME.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-Cu1xZYYk.js → McpTools-Byrg0Y3e.js} +1 -1
  42. package/src/assets/web-panel/assets/{Memory-DCGpXmi-.js → Memory-Cyoq-o29.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileBridge-BnKr0aAS.js → MobileBridge-ISIlploU.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-C5UvYJTP.js → MobileProjects-04EncaRx.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-D1UUl4WH.js → Mtc-BMzkpyOF.js} +1 -1
  46. package/src/assets/web-panel/assets/{MtcAudit-D3aa8XP4.js → MtcAudit-Cx7BR5sz.js} +1 -1
  47. package/src/assets/web-panel/assets/{Multisig-DiXdfJjO.js → Multisig-D4pmkSX4.js} +1 -1
  48. package/src/assets/web-panel/assets/{NLProgramming-DbWABgSE.js → NLProgramming-CCfaaWNu.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BP1DPl-R.js → Notes-Mq-1ZyaH.js} +1 -1
  50. package/src/assets/web-panel/assets/{NotificationSettings-xaB6ONe7.js → NotificationSettings-rzf5V1TR.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-D1uNcz3b.js → OrderTableRenderer-OREUs5ue.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DMLDGaf1.js → Organization-BQfOATgw.js} +1 -1
  53. package/src/assets/web-panel/assets/{Overflow-DH4QPEoI.js → Overflow-D7Pa6aaA.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-Bl4OS10o.js → P2P-CaJ79ZsC.js} +1 -1
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-D9XSE2YI.js → PdhVaultBrowser-CtimQQN3.js} +2 -2
  56. package/src/assets/web-panel/assets/{Permissions-CUaPlr6d.js → Permissions-AzmmkLZ0.js} +1 -1
  57. package/src/assets/web-panel/assets/{PersonalDataHub-Ba92dZk-.js → PersonalDataHub-BRU8ME7z.js} +1 -1
  58. package/src/assets/web-panel/assets/{Pipeline-Bh2okm-8.js → Pipeline-BnNqutXh.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Bmq3p4gC.js → Privacy-gMyZcxsz.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-BPu2fdKR.js → ProjectInit-CkK-Fvr0.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectSettings-D6ABLpmt.js → ProjectSettings-CGY_uiIX.js} +1 -1
  62. package/src/assets/web-panel/assets/{Projects-qWHEve0z.js → Projects-DBNC7xXG.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-D9DI-2hc.js → Providers-BVgWawtE.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CxifoeD5.js → QrScannerModal-DZILESCa.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-DC1BvwR7.js → QuickAsk-DwRBzFWW.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-CKqbMB5o.js → Recommend-B3VxvUih.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BGGzPdS5.js → RemoteSession-DM74lufU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Reputation-DH90O9-5.js → Reputation-DOOEuGHh.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-h7ovueJc.js → Row-BZJYAo0S.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DaHxXTZg.js → RssFeed-CYw44jcD.js} +1 -1
  71. package/src/assets/web-panel/assets/{Search-Bn6Nqpn4.js → Search-CbypjDNG.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-ClbBmPJi.js → Security-0rSBDrXh.js} +1 -1
  73. package/src/assets/web-panel/assets/{Services-ChHLQwRn.js → Services-kqP79CBD.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skeleton-DfN6BFzt.js → Skeleton-BjxvGVfI.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-C926wDev.js → Skills-SOoWyPCO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-DJzi1l1M.js → Sla-kdRVAT19.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-_GSyVjm_.js → SpeechSettings-DILtcMaJ.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-B67xnERe.js → SyncSettings-C98Jauc4.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tasks-BaYZadcG.js → Tasks-Bw-KaQAs.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-Bu8kN1Xt.js → Templates-CDJ027Hd.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-BM9qufw1.js → Tenant-BqNV62UA.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-MEdd5DjB.js → Terminal-B8aQ3GLO.js} +1 -1
  83. package/src/assets/web-panel/assets/{TimelineRenderer-C27kL2oU.js → TimelineRenderer-BSpccq11.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Cvjd98VC.js → Tokens-BbGMoFO6.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-CLym84HI.js → Trigger-D75Mawa_.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Bv2JTaNN.js → Trust-BiK_Pk05.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CSCkNbtm.js → UkeySign-Dv2xX_b9.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BFDXB4xh.js → VideoEditing-CdBWfeEE.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-CMEFrG_b.js → Wallet-Cvrp4agg.js} +1 -1
  90. package/src/assets/web-panel/assets/{WebAuthn-x4eO_Q4y.js → WebAuthn-D0Htlf3v.js} +1 -1
  91. package/src/assets/web-panel/assets/{WorkflowEditor-ClWEPgV1.js → WorkflowEditor-nuUBOHIF.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BdYOI4gM.js → chat-C6MLShIo.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DcTBrGvS.js → colors-9G5FqFOC.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-Dn2ktVuj.js → compact-item-0M49EurU.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-XTreuyqp.js → createContext-CiDDLED_.js} +1 -1
  96. package/src/assets/web-panel/assets/{hasIn-CFRNsYQd.js → hasIn-wZvUczmn.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-ir2ZwWz5.js → index-8jz-X3xg.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DFl_a0n5.js → index-B0JZ_ccM.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-kzyCd8a0.js → index-B6TAOS4G.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CsnYp4qF.js → index-BCfxxScC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CbaPXyNc.js → index-BTCIIdoS.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-ma-rJkfE.js → index-BVV2mBbo.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DQEu7uW0.js → index-BWTcG128.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DW9XncMy.js → index-BXIY2BIN.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D45vulkq.js → index-B_XOMujL.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DNdiAymC.js → index-BfwJm0DU.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CjHA_Q7s.js → index-BlcOkfzz.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Daa1yCt_.js → index-BmS2P_eX.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DdVpoNEQ.js → index-BzeA3eRQ.js} +1 -1
  110. package/src/assets/web-panel/assets/index-C101Sec6.js +1 -0
  111. package/src/assets/web-panel/assets/{index-BBd64wj8.js → index-C63qiwQz.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-lnTt0Jps.js → index-CTy9gD3m.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CRW3AWdS.js → index-CdUmgLxP.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Vo7A4aiN.js → index-CdaLWIz-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CUT4h5JB.js → index-CoxzvhoN.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-3RqDry-K.js → index-Cs66y4oC.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-BMLpP8QQ.js → index-CtbFv3Et.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CG9YLDmI.js → index-Cz1SAgnb.js} +1 -1
  119. package/src/assets/web-panel/assets/index-D23TaGOp.js +1 -0
  120. package/src/assets/web-panel/assets/{index-Brc0BF-k.js → index-D2wN6VIq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BSqydcDa.js → index-D51V5vmz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CXMa7Z-S.js → index-D9J_tLGk.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BV6LojRv.js → index-DN9t1qjW.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CNHWMMDX.js → index-DOxTmc3k.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BEyVNbNE.js → index-DcZxOXd8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D9kPBEqD.js → index-Dclwd_lj.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DDTSgpXz.js → index-DeHSwWVG.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-XdlYkgCa.js → index-DvWRS-s7.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-r5sNECM5.js → index-DwUOiN8M.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-8METW_Wr.js → index-DwX9cOL6.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-uT4fRDzU.js → index-JhfNEldK.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BbMWvjLZ.js → index-dJ_V_Fqy.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-COuEJdmr.js → index-k0BVfcwQ.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Dhi4Oybt.js → index-qJcOtd8J.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-oE4jTpHK.js → index-sBsJaBmM.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-mdL0oeZa.js → initDefaultProps-DyIyjurJ.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-ZgVCKcEX.js → motion-B2D0PuTM.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-A_28O5T2.js → move-B22T5MnN.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-0zlMjabo.js → mtc-parser-i4b7HNzF.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-DF7mU3yG.js → omit-ByNIr_gz.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-Cmt8liJP.js → pickAttrs-_xP2RvxA.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-DaMDC57b.js → placementArrow-CVDvzK0z.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-CHw_f2d3.js → responsiveObserve-CI1toXJ_.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-DJS9fFQq.js → slide-2_VosSRQ.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-Bk3XdZwh.js → statusUtils-CMiWWrZC.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-DMybAFsA.js → styleChecker-DY8wTVCe.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-_tbIIFMu.js → useFlexGapSupport-DkdcgIyl.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-KPklVptS.js → useFs-gpl11PEF.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-C7FrKDhD.js → usePersonalDataHub-DqnQ0H9y.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-DB3JBusp.js → vnode-CgY9xUvr.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-C8rAdf81.js → zoom-Ch0jan5_.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/data/changelog.json +26 -0
  154. package/src/gateways/ws/ws-server.js +16 -0
  155. package/src/lib/coding-change-review-context.js +51 -0
  156. package/src/lib/coding-task-guidance.js +1 -1
  157. package/src/lib/evolution/agent-model-projection.js +17 -0
  158. package/src/lib/evolution/evolution-evidence-projector.js +85 -8
  159. package/src/lib/read-file-loop-guard.js +13 -10
  160. package/src/lib/read-file-page.js +4 -1
  161. package/src/lib/source-read-recovery.js +89 -0
  162. package/src/lib/tool-result-preview.js +7 -3
  163. package/src/runtime/agent-core.js +104 -52
  164. package/src/runtime/tool-argument-recovery.js +111 -0
  165. package/src/assets/web-panel/assets/index-DoVoNjtJ.js +0 -1
  166. 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 completeExcerpt(text, tool) {
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" || completeExcerpt(text, tool)) continue;
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 (JSON.stringify(preview).length <= max && completeExcerpt(preview, tool))
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 { CodingChangeReviewContext } from "../lib/coding-change-review-context.js";
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
- independentReviewContext?.active &&
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
- // Opt-in review uses the same loop, tools, usage settlement and budget.
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
- throwIfAborted(signal);
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
- let toolArgs;
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
- let toolArgs;
17673
-
17674
- try {
17675
- toolArgs =
17676
- typeof fn.arguments === "string"
17677
- ? JSON.parse(fn.arguments)
17678
- : fn.arguments;
17679
- } catch {
17680
- toolArgs = {};
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};