zidane 6.3.3 → 6.3.4

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 (74) hide show
  1. package/dist/{acp-ohhNwdRs.js → acp-IgXPptYr.js} +5 -5
  2. package/dist/{acp-ohhNwdRs.js.map → acp-IgXPptYr.js.map} +1 -1
  3. package/dist/acp-cli.js +7 -7
  4. package/dist/acp.js +1 -1
  5. package/dist/{agent-CusJwY4-.js → agent-BJuiohV_.js} +55 -55
  6. package/dist/agent-BJuiohV_.js.map +1 -0
  7. package/dist/agent.js +1 -1
  8. package/dist/{anthropic-CLZy29w3.js → anthropic-Drd3842n.js} +3 -3
  9. package/dist/{anthropic-CLZy29w3.js.map → anthropic-Drd3842n.js.map} +1 -1
  10. package/dist/{auth-BlMvqJTC.js → auth-WkdClN2Y.js} +4 -4
  11. package/dist/{auth-BlMvqJTC.js.map → auth-WkdClN2Y.js.map} +1 -1
  12. package/dist/chat.d.ts +15 -13
  13. package/dist/chat.d.ts.map +1 -1
  14. package/dist/chat.js +3 -3
  15. package/dist/{context-transport-10istrQo.js → context-transport-DAjjzK_x.js} +3 -3
  16. package/dist/{context-transport-10istrQo.js.map → context-transport-DAjjzK_x.js.map} +1 -1
  17. package/dist/contexts/daytona.js +8 -3
  18. package/dist/contexts/daytona.js.map +1 -1
  19. package/dist/contexts/docker.d.ts.map +1 -1
  20. package/dist/contexts/docker.js +8 -3
  21. package/dist/contexts/docker.js.map +1 -1
  22. package/dist/contexts/e2b.js +8 -3
  23. package/dist/contexts/e2b.js.map +1 -1
  24. package/dist/{contexts-DbMuUPjS.js → contexts-DWVt7MvF.js} +9 -4
  25. package/dist/contexts-DWVt7MvF.js.map +1 -0
  26. package/dist/contexts.js +1 -1
  27. package/dist/eval.js +2 -2
  28. package/dist/extensions.js +1 -1
  29. package/dist/headless.js +5 -5
  30. package/dist/index.js +9 -9
  31. package/dist/{login-BjY7iWO8.js → login-ClSY8pN6.js} +2 -2
  32. package/dist/{login-BjY7iWO8.js.map → login-ClSY8pN6.js.map} +1 -1
  33. package/dist/{mcp-BpFHFblm.js → mcp-UIBc81Zm.js} +4 -4
  34. package/dist/{mcp-BpFHFblm.js.map → mcp-UIBc81Zm.js.map} +1 -1
  35. package/dist/mcp.js +1 -1
  36. package/dist/{media-sniff-Bn76JxAu.js → media-sniff-UKijEaiQ.js} +2 -2
  37. package/dist/media-sniff-UKijEaiQ.js.map +1 -0
  38. package/dist/{messages-CEM4l9iH.js → messages-B-Zt-_Oz.js} +3 -3
  39. package/dist/{messages-CEM4l9iH.js.map → messages-B-Zt-_Oz.js.map} +1 -1
  40. package/dist/{openai-compat-Ba4nw7ip.js → openai-compat-BF1pSB_F.js} +2 -2
  41. package/dist/{openai-compat-Ba4nw7ip.js.map → openai-compat-BF1pSB_F.js.map} +1 -1
  42. package/dist/presets.js +1 -1
  43. package/dist/providers/anthropic.js +1 -1
  44. package/dist/providers/arcee.js +1 -1
  45. package/dist/providers/baseten.js +1 -1
  46. package/dist/providers/cerebras.js +1 -1
  47. package/dist/providers/local.js +1 -1
  48. package/dist/providers/openai-compat.js +1 -1
  49. package/dist/providers/openai.js +2 -2
  50. package/dist/providers/openrouter.js +1 -1
  51. package/dist/providers/xai.js +1 -1
  52. package/dist/{providers-g1ilD4qo.js → providers-C-lh3sVD.js} +3 -3
  53. package/dist/{providers-g1ilD4qo.js.map → providers-C-lh3sVD.js.map} +1 -1
  54. package/dist/providers.js +4 -4
  55. package/dist/{session-DLX7JXer.js → session-BE9_p0sN.js} +2 -2
  56. package/dist/{session-DLX7JXer.js.map → session-BE9_p0sN.js.map} +1 -1
  57. package/dist/session.js +2 -2
  58. package/dist/{stdio-D73QRG0r.js → stdio-e45MhlYy.js} +2 -2
  59. package/dist/{stdio-D73QRG0r.js.map → stdio-e45MhlYy.js.map} +1 -1
  60. package/dist/{stdio-loader-BaOGqSWc.js → stdio-loader-Bkrs9e8t.js} +2 -2
  61. package/dist/{stdio-loader-BaOGqSWc.js.map → stdio-loader-Bkrs9e8t.js.map} +1 -1
  62. package/dist/tools/web-search.js +2 -2
  63. package/dist/tools/web-search.js.map +1 -1
  64. package/dist/tools.js +1 -1
  65. package/dist/{transcript-anchors-Bi9iZTxT.js → transcript-anchors-9LKsM0OZ.js} +66 -53
  66. package/dist/transcript-anchors-9LKsM0OZ.js.map +1 -0
  67. package/dist/tui.js +9 -9
  68. package/dist/{xai-5LbsIfXn.js → xai-CLqZQdcj.js} +2 -2
  69. package/dist/{xai-5LbsIfXn.js.map → xai-CLqZQdcj.js.map} +1 -1
  70. package/package.json +1 -1
  71. package/dist/agent-CusJwY4-.js.map +0 -1
  72. package/dist/contexts-DbMuUPjS.js.map +0 -1
  73. package/dist/media-sniff-Bn76JxAu.js.map +0 -1
  74. package/dist/transcript-anchors-Bi9iZTxT.js.map +0 -1
