zidane 6.3.8 → 6.4.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 (109) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-CAX3tOEY.js → acp-DzUgjzNa.js} +5 -5
  3. package/dist/{acp-CAX3tOEY.js.map → acp-DzUgjzNa.js.map} +1 -1
  4. package/dist/acp-cli.js +6 -6
  5. package/dist/acp.d.ts +1 -1
  6. package/dist/acp.js +1 -1
  7. package/dist/{agent-Emjeo5Ad.js → agent-COHX5SpM.js} +52 -21
  8. package/dist/agent-COHX5SpM.js.map +1 -0
  9. package/dist/agent.d.ts +1 -1
  10. package/dist/agent.js +2 -2
  11. package/dist/{anthropic-BN0iPMox.js → anthropic-Bw39RApb.js} +124 -36
  12. package/dist/anthropic-Bw39RApb.js.map +1 -0
  13. package/dist/{auth-Dptb8U5J.js → auth-XS60l6Q5.js} +4 -4
  14. package/dist/{auth-Dptb8U5J.js.map → auth-XS60l6Q5.js.map} +1 -1
  15. package/dist/chat/pure.d.ts +3 -3
  16. package/dist/chat.d.ts +4 -4
  17. package/dist/chat.d.ts.map +1 -1
  18. package/dist/chat.js +3 -3
  19. package/dist/{context-transport-3b0qpM2m.js → context-transport-Nb9CVjLJ.js} +3 -3
  20. package/dist/{context-transport-3b0qpM2m.js.map → context-transport-Nb9CVjLJ.js.map} +1 -1
  21. package/dist/contexts/daytona.d.ts +1 -1
  22. package/dist/contexts/e2b.d.ts +1 -1
  23. package/dist/eval.d.ts +1 -1
  24. package/dist/eval.js +1 -1
  25. package/dist/extensions.d.ts +1 -1
  26. package/dist/extensions.js +1 -1
  27. package/dist/headless.d.ts +1 -1
  28. package/dist/headless.js +3 -3
  29. package/dist/{index-DWXLcGB_.d.ts → index-1Dr4Yqw1.d.ts} +114 -9
  30. package/dist/index-1Dr4Yqw1.d.ts.map +1 -0
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +9 -9
  33. package/dist/{login-Cvx1nSVm.js → login-CPU73khP.js} +5 -2
  34. package/dist/{login-Cvx1nSVm.js.map → login-CPU73khP.js.map} +1 -1
  35. package/dist/{mcp-8bEHU4WB.js → mcp-BNg6hUeX.js} +3 -3
  36. package/dist/{mcp-8bEHU4WB.js.map → mcp-BNg6hUeX.js.map} +1 -1
  37. package/dist/mcp.d.ts +1 -1
  38. package/dist/mcp.js +1 -1
  39. package/dist/{messages-DoHRwMw-.js → messages-DIxD2UCr.js} +2 -2
  40. package/dist/{messages-DoHRwMw-.js.map → messages-DIxD2UCr.js.map} +1 -1
  41. package/dist/{openai-compat-Bf9uMTMa.js → openai-compat-BTbSyQbm.js} +2 -2
  42. package/dist/{openai-compat-Bf9uMTMa.js.map → openai-compat-BTbSyQbm.js.map} +1 -1
  43. package/dist/output/stream-json.d.ts +1 -1
  44. package/dist/output/terminal.d.ts +1 -1
  45. package/dist/presets.d.ts +1 -1
  46. package/dist/presets.js +1 -1
  47. package/dist/providers/anthropic.d.ts +2 -2
  48. package/dist/providers/anthropic.js +1 -1
  49. package/dist/providers/arcee.d.ts +1 -1
  50. package/dist/providers/arcee.js +1 -1
  51. package/dist/providers/baseten.d.ts +1 -1
  52. package/dist/providers/baseten.js +1 -1
  53. package/dist/providers/cerebras.d.ts +1 -1
  54. package/dist/providers/cerebras.js +1 -1
  55. package/dist/providers/local.d.ts +1 -1
  56. package/dist/providers/local.js +1 -1
  57. package/dist/providers/openai-compat.d.ts +1 -1
  58. package/dist/providers/openai-compat.js +1 -1
  59. package/dist/providers/openai.d.ts +1 -1
  60. package/dist/providers/openai.js +3 -3
  61. package/dist/providers/openai.js.map +1 -1
  62. package/dist/providers/openrouter.d.ts +1 -1
  63. package/dist/providers/openrouter.js +1 -1
  64. package/dist/providers/xai.d.ts +1 -1
  65. package/dist/providers/xai.js +1 -1
  66. package/dist/{providers-BlaXBUwd.js → providers-BsH1MnhC.js} +3 -3
  67. package/dist/{providers-BlaXBUwd.js.map → providers-BsH1MnhC.js.map} +1 -1
  68. package/dist/providers.d.ts +1 -1
  69. package/dist/providers.js +4 -4
  70. package/dist/{read-state-CNyeMG7W.js → read-state-Dt7UbVsd.js} +26 -2
  71. package/dist/read-state-Dt7UbVsd.js.map +1 -0
  72. package/dist/restate.d.ts +1 -1
  73. package/dist/restate.js +1 -1
  74. package/dist/session/sqlite.d.ts +1 -1
  75. package/dist/{session-Bdk31kA5.js → session-DY2LWai4.js} +2 -2
  76. package/dist/{session-Bdk31kA5.js.map → session-DY2LWai4.js.map} +1 -1
  77. package/dist/session.d.ts +1 -1
  78. package/dist/session.js +2 -2
  79. package/dist/skills.d.ts +1 -1
  80. package/dist/{stdio-BKFpPNvX.js → stdio-DfWu1rNB.js} +2 -2
  81. package/dist/{stdio-BKFpPNvX.js.map → stdio-DfWu1rNB.js.map} +1 -1
  82. package/dist/{stdio-loader-DFDpBwwI.js → stdio-loader-mfN5JYns.js} +2 -2
  83. package/dist/{stdio-loader-DFDpBwwI.js.map → stdio-loader-mfN5JYns.js.map} +1 -1
  84. package/dist/{tool-formatters-Co5gl_7R.d.ts → tool-formatters-BaHq343O.d.ts} +2 -2
  85. package/dist/{tool-formatters-Co5gl_7R.d.ts.map → tool-formatters-BaHq343O.d.ts.map} +1 -1
  86. package/dist/tools/fetch-url.d.ts +1 -1
  87. package/dist/tools/web-search.d.ts +1 -1
  88. package/dist/tools.d.ts +1 -1
  89. package/dist/tools.js +2 -2
  90. package/dist/{transcript-anchors-DBPJr5Ks.d.ts → transcript-anchors-BquAWoGN.d.ts} +2 -2
  91. package/dist/{transcript-anchors-DBPJr5Ks.d.ts.map → transcript-anchors-BquAWoGN.d.ts.map} +1 -1
  92. package/dist/{transcript-anchors-DhBTqTyc.js → transcript-anchors-CWzlwIOr.js} +13 -7
  93. package/dist/{transcript-anchors-DhBTqTyc.js.map → transcript-anchors-CWzlwIOr.js.map} +1 -1
  94. package/dist/tui.d.ts +3 -3
  95. package/dist/tui.js +8 -7
  96. package/dist/tui.js.map +1 -1
  97. package/dist/{turn-operations-DokFalMC.d.ts → turn-operations-OQlIx13T.d.ts} +3 -3
  98. package/dist/{turn-operations-DokFalMC.d.ts.map → turn-operations-OQlIx13T.d.ts.map} +1 -1
  99. package/dist/types-BIarq1qE.js.map +1 -1
  100. package/dist/types.d.ts +1 -1
  101. package/dist/{xai-BI4KgCGS.js → xai-DnZfHvTz.js} +2 -2
  102. package/dist/{xai-BI4KgCGS.js.map → xai-DnZfHvTz.js.map} +1 -1
  103. package/docs/ARCHITECTURE.md +2 -1
  104. package/docs/CHAT.md +1 -1
  105. package/package.json +7 -2
  106. package/dist/agent-Emjeo5Ad.js.map +0 -1
  107. package/dist/anthropic-BN0iPMox.js.map +0 -1
  108. package/dist/index-DWXLcGB_.d.ts.map +0 -1
  109. package/dist/read-state-CNyeMG7W.js.map +0 -1
