@bastani/atomic 0.9.18-alpha.3 → 0.9.18-alpha.5
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/CHANGELOG.md +35 -0
- package/dist/builtin/intercom/CHANGELOG.md +8 -0
- package/dist/builtin/intercom/README.md +1 -1
- package/dist/builtin/intercom/index.bundle.mjs +13 -4
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/core/agent-session-runtime.js +2 -2
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
- package/dist/core/anthropic-thinking-guard.js +71 -5
- package/dist/core/anthropic-thinking-guard.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +2 -2
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/model-config.d.ts +9 -4
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -2
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/provider-composer-internal.d.ts +1 -1
- package/dist/core/provider-composer-internal.d.ts.map +1 -1
- package/dist/core/provider-composer-internal.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +10 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +25 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +9 -8
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -3
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +2 -2
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +12 -11
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/search.d.ts.map +1 -1
- package/dist/core/tools/search.js +20 -19
- package/dist/core/tools/search.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +19 -18
- package/dist/core/tools/write.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +6 -14
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +9 -4
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.js +10 -7
- package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -2
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/docs/compaction.md +2 -0
- package/docs/custom-provider.md +2 -1
- package/docs/extensions.md +2 -0
- package/docs/intercom.md +1 -1
- package/docs/models/artificial-analysis-index.md +2 -1
- package/docs/models/model-selection.md +28 -19
- package/docs/models/pareto-efficiency.md +37 -29
- package/docs/models.md +43 -0
- package/docs/terminal-setup.md +15 -0
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/core/tools/search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile as fsReadFile, stat as fsStat } from \"node:fs/promises\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { experimentalToolSamplingProperty } from \"../experimental.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { normalizePathLikeInput, splitPathLikeGlob } from \"./glob-path-utils.ts\";\nimport { createGrepToolDefinition, type GrepToolOptions } from \"./grep.ts\";\nimport { createHashlineSnapshotStore, type HashlineSnapshotStore, recordHashlineSnapshot } from \"./hashline.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { invalidArgText, shortenPath, str } from \"./render-utils.ts\";\nimport {\n\ttype InternalResourceContext,\n\tparseArchiveSelector,\n\treadArchiveSelector,\n\tresolveArchiveSelector,\n\tresolveInternalSelector,\n\ttype SqliteSelector,\n\tsearchArchiveSelector,\n\tsearchInternalSelector,\n\tsearchSqliteSelector,\n\tsqliteSelectorForPath,\n} from \"./resource-selectors.ts\";\nimport { buildSearchDetails, type SearchToolDetails } from \"./search-details.ts\";\nimport { filterSearchOutputByLineRange, type SearchLineRange, splitLineRangeSelector } from \"./search-line-ranges.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, truncateHead } from \"./truncate.ts\";\n\nexport type { SearchToolDetails } from \"./search-details.ts\";\n\nconst searchSchema = Type.Object(\n\t{\n\t\tpattern: Type.String({\n\t\t\tdescription:\n\t\t\t\t\"Regex pattern. Whitespace-only patterns are rejected; otherwise the pattern is preserved verbatim.\",\n\t\t}),\n\t\tpaths: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.String({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"File, directory, glob, internal URL, or <file>:<lines> selector to search. Omitted or empty searches the workspace root.\",\n\t\t\t\t}),\n\t\t\t\tType.Array(\n\t\t\t\t\tType.String({\n\t\t\t\t\t\tdescription: \"File, directory, glob, internal URL, or <file>:<lines> selector to search.\",\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t]),\n\t\t),\n\t\ti: Type.Optional(Type.Boolean({ description: \"Case-insensitive search.\" })),\n\t\tgitignore: Type.Optional(Type.Boolean({ description: \"Respect gitignore.\" })),\n\t\tcase: Type.Optional(\n\t\t\tType.Boolean({ description: \"Set false for case-insensitive search (oh-my-pi compatibility).\" }),\n\t\t),\n\t\tskip: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Number({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Files to skip before collecting results; use to paginate when the previous call hit the file limit.\",\n\t\t\t\t}),\n\t\t\t\tType.Null(),\n\t\t\t]),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\nexport const searchToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Search file contents with regex patterns.\",\n\tguidelines: Object.freeze([] as const),\n} as const);\nexport type SearchToolInput = Static<typeof searchSchema>;\nexport type SearchToolOptions = GrepToolOptions & {\n\thashlineStore?: HashlineSnapshotStore;\n\tcontextBefore?: number;\n\tcontextAfter?: number;\n};\nfunction delimiterInExistingSearchGlobRoot(value: string, cwd: string): boolean {\n\tconst selector = splitLineRangeSelector(value);\n\tconst parsed = splitPathLikeGlob(selector.path);\n\treturn !!parsed.glob && /[;,\\s]/.test(parsed.basePath) && existsSync(resolveToCwd(parsed.basePath, cwd));\n}\nfunction archiveSelectorExists(value: string, cwd: string): boolean {\n\tconst archive = parseArchiveSelector(value);\n\tif (!archive) return false;\n\tconst resolved = resolveArchiveSelector(archive, cwd);\n\tif (!existsSync(resolved.archivePath)) return false;\n\tif (!resolved.memberPath) return true;\n\ttry {\n\t\treadArchiveSelector(resolved);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction searchPathResolvable(value: string, cwd: string): boolean {\n\tconst selector = splitLineRangeSelector(value),\n\t\tarchive = parseArchiveSelector(selector.path);\n\tif (archive) return archiveSelectorExists(selector.path, cwd);\n\tconst sqlite = sqliteSelectorForPath(selector.path, cwd);\n\treturn (\n\t\t!!sqlite ||\n\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(selector.path) ||\n\t\texistsSync(resolveToCwd(splitPathLikeGlob(selector.path).basePath, cwd))\n\t);\n}\n\nfunction normalizePaths(pathsValue: string | string[] | undefined, cwd: string): string[] {\n\tconst inputs = Array.isArray(pathsValue)\n\t\t? pathsValue.length > 0\n\t\t\t? pathsValue\n\t\t\t: [\".\"]\n\t\t: pathsValue === undefined\n\t\t\t? [\".\"]\n\t\t\t: [pathsValue];\n\tconst expanded: string[] = [];\n\tfor (const input of inputs) {\n\t\tconst raw = normalizePathLikeInput(input);\n\t\tif (raw === \"\") {\n\t\t\texpanded.push(\".\");\n\t\t\tcontinue;\n\t\t}\n\t\tconst resourceLike = /^[a-z]+:\\/\\//i.test(raw) || /^[^:]+\\.(?:zip|jar|tar|tgz|gz|sqlite|db):/i.test(raw);\n\t\tif (\n\t\t\texistsSync(resolveToCwd(splitLineRangeSelector(raw).path, cwd)) ||\n\t\t\tdelimiterInExistingSearchGlobRoot(raw, cwd) ||\n\t\t\tarchiveSelectorExists(raw, cwd)\n\t\t) {\n\t\t\texpanded.push(raw);\n\t\t\tcontinue;\n\t\t}\n\t\tconst chunks = raw\n\t\t\t.split(/[;\\s]+/)\n\t\t\t.map(normalizePathLikeInput)\n\t\t\t.filter(Boolean);\n\t\tconst parts = chunks.flatMap((chunk) =>\n\t\t\tsearchPathResolvable(chunk, cwd) ? [chunk] : chunk.split(\",\").map(normalizePathLikeInput).filter(Boolean),\n\t\t);\n\t\tconst commaOrSemicolon = /[;,]/.test(raw),\n\t\t\tcanSplit = commaOrSemicolon\n\t\t\t\t? parts.some((part) => searchPathResolvable(part, cwd))\n\t\t\t\t: parts.every((part) => searchPathResolvable(part, cwd));\n\t\tif (parts.length > 1 && canSplit) expanded.push(...parts);\n\t\telse if (resourceLike) expanded.push(raw);\n\t\telse expanded.push(raw);\n\t}\n\treturn expanded;\n}\n\ninterface SearchTarget {\n\tpath: string;\n\tglob?: string;\n\tlineRanges?: SearchLineRange[];\n\tarchive?: ReturnType<typeof parseArchiveSelector>;\n\tsqlite?: SqliteSelector;\n\tinternal?: string;\n}\n\ninterface SearchOutputGroup {\n\tpath: string;\n\tlines: string[];\n}\n\ninterface PagedSearchOutputGroup {\n\ttargetPath: string;\n\tvirtual: boolean;\n\tgroup: SearchOutputGroup;\n}\n\nconst DEFAULT_LIMIT = 20,\n\tINTERNAL_SKIP_LIMIT = 2000,\n\tMULTI_FILE_PER_FILE_MATCHES = 20,\n\tSINGLE_FILE_MATCHES = 200;\n\nfunction normalizeSkip(skip: number | null | undefined): number {\n\tif (skip === undefined || skip === null) return 0;\n\tif (!Number.isFinite(skip) || skip < 0) throw new Error(\"Skip must be a non-negative number\");\n\treturn Math.floor(skip);\n}\nfunction markFileLimit(details: SearchToolDetails, limit: number): void {\n\tdetails.fileLimitReached = true;\n\tdetails.meta = { ...(details.meta ?? {}), limits: { ...(details.meta?.limits ?? {}), fileLimit: limit } };\n}\nfunction fileLimitDetails(limit: number): SearchToolDetails {\n\tconst details: SearchToolDetails = {};\n\tmarkFileLimit(details, limit);\n\treturn details;\n}\nfunction continuationHint(limit: number, skip: number): string {\n\treturn `[${limit} matching files shown. Use skip=${skip + limit} to view more.]`;\n}\nfunction internalCapHint(): string {\n\treturn `[Search collected the first ${INTERNAL_SKIP_LIMIT} matches before pagination; refine the pattern or path for later results.]`;\n}\nfunction hasFileLimit(details: unknown): boolean {\n\treturn (\n\t\ttypeof details === \"object\" &&\n\t\tdetails !== null &&\n\t\t(details as { fileLimitReached?: unknown }).fileLimitReached === true\n\t);\n}\n\nfunction isResourceSelector(value: string): boolean {\n\treturn (\n\t\t/^[^:]+\\.(zip|jar|tar|tgz|gz|sqlite|db):/i.test(value) ||\n\t\t/^[a-z]+:\\/\\//i.test(value) ||\n\t\tvalue.startsWith(\"skill://\")\n\t);\n}\n\nfunction normalizeSearchTargets(pathsValue: string | string[] | undefined, cwd: string): SearchTarget[] {\n\treturn normalizePaths(pathsValue, cwd).map((searchPath) => {\n\t\tconst directSqlite = sqliteSelectorForPath(searchPath, cwd);\n\t\tif (directSqlite?.rowId) return { path: searchPath, sqlite: directSqlite };\n\t\tif (archiveSelectorExists(searchPath, cwd)) {\n\t\t\tconst archive = parseArchiveSelector(searchPath)!;\n\t\t\treturn { path: searchPath, archive };\n\t\t}\n\t\tconst selector = splitLineRangeSelector(searchPath);\n\t\tconst sqliteDirect = sqliteSelectorForPath(selector.path, cwd);\n\t\tif (sqliteDirect) return { path: selector.path, lineRanges: selector.lineRanges, sqlite: sqliteDirect };\n\t\tconst archive = parseArchiveSelector(selector.path);\n\t\tif (archive) return { path: selector.path, lineRanges: selector.lineRanges, archive };\n\t\tif (selector.path.startsWith(\"local://\")) {\n\t\t\tconst sourcePath = resolveInternalSelector(selector.path, cwd);\n\t\t\tif (sourcePath) {\n\t\t\t\tconst parsed = splitPathLikeGlob(sourcePath);\n\t\t\t\treturn { path: parsed.basePath, glob: parsed.glob, lineRanges: selector.lineRanges };\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(selector.path)\n\t\t)\n\t\t\treturn { path: selector.path, lineRanges: selector.lineRanges, internal: selector.path };\n\t\tif (isResourceSelector(selector.path))\n\t\t\tthrow new Error(`Search resource selectors are not supported by this filesystem backend: ${searchPath}`);\n\t\tconst parsed = splitPathLikeGlob(selector.path);\n\t\treturn { path: parsed.basePath, glob: parsed.glob, lineRanges: selector.lineRanges };\n\t});\n}\n\nfunction stripExtendedRegexWhitespace(pattern: string): string {\n\tlet out = \"\",\n\t\tescaped = false,\n\t\tinClass = false,\n\t\tinComment = false;\n\tfor (const ch of pattern) {\n\t\tif (inComment) {\n\t\t\tif (ch === \"\\n\" || ch === \"\\r\") inComment = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (escaped) {\n\t\t\tout += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tout += ch;\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"[\") inClass = true;\n\t\telse if (ch === \"]\") inClass = false;\n\t\tif (!inClass && ch === \"#\") {\n\t\t\tinComment = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inClass && /\\s/.test(ch)) continue;\n\t\tout += ch;\n\t}\n\treturn out;\n}\nfunction normalizeInlineSearchPattern(pattern: string, ignoreCase: boolean): { pattern: string; flags: string } {\n\tconst match = pattern.match(/^\\(\\?([imsUx-]+)\\)([\\s\\S]*)$/),\n\t\tflags = new Set<string>();\n\tif (ignoreCase) flags.add(\"i\");\n\tif (match) {\n\t\tconst inline = match[1] ?? \"\";\n\t\tfor (const flag of inline) if (flag === \"i\" || flag === \"m\" || flag === \"s\") flags.add(flag);\n\t\treturn {\n\t\t\tpattern: inline.includes(\"x\") ? stripExtendedRegexWhitespace(match[2] ?? \"\") : (match[2] ?? \"\"),\n\t\t\tflags: [...flags].join(\"\"),\n\t\t};\n\t}\n\treturn { pattern, flags: [...flags].join(\"\") };\n}\n\nasync function searchFileLineRanges(\n\ttarget: SearchTarget,\n\tcwd: string,\n\tpattern: string,\n\tignoreCase: boolean,\n\tcontextBefore = 1,\n\tcontextAfter = 3,\n): Promise<string | undefined> {\n\tif (!target.lineRanges?.length || target.glob || target.archive || target.sqlite || target.internal)\n\t\treturn undefined;\n\tconst absolutePath = resolveToCwd(target.path, cwd);\n\tif (\n\t\t!(await fsStat(absolutePath)\n\t\t\t.then((stat) => stat.isFile())\n\t\t\t.catch(() => false))\n\t)\n\t\treturn undefined;\n\tconst source = (await fsReadFile(absolutePath, \"utf8\")).split(\"\\n\");\n\tconst normalized = normalizeInlineSearchPattern(pattern, ignoreCase);\n\tlet regex: RegExp;\n\ttry {\n\t\tregex = new RegExp(normalized.pattern, normalized.flags);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tconst matchLines = new Set<number>();\n\tsource.forEach((line, index) => {\n\t\tregex.lastIndex = 0;\n\t\tif (regex.test(line)) matchLines.add(index + 1);\n\t});\n\tconst outputLines = new Set<number>();\n\tfor (const line of matchLines)\n\t\tfor (let n = Math.max(1, line - contextBefore); n <= Math.min(source.length, line + contextAfter); n++)\n\t\t\toutputLines.add(n);\n\tconst text =\n\t\t[...outputLines]\n\t\t\t.sort((a, b) => a - b)\n\t\t\t.map(\n\t\t\t\t(n) =>\n\t\t\t\t\t`${target.path}${matchLines.has(n) ? \":\" : \"-\"}${n}${matchLines.has(n) ? \":\" : \"-\"} ${source[n - 1] ?? \"\"}`,\n\t\t\t)\n\t\t\t.join(\"\\n\") || \"No matches found\";\n\treturn filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n}\n\nfunction groupSearchOutput(text: string): SearchOutputGroup[] {\n\tconst groups: SearchOutputGroup[] = [];\n\tconst byPath = new Map<string, SearchOutputGroup>();\n\tfor (const line of text.split(\"\\n\")) {\n\t\tconst match = line.match(/^(.+?)(?::[^:]+: |:\\d+: |-\\d+- )/);\n\t\tif (!match) continue;\n\t\tconst filePath = match[1]!;\n\t\tlet current = byPath.get(filePath);\n\t\tif (!current) {\n\t\t\tcurrent = { path: filePath, lines: [] };\n\t\t\tbyPath.set(filePath, current);\n\t\t\tgroups.push(current);\n\t\t}\n\t\tif (!current.lines.includes(line)) current.lines.push(line);\n\t}\n\treturn groups;\n}\nfunction isVirtualSearchTarget(target: SearchTarget | undefined): boolean {\n\treturn !!(target?.archive || target?.sqlite || target?.internal);\n}\n\nasync function addHashlineHeadersToSearchOutput(\n\ttext: string,\n\tcwd: string,\n\ttargetPath: string,\n\thashlineStore: HashlineSnapshotStore,\n): Promise<string> {\n\tconst groups = groupSearchOutput(text);\n\tif (groups.length === 0) return text;\n\tconst searchRoot = resolveToCwd(targetPath, cwd);\n\tconst targetIsFile = await fsStat(searchRoot)\n\t\t.then((stat) => stat.isFile())\n\t\t.catch(() => false);\n\tconst rendered: string[] = [];\n\tlet lastDir = \"\";\n\tfor (const group of groups) {\n\t\tlet absolutePath = targetIsFile ? searchRoot : join(searchRoot, group.path);\n\t\ttry {\n\t\t\tawait fsReadFile(absolutePath);\n\t\t} catch {\n\t\t\tabsolutePath = resolvePath(cwd, group.path);\n\t\t}\n\t\ttry {\n\t\t\tconst content = await fsReadFile(absolutePath, \"utf-8\");\n\t\t\tconst snapshot = recordHashlineSnapshot(absolutePath, cwd, content, hashlineStore);\n\t\t\tconst dir = dirname(snapshot.displayPath);\n\t\t\tif (dir !== \".\" && dir !== lastDir) {\n\t\t\t\trendered.push(`# ${dir}/`);\n\t\t\t\tlastDir = dir;\n\t\t\t}\n\t\t\trendered.push(`[${snapshot.displayPath}#${snapshot.tag}]`);\n\t\t\tfor (const line of group.lines) {\n\t\t\t\tconst match = line.match(/^.+?(?::(\\d+): |-(\\d+)- )(.*)$/);\n\t\t\t\tif (match) rendered.push(`${match[1] ? \"*\" : \" \"}${match[1] ?? match[2]}:${match[3] ?? \"\"}`);\n\t\t\t}\n\t\t} catch {\n\t\t\trendered.push(...group.lines);\n\t\t}\n\t}\n\treturn rendered.join(\"\\n\");\n}\n\nfunction applyDefaultSearchContext(text: string, before = 1, after = 3): string {\n\tconst groups = groupSearchOutput(text);\n\tif (groups.length === 0) return text;\n\tconst output: string[] = [];\n\tfor (const group of groups) {\n\t\tconst byLine = new Map<number, { line: string; isMatch: boolean }>();\n\t\tfor (const line of group.lines) {\n\t\t\tconst match = line.match(/^(.+?)(?::(\\d+): |-(\\d+)- )(.*)$/);\n\t\t\tif (!match) continue;\n\t\t\tconst number = Number.parseInt(match[2] ?? match[3] ?? \"0\", 10);\n\t\t\tconst isMatch = match[2] !== undefined;\n\t\t\tconst existing = byLine.get(number);\n\t\t\tif (!existing || (isMatch && !existing.isMatch)) byLine.set(number, { line, isMatch });\n\t\t}\n\t\tconst matchNumbers = [...byLine.values()]\n\t\t\t.filter((item) => item.isMatch)\n\t\t\t.map((item) =>\n\t\t\t\tNumber.parseInt(\n\t\t\t\t\titem.line.match(/(?::(\\d+): |-(\\d+)- )/)?.[1] ?? item.line.match(/-(\\d+)- /)?.[1] ?? \"0\",\n\t\t\t\t\t10,\n\t\t\t\t),\n\t\t\t);\n\t\tfor (const [number, item] of [...byLine.entries()].sort((a, b) => a[0] - b[0])) {\n\t\t\tif (\n\t\t\t\titem.isMatch ||\n\t\t\t\tmatchNumbers.some((lineNumber) => number >= lineNumber - before && number <= lineNumber + after)\n\t\t\t)\n\t\t\t\toutput.push(item.line);\n\t\t}\n\t}\n\treturn output.join(\"\\n\");\n}\n\nfunction isSearchMatchLine(line: string): boolean {\n\treturn /:\\d+: /.test(line);\n}\nfunction sliceGroupLinesByMatchCount(lines: readonly string[], matchLimit: number): string[] {\n\tif (matchLimit <= 0) return [];\n\tlet matches = 0;\n\tconst output: string[] = [];\n\tfor (const line of lines) {\n\t\tif (isSearchMatchLine(line)) {\n\t\t\tif (matches >= matchLimit) break;\n\t\t\tmatches++;\n\t\t}\n\t\toutput.push(line);\n\t}\n\treturn output;\n}\nfunction formatSearchGroups(groups: SearchOutputGroup[], limit: number, perFileLimit = 20): string {\n\treturn groups\n\t\t.slice(0, Math.max(0, limit))\n\t\t.flatMap((group) => sliceGroupLinesByMatchCount(group.lines, perFileLimit))\n\t\t.join(\"\\n\");\n}\n\nfunction dedupeRenderedSearchOutput(content: string): string {\n\tconst out: string[] = [],\n\t\tseen = new Set<string>();\n\tlet header = \"\",\n\t\tsawContinuationHint = false,\n\t\tsawCapHint = false;\n\tfor (const line of content.split(\"\\n\")) {\n\t\tconst h = line.match(/^\\[([^\\]#]+)#[0-9A-F]{4}\\]$/);\n\t\tif (h) header = h[1]!;\n\t\tif (/^\\[\\d+ matching files shown\\. Use skip=\\d+ to view more\\.\\]$/.test(line)) {\n\t\t\tif (sawContinuationHint) continue;\n\t\t\tsawContinuationHint = true;\n\t\t}\n\t\tif (line.startsWith(\"[Search collected the first \")) {\n\t\t\tif (sawCapHint) continue;\n\t\t\tsawCapHint = true;\n\t\t}\n\t\tconst m = header ? line.match(/^[* ]?(\\d+):/) : undefined;\n\t\tconst key = m ? `${header}:${m[1]}` : \"\";\n\t\tif (key && seen.has(key)) continue;\n\t\tif (key) seen.add(key);\n\t\tout.push(line);\n\t}\n\treturn out.join(\"\\n\");\n}\nfunction formatSearchCall(\n\targs: { pattern: string; path?: string; paths?: string | string[]; glob?: string; limit?: number } | undefined,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.ts\").theme,\n): string {\n\tconst pattern = str(args?.pattern);\n\tconst rawPaths = Array.isArray(args?.paths) ? args.paths.join(\", \") : args?.paths;\n\tconst rawPath = str(args?.path ?? rawPaths);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst glob = str(args?.glob);\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"search\")) +\n\t\t\" \" +\n\t\t(pattern === null ? invalidArg : theme.fg(\"accent\", `/${pattern || \"\"}/`)) +\n\t\ttheme.fg(\"toolOutput\", ` in ${path === null ? invalidArg : path}`);\n\tif (glob) text += theme.fg(\"toolOutput\", ` (${glob})`);\n\tif (limit !== undefined) text += theme.fg(\"toolOutput\", ` limit ${limit}`);\n\treturn text;\n}\n\nexport function createSearchToolDefinition(\n\tcwd: string,\n\toptions?: SearchToolOptions,\n): ToolDefinition<typeof searchSchema, SearchToolDetails | undefined> {\n\tconst grepDefinition = createGrepToolDefinition(cwd, { ...options, nativeCache: false });\n\tconst hashlineStore = options?.hashlineStore ?? createHashlineSnapshotStore();\n\treturn {\n\t\t...grepDefinition,\n\t\tname: \"search\",\n\t\tlabel: \"search\",\n\t\tdescription: \"Search file contents with a regex across files, directories, globs, and internal URLs.\",\n\t\tpromptSnippet: searchToolSystemPromptContribution.snippet,\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: searchSchema,\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst resourceCtx = ctx as InternalResourceContext | undefined;\n\t\t\tif (params.pattern.trim() === \"\") throw new Error(\"Pattern must not be empty\");\n\t\t\tconst targets = normalizeSearchTargets(params.paths, cwd);\n\t\t\tconst ignoreCase = params.i === true || params.case === false;\n\t\t\tconst contextBefore = options?.contextBefore ?? 1,\n\t\t\t\tcontextAfter = options?.contextAfter ?? 3,\n\t\t\t\tsearchContext = Math.max(contextBefore, contextAfter);\n\t\t\tconst isSingleFileSearch =\n\t\t\t\ttargets.length === 1 &&\n\t\t\t\t(await fsStat(resolveToCwd(targets[0]!.path, cwd))\n\t\t\t\t\t.then((stat) => stat.isFile())\n\t\t\t\t\t.catch(() => false));\n\t\t\tconst limit = isSingleFileSearch ? SINGLE_FILE_MATCHES : DEFAULT_LIMIT;\n\t\t\tlet skip = normalizeSkip(params.skip);\n\t\t\tconst singleFileSkipIgnored = skip > 0 && isSingleFileSearch;\n\t\t\tif (singleFileSkipIgnored) skip = 0;\n\t\t\tfor (const target of targets) {\n\t\t\t\tif (target.archive || target.sqlite || target.internal) continue;\n\t\t\t\tif (\n\t\t\t\t\ttarget.lineRanges &&\n\t\t\t\t\t!(await fsStat(resolveToCwd(target.path, cwd))\n\t\t\t\t\t\t.then((stat) => stat.isFile())\n\t\t\t\t\t\t.catch(() => false))\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Line-range search selectors are only supported for single files\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst results: Awaited<ReturnType<typeof grepDefinition.execute>>[] = [];\n\t\t\tconst groups: PagedSearchOutputGroup[] = [];\n\t\t\tconst skippedMissingPaths: string[] = [];\n\t\t\tconst scopePath = targets.map((target) => target.path).join(\", \") || \".\";\n\t\t\tlet pageFullWithMore = false,\n\t\t\t\tinternalSearchCapped = false;\n\t\t\tlet remaining = limit;\n\t\t\tconst targetHasMatch = async (target: SearchTarget): Promise<boolean> => {\n\t\t\t\tif (target.archive || target.sqlite || target.internal) {\n\t\t\t\t\tconst archive = target.archive ? resolveArchiveSelector(target.archive, cwd) : undefined;\n\t\t\t\t\tconst text = archive\n\t\t\t\t\t\t? searchArchiveSelector(archive, params.pattern, ignoreCase, false, contextBefore, contextAfter)\n\t\t\t\t\t\t: target.sqlite\n\t\t\t\t\t\t\t? searchSqliteSelector(target.sqlite, params.pattern, ignoreCase, contextBefore, contextAfter)\n\t\t\t\t\t\t\t: await searchInternalSelector(\n\t\t\t\t\t\t\t\t\ttarget.internal!,\n\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\tparams.pattern,\n\t\t\t\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tresourceCtx,\n\t\t\t\t\t\t\t\t\tcontextBefore,\n\t\t\t\t\t\t\t\t\tcontextAfter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tgroupSearchOutput(filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter))\n\t\t\t\t\t\t\t.length > 0\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ranged = await searchFileLineRanges(\n\t\t\t\t\ttarget,\n\t\t\t\t\tcwd,\n\t\t\t\t\tparams.pattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tcontextBefore,\n\t\t\t\t\tcontextAfter,\n\t\t\t\t);\n\t\t\t\tif (ranged !== undefined) return groupSearchOutput(ranged).length > 0;\n\t\t\t\tconst probe = await grepDefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: params.pattern,\n\t\t\t\t\t\tpath: target.path,\n\t\t\t\t\t\tglob: target.glob,\n\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\tliteral: false,\n\t\t\t\t\t\tcontext: 0,\n\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\tgitignore: params.gitignore,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t\tundefined,\n\t\t\t\t\tctx,\n\t\t\t\t);\n\t\t\t\treturn probe.content.some((item) => item.type === \"text\" && item.text && item.text !== \"No matches found\");\n\t\t\t};\n\t\t\tfor (const target of targets) {\n\t\t\t\tif (skip === 0 && remaining <= 0) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!target.archive &&\n\t\t\t\t\t\t!target.sqlite &&\n\t\t\t\t\t\t!target.internal &&\n\t\t\t\t\t\ttargets.length > 1 &&\n\t\t\t\t\t\t(await fsStat(resolveToCwd(target.path, cwd))\n\t\t\t\t\t\t\t.then(() => false)\n\t\t\t\t\t\t\t.catch(() => true))\n\t\t\t\t\t) {\n\t\t\t\t\t\tskippedMissingPaths.push(target.path);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (await targetHasMatch(target)) {\n\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (target.archive || target.sqlite || target.internal) {\n\t\t\t\t\tconst archive = target.archive ? resolveArchiveSelector(target.archive, cwd) : undefined;\n\t\t\t\t\tlet text = archive\n\t\t\t\t\t\t? searchArchiveSelector(archive, params.pattern, ignoreCase, false, contextBefore, contextAfter)\n\t\t\t\t\t\t: target.sqlite\n\t\t\t\t\t\t\t? searchSqliteSelector(target.sqlite, params.pattern, ignoreCase, contextBefore, contextAfter)\n\t\t\t\t\t\t\t: await searchInternalSelector(\n\t\t\t\t\t\t\t\t\ttarget.internal!,\n\t\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\t\tparams.pattern,\n\t\t\t\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tresourceCtx,\n\t\t\t\t\t\t\t\t\tcontextBefore,\n\t\t\t\t\t\t\t\t\tcontextAfter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tif (archive && target.archive) text = text.split(archive.archivePath).join(target.archive.archivePath);\n\t\t\t\t\tif (target.sqlite)\n\t\t\t\t\t\ttext = text\n\t\t\t\t\t\t\t.split(target.sqlite.databasePath)\n\t\t\t\t\t\t\t.join(target.path.match(/^(.+?\\.(?:sqlite3?|db3?))/i)?.[1] ?? target.sqlite.databasePath);\n\t\t\t\t\ttext = text || \"No matches found\";\n\t\t\t\t\ttext = filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n\t\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\t\tif (skip > 0)\n\t\t\t\t\t\tgroups.push(\n\t\t\t\t\t\t\t...outputGroups.map((group) => ({\n\t\t\t\t\t\t\t\ttargetPath: target.path,\n\t\t\t\t\t\t\t\tvirtual: isVirtualSearchTarget(target),\n\t\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\telse if (outputGroups.length > 0) {\n\t\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\t\ttext += `\\n\\n${continuationHint(limit, skip)}`;\n\t\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t\t} else if (text && text !== \"No matches found\") {\n\t\t\t\t\t\tremaining--;\n\t\t\t\t\t} else text = \"No matches found\";\n\t\t\t\t\tif (skip === 0) results.push({ content: [{ type: \"text\" as const, text }], details: undefined });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttargets.length > 1 &&\n\t\t\t\t\t(await fsStat(resolveToCwd(target.path, cwd))\n\t\t\t\t\t\t.then(() => false)\n\t\t\t\t\t\t.catch(() => true))\n\t\t\t\t) {\n\t\t\t\t\tskippedMissingPaths.push(target.path);\n\t\t\t\t\tresults.push({ content: [{ type: \"text\" as const, text: \"No matches found\" }], details: undefined });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rangedText = await searchFileLineRanges(\n\t\t\t\t\ttarget,\n\t\t\t\t\tcwd,\n\t\t\t\t\tparams.pattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tcontextBefore,\n\t\t\t\t\tcontextAfter,\n\t\t\t\t);\n\t\t\t\tif (rangedText !== undefined) {\n\t\t\t\t\tlet text = applyDefaultSearchContext(rangedText, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text }],\n\t\t\t\t\t\tdetails: undefined as SearchToolDetails | undefined,\n\t\t\t\t\t};\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\t\tif (skip > 0)\n\t\t\t\t\t\tgroups.push(...outputGroups.map((group) => ({ targetPath: target.path, virtual: false, group })));\n\t\t\t\t\telse if (!isSingleFileSearch && outputGroups.length > 0) {\n\t\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\t\tresult.details = fileLimitDetails(limit);\n\t\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t\t\tresult.content = [{ type: \"text\", text }];\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = await grepDefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: params.pattern,\n\t\t\t\t\t\tpath: target.path,\n\t\t\t\t\t\tglob: target.glob,\n\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\tliteral: false,\n\t\t\t\t\t\tcontext: searchContext,\n\t\t\t\t\t\tmaxCountPerFile: isSingleFileSearch ? SINGLE_FILE_MATCHES : MULTI_FILE_PER_FILE_MATCHES,\n\t\t\t\t\t\tlimit: INTERNAL_SKIP_LIMIT,\n\t\t\t\t\t\tgitignore: params.gitignore,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tctx,\n\t\t\t\t);\n\t\t\t\tresults.push(result);\n\t\t\t\tif (result.details?.matchLimitReached) internalSearchCapped = true;\n\t\t\t\tlet text = result.content\n\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t.filter((text): text is string => typeof text === \"string\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\ttext = filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n\t\t\t\tif (text !== \"No matches found\")\n\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\tif (skip > 0)\n\t\t\t\t\tgroups.push(...outputGroups.map((group) => ({ targetPath: target.path, virtual: false, group })));\n\t\t\t\telse if (!isSingleFileSearch && outputGroups.length > 0) {\n\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\tresult.details = { ...(result.details ?? {}), ...fileLimitDetails(limit) };\n\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t}\n\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t}\n\t\t\t\tresult.content = [{ type: \"text\", text }];\n\t\t\t}\n\n\t\t\tconst details: SearchToolDetails = {};\n\t\t\tfor (const result of results) {\n\t\t\t\tif (result.details?.truncation) details.truncation = result.details.truncation;\n\t\t\t\tif (result.details?.matchLimitReached) details.matchLimitReached = result.details.matchLimitReached;\n\t\t\t\tif (hasFileLimit(result.details)) markFileLimit(details, limit);\n\t\t\t\tif (result.details?.linesTruncated) details.linesTruncated = true;\n\t\t\t}\n\n\t\t\tif (skip > 0) {\n\t\t\t\tconst renderedPages: string[] = [];\n\t\t\t\tlet remainingMatches = limit;\n\t\t\t\tfor (const item of groups.slice(skip)) {\n\t\t\t\t\tif (remainingMatches <= 0) break;\n\t\t\t\t\tconst raw = formatSearchGroups([item.group], 1);\n\t\t\t\t\tremainingMatches--;\n\t\t\t\t\tif (raw)\n\t\t\t\t\t\trenderedPages.push(\n\t\t\t\t\t\t\titem.virtual\n\t\t\t\t\t\t\t\t? raw\n\t\t\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(raw, cwd, item.targetPath, hashlineStore),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst hasMorePages = groups.slice(skip + limit).length > 0;\n\t\t\t\tconst cappedBeforeRequestedPage = internalSearchCapped && skip >= groups.length;\n\t\t\t\tconst capNotice = internalSearchCapped && !hasMorePages ? `\\n\\n${internalCapHint()}` : \"\";\n\t\t\t\tconst output = `${renderedPages.join(\"\\n\\n\") || `No more results (skip=${skip})`}${hasMorePages ? `\\n\\n${continuationHint(limit, skip)}` : \"\"}${capNotice}`;\n\t\t\t\tif (hasMorePages || cappedBeforeRequestedPage || capNotice) markFileLimit(details, limit);\n\t\t\t\tconst truncation = truncateHead(output, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\tlet content = truncation.content;\n\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\tcontent += `\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: content }],\n\t\t\t\t\tdetails: buildSearchDetails(details, content, cwd, scopePath, skippedMissingPaths),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (results.length === 1) {\n\t\t\t\tconst result = results[0]!;\n\t\t\t\tlet text = result.content\n\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t.filter((value): value is string => typeof value === \"string\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\ttext = filterSearchOutputByLineRange(text, targets[0]?.lineRanges, contextBefore, contextAfter);\n\t\t\t\tif (!isVirtualSearchTarget(targets[0]) && text !== \"No matches found\")\n\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\tconst skipNotice = singleFileSkipIgnored\n\t\t\t\t\t? \"\\n\\n[skip is ignored for single-file search; refine the pattern/path or search a directory to page matching files.]\"\n\t\t\t\t\t: \"\";\n\t\t\t\tif (isSingleFileSearch && text !== \"No matches found\")\n\t\t\t\t\ttext = formatSearchGroups(groupSearchOutput(text), limit, limit);\n\t\t\t\tif (text && text !== \"No matches found\") {\n\t\t\t\t\tconst renderedText = isVirtualSearchTarget(targets[0])\n\t\t\t\t\t\t? text\n\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(text, cwd, targets[0]?.path ?? \".\", hashlineStore);\n\t\t\t\t\tconst pagedText = `${hasFileLimit(result.details) ? `${renderedText}\\n\\n${continuationHint(limit, skip)}` : renderedText}${skipNotice}`;\n\t\t\t\t\tconst truncation = truncateHead(pagedText, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\tif (truncation.truncated)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...result,\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: `${truncation.content}\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: buildSearchDetails(\n\t\t\t\t\t\t\t\t{ ...(result.details ?? {}), truncation },\n\t\t\t\t\t\t\t\ttruncation.content,\n\t\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\t\tscopePath,\n\t\t\t\t\t\t\t\tskippedMissingPaths,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: pagedText }],\n\t\t\t\t\t\tdetails: buildSearchDetails(result.details, pagedText, cwd, scopePath, skippedMissingPaths),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...result,\n\t\t\t\t\tdetails: buildSearchDetails(\n\t\t\t\t\t\tresult.details,\n\t\t\t\t\t\ttext || \"No matches found\",\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tscopePath,\n\t\t\t\t\t\tskippedMissingPaths,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst renderedResults = await Promise.all(\n\t\t\t\tresults.map(async (result, index) => {\n\t\t\t\t\tlet text = result.content\n\t\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t\t.filter((value): value is string => typeof value === \"string\" && value.length > 0)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\ttext = filterSearchOutputByLineRange(text, targets[index]?.lineRanges, contextBefore, contextAfter);\n\t\t\t\t\tif (!isVirtualSearchTarget(targets[index]) && text !== \"No matches found\")\n\t\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter);\n\t\t\t\t\tif (!text || text === \"No matches found\") return `# ${targets[index]?.path ?? \".\"}\\n${text}`;\n\t\t\t\t\treturn isVirtualSearchTarget(targets[index])\n\t\t\t\t\t\t? text\n\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(text, cwd, targets[index]?.path ?? \".\", hashlineStore);\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst content = dedupeRenderedSearchOutput(\n\t\t\t\t`${renderedResults.join(\"\\n\\n\")}${skippedMissingPaths.length > 0 ? `\\n\\n[Skipped missing paths: ${skippedMissingPaths.join(\", \")}]` : \"\"}${pageFullWithMore ? `\\n\\n${continuationHint(limit, skip)}` : \"\"}${internalSearchCapped && !pageFullWithMore ? `\\n\\n${internalCapHint()}` : \"\"}`,\n\t\t\t);\n\t\t\tif (pageFullWithMore || internalSearchCapped) markFileLimit(details, limit);\n\t\t\tconst truncation = truncateHead(content, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\tlet output = truncation.content;\n\t\t\tif (truncation.truncated) {\n\t\t\t\tdetails.truncation = truncation;\n\t\t\t\toutput += `\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\tdetails: buildSearchDetails(details, output, cwd, scopePath, skippedMissingPaths),\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSearchCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options: ToolRenderResultOptions, theme, context) {\n\t\t\treturn grepDefinition.renderResult?.(result, options, theme, context) ?? new Text(\"\", 0, 0);\n\t\t},\n\t};\n}\n\nexport function createSearchTool(cwd: string, options?: SearchToolOptions): AgentTool<typeof searchSchema> {\n\treturn wrapToolDefinition(createSearchToolDefinition(cwd, options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/core/tools/search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile as fsReadFile, stat as fsStat } from \"node:fs/promises\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { experimentalToolSamplingProperty } from \"../experimental.ts\";\nimport type { ExtensionContext, ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { normalizePathLikeInput, splitPathLikeGlob } from \"./glob-path-utils.ts\";\nimport { createGrepToolDefinition, type GrepToolOptions } from \"./grep.ts\";\nimport { createHashlineSnapshotStore, type HashlineSnapshotStore, recordHashlineSnapshot } from \"./hashline.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { invalidArgText, shortenPath, str } from \"./render-utils.ts\";\nimport {\n\ttype InternalResourceContext,\n\tparseArchiveSelector,\n\treadArchiveSelector,\n\tresolveArchiveSelector,\n\tresolveInternalSelector,\n\ttype SqliteSelector,\n\tsearchArchiveSelector,\n\tsearchInternalSelector,\n\tsearchSqliteSelector,\n\tsqliteSelectorForPath,\n} from \"./resource-selectors.ts\";\nimport { buildSearchDetails, type SearchToolDetails } from \"./search-details.ts\";\nimport { filterSearchOutputByLineRange, type SearchLineRange, splitLineRangeSelector } from \"./search-line-ranges.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, formatSize, truncateHead } from \"./truncate.ts\";\n\nexport type { SearchToolDetails } from \"./search-details.ts\";\n\nconst searchSchema = Type.Object(\n\t{\n\t\tpattern: Type.String({\n\t\t\tdescription:\n\t\t\t\t\"Regex pattern. Whitespace-only patterns are rejected; otherwise the pattern is preserved verbatim.\",\n\t\t}),\n\t\tpaths: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.String({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"File, directory, glob, internal URL, or <file>:<lines> selector to search. Omitted or empty searches the workspace root.\",\n\t\t\t\t}),\n\t\t\t\tType.Array(\n\t\t\t\t\tType.String({\n\t\t\t\t\t\tdescription: \"File, directory, glob, internal URL, or <file>:<lines> selector to search.\",\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t]),\n\t\t),\n\t\ti: Type.Optional(Type.Boolean({ description: \"Case-insensitive search.\" })),\n\t\tgitignore: Type.Optional(Type.Boolean({ description: \"Respect gitignore.\" })),\n\t\tcase: Type.Optional(\n\t\t\tType.Boolean({ description: \"Set false for case-insensitive search (oh-my-pi compatibility).\" }),\n\t\t),\n\t\tskip: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Number({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Files to skip before collecting results; use to paginate when the previous call hit the file limit.\",\n\t\t\t\t}),\n\t\t\t\tType.Null(),\n\t\t\t]),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\nexport const searchToolSystemPromptContribution = Object.freeze({\n\tsnippet: \"Search file contents with regex patterns.\",\n\tguidelines: Object.freeze([] as const),\n} as const);\nexport type SearchToolInput = Static<typeof searchSchema>;\nexport type SearchToolOptions = GrepToolOptions & {\n\thashlineStore?: HashlineSnapshotStore;\n\tcontextBefore?: number;\n\tcontextAfter?: number;\n};\nfunction delimiterInExistingSearchGlobRoot(value: string, cwd: string): boolean {\n\tconst selector = splitLineRangeSelector(value);\n\tconst parsed = splitPathLikeGlob(selector.path);\n\treturn !!parsed.glob && /[;,\\s]/.test(parsed.basePath) && existsSync(resolveToCwd(parsed.basePath, cwd));\n}\nfunction archiveSelectorExists(value: string, cwd: string): boolean {\n\tconst archive = parseArchiveSelector(value);\n\tif (!archive) return false;\n\tconst resolved = resolveArchiveSelector(archive, cwd);\n\tif (!existsSync(resolved.archivePath)) return false;\n\tif (!resolved.memberPath) return true;\n\ttry {\n\t\treadArchiveSelector(resolved);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\nfunction searchPathResolvable(value: string, cwd: string): boolean {\n\tconst selector = splitLineRangeSelector(value),\n\t\tarchive = parseArchiveSelector(selector.path);\n\tif (archive) return archiveSelectorExists(selector.path, cwd);\n\tconst sqlite = sqliteSelectorForPath(selector.path, cwd);\n\treturn (\n\t\t!!sqlite ||\n\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(selector.path) ||\n\t\texistsSync(resolveToCwd(splitPathLikeGlob(selector.path).basePath, cwd))\n\t);\n}\n\nfunction normalizePaths(pathsValue: string | string[] | undefined, cwd: string): string[] {\n\tconst inputs = Array.isArray(pathsValue)\n\t\t? pathsValue.length > 0\n\t\t\t? pathsValue\n\t\t\t: [\".\"]\n\t\t: pathsValue === undefined\n\t\t\t? [\".\"]\n\t\t\t: [pathsValue];\n\tconst expanded: string[] = [];\n\tfor (const input of inputs) {\n\t\tconst raw = normalizePathLikeInput(input);\n\t\tif (raw === \"\") {\n\t\t\texpanded.push(\".\");\n\t\t\tcontinue;\n\t\t}\n\t\tconst resourceLike = /^[a-z]+:\\/\\//i.test(raw) || /^[^:]+\\.(?:zip|jar|tar|tgz|gz|sqlite|db):/i.test(raw);\n\t\tif (\n\t\t\texistsSync(resolveToCwd(splitLineRangeSelector(raw).path, cwd)) ||\n\t\t\tdelimiterInExistingSearchGlobRoot(raw, cwd) ||\n\t\t\tarchiveSelectorExists(raw, cwd)\n\t\t) {\n\t\t\texpanded.push(raw);\n\t\t\tcontinue;\n\t\t}\n\t\tconst chunks = raw\n\t\t\t.split(/[;\\s]+/)\n\t\t\t.map(normalizePathLikeInput)\n\t\t\t.filter(Boolean);\n\t\tconst parts = chunks.flatMap((chunk) =>\n\t\t\tsearchPathResolvable(chunk, cwd) ? [chunk] : chunk.split(\",\").map(normalizePathLikeInput).filter(Boolean),\n\t\t);\n\t\tconst commaOrSemicolon = /[;,]/.test(raw),\n\t\t\tcanSplit = commaOrSemicolon\n\t\t\t\t? parts.some((part) => searchPathResolvable(part, cwd))\n\t\t\t\t: parts.every((part) => searchPathResolvable(part, cwd));\n\t\tif (parts.length > 1 && canSplit) expanded.push(...parts);\n\t\telse if (resourceLike) expanded.push(raw);\n\t\telse expanded.push(raw);\n\t}\n\treturn expanded;\n}\n\ninterface SearchTarget {\n\tpath: string;\n\tglob?: string;\n\tlineRanges?: SearchLineRange[];\n\tarchive?: ReturnType<typeof parseArchiveSelector>;\n\tsqlite?: SqliteSelector;\n\tinternal?: string;\n}\n\ninterface SearchOutputGroup {\n\tpath: string;\n\tlines: string[];\n}\n\ninterface PagedSearchOutputGroup {\n\ttargetPath: string;\n\tvirtual: boolean;\n\tgroup: SearchOutputGroup;\n}\n\nconst DEFAULT_LIMIT = 20,\n\tINTERNAL_SKIP_LIMIT = 2000,\n\tMULTI_FILE_PER_FILE_MATCHES = 20,\n\tSINGLE_FILE_MATCHES = 200;\n\nfunction normalizeSkip(skip: number | null | undefined): number {\n\tif (skip === undefined || skip === null) return 0;\n\tif (!Number.isFinite(skip) || skip < 0) throw new Error(\"Skip must be a non-negative number\");\n\treturn Math.floor(skip);\n}\nfunction markFileLimit(details: SearchToolDetails, limit: number): void {\n\tdetails.fileLimitReached = true;\n\tdetails.meta = { ...(details.meta ?? {}), limits: { ...(details.meta?.limits ?? {}), fileLimit: limit } };\n}\nfunction fileLimitDetails(limit: number): SearchToolDetails {\n\tconst details: SearchToolDetails = {};\n\tmarkFileLimit(details, limit);\n\treturn details;\n}\nfunction continuationHint(limit: number, skip: number): string {\n\treturn `[${limit} matching files shown. Use skip=${skip + limit} to view more.]`;\n}\nfunction internalCapHint(): string {\n\treturn `[Search collected the first ${INTERNAL_SKIP_LIMIT} matches before pagination; refine the pattern or path for later results.]`;\n}\nfunction hasFileLimit(details: unknown): boolean {\n\treturn (\n\t\ttypeof details === \"object\" &&\n\t\tdetails !== null &&\n\t\t(details as { fileLimitReached?: unknown }).fileLimitReached === true\n\t);\n}\n\nfunction isResourceSelector(value: string): boolean {\n\treturn (\n\t\t/^[^:]+\\.(zip|jar|tar|tgz|gz|sqlite|db):/i.test(value) ||\n\t\t/^[a-z]+:\\/\\//i.test(value) ||\n\t\tvalue.startsWith(\"skill://\")\n\t);\n}\n\nfunction normalizeSearchTargets(pathsValue: string | string[] | undefined, cwd: string): SearchTarget[] {\n\treturn normalizePaths(pathsValue, cwd).map((searchPath) => {\n\t\tconst directSqlite = sqliteSelectorForPath(searchPath, cwd);\n\t\tif (directSqlite?.rowId) return { path: searchPath, sqlite: directSqlite };\n\t\tif (archiveSelectorExists(searchPath, cwd)) {\n\t\t\tconst archive = parseArchiveSelector(searchPath)!;\n\t\t\treturn { path: searchPath, archive };\n\t\t}\n\t\tconst selector = splitLineRangeSelector(searchPath);\n\t\tconst sqliteDirect = sqliteSelectorForPath(selector.path, cwd);\n\t\tif (sqliteDirect) return { path: selector.path, lineRanges: selector.lineRanges, sqlite: sqliteDirect };\n\t\tconst archive = parseArchiveSelector(selector.path);\n\t\tif (archive) return { path: selector.path, lineRanges: selector.lineRanges, archive };\n\t\tif (selector.path.startsWith(\"local://\")) {\n\t\t\tconst sourcePath = resolveInternalSelector(selector.path, cwd);\n\t\t\tif (sourcePath) {\n\t\t\t\tconst parsed = splitPathLikeGlob(sourcePath);\n\t\t\t\treturn { path: parsed.basePath, glob: parsed.glob, lineRanges: selector.lineRanges };\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\t/^(?:skill|agent|artifact|history|issue|local|memory|pr|conflict|omp|rule|mcp|vault):\\/\\//.test(selector.path)\n\t\t)\n\t\t\treturn { path: selector.path, lineRanges: selector.lineRanges, internal: selector.path };\n\t\tif (isResourceSelector(selector.path))\n\t\t\tthrow new Error(`Search resource selectors are not supported by this filesystem backend: ${searchPath}`);\n\t\tconst parsed = splitPathLikeGlob(selector.path);\n\t\treturn { path: parsed.basePath, glob: parsed.glob, lineRanges: selector.lineRanges };\n\t});\n}\n\nfunction stripExtendedRegexWhitespace(pattern: string): string {\n\tlet out = \"\",\n\t\tescaped = false,\n\t\tinClass = false,\n\t\tinComment = false;\n\tfor (const ch of pattern) {\n\t\tif (inComment) {\n\t\t\tif (ch === \"\\n\" || ch === \"\\r\") inComment = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (escaped) {\n\t\t\tout += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tout += ch;\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"[\") inClass = true;\n\t\telse if (ch === \"]\") inClass = false;\n\t\tif (!inClass && ch === \"#\") {\n\t\t\tinComment = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inClass && /\\s/.test(ch)) continue;\n\t\tout += ch;\n\t}\n\treturn out;\n}\nfunction normalizeInlineSearchPattern(pattern: string, ignoreCase: boolean): { pattern: string; flags: string } {\n\tconst match = pattern.match(/^\\(\\?([imsUx-]+)\\)([\\s\\S]*)$/),\n\t\tflags = new Set<string>();\n\tif (ignoreCase) flags.add(\"i\");\n\tif (match) {\n\t\tconst inline = match[1] ?? \"\";\n\t\tfor (const flag of inline) if (flag === \"i\" || flag === \"m\" || flag === \"s\") flags.add(flag);\n\t\treturn {\n\t\t\tpattern: inline.includes(\"x\") ? stripExtendedRegexWhitespace(match[2] ?? \"\") : (match[2] ?? \"\"),\n\t\t\tflags: [...flags].join(\"\"),\n\t\t};\n\t}\n\treturn { pattern, flags: [...flags].join(\"\") };\n}\n\nasync function searchFileLineRanges(\n\ttarget: SearchTarget,\n\tcwd: string,\n\tpattern: string,\n\tignoreCase: boolean,\n\tcontextBefore = 1,\n\tcontextAfter = 3,\n): Promise<string | undefined> {\n\tif (!target.lineRanges?.length || target.glob || target.archive || target.sqlite || target.internal)\n\t\treturn undefined;\n\tconst absolutePath = resolveToCwd(target.path, cwd);\n\tif (\n\t\t!(await fsStat(absolutePath)\n\t\t\t.then((stat) => stat.isFile())\n\t\t\t.catch(() => false))\n\t)\n\t\treturn undefined;\n\tconst source = (await fsReadFile(absolutePath, \"utf8\")).split(\"\\n\");\n\tconst normalized = normalizeInlineSearchPattern(pattern, ignoreCase);\n\tlet regex: RegExp;\n\ttry {\n\t\tregex = new RegExp(normalized.pattern, normalized.flags);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tconst matchLines = new Set<number>();\n\tsource.forEach((line, index) => {\n\t\tregex.lastIndex = 0;\n\t\tif (regex.test(line)) matchLines.add(index + 1);\n\t});\n\tconst outputLines = new Set<number>();\n\tfor (const line of matchLines)\n\t\tfor (let n = Math.max(1, line - contextBefore); n <= Math.min(source.length, line + contextAfter); n++)\n\t\t\toutputLines.add(n);\n\tconst text =\n\t\t[...outputLines]\n\t\t\t.sort((a, b) => a - b)\n\t\t\t.map(\n\t\t\t\t(n) =>\n\t\t\t\t\t`${target.path}${matchLines.has(n) ? \":\" : \"-\"}${n}${matchLines.has(n) ? \":\" : \"-\"} ${source[n - 1] ?? \"\"}`,\n\t\t\t)\n\t\t\t.join(\"\\n\") || \"No matches found\";\n\treturn filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n}\n\nfunction groupSearchOutput(text: string): SearchOutputGroup[] {\n\tconst groups: SearchOutputGroup[] = [];\n\tconst byPath = new Map<string, SearchOutputGroup>();\n\tfor (const line of text.split(\"\\n\")) {\n\t\tconst match = line.match(/^(.+?)(?::[^:]+: |:\\d+: |-\\d+- )/);\n\t\tif (!match) continue;\n\t\tconst filePath = match[1]!;\n\t\tlet current = byPath.get(filePath);\n\t\tif (!current) {\n\t\t\tcurrent = { path: filePath, lines: [] };\n\t\t\tbyPath.set(filePath, current);\n\t\t\tgroups.push(current);\n\t\t}\n\t\tif (!current.lines.includes(line)) current.lines.push(line);\n\t}\n\treturn groups;\n}\nfunction isVirtualSearchTarget(target: SearchTarget | undefined): boolean {\n\treturn !!(target?.archive || target?.sqlite || target?.internal);\n}\n\nasync function addHashlineHeadersToSearchOutput(\n\ttext: string,\n\tcwd: string,\n\ttargetPath: string,\n\thashlineStore: HashlineSnapshotStore,\n): Promise<string> {\n\tconst groups = groupSearchOutput(text);\n\tif (groups.length === 0) return text;\n\tconst searchRoot = resolveToCwd(targetPath, cwd);\n\tconst targetIsFile = await fsStat(searchRoot)\n\t\t.then((stat) => stat.isFile())\n\t\t.catch(() => false);\n\tconst rendered: string[] = [];\n\tlet lastDir = \"\";\n\tfor (const group of groups) {\n\t\tlet absolutePath = targetIsFile ? searchRoot : join(searchRoot, group.path);\n\t\ttry {\n\t\t\tawait fsReadFile(absolutePath);\n\t\t} catch {\n\t\t\tabsolutePath = resolvePath(cwd, group.path);\n\t\t}\n\t\ttry {\n\t\t\tconst content = await fsReadFile(absolutePath, \"utf-8\");\n\t\t\tconst snapshot = recordHashlineSnapshot(absolutePath, cwd, content, hashlineStore);\n\t\t\tconst dir = dirname(snapshot.displayPath);\n\t\t\tif (dir !== \".\" && dir !== lastDir) {\n\t\t\t\trendered.push(`# ${dir}/`);\n\t\t\t\tlastDir = dir;\n\t\t\t}\n\t\t\trendered.push(`[${snapshot.displayPath}#${snapshot.tag}]`);\n\t\t\tfor (const line of group.lines) {\n\t\t\t\tconst match = line.match(/^.+?(?::(\\d+): |-(\\d+)- )(.*)$/);\n\t\t\t\tif (match) rendered.push(`${match[1] ? \"*\" : \" \"}${match[1] ?? match[2]}:${match[3] ?? \"\"}`);\n\t\t\t}\n\t\t} catch {\n\t\t\trendered.push(...group.lines);\n\t\t}\n\t}\n\treturn rendered.join(\"\\n\");\n}\n\nfunction applyDefaultSearchContext(text: string, before = 1, after = 3): string {\n\tconst groups = groupSearchOutput(text);\n\tif (groups.length === 0) return text;\n\tconst output: string[] = [];\n\tfor (const group of groups) {\n\t\tconst byLine = new Map<number, { line: string; isMatch: boolean }>();\n\t\tfor (const line of group.lines) {\n\t\t\tconst match = line.match(/^(.+?)(?::(\\d+): |-(\\d+)- )(.*)$/);\n\t\t\tif (!match) continue;\n\t\t\tconst number = Number.parseInt(match[2] ?? match[3] ?? \"0\", 10);\n\t\t\tconst isMatch = match[2] !== undefined;\n\t\t\tconst existing = byLine.get(number);\n\t\t\tif (!existing || (isMatch && !existing.isMatch)) byLine.set(number, { line, isMatch });\n\t\t}\n\t\tconst matchNumbers = [...byLine.values()]\n\t\t\t.filter((item) => item.isMatch)\n\t\t\t.map((item) =>\n\t\t\t\tNumber.parseInt(\n\t\t\t\t\titem.line.match(/(?::(\\d+): |-(\\d+)- )/)?.[1] ?? item.line.match(/-(\\d+)- /)?.[1] ?? \"0\",\n\t\t\t\t\t10,\n\t\t\t\t),\n\t\t\t);\n\t\tfor (const [number, item] of [...byLine.entries()].sort((a, b) => a[0] - b[0])) {\n\t\t\tif (\n\t\t\t\titem.isMatch ||\n\t\t\t\tmatchNumbers.some((lineNumber) => number >= lineNumber - before && number <= lineNumber + after)\n\t\t\t)\n\t\t\t\toutput.push(item.line);\n\t\t}\n\t}\n\treturn output.join(\"\\n\");\n}\n\nfunction isSearchMatchLine(line: string): boolean {\n\treturn /:\\d+: /.test(line);\n}\nfunction sliceGroupLinesByMatchCount(lines: readonly string[], matchLimit: number): string[] {\n\tif (matchLimit <= 0) return [];\n\tlet matches = 0;\n\tconst output: string[] = [];\n\tfor (const line of lines) {\n\t\tif (isSearchMatchLine(line)) {\n\t\t\tif (matches >= matchLimit) break;\n\t\t\tmatches++;\n\t\t}\n\t\toutput.push(line);\n\t}\n\treturn output;\n}\nfunction formatSearchGroups(groups: SearchOutputGroup[], limit: number, perFileLimit = 20): string {\n\treturn groups\n\t\t.slice(0, Math.max(0, limit))\n\t\t.flatMap((group) => sliceGroupLinesByMatchCount(group.lines, perFileLimit))\n\t\t.join(\"\\n\");\n}\n\nfunction dedupeRenderedSearchOutput(content: string): string {\n\tconst out: string[] = [],\n\t\tseen = new Set<string>();\n\tlet header = \"\",\n\t\tsawContinuationHint = false,\n\t\tsawCapHint = false;\n\tfor (const line of content.split(\"\\n\")) {\n\t\tconst h = line.match(/^\\[([^\\]#]+)#[0-9A-F]{4}\\]$/);\n\t\tif (h) header = h[1]!;\n\t\tif (/^\\[\\d+ matching files shown\\. Use skip=\\d+ to view more\\.\\]$/.test(line)) {\n\t\t\tif (sawContinuationHint) continue;\n\t\t\tsawContinuationHint = true;\n\t\t}\n\t\tif (line.startsWith(\"[Search collected the first \")) {\n\t\t\tif (sawCapHint) continue;\n\t\t\tsawCapHint = true;\n\t\t}\n\t\tconst m = header ? line.match(/^[* ]?(\\d+):/) : undefined;\n\t\tconst key = m ? `${header}:${m[1]}` : \"\";\n\t\tif (key && seen.has(key)) continue;\n\t\tif (key) seen.add(key);\n\t\tout.push(line);\n\t}\n\treturn out.join(\"\\n\");\n}\nfunction formatSearchCall(\n\targs: { pattern: string; path?: string; paths?: string | string[]; glob?: string; limit?: number } | undefined,\n\ttheme: typeof import(\"../../modes/interactive/theme/theme.ts\").theme,\n): string {\n\tconst pattern = str(args?.pattern);\n\tconst rawPaths = Array.isArray(args?.paths) ? args.paths.join(\", \") : args?.paths;\n\tconst rawPath = str(args?.path ?? rawPaths);\n\tconst path = rawPath !== null ? shortenPath(rawPath || \".\") : null;\n\tconst glob = str(args?.glob);\n\tconst limit = args?.limit;\n\tconst invalidArg = invalidArgText(theme);\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"search\")) +\n\t\t\" \" +\n\t\t(pattern === null ? invalidArg : theme.fg(\"accent\", `/${pattern || \"\"}/`)) +\n\t\ttheme.fg(\"toolOutput\", ` in ${path === null ? invalidArg : path}`);\n\tif (glob) text += theme.fg(\"toolOutput\", ` (${glob})`);\n\tif (limit !== undefined) text += theme.fg(\"toolOutput\", ` limit ${limit}`);\n\treturn text;\n}\n\nexport function createSearchToolDefinition(\n\tcwd: string,\n\toptions?: SearchToolOptions,\n): ToolDefinition<typeof searchSchema, SearchToolDetails | undefined> {\n\tconst grepDefinition = createGrepToolDefinition(cwd, { ...options, nativeCache: false });\n\tconst hashlineStore = options?.hashlineStore ?? createHashlineSnapshotStore();\n\treturn {\n\t\t...grepDefinition,\n\t\tname: \"search\",\n\t\tlabel: \"search\",\n\t\tdescription: \"Search file contents with a regex across files, directories, globs, and internal URLs.\",\n\t\tpromptSnippet: searchToolSystemPromptContribution.snippet,\n\t\t...experimentalToolSamplingProperty(),\n\t\tparameters: searchSchema,\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx?: ExtensionContext) {\n\t\t\tconst resourceCtx = ctx as InternalResourceContext | undefined;\n\t\t\tconst executionCwd = ctx?.cwd || cwd;\n\t\t\tif (params.pattern.trim() === \"\") throw new Error(\"Pattern must not be empty\");\n\t\t\tconst targets = normalizeSearchTargets(params.paths, executionCwd);\n\t\t\tconst ignoreCase = params.i === true || params.case === false;\n\t\t\tconst contextBefore = options?.contextBefore ?? 1,\n\t\t\t\tcontextAfter = options?.contextAfter ?? 3,\n\t\t\t\tsearchContext = Math.max(contextBefore, contextAfter);\n\t\t\tconst isSingleFileSearch =\n\t\t\t\ttargets.length === 1 &&\n\t\t\t\t(await fsStat(resolveToCwd(targets[0]!.path, executionCwd))\n\t\t\t\t\t.then((stat) => stat.isFile())\n\t\t\t\t\t.catch(() => false));\n\t\t\tconst limit = isSingleFileSearch ? SINGLE_FILE_MATCHES : DEFAULT_LIMIT;\n\t\t\tlet skip = normalizeSkip(params.skip);\n\t\t\tconst singleFileSkipIgnored = skip > 0 && isSingleFileSearch;\n\t\t\tif (singleFileSkipIgnored) skip = 0;\n\t\t\tfor (const target of targets) {\n\t\t\t\tif (target.archive || target.sqlite || target.internal) continue;\n\t\t\t\tif (\n\t\t\t\t\ttarget.lineRanges &&\n\t\t\t\t\t!(await fsStat(resolveToCwd(target.path, executionCwd))\n\t\t\t\t\t\t.then((stat) => stat.isFile())\n\t\t\t\t\t\t.catch(() => false))\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Line-range search selectors are only supported for single files\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst results: Awaited<ReturnType<typeof grepDefinition.execute>>[] = [];\n\t\t\tconst groups: PagedSearchOutputGroup[] = [];\n\t\t\tconst skippedMissingPaths: string[] = [];\n\t\t\tconst scopePath = targets.map((target) => target.path).join(\", \") || \".\";\n\t\t\tlet pageFullWithMore = false,\n\t\t\t\tinternalSearchCapped = false;\n\t\t\tlet remaining = limit;\n\t\t\tconst targetHasMatch = async (target: SearchTarget): Promise<boolean> => {\n\t\t\t\tif (target.archive || target.sqlite || target.internal) {\n\t\t\t\t\tconst archive = target.archive ? resolveArchiveSelector(target.archive, executionCwd) : undefined;\n\t\t\t\t\tconst text = archive\n\t\t\t\t\t\t? searchArchiveSelector(archive, params.pattern, ignoreCase, false, contextBefore, contextAfter)\n\t\t\t\t\t\t: target.sqlite\n\t\t\t\t\t\t\t? searchSqliteSelector(target.sqlite, params.pattern, ignoreCase, contextBefore, contextAfter)\n\t\t\t\t\t\t\t: await searchInternalSelector(\n\t\t\t\t\t\t\t\t\ttarget.internal!,\n\t\t\t\t\t\t\t\t\texecutionCwd,\n\t\t\t\t\t\t\t\t\tparams.pattern,\n\t\t\t\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tresourceCtx,\n\t\t\t\t\t\t\t\t\tcontextBefore,\n\t\t\t\t\t\t\t\t\tcontextAfter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tgroupSearchOutput(filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter))\n\t\t\t\t\t\t\t.length > 0\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ranged = await searchFileLineRanges(\n\t\t\t\t\ttarget,\n\t\t\t\t\texecutionCwd,\n\t\t\t\t\tparams.pattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tcontextBefore,\n\t\t\t\t\tcontextAfter,\n\t\t\t\t);\n\t\t\t\tif (ranged !== undefined) return groupSearchOutput(ranged).length > 0;\n\t\t\t\tconst probe = await grepDefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: params.pattern,\n\t\t\t\t\t\tpath: target.path,\n\t\t\t\t\t\tglob: target.glob,\n\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\tliteral: false,\n\t\t\t\t\t\tcontext: 0,\n\t\t\t\t\t\tlimit: 1,\n\t\t\t\t\t\tgitignore: params.gitignore,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t\tundefined,\n\t\t\t\t\tctx as never,\n\t\t\t\t);\n\t\t\t\treturn probe.content.some((item) => item.type === \"text\" && item.text && item.text !== \"No matches found\");\n\t\t\t};\n\t\t\tfor (const target of targets) {\n\t\t\t\tif (skip === 0 && remaining <= 0) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!target.archive &&\n\t\t\t\t\t\t!target.sqlite &&\n\t\t\t\t\t\t!target.internal &&\n\t\t\t\t\t\ttargets.length > 1 &&\n\t\t\t\t\t\t(await fsStat(resolveToCwd(target.path, executionCwd))\n\t\t\t\t\t\t\t.then(() => false)\n\t\t\t\t\t\t\t.catch(() => true))\n\t\t\t\t\t) {\n\t\t\t\t\t\tskippedMissingPaths.push(target.path);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (await targetHasMatch(target)) {\n\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (target.archive || target.sqlite || target.internal) {\n\t\t\t\t\tconst archive = target.archive ? resolveArchiveSelector(target.archive, executionCwd) : undefined;\n\t\t\t\t\tlet text = archive\n\t\t\t\t\t\t? searchArchiveSelector(archive, params.pattern, ignoreCase, false, contextBefore, contextAfter)\n\t\t\t\t\t\t: target.sqlite\n\t\t\t\t\t\t\t? searchSqliteSelector(target.sqlite, params.pattern, ignoreCase, contextBefore, contextAfter)\n\t\t\t\t\t\t\t: await searchInternalSelector(\n\t\t\t\t\t\t\t\t\ttarget.internal!,\n\t\t\t\t\t\t\t\t\texecutionCwd,\n\t\t\t\t\t\t\t\t\tparams.pattern,\n\t\t\t\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tresourceCtx,\n\t\t\t\t\t\t\t\t\tcontextBefore,\n\t\t\t\t\t\t\t\t\tcontextAfter,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tif (archive && target.archive) text = text.split(archive.archivePath).join(target.archive.archivePath);\n\t\t\t\t\tif (target.sqlite)\n\t\t\t\t\t\ttext = text\n\t\t\t\t\t\t\t.split(target.sqlite.databasePath)\n\t\t\t\t\t\t\t.join(target.path.match(/^(.+?\\.(?:sqlite3?|db3?))/i)?.[1] ?? target.sqlite.databasePath);\n\t\t\t\t\ttext = text || \"No matches found\";\n\t\t\t\t\ttext = filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n\t\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\t\tif (skip > 0)\n\t\t\t\t\t\tgroups.push(\n\t\t\t\t\t\t\t...outputGroups.map((group) => ({\n\t\t\t\t\t\t\t\ttargetPath: target.path,\n\t\t\t\t\t\t\t\tvirtual: isVirtualSearchTarget(target),\n\t\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t);\n\t\t\t\t\telse if (outputGroups.length > 0) {\n\t\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\t\ttext += `\\n\\n${continuationHint(limit, skip)}`;\n\t\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t\t} else if (text && text !== \"No matches found\") {\n\t\t\t\t\t\tremaining--;\n\t\t\t\t\t} else text = \"No matches found\";\n\t\t\t\t\tif (skip === 0) results.push({ content: [{ type: \"text\" as const, text }], details: undefined });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttargets.length > 1 &&\n\t\t\t\t\t(await fsStat(resolveToCwd(target.path, executionCwd))\n\t\t\t\t\t\t.then(() => false)\n\t\t\t\t\t\t.catch(() => true))\n\t\t\t\t) {\n\t\t\t\t\tskippedMissingPaths.push(target.path);\n\t\t\t\t\tresults.push({ content: [{ type: \"text\" as const, text: \"No matches found\" }], details: undefined });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rangedText = await searchFileLineRanges(\n\t\t\t\t\ttarget,\n\t\t\t\t\texecutionCwd,\n\t\t\t\t\tparams.pattern,\n\t\t\t\t\tignoreCase,\n\t\t\t\t\tcontextBefore,\n\t\t\t\t\tcontextAfter,\n\t\t\t\t);\n\t\t\t\tif (rangedText !== undefined) {\n\t\t\t\t\tlet text = applyDefaultSearchContext(rangedText, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text }],\n\t\t\t\t\t\tdetails: undefined as SearchToolDetails | undefined,\n\t\t\t\t\t};\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\t\tif (skip > 0)\n\t\t\t\t\t\tgroups.push(...outputGroups.map((group) => ({ targetPath: target.path, virtual: false, group })));\n\t\t\t\t\telse if (!isSingleFileSearch && outputGroups.length > 0) {\n\t\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\t\tresult.details = fileLimitDetails(limit);\n\t\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t\t\tresult.content = [{ type: \"text\", text }];\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = await grepDefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\t{\n\t\t\t\t\t\tpattern: params.pattern,\n\t\t\t\t\t\tpath: target.path,\n\t\t\t\t\t\tglob: target.glob,\n\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\tliteral: false,\n\t\t\t\t\t\tcontext: searchContext,\n\t\t\t\t\t\tmaxCountPerFile: isSingleFileSearch ? SINGLE_FILE_MATCHES : MULTI_FILE_PER_FILE_MATCHES,\n\t\t\t\t\t\tlimit: INTERNAL_SKIP_LIMIT,\n\t\t\t\t\t\tgitignore: params.gitignore,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tctx as never,\n\t\t\t\t);\n\t\t\t\tresults.push(result);\n\t\t\t\tif (result.details?.matchLimitReached) internalSearchCapped = true;\n\t\t\t\tlet text = result.content\n\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t.filter((text): text is string => typeof text === \"string\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\ttext = filterSearchOutputByLineRange(text, target.lineRanges, contextBefore, contextAfter);\n\t\t\t\tif (text !== \"No matches found\")\n\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\tconst outputGroups = groupSearchOutput(text);\n\t\t\t\tif (skip > 0)\n\t\t\t\t\tgroups.push(...outputGroups.map((group) => ({ targetPath: target.path, virtual: false, group })));\n\t\t\t\telse if (!isSingleFileSearch && outputGroups.length > 0) {\n\t\t\t\t\tconst hadMore = outputGroups.length > remaining;\n\t\t\t\t\ttext = formatSearchGroups(outputGroups, remaining);\n\t\t\t\t\tif (hadMore) {\n\t\t\t\t\t\tresult.details = { ...(result.details ?? {}), ...fileLimitDetails(limit) };\n\t\t\t\t\t\tpageFullWithMore = true;\n\t\t\t\t\t}\n\t\t\t\t\tremaining -= Math.min(remaining, outputGroups.length);\n\t\t\t\t}\n\t\t\t\tresult.content = [{ type: \"text\", text }];\n\t\t\t}\n\n\t\t\tconst details: SearchToolDetails = {};\n\t\t\tfor (const result of results) {\n\t\t\t\tif (result.details?.truncation) details.truncation = result.details.truncation;\n\t\t\t\tif (result.details?.matchLimitReached) details.matchLimitReached = result.details.matchLimitReached;\n\t\t\t\tif (hasFileLimit(result.details)) markFileLimit(details, limit);\n\t\t\t\tif (result.details?.linesTruncated) details.linesTruncated = true;\n\t\t\t}\n\n\t\t\tif (skip > 0) {\n\t\t\t\tconst renderedPages: string[] = [];\n\t\t\t\tlet remainingMatches = limit;\n\t\t\t\tfor (const item of groups.slice(skip)) {\n\t\t\t\t\tif (remainingMatches <= 0) break;\n\t\t\t\t\tconst raw = formatSearchGroups([item.group], 1);\n\t\t\t\t\tremainingMatches--;\n\t\t\t\t\tif (raw)\n\t\t\t\t\t\trenderedPages.push(\n\t\t\t\t\t\t\titem.virtual\n\t\t\t\t\t\t\t\t? raw\n\t\t\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(raw, executionCwd, item.targetPath, hashlineStore),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst hasMorePages = groups.slice(skip + limit).length > 0;\n\t\t\t\tconst cappedBeforeRequestedPage = internalSearchCapped && skip >= groups.length;\n\t\t\t\tconst capNotice = internalSearchCapped && !hasMorePages ? `\\n\\n${internalCapHint()}` : \"\";\n\t\t\t\tconst output = `${renderedPages.join(\"\\n\\n\") || `No more results (skip=${skip})`}${hasMorePages ? `\\n\\n${continuationHint(limit, skip)}` : \"\"}${capNotice}`;\n\t\t\t\tif (hasMorePages || cappedBeforeRequestedPage || capNotice) markFileLimit(details, limit);\n\t\t\t\tconst truncation = truncateHead(output, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\tlet content = truncation.content;\n\t\t\t\tif (truncation.truncated) {\n\t\t\t\t\tdetails.truncation = truncation;\n\t\t\t\t\tcontent += `\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: content }],\n\t\t\t\t\tdetails: buildSearchDetails(details, content, executionCwd, scopePath, skippedMissingPaths),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (results.length === 1) {\n\t\t\t\tconst result = results[0]!;\n\t\t\t\tlet text = result.content\n\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t.filter((value): value is string => typeof value === \"string\")\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\ttext = filterSearchOutputByLineRange(text, targets[0]?.lineRanges, contextBefore, contextAfter);\n\t\t\t\tif (!isVirtualSearchTarget(targets[0]) && text !== \"No matches found\")\n\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter) || \"No matches found\";\n\t\t\t\tconst skipNotice = singleFileSkipIgnored\n\t\t\t\t\t? \"\\n\\n[skip is ignored for single-file search; refine the pattern/path or search a directory to page matching files.]\"\n\t\t\t\t\t: \"\";\n\t\t\t\tif (isSingleFileSearch && text !== \"No matches found\")\n\t\t\t\t\ttext = formatSearchGroups(groupSearchOutput(text), limit, limit);\n\t\t\t\tif (text && text !== \"No matches found\") {\n\t\t\t\t\tconst renderedText = isVirtualSearchTarget(targets[0])\n\t\t\t\t\t\t? text\n\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(text, executionCwd, targets[0]?.path ?? \".\", hashlineStore);\n\t\t\t\t\tconst pagedText = `${hasFileLimit(result.details) ? `${renderedText}\\n\\n${continuationHint(limit, skip)}` : renderedText}${skipNotice}`;\n\t\t\t\t\tconst truncation = truncateHead(pagedText, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\t\t\tif (truncation.truncated)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...result,\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: `${truncation.content}\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdetails: buildSearchDetails(\n\t\t\t\t\t\t\t\t{ ...(result.details ?? {}), truncation },\n\t\t\t\t\t\t\t\ttruncation.content,\n\t\t\t\t\t\t\t\texecutionCwd,\n\t\t\t\t\t\t\t\tscopePath,\n\t\t\t\t\t\t\t\tskippedMissingPaths,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: pagedText }],\n\t\t\t\t\t\tdetails: buildSearchDetails(result.details, pagedText, executionCwd, scopePath, skippedMissingPaths),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...result,\n\t\t\t\t\tdetails: buildSearchDetails(\n\t\t\t\t\t\tresult.details,\n\t\t\t\t\t\ttext || \"No matches found\",\n\t\t\t\t\t\texecutionCwd,\n\t\t\t\t\t\tscopePath,\n\t\t\t\t\t\tskippedMissingPaths,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst renderedResults = await Promise.all(\n\t\t\t\tresults.map(async (result, index) => {\n\t\t\t\t\tlet text = result.content\n\t\t\t\t\t\t.map((item) => (item.type === \"text\" ? item.text : undefined))\n\t\t\t\t\t\t.filter((value): value is string => typeof value === \"string\" && value.length > 0)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\ttext = filterSearchOutputByLineRange(text, targets[index]?.lineRanges, contextBefore, contextAfter);\n\t\t\t\t\tif (!isVirtualSearchTarget(targets[index]) && text !== \"No matches found\")\n\t\t\t\t\t\ttext = applyDefaultSearchContext(text, contextBefore, contextAfter);\n\t\t\t\t\tif (!text || text === \"No matches found\") return `# ${targets[index]?.path ?? \".\"}\\n${text}`;\n\t\t\t\t\treturn isVirtualSearchTarget(targets[index])\n\t\t\t\t\t\t? text\n\t\t\t\t\t\t: await addHashlineHeadersToSearchOutput(\n\t\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t\t\texecutionCwd,\n\t\t\t\t\t\t\t\ttargets[index]?.path ?? \".\",\n\t\t\t\t\t\t\t\thashlineStore,\n\t\t\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst content = dedupeRenderedSearchOutput(\n\t\t\t\t`${renderedResults.join(\"\\n\\n\")}${skippedMissingPaths.length > 0 ? `\\n\\n[Skipped missing paths: ${skippedMissingPaths.join(\", \")}]` : \"\"}${pageFullWithMore ? `\\n\\n${continuationHint(limit, skip)}` : \"\"}${internalSearchCapped && !pageFullWithMore ? `\\n\\n${internalCapHint()}` : \"\"}`,\n\t\t\t);\n\t\t\tif (pageFullWithMore || internalSearchCapped) markFileLimit(details, limit);\n\t\t\tconst truncation = truncateHead(content, { maxLines: Number.MAX_SAFE_INTEGER });\n\t\t\tlet output = truncation.content;\n\t\t\tif (truncation.truncated) {\n\t\t\t\tdetails.truncation = truncation;\n\t\t\t\toutput += `\\n\\n[${formatSize(DEFAULT_MAX_BYTES)} combined output limit reached]`;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\tdetails: buildSearchDetails(details, output, executionCwd, scopePath, skippedMissingPaths),\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(formatSearchCall(args, theme));\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options: ToolRenderResultOptions, theme, context) {\n\t\t\treturn grepDefinition.renderResult?.(result, options, theme, context) ?? new Text(\"\", 0, 0);\n\t\t},\n\t};\n}\n\nexport function createSearchTool(cwd: string, options?: SearchToolOptions): AgentTool<typeof searchSchema> {\n\treturn wrapToolDefinition(createSearchToolDefinition(cwd, options));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,KAAK,EAAoB,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAGxG,OAAO,EAGN,KAAK,qBAAqB,EAI1B,MAAM,eAAe,CAAC;AAiBvB,QAAA,MAAM,WAAW;;;EAYhB,CAAC;AAEF,eAAO,MAAM,iCAAiC;sBACpC,+CAA+C;;EAI9C,CAAC;AACZ,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,gBAAgB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAwFD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACtC;AA+ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAgNlE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG"}
|
package/dist/core/tools/write.js
CHANGED
|
@@ -243,8 +243,9 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
243
243
|
promptGuidelines: [...writeToolSystemPromptContribution.guidelines],
|
|
244
244
|
...experimentalToolSamplingProperty(),
|
|
245
245
|
parameters: writeSchema,
|
|
246
|
-
async execute(_toolCallId, { path, content }, signal, _onUpdate,
|
|
247
|
-
const resourceCtx =
|
|
246
|
+
async execute(_toolCallId, { path, content }, signal, _onUpdate, ctx) {
|
|
247
|
+
const resourceCtx = ctx;
|
|
248
|
+
const executionCwd = ctx?.cwd || cwd;
|
|
248
249
|
const archive = parseArchiveSelector(path);
|
|
249
250
|
const parsedSqlite = parseSqliteSelector(path);
|
|
250
251
|
if (parsedSqlite?.table && path.includes("?"))
|
|
@@ -258,11 +259,11 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
258
259
|
parsedSqlite.sampleRows !== undefined ||
|
|
259
260
|
parsedSqlite.query))
|
|
260
261
|
throw new Error("SQLite write selectors must not include query parameters.");
|
|
261
|
-
const sqlite = sqliteSelectorForPath(path,
|
|
262
|
+
const sqlite = sqliteSelectorForPath(path, executionCwd);
|
|
262
263
|
if (!sqlite && parsedSqlite?.table)
|
|
263
264
|
throw new Error(`SQLite database not found or is not SQLite: ${path}`);
|
|
264
265
|
if (sqlite) {
|
|
265
|
-
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "",
|
|
266
|
+
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "", executionCwd, hashlineStore);
|
|
266
267
|
const message = writeSqliteSelector(sqlite, stripped.content);
|
|
267
268
|
return {
|
|
268
269
|
content: [{ type: "text", text: `${message}${strippedHashlineNote(stripped.stripped)}` }],
|
|
@@ -270,8 +271,8 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
270
271
|
};
|
|
271
272
|
}
|
|
272
273
|
if (archive) {
|
|
273
|
-
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "",
|
|
274
|
-
const resolvedArchive = resolveArchiveSelector(archive,
|
|
274
|
+
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "", executionCwd, hashlineStore);
|
|
275
|
+
const resolvedArchive = resolveArchiveSelector(archive, executionCwd);
|
|
275
276
|
writeArchiveSelector(resolvedArchive, stripped.content);
|
|
276
277
|
return {
|
|
277
278
|
content: [
|
|
@@ -284,18 +285,18 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
284
285
|
};
|
|
285
286
|
}
|
|
286
287
|
if (path.startsWith("conflict://")) {
|
|
287
|
-
const writeContent = stripKnownHashlineCopiedContent(content, "",
|
|
288
|
+
const writeContent = stripKnownHashlineCopiedContent(content, "", executionCwd, hashlineStore);
|
|
288
289
|
const target = decodeURIComponent(path.slice("conflict://".length));
|
|
289
290
|
if (!target)
|
|
290
291
|
throw new Error("conflict:// target is required.");
|
|
291
292
|
if (target.includes("/"))
|
|
292
293
|
throw new Error("Scoped conflict resources are read-only; write conflict://<id> or conflict://*.");
|
|
293
|
-
const liveBlocks = await findConflictBlocks(
|
|
294
|
+
const liveBlocks = await findConflictBlocks(executionCwd);
|
|
294
295
|
if (liveBlocks.length === 0)
|
|
295
296
|
throw new Error("No conflict markers found.");
|
|
296
|
-
const blocks = reconcileConflictBlocks(liveBlocks,
|
|
297
|
+
const blocks = reconcileConflictBlocks(liveBlocks, executionCwd);
|
|
297
298
|
if (target === "*") {
|
|
298
|
-
const headers = await conflictSnapshotHeaders(await resolveConflictBlocks(blocks, writeContent),
|
|
299
|
+
const headers = await conflictSnapshotHeaders(await resolveConflictBlocks(blocks, writeContent), executionCwd, hashlineStore);
|
|
299
300
|
return {
|
|
300
301
|
content: [
|
|
301
302
|
{
|
|
@@ -312,18 +313,18 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
312
313
|
const block = blocks[id - 1];
|
|
313
314
|
if (!block)
|
|
314
315
|
throw new Error(`Conflict id not found: ${target}`);
|
|
315
|
-
const headers = await conflictSnapshotHeaders(await resolveConflictBlocks([block], writeContent),
|
|
316
|
+
const headers = await conflictSnapshotHeaders(await resolveConflictBlocks([block], writeContent), executionCwd, hashlineStore);
|
|
316
317
|
return {
|
|
317
318
|
content: [{ type: "text", text: `Resolved conflict ${target}${headers[0] ? `\n\n${headers[0]}` : ""}` }],
|
|
318
319
|
details: undefined,
|
|
319
320
|
};
|
|
320
321
|
}
|
|
321
322
|
if (/^[a-z]+:\/\//i.test(path)) {
|
|
322
|
-
const sourcePath = path.startsWith("local://") ? resolveInternalSelector(path,
|
|
323
|
+
const sourcePath = path.startsWith("local://") ? resolveInternalSelector(path, executionCwd) : undefined;
|
|
323
324
|
if (sourcePath)
|
|
324
|
-
return createWriteToolDefinition(
|
|
325
|
-
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "",
|
|
326
|
-
await writeInternalSelector(path,
|
|
325
|
+
return createWriteToolDefinition(executionCwd, options).execute(_toolCallId, { path: sourcePath, content }, signal, _onUpdate, ctx);
|
|
326
|
+
const stripped = stripKnownHashlineCopiedContentWithMeta(content, "", executionCwd, hashlineStore);
|
|
327
|
+
await writeInternalSelector(path, executionCwd, stripped.content, resourceCtx);
|
|
327
328
|
return {
|
|
328
329
|
content: [
|
|
329
330
|
{
|
|
@@ -334,7 +335,7 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
334
335
|
details: {},
|
|
335
336
|
};
|
|
336
337
|
}
|
|
337
|
-
const absolutePath = resolveToCwd(path,
|
|
338
|
+
const absolutePath = resolveToCwd(path, executionCwd);
|
|
338
339
|
const dir = dirname(absolutePath);
|
|
339
340
|
return withFileMutationQueue(absolutePath, async () => {
|
|
340
341
|
// Do not reject from an abort event listener here: that would release the
|
|
@@ -352,7 +353,7 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
352
353
|
const existing = await fsReadFile(absolutePath, "utf8").catch(() => undefined);
|
|
353
354
|
if (existing !== undefined && hasGeneratedMarker(existing))
|
|
354
355
|
throw new Error(`Refusing to overwrite generated file: ${path}`);
|
|
355
|
-
const stripped = stripKnownHashlineCopiedContentWithMeta(content, absolutePath,
|
|
356
|
+
const stripped = stripKnownHashlineCopiedContentWithMeta(content, absolutePath, executionCwd, hashlineStore);
|
|
356
357
|
const writeContent = stripped.content;
|
|
357
358
|
await ops.writeFile(absolutePath, writeContent);
|
|
358
359
|
invalidateNativeSearchCache(absolutePath);
|
|
@@ -367,7 +368,7 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
367
368
|
}
|
|
368
369
|
}
|
|
369
370
|
throwIfAborted();
|
|
370
|
-
const header = hashlineHeaderForWrite(absolutePath,
|
|
371
|
+
const header = hashlineHeaderForWrite(absolutePath, executionCwd, writeContent, hashlineStore);
|
|
371
372
|
return {
|
|
372
373
|
content: [
|
|
373
374
|
{
|