zidane 6.3.2 → 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.
- package/dist/{acp-CNnevGOW.js → acp-IgXPptYr.js} +5 -5
- package/dist/{acp-CNnevGOW.js.map → acp-IgXPptYr.js.map} +1 -1
- package/dist/acp-cli.js +7 -7
- package/dist/acp.d.ts +1 -1
- package/dist/acp.js +1 -1
- package/dist/{agent-C5cHuI0r.js → agent-BJuiohV_.js} +81 -56
- package/dist/agent-BJuiohV_.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/{anthropic-DdDVf39o.js → anthropic-Drd3842n.js} +3 -3
- package/dist/{anthropic-DdDVf39o.js.map → anthropic-Drd3842n.js.map} +1 -1
- package/dist/{auth-C2vaeVqG.js → auth-WkdClN2Y.js} +4 -4
- package/dist/{auth-C2vaeVqG.js.map → auth-WkdClN2Y.js.map} +1 -1
- package/dist/chat/pure.d.ts +4 -4
- package/dist/chat/pure.js +2 -2
- package/dist/chat.d.ts +19 -17
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +5 -5
- package/dist/{context-transport-CkiORGgx.js → context-transport-DAjjzK_x.js} +3 -3
- package/dist/{context-transport-CkiORGgx.js.map → context-transport-DAjjzK_x.js.map} +1 -1
- package/dist/contexts/daytona.d.ts +1 -1
- package/dist/contexts/daytona.js +8 -3
- package/dist/contexts/daytona.js.map +1 -1
- package/dist/contexts/docker.d.ts.map +1 -1
- package/dist/contexts/docker.js +8 -3
- package/dist/contexts/docker.js.map +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/contexts/e2b.js +8 -3
- package/dist/contexts/e2b.js.map +1 -1
- package/dist/{contexts-DbMuUPjS.js → contexts-DWVt7MvF.js} +9 -4
- package/dist/contexts-DWVt7MvF.js.map +1 -0
- package/dist/contexts.js +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +2 -2
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +6 -5
- package/dist/headless.js.map +1 -1
- package/dist/{index-BT4Q1nLD.d.ts → index-D-DPqXxU.d.ts} +26 -3
- package/dist/index-D-DPqXxU.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -10
- package/dist/{inline-autocomplete-CbcdZpfC.js → inline-autocomplete-DC2cxprN.js} +6 -6
- package/dist/{inline-autocomplete-CbcdZpfC.js.map → inline-autocomplete-DC2cxprN.js.map} +1 -1
- package/dist/{login-b2sxfknZ.js → login-ClSY8pN6.js} +2 -2
- package/dist/{login-b2sxfknZ.js.map → login-ClSY8pN6.js.map} +1 -1
- package/dist/{mcp-DvvV6xub.js → mcp-UIBc81Zm.js} +4 -4
- package/dist/{mcp-DvvV6xub.js.map → mcp-UIBc81Zm.js.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/{media-sniff-Bn76JxAu.js → media-sniff-UKijEaiQ.js} +2 -2
- package/dist/media-sniff-UKijEaiQ.js.map +1 -0
- package/dist/{messages-TVh_iU9W.js → messages-B-Zt-_Oz.js} +12 -8
- package/dist/messages-B-Zt-_Oz.js.map +1 -0
- package/dist/{openai-compat-Ba4nw7ip.js → openai-compat-BF1pSB_F.js} +2 -2
- package/dist/{openai-compat-Ba4nw7ip.js.map → openai-compat-BF1pSB_F.js.map} +1 -1
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.js +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/arcee.js +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/baseten.js +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/cerebras.js +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/local.js +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai-compat.js +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +2 -2
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +1 -1
- package/dist/{providers-g1ilD4qo.js → providers-C-lh3sVD.js} +3 -3
- package/dist/{providers-g1ilD4qo.js.map → providers-C-lh3sVD.js.map} +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/restate.d.ts +1 -1
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/{session-CFwkU19n.js → session-BE9_p0sN.js} +2 -2
- package/dist/{session-CFwkU19n.js.map → session-BE9_p0sN.js.map} +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.js +2 -2
- package/dist/skills.d.ts +1 -1
- package/dist/{stdio-DUu_loK-.js → stdio-e45MhlYy.js} +2 -2
- package/dist/{stdio-DUu_loK-.js.map → stdio-e45MhlYy.js.map} +1 -1
- package/dist/{stdio-loader-LlzejufT.js → stdio-loader-Bkrs9e8t.js} +2 -2
- package/dist/{stdio-loader-LlzejufT.js.map → stdio-loader-Bkrs9e8t.js.map} +1 -1
- package/dist/{tool-formatters-CHz3OpkJ.d.ts → tool-formatters-BX9TaWAr.d.ts} +31 -3
- package/dist/tool-formatters-BX9TaWAr.d.ts.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/tools/web-search.js +2 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +1 -1
- package/dist/{transcript-anchors-D2RZPaGf.js → transcript-anchors-9LKsM0OZ.js} +69 -56
- package/dist/transcript-anchors-9LKsM0OZ.js.map +1 -0
- package/dist/{transcript-anchors-BnG23uzH.d.ts → transcript-anchors-BpCQElT6.d.ts} +2 -2
- package/dist/transcript-anchors-BpCQElT6.d.ts.map +1 -0
- package/dist/tui.d.ts +3 -3
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +80 -26
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-CtEpeB_s.js → turn-operations-CBdrdYiF.js} +56 -2
- package/dist/turn-operations-CBdrdYiF.js.map +1 -0
- package/dist/{turn-operations-BjkxnZL_.d.ts → turn-operations-C_bn9UmE.d.ts} +3 -3
- package/dist/{turn-operations-BjkxnZL_.d.ts.map → turn-operations-C_bn9UmE.d.ts.map} +1 -1
- package/dist/types-BIarq1qE.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/{xai-5LbsIfXn.js → xai-CLqZQdcj.js} +2 -2
- package/dist/{xai-5LbsIfXn.js.map → xai-CLqZQdcj.js.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-C5cHuI0r.js.map +0 -1
- package/dist/contexts-DbMuUPjS.js.map +0 -1
- package/dist/index-BT4Q1nLD.d.ts.map +0 -1
- package/dist/media-sniff-Bn76JxAu.js.map +0 -1
- package/dist/messages-TVh_iU9W.js.map +0 -1
- package/dist/tool-formatters-CHz3OpkJ.d.ts.map +0 -1
- package/dist/transcript-anchors-BnG23uzH.d.ts.map +0 -1
- package/dist/transcript-anchors-D2RZPaGf.js.map +0 -1
- package/dist/turn-operations-CtEpeB_s.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-
|
|
3
|
-
import { r as createProcessContext } from "./contexts-
|
|
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-
|
|
6
|
-
import { n as anthropic } from "./anthropic-
|
|
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-
|
|
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-
|
|
14
|
-
import { f as credKeyOf, i as readCredentials, l as BUILTIN_PROVIDERS, r as credentialsPath, t as detectAuth, y as modelsForDescriptor } from "./auth-
|
|
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.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as ExecutionContext } from "./types-DdZMQxfT.js";
|
|
2
|
-
import { Im as ToolDef, Qp as PromptPart, Ri as Agent, Sm as ToolResultContent, Vi as AgentOptions, Vp as McpServerConfig, Zd as Provider, ah as SessionStore, jm as TurnUsage, sm as SessionContentBlock, t as Preset, th as Session, wp as AgentBehavior } from "./index-
|
|
2
|
+
import { Im as ToolDef, Qp as PromptPart, Ri as Agent, Sm as ToolResultContent, Vi as AgentOptions, Vp as McpServerConfig, Zd as Provider, ah as SessionStore, jm as TurnUsage, sm as SessionContentBlock, t as Preset, th as Session, wp as AgentBehavior } from "./index-D-DPqXxU.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-
|
|
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-
|
|
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-
|
|
17
|
-
import { d as wrapDiscoveredMcpTools, i as deriveMcpToolMeta, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-
|
|
18
|
-
import { C as buildPromptMessage, w as canonicalizePrompt } from "./openai-compat-
|
|
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-
|
|
21
|
-
import { a as getExtensionSessionState, c as setExtensionSessionState, l as withExtensionSession, n as currentExtensionSession, r as deleteExtensionSessionState, s as resumeChainRunIds } from "./session-
|
|
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)
|
|
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
|
|
2496
|
-
if (value.length > MAX_PATH_LENGTH) return `invalid \`${field}\`: ${value.length} characters exceeds the filesystem limit of ${MAX_PATH_LENGTH}
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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}
|
|
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}
|
|
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
|
|
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
|
|
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
|
|
4492
|
-
"Pass a short `description` (5-10 words) explaining the intent of the command
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
|
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
|
|
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
|
|
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}"
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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)}
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)}
|
|
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)
|
|
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: {
|
|
@@ -10628,6 +10628,8 @@ async function runLoop(ctx) {
|
|
|
10628
10628
|
let consecutiveEmptyPauseTurns = 0;
|
|
10629
10629
|
const maxConsecutiveLengthResumes = 8;
|
|
10630
10630
|
let consecutiveLengthResumes = 0;
|
|
10631
|
+
const maxConsecutiveRefusalResumes = ctx.maxConsecutiveRefusalResumes ?? 3;
|
|
10632
|
+
let consecutiveRefusalResumes = 0;
|
|
10631
10633
|
const wallDeadlineActive = typeof ctx.maxWallMs === "number" && Number.isFinite(ctx.maxWallMs) && ctx.maxWallMs > 0;
|
|
10632
10634
|
const wallStartMs = wallDeadlineActive ? await ctx.clock.now() : 0;
|
|
10633
10635
|
const maxTurnsWarnAt = Number.isFinite(maxTurns) && typeof ctx.maxTurnsWarning === "number" && Number.isFinite(ctx.maxTurnsWarning) && ctx.maxTurnsWarning > 0 && ctx.maxTurnsWarning < maxTurns ? Math.floor(ctx.maxTurnsWarning) : void 0;
|
|
@@ -10688,6 +10690,10 @@ async function runLoop(ctx) {
|
|
|
10688
10690
|
consecutiveLengthResumes += 1;
|
|
10689
10691
|
if (consecutiveLengthResumes >= maxConsecutiveLengthResumes) break;
|
|
10690
10692
|
} else consecutiveLengthResumes = 0;
|
|
10693
|
+
if (result.refusalResumed) {
|
|
10694
|
+
consecutiveRefusalResumes += 1;
|
|
10695
|
+
if (consecutiveRefusalResumes >= maxConsecutiveRefusalResumes) break;
|
|
10696
|
+
} else consecutiveRefusalResumes = 0;
|
|
10691
10697
|
if (ctx.signal.aborted) {
|
|
10692
10698
|
await ctx.hooks.callHook("agent:abort", buildAbortCtx(ctx));
|
|
10693
10699
|
break;
|
|
@@ -12046,6 +12052,23 @@ async function executeTurn(ctx, turn, priorUsage) {
|
|
|
12046
12052
|
lengthTruncated: true
|
|
12047
12053
|
};
|
|
12048
12054
|
}
|
|
12055
|
+
if (result.usage.finishReason === "content-filter" && canonicalToolCalls.length === 0 && !ctx.signal.aborted && (ctx.maxConsecutiveRefusalResumes ?? 3) > 0) {
|
|
12056
|
+
const continueMsg = ctx.provider.userMessage("The previous response was interrupted by the provider (refusal stop). Please continue with the task.");
|
|
12057
|
+
ctx.turns.push({
|
|
12058
|
+
id: await ctx.generateTurnId(),
|
|
12059
|
+
runId: ctx.runId,
|
|
12060
|
+
role: continueMsg.role,
|
|
12061
|
+
content: continueMsg.content,
|
|
12062
|
+
createdAt: await ctx.clock.now(),
|
|
12063
|
+
display: "⚠ provider refusal — auto-continue"
|
|
12064
|
+
});
|
|
12065
|
+
return {
|
|
12066
|
+
ended: false,
|
|
12067
|
+
turnId,
|
|
12068
|
+
usage: result.usage,
|
|
12069
|
+
refusalResumed: true
|
|
12070
|
+
};
|
|
12071
|
+
}
|
|
12049
12072
|
if (result.done) {
|
|
12050
12073
|
if (ctx.schema && !ctx.signal.aborted) {
|
|
12051
12074
|
const enforcement = await enforceSchemaOutput(ctx, turnId);
|
|
@@ -13773,6 +13796,7 @@ function resolveBehavior(agentBehavior, runBehavior) {
|
|
|
13773
13796
|
strictToolPairing: runBehavior?.strictToolPairing ?? agentBehavior?.strictToolPairing ?? false,
|
|
13774
13797
|
maxPairingRepairsPerTurn: runBehavior?.maxPairingRepairsPerTurn ?? agentBehavior?.maxPairingRepairsPerTurn,
|
|
13775
13798
|
maxConsecutivePauseTurns: runBehavior?.maxConsecutivePauseTurns ?? agentBehavior?.maxConsecutivePauseTurns,
|
|
13799
|
+
maxConsecutiveRefusalResumes: runBehavior?.maxConsecutiveRefusalResumes ?? agentBehavior?.maxConsecutiveRefusalResumes,
|
|
13776
13800
|
resumeOnMaxTokens: runBehavior?.resumeOnMaxTokens ?? agentBehavior?.resumeOnMaxTokens,
|
|
13777
13801
|
persistTurns: runBehavior?.persistTurns ?? agentBehavior?.persistTurns
|
|
13778
13802
|
};
|
|
@@ -14629,7 +14653,7 @@ function createAgent(rawOptions) {
|
|
|
14629
14653
|
const thinking = options.thinking ?? "off";
|
|
14630
14654
|
const model = targets[0].model;
|
|
14631
14655
|
if (runProvider.meta?.clearsContextServerSide) resolvedBehavior.dedupReads = false;
|
|
14632
|
-
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;
|
|
14656
|
+
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, maxConsecutiveRefusalResumes, resumeOnMaxTokens, persistTurns } = resolvedBehavior;
|
|
14633
14657
|
const modelOptions = options.modelOptions ?? behaviorModelOptions;
|
|
14634
14658
|
let system = options.system || agentSystem || "You are a helpful assistant.";
|
|
14635
14659
|
const baseSystemForBreakdown = renderSystemForWire(system);
|
|
@@ -15088,6 +15112,7 @@ function createAgent(rawOptions) {
|
|
|
15088
15112
|
...strictToolPairing ? { strictToolPairing: true } : {},
|
|
15089
15113
|
...maxPairingRepairsPerTurn !== void 0 ? { maxPairingRepairsPerTurn } : {},
|
|
15090
15114
|
...maxConsecutivePauseTurns !== void 0 ? { maxConsecutivePauseTurns } : {},
|
|
15115
|
+
...maxConsecutiveRefusalResumes !== void 0 ? { maxConsecutiveRefusalResumes } : {},
|
|
15091
15116
|
...resumeOnMaxTokens !== void 0 ? { resumeOnMaxTokens } : {},
|
|
15092
15117
|
providerName: runProvider.name,
|
|
15093
15118
|
runStartMs,
|
|
@@ -15680,4 +15705,4 @@ function createAgent(rawOptions) {
|
|
|
15680
15705
|
//#endregion
|
|
15681
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 };
|
|
15682
15707
|
|
|
15683
|
-
//# sourceMappingURL=agent-
|
|
15708
|
+
//# sourceMappingURL=agent-BJuiohV_.js.map
|