chainlesschain 0.166.139 → 0.166.141

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 (162) hide show
  1. package/README.md +36 -8
  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 +27 -1
  154. package/src/lib/evolution/agent-model-projection.js +17 -0
  155. package/src/lib/evolution/evolution-artifact-ports.js +64 -1
  156. package/src/lib/evolution/evolution-evidence-projector.js +85 -8
  157. package/src/lib/read-file-loop-guard.js +46 -11
  158. package/src/lib/tool-result-preview.js +1 -0
  159. package/src/runtime/agent-core.js +99 -18
  160. package/src/runtime/tool-argument-recovery.js +111 -0
  161. package/src/assets/web-panel/assets/index-DoVoNjtJ.js +0 -1
  162. package/src/assets/web-panel/assets/index-xlS8pDS2.js +0 -1
@@ -7,6 +7,12 @@ import {
7
7
  requireUnscopedToolExecution,
8
8
  } from "../lib/formal-budget-provider-scope.js";
9
9
  import { isFormalBudgetError } from "../lib/formal-budget-errors.js";
10
+ import {
11
+ FORMAL_QUALITY_ALLOWED_FILES_ENV,
12
+ FORMAL_QUALITY_FILE_TOOLS,
13
+ formalQualityAllowedFiles,
14
+ isFormalQualityHermeticRuntime,
15
+ } from "../lib/formal-quality-eval-runtime.js";
10
16
  import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
11
17
  import { ollamaProviderFetch } from "../lib/ollama-provider-fetch.js";
