zidane 6.2.23 → 6.2.26
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-B7wH6LhE.js → acp-CNZqD1Fw.js} +5 -5
- package/dist/{acp-B7wH6LhE.js.map → acp-CNZqD1Fw.js.map} +1 -1
- package/dist/acp-cli.js +4 -4
- package/dist/acp.d.ts +1 -1
- package/dist/acp.js +1 -1
- package/dist/{agent-BSIMsEtD.js → agent--VPMZ0nT.js} +324 -39
- package/dist/agent--VPMZ0nT.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +2 -2
- package/dist/{auth-CpdQebUy.js → auth-DIT_DMwa.js} +2 -2
- package/dist/{auth-CpdQebUy.js.map → auth-DIT_DMwa.js.map} +1 -1
- package/dist/chat/pure.d.ts +3 -3
- package/dist/chat/pure.js +1 -1
- package/dist/chat.d.ts +4 -4
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +6 -6
- package/dist/contexts/daytona.d.ts +1 -1
- package/dist/contexts/daytona.d.ts.map +1 -1
- package/dist/contexts/daytona.js +9 -2
- package/dist/contexts/daytona.js.map +1 -1
- package/dist/contexts/docker.js +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/contexts/e2b.d.ts.map +1 -1
- package/dist/contexts/e2b.js +3 -4
- package/dist/contexts/e2b.js.map +1 -1
- package/dist/{contexts-A4ep-iJs.js → contexts-0rmrBhTK.js} +8 -5
- package/dist/contexts-0rmrBhTK.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/{output-cap-kBUHBlnq.js → glob-DluQFSw1.js} +2 -50
- package/dist/glob-DluQFSw1.js.map +1 -0
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +4 -4
- package/dist/history-search-worker.js +6 -1
- package/dist/history-search-worker.js.map +1 -1
- package/dist/{index-Bv9qhj4n.d.ts → index-AVZ6pYpi.d.ts} +254 -97
- package/dist/index-AVZ6pYpi.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/dist/{inline-autocomplete-BAwBcZtD.js → inline-autocomplete-CbcdZpfC.js} +2 -1
- package/dist/inline-autocomplete-CbcdZpfC.js.map +1 -0
- package/dist/{login-BkZ_d5sT.js → login-afiadwf0.js} +35 -19
- package/dist/login-afiadwf0.js.map +1 -0
- package/dist/mcp.d.ts +1 -1
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/output-cap-DM1HrgIp.js +100 -0
- package/dist/output-cap-DM1HrgIp.js.map +1 -0
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/{resolve-x5mlFtLX.js → resolve-BPTA1RpX.js} +23 -3
- package/dist/resolve-BPTA1RpX.js.map +1 -0
- package/dist/restate.d.ts +1 -1
- package/dist/{run-summary-nD3IQ4ZQ.js → run-summary-BU_NgwUT.js} +17 -1
- package/dist/run-summary-BU_NgwUT.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/{session-Dbvz1ZUE.js → session-jLsc_kMH.js} +22 -3
- package/dist/session-jLsc_kMH.js.map +1 -0
- package/dist/session.d.ts +2 -2
- package/dist/session.js +2 -2
- package/dist/{skills-C1vGKbqv.js → skills-C7eIjWYm.js} +2 -2
- package/dist/{skills-C1vGKbqv.js.map → skills-C7eIjWYm.js.map} +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +2 -2
- package/dist/{tool-formatters-D9P6Znip.d.ts → tool-formatters-Dual3Hdl.d.ts} +2 -2
- package/dist/{tool-formatters-D9P6Znip.d.ts.map → tool-formatters-Dual3Hdl.d.ts.map} +1 -1
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +1 -1
- package/dist/{transcript-anchors-Ci5888xS.d.ts → transcript-anchors-CG85bieG.d.ts} +2 -2
- package/dist/transcript-anchors-CG85bieG.d.ts.map +1 -0
- package/dist/{transcript-anchors-CqzIr74w.js → transcript-anchors-CnmxZ8QR.js} +96 -16
- package/dist/transcript-anchors-CnmxZ8QR.js.map +1 -0
- package/dist/tui.d.ts +55 -8
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +1845 -1145
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-CokV32wf.js → turn-operations-4tnvKwfJ.js} +82 -14
- package/dist/turn-operations-4tnvKwfJ.js.map +1 -0
- package/dist/{turn-operations-C3y6A82G.d.ts → turn-operations-BUYaSCL3.d.ts} +3 -3
- package/dist/{turn-operations-C3y6A82G.d.ts.map → turn-operations-BUYaSCL3.d.ts.map} +1 -1
- package/dist/types-BIarq1qE.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +2 -1
- package/dist/agent-BSIMsEtD.js.map +0 -1
- package/dist/contexts-A4ep-iJs.js.map +0 -1
- package/dist/index-Bv9qhj4n.d.ts.map +0 -1
- package/dist/inline-autocomplete-BAwBcZtD.js.map +0 -1
- package/dist/login-BkZ_d5sT.js.map +0 -1
- package/dist/output-cap-kBUHBlnq.js.map +0 -1
- package/dist/resolve-x5mlFtLX.js.map +0 -1
- package/dist/run-summary-nD3IQ4ZQ.js.map +0 -1
- package/dist/session-Dbvz1ZUE.js.map +0 -1
- package/dist/transcript-anchors-Ci5888xS.d.ts.map +0 -1
- package/dist/transcript-anchors-CqzIr74w.js.map +0 -1
- package/dist/turn-operations-CokV32wf.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob-DluQFSw1.js","names":[],"sources":["../src/contexts/git-ls-files.ts","../src/contexts/git-ls-files-local.ts","../src/contexts/glob.ts"],"sourcesContent":["/**\n * Pure (node-free) `git ls-files` helpers shared by the gitignore-aware paths\n * of the `glob` and `grep` tools.\n *\n * `git ls-files --cached --others --exclude-standard` lists tracked files plus\n * untracked-but-not-ignored files, applying `.gitignore`, `.git/info/exclude`,\n * and the user's global excludes. Git never descends ignored directories\n * (`node_modules`, build output, …), so this is both correct and sub-second on\n * large repos — unlike a raw filesystem walk.\n *\n * This module has ZERO node imports so it can be pulled into edge/workerd\n * bundles (e.g. via the `grep` tool, which drives git through the execution\n * context's `exec` seam). The node-spawn variant lives in\n * `./git-ls-files-local`.\n */\n\n/** Argv for `git ls-files`, NUL-delimited so paths with newlines stay intact. */\nexport const GIT_LS_FILES_ARGS = ['ls-files', '--cached', '--others', '--exclude-standard', '-z'] as const\n\n/** The same invocation as a shell command string for the `exec` seam. */\nexport const GIT_LS_FILES_COMMAND = `git ${GIT_LS_FILES_ARGS.join(' ')}`\n\n/** Split NUL-delimited `git ls-files -z` output into paths. */\nexport function parseGitLsFiles(stdout: string): string[] {\n return stdout.split('\\0').filter(p => p.length > 0)\n}\n","/**\n * Node-spawn `git ls-files` runner used by the local process context's glob.\n *\n * Kept separate from `./git-ls-files` (which stays node-free for edge bundles)\n * because this leg imports `node:child_process`.\n */\n\nimport { spawn } from 'node:child_process'\nimport { GIT_LS_FILES_ARGS, parseGitLsFiles } from './git-ls-files'\n\n/**\n * Run `git ls-files` in `cwd` and return its non-ignored paths (relative to\n * `cwd`). Returns `null` when the directory is not a git repo, git is missing,\n * or the call aborts — callers treat `null` as \"fall back to a filesystem\n * walk\". Never throws.\n */\nexport async function gitListFilesLocal(cwd: string, signal?: AbortSignal): Promise<string[] | null> {\n return new Promise<string[] | null>((resolveP) => {\n let child: ReturnType<typeof spawn>\n try {\n child = spawn('git', [...GIT_LS_FILES_ARGS], { cwd, stdio: ['ignore', 'pipe', 'pipe'] })\n }\n catch {\n resolveP(null)\n return\n }\n if (signal?.aborted) {\n child.kill('SIGTERM')\n resolveP(null)\n return\n }\n const stdoutChunks: string[] = []\n const onAbort = () => child.kill('SIGTERM')\n signal?.addEventListener('abort', onAbort, { once: true })\n child.stdout?.setEncoding('utf8')\n child.stdout?.on('data', chunk => stdoutChunks.push(chunk as string))\n child.on('error', () => {\n signal?.removeEventListener('abort', onAbort)\n resolveP(null)\n })\n child.on('close', (code) => {\n signal?.removeEventListener('abort', onAbort)\n if (code !== 0 || signal?.aborted) {\n resolveP(null)\n return\n }\n resolveP(parseGitLsFiles(stdoutChunks.join('')))\n })\n })\n}\n","import type { ListFileMetadata } from './types'\nimport { readdir, stat } from 'node:fs/promises'\nimport { dirname, resolve, sep } from 'node:path'\nimport { lazyAsync } from '../lazy'\nimport { gitListFilesLocal } from './git-ls-files-local'\n\ntype NodeGlob = (pattern: string, options: { cwd: string }) => AsyncIterable<string>\n\ninterface BunGlobInstance { scan: (options: { cwd: string, onlyFiles?: boolean, dot?: boolean }) => AsyncIterable<string> }\ntype BunGlobCtor = new (pattern: string) => BunGlobInstance\n\nconst loadNativeNodeGlob = lazyAsync(async (): Promise<NodeGlob | undefined> => {\n const candidate = (await import('node:fs/promises') as { glob?: unknown }).glob\n return typeof candidate === 'function' ? candidate as NodeGlob : undefined\n})\n\nfunction forcePortable(): boolean {\n return (globalThis as { __zidaneForcePortableGlobForTests?: boolean }).__zidaneForcePortableGlobForTests === true\n}\n\nasync function loadNodeGlob(): Promise<NodeGlob | undefined> {\n if (forcePortable())\n return undefined\n return loadNativeNodeGlob()\n}\n\n/**\n * Bun's `node:fs/promises.glob` buffers the entire directory walk before\n * yielding (so an early `limit` break never fires — a broad `**` pattern over\n * a large `node_modules` hangs). `Bun.Glob().scan()` streams incrementally and\n * is the fast path under Bun. Returns undefined off Bun or when tests force the\n * portable walker.\n */\nfunction loadBunGlob(): BunGlobCtor | undefined {\n if (forcePortable())\n return undefined\n const bun = (globalThis as { Bun?: { Glob?: unknown } }).Bun\n return bun && typeof bun.Glob === 'function' ? bun.Glob as BunGlobCtor : undefined\n}\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char\n}\n\nexport function expandBraces(pattern: string): string[] {\n const start = pattern.indexOf('{')\n if (start === -1)\n return [pattern]\n const end = pattern.indexOf('}', start + 1)\n if (end === -1)\n return [pattern]\n const body = pattern.slice(start + 1, end)\n if (!body || !body.includes(','))\n return [pattern]\n return body\n .split(',')\n .flatMap(part => expandBraces(`${pattern.slice(0, start)}${part}${pattern.slice(end + 1)}`))\n}\n\nexport function globPatternToRegex(pattern: string): RegExp {\n let out = '^'\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n const next = pattern[i + 1]\n if (char === '*') {\n if (next === '*') {\n const after = pattern[i + 2]\n if (after === '/') {\n out += '(?:[^/]+/)*'\n i += 2\n }\n else {\n out += '.*'\n i += 1\n }\n }\n else {\n out += '[^/]*'\n }\n }\n else if (char === '?') {\n out += '[^/]'\n }\n else if (char === '[') {\n const end = pattern.indexOf(']', i + 1)\n if (end === -1) {\n out += '\\\\['\n }\n else {\n let cls = pattern.slice(i + 1, end)\n if (cls.startsWith('!'))\n cls = `^${cls.slice(1)}`\n out += `[${cls}]`\n i = end\n }\n }\n else {\n out += escapeRegexChar(char)\n }\n }\n return new RegExp(`${out}$`)\n}\n\nexport function globLiteralPrefix(pattern: string): string {\n const firstMeta = pattern.search(/[*?[\\]{}]/)\n const prefix = firstMeta === -1 ? dirname(pattern) : pattern.slice(0, firstMeta)\n const slash = prefix.lastIndexOf('/')\n if (slash === -1)\n return ''\n return prefix.slice(0, slash)\n}\n\nexport function hasGlobPattern(path: string): boolean {\n return /[*?[\\]{}]/.test(path)\n}\n\n/**\n * True when a pattern can match files outside `cwd` — an absolute path, a\n * Windows drive, or any `..` segment. Such patterns can't use the `git\n * ls-files` path (git only knows files under the repo) and fall back to the\n * filesystem walk.\n */\nfunction patternEscapesCwd(pattern: string): boolean {\n const norm = pattern.split(sep).join('/')\n if (norm.startsWith('/') || /^[a-z]:/i.test(norm))\n return true\n return norm.split('/').includes('..')\n}\n\nasync function addMetadata(cwd: string, rel: string, includeMetadata: boolean): Promise<ListFileMetadata | null> {\n try {\n const s = await stat(resolve(cwd, rel))\n if (!s.isFile())\n return null\n return includeMetadata ? { path: rel, size: s.size, mtimeMs: s.mtimeMs } : { path: rel }\n }\n catch {\n return null\n }\n}\n\nfunction compilePattern(pattern: string): RegExp[] {\n return expandBraces(pattern.split(sep).join('/')).map(globPatternToRegex)\n}\n\n/** Match the (already non-ignored) `git ls-files` set against the glob pattern. */\nasync function matchGitFiles(\n gitFiles: readonly string[],\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[]> {\n const regexes = compilePattern(pattern)\n const out: ListFileMetadata[] = []\n for (const rel of gitFiles) {\n if (signal?.aborted || out.length >= limit)\n break\n if (!regexes.some(regex => regex.test(rel)))\n continue\n out.push(includeMetadata ? await addMetadata(cwd, rel, true) ?? { path: rel } : { path: rel })\n }\n return out.sort((a, b) => a.path.localeCompare(b.path))\n}\n\n/** Depth-first walk that matches against `regexes` and stops at `limit`. */\nasync function walkMatch(\n root: string,\n prefix: string,\n regexes: RegExp[],\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n out: ListFileMetadata[],\n): Promise<void> {\n if (out.length >= limit || signal?.aborted)\n return\n let entries: Array<{ name: string, isDirectory: () => boolean, isFile: () => boolean }>\n try {\n entries = await readdir(resolve(root, prefix), { encoding: 'utf8', withFileTypes: true })\n }\n catch {\n return\n }\n for (const entry of entries) {\n if (out.length >= limit || signal?.aborted)\n return\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name\n if (entry.isDirectory()) {\n await walkMatch(root, rel, regexes, cwd, limit, includeMetadata, signal, out)\n }\n else if (entry.isFile() && regexes.some(regex => regex.test(rel))) {\n out.push(includeMetadata ? await addMetadata(cwd, rel, true) ?? { path: rel } : { path: rel })\n }\n }\n}\n\nasync function globPortable(\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[]> {\n const normalized = pattern.split(sep).join('/')\n const startPrefix = globLiteralPrefix(normalized)\n const regexes = expandBraces(normalized).map(globPatternToRegex)\n const out: ListFileMetadata[] = []\n await walkMatch(cwd, startPrefix, regexes, cwd, limit, includeMetadata, signal, out)\n return out.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nasync function collectFromIterable(\n iter: AsyncIterable<string>,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[] | null> {\n const results: ListFileMetadata[] = []\n // A native scan can throw mid-iteration on a pathological tree (e.g. a\n // recursive symlink cycle → ENAMETOOLONG) and there's no way to resume it.\n // Signal the caller (null) to recover via the portable walk, which recurses\n // only into real directories and isolates per-directory errors.\n try {\n for await (const rel of iter) {\n if (signal?.aborted)\n break\n const entry = await addMetadata(cwd, rel, includeMetadata)\n if (!entry)\n continue\n results.push(entry)\n if (results.length >= limit)\n break\n }\n }\n catch {\n return null\n }\n return results.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nfunction globViaBun(\n BunGlob: BunGlobCtor,\n pattern: string,\n cwd: string,\n limit: number,\n includeMetadata: boolean,\n signal: AbortSignal | undefined,\n): Promise<ListFileMetadata[] | null> {\n // `dot: true` keeps dotfile matching consistent with the Node + portable\n // paths; `onlyFiles: true` mirrors their file-only results.\n const scan = new BunGlob(pattern).scan({ cwd, onlyFiles: true, dot: true })\n return collectFromIterable(scan, cwd, limit, includeMetadata, signal)\n}\n\nexport async function globFilesLocal(\n pattern: string,\n cwd: string,\n options: { limit: number, metadata?: boolean, gitignore?: boolean, signal?: AbortSignal },\n): Promise<ListFileMetadata[]> {\n const includeMetadata = options.metadata === true\n const { limit, signal } = options\n\n // Default path: intersect the pattern with git's non-ignored file set. Git\n // skips `.gitignore`d trees (`node_modules`, build dirs) entirely, so this is\n // both correct and fast — and never triggers the Bun `fs.glob` hang. The\n // test-only force-portable flag also bypasses it so the filesystem walker\n // stays directly exercisable.\n if (options.gitignore !== false && !forcePortable() && !patternEscapesCwd(pattern)) {\n const gitFiles = await gitListFilesLocal(cwd, signal)\n if (gitFiles)\n return matchGitFiles(gitFiles, pattern, cwd, limit, includeMetadata, signal)\n }\n\n // Fallback path: filesystem glob (gitignore disabled, not a git repo, or the\n // pattern escapes cwd). Prefer a fast native scanner; if it throws on a\n // pathological tree (null), recover via the portable walk.\n const bunGlob = loadBunGlob()\n if (bunGlob) {\n const viaBun = await globViaBun(bunGlob, pattern, cwd, limit, includeMetadata, signal)\n if (viaBun)\n return viaBun\n }\n else {\n const nodeGlob = await loadNodeGlob()\n if (nodeGlob) {\n const viaNode = await collectFromIterable(nodeGlob(pattern, { cwd }), cwd, limit, includeMetadata, signal)\n if (viaNode)\n return viaNode\n }\n }\n\n return globPortable(pattern, cwd, limit, includeMetadata, signal)\n}\n\n// `globFilesViaShell` moved to `./glob-shell` (node-free) so remote-only\n// contexts can import it without pulling this module's `node:fs` imports.\n// Re-exported here for back-compat.\nexport { globFilesViaShell } from './glob-shell'\n"],"mappings":"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"}
|
package/dist/headless.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { An as FormattedHeadlessTurnEvent, Bn as ProviderTranscriptFormat, Fn as HeadlessResult, Gn as headlessEventToJsonl, Hn as formatHeadlessResult, In as HeadlessStatus, Jn as runHeadless, Kn as installHeadlessEventAdapter, Ln as HeadlessUsage, Mn as HeadlessEvent, Nn as HeadlessOptions, Pn as HeadlessOutputFormat, Rn as OpenAIChatContentPart, Un as formatHeadlessTurnEvent, Vn as exitCodeForHeadlessResult, Wn as formattedHeadlessTurnEventToJsonl, Xn as transcriptToProviderMessages, Yn as transcriptToOpenAIMessages, jn as HeadlessErrorInfo, kn as FormattedHeadlessResult, qn as providerTranscriptFormatForProvider, zn as OpenAIChatMessage } from "./index-
|
|
1
|
+
import { An as FormattedHeadlessTurnEvent, Bn as ProviderTranscriptFormat, Fn as HeadlessResult, Gn as headlessEventToJsonl, Hn as formatHeadlessResult, In as HeadlessStatus, Jn as runHeadless, Kn as installHeadlessEventAdapter, Ln as HeadlessUsage, Mn as HeadlessEvent, Nn as HeadlessOptions, Pn as HeadlessOutputFormat, Rn as OpenAIChatContentPart, Un as formatHeadlessTurnEvent, Vn as exitCodeForHeadlessResult, Wn as formattedHeadlessTurnEventToJsonl, Xn as transcriptToProviderMessages, Yn as transcriptToOpenAIMessages, jn as HeadlessErrorInfo, kn as FormattedHeadlessResult, qn as providerTranscriptFormatForProvider, zn as OpenAIChatMessage } from "./index-AVZ6pYpi.js";
|
|
2
2
|
export { FormattedHeadlessResult, FormattedHeadlessTurnEvent, HeadlessErrorInfo, HeadlessEvent, HeadlessOptions, HeadlessOutputFormat, HeadlessResult, HeadlessStatus, HeadlessUsage, OpenAIChatContentPart, OpenAIChatMessage, ProviderTranscriptFormat, exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, runHeadless, transcriptToOpenAIMessages, transcriptToProviderMessages };
|
package/dist/headless.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { a as isWireTurn, i as documentBlockMarker, l as toolResultToText, n as assertResolvedMediaBlock } from "./types-BIarq1qE.js";
|
|
2
|
-
import {
|
|
3
|
-
import { r as createProcessContext } from "./contexts-
|
|
2
|
+
import { t as createAgent, ut as basic_default } from "./agent--VPMZ0nT.js";
|
|
3
|
+
import { r as createProcessContext } from "./contexts-0rmrBhTK.js";
|
|
4
4
|
import { t as audioFormatFromMediaType } from "./media-sniff-Bn76JxAu.js";
|
|
5
5
|
import { p as toAnthropic, s as ensureToolResultPairing } from "./messages-CvHfYB7f.js";
|
|
6
|
-
import {
|
|
7
|
-
import { t as createRunSummaryCollector } from "./run-summary-
|
|
6
|
+
import { d as createMemoryStore, t as createSession } from "./session-jLsc_kMH.js";
|
|
7
|
+
import { t as createRunSummaryCollector } from "./run-summary-BU_NgwUT.js";
|
|
8
8
|
//#region src/headless.ts
|
|
9
9
|
function exitCodeForHeadlessResult(result) {
|
|
10
10
|
switch (result.status) {
|
|
@@ -24,6 +24,10 @@ globalThis.onmessage = (event) => {
|
|
|
24
24
|
controllers.get(request.requestId)?.abort();
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
+
if (request.type === "release") {
|
|
28
|
+
indexes.delete(request.indexId);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
27
31
|
if (request.type === "build") {
|
|
28
32
|
const controller = new AbortController();
|
|
29
33
|
controllers.set(request.requestId, controller);
|
|
@@ -36,7 +40,8 @@ globalThis.onmessage = (event) => {
|
|
|
36
40
|
requestId: request.requestId,
|
|
37
41
|
result: {
|
|
38
42
|
indexId: request.indexId,
|
|
39
|
-
length: index.turns.length
|
|
43
|
+
length: index.turns.length,
|
|
44
|
+
bytes: index.turns.reduce((n, t) => n + t.text.length, 0)
|
|
40
45
|
}
|
|
41
46
|
});
|
|
42
47
|
}).catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-search-worker.js","names":[],"sources":["../src/tui/history-search-worker.ts"],"sourcesContent":["import type { SessionSearchIndex } from '../chat/history-search'\nimport {\n buildSessionSearchIndexAsync,\n searchSessionHistoryIndexAsync,\n searchSessionIndexAsync,\n} from '../chat/history-search'\n\ninterface RegisterRequest {\n type: 'register'\n indexId: string\n index: SessionSearchIndex\n}\n\ninterface BuildRequest {\n type: 'build'\n requestId: number\n indexId: string\n turns: SessionSearchIndex['turns'][number]['turn'][]\n}\n\ninterface SearchRequest {\n type: 'search'\n requestId: number\n indexId: string\n query: string\n limit: number\n}\n\ninterface HistoryRequest {\n type: 'history'\n requestId: number\n indexId: string\n query: string\n maxExcerpts: number\n}\n\ninterface CancelRequest {\n type: 'cancel'\n requestId: number\n}\n\ntype WorkerRequest = RegisterRequest | BuildRequest | SearchRequest | HistoryRequest | CancelRequest\n\nconst indexes = new Map<string, SessionSearchIndex>()\nconst controllers = new Map<number, AbortController>()\n\nfunction trimIndexes(): void {\n while (indexes.size > 64) {\n const oldest = indexes.keys().next().value\n if (oldest === undefined)\n return\n indexes.delete(oldest)\n }\n}\n\nglobalThis.onmessage = (event: MessageEvent<WorkerRequest>) => {\n const request = event.data\n if (request.type === 'register') {\n indexes.set(request.indexId, request.index)\n trimIndexes()\n postMessage({ type: 'registered', indexId: request.indexId })\n return\n }\n if (request.type === 'cancel') {\n controllers.get(request.requestId)?.abort()\n return\n }\n if (request.type === 'build') {\n const controller = new AbortController()\n controllers.set(request.requestId, controller)\n void buildSessionSearchIndexAsync(request.turns, { signal: controller.signal }).then((index) => {\n if (controller.signal.aborted)\n return\n indexes.set(request.indexId, index)\n trimIndexes()\n postMessage({ type: 'result', requestId: request.requestId, result: { indexId: request.indexId, length: index.turns.length } })\n }).catch((error) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'error', requestId: request.requestId, message: error instanceof Error ? error.message : String(error) })\n }).finally(() => controllers.delete(request.requestId))\n return\n }\n const index = indexes.get(request.indexId)\n if (!index) {\n postMessage({ type: 'error', requestId: request.requestId, message: `Unknown search index: ${request.indexId}` })\n return\n }\n // Refresh LRU recency on hit (Map preserves insertion order), mirroring the\n // app-side cache — otherwise the hottest index is the first one evicted.\n indexes.delete(request.indexId)\n indexes.set(request.indexId, index)\n const controller = new AbortController()\n controllers.set(request.requestId, controller)\n const work = request.type === 'search'\n ? searchSessionIndexAsync(index, request.query, { limit: request.limit, signal: controller.signal })\n : searchSessionHistoryIndexAsync(index, request.query, request.maxExcerpts, undefined, controller.signal)\n void work.then((result) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'result', requestId: request.requestId, result })\n }).catch((error) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'error', requestId: request.requestId, message: error instanceof Error ? error.message : String(error) })\n }).finally(() => {\n controllers.delete(request.requestId)\n })\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"history-search-worker.js","names":[],"sources":["../src/tui/history-search-worker.ts"],"sourcesContent":["import type { SessionSearchIndex } from '../chat/history-search'\nimport {\n buildSessionSearchIndexAsync,\n searchSessionHistoryIndexAsync,\n searchSessionIndexAsync,\n} from '../chat/history-search'\n\ninterface RegisterRequest {\n type: 'register'\n indexId: string\n index: SessionSearchIndex\n}\n\ninterface BuildRequest {\n type: 'build'\n requestId: number\n indexId: string\n turns: SessionSearchIndex['turns'][number]['turn'][]\n}\n\ninterface SearchRequest {\n type: 'search'\n requestId: number\n indexId: string\n query: string\n limit: number\n}\n\ninterface HistoryRequest {\n type: 'history'\n requestId: number\n indexId: string\n query: string\n maxExcerpts: number\n}\n\ninterface CancelRequest {\n type: 'cancel'\n requestId: number\n}\n\ninterface ReleaseRequest {\n type: 'release'\n indexId: string\n}\n\ntype WorkerRequest = RegisterRequest | BuildRequest | SearchRequest | HistoryRequest | CancelRequest | ReleaseRequest\n\nconst indexes = new Map<string, SessionSearchIndex>()\nconst controllers = new Map<number, AbortController>()\n\nfunction trimIndexes(): void {\n while (indexes.size > 64) {\n const oldest = indexes.keys().next().value\n if (oldest === undefined)\n return\n indexes.delete(oldest)\n }\n}\n\nglobalThis.onmessage = (event: MessageEvent<WorkerRequest>) => {\n const request = event.data\n if (request.type === 'register') {\n indexes.set(request.indexId, request.index)\n trimIndexes()\n postMessage({ type: 'registered', indexId: request.indexId })\n return\n }\n if (request.type === 'cancel') {\n controllers.get(request.requestId)?.abort()\n return\n }\n if (request.type === 'release') {\n // Client-driven eviction (the main-thread cache dropped its handle).\n // Fire-and-forget: releasing an already-evicted id is a no-op, and\n // the client never awaits it.\n indexes.delete(request.indexId)\n return\n }\n if (request.type === 'build') {\n const controller = new AbortController()\n controllers.set(request.requestId, controller)\n void buildSessionSearchIndexAsync(request.turns, { signal: controller.signal }).then((index) => {\n if (controller.signal.aborted)\n return\n indexes.set(request.indexId, index)\n trimIndexes()\n // `bytes` (sum of indexed text lengths) feeds the client's byte-aware\n // cache budget — the worker is the only place the indexed size is\n // known without a second extraction pass on the main thread.\n postMessage({ type: 'result', requestId: request.requestId, result: { indexId: request.indexId, length: index.turns.length, bytes: index.turns.reduce((n, t) => n + t.text.length, 0) } })\n }).catch((error) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'error', requestId: request.requestId, message: error instanceof Error ? error.message : String(error) })\n }).finally(() => controllers.delete(request.requestId))\n return\n }\n const index = indexes.get(request.indexId)\n if (!index) {\n postMessage({ type: 'error', requestId: request.requestId, message: `Unknown search index: ${request.indexId}` })\n return\n }\n // Refresh LRU recency on hit (Map preserves insertion order), mirroring the\n // app-side cache — otherwise the hottest index is the first one evicted.\n indexes.delete(request.indexId)\n indexes.set(request.indexId, index)\n const controller = new AbortController()\n controllers.set(request.requestId, controller)\n const work = request.type === 'search'\n ? searchSessionIndexAsync(index, request.query, { limit: request.limit, signal: controller.signal })\n : searchSessionHistoryIndexAsync(index, request.query, request.maxExcerpts, undefined, controller.signal)\n void work.then((result) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'result', requestId: request.requestId, result })\n }).catch((error) => {\n if (!controller.signal.aborted)\n postMessage({ type: 'error', requestId: request.requestId, message: error instanceof Error ? error.message : String(error) })\n }).finally(() => {\n controllers.delete(request.requestId)\n })\n}\n"],"mappings":";;AAgDA,MAAM,0BAAU,IAAI,IAAgC;AACpD,MAAM,8BAAc,IAAI,IAA6B;AAErD,SAAS,cAAoB;CAC3B,OAAO,QAAQ,OAAO,IAAI;EACxB,MAAM,SAAS,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACrC,IAAI,WAAW,KAAA,GACb;EACF,QAAQ,OAAO,MAAM;CACvB;AACF;AAEA,WAAW,aAAa,UAAuC;CAC7D,MAAM,UAAU,MAAM;CACtB,IAAI,QAAQ,SAAS,YAAY;EAC/B,QAAQ,IAAI,QAAQ,SAAS,QAAQ,KAAK;EAC1C,YAAY;EACZ,YAAY;GAAE,MAAM;GAAc,SAAS,QAAQ;EAAQ,CAAC;EAC5D;CACF;CACA,IAAI,QAAQ,SAAS,UAAU;EAC7B,YAAY,IAAI,QAAQ,SAAS,CAAC,EAAE,MAAM;EAC1C;CACF;CACA,IAAI,QAAQ,SAAS,WAAW;EAI9B,QAAQ,OAAO,QAAQ,OAAO;EAC9B;CACF;CACA,IAAI,QAAQ,SAAS,SAAS;EAC5B,MAAM,aAAa,IAAI,gBAAgB;EACvC,YAAY,IAAI,QAAQ,WAAW,UAAU;EAC7C,6BAAkC,QAAQ,OAAO,EAAE,QAAQ,WAAW,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU;GAC9F,IAAI,WAAW,OAAO,SACpB;GACF,QAAQ,IAAI,QAAQ,SAAS,KAAK;GAClC,YAAY;GAIZ,YAAY;IAAE,MAAM;IAAU,WAAW,QAAQ;IAAW,QAAQ;KAAE,SAAS,QAAQ;KAAS,QAAQ,MAAM,MAAM;KAAQ,OAAO,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,KAAK,QAAQ,CAAC;IAAE;GAAE,CAAC;EAC3L,CAAC,CAAC,CAAC,OAAO,UAAU;GAClB,IAAI,CAAC,WAAW,OAAO,SACrB,YAAY;IAAE,MAAM;IAAS,WAAW,QAAQ;IAAW,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GAAE,CAAC;EAChI,CAAC,CAAC,CAAC,cAAc,YAAY,OAAO,QAAQ,SAAS,CAAC;EACtD;CACF;CACA,MAAM,QAAQ,QAAQ,IAAI,QAAQ,OAAO;CACzC,IAAI,CAAC,OAAO;EACV,YAAY;GAAE,MAAM;GAAS,WAAW,QAAQ;GAAW,SAAS,yBAAyB,QAAQ;EAAU,CAAC;EAChH;CACF;CAGA,QAAQ,OAAO,QAAQ,OAAO;CAC9B,QAAQ,IAAI,QAAQ,SAAS,KAAK;CAClC,MAAM,aAAa,IAAI,gBAAgB;CACvC,YAAY,IAAI,QAAQ,WAAW,UAAU;CAI7C,CAHa,QAAQ,SAAS,WAC1B,wBAAwB,OAAO,QAAQ,OAAO;EAAE,OAAO,QAAQ;EAAO,QAAQ,WAAW;CAAO,CAAC,IACjG,+BAA+B,OAAO,QAAQ,OAAO,QAAQ,aAAa,KAAA,GAAW,WAAW,MAAM,EAAA,CAChG,MAAM,WAAW;EACzB,IAAI,CAAC,WAAW,OAAO,SACrB,YAAY;GAAE,MAAM;GAAU,WAAW,QAAQ;GAAW;EAAO,CAAC;CACxE,CAAC,CAAC,CAAC,OAAO,UAAU;EAClB,IAAI,CAAC,WAAW,OAAO,SACrB,YAAY;GAAE,MAAM;GAAS,WAAW,QAAQ;GAAW,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAAE,CAAC;CAChI,CAAC,CAAC,CAAC,cAAc;EACf,YAAY,OAAO,QAAQ,SAAS;CACtC,CAAC;AACH"}
|