package/dist/acp-cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import { Vt as resolveStorageDirs, ht as basic_default } from "./agent-Emjeo5Ad.js";
2
+ import { Vt as resolveStorageDirs, ht as basic_default } from "./agent-COHX5SpM.js";
3
3
  import { r as createProcessContext } from "./contexts-DWVt7MvF.js";
4
4
  import { createSandboxContext } from "./contexts/sandbox.js";
5
- import { m as openaiCompat } from "./openai-compat-Bf9uMTMa.js";
6
- import { n as anthropic } from "./anthropic-BN0iPMox.js";
5
+ import { m as openaiCompat } from "./openai-compat-BTbSyQbm.js";
6
+ import { n as anthropic } from "./anthropic-Bw39RApb.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-BI4KgCGS.js";
10
+ import { t as xai } from "./xai-DnZfHvTz.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-CAX3tOEY.js";
14
- import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-Dptb8U5J.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-DzUgjzNa.js";
14
+ import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-XS60l6Q5.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
1
  import { c as ExecutionContext } from "./types-M2DauK2D.js";
2
- import { Km as ToolDef, Mm as ToolResultContent, Pp as AgentBehavior, Vm as TurnUsage, Wi as Agent, Zp as McpServerConfig, _m as SessionContentBlock, cm as PromptPart, dh as Session, hh as SessionStore, qi as AgentOptions, rf as Provider, t as Preset } from "./index-DWXLcGB_.js";
2
+ import { Fp as AgentBehavior, Hm as TurnUsage, Nm as ToolResultContent, Qp as McpServerConfig, Wi as Agent, fh as Session, gh as SessionStore, lm as PromptPart, qi as AgentOptions, qm as ToolDef, rf as Provider, t as Preset, vm as SessionContentBlock } from "./index-1Dr4Yqw1.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-CAX3tOEY.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-DzUgjzNa.js";
2
2
  export { AcpProtocolError, JsonRpcRemoteError, acpMcpServersToZidane, acpPromptToPromptParts, createAcpServer, createJsonRpcConnection, runAcpStdioServer, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent, withAcpDefaultTools, wrapToolsForAcpClient };