12
18
  import {
@@ -64,6 +70,11 @@ import {
64
70
  import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
65
71
  const READ_FILE_REQUEST_CONTEXT = Symbol("read-file-request-context");
66
72
  import { gitToolInputError } from "../lib/git-tool-input.js";
73
+ import {
74
+ parseToolArguments,
75
+ projectRejectedToolArguments,
76
+ TOOL_ARGUMENTS_INVALID_CODE,
77
+ } from "./tool-argument-recovery.js";
67
78
  import { shellOutputPage, shellOutputPreview } from "../lib/shell-output.js";
68
79
  import {
69
80
  boundedToolResultText,
@@ -12262,6 +12273,7 @@ function _openAIProviderRequestReceipt(response, data, clientRequestId) {
12262
12273
  * @returns {Promise<object>} response with .message
12263
12274
  */
12264
12275
  export async function chatWithTools(rawMessages, options) {
12276
+ rawMessages = projectRejectedToolArguments(rawMessages);
12265
12277
  if (options.serviceTier != null) {
12266
12278
  resolveModelServiceTier(
12267
12279
  resolveModelCapabilityProfile(options),
@@ -14981,7 +14993,59 @@ function permissionDecision(callId, tool, result) {
14981
14993
  });
14982
14994
  }
14983
14995
 
14996
+ function bindFormalQualityLoopOptions(options) {
14997
+ // The launcher owns this binding. Apply it at the shared loop so direct
14998
+ // gateway/IDE callers receive the same schema and execution guard as CLI.
14999
+ // Legacy hermetic callers without a file binding retain their own boundary.
15000
+ if (
15001
+ !isFormalQualityHermeticRuntime(process.env) ||
15002
+ !Object.hasOwn(process.env, FORMAL_QUALITY_ALLOWED_FILES_ENV)
15003
+ ) {
15004
+ return options;
15005
+ }
15006
+ const allowedPaths = formalQualityAllowedFiles(process.env);
15007
+ const cwd = options.cwd || process.cwd();
15008
+ const launcherScope = normalizeExactFileMutationScope(
15009
+ { exact: true, worktreeRoot: canonicalRealpath(cwd), allowedPaths },
15010
+ { cwd },
15011
+ );
15012
+ const callerScope = normalizeExactFileMutationScope(
15013
+ options.fileMutationScope,
15014
+ {
15015
+ cwd,
15016
+ },
15017
+ );
15018
+ if (
15019
+ callerScope &&
15020
+ callerScope.allowedPaths.some((file) => !allowedPaths.includes(file))
15021
+ ) {
15022
+ throw new Error("mutation scope widens the formal quality file binding");
15023
+ }
15024
+ if (
15025
+ options.enabledToolNames != null &&
15026
+ !Array.isArray(options.enabledToolNames)
15027
+ ) {
15028
+ throw new Error("formal quality enabled tool names must be an array");
15029
+ }
15030
+ return {
15031
+ ...options,
15032
+ fileMutationScope: callerScope || launcherScope,
15033
+ hermeticExecution: true,
15034
+ exactToolNames: true,
15035
+ // Hermetic execution ignores host executors. Match that on the provider
15036
+ // side too: a same-named host executor must not suppress the path enum
15037
+ // for the built-in mutation tool that will actually execute.
15038
+ externalToolExecutors: null,
15039
+ enabledToolNames: Object.freeze(
15040
+ (options.enabledToolNames ?? FORMAL_QUALITY_FILE_TOOLS).filter((name) =>
15041
+ FORMAL_QUALITY_FILE_TOOLS.includes(name),
15042
+ ),
15043
+ ),
15044
+ };
15045
+ }
15046
+
14984
15047
  export async function* agentLoop(messages, options) {
15048
+ options = bindFormalQualityLoopOptions(options);
14985
15049
  // Bind the actual task before compaction, runtime nudges or provider projection.
14986
15050
  // A new host-admitted user turn starts a new loop and receives its own binding.
14987
15051
  const currentUserTask = messages.findLast(
@@ -17477,6 +17541,7 @@ export async function* agentLoop(messages, options) {
17477
17541
  toolCalls.every(
17478
17542
  (c) =>
17479
17543
  typeof c?.function?.name === "string" &&
17544
+ parseToolArguments(c.function.arguments) !== null &&
17480
17545
  !pausedTools.has(c.function.name) &&
17481
17546
  _CHECKPOINT_READ_ONLY.has(c.function.name),
17482
17547
  );
@@ -17485,15 +17550,7 @@ export async function* agentLoop(messages, options) {
17485
17550
  const turnId = `${runId}:t${budget.consumed}`;
17486
17551
  const toolBatchRecords = [];
17487
17552
  const prepared = toolCalls.map((call) => {
17488
- let toolArgs;
17489
- try {
17490
- toolArgs =
17491
- typeof call.function.arguments === "string"
17492
- ? JSON.parse(call.function.arguments)
17493
- : call.function.arguments;
17494
- } catch {
17495
- toolArgs = {};
17496
- }
17553
+ const toolArgs = parseToolArguments(call.function.arguments);
17497
17554
  const workflowBinding = _workflowToolEffectBinding(
17498
17555
  workflowEffectId,
17499
17556
  workflowEffectId ? (workflowChildEffectSequence += 1) : 0,
@@ -17698,15 +17755,39 @@ export async function* agentLoop(messages, options) {
17698
17755
  });
17699
17756
  continue;
17700
17757
  }
17701
- let toolArgs;
17702
-
17703
- try {
17704
- toolArgs =
17705
- typeof fn.arguments === "string"
17706
- ? JSON.parse(fn.arguments)
17707
- : fn.arguments;
17708
- } catch {
17709
- toolArgs = {};
17758
+ const toolArgs = parseToolArguments(fn.arguments);
17759
+ if (toolArgs === null) {
17760
+ const result = {
17761
+ code: TOOL_ARGUMENTS_INVALID_CODE,
17762
+ execution_started: false,
17763
+ error:
17764
+ "Tool arguments must be a valid JSON object. No tool was executed. " +
17765
+ "Issue a new call with valid arguments if still appropriate.",
17766
+ };
17767
+ yield {
17768
+ type: "tool-pre-execution-denied",
17769
+ tool: toolName,
17770
+ tool_use_id: call.id,
17771
+ turn_id: turnId,
17772
+ preExecutionDenied: true,
17773
+ execution_started: false,
17774
+ };
17775
+ yield {
17776
+ type: "tool-result",
17777
+ tool: toolName,
17778
+ result,
17779
+ error: result.error,
17780
+ tool_use_id: call.id,
17781
+ turn_id: turnId,
17782
+ preExecutionDenied: true,
17783
+ execution_started: false,
17784
+ };
17785
+ appendMessages({
17786
+ role: "tool",
17787
+ content: JSON.stringify(result),
17788
+ tool_call_id: call.id,
17789
+ });
17790
+ continue;
17710
17791
  }
17711
17792
 
17712
17793
  // 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};