zidane 6.2.35 → 6.3.0

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 (160) hide show
  1. package/README.md +16 -5
  2. package/dist/{acp-DZNCQaTQ.js → acp-BCg03Fqc.js} +6 -6
  3. package/dist/{acp-DZNCQaTQ.js.map → acp-BCg03Fqc.js.map} +1 -1
  4. package/dist/acp-cli.js +7 -7
  5. package/dist/acp.d.ts +2 -2
  6. package/dist/acp.js +1 -1
  7. package/dist/{agent-CrPwqpLI.js → agent-DO8s7bDf.js} +168 -23
  8. package/dist/agent-DO8s7bDf.js.map +1 -0
  9. package/dist/agent.d.ts +2 -2
  10. package/dist/agent.js +4 -4
  11. package/dist/{anthropic-asnZVFS_.js → anthropic-B3hj9OMm.js} +32 -13
  12. package/dist/anthropic-B3hj9OMm.js.map +1 -0
  13. package/dist/{auth-C5YTniaq.js → auth-kqdSYLMU.js} +4 -4
  14. package/dist/{auth-C5YTniaq.js.map → auth-kqdSYLMU.js.map} +1 -1
  15. package/dist/{cache-telemetry-BhTryxFT.js → cache-telemetry-DzyfqSds.js} +87 -5
  16. package/dist/cache-telemetry-DzyfqSds.js.map +1 -0
  17. package/dist/chat/pure.d.ts +3 -3
  18. package/dist/chat.d.ts +42 -4
  19. package/dist/chat.d.ts.map +1 -1
  20. package/dist/chat.js +31 -3
  21. package/dist/chat.js.map +1 -1
  22. package/dist/context-transport-CTLvmkj8.js +84 -0
  23. package/dist/context-transport-CTLvmkj8.js.map +1 -0
  24. package/dist/contexts/daytona.d.ts +33 -4
  25. package/dist/contexts/daytona.d.ts.map +1 -1
  26. package/dist/contexts/daytona.js +136 -0
  27. package/dist/contexts/daytona.js.map +1 -1
  28. package/dist/contexts/docker.d.ts +1 -1
  29. package/dist/contexts/docker.d.ts.map +1 -1
  30. package/dist/contexts/docker.js +85 -2
  31. package/dist/contexts/docker.js.map +1 -1
  32. package/dist/contexts/e2b.d.ts +34 -4
  33. package/dist/contexts/e2b.d.ts.map +1 -1
  34. package/dist/contexts/e2b.js +92 -0
  35. package/dist/contexts/e2b.js.map +1 -1
  36. package/dist/contexts/sandbox.d.ts +1 -1
  37. package/dist/contexts/sandbox.js +4 -2
  38. package/dist/contexts/sandbox.js.map +1 -1
  39. package/dist/{contexts-o8y5B3Tm.js → contexts-DbMuUPjS.js} +92 -5
  40. package/dist/contexts-DbMuUPjS.js.map +1 -0
  41. package/dist/contexts.d.ts +4 -4
  42. package/dist/contexts.js +1 -1
  43. package/dist/eval.d.ts +1 -1
  44. package/dist/eval.js +3 -3
  45. package/dist/{exec-file-size-PXkr-MGA.js → exec-file-size-BRpoB6Io.js} +3 -32
  46. package/dist/exec-file-size-BRpoB6Io.js.map +1 -0
  47. package/dist/extensions.d.ts +1 -1
  48. package/dist/extensions.js +1 -1
  49. package/dist/headless.d.ts +1 -1
  50. package/dist/headless.js +4 -4
  51. package/dist/{index-DsPQbyUn.d.ts → index-B9jSo84a.d.ts} +2 -2
  52. package/dist/index-B9jSo84a.d.ts.map +1 -0
  53. package/dist/{index-CohO0oaX.d.ts → index-Bht3PKx6.d.ts} +5588 -5202
  54. package/dist/index-Bht3PKx6.d.ts.map +1 -0
  55. package/dist/index.d.ts +6 -6
  56. package/dist/index.js +12 -12
  57. package/dist/{login-CWwu9Sex.js → login-DRy_-rQh.js} +2 -2
  58. package/dist/{login-CWwu9Sex.js.map → login-DRy_-rQh.js.map} +1 -1
  59. package/dist/{mcp-Ct5tF4oj.js → mcp-DHKk_tLV.js} +77 -34
  60. package/dist/mcp-DHKk_tLV.js.map +1 -0
  61. package/dist/mcp.d.ts +2 -2
  62. package/dist/mcp.js +2 -2
  63. package/dist/{messages-Cpb4g_KV.js → messages-DHzFOdx_.js} +2 -2
  64. package/dist/{messages-Cpb4g_KV.js.map → messages-DHzFOdx_.js.map} +1 -1
  65. package/dist/{openai-compat-C77gOaHh.js → openai-compat-OI68avOl.js} +59 -16
  66. package/dist/openai-compat-OI68avOl.js.map +1 -0
  67. package/dist/output/stream-json.d.ts +1 -1
  68. package/dist/output/terminal.d.ts +1 -1
  69. package/dist/presets.d.ts +1 -1
  70. package/dist/presets.js +1 -1
  71. package/dist/prompt.d.ts +1 -1
  72. package/dist/prompt.js +14 -0
  73. package/dist/prompt.js.map +1 -1
  74. package/dist/providers/anthropic.d.ts +2 -2
  75. package/dist/providers/anthropic.js +2 -2
  76. package/dist/providers/arcee.d.ts +1 -1
  77. package/dist/providers/arcee.js +1 -1
  78. package/dist/providers/baseten.d.ts +1 -1
  79. package/dist/providers/baseten.js +1 -1
  80. package/dist/providers/cerebras.d.ts +1 -1
  81. package/dist/providers/cerebras.js +1 -1
  82. package/dist/providers/local.d.ts +1 -1
  83. package/dist/providers/local.js +1 -1
  84. package/dist/providers/openai-compat.d.ts +1 -1
  85. package/dist/providers/openai-compat.js +1 -1
  86. package/dist/providers/openai.d.ts +1 -1
  87. package/dist/providers/openai.js +2 -2
  88. package/dist/providers/openrouter.d.ts +1 -1
  89. package/dist/providers/openrouter.js +1 -1
  90. package/dist/providers/xai.d.ts +1 -1
  91. package/dist/providers/xai.js +1 -1
  92. package/dist/{providers-DnHPW-dL.js → providers-y_l5VkAZ.js} +3 -3
  93. package/dist/{providers-DnHPW-dL.js.map → providers-y_l5VkAZ.js.map} +1 -1
  94. package/dist/providers.d.ts +1 -1
  95. package/dist/providers.js +4 -4
  96. package/dist/{read-state-rDmfeLmz.js → read-state-CNyeMG7W.js} +7 -4
  97. package/dist/read-state-CNyeMG7W.js.map +1 -0
  98. package/dist/restate.d.ts +2 -2
  99. package/dist/restate.js +2 -2
  100. package/dist/restate.js.map +1 -1
  101. package/dist/{sandbox-CgjG2VvQ.d.ts → sandbox-DqwpKX18.d.ts} +14 -2
  102. package/dist/{sandbox-CgjG2VvQ.d.ts.map → sandbox-DqwpKX18.d.ts.map} +1 -1
  103. package/dist/session/sqlite.d.ts +1 -1
  104. package/dist/{session-DpDBnktP.js → session-DdT2xT_d.js} +2 -2
  105. package/dist/{session-DpDBnktP.js.map → session-DdT2xT_d.js.map} +1 -1
  106. package/dist/session.d.ts +1 -1
  107. package/dist/session.js +2 -2
  108. package/dist/shell-quote-BmnhZmdM.js +33 -0
  109. package/dist/shell-quote-BmnhZmdM.js.map +1 -0
  110. package/dist/skills.d.ts +1 -1
  111. package/dist/{stdio-loader-Ce68wUmM.js → stdio-DU3ljLqy.js} +8 -215
  112. package/dist/stdio-DU3ljLqy.js.map +1 -0
  113. package/dist/stdio-loader-9PnQWshg.js +217 -0
  114. package/dist/stdio-loader-9PnQWshg.js.map +1 -0
  115. package/dist/stream-queue-Cd9OJxl7.js +71 -0
  116. package/dist/stream-queue-Cd9OJxl7.js.map +1 -0
  117. package/dist/{system-prompt-BlsdjcUi.d.ts → system-prompt-MNVHatSD.d.ts} +15 -1
  118. package/dist/system-prompt-MNVHatSD.d.ts.map +1 -0
  119. package/dist/{tool-formatters-bZYz74qU.d.ts → tool-formatters-B0ZXWJTe.d.ts} +2 -2
  120. package/dist/{tool-formatters-bZYz74qU.d.ts.map → tool-formatters-B0ZXWJTe.d.ts.map} +1 -1
  121. package/dist/tools/fetch-url.d.ts +1 -1
  122. package/dist/tools/web-search.d.ts +1 -1
  123. package/dist/tools.d.ts +1 -1
  124. package/dist/tools.js +2 -2
  125. package/dist/{transcript-anchors-ZZYwCTjo.js → transcript-anchors-ChQH1fMm.js} +18 -8
  126. package/dist/transcript-anchors-ChQH1fMm.js.map +1 -0
  127. package/dist/{transcript-anchors-EBchHUMo.d.ts → transcript-anchors-yt0sGL0w.d.ts} +2 -2
  128. package/dist/{transcript-anchors-EBchHUMo.d.ts.map → transcript-anchors-yt0sGL0w.d.ts.map} +1 -1
  129. package/dist/tui.d.ts +3 -3
  130. package/dist/tui.d.ts.map +1 -1
  131. package/dist/tui.js +59 -7
  132. package/dist/tui.js.map +1 -1
  133. package/dist/{turn-operations-DygcPreU.d.ts → turn-operations-XlnBT7p9.d.ts} +3 -3
  134. package/dist/{turn-operations-DygcPreU.d.ts.map → turn-operations-XlnBT7p9.d.ts.map} +1 -1
  135. package/dist/types-BIarq1qE.js.map +1 -1
  136. package/dist/{types-BDccavwj.d.ts → types-DdZMQxfT.d.ts} +117 -2
  137. package/dist/types-DdZMQxfT.d.ts.map +1 -0
  138. package/dist/types.d.ts +3 -3
  139. package/dist/{xai-B2hIs5We.js → xai-DxdI27ds.js} +2 -2
  140. package/dist/{xai-B2hIs5We.js.map → xai-DxdI27ds.js.map} +1 -1
  141. package/docs/ARCHITECTURE.md +62 -4
  142. package/docs/CHAT.md +11 -4
  143. package/docs/RESTATE.md +1 -1
  144. package/docs/SKILL.md +21 -1
  145. package/docs/TUI.md +2 -0
  146. package/package.json +1 -1
  147. package/dist/agent-CrPwqpLI.js.map +0 -1
  148. package/dist/anthropic-asnZVFS_.js.map +0 -1
  149. package/dist/cache-telemetry-BhTryxFT.js.map +0 -1
  150. package/dist/contexts-o8y5B3Tm.js.map +0 -1
  151. package/dist/exec-file-size-PXkr-MGA.js.map +0 -1
  152. package/dist/index-CohO0oaX.d.ts.map +0 -1
  153. package/dist/index-DsPQbyUn.d.ts.map +0 -1
  154. package/dist/mcp-Ct5tF4oj.js.map +0 -1
  155. package/dist/openai-compat-C77gOaHh.js.map +0 -1
  156. package/dist/read-state-rDmfeLmz.js.map +0 -1
  157. package/dist/stdio-loader-Ce68wUmM.js.map +0 -1
  158. package/dist/system-prompt-BlsdjcUi.d.ts.map +0 -1
  159. package/dist/transcript-anchors-ZZYwCTjo.js.map +0 -1
  160. package/dist/types-BDccavwj.d.ts.map +0 -1