package/dist/acp-cli.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import { Lt as resolveStorageDirs, dt as basic_default } from "./agent-CusJwY4-.js";
3
- import { r as createProcessContext } from "./contexts-DbMuUPjS.js";
2
+ import { Lt as resolveStorageDirs, dt as basic_default } from "./agent-BJuiohV_.js";
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-Ba4nw7ip.js";
6
- import { n as anthropic } from "./anthropic-CLZy29w3.js";
5
+ import { m as openaiCompat } from "./openai-compat-BF1pSB_F.js";
6
+ import { n as anthropic } from "./anthropic-Drd3842n.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-5LbsIfXn.js";
10
+ import { t as xai } from "./xai-CLqZQdcj.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-ohhNwdRs.js";
14
- import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-BlMvqJTC.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-IgXPptYr.js";
14
+ import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-WkdClN2Y.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.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-ohhNwdRs.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-IgXPptYr.js";
2
2
  export { AcpProtocolError, JsonRpcRemoteError, acpMcpServersToZidane, acpPromptToPromptParts, createAcpServer, createJsonRpcConnection, runAcpStdioServer, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent, withAcpDefaultTools, wrapToolsForAcpClient };
@@ -7,18 +7,18 @@ 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
9
  import { i as isOutputExceededMessage } from "./output-cap-C9zukcCj.js";
10
- import { r as createProcessContext, t as resolveDetachedTasksCapability } from "./contexts-DbMuUPjS.js";
10
+ import { r as createProcessContext, t as resolveDetachedTasksCapability } from "./contexts-DWVt7MvF.js";
11
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
- import { n as reconcileImageMediaType } from "./media-sniff-Bn76JxAu.js";
17
- import { d as wrapDiscoveredMcpTools, i as deriveMcpToolMeta, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-BpFHFblm.js";
18
- import { C as buildPromptMessage, w as canonicalizePrompt } from "./openai-compat-Ba4nw7ip.js";
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-UIBc81Zm.js";
18
+ import { C as buildPromptMessage, w as canonicalizePrompt } from "./openai-compat-BF1pSB_F.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-CEM4l9iH.js";
21
- import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-DLX7JXer.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-B-Zt-_Oz.js";
21
+ import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-BE9_p0sN.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";
@@ -2490,18 +2490,18 @@ const MAX_PATH_SEGMENT_LENGTH = 255;
2490
2490
  function pathArgError(value, field = "path") {
2491
2491
  for (let i = 0; i < value.length; i++) {
2492
2492
  const c = value.charCodeAt(i);
2493
- if (c < 32 || c === 127) return `invalid \`${field}\`: contains a control character (e.g. a newline) — this usually means reasoning text leaked into the argument. Re-issue the call with a clean file path.`;
2493
+ if (c < 32 || c === 127) return `invalid \`${field}\`: contains a control character (e.g. a newline); this usually means reasoning text leaked into the argument. Re-issue the call with a clean file path.`;
2494
2494
  }
2495
- if (/<\/?think/i.test(value)) return `invalid \`${field}\`: contains a thinking tag — reasoning text leaked into the argument. Re-issue the call with a clean file path.`;
2496
- if (value.length > MAX_PATH_LENGTH) return `invalid \`${field}\`: ${value.length} characters exceeds the filesystem limit of ${MAX_PATH_LENGTH} — this usually means non-path text leaked into the argument. Re-issue the call with a clean file path.`;
2497
- for (const segment of value.split(/[/\\]/)) if (segment.length > MAX_PATH_SEGMENT_LENGTH) return `invalid \`${field}\`: segment "${segment.slice(0, 40)}…" is ${segment.length} characters (filesystem limit: ${MAX_PATH_SEGMENT_LENGTH} per segment) — this usually means non-path text leaked into the argument. Re-issue the call with a clean file path.`;
2495
+ if (/<\/?think/i.test(value)) return `invalid \`${field}\`: contains a thinking tag; reasoning text leaked into the argument. Re-issue the call with a clean file path.`;
2496
+ if (value.length > MAX_PATH_LENGTH) return `invalid \`${field}\`: ${value.length} characters exceeds the filesystem limit of ${MAX_PATH_LENGTH}; this usually means non-path text leaked into the argument. Re-issue the call with a clean file path.`;
2497
+ for (const segment of value.split(/[/\\]/)) if (segment.length > MAX_PATH_SEGMENT_LENGTH) return `invalid \`${field}\`: segment "${segment.slice(0, 40)}…" is ${segment.length} characters (filesystem limit: ${MAX_PATH_SEGMENT_LENGTH} per segment); this usually means non-path text leaked into the argument. Re-issue the call with a clean file path.`;
2498
2498
  }
2499
2499
  function validateToolArgs(input, schema) {
2500
2500
  const required = schema.required ?? [];
2501
2501
  const properties = schema.properties ?? {};
2502
2502
  if (required.length > 0 && Object.keys(input).length === 0) return {
2503
2503
  valid: false,
2504
- error: `Missing required field: ${required[0]} (no arguments received — they may have been lost or truncated in streaming; re-issue the call with all required fields: ${required.join(", ")})`
2504
+ error: `Missing required field: ${required[0]} (no arguments received; they may have been lost or truncated in streaming; re-issue the call with all required fields: ${required.join(", ")})`
2505
2505
  };
2506
2506
  for (const field of required) if (!(field in input) || input[field] === void 0 || input[field] === null) return {
2507
2507
  valid: false,
@@ -2813,7 +2813,7 @@ async function wholeReadRefusal(execution, handle, path, what) {
2813
2813
  const edit = {
2814
2814
  spec: {
2815
2815
  name: "edit",
2816
- description: "Replace exact `old_string` with `new_string` in a file. Fails if `old_string` is not unique unless `replace_all: true`. Prefer over `write_file` for surgical changes — preserves the rest of the file. Tolerates `read_file` line-number prefixes (`<N>\\t…`, `<N>|…`, or `<N>→…`) in `old_string` / `new_string` — they are stripped before matching/writing, so you can paste a numbered chunk verbatim.",
2816
+ description: "Replace exact `old_string` with `new_string` in a file. Fails if `old_string` is not unique unless `replace_all: true`. Prefer over `write_file` for surgical changes: preserves the rest of the file. Tolerates `read_file` line-number prefixes (`<N>\\t…`, `<N>|…`, or `<N>→…`) in `old_string` / `new_string`; they are stripped before matching/writing, so you can paste a numbered chunk verbatim.",
2817
2817
  inputSchema: {
2818
2818
  type: "object",
2819
2819
  properties: {
@@ -2853,7 +2853,7 @@ const edit = {
2853
2853
  }
2854
2854
  if (find === replacement) {
2855
2855
  ctx.reportOutcome?.("failed");
2856
- return `Edit error: old_string and new_string are identical — nothing to change in ${target}.`;
2856
+ return `Edit error: old_string and new_string are identical: nothing to change in ${target}.`;
2857
2857
  }
2858
2858
  if (find.length === 0) {
2859
2859
  ctx.reportOutcome?.("failed");
@@ -2871,7 +2871,7 @@ const edit = {
2871
2871
  const message = errorMessage(err);
2872
2872
  if (isOutputExceededMessage(message)) {
2873
2873
  ctx.reportOutcome?.("failed");
2874
- return `[file too large to edit: ${target} — ${message}. Use shell (sed -i/awk) for targeted in-place changes.]`;
2874
+ return `[file too large to edit: ${target}: ${message}. Use shell (sed -i/awk) for targeted in-place changes.]`;
2875
2875
  }
2876
2876
  const hint = await suggestionFor(ctx.execution, ctx.handle, target);
2877
2877
  ctx.reportOutcome?.("failed");
@@ -3012,7 +3012,7 @@ const glob = {
3012
3012
  },
3013
3013
  metadata: {
3014
3014
  type: "boolean",
3015
- description: "Append size (bytes) and mtime (ISO) per row, tab-separated. Default: true. In-process only — non-process execution contexts always return paths."
3015
+ description: "Append size (bytes) and mtime (ISO) per row, tab-separated. Default: true. In-process only; non-process execution contexts always return paths."
3016
3016
  },
3017
3017
  gitignore: {
3018
3018
  type: "boolean",
@@ -3046,7 +3046,7 @@ const glob = {
3046
3046
  gitignore,
3047
3047
  signal: controller.signal
3048
3048
  }), timeout]);
3049
- if (outcome === "timeout") return `Glob timed out after ${GLOB_TIMEOUT_MS}ms — narrow the pattern (anchor a literal prefix like \`src/**\`) or scope it to a subdirectory.`;
3049
+ if (outcome === "timeout") return `Glob timed out after ${GLOB_TIMEOUT_MS}ms: narrow the pattern (anchor a literal prefix like \`src/**\`) or scope it to a subdirectory.`;
3050
3050
  if (outcome.length === 0) return "(no matches)";
3051
3051
  return outcome.map((entry) => renderEntry(entry, wantMetadata)).join("\n");
3052
3052
  } finally {
@@ -3129,7 +3129,7 @@ const grep = {
3129
3129
  },
3130
3130
  "path": {
3131
3131
  type: "string",
3132
- description: "File or directory to search. Default: \".\". May be absolute or outside the workspace (no confinement — consistent with read_file)."
3132
+ description: "File or directory to search. Default: \".\". May be absolute or outside the workspace (no confinement; consistent with read_file)."
3133
3133
  },
3134
3134
  "glob": {
3135
3135
  type: "string",
@@ -3454,7 +3454,7 @@ const listFiles = {
3454
3454
  isConcurrencySafe: true,
3455
3455
  spec: {
3456
3456
  name: "list_files",
3457
- description: "List the immediate entries (files and subdirectories) at literal directory `path`. Returns a newline-separated list — subdirectories carry a trailing `/` — or `(empty directory)` when the directory exists but is empty. Non-recursive: use `glob` for pattern matching across nested directories.",
3457
+ description: "List the immediate entries (files and subdirectories) at literal directory `path`. Returns a newline-separated list; subdirectories carry a trailing `/`; or `(empty directory)` when the directory exists but is empty. Non-recursive: use `glob` for pattern matching across nested directories.",
3458
3458
  inputSchema: {
3459
3459
  type: "object",
3460
3460
  properties: { path: {
@@ -3473,7 +3473,7 @@ const listFiles = {
3473
3473
  } catch (err) {
3474
3474
  ctx.reportOutcome?.("failed");
3475
3475
  const message = errorMessage(err);
3476
- if (message.includes("ENOTDIR") || message.includes("Not a directory")) return `Not a directory: ${target} — it is a file; use read_file instead.`;
3476
+ if (message.includes("ENOTDIR") || message.includes("Not a directory")) return `Not a directory: ${target}, it is a file; use read_file instead.`;
3477
3477
  if (message.includes("EACCES") || message.includes("EPERM") || message.includes("Permission denied")) return `Permission denied: ${target}.`;
3478
3478
  if (message.includes("ENOENT") || message.includes("No such file")) return `Directory not found: ${target}`;
3479
3479
  return `list_files failed for ${target}: ${message}`;
@@ -3531,7 +3531,7 @@ function createModelSearchTool(models) {
3531
3531
  type: "object",
3532
3532
  properties: { query: {
3533
3533
  type: "string",
3534
- description: "Optional filter — space-separated terms, ALL must match (e.g. \"haiku\" or \"openrouter qwen\")."
3534
+ description: "Optional filter: space-separated terms, ALL must match (e.g. \"haiku\" or \"openrouter qwen\")."
3535
3535
  } },
3536
3536
  additionalProperties: false
3537
3537
  }
@@ -3572,7 +3572,7 @@ function annotationFor(outcomes) {
3572
3572
  const multiEdit = {
3573
3573
  spec: {
3574
3574
  name: "multi_edit",
3575
- description: "Apply a sequential list of edits to a file. Each edit operates on the result of the previous APPLIED edit. Prefer this over multiple `edit` calls when several non-overlapping changes are needed in the same file. Edits run **best-effort**: a per-step failure (`old_string` not found, ambiguous match without `replace_all`, identical strings) is reported in the result but does NOT block the remaining steps. The file is written iff at least one step applied. The result lists per-hunk outcomes (`applied` / `failed`) so the model can re-issue just the failures without resending the whole batch. Each step tolerates `read_file` line-number prefixes (`<N>\\t…`, `<N>|…`, or `<N>→…`) in `old_string` / `new_string`.",
3575
+ description: "Apply a sequential list of edits to a file. Each edit operates on the result of the previous APPLIED edit. Prefer this over multiple `edit` calls when several non-overlapping changes are needed in the same file. Edits run best-effort: a per-step failure (`old_string` not found, ambiguous match without `replace_all`, identical strings) is reported in the result but does NOT block the remaining steps. The file is written iff at least one step applied. The result lists per-hunk outcomes (`applied` / `failed`) so the model can re-issue just the failures without resending the whole batch. Each step tolerates `read_file` line-number prefixes (`<N>\\t…`, `<N>|…`, or `<N>→…`) in `old_string` / `new_string`.",
3576
3576
  inputSchema: {
3577
3577
  type: "object",
3578
3578
  properties: {
@@ -3675,7 +3675,7 @@ const multiEdit = {
3675
3675
  if (occurrences > 1 && !replaceAll) {
3676
3676
  outcomes.push({
3677
3677
  kind: "failed",
3678
- reason: `old_string appears ${occurrences} times — pass replace_all=true on this edit or expand old_string for uniqueness`
3678
+ reason: `old_string appears ${occurrences} times; pass replace_all=true on this edit or expand old_string for uniqueness`
3679
3679
  });
3680
3680
  continue;
3681
3681
  }
@@ -4023,7 +4023,7 @@ function renderTextSlice(raw, opts) {
4023
4023
  if (!linesTruncated && offsetN === 1) return body;
4024
4024
  if (!linesTruncated) return `${body}\n\n…read lines ${offsetN}-${lastLineRead} of ${totalLines}.`;
4025
4025
  if (midLineCut) return `${body}\n\n…truncated mid-line at line ${lastLineRead} (byte cap ${maxBytesN} reached). File has ${totalLines} lines, ${totalBytes} bytes total. Raise maxBytes to read the full line.`;
4026
- return `${body}\n\n…truncated at line ${lastLineRead} (${bytesCut ? `byte cap (${maxBytesN}) reached` : `line limit (${limitN}) reached`}). File has ${totalLines} lines, ${totalBytes} bytes total — re-read with offset=${lastLineRead + 1} to continue.`;
4026
+ return `${body}\n\n…truncated at line ${lastLineRead} (${bytesCut ? `byte cap (${maxBytesN}) reached` : `line limit (${limitN}) reached`}). File has ${totalLines} lines, ${totalBytes} bytes total; re-read with offset=${lastLineRead + 1} to continue.`;
4027
4027
  }
4028
4028
  const readFile$1 = {
4029
4029
  isConcurrencySafe: true,
@@ -4116,7 +4116,7 @@ const readFile$1 = {
4116
4116
  }];
4117
4117
  } catch (err) {
4118
4118
  const hint = await suggestionFor(ctx.execution, ctx.handle, path);
4119
- return `Image read failed: ${path} — ${errorMessage(err)}.${hint}`;
4119
+ return `Image read failed: ${path}: ${errorMessage(err)}.${hint}`;
4120
4120
  }
4121
4121
  }
4122
4122
  const docMedia = documentMediaTypeFor(path);
@@ -4140,7 +4140,7 @@ const readFile$1 = {
4140
4140
  }];
4141
4141
  } catch (err) {
4142
4142
  const hint = await suggestionFor(ctx.execution, ctx.handle, path);
4143
- return `Document read failed: ${path} — ${errorMessage(err)}.${hint}`;
4143
+ return `Document read failed: ${path}: ${errorMessage(err)}.${hint}`;
4144
4144
  }
4145
4145
  }
4146
4146
  const refusal = await wholeReadRefusal(ctx.execution, ctx.handle, path, "read");
@@ -4150,7 +4150,7 @@ const readFile$1 = {
4150
4150
  raw = await ctx.execution.readFile(ctx.handle, path);
4151
4151
  } catch (err) {
4152
4152
  const message = errorMessage(err);
4153
- if (isOutputExceededMessage(message)) return `[file too large to read: ${path} — ${message}. Use shell (head/tail/sed -n/grep) to inspect slices of it.]`;
4153
+ if (isOutputExceededMessage(message)) return `[file too large to read: ${path}: ${message}. Use shell (head/tail/sed -n/grep) to inspect slices of it.]`;
4154
4154
  return `File not found: ${path}.${await suggestionFor(ctx.execution, ctx.handle, path)}`;
4155
4155
  }
4156
4156
  const totalBytes = Buffer.byteLength(raw);
@@ -4178,7 +4178,7 @@ const readFile$1 = {
4178
4178
  const prior = readState.get(absKey);
4179
4179
  if (prior && prior.contentHash === currentHash && prior.offset === offsetForKey && prior.limit === limitForKey && prior.maxBytes === maxBytesForKey && prior.lineNumbers === showLineNumbers && prior.elided !== true) {
4180
4180
  rememberRead();
4181
- return `File ${path} unchanged since the previous read in this session — the prior result above is still current, so this duplicate read was skipped to save tokens.`;
4181
+ return `File ${path} unchanged since the previous read in this session; the prior result above is still current, so this duplicate read was skipped to save tokens.`;
4182
4182
  }
4183
4183
  }
4184
4184
  if (looksBinary(raw)) return `[binary file: ${path}, ${totalBytes} bytes; use shell with hexdump | xxd | od to inspect]`;
@@ -4486,10 +4486,10 @@ const SHELL_SWAP_HINTS = [
4486
4486
  */
4487
4487
  function buildShellDescription({ allowBackground, registeredCanonicals, toolAliases }) {
4488
4488
  const lines = [
4489
- "Execute a shell command from the workspace root (the `Cwd` in your environment) and return its combined stdout/stderr. Every call starts there — `cd` never persists between calls. Use relative paths (`cd src/app && bun test`, `ls docs`), not absolute ones.",
4489
+ "Execute a shell command from the workspace root (the `Cwd` in your environment) and return its combined stdout/stderr. Every call starts there; `cd` never persists between calls. Use relative paths (`cd src/app && bun test`, `ls docs`), not absolute ones.",
4490
4490
  "Output is tail-priority truncated at 32 KiB by default; errors and exit-code summaries live in the tail.",
4491
- "By default each call appends a `(exit N, Nms)` footer and surfaces non-empty stderr in a separate section even on success — set `metadata: false` to return only stdout. Set maxOutputBytes=0 to disable truncation.",
4492
- "Pass a short `description` (5-10 words) explaining the intent of the command — it surfaces in the user-facing transcript so the human can follow your reasoning at a glance. Skip it only for trivial reads where the command speaks for itself."
4491
+ "By default each call appends a `(exit N, Nms)` footer and surfaces non-empty stderr in a separate section even on success; set `metadata: false` to return only stdout. Set maxOutputBytes=0 to disable truncation.",
4492
+ "Pass a short `description` (5-10 words) explaining the intent of the command; it surfaces in the user-facing transcript so the human can follow your reasoning at a glance. Skip it only for trivial reads where the command speaks for itself."
4493
4493
  ];
4494
4494
  if (registeredCanonicals && registeredCanonicals.size > 0) {
4495
4495
  const swaps = [];
@@ -4498,9 +4498,9 @@ function buildShellDescription({ allowBackground, registeredCanonicals, toolAlia
4498
4498
  const wireName = toolAliases?.[canonical] ?? canonical;
4499
4499
  swaps.push(`- ${label}: use \`${wireName}\` (not ${instead})`);
4500
4500
  }
4501
- if (swaps.length > 0) lines.push("", "When a dedicated tool fits, prefer it over shell:", ...swaps, "", "Re-running `ls`/`cat` on the same path is not useful — the prior result is still current unless you wrote to that path since.");
4501
+ if (swaps.length > 0) lines.push("", "When a dedicated tool fits, prefer it over shell:", ...swaps, "", "Re-running `ls`/`cat` on the same path is not useful: the prior result is still current unless you wrote to that path since.");
4502
4502
  }
4503
- if (allowBackground) lines.push("", "Long-running commands (`npm run dev`, `python train.py`, anything that would otherwise block your turn for minutes) → `run_in_background: true`. The call returns immediately with `{ task_id, output_path, pid }`; stdout + stderr stream to the log file at `output_path`.", "", "After spawning a background task: end your current turn (do NOT keep iterating). A `<task-notification>` arrives on the agent's NEXT user-turn with the final status. Polling the log file in a loop wastes tokens and blocks your turn — the notification IS the wake-up. If you NEED to check progress immediately (rare), call `read_file({ path: output_path, ... })` exactly once and decide. To terminate, use `shell_kill({ task_id })`. If — and only if — your very next step depends on the task's outcome, block on it with `wait_task({ task_id })` instead of polling.", "", "When called from inside a `spawn`'d subagent: you have NO next user-turn — your `agent.run` ends as soon as you finish responding. Start the background task, return a brief summary including the `task_id`, and end your turn. Ownership of the task is transferred to the parent agent when your run finishes; the parent will see the notification on ITS next user-turn.");
4503
+ if (allowBackground) lines.push("", "Long-running commands (`npm run dev`, `python train.py`, anything that would otherwise block your turn for minutes) → `run_in_background: true`. The call returns immediately with `{ task_id, output_path, pid }`; stdout + stderr stream to the log file at `output_path`.", "", "After spawning a background task: end your current turn (do NOT keep iterating). A `<task-notification>` arrives on the agent's NEXT user-turn with the final status. Polling the log file in a loop wastes tokens and blocks your turn: the notification IS the wake-up. If you NEED to check progress immediately (rare), call `read_file({ path: output_path, ... })` exactly once and decide. To terminate, use `shell_kill({ task_id })`. If, and only if, your very next step depends on the task's outcome, block on it with `wait_task({ task_id })` instead of polling.", "", "When called from inside a `spawn`'d subagent: you have NO next user-turn; your `agent.run` ends as soon as you finish responding. Start the background task, return a brief summary including the `task_id`, and end your turn. Ownership of the task is transferred to the parent agent when your run finishes; the parent will see the notification on ITS next user-turn.");
4504
4504
  return lines.join("\n");
4505
4505
  }
4506
4506
  /**
@@ -4633,7 +4633,7 @@ function redundantAbsoluteCd(command, cwd) {
4633
4633
  function absoluteCdNote(command, cwd) {
4634
4634
  const rel = redundantAbsoluteCd(command, cwd);
4635
4635
  if (rel === null) return "";
4636
- return rel === "" ? "\n(note: every call already runs at the workspace root — this `cd` is redundant)" : `\n(note: every call already runs at the workspace root — \`cd ${rel}\` suffices)`;
4636
+ return rel === "" ? "\n(note: every call already runs at the workspace root; this `cd` is redundant)" : `\n(note: every call already runs at the workspace root; \`cd ${rel}\` suffices)`;
4637
4637
  }
4638
4638
  /**
4639
4639
  * Default `shell` tool with background mode enabled.
@@ -4671,7 +4671,7 @@ const shell = createShellTool({ allowBackground: true });
4671
4671
  */
4672
4672
  async function runBackground(command, ctx) {
4673
4673
  const tasksDir = ctx.behavior?.tasksDir;
4674
- if (typeof tasksDir !== "string" || tasksDir.length === 0) return "shell error: background mode requires `behavior.tasksDir` to be set on the agent. The host has not opted into background tasks — either fall back to foreground (drop `run_in_background`) or ask the user to enable it.";
4674
+ if (typeof tasksDir !== "string" || tasksDir.length === 0) return "shell error: background mode requires `behavior.tasksDir` to be set on the agent. The host has not opted into background tasks: either fall back to foreground (drop `run_in_background`) or ask the user to enable it.";
4675
4675
  if (!ctx.execution.execBackground) return `shell error: the active execution context (${ctx.execution.type}) does not support background tasks. Fall back to foreground (drop \`run_in_background\`).`;
4676
4676
  try {
4677
4677
  const outputCap = ctx.behavior?.backgroundOutputCap;
@@ -4704,7 +4704,7 @@ async function runBackground(command, ctx) {
4704
4704
  if (process.env.ZIDANE_DEBUG) process.stderr.write(`[zidane/shell] background:start hook rejected: ${err instanceof Error ? err.message : String(err)}\n`);
4705
4705
  });
4706
4706
  const cmdPreview = previewLine(command, 60);
4707
- const wakeupHint = (ctx.depth ?? 0) > 0 ? "You are inside a `spawn`'d subagent — you have NO next user-turn to receive the notification on. Return a brief summary INCLUDING this task_id and end your turn now. Ownership of the task transfers to the parent agent when your run completes; the parent will see the `<task-notification>` on its next user-turn." : "The task is running in the background. You'll receive a <task-notification> on your NEXT user-turn with the final status. End your current turn now — do NOT poll the output file in a loop, the notification IS the wake-up. To inspect progress, call `read_file({ path: <output> })` once. To terminate, use `shell_kill({ task_id })`.";
4707
+ const wakeupHint = (ctx.depth ?? 0) > 0 ? "You are inside a `spawn`'d subagent: you have NO next user-turn to receive the notification on. Return a brief summary INCLUDING this task_id and end your turn now. Ownership of the task transfers to the parent agent when your run completes; the parent will see the `<task-notification>` on its next user-turn." : "The task is running in the background. You'll receive a <task-notification> on your NEXT user-turn with the final status. End your current turn now; do NOT poll the output file in a loop, the notification IS the wake-up. To inspect progress, call `read_file({ path: <output> })` once. To terminate, use `shell_kill({ task_id })`.";
4708
4708
  return [
4709
4709
  `Started ${handle.taskId} (pid ${handle.pid}).`,
4710
4710
  ` command: ${cmdPreview}`,
@@ -4731,7 +4731,7 @@ const shellKill = {
4731
4731
  "Terminate a running background task started by `shell({ run_in_background: true })`.",
4732
4732
  "Sends SIGTERM to the whole process group so the shell wrapper AND its child commands die together.",
4733
4733
  "Returns the final exit info (status, exit code, output path) or a \"no such task\" message when the id is unknown / already cleaned up.",
4734
- "Idempotent — calling on a task that has already terminated returns the cached exit info without re-killing."
4734
+ "Idempotent: calling on a task that has already terminated returns the cached exit info without re-killing."
4735
4735
  ].join("\n"),
4736
4736
  inputSchema: {
4737
4737
  type: "object",
@@ -4749,7 +4749,7 @@ const shellKill = {
4749
4749
  const info = await ctx.execution.killBackground(ctx.handle, taskId);
4750
4750
  if (!info) return `shell_kill: no such task "${taskId}". It may have already exited and been cleaned up, or it was never started in this session.`;
4751
4751
  return [
4752
- `Killed ${info.taskId} — ${formatTaskStatus(info)} after ${formatDuration(info.durationMs)}.`,
4752
+ `Killed ${info.taskId}: ${formatTaskStatus(info)} after ${formatDuration(info.durationMs)}.`,
4753
4753
  ` command: ${previewLine(info.command, 60)}`,
4754
4754
  ` output: ${info.outputPath}`
4755
4755
  ].join("\n");
@@ -4908,7 +4908,7 @@ function createSkillsUseTool(options) {
4908
4908
  return {
4909
4909
  spec: {
4910
4910
  name: "skills_use",
4911
- description: "Activate or deactivate a specialized skill. Call with `mode: \"activate\"` (default) to load a skill's full instructions when a task matches its catalog description. Call with `mode: \"deactivate\"` to release a skill whose allowed-tools restrictions are now in the way — e.g. when the skill's work is done or the active skill is blocking unrelated tool calls. After activating, follow the returned instructions; use skills_read to load referenced files and skills_run_script to execute bundled scripts.",
4911
+ description: "Activate or deactivate a specialized skill. Call with `mode: \"activate\"` (default) to load a skill's full instructions when a task matches its catalog description. Call with `mode: \"deactivate\"` to release a skill whose allowed-tools restrictions are now in the way, e.g. when the skill's work is done or the active skill is blocking unrelated tool calls. After activating, follow the returned instructions; use skills_read to load referenced files and skills_run_script to execute bundled scripts.",
4912
4912
  inputSchema: {
4913
4913
  type: "object",
4914
4914
  properties: {
@@ -4933,16 +4933,16 @@ function createSkillsUseTool(options) {
4933
4933
  if (!skill) return `Error: unknown skill "${skillName}". Available skills: ${[...byName.keys()].join(", ") || "<none>"}.`;
4934
4934
  if ((input.mode ?? "activate") === "deactivate") {
4935
4935
  const removed = options.state.deactivate(skillName);
4936
- if (!removed) return `Skill "${skillName}" was not active — nothing to deactivate.`;
4936
+ if (!removed) return `Skill "${skillName}" was not active: nothing to deactivate.`;
4937
4937
  await options.hooks.callHook("skills:deactivate", {
4938
4938
  skill: removed.skill,
4939
4939
  reason: "model"
4940
4940
  });
4941
4941
  const remaining = options.state.active().map((a) => a.skill.name);
4942
- return `Skill "${skillName}" deactivated — its allowed-tools restrictions no longer apply.${remaining.length > 0 ? ` Remaining active skills: ${remaining.join(", ")}.` : " No skills are currently active."}`;
4942
+ return `Skill "${skillName}" deactivated: its allowed-tools restrictions no longer apply.${remaining.length > 0 ? ` Remaining active skills: ${remaining.join(", ")}.` : " No skills are currently active."}`;
4943
4943
  }
4944
4944
  if (!options.state.isActive(skillName)) {
4945
- if (options.state.activate(skill, "model") === "cap-reached") return `Error: cannot activate "${skillName}" — the maxActive skill cap has been reached. Currently active: ${options.state.active().map((a) => a.skill.name).join(", ")}. Call \`skills_use\` with \`mode: "deactivate"\` and one of those names first.`;
4945
+ if (options.state.activate(skill, "model") === "cap-reached") return `Error: cannot activate "${skillName}": the maxActive skill cap has been reached. Currently active: ${options.state.active().map((a) => a.skill.name).join(", ")}. Call \`skills_use\` with \`mode: "deactivate"\` and one of those names first.`;
4946
4946
  await options.hooks.callHook("skills:activate", {
4947
4947
  skill,
4948
4948
  via: "model"
@@ -4962,7 +4962,7 @@ function createSkillsUseTool(options) {
4962
4962
  command
4963
4963
  }) } : {}
4964
4964
  });
4965
- if (failures.length > 0) body += `\n\nWarning: ${failures.length} shell interpolation command${failures.length === 1 ? "" : "s"} failed during activation (${failures.map((c) => `\`${c}\``).join(", ")}). The instructions above may be missing dynamic content — see the inline [command failed …] markers.`;
4965
+ if (failures.length > 0) body += `\n\nWarning: ${failures.length} shell interpolation command${failures.length === 1 ? "" : "s"} failed during activation (${failures.map((c) => `\`${c}\``).join(", ")}). The instructions above may be missing dynamic content; see the inline [command failed …] markers.`;
4966
4966
  } else body = stripShellInterpolations(skill.instructions);
4967
4967
  interpolatedBodyCache.set(skillName, body);
4968
4968
  }
@@ -5198,7 +5198,7 @@ const EMBEDDED_CATALOG_MAX = 8;
5198
5198
  function buildModelFieldDescription(catalog) {
5199
5199
  const doctrine = "Optional model id to run the child on. Cost-tier your delegation: mechanical, parallelizable, or high-volume search work suits cheaper/faster models; keep synthesis and final judgment on your own model. Omit to inherit your model.";
5200
5200
  if (catalog.length <= EMBEDDED_CATALOG_MAX) return `${doctrine}\nAvailable:\n${catalog.map((e) => `- ${formatModelLine(e)}`).join("\n")}`;
5201
- return `${doctrine}\n${catalog.length} models are available — call \`model_search\` to browse ids, pricing, and context windows.`;
5201
+ return `${doctrine}\n${catalog.length} models are available: call \`model_search\` to browse ids, pricing, and context windows.`;
5202
5202
  }
5203
5203
  /**
5204
5204
  * Resolve a catalog entry's `Provider.name` against the run's provider
@@ -5415,7 +5415,7 @@ function buildSpawnTool(options, state) {
5415
5415
  isConcurrencySafe: true,
5416
5416
  spec: {
5417
5417
  name: "spawn",
5418
- description: `Spawn a sub-agent for a self-contained task that benefits from isolation (separate context window, separate retries) — for example, a deep research dive or a long codegen pass on a specific file. The sub-agent inherits your tool set (including \`spawn\` itself, depth-capped) and your system prompt unless overridden, runs independently, and returns its final response. Do NOT spawn for sequential steps you could do yourself.${modelCatalog ? " Children can run on a DIFFERENT model via the `model` field — cost-tier your delegation: mechanical, parallelizable, or high-volume search work belongs on cheaper/faster models, while synthesis and judgment stay on your own model." : ""}${options.persist ? " A stopped or failed sub-agent can be CONTINUED instead of restarted: pass `resume` with its child label (e.g. \"child-2\") and put the continuation instruction in `task` — the child picks up with its prior conversation intact." : ""}`,
5418
+ description: `Spawn a sub-agent for a self-contained task that benefits from isolation (separate context window, separate retries): for example, a deep research dive or a long codegen pass on a specific file. The sub-agent inherits your tool set (including \`spawn\` itself, depth-capped) and your system prompt unless overridden, runs independently, and returns its final response. Do NOT spawn for sequential steps you could do yourself.${modelCatalog ? " Children can run on a DIFFERENT model via the `model` field: cost-tier your delegation: mechanical, parallelizable, or high-volume search work belongs on cheaper/faster models, while synthesis and judgment stay on your own model." : ""}${options.persist ? " A stopped or failed sub-agent can be CONTINUED instead of restarted: pass `resume` with its child label (e.g. \"child-2\") and put the continuation instruction in `task`; the child picks up with its prior conversation intact." : ""}`,
5419
5419
  inputSchema: {
5420
5420
  type: "object",
5421
5421
  properties: {
@@ -5425,7 +5425,7 @@ function buildSpawnTool(options, state) {
5425
5425
  },
5426
5426
  system: {
5427
5427
  type: "string",
5428
- description: "Optional system prompt override for this specific sub-agent. REPLACES the entire inherited system prompt — identity, doctrine, and environment info (cwd, platform, date) are all lost. Prefer omitting this and putting specialization in `task`; if you do override, restate the working directory and any constraints the child must keep."
5428
+ description: "Optional system prompt override for this specific sub-agent. REPLACES the entire inherited system prompt: identity, doctrine, and environment info (cwd, platform, date) are all lost. Prefer omitting this and putting specialization in `task`; if you do override, restate the working directory and any constraints the child must keep."
5429
5429
  },
5430
5430
  ...subagentTypeProperty,
5431
5431
  ...modelProperty,
@@ -5449,7 +5449,7 @@ function buildSpawnTool(options, state) {
5449
5449
  return {
5450
5450
  status: "rejected",
5451
5451
  text: "",
5452
- message: `Cannot spawn: unknown model "${requestedModel}". ${near.length > 0 ? "Closest matches" : "Available"}: ${shown.map((e) => e.model.id).join(", ")}${modelCatalog.length > shown.length ? ` … (${modelCatalog.length} total — use model_search to browse)` : ""}`
5452
+ message: `Cannot spawn: unknown model "${requestedModel}". ${near.length > 0 ? "Closest matches" : "Available"}: ${shown.map((e) => e.model.id).join(", ")}${modelCatalog.length > shown.length ? ` … (${modelCatalog.length} total; use model_search to browse)` : ""}`
5453
5453
  };
5454
5454
  }
5455
5455
  const chosenModelId = requestedModel ?? subagentDef?.model ?? options.model;
@@ -5473,13 +5473,13 @@ function buildSpawnTool(options, state) {
5473
5473
  if (typeof input.resume !== "string" || input.resume.trim() === "") return {
5474
5474
  status: "rejected",
5475
5475
  text: "",
5476
- message: `Cannot resume: invalid resume value ${JSON.stringify(input.resume)} — pass a child label like "child-2".`
5476
+ message: `Cannot resume: invalid resume value ${JSON.stringify(input.resume)}; pass a child label like "child-2".`
5477
5477
  };
5478
5478
  const wanted = input.resume.trim();
5479
5479
  if (!options.persist || !ctx.session) return {
5480
5480
  status: "rejected",
5481
5481
  text: "",
5482
- message: "Cannot resume: resuming a sub-agent requires the spawn tool to be configured with persist: true and the parent to have a session — no prior child turns are stored here."
5482
+ message: "Cannot resume: resuming a sub-agent requires the spawn tool to be configured with persist: true and the parent to have a session; no prior child turns are stored here."
5483
5483
  };
5484
5484
  const childRuns = childRunsOf(ctx.session);
5485
5485
  let index = childRuns.findIndex((r) => r.label === wanted);
@@ -5524,7 +5524,7 @@ function buildSpawnTool(options, state) {
5524
5524
  if (ctx.signal.aborted) return {
5525
5525
  status: "aborted",
5526
5526
  text: "",
5527
- message: `[sub-agent pre-aborted] Parent signal was already aborted — skipped "${task.slice(0, 80)}"`
5527
+ message: `[sub-agent pre-aborted] Parent signal was already aborted: skipped "${task.slice(0, 80)}"`
5528
5528
  };
5529
5529
  const id = ctx.session ? reserveChildLabel(ctx.session) : `child-${++state.counter}`;
5530
5530
  state.activeCount++;
@@ -5863,7 +5863,7 @@ function createToolSearchTool(options) {
5863
5863
  isConcurrencySafe: true,
5864
5864
  spec: {
5865
5865
  name: "tool_search",
5866
- description: "Discover and load schemas for additional tools listed in <searchable_tools>. Tools listed there are advertised by name + description only — their input schemas are not loaded into context until you surface them through this tool. Pass `query` for a substring search, `names` to load specific tools, or `server` to load every tool from one MCP server. Returned tools become callable for the rest of this run.",
5866
+ description: "Discover and load schemas for additional tools listed in <searchable_tools>. Tools listed there are advertised by name + description only; their input schemas are not loaded into context until you surface them through this tool. Pass `query` for a substring search, `names` to load specific tools, or `server` to load every tool from one MCP server. Returned tools become callable for the rest of this run.",
5867
5867
  inputSchema: {
5868
5868
  type: "object",
5869
5869
  properties: {
@@ -5878,7 +5878,7 @@ function createToolSearchTool(options) {
5878
5878
  },
5879
5879
  server: {
5880
5880
  type: "string",
5881
- description: "MCP server name — load every tool from this server."
5881
+ description: "MCP server name: load every tool from this server."
5882
5882
  },
5883
5883
  limit: {
5884
5884
  type: "integer",
@@ -5906,7 +5906,7 @@ function createToolSearchTool(options) {
5906
5906
  for (const entry of shown) parts.push(formatMatch(entry));
5907
5907
  parts.push("");
5908
5908
  parts.push(" These tools are now callable. Invoke them by name in subsequent turns.");
5909
- if (truncated) parts.push(` ${total - shown.length} additional matches were truncated — refine the query or raise \`limit\`.`);
5909
+ if (truncated) parts.push(` ${total - shown.length} additional matches were truncated; refine the query or raise \`limit\`.`);
5910
5910
  }
5911
5911
  if (misses.length > 0) parts.push(` <misses>${misses.map(escapeXml).join(", ")}</misses>`);
5912
5912
  parts.push("</tool_search_results>");
@@ -5960,7 +5960,7 @@ const waitTask = {
5960
5960
  timeoutMs,
5961
5961
  signal: ctx.signal
5962
5962
  });
5963
- if (!info) return [`${WAIT_TASK_TIMED_OUT_PREFIX} after ${formatDuration(timeoutMs)} — ${taskId} is still running.`, "You can wait again with a longer timeout, continue with other work (a `<task-notification>` arrives when it exits), or terminate it with `shell_kill`."].join("\n");
5963
+ if (!info) return [`${WAIT_TASK_TIMED_OUT_PREFIX} after ${formatDuration(timeoutMs)}: ${taskId} is still running.`, "You can wait again with a longer timeout, continue with other work (a `<task-notification>` arrives when it exits), or terminate it with `shell_kill`."].join("\n");
5964
5964
  return [
5965
5965
  `Task ${info.taskId} ${formatTaskStatus(info)} after ${formatDuration(info.durationMs)}.`,
5966
5966
  ` command: ${previewLine(info.command, 60)}`,
@@ -5988,7 +5988,7 @@ const waitTask = {
5988
5988
  const writeFile$1 = {
5989
5989
  spec: {
5990
5990
  name: "write_file",
5991
- description: "Write `content` to `path`, creating any missing parent directories. Overwrites existing files in full; prefer `edit` / `multi_edit` for surgical changes when you only want to alter part of a file. Returns one of: `Created <path> (N bytes)` (file did not exist), `Updated <path> (N bytes)` (content differed), or `No change needed: <path> already at target state (N bytes)` — so the model can detect no-ops without a separate `read_file`.",
5991
+ description: "Write `content` to `path`, creating any missing parent directories. Overwrites existing files in full; prefer `edit` / `multi_edit` for surgical changes when you only want to alter part of a file. Returns one of: `Created <path> (N bytes)` (file did not exist), `Updated <path> (N bytes)` (content differed), or `No change needed: <path> already at target state (N bytes)`, so the model can detect no-ops without a separate `read_file`.",
5992
5992
  inputSchema: {
5993
5993
  type: "object",
5994
5994
  properties: {
@@ -15705,4 +15705,4 @@ function createAgent(rawOptions) {
15705
15705
  //#endregion
15706
15706
  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 };
15707
15707
 
15708
- //# sourceMappingURL=agent-CusJwY4-.js.map
15708
+ //# sourceMappingURL=agent-BJuiohV_.js.map