@@ -1,7 +1,7 @@
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-CNyeMG7W.js";
4
+ import { a as hydrateReadStateFromSessionAsync, c as readStateKey, l as resolveReadStateMap, n as getToolDedupState, o as markReadStateElided, r as hashContent, s as noteStaleRejection, t as getReadState, u as staleRefusalHint } from "./read-state-Dt7UbVsd.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";
@@ -14,11 +14,11 @@ import { C as stripShellInterpolations, O as validateResourcePathReal, S as inte
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-UKijEaiQ.js";
17
- import { d as wrapDiscoveredMcpTools, i as deriveMcpToolMeta, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-8bEHU4WB.js";
18
- import { E as canonicalizePrompt, T as buildPromptMessage } from "./openai-compat-Bf9uMTMa.js";
17
+ import { d as wrapDiscoveredMcpTools, i as deriveMcpToolMeta, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-BNg6hUeX.js";
18
+ import { E as canonicalizePrompt, T as buildPromptMessage } from "./openai-compat-BTbSyQbm.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-DoHRwMw-.js";
21
- import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-Bdk31kA5.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-DIxD2UCr.js";
21
+ import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-DY2LWai4.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";
@@ -2877,6 +2877,7 @@ const edit = {
2877
2877
  ctx.reportOutcome?.("failed");
2878
2878
  return `Edit error: file not found: ${target}.${hint}`;
2879
2879
  }
2880
+ let drift = null;
2880
2881
  if (ctx.behavior?.requireReadBeforeEdit) {
2881
2882
  const readState = resolveReadStateMap(ctx);
2882
2883
  if (readState) {
@@ -2884,25 +2885,32 @@ const edit = {
2884
2885
  const prior = readState.get(absKey);
2885
2886
  if (!prior) {
2886
2887
  ctx.reportOutcome?.("failed");
2887
- return `Edit error: ${target} has not been read in this session. Call read_file first so the edit applies against the current contents.`;
2888
- }
2889
- if (prior.contentHash !== hashContent(original)) {
2890
- ctx.reportOutcome?.("failed");
2891
- return `Edit error: ${target} has changed on disk since the last read. Re-read the file before editing.`;
2888
+ return `Edit error: ${target} has not been read in this session. Call read_file first so the edit applies against the current contents — reads through shell (cat, grep, sed) don't register.`;
2892
2889
  }
2890
+ if (prior.contentHash !== hashContent(original)) drift = {
2891
+ readState,
2892
+ absKey,
2893
+ prior
2894
+ };
2893
2895
  }
2894
2896
  }
2895
2897
  const match = resolveOldString(original, find);
2896
2898
  if (!match) {
2897
- const preview = nearestMatchPreview(original, find);
2898
2899
  ctx.reportOutcome?.("failed");
2900
+ if (drift) return staleEditRefusal(target, drift);
2901
+ const preview = nearestMatchPreview(original, find);
2899
2902
  return preview ? `Edit error: old_string not found in ${target}. Closest match in the file: ${preview}` : `Edit error: old_string not found in ${target}.`;
2900
2903
  }
2901
2904
  const { actual, occurrences, via } = match;
2902
2905
  if (occurrences > 1 && !replaceAll) {
2903
2906
  ctx.reportOutcome?.("failed");
2907
+ if (drift) return staleEditRefusal(target, drift);
2904
2908
  return `Edit error: old_string appears ${occurrences} times in ${target}. Pass replace_all=true or expand old_string for uniqueness.`;
2905
2909
  }
2910
+ if (drift && via !== "exact") {
2911
+ ctx.reportOutcome?.("failed");
2912
+ return staleEditRefusal(target, drift);
2913
+ }
2906
2914
  const styledReplacement = styleReplacementForVia(replacement, via, actual);
2907
2915
  const updated = replaceAll ? original.split(actual).join(styledReplacement) : original.replace(actual, styledReplacement);
2908
2916
  if (updated === original) {
@@ -2918,15 +2926,24 @@ const edit = {
2918
2926
  ...prior,
2919
2927
  contentHash: hashContent(updated),
2920
2928
  mtimeMs: Date.now(),
2921
- elided: true
2929
+ elided: true,
2930
+ staleRejections: 0
2922
2931
  });
2923
2932
  }
2924
2933
  ctx.reportOutcome?.("edited");
2925
2934
  const viaNote = via === "exact" ? "" : ` (old_string was not found verbatim; matched via ${describeVia(via)})`;
2926
- return `Edited ${target}: replaced ${occurrences} occurrence${occurrences === 1 ? "" : "s"}.${viaNote}`;
2935
+ return `Edited ${target}: replaced ${occurrences} occurrence${occurrences === 1 ? "" : "s"}.${viaNote}${drift ? ` Note: the file had changed on disk since your last read — old_string still anchored cleanly, but re-read before further edits.` : ""}`;
2927
2936
  }
2928
2937
  };
2929
2938
  /**
2939
+ * Drift refusal for `edit`: records the rejection against the read-state
2940
+ * entry so consecutive refusals escalate from "re-read the file" to naming
2941
+ * the external-writer hypothesis — see {@link staleRefusalHint}.
2942
+ */
2943
+ function staleEditRefusal(target, drift) {
2944
+ return `Edit error: ${target} has changed on disk since the last read. Re-read the file before editing.${staleRefusalHint(noteStaleRejection(drift.readState, drift.absKey, drift.prior))}`;
2945
+ }
2946
+ /**
2930
2947
  * Find the line that shares the longest common prefix with the needle's first
2931
2948
  * line. Cheap heuristic — better than nothing for the common "model has a typo"
2932
2949
  * case (off-by-one indent, trailing whitespace, escape mismatch).
@@ -3619,6 +3636,7 @@ const multiEdit = {
3619
3636
  ctx.reportOutcome?.("failed");
3620
3637
  return `multi_edit error: file not found: ${target}.${hint}`;
3621
3638
  }
3639
+ let drift = null;
3622
3640
  if (ctx.behavior?.requireReadBeforeEdit) {
3623
3641
  const readState = resolveReadStateMap(ctx);
3624
3642
  if (readState) {
@@ -3626,12 +3644,13 @@ const multiEdit = {
3626
3644
  const prior = readState.get(absKey);
3627
3645
  if (!prior) {
3628
3646
  ctx.reportOutcome?.("failed");
3629
- return `multi_edit error: ${target} has not been read in this session. Call read_file first so the edits apply against the current contents.`;
3630
- }
3631
- if (prior.contentHash !== hashContent(current)) {
3632
- ctx.reportOutcome?.("failed");
3633
- return `multi_edit error: ${target} has changed on disk since the last read. Re-read the file before editing.`;
3647
+ return `multi_edit error: ${target} has not been read in this session. Call read_file first so the edits apply against the current contents — reads through shell (cat, grep, sed) don't register.`;
3634
3648
  }
3649
+ if (prior.contentHash !== hashContent(current)) drift = {
3650
+ readState,
3651
+ absKey,
3652
+ prior
3653
+ };
3635
3654
  }
3636
3655
  }
3637
3656
  const outcomes = [];
@@ -3679,6 +3698,13 @@ const multiEdit = {
3679
3698
  });
3680
3699
  continue;
3681
3700
  }
3701
+ if (drift && via !== "exact") {
3702
+ outcomes.push({
3703
+ kind: "failed",
3704
+ reason: `old_string only matched via ${describeVia(via)}, and the file has changed on disk since your last read — re-read before applying non-verbatim anchors`
3705
+ });
3706
+ continue;
3707
+ }
3682
3708
  const styledReplacement = styleReplacementForVia(replacement, via, actual);
3683
3709
  current = replaceAll ? current.split(actual).join(styledReplacement) : current.replace(actual, styledReplacement);
3684
3710
  totalReplacements += occurrences;
@@ -3698,10 +3724,14 @@ const multiEdit = {
3698
3724
  ...prior,
3699
3725
  contentHash: hashContent(current),
3700
3726
  mtimeMs: Date.now(),
3701
- elided: true
3727
+ elided: true,
3728
+ staleRejections: 0
3702
3729
  });
3703
3730
  }
3704
- } else ctx.reportOutcome?.("failed");
3731
+ } else {
3732
+ ctx.reportOutcome?.("failed");
3733
+ if (drift) return `multi_edit error: ${target} has changed on disk since the last read. Re-read the file before editing.${staleRefusalHint(noteStaleRejection(drift.readState, drift.absKey, drift.prior))}`;
3734
+ }
3705
3735
  const n = steps.length;
3706
3736
  let header;
3707
3737
  if (appliedCount === n) header = `Edited ${target}: applied ${n} edit${n === 1 ? "" : "s"} (${totalReplacements} replacement${totalReplacements === 1 ? "" : "s"}).`;
@@ -3713,6 +3743,7 @@ const multiEdit = {
3713
3743
  if (o.kind === "failed") failureLines.push(`edit #${i + 1} failed: ${o.reason}`);
3714
3744
  }
3715
3745
  const parts = [header];
3746
+ if (drift && appliedCount > 0) parts.push(`Note: the file had changed on disk since your last read — the applied edits anchored cleanly against the current content, but re-read before further edits.`);
3716
3747
  if (viaNotes.length > 0) parts.push(viaNotes.join("\n"));
3717
3748
  if (failureLines.length > 0) parts.push(failureLines.join("\n"));
3718
3749
  if (failedCount > 0) parts.push(annotationFor(outcomes));
@@ -15918,4 +15949,4 @@ function createAgent(rawOptions) {
15918
15949
  //#endregion
15919
15950
  export { removeInstalledExtension as $, readKeybindings as $t, NO_TOOLS_PREAMBLE as A, looksBinary as At, stripImagesFromTurns as B, validateToolArgs as Bt, resolveTasksDir as C, shouldAutoCompact as Cn, createSkillsRunScriptTool as Ct, selectRecentFiles as D, stableStringify as Dn, shell as Dt, selectFilesFromSession as E, normalizeShellCommand as En, createShellTool as Et, buildTailCompactPrompt as F, listFiles as Ft, EMPTY_EXTENSION_REGISTRY as G, KEYBINDING_KEY_COL_WIDTH as Gt, truncateHeadForPtlRetry as H, DEFAULT_KEYBINDINGS as Ht, buildUpToCompactPrompt as I, createInteractionTool as It, fetchExtensionSource as J, groupBindings as Jt, createExtensionPromptBridge as K, ensureKeybindingsFile as Kt, ANCHOR_PREVIEW_MAX_CHARS as L, grep as Lt, buildCompactPrompt as M, createModelSearchTool as Mt, buildFromCompactPrompt as N, formatModelLine as Nt, compactConversation as O, tailTruncate as Ot, buildFullCompactPrompt as P, matchModelEntries as Pt, readExtensionInstallProvenance as Q, parseBindingSpec as Qt, anchorPreviewFor as R, glob as Rt, resolveSessionDir as S, effectiveContextWindow as Sn, createSkillsUseTool as St, selectFilesFromReadState as T, defaultRepeatGuardTracked as Tn, shellKill as Tt, CompactInvalidInputError as U, KEYBINDING_DEFS as Ut, summaryToTurn as V, resolveStorageDirs as Vt, CompactPromptTooLongError as W, KEYBINDING_DEF_BY_ACTION as Wt, listExtensionCandidates as X, matchesBinding as Xt, installExtensionFromSpec as Y, keybindingsPath as Yt, parseExtensionInstallSource as Z, mergeKeybindings as Zt, rehomePersistedStubs as _, resolveExtensionConfigValue as _n, WAIT_TASK_TIMED_OUT_PREFIX as _t, SHELL_CASCADE_CANCEL_MESSAGE as a, defaultExtensionScanPaths as an, composeExtensionPreset as at, resolveMcpWarningsDir as b, AUTO_COMPACT_MIN_GROWTH_FRACTION as bn, createSpawnTool as bt, applyCompactSummaryCutoff as c, isExtensionDefinition as cn, mergeContributions as ct, PERSISTED_STUB_PREFIX as d, defineExtension as dn, createWorkspaceSurface as dt, readKeybindingsRaw as en, updateInstalledExtension as et, PERSISTENCE_PREVIEW_BYTES as f, clampExtensionConfigNumber as fn, composePresets as ft, migrateSessionArtifactDirs as g, resolveExtensionConfig as gn, writeFile$1 as gt, maybePersistToolResult as h, isValidExtensionConfigValue as hn, basic_default as ht, INTERRUPT_MESSAGE_FOR_TOOL_USE as i, ENTRY_CANDIDATES as in, buildExtensionRegistry as it, TRAILER as j, multiEdit as jt, BASE_INSTRUCTIONS as k, readFile$1 as kt, collectNewlyStaleReadPaths as l, parseExtensionScanPathEnv as ln, partitionExtensionCatalog as lt, cleanupPersistedSession as m, isValidExtensionConfigItem as mn, basicTools as mt, normalizeProviders as n, stripJsonComments as nn, discoverAndBuildExtensionRegistry as nt, TOOL_USE_CANCELLED_MESSAGE as o, discoverExtensions as on, disposeExtensionRegistry as ot, buildPersistedStub as p, coerceExtensionConfigInput as pn, definePreset as pt, ExtensionInstallError as q, formatBindingForDisplay as qt, resolveModelTargets as r, registerExtensionHostModules as rn, buildExtensionPreset as rt, TOOL_USE_SKIPPED_MESSAGE as s, inlineLoadedExtension as sn, filterExtensionRegistry as st, createAgent as t, resolveExtensionKeybindings as tn, createExtensionHud as tt, renderStaleReadNotice as u, scanExtensionDirectories as un, createExtensionHostRuntimeBridge as ut, resolveLegacyPersistDir as v, sanitizeExtensionConfigActionPatch as vn, waitTask as vt, buildPostCompactAttachments as w, defaultRepeatGuardNormalize as wn, createSkillsReadTool as wt, resolvePersistDir as x, OUTPUT_RESERVE_TOKENS as xn, isSpawnTool as xt, resolveLegacySessionDir as y, toWireConfigSchema as yn, createToolSearchTool as yt, sliceForCompaction as z, edit as zt };
15920
15951
 
15921
- //# sourceMappingURL=agent-Emjeo5Ad.js.map
15952
+ //# sourceMappingURL=agent-COHX5SpM.js.map