package/dist/acp-cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import { Ft as resolveStorageDirs, lt as basic_default } from "./agent-CrPwqpLI.js";
3
- import { r as createProcessContext } from "./contexts-o8y5B3Tm.js";
2
+ import { Lt as resolveStorageDirs, dt as basic_default } from "./agent-DO8s7bDf.js";
3
+ import { r as createProcessContext } from "./contexts-DbMuUPjS.js";
4
4
  import { createSandboxContext } from "./contexts/sandbox.js";
5
- import { m as openaiCompat } from "./openai-compat-C77gOaHh.js";
6
- import { t as anthropic } from "./anthropic-asnZVFS_.js";
5
+ import { m as openaiCompat } from "./openai-compat-OI68avOl.js";
6
+ import { n as anthropic } from "./anthropic-B3hj9OMm.js";
7
7
  import { arcee } from "./providers/arcee.js";
8
8
  import { baseten } from "./providers/baseten.js";
9
9
  import { cerebras } from "./providers/cerebras.js";
10
- import { t as xai } from "./xai-B2hIs5We.js";
10
+ import { t as xai } from "./xai-DxdI27ds.js";
11
11
  import { openai } from "./providers/openai.js";
12
12
  import { openrouter } from "./providers/openrouter.js";
13
- import { d as StartUsageError, f as buildStartLocalOptions, h as startProviderNames, i as withAcpDefaultTools, m as startLocalArgOptions, p as parseStartArgValues, t as runAcpStdioServer } from "./acp-DZNCQaTQ.js";
14
- import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-C5YTniaq.js";
13
+ import { d as StartUsageError, f as buildStartLocalOptions, h as startProviderNames, i as withAcpDefaultTools, m as startLocalArgOptions, p as parseStartArgValues, t as runAcpStdioServer } from "./acp-BCg03Fqc.js";
14
+ import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-kqdSYLMU.js";
15
15
  import { createDaytonaProvider } from "./contexts/daytona.js";
16
16
  import { createDockerContext } from "./contexts/docker.js";
17
17
  import { createE2BProvider } from "./contexts/e2b.js";
package/dist/acp.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Ef as SessionContentBlock, Gd as AgentBehavior, Qf as ToolDef, Rf as ToolResultContent, Sm as Provider, Wi as Agent, _f as PromptPart, _p as Session, of as McpServerConfig, qf as TurnUsage, qi as AgentOptions, t as Preset, xp as SessionStore } from "./index-CohO0oaX.js";
2
- import { c as ExecutionContext } from "./types-BDccavwj.js";
1
+ import { c as ExecutionContext } from "./types-DdZMQxfT.js";
2
+ import { $m as Session, Pm as ToolDef, Ri as Agent, Sp as AgentBehavior, Vi as AgentOptions, Xd as Provider, Xp as PromptPart, am as SessionContentBlock, bm as ToolResultContent, km as TurnUsage, rh as SessionStore, t as Preset, zp as McpServerConfig } from "./index-Bht3PKx6.js";
3
3
  import { Readable, Writable } from "node:stream";
4
4
 
5
5
  //#region src/acp/types.d.ts
package/dist/acp.js CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as createJsonRpcConnection, a as wrapToolsForAcpClient, c as sessionBlocksToAcp, g as JsonRpcRemoteError, i as withAcpDefaultTools, l as stopReasonFromRun, n as AcpProtocolError, o as acpMcpServersToZidane, r as createAcpServer, s as acpPromptToPromptParts, t as runAcpStdioServer, u as toolResultToAcpContent } from "./acp-DZNCQaTQ.js";
1
+ import { _ as createJsonRpcConnection, a as wrapToolsForAcpClient, c as sessionBlocksToAcp, g as JsonRpcRemoteError, i as withAcpDefaultTools, l as stopReasonFromRun, n as AcpProtocolError, o as acpMcpServersToZidane, r as createAcpServer, s as acpPromptToPromptParts, t as runAcpStdioServer, u as toolResultToAcpContent } from "./acp-BCg03Fqc.js";
2
2
  export { AcpProtocolError, JsonRpcRemoteError, acpMcpServersToZidane, acpPromptToPromptParts, createAcpServer, createJsonRpcConnection, runAcpStdioServer, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent, withAcpDefaultTools, wrapToolsForAcpClient };
@@ -1,24 +1,24 @@
1
1
  import { a as rewriteMessagesToWire, i as rewriteContentToCanonical, n as buildAliasMaps, o as toCanonicalName, r as buildSanitizedWireAliases, s as toWireName, t as augmentMcpDoubleUnderscoreAliases } from "./aliasing-lVFbm81n.js";
2
2
  import { a as isWireTurn, c as toolOutputByteLength, i as documentBlockMarker, l as toolResultToText, o as sanitizeToolResultMetadata, s as toolOutputBudgetByteLength, t as DEFAULT_AGENT_CLOCK } from "./types-BIarq1qE.js";
3
3
  import { i as styleReplacementForVia, n as resolveOldString, r as stripLineNumberPrefixes, t as describeVia } from "./edit-utils-EGosADZq.js";
4
- import { a as hydrateReadStateFromSessionAsync, c as resolveReadStateMap, n as getToolDedupState, o as markReadStateElided, r as hashContent, s as readStateKey, t as getReadState } from "./read-state-rDmfeLmz.js";
4
+ import { a as hydrateReadStateFromSessionAsync, c as resolveReadStateMap, n as getToolDedupState, o as markReadStateElided, r as hashContent, s as readStateKey, t as getReadState } from "./read-state-CNyeMG7W.js";
5
5
  import { n as estimateTokens, r as utf8ByteLength } from "./utils-ngQzYzZD.js";
6
6
  import { t as buildContextBreakdown } from "./context-breakdown-Dzo25N45.js";
7
7
  import { a as formatDuration, c as previewLine, o as formatTaskStatus, s as formatTaskSummary } from "./format-BF745pLL.js";
8
8
  import { i as parseGitLsFiles, r as GIT_LS_FILES_COMMAND } from "./glob-DluQFSw1.js";
9
- import { n as alwaysQuote, r as shellQuote } from "./exec-file-size-PXkr-MGA.js";
10
9
  import { i as isOutputExceededMessage } from "./output-cap-C9zukcCj.js";
11
- import { r as createProcessContext, t as resolveDetachedTasksCapability } from "./contexts-o8y5B3Tm.js";
10
+ import { r as createProcessContext, t as resolveDetachedTasksCapability } from "./contexts-DbMuUPjS.js";
11
+ import { n as shellQuote, t as alwaysQuote } from "./shell-quote-BmnhZmdM.js";
12
12
  import { i as AgentProviderError, l as errorMessage, m as toTypedError, n as AgentBudgetExceededError, o as AgentToolPairingError, t as AgentAbortedError, u as isAbortLikeError } from "./errors-DJUxZg9b.js";
13
13
  import { C as stripShellInterpolations, O as validateResourcePathReal, S as interpolateShellCommands, _ as lastLine, b as resolveSubdirRoot, d as installAllowedToolsGate, f as createSkillActivationState, g as fetchInstallSource, h as defaultWhich, j as projectUserPaths, l as buildCatalog, m as defaultExec, p as InstallSourceError, t as resolveSkills, v as parseInstallSource, x as escapeXml, y as resolveNpmVersion } from "./resolve-BPTA1RpX.js";
14
14
  import { n as writeFileAtomicAsync, t as writeFileAtomic } from "./atomic-write-B7zr1ddF.js";
15
15
  import { r as createLogger, t as consoleSink } from "./logger-DBX9uYOw.js";
16
16
  import { n as reconcileImageMediaType } from "./media-sniff-Bn76JxAu.js";
17
- import { n as connectMcpServers, o as nonOwningMcpView, r as deriveMcpToolMeta, u as wrapDiscoveredMcpTools } from "./mcp-Ct5tF4oj.js";
18
- import { C as canonicalizePrompt, S as buildPromptMessage } from "./openai-compat-C77gOaHh.js";
17
+ import { d as wrapDiscoveredMcpTools, i as deriveMcpToolMeta, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-DHKk_tLV.js";
18
+ import { C as buildPromptMessage, w as canonicalizePrompt } from "./openai-compat-OI68avOl.js";
19
19
  import { appendStaticSection, renderSystemForWire } from "./prompt.js";
20
- import { a as detectTurnInterruption, c as ensureToolResultPairing, l as filterUnresolvedToolUses, m as resolveContentRefsInMessages, n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER, p as remintDuplicateToolCallIds, s as ensureEndsWithUserMessage } from "./messages-Cpb4g_KV.js";
21
- import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-DpDBnktP.js";
20
+ import { a as detectTurnInterruption, c as ensureToolResultPairing, l as filterUnresolvedToolUses, m as resolveContentRefsInMessages, n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER, p as remintDuplicateToolCallIds, s as ensureEndsWithUserMessage } from "./messages-DHzFOdx_.js";
21
+ import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-DdT2xT_d.js";
22
22
  import { n as flattenTurns, r as formatTokenUsage, t as effectiveInputFromTurn } from "./stats-DAKBEKjc.js";
23
23
  import { a as withInactivityTimeout, i as settleWithinTimeout, n as linkAbortSignal, o as withTimeout$1, r as resolveTimeoutMs, t as OperationTimeoutError } from "./timeout-BDetbuN6.js";
24
24
  import { createRequire } from "node:module";
@@ -710,10 +710,15 @@ function installTextToolCallRescue(hooks, config, deps) {
710
710
  * - Function form -> `decay(turn, baseBudget)`. The return is clamped to
711
711
  * `[0, baseBudget]` so a buggy curve can't request more budget than the
712
712
  * caller explicitly opted into.
713
- * - Struct form `{ afterTurn, factor, floor }` -> for `turn <= afterTurn`,
713
+ * - Geometric form `{ afterTurn, factor, floor }` -> for `turn <= afterTurn`,
714
714
  * returns `baseBudget`. For `turn > afterTurn`, returns
715
715
  * `max(floor, baseBudget * factor^(turn - afterTurn))` clamped to
716
716
  * `[floor, baseBudget]`.
717
+ * - Step form `{ afterTurn, floor }` (no `factor`) -> `baseBudget` through
718
+ * `afterTurn`, then `floor` for the rest of the run. Exactly one distinct
719
+ * value change — and therefore exactly one prompt-cache invalidation, since
720
+ * `thinking.budget_tokens` is part of Anthropic's cache key (measured; see
721
+ * `AgentBehavior.thinkingDecay`). Prefer it when caching is on.
717
722
  *
718
723
  * Result is rounded to the nearest integer; token counts are integers.
719
724
  */
@@ -724,8 +729,7 @@ function applyThinkingDecay(baseBudget, decay, turn) {
724
729
  if (typeof decay === "function") raw = decay(turn, baseBudget);
725
730
  else {
726
731
  if (turn <= decay.afterTurn) return baseBudget;
727
- const k = turn - decay.afterTurn;
728
- raw = Math.max(decay.floor, baseBudget * decay.factor ** k);
732
+ raw = typeof decay.factor === "number" ? Math.max(decay.floor, baseBudget * decay.factor ** (turn - decay.afterTurn)) : decay.floor;
729
733
  }
730
734
  if (Number.isNaN(raw) || raw <= 0) return 0;
731
735
  return Math.round(Math.min(baseBudget, raw));
@@ -2913,7 +2917,8 @@ const edit = {
2913
2917
  if (prior) readState.set(absKey, {
2914
2918
  ...prior,
2915
2919
  contentHash: hashContent(updated),
2916
- mtimeMs: Date.now()
2920
+ mtimeMs: Date.now(),
2921
+ elided: true
2917
2922
  });
2918
2923
  }
2919
2924
  ctx.reportOutcome?.("edited");
@@ -3692,7 +3697,8 @@ const multiEdit = {
3692
3697
  if (prior) readState.set(absKey, {
3693
3698
  ...prior,
3694
3699
  contentHash: hashContent(current),
3695
- mtimeMs: Date.now()
3700
+ mtimeMs: Date.now(),
3701
+ elided: true
3696
3702
  });
3697
3703
  }
3698
3704
  } else ctx.reportOutcome?.("failed");
@@ -6022,7 +6028,8 @@ const writeFile$1 = {
6022
6028
  offset: 0,
6023
6029
  limit: Number.POSITIVE_INFINITY,
6024
6030
  maxBytes: Number.POSITIVE_INFINITY,
6025
- mtimeMs: Date.now()
6031
+ mtimeMs: Date.now(),
6032
+ elided: true
6026
6033
  });
6027
6034
  ctx.reportOutcome?.(existing === void 0 ? "created" : "updated");
6028
6035
  return existing === void 0 ? `Created ${targetPath} (${bytes} bytes).` : `Updated ${targetPath} (${bytes} bytes).`;
@@ -10029,7 +10036,6 @@ function applyCompactSummaryCutoff(turns) {
10029
10036
  */
10030
10037
  const COMPACTION_STUB = "[…elided: older tool output trimmed to fit the context budget.]";
10031
10038
  const COMPACTION_STUB_BYTES = toolOutputByteLength(COMPACTION_STUB);
10032
- const COMPACT_CHUNK_TURNS = 8;
10033
10039
  /**
10034
10040
  * Cross-turn memo for `toolOutputBudgetByteLength`, keyed on the tool_result
10035
10041
  * block object. The wire pipeline preserves block references for unchanged
@@ -10310,18 +10316,39 @@ function collectCallMaps(messages) {
10310
10316
  *
10311
10317
  * Pure function, exported for tests and so downstream tooling can preview
10312
10318
  * elision without spinning up the loop.
10319
+ *
10320
+ * Cache cost, and why this pass is NOT frontier-quantized like its neighbours:
10321
+ *
10322
+ * A stub rewrites the prefix at the earliest position any stale read sits — in a
10323
+ * read-then-edit run, near message 1. A prefix cache hashes
10324
+ * tools → system → messages cumulatively, so that invalidates the whole
10325
+ * conversation, and the miss reads as a suspiciously CONSTANT `cacheRead` (the
10326
+ * scaffold still matches) rather than a zero one.
10327
+ *
10328
+ * The saving grace is that stubbing is idempotent per read: once a path's
10329
+ * earlier reads carry the stub, every later edit to that path changes nothing.
10330
+ * Real runs edit a small set of files repeatedly, so distinct staleness events
10331
+ * are rare — 13 across a measured 129-turn production trace. Snapping the
10332
+ * frontier to a chunk (as `applyTailCompaction` does, for good reason) made that
10333
+ * WORSE, not better: 16 breaks, because each advance discovers a fresh batch and
10334
+ * splits one logical event across boundaries. See the call site in the loop.
10335
+ *
10336
+ * `chunkTurns` therefore exists but defaults to off. It only pays when staleness
10337
+ * events are both frequent and spread across many distinct paths.
10313
10338
  */
10314
10339
  const STALE_READ_STUB = "[…elided: this file was edited later in the run, so this earlier read is stale.]";
10315
- function applyStaleReadElision(messages) {
10340
+ function applyStaleReadElision(messages, options) {
10316
10341
  if (messages.length === 0) return {
10317
10342
  messages,
10318
10343
  elidedPaths: []
10319
10344
  };
10345
+ const chunk = Math.max(1, options?.chunkTurns ?? 1);
10346
+ const cutoff = messages.length <= chunk ? messages.length : Math.floor(messages.length / chunk) * chunk;
10320
10347
  const resultByCallId = /* @__PURE__ */ new Map();
10321
10348
  for (const msg of messages) for (const block of msg.content) if (block.type === "tool_result" && typeof block.output === "string") resultByCallId.set(block.callId, block.output);
10322
10349
  const maxMutationIdxByPath = /* @__PURE__ */ new Map();
10323
10350
  const readCallInfo = /* @__PURE__ */ new Map();
10324
- for (let i = 0; i < messages.length; i++) for (const block of messages[i].content) {
10351
+ for (let i = 0; i < cutoff; i++) for (const block of messages[i].content) {
10325
10352
  if (block.type !== "tool_call") continue;
10326
10353
  const path = block.input.path;
10327
10354
  if (typeof path !== "string") continue;
@@ -10387,6 +10414,96 @@ function applyStaleReadElision(messages) {
10387
10414
  };
10388
10415
  }
10389
10416
  /**
10417
+ * Paths whose earlier reads were NEWLY made stale by this batch's successful
10418
+ * mutations — i.e. the prior transcript holds a `read_file` of the path that
10419
+ * is more recent than the path's last successful mutation. Reads older than
10420
+ * that mutation were already noticed when it landed, so repeated edits to the
10421
+ * same file yield exactly one notice per read→edit transition, not one per
10422
+ * edit.
10423
+ *
10424
+ * Pure; mirrors {@link applyStaleReadElision}'s detection exactly (same tool
10425
+ * names, same success markers) so the two policies never drift on WHAT counts
10426
+ * as stale — only on how the staleness is represented.
10427
+ */
10428
+ function collectNewlyStaleReadPaths(priorTurns, batch) {
10429
+ const mutated = /* @__PURE__ */ new Map();
10430
+ for (const call of batch) {
10431
+ if (typeof call.path !== "string" || mutated.has(call.path)) continue;
10432
+ const isEdit = call.name === "edit" || call.name === "multi_edit";
10433
+ const isWrite = call.name === "write_file";
10434
+ if (!isEdit && !isWrite) continue;
10435
+ const output = typeof call.output === "string" ? call.output : void 0;
10436
+ if (output === void 0) continue;
10437
+ if (isEdit ? output.startsWith("Edited ") : output.startsWith("Created ") || output.startsWith("Updated ")) mutated.set(call.path, true);
10438
+ }
10439
+ if (mutated.size === 0) return [];
10440
+ const resultByCallId = /* @__PURE__ */ new Map();
10441
+ for (const msg of priorTurns) for (const block of msg.content) if (block.type === "tool_result" && typeof block.output === "string") resultByCallId.set(block.callId, block.output);
10442
+ const hasUnnoticedRead = /* @__PURE__ */ new Map();
10443
+ for (const msg of priorTurns) for (const block of msg.content) {
10444
+ if (block.type !== "tool_call") continue;
10445
+ const path = block.input.path;
10446
+ if (typeof path !== "string" || !mutated.has(path)) continue;
10447
+ if (block.name === "read_file") {
10448
+ hasUnnoticedRead.set(path, true);
10449
+ continue;
10450
+ }
10451
+ const isEdit = block.name === "edit" || block.name === "multi_edit";
10452
+ const isWrite = block.name === "write_file";
10453
+ if (!isEdit && !isWrite) continue;
10454
+ const result = resultByCallId.get(block.id);
10455
+ if (typeof result !== "string") continue;
10456
+ if (isEdit ? result.startsWith("Edited ") : result.startsWith("Created ") || result.startsWith("Updated ")) hasUnnoticedRead.set(path, false);
10457
+ }
10458
+ return [...mutated.keys()].filter((path) => hasUnnoticedRead.get(path) === true);
10459
+ }
10460
+ /**
10461
+ * The notice text appended to a mutating tool's result under the `'notice'`
10462
+ * policy. Deterministic and free of counters/timestamps — append-only content
10463
+ * cannot break the cache, but a stable template keeps transcripts diffable and
10464
+ * the tests byte-exact.
10465
+ */
10466
+ function renderStaleReadNotice(paths) {
10467
+ return `<system-reminder>Earlier read_file results for the following path(s) predate this change and are now stale:\n${paths.map((path) => `- ${path}`).join("\n")}\nDo not rely on those earlier file bodies. Re-read a file (or Grep the relevant slice) before reasoning about its current content.</system-reminder>`;
10468
+ }
10469
+ /**
10470
+ * Loop-side wiring for the `'notice'` policy: detect which paths this batch
10471
+ * newly staled and append one combined notice to the LAST successful mutating
10472
+ * result in the batch. Mutates `results` in place — they have not yet become a
10473
+ * turn, so this is the append-only window.
10474
+ *
10475
+ * Same-batch reads are excluded from staleness (a `read_file` and an `edit` of
10476
+ * the same path issued together), matching `applyStaleReadElision`, which
10477
+ * compares message indices and treats same-message reads as fresh.
10478
+ *
10479
+ * Signalling only — the re-read this notice asks for serves the fresh body
10480
+ * because the mutating tools mark their read-state entry `elided` when they
10481
+ * refresh the content hash (see `src/tools/edit.ts`), independent of any
10482
+ * stale-read policy.
10483
+ */
10484
+ function appendStaleReadNotices(priorTurns, calls, results) {
10485
+ const contentById = /* @__PURE__ */ new Map();
10486
+ for (const result of results) contentById.set(result.id, result.content);
10487
+ const batchIds = new Set(calls.map((call) => call.id));
10488
+ const batch = calls.map((call) => ({
10489
+ name: call.name,
10490
+ path: call.input.path,
10491
+ output: contentById.get(call.id) ?? ""
10492
+ }));
10493
+ const stalePaths = collectNewlyStaleReadPaths(priorTurns.filter((turn) => !turn.content.some((b) => b.type === "tool_call" && batchIds.has(b.id))), batch);
10494
+ if (stalePaths.length === 0) return;
10495
+ for (let i = results.length - 1; i >= 0; i--) {
10496
+ const call = calls.find((c) => c.id === results[i].id);
10497
+ if (!call || typeof call.input.path !== "string" || !stalePaths.includes(call.input.path)) continue;
10498
+ if (typeof results[i].content !== "string") continue;
10499
+ results[i] = {
10500
+ ...results[i],
10501
+ content: `${results[i].content}\n\n${renderStaleReadNotice(stalePaths)}`
10502
+ };
10503
+ return;
10504
+ }
10505
+ }
10506
+ /**
10390
10507
  * Flag read-state entries for paths whose reads got elided. Keys are
10391
10508
  * canonical absolute paths produced by `readStateKey(cwd, path)` (see
10392
10509
  * `src/tools/read-state.ts`); the loop has `ctx.handle.cwd` in scope,
@@ -11526,7 +11643,26 @@ async function executeTurn(ctx, turn, priorUsage) {
11526
11643
  const turnId = ctx.clock.randomUUID();
11527
11644
  let canonicalMessages = turnsToMessages(applyCompactSummaryCutoff(ctx.turns));
11528
11645
  canonicalMessages = await resolveContentRefsForWire(ctx, canonicalMessages);
11529
- if (ctx.elideStaleReads === true) {
11646
+ if (ctx.elideStaleReads === true || ctx.elideStaleReads === "stub") {
11647
+ /**
11648
+ * Deliberately UNQUANTIZED, unlike tail compaction and media age-out below.
11649
+ *
11650
+ * This pass rewrites the prefix at the earliest stale read, so quantizing its
11651
+ * frontier looks like it should help. Measured against a 129-turn production
11652
+ * trace, it does the opposite: 13 breaks / 0.25M re-billed chars unquantized
11653
+ * versus 16 / 0.27M at `chunkTurns: 8`.
11654
+ *
11655
+ * The reason is that this pass is already self-limiting. Stubbing is
11656
+ * idempotent per read, so once a path's earlier reads are stubbed, every
11657
+ * later edit to that path is a no-op — and real runs edit a small set of
11658
+ * files repeatedly, so distinct staleness events are rare. Deferring
11659
+ * detection to a frontier instead makes each advance discover a fresh batch,
11660
+ * which SPLITS one logical event across boundaries and adds breaks.
11661
+ *
11662
+ * Quantization only pays when staleness events are frequent AND spread over
11663
+ * many distinct paths, so batching can merge them. That is not the shape of
11664
+ * a coding run.
11665
+ */
11530
11666
  const elision = applyStaleReadElision(canonicalMessages);
11531
11667
  canonicalMessages = elision.messages;
11532
11668
  markReadStateForElidedPaths(ctx, ctx.handle.cwd, elision.elidedPaths);
@@ -11542,7 +11678,7 @@ async function executeTurn(ctx, turn, priorUsage) {
11542
11678
  const compacted = applyTailCompaction(sanitizedMessages, threshold, keep, {
11543
11679
  readPathByCallId,
11544
11680
  toolNameByCallId,
11545
- chunkTurns: COMPACT_CHUNK_TURNS,
11681
+ chunkTurns: 8,
11546
11682
  persistElideMinBytes: ctx.persistDir ? PERSISTENCE_PREVIEW_BYTES : 0
11547
11683
  });
11548
11684
  sanitizedMessages = compacted.messages;
@@ -11571,7 +11707,7 @@ async function executeTurn(ctx, turn, priorUsage) {
11571
11707
  if (typeof ctx.mediaKeepTurns === "number" && ctx.mediaKeepTurns >= 0 && ctx.tools.read_file) {
11572
11708
  const { readPathByCallId } = callMaps();
11573
11709
  const aged = applyMediaAgeout(sanitizedMessages, ctx.mediaKeepTurns, {
11574
- chunkTurns: COMPACT_CHUNK_TURNS,
11710
+ chunkTurns: 8,
11575
11711
  readPathByCallId,
11576
11712
  readFileToolName: toWireName("read_file", ctx.aliasMaps),
11577
11713
  maxInlineBytes: MEDIA_INLINE_MAX_BYTES
@@ -11593,6 +11729,7 @@ async function executeTurn(ctx, turn, priorUsage) {
11593
11729
  ...ctx.effortHint !== void 0 ? { effortHint: ctx.effortHint } : {},
11594
11730
  ...ctx.modelOptions ? { modelOptions: ctx.modelOptions } : {},
11595
11731
  cache: ctx.cache ?? true,
11732
+ ...ctx.cacheTtl !== void 0 ? { cacheTtl: ctx.cacheTtl } : {},
11596
11733
  signal: ctx.signal
11597
11734
  };
11598
11735
  const transformCtx = { messages: streamOptions.messages };
@@ -11959,6 +12096,7 @@ async function executeTurn(ctx, turn, priorUsage) {
11959
12096
  };
11960
12097
  }
11961
12098
  const toolResults = await executeToolBatch(ctx, canonicalToolCalls, turnId);
12099
+ if (ctx.elideStaleReads === "notice") appendStaleReadNotices(ctx.turns, canonicalToolCalls, toolResults);
11962
12100
  const toolResultMsg = ctx.provider.toolResultsMessage(toolResults);
11963
12101
  const toolResultsTurn = {
11964
12102
  id: ctx.clock.randomUUID(),
@@ -13417,6 +13555,7 @@ const HOOK_EVENT_SET = /* @__PURE__ */ new Set([
13417
13555
  "stream:retry",
13418
13556
  "model:fallback",
13419
13557
  "context:overflow",
13558
+ "cache:break",
13420
13559
  "compact:start",
13421
13560
  "compact:progress",
13422
13561
  "compact:end",
@@ -13592,6 +13731,7 @@ function resolveBehavior(agentBehavior, runBehavior) {
13592
13731
  modelOptions: runBehavior?.modelOptions ?? agentBehavior?.modelOptions,
13593
13732
  schema: runBehavior?.schema ?? agentBehavior?.schema,
13594
13733
  cache: runBehavior?.cache ?? agentBehavior?.cache ?? true,
13734
+ cacheTtl: runBehavior?.cacheTtl ?? agentBehavior?.cacheTtl,
13595
13735
  toolOutputBudget: runBehavior?.toolOutputBudget ?? agentBehavior?.toolOutputBudget,
13596
13736
  toolOutputBudgetExcludeTools: runBehavior?.toolOutputBudgetExcludeTools ?? agentBehavior?.toolOutputBudgetExcludeTools,
13597
13737
  readFileDefaults: runBehavior?.readFileDefaults ?? agentBehavior?.readFileDefaults,
@@ -14488,7 +14628,7 @@ function createAgent(rawOptions) {
14488
14628
  const thinking = options.thinking ?? "off";
14489
14629
  const model = targets[0].model;
14490
14630
  if (runProvider.meta?.clearsContextServerSide) resolvedBehavior.dedupReads = false;
14491
- const { maxConcurrentTools, toolBatchExecutor, toolBatchTimeoutMs, shouldRethrowToolError, maxTurns, maxTurnsWarning, maxTurnsWarningMessage, maxCostUsd, maxTotalTokens, maxWallMs, providerStreamStartTimeoutMs, providerStreamTimeoutMs, providerStreamIdleTimeoutMs, maxTokens, retry, thinkingBudget, taskBudget, effortHint, thinkingOverrunPolicy, modelOptions: behaviorModelOptions, schema, cache, toolOutputBudget, toolOutputBudgetExcludeTools, compactStrategy, compactThreshold, compactKeepTurns, thinkingDecay, writeFileExistingPolicy, textToolCallRescue, unknownToolRecovery, progressNudges, dedupTools, toolBudgets, repeatGuard, elideStaleReads, mediaKeepTurns, autoCompact, toolDisclosure, mcpToolNameSeparator, toolSearch, surfaceMcpInstructions, persistThreshold, persistExcludeTools, persistDir, persistMaxBytes, strictToolPairing, maxPairingRepairsPerTurn, maxConsecutivePauseTurns, resumeOnMaxTokens, persistTurns } = resolvedBehavior;
14631
+ const { maxConcurrentTools, toolBatchExecutor, toolBatchTimeoutMs, shouldRethrowToolError, maxTurns, maxTurnsWarning, maxTurnsWarningMessage, maxCostUsd, maxTotalTokens, maxWallMs, providerStreamStartTimeoutMs, providerStreamTimeoutMs, providerStreamIdleTimeoutMs, maxTokens, retry, thinkingBudget, taskBudget, effortHint, thinkingOverrunPolicy, modelOptions: behaviorModelOptions, schema, cache, cacheTtl, toolOutputBudget, toolOutputBudgetExcludeTools, compactStrategy, compactThreshold, compactKeepTurns, thinkingDecay, writeFileExistingPolicy, textToolCallRescue, unknownToolRecovery, progressNudges, dedupTools, toolBudgets, repeatGuard, elideStaleReads, mediaKeepTurns, autoCompact, toolDisclosure, mcpToolNameSeparator, toolSearch, surfaceMcpInstructions, persistThreshold, persistExcludeTools, persistDir, persistMaxBytes, strictToolPairing, maxPairingRepairsPerTurn, maxConsecutivePauseTurns, resumeOnMaxTokens, persistTurns } = resolvedBehavior;
14492
14632
  const modelOptions = options.modelOptions ?? behaviorModelOptions;
14493
14633
  let system = options.system || agentSystem || "You are a helpful assistant.";
14494
14634
  const baseSystemForBreakdown = renderSystemForWire(system);
@@ -14928,6 +15068,7 @@ function createAgent(rawOptions) {
14928
15068
  ...modelOptions ? { modelOptions } : {},
14929
15069
  schema,
14930
15070
  cache,
15071
+ ...cacheTtl !== void 0 ? { cacheTtl } : {},
14931
15072
  toolOutputBudget,
14932
15073
  ...toolOutputBudgetExcludeTools !== void 0 ? { toolOutputBudgetExcludeTools } : {},
14933
15074
  compactStrategy,
@@ -15236,7 +15377,11 @@ function createAgent(rawOptions) {
15236
15377
  mcpWarmupPromise = (async () => {
15237
15378
  const timeoutMs = resolveTimeoutMs(options.mcpConnectTimeoutMs ?? agentBehavior?.mcpConnectTimeoutMs, DEFAULT_CUSTOM_MCP_CONNECT_TIMEOUT_MS, options.maxWallMs);
15238
15379
  let timedOut = false;
15239
- const pending = mcpConnector ? mcpConnector(allMcpServers, hooks) : connectMcpServers(allMcpServers, void 0, hooks);
15380
+ const execution = {
15381
+ context: executionContext,
15382
+ getHandle: () => ensureExecutionHandle(resolveTimeoutMs(agentBehavior?.spawnTimeoutMs, DEFAULT_SPAWN_TIMEOUT_MS, options.maxWallMs))
15383
+ };
15384
+ const pending = mcpConnector ? mcpConnector(allMcpServers, hooks, { execution }) : connectMcpServers(allMcpServers, void 0, hooks, { execution });
15240
15385
  pending.then((lateConnection) => {
15241
15386
  if (timedOut || destroyed) lateConnection.close().catch(() => {});
15242
15387
  }, () => {});
@@ -15532,6 +15677,6 @@ function createAgent(rawOptions) {
15532
15677
  };
15533
15678
  }
15534
15679
  //#endregion
15535
- export { composeExtensionPreset as $, defaultExtensionScanPaths as $t, buildUpToCompactPrompt as A, createInteractionTool as At, createExtensionPromptBridge as B, ensureKeybindingsFile as Bt, BASE_INSTRUCTIONS as C, readFile$1 as Ct, buildFromCompactPrompt as D, formatModelLine as Dt, buildCompactPrompt as E, createModelSearchTool as Et, summaryToTurn as F, resolveStorageDirs as Ft, parseExtensionInstallSource as G, mergeKeybindings as Gt, fetchExtensionSource as H, groupBindings as Ht, truncateHeadForPtlRetry as I, DEFAULT_KEYBINDINGS as It, updateInstalledExtension as J, readKeybindingsRaw as Jt, readExtensionInstallProvenance as K, parseBindingSpec as Kt, CompactInvalidInputError as L, KEYBINDING_DEFS as Lt, anchorPreviewFor as M, glob as Mt, sliceForCompaction as N, edit as Nt, buildFullCompactPrompt as O, matchModelEntries as Ot, stripImagesFromTurns as P, validateToolArgs as Pt, buildExtensionRegistry as Q, ENTRY_CANDIDATES as Qt, CompactPromptTooLongError as R, KEYBINDING_DEF_BY_ACTION as Rt, compactConversation as S, tailTruncate as St, TRAILER as T, multiEdit as Tt, installExtensionFromSpec as U, keybindingsPath as Ut, ExtensionInstallError as V, formatBindingForDisplay as Vt, listExtensionCandidates as W, matchesBinding as Wt, discoverAndBuildExtensionRegistry as X, stripJsonComments as Xt, createExtensionHud as Y, resolveExtensionKeybindings as Yt, buildExtensionPreset as Z, registerExtensionHostModules as Zt, resolveTasksDir as _, shouldAutoCompact as _n, createSkillsRunScriptTool as _t, SHELL_CASCADE_CANCEL_MESSAGE as a, defineExtension as an, createWorkspaceSurface as at, selectFilesFromSession as b, normalizeShellCommand as bn, createShellTool as bt, applyCompactSummaryCutoff as c, isValidExtensionConfigItem as cn, basicTools as ct, buildPersistedStub as d, resolveExtensionConfigValue as dn, WAIT_TASK_TIMED_OUT_PREFIX as dt, discoverExtensions as en, disposeExtensionRegistry as et, cleanupPersistedSession as f, sanitizeExtensionConfigActionPatch as fn, waitTask as ft, resolvePersistDir as g, effectiveContextWindow as gn, createSkillsUseTool as gt, resolveMcpWarningsDir as h, OUTPUT_RESERVE_TOKENS as hn, isSpawnTool as ht, INTERRUPT_MESSAGE_FOR_TOOL_USE as i, scanExtensionDirectories as in, createExtensionHostRuntimeBridge as it, ANCHOR_PREVIEW_MAX_CHARS as j, grep as jt, buildTailCompactPrompt as k, listFiles as kt, PERSISTED_STUB_PREFIX as l, isValidExtensionConfigValue as ln, basic_default as lt, rehomePersistedStubs as m, AUTO_COMPACT_MIN_GROWTH_FRACTION as mn, createSpawnTool as mt, normalizeProviders as n, isExtensionDefinition as nn, mergeContributions as nt, TOOL_USE_CANCELLED_MESSAGE as o, clampExtensionConfigNumber as on, composePresets as ot, maybePersistToolResult as p, toWireConfigSchema as pn, createToolSearchTool as pt, removeInstalledExtension as q, readKeybindings as qt, resolveModelTargets as r, parseExtensionScanPathEnv as rn, partitionExtensionCatalog as rt, TOOL_USE_SKIPPED_MESSAGE as s, coerceExtensionConfigInput as sn, definePreset as st, createAgent as t, inlineLoadedExtension as tn, filterExtensionRegistry as tt, PERSISTENCE_PREVIEW_BYTES as u, resolveExtensionConfig as un, writeFile$1 as ut, buildPostCompactAttachments as v, defaultRepeatGuardNormalize as vn, createSkillsReadTool as vt, NO_TOOLS_PREAMBLE as w, looksBinary as wt, selectRecentFiles as x, stableStringify as xn, shell as xt, selectFilesFromReadState as y, defaultRepeatGuardTracked as yn, shellKill as yt, EMPTY_EXTENSION_REGISTRY as z, KEYBINDING_KEY_COL_WIDTH as zt };
15680
+ export { buildExtensionPreset as $, registerExtensionHostModules as $t, buildFullCompactPrompt as A, matchModelEntries as At, CompactPromptTooLongError as B, KEYBINDING_DEF_BY_ACTION as Bt, selectRecentFiles as C, stableStringify as Cn, shell as Ct, TRAILER as D, multiEdit as Dt, NO_TOOLS_PREAMBLE as E, looksBinary as Et, sliceForCompaction as F, edit as Ft, installExtensionFromSpec as G, keybindingsPath as Gt, createExtensionPromptBridge as H, ensureKeybindingsFile as Ht, stripImagesFromTurns as I, validateToolArgs as It, readExtensionInstallProvenance as J, parseBindingSpec as Jt, listExtensionCandidates as K, matchesBinding as Kt, summaryToTurn as L, resolveStorageDirs as Lt, buildUpToCompactPrompt as M, createInteractionTool as Mt, ANCHOR_PREVIEW_MAX_CHARS as N, grep as Nt, buildCompactPrompt as O, createModelSearchTool as Ot, anchorPreviewFor as P, glob as Pt, discoverAndBuildExtensionRegistry as Q, stripJsonComments as Qt, truncateHeadForPtlRetry as R, DEFAULT_KEYBINDINGS as Rt, selectFilesFromSession as S, normalizeShellCommand as Sn, createShellTool as St, BASE_INSTRUCTIONS as T, readFile$1 as Tt, ExtensionInstallError as U, formatBindingForDisplay as Ut, EMPTY_EXTENSION_REGISTRY as V, KEYBINDING_KEY_COL_WIDTH as Vt, fetchExtensionSource as W, groupBindings as Wt, updateInstalledExtension as X, readKeybindingsRaw as Xt, removeInstalledExtension as Y, readKeybindings as Yt, createExtensionHud as Z, resolveExtensionKeybindings as Zt, resolveMcpWarningsDir as _, OUTPUT_RESERVE_TOKENS as _n, isSpawnTool as _t, SHELL_CASCADE_CANCEL_MESSAGE as a, parseExtensionScanPathEnv as an, partitionExtensionCatalog as at, buildPostCompactAttachments as b, defaultRepeatGuardNormalize as bn, createSkillsReadTool as bt, applyCompactSummaryCutoff as c, clampExtensionConfigNumber as cn, composePresets as ct, PERSISTED_STUB_PREFIX as d, isValidExtensionConfigValue as dn, basic_default as dt, ENTRY_CANDIDATES as en, buildExtensionRegistry as et, PERSISTENCE_PREVIEW_BYTES as f, resolveExtensionConfig as fn, writeFile$1 as ft, rehomePersistedStubs as g, AUTO_COMPACT_MIN_GROWTH_FRACTION as gn, createSpawnTool as gt, maybePersistToolResult as h, toWireConfigSchema as hn, createToolSearchTool as ht, INTERRUPT_MESSAGE_FOR_TOOL_USE as i, isExtensionDefinition as in, mergeContributions as it, buildTailCompactPrompt as j, listFiles as jt, buildFromCompactPrompt as k, formatModelLine as kt, collectNewlyStaleReadPaths as l, coerceExtensionConfigInput as ln, definePreset as lt, cleanupPersistedSession as m, sanitizeExtensionConfigActionPatch as mn, waitTask as mt, normalizeProviders as n, discoverExtensions as nn, disposeExtensionRegistry as nt, TOOL_USE_CANCELLED_MESSAGE as o, scanExtensionDirectories as on, createExtensionHostRuntimeBridge as ot, buildPersistedStub as p, resolveExtensionConfigValue as pn, WAIT_TASK_TIMED_OUT_PREFIX as pt, parseExtensionInstallSource as q, mergeKeybindings as qt, resolveModelTargets as r, inlineLoadedExtension as rn, filterExtensionRegistry as rt, TOOL_USE_SKIPPED_MESSAGE as s, defineExtension as sn, createWorkspaceSurface as st, createAgent as t, defaultExtensionScanPaths as tn, composeExtensionPreset as tt, renderStaleReadNotice as u, isValidExtensionConfigItem as un, basicTools as ut, resolvePersistDir as v, effectiveContextWindow as vn, createSkillsUseTool as vt, compactConversation as w, tailTruncate as wt, selectFilesFromReadState as x, defaultRepeatGuardTracked as xn, shellKill as xt, resolveTasksDir as y, shouldAutoCompact as yn, createSkillsRunScriptTool as yt, CompactInvalidInputError as z, KEYBINDING_DEFS as zt };
15536
15681
 
15537
- //# sourceMappingURL=agent-CrPwqpLI.js.map
15682
+ //# sourceMappingURL=agent-DO8s7bDf.js.map