zidane 6.1.1 → 6.1.2

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.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-DK382vzL.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-d1OjXjtH.js";
2
2
  export { AcpProtocolError, JsonRpcRemoteError, acpMcpServersToZidane, acpPromptToPromptParts, createAcpServer, createJsonRpcConnection, runAcpStdioServer, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent, withAcpDefaultTools, wrapToolsForAcpClient };
@@ -3580,6 +3580,14 @@ function parseAttachmentHandle(path) {
3580
3580
  const hash = path.slice(13).trim();
3581
3581
  return hash.length > 0 ? hash : null;
3582
3582
  }
3583
+ /**
3584
+ * Payload byte length of a media block's `data` — raw text length for
3585
+ * text-encoded documents, decoded (padding-accurate) length for base64.
3586
+ */
3587
+ function mediaPayloadBytes(data, encoding) {
3588
+ if (encoding === "text") return Buffer.byteLength(data);
3589
+ return decodedBase64Bytes(data);
3590
+ }
3583
3591
  /** Decoded byte length of a base64 string (padding-accurate). */
3584
3592
  function decodedBase64Bytes(b64) {
3585
3593
  if (b64.length === 0) return 0;
@@ -3604,7 +3612,7 @@ function humanBytes(bytes) {
3604
3612
  */
3605
3613
  function mediaAgeoutMarker(block, readFileToolName = "read_file") {
3606
3614
  const handle = attachmentHandleFor(block.data);
3607
- const size = humanBytes(decodedBase64Bytes(block.data));
3615
+ const size = humanBytes(mediaPayloadBytes(block.data, block.encoding));
3608
3616
  const named = block.name ? ` "${block.name}"` : "";
3609
3617
  const resolveHint = readFileToolName ? `Still saved in this session; re-read with ${readFileToolName} path="${handle}" to view it again.` : `Still saved in this session as ${handle}, but no file-read tool is available in this run to re-open it.`;
3610
3618
  return `[${block.type} aged out of context to save tokens -${named} ${block.mediaType}, ${size}. ${resolveHint}]`;
@@ -3785,6 +3793,74 @@ function attachmentByteLength(data, encoding) {
3785
3793
  const pad = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
3786
3794
  return Math.max(0, Math.floor(data.length * 3 / 4) - pad);
3787
3795
  }
3796
+ /**
3797
+ * Decode a resolved document attachment to text when its bytes are actually
3798
+ * textual. Unknown-extension source files (e.g. `.asm`) ingest as base64
3799
+ * `application/octet-stream` blobs; re-inlining megabytes of base64 whole is
3800
+ * exactly what OOMs a session, so textual payloads get routed through the
3801
+ * line-paged renderer instead. Returns `null` for images, PDFs, and genuinely
3802
+ * binary payloads — those keep the whole-blob inline path.
3803
+ */
3804
+ function attachmentText(found) {
3805
+ if (found.kind !== "document") return null;
3806
+ if (found.encoding === "text") return found.data;
3807
+ if (found.mediaType === "application/pdf") return null;
3808
+ const decoded = Buffer.from(found.data, "base64").toString("utf-8");
3809
+ return looksBinary(decoded) ? null : decoded;
3810
+ }
3811
+ /**
3812
+ * Line-sliced, byte-capped rendering with the standard truncation footers.
3813
+ * Shared by the filesystem text path and the text-attachment re-resolve path
3814
+ * so both page identically (`offset`/`limit`/`maxBytes` semantics, footer
3815
+ * guidance included).
3816
+ */
3817
+ function renderTextSlice(raw, opts) {
3818
+ const { offset: offsetN, limit: limitN, maxBytes: maxBytesN, lineNumbers: showLineNumbers } = opts;
3819
+ const totalBytes = Buffer.byteLength(raw);
3820
+ const lines = raw.split("\n");
3821
+ const totalLines = lines.length;
3822
+ const startIdx = Math.max(0, offsetN - 1);
3823
+ const endIdx = limitN > 0 ? Math.min(totalLines, startIdx + limitN) : totalLines;
3824
+ let slice = lines.slice(startIdx, endIdx);
3825
+ let bytesCut = false;
3826
+ if (maxBytesN > 0) {
3827
+ const truncatedSlice = [];
3828
+ let bytesUsed = 0;
3829
+ for (const line of slice) {
3830
+ const lineBytes = Buffer.byteLength(line) + 1;
3831
+ if (bytesUsed + lineBytes > maxBytesN && truncatedSlice.length > 0) {
3832
+ bytesCut = true;
3833
+ break;
3834
+ }
3835
+ truncatedSlice.push(line);
3836
+ bytesUsed += lineBytes;
3837
+ if (bytesUsed >= maxBytesN) break;
3838
+ }
3839
+ if (truncatedSlice.length < slice.length) bytesCut = true;
3840
+ slice = truncatedSlice;
3841
+ }
3842
+ let midLineCut = false;
3843
+ if (maxBytesN > 0 && slice.length > 0) {
3844
+ if (Buffer.byteLength(slice.join("\n")) > maxBytesN) {
3845
+ const lastIdx = slice.length - 1;
3846
+ const lastLine = slice[lastIdx];
3847
+ const otherBytes = lastIdx > 0 ? Buffer.byteLength(slice.slice(0, lastIdx).join("\n")) + 1 : 0;
3848
+ const budgetForLast = Math.max(0, maxBytesN - otherBytes);
3849
+ let cut = Math.min(lastLine.length, budgetForLast);
3850
+ while (cut > 0 && Buffer.byteLength(lastLine.slice(0, cut)) > budgetForLast) cut--;
3851
+ slice[lastIdx] = lastLine.slice(0, cut);
3852
+ midLineCut = true;
3853
+ bytesCut = true;
3854
+ }
3855
+ }
3856
+ const lastLineRead = startIdx + slice.length;
3857
+ const body = showLineNumbers ? slice.map((line, i) => `${startIdx + i + 1}\t${line}`).join("\n") : slice.join("\n");
3858
+ const linesTruncated = endIdx < totalLines || bytesCut;
3859
+ if (!linesTruncated && offsetN === 1) return body;
3860
+ if (!linesTruncated) return `${body}\n\n…read lines ${offsetN}-${lastLineRead} of ${totalLines}.`;
3861
+ 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.`;
3862
+ 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.`;
3863
+ }
3788
3864
  const readFile$1 = {
3789
3865
  isConcurrencySafe: true,
3790
3866
  spec: {
@@ -3829,6 +3905,13 @@ const readFile$1 = {
3829
3905
  if (!turns) return `Attachment ${path} cannot be resolved: no session is bound to this run.`;
3830
3906
  const found = resolveAttachmentFromTurns(turns, handleHash);
3831
3907
  if (!found) return `Attachment ${path} not found in this session's history (it may predate this session, or only ever lived as a host-offloaded reference).`;
3908
+ const asText = attachmentText(found);
3909
+ if (asText !== null) return `${`Document${found.name ? ` "${found.name}"` : ""} re-resolved from session history (${found.mediaType}, rendered as text).`}\n\n${renderTextSlice(asText, {
3910
+ offset: normalizeReadFileInteger(offset, 1),
3911
+ limit: normalizeReadFileInteger(limit, defaults.lineLimit),
3912
+ maxBytes: normalizeReadFileInteger(maxBytes, defaults.textMaxBytes),
3913
+ lineNumbers: typeof lineNumbers === "boolean" ? lineNumbers : ctx.behavior?.readLineNumbers ?? true
3914
+ })}`;
3832
3915
  const sizeCap = normalizeReadFileInteger(maxBytes, defaults.attachmentMaxBytes);
3833
3916
  const byteLength = attachmentByteLength(found.data, found.encoding);
3834
3917
  if (sizeCap > 0 && byteLength > sizeCap) return `[attachment too large to re-inline: ${path}, ${byteLength} bytes (cap ${sizeCap}). Raise maxBytes if you need the original bytes.]`;
@@ -3931,53 +4014,13 @@ const readFile$1 = {
3931
4014
  }
3932
4015
  }
3933
4016
  if (looksBinary(raw)) return `[binary file: ${path}, ${totalBytes} bytes; use shell with hexdump | xxd | od to inspect]`;
3934
- const offsetN = offsetForKey;
3935
- const limitN = limitForKey;
3936
- const maxBytesN = maxBytesForKey;
3937
- const lines = raw.split("\n");
3938
- const totalLines = lines.length;
3939
- const startIdx = Math.max(0, offsetN - 1);
3940
- const endIdx = limitN > 0 ? Math.min(totalLines, startIdx + limitN) : totalLines;
3941
- let slice = lines.slice(startIdx, endIdx);
3942
- let bytesCut = false;
3943
- if (maxBytesN > 0) {
3944
- const truncatedSlice = [];
3945
- let bytesUsed = 0;
3946
- for (const line of slice) {
3947
- const lineBytes = Buffer.byteLength(line) + 1;
3948
- if (bytesUsed + lineBytes > maxBytesN && truncatedSlice.length > 0) {
3949
- bytesCut = true;
3950
- break;
3951
- }
3952
- truncatedSlice.push(line);
3953
- bytesUsed += lineBytes;
3954
- if (bytesUsed >= maxBytesN) break;
3955
- }
3956
- if (truncatedSlice.length < slice.length) bytesCut = true;
3957
- slice = truncatedSlice;
3958
- }
3959
- let midLineCut = false;
3960
- if (maxBytesN > 0 && slice.length > 0) {
3961
- if (Buffer.byteLength(slice.join("\n")) > maxBytesN) {
3962
- const lastIdx = slice.length - 1;
3963
- const lastLine = slice[lastIdx];
3964
- const otherBytes = lastIdx > 0 ? Buffer.byteLength(slice.slice(0, lastIdx).join("\n")) + 1 : 0;
3965
- const budgetForLast = Math.max(0, maxBytesN - otherBytes);
3966
- let cut = Math.min(lastLine.length, budgetForLast);
3967
- while (cut > 0 && Buffer.byteLength(lastLine.slice(0, cut)) > budgetForLast) cut--;
3968
- slice[lastIdx] = lastLine.slice(0, cut);
3969
- midLineCut = true;
3970
- bytesCut = true;
3971
- }
3972
- }
3973
- const lastLineRead = startIdx + slice.length;
3974
- const body = showLineNumbers ? slice.map((line, i) => `${startIdx + i + 1}\t${line}`).join("\n") : slice.join("\n");
3975
4017
  rememberRead();
3976
- const linesTruncated = endIdx < totalLines || bytesCut;
3977
- if (!linesTruncated && offsetN === 1) return body;
3978
- if (!linesTruncated) return `${body}\n\n…read lines ${offsetN}-${lastLineRead} of ${totalLines}.`;
3979
- 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.`;
3980
- 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.`;
4018
+ return renderTextSlice(raw, {
4019
+ offset: offsetForKey,
4020
+ limit: limitForKey,
4021
+ maxBytes: maxBytesForKey,
4022
+ lineNumbers: showLineNumbers
4023
+ });
3981
4024
  }
3982
4025
  };
3983
4026
  function documentMediaTypeFor(path) {
@@ -9565,6 +9608,39 @@ function applyTailCompaction(messages, threshold, keepTurns, options) {
9565
9608
  *
9566
9609
  * Pure: returns the input reference unchanged when nothing aged out.
9567
9610
  */
9611
+ /**
9612
+ * TEXTUAL document payloads above this many bytes never ride inline on the
9613
+ * wire — they are replaced with the recoverable `attachment://` marker
9614
+ * immediately, even inside the `mediaKeepTurns` window, because the model
9615
+ * can page them back losslessly via read_file's line-sliced attachment path.
9616
+ * Matches read_file's default text byte cap.
9617
+ *
9618
+ * Binary media (images, PDFs, opaque blobs) is deliberately NOT size-gated
9619
+ * inside the keep window: the model can only consume those inline, so
9620
+ * stubbing a fresh one would make it permanently unviewable and set up a
9621
+ * read → stub → re-read ping-pong. Binary keeps pure age-out semantics.
9622
+ */
9623
+ const MEDIA_INLINE_MAX_BYTES = 262144;
9624
+ /**
9625
+ * Base64 chars to decode when sniffing whether a base64 document is textual.
9626
+ * Multiple of 4 (decodes cleanly), yielding ~8 KiB — the same head-sample
9627
+ * size `looksBinary` uses, so the gate and read_file's `attachmentText`
9628
+ * reach the same verdict for the same payload.
9629
+ */
9630
+ const TEXT_SNIFF_BASE64_CHARS = 10924;
9631
+ /**
9632
+ * True when a document block's bytes are recoverable as paged text through
9633
+ * read_file's attachment path. Only such blocks are eligible for the
9634
+ * keep-window size gate. Kept deliberately in lockstep with `attachmentText`
9635
+ * in tools/read-file.ts: text encoding → yes; PDFs → no; base64 → decode a
9636
+ * head sample and sniff.
9637
+ */
9638
+ function isPagedTextRecoverable(block) {
9639
+ if (block.type !== "document") return false;
9640
+ if (block.encoding === "text") return true;
9641
+ if (block.mediaType === "application/pdf") return false;
9642
+ return !looksBinary(Buffer.from(block.data.slice(0, TEXT_SNIFF_BASE64_CHARS), "base64").toString("utf-8"));
9643
+ }
9568
9644
  function applyMediaAgeout(messages, keep, options) {
9569
9645
  const elidedReadPaths = [];
9570
9646
  if (messages.length === 0) return {
@@ -9574,24 +9650,25 @@ function applyMediaAgeout(messages, keep, options) {
9574
9650
  const readFileToolName = options?.readFileToolName ?? "read_file";
9575
9651
  const keepFloor = Math.max(0, keep);
9576
9652
  const rawCutoff = messages.length - keepFloor;
9577
- if (rawCutoff <= 0) return {
9578
- messages,
9579
- elidedReadPaths
9580
- };
9581
9653
  const chunk = Math.max(1, options?.chunkTurns ?? 1);
9582
- const cutoff = Math.floor(rawCutoff / chunk) * chunk;
9583
- if (cutoff <= 0) return {
9654
+ const cutoff = rawCutoff <= 0 ? 0 : Math.floor(rawCutoff / chunk) * chunk;
9655
+ const maxInline = typeof options?.maxInlineBytes === "number" && options.maxInlineBytes > 0 ? options.maxInlineBytes : Infinity;
9656
+ if (cutoff <= 0 && maxInline === Infinity) return {
9584
9657
  messages,
9585
9658
  elidedReadPaths
9586
9659
  };
9660
+ const isInlineMedia = (b) => (b.type === "image" || b.type === "document") && typeof b.data === "string";
9587
9661
  const readPathByCallId = options?.readPathByCallId;
9588
9662
  let changed = false;
9589
9663
  const out = messages.slice();
9590
- for (let i = 0; i < cutoff; i++) {
9664
+ for (let i = 0; i < out.length; i++) {
9665
+ const aged = i < cutoff;
9666
+ if (!aged && maxInline === Infinity) continue;
9667
+ const elides = (b) => aged || mediaPayloadBytes(b.data, b.encoding) > maxInline && isPagedTextRecoverable(b);
9591
9668
  const msg = out[i];
9592
9669
  let msgChanged = false;
9593
9670
  const newContent = msg.content.map((block) => {
9594
- if ((block.type === "image" || block.type === "document") && typeof block.data === "string") {
9671
+ if (isInlineMedia(block) && elides(block)) {
9595
9672
  msgChanged = true;
9596
9673
  changed = true;
9597
9674
  return {
@@ -9602,7 +9679,7 @@ function applyMediaAgeout(messages, keep, options) {
9602
9679
  if (block.type === "tool_result" && Array.isArray(block.output)) {
9603
9680
  let outputChanged = false;
9604
9681
  const newOutput = block.output.map((part) => {
9605
- if ((part.type === "image" || part.type === "document") && typeof part.data === "string") {
9682
+ if (isInlineMedia(part) && elides(part)) {
9606
9683
  outputChanged = true;
9607
9684
  return {
9608
9685
  type: "text",
@@ -10697,7 +10774,8 @@ async function executeTurn(ctx, turn, priorUsage) {
10697
10774
  const aged = applyMediaAgeout(sanitizedMessages, ctx.mediaKeepTurns, {
10698
10775
  chunkTurns: COMPACT_CHUNK_TURNS,
10699
10776
  readPathByCallId,
10700
- readFileToolName: toWireName("read_file", ctx.aliasMaps)
10777
+ readFileToolName: toWireName("read_file", ctx.aliasMaps),
10778
+ maxInlineBytes: MEDIA_INLINE_MAX_BYTES
10701
10779
  });
10702
10780
  sanitizedMessages = aged.messages;
10703
10781
  markReadStateForElidedPaths(ctx, ctx.handle.cwd, aged.elidedReadPaths);
@@ -10843,7 +10921,8 @@ async function executeTurn(ctx, turn, priorUsage) {
10843
10921
  const aged = applyMediaAgeout(streamOptions.messages, keepFloor, {
10844
10922
  chunkTurns: 1,
10845
10923
  readPathByCallId,
10846
- readFileToolName: ctx.tools.read_file ? toWireName("read_file", ctx.aliasMaps) : null
10924
+ readFileToolName: ctx.tools.read_file ? toWireName("read_file", ctx.aliasMaps) : null,
10925
+ maxInlineBytes: MEDIA_INLINE_MAX_BYTES
10847
10926
  });
10848
10927
  const compacted = applyTailCompaction(aged.messages, 0, keepFloor, {
10849
10928
  readPathByCallId,
@@ -14596,6 +14675,6 @@ function createAgent(rawOptions) {
14596
14675
  };
14597
14676
  }
14598
14677
  //#endregion
14599
- export { composeExtensionPreset as $, inlineLoadedExtension as $t, ANCHOR_PREVIEW_MAX_CHARS as A, grep as At, ExtensionInstallError as B, formatBindingForDisplay as Bt, NO_TOOLS_PREAMBLE as C, readFile$1 as Ct, buildFullCompactPrompt as D, matchModelEntries as Dt, buildFromCompactPrompt as E, formatModelLine as Et, truncateHeadForPtlRetry as F, DEFAULT_KEYBINDINGS as Ft, readExtensionInstallProvenance as G, parseBindingSpec as Gt, installExtensionFromSpec as H, keybindingsPath as Ht, CompactInvalidInputError as I, KEYBINDING_DEFS as It, createExtensionHud as J, resolveExtensionKeybindings as Jt, removeInstalledExtension as K, readKeybindings as Kt, CompactPromptTooLongError as L, KEYBINDING_DEF_BY_ACTION as Lt, sliceForCompaction as M, edit as Mt, stripImagesFromTurns as N, validateToolArgs as Nt, buildTailCompactPrompt as O, listFiles as Ot, summaryToTurn as P, resolveStorageDirs as Pt, buildExtensionRegistry as Q, discoverExtensions as Qt, EMPTY_EXTENSION_REGISTRY as R, KEYBINDING_KEY_COL_WIDTH as Rt, BASE_INSTRUCTIONS as S, tailTruncate as St, buildCompactPrompt as T, createModelSearchTool as Tt, listExtensionCandidates as U, matchesBinding as Ut, fetchExtensionSource as V, groupBindings as Vt, parseExtensionInstallSource as W, mergeKeybindings as Wt, discoverAndBuildExtensionRegistry as X, ENTRY_CANDIDATES as Xt, registerExtensionHostModules as Y, stripJsonComments as Yt, buildExtensionPreset as Z, defaultExtensionScanPaths as Zt, buildPostCompactAttachments as _, normalizeShellCommand as _n, createSkillsRunScriptTool as _t, SHELL_CASCADE_CANCEL_MESSAGE as a, coerceExtensionConfigInput as an, createWorkspaceSurface as at, selectRecentFiles as b, createShellTool as bt, applyCompactSummaryCutoff as c, resolveExtensionConfig as cn, basicTools as ct, buildPersistedStub as d, AUTO_COMPACT_MIN_GROWTH_FRACTION as dn, WAIT_TASK_TIMED_OUT_PREFIX as dt, isExtensionDefinition as en, disposeExtensionRegistry as et, cleanupPersistedSession as f, OUTPUT_RESERVE_TOKENS as fn, waitTask as ft, resolveTasksDir as g, defaultRepeatGuardTracked as gn, createSkillsUseTool as gt, resolvePersistDir as h, defaultRepeatGuardNormalize as hn, isSpawnTool as ht, INTERRUPT_MESSAGE_FOR_TOOL_USE as i, clampExtensionConfigNumber as in, createExtensionHostRuntimeBridge as it, anchorPreviewFor as j, glob as jt, buildUpToCompactPrompt as k, createInteractionTool as kt, PERSISTED_STUB_PREFIX as l, resolveExtensionConfigValue as ln, basic_default as lt, resolveMcpWarningsDir as m, shouldAutoCompact as mn, createSpawnTool as mt, normalizeProviders as n, scanExtensionDirectories as nn, mergeContributions as nt, TOOL_USE_CANCELLED_MESSAGE as o, isValidExtensionConfigItem as on, composePresets as ot, maybePersistToolResult as p, effectiveContextWindow as pn, createToolSearchTool as pt, updateInstalledExtension as q, readKeybindingsRaw as qt, resolveModelTargets as r, defineExtension as rn, partitionExtensionCatalog as rt, TOOL_USE_SKIPPED_MESSAGE as s, isValidExtensionConfigValue as sn, definePreset as st, createAgent as t, parseExtensionScanPathEnv as tn, filterExtensionRegistry as tt, PERSISTENCE_PREVIEW_BYTES as u, toWireConfigSchema as un, writeFile$1 as ut, selectFilesFromReadState as v, stableStringify as vn, createSkillsReadTool as vt, TRAILER as w, multiEdit as wt, compactConversation as x, shell as xt, selectFilesFromSession as y, shellKill as yt, createExtensionPromptBridge as z, ensureKeybindingsFile as zt };
14678
+ export { composeExtensionPreset as $, discoverExtensions as $t, ANCHOR_PREVIEW_MAX_CHARS as A, createInteractionTool as At, ExtensionInstallError as B, ensureKeybindingsFile as Bt, NO_TOOLS_PREAMBLE as C, readFile$1 as Ct, buildFullCompactPrompt as D, formatModelLine as Dt, buildFromCompactPrompt as E, createModelSearchTool as Et, truncateHeadForPtlRetry as F, resolveStorageDirs as Ft, readExtensionInstallProvenance as G, mergeKeybindings as Gt, installExtensionFromSpec as H, groupBindings as Ht, CompactInvalidInputError as I, DEFAULT_KEYBINDINGS as It, createExtensionHud as J, readKeybindingsRaw as Jt, removeInstalledExtension as K, parseBindingSpec as Kt, CompactPromptTooLongError as L, KEYBINDING_DEFS as Lt, sliceForCompaction as M, glob as Mt, stripImagesFromTurns as N, edit as Nt, buildTailCompactPrompt as O, matchModelEntries as Ot, summaryToTurn as P, validateToolArgs as Pt, buildExtensionRegistry as Q, defaultExtensionScanPaths as Qt, EMPTY_EXTENSION_REGISTRY as R, KEYBINDING_DEF_BY_ACTION as Rt, BASE_INSTRUCTIONS as S, tailTruncate as St, buildCompactPrompt as T, multiEdit as Tt, listExtensionCandidates as U, keybindingsPath as Ut, fetchExtensionSource as V, formatBindingForDisplay as Vt, parseExtensionInstallSource as W, matchesBinding as Wt, discoverAndBuildExtensionRegistry as X, stripJsonComments as Xt, registerExtensionHostModules as Y, resolveExtensionKeybindings as Yt, buildExtensionPreset as Z, ENTRY_CANDIDATES as Zt, buildPostCompactAttachments as _, defaultRepeatGuardTracked as _n, createSkillsRunScriptTool as _t, SHELL_CASCADE_CANCEL_MESSAGE as a, clampExtensionConfigNumber as an, createWorkspaceSurface as at, selectRecentFiles as b, createShellTool as bt, applyCompactSummaryCutoff as c, isValidExtensionConfigValue as cn, basicTools as ct, buildPersistedStub as d, toWireConfigSchema as dn, WAIT_TASK_TIMED_OUT_PREFIX as dt, inlineLoadedExtension as en, disposeExtensionRegistry as et, cleanupPersistedSession as f, AUTO_COMPACT_MIN_GROWTH_FRACTION as fn, waitTask as ft, resolveTasksDir as g, defaultRepeatGuardNormalize as gn, createSkillsUseTool as gt, resolvePersistDir as h, shouldAutoCompact as hn, isSpawnTool as ht, INTERRUPT_MESSAGE_FOR_TOOL_USE as i, defineExtension as in, createExtensionHostRuntimeBridge as it, anchorPreviewFor as j, grep as jt, buildUpToCompactPrompt as k, listFiles as kt, PERSISTED_STUB_PREFIX as l, resolveExtensionConfig as ln, basic_default as lt, resolveMcpWarningsDir as m, effectiveContextWindow as mn, createSpawnTool as mt, normalizeProviders as n, parseExtensionScanPathEnv as nn, mergeContributions as nt, TOOL_USE_CANCELLED_MESSAGE as o, coerceExtensionConfigInput as on, composePresets as ot, maybePersistToolResult as p, OUTPUT_RESERVE_TOKENS as pn, createToolSearchTool as pt, updateInstalledExtension as q, readKeybindings as qt, resolveModelTargets as r, scanExtensionDirectories as rn, partitionExtensionCatalog as rt, TOOL_USE_SKIPPED_MESSAGE as s, isValidExtensionConfigItem as sn, definePreset as st, createAgent as t, isExtensionDefinition as tn, filterExtensionRegistry as tt, PERSISTENCE_PREVIEW_BYTES as u, resolveExtensionConfigValue as un, writeFile$1 as ut, selectFilesFromReadState as v, normalizeShellCommand as vn, createSkillsReadTool as vt, TRAILER as w, looksBinary as wt, compactConversation as x, shell as xt, selectFilesFromSession as y, stableStringify as yn, shellKill as yt, createExtensionPromptBridge as z, KEYBINDING_KEY_COL_WIDTH as zt };
14600
14679
 
14601
- //# sourceMappingURL=agent-Bq32ZJSo.js.map
14680
+ //# sourceMappingURL=agent-5mbViwQE.js.map