pi-optimizer 0.7.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +48 -0
- package/index.js +1984 -0
- package/index.js.map +7 -0
- package/package.json +31 -0
package/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/optimizer/deduplicator/index.ts", "../../src/optimizer/entries.ts", "../../src/utils.ts", "../../src/optimizer/deduplicator/helpers.ts", "../../src/optimizer/deduplicator/resources.ts", "../../src/optimizer/inspector/helpers.ts", "../../src/optimizer/deduplicator/state.ts", "../../src/optimizer/compactor/index.ts", "../../src/optimizer/compactor/bash.ts", "../../src/optimizer/compactor/grep.ts", "../../src/optimizer/mapper/index.ts", "../../src/optimizer/mapper/files.ts", "../../src/optimizer/languages/grammar.ts", "../../src/optimizer/languages/types.ts", "../../src/optimizer/languages/typescript.ts", "../../src/optimizer/languages/python.ts", "../../src/optimizer/languages/go.ts", "../../src/optimizer/languages/java.ts", "../../src/optimizer/languages/rust.ts", "../../src/optimizer/languages/symbols.ts", "../../src/optimizer/languages/index.ts", "../../src/optimizer/inspector/index.ts", "../../src/optimizer/inspector/inspect.ts", "../../src/optimizer/pruner/cleanup.ts", "../../src/optimizer/pruner/context.ts", "../../src/optimizer/pruner/session.ts", "../../src/optimizer/pruner/index.ts", "../../src/optimizer/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { type ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { readSessionEntries } from \"../entries.js\";\nimport { filterDeduplicatedMessages } from \"./helpers.js\";\nimport { buildDeduplicatorState } from \"./state.js\";\n\nexport default function (pi: ExtensionAPI) {\n let state = buildDeduplicatorState([], null, \"\");\n\n pi.on(\"session_start\", (_event, ctx) => {\n const entries = readSessionEntries(ctx.sessionManager.getSessionFile()) ?? [];\n state = buildDeduplicatorState(entries, ctx.sessionManager.getLeafId(), ctx.cwd);\n });\n\n pi.on(\"session_tree\", (event, ctx) => {\n const entries = readSessionEntries(ctx.sessionManager.getSessionFile()) ?? [];\n state = buildDeduplicatorState(entries, event.newLeafId, ctx.cwd);\n });\n\n pi.on(\"context\", (event) => {\n const deduplicated = filterDeduplicatedMessages(event.messages, state);\n if (deduplicated.changed) return { messages: deduplicated.messages };\n });\n}\n", "import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { isRecord } from \"../utils.js\";\n\nexport function readSessionEntries(\n sessionFile: string | undefined,\n): Record<string, unknown>[] | undefined {\n if (!sessionFile || !existsSync(sessionFile)) return;\n\n try {\n const sessionText = readFileSync(sessionFile, \"utf8\");\n const entries: Record<string, unknown>[] = [];\n for (const line of sessionText.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n const entry = JSON.parse(line);\n if (!isRecord(entry)) return;\n entries.push(entry);\n }\n return entries;\n } catch {\n return;\n }\n}\n\nexport function writeSessionEntries(sessionFile: string, entries: Record<string, unknown>[]) {\n const temporaryFile = `${sessionFile}.${process.pid}.${Date.now()}.tmp`;\n try {\n writeFileSync(\n temporaryFile,\n `${entries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`,\n \"utf8\",\n );\n renameSync(temporaryFile, sessionFile);\n } finally {\n if (existsSync(temporaryFile)) unlinkSync(temporaryFile);\n }\n}\n\nexport function getEntryId(entry: Record<string, unknown>): string | undefined {\n const entryId = entry.id;\n if (typeof entryId !== \"string\" || entryId.length === 0) return;\n return entryId;\n}\n\nexport function getMessage(entry: Record<string, unknown>): Record<string, unknown> | undefined {\n if (entry.type !== \"message\") return;\n const message = entry.message;\n if (!isRecord(message)) return;\n return message;\n}\n\nexport function getToolResultMessage(\n entry: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const message = getMessage(entry);\n if (!message || message.role !== \"toolResult\") return;\n if (typeof message.toolCallId !== \"string\" || message.toolCallId.length === 0) return;\n if (typeof message.toolName !== \"string\" || message.toolName.length === 0) return;\n return message;\n}\n\nexport function getDetails(message: Record<string, unknown>): Record<string, unknown> | undefined {\n const details = message.details;\n if (!isRecord(details)) return;\n return details;\n}\n\nexport function getParentId(entry: Record<string, unknown>): string | null {\n if (typeof entry.parentId === \"string\") return entry.parentId;\n return null;\n}\n\nexport function getBranchEntries(\n entries: Record<string, unknown>[],\n leafId: string | null,\n): Record<string, unknown>[] {\n if (!leafId) return [];\n\n const entriesById = new Map<string, Record<string, unknown>>();\n for (const entry of entries) {\n const entryId = getEntryId(entry);\n if (entryId) entriesById.set(entryId, entry);\n }\n if (!entriesById.has(leafId)) return [];\n\n const branch: Record<string, unknown>[] = [];\n const visitedIds = new Set<string>();\n let currentId: string | null = leafId;\n while (currentId && !visitedIds.has(currentId)) {\n const entry = entriesById.get(currentId);\n if (!entry) break;\n visitedIds.add(currentId);\n branch.push(entry);\n currentId = getParentId(entry);\n }\n return branch.reverse();\n}\n\nexport function getLastEntryId(entries: Record<string, unknown>[]): string | null {\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const entryId = getEntryId(entries[index]!);\n if (entryId) return entryId;\n }\n return null;\n}\n", "import { spawn } from \"node:child_process\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n keyHint,\n SettingsManager,\n Theme,\n truncateToVisualLines,\n type ExtensionCommandContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Spacer, Text } from \"@earendil-works/pi-tui\";\nimport { Container } from \"@earendil-works/pi-tui\";\n\nconst PI_PATHS = {\n web: \"web-results\",\n agents: \"agents\",\n settings: \"settings.json\",\n mcp: \"mcp.json\",\n permissions: \"permissions.json\",\n checkpoints: \"checkpoints\",\n subsessions: \"subsessions.json\",\n subsessionsDir: \"subsessions\",\n plans: \"plans\",\n grammars: \"grammars\",\n system: \"SYSTEM.md\",\n} as const;\n\ntype PathKey = keyof typeof PI_PATHS;\n\nexport function getPiPath(key: PathKey, scope: \"global\", ...path: string[]): string;\nexport function getPiPath(key: PathKey, cwd: string, ...path: string[]): string;\nexport function getPiPath(key: PathKey): string;\nexport function getPiPath(key: PathKey, ...full: string[]): string {\n const path = PI_PATHS[key];\n const remaining = path.includes(\".\") ? [] : full.slice(1);\n const isGlobal = !full[0] || full[0] === \"global\";\n const baseDir = isGlobal ? homedir() : full[0]!;\n const piPath = isGlobal ? [\".pi\", \"agent\"] : [\".pi\"];\n return join(baseDir, ...piPath, path, ...remaining);\n}\n\nexport async function readJson<T>(filePath: string, fallback: T): Promise<T> {\n try {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n } catch {\n return fallback;\n }\n}\n\nexport async function writeJson(filePath: string, data: unknown) {\n await writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function runCommand(\n cwd: string,\n command: string,\n argumentsList: string[],\n options?: { signal?: AbortSignal; successExitCodes?: number[]; abortMessage?: string },\n): Promise<{ stdout: string; stderr: string; exitCode: number | null }> {\n const abortMessage = options?.abortMessage ?? \"command aborted\";\n if (options?.signal?.aborted) {\n throw new Error(abortMessage);\n }\n\n return await new Promise<{ stdout: string; stderr: string; exitCode: number | null }>(\n (resolveCommand, rejectCommand) => {\n const executable = process.platform === \"win32\" ? `${command}.cmd` : command;\n const childProcess = spawn(executable, argumentsList, {\n cwd,\n env: process.env,\n signal: options?.signal,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n childProcess.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n\n childProcess.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n childProcess.on(\"error\", (error) => {\n rejectCommand(error);\n });\n\n childProcess.on(\"close\", (exitCode) => {\n if (options?.signal?.aborted) {\n rejectCommand(new Error(abortMessage));\n return;\n }\n\n const successExitCodes = options?.successExitCodes ?? [0];\n if (!successExitCodes.includes(exitCode ?? -1)) {\n const commandText = `${command} ${argumentsList.join(\" \")}`;\n const stderrText = stderr.trim();\n rejectCommand(\n new Error(\n `${commandText} failed with exit code ${exitCode ?? \"unknown\"}${stderrText ? `: ${stderrText}` : \"\"}`,\n ),\n );\n return;\n }\n\n resolveCommand({ stdout, stderr, exitCode });\n });\n },\n );\n}\n\nexport async function openInEditor(\n ctx: ExtensionCommandContext,\n filePath: string,\n): Promise<boolean> {\n const command = SettingsManager.create(ctx.cwd, undefined, {\n projectTrusted: ctx.isProjectTrusted(),\n }).getExternalEditorCommand();\n const commandParts = tokenizeArgs(command);\n const editor = commandParts.shift();\n if (!editor) {\n ctx.ui.notify(\"External editor command is empty\", \"error\");\n return false;\n }\n\n const exitCode = await new Promise<number | null>((resolvePromise) => {\n const child = spawn(editor, [...commandParts, filePath], {\n stdio: \"inherit\",\n shell: process.platform === \"win32\",\n });\n child.on(\"error\", () => resolvePromise(null));\n child.on(\"close\", (code) => resolvePromise(code));\n });\n\n if (exitCode === 0) return true;\n ctx.ui.notify(`Failed to open ${filePath}. Set externalEditor, VISUAL, or EDITOR.`, \"error\");\n return false;\n}\n\nexport function normalizeText(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nexport function unique<T>(values: Iterable<T>): T[] {\n return [...new Set(values)];\n}\n\nexport function isDefined<T>(value: T | undefined): value is T {\n return value !== undefined;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function tokenizeArgs(args: string): string[] {\n return args\n .split(/\\s+/)\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nexport function customText(text: string, pad?: { x?: number; y?: number }) {\n const { x = 0, y = 0 } = pad ?? {};\n return new Text(text, x, y);\n}\n\nexport function isMissingFileError(error: any) {\n return Boolean(error) && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\";\n}\n\nexport function isUuidv7(input: string): boolean {\n const pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return pattern.test(input);\n}\n\nexport function renderCallText(text: string, isPartial: boolean) {\n const container = new Container();\n container.addChild(new Text(text, 0, 0));\n if (!isPartial) {\n container.addChild(new Spacer(1));\n }\n return container;\n}\n\nexport function renderResultText(text: string, theme: Theme, expanded: boolean) {\n if (expanded) {\n return new Text(theme.fg(\"toolOutput\", text), 0, 0);\n }\n return {\n render(width: number) {\n const result = truncateToVisualLines(text, 10, width);\n const lines = result.visualLines.map((line) => theme.fg(\"toolOutput\", line));\n if (result.skippedCount > 0) {\n lines.push(\n `${theme.fg(\"toolOutput\", `... (${result.skippedCount} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"toolOutput\", \")\")}`,\n );\n }\n return lines;\n },\n invalidate() {},\n };\n}\n", "import type { Range } from \"../inspector/types.js\";\nimport type { ContextEvent } from \"@earendil-works/pi-coding-agent\";\nimport type { DeduplicatorState } from \"./types.js\";\n\nexport function filterDeduplicatedMessages(\n messages: ContextEvent[\"messages\"],\n state: DeduplicatorState,\n): { changed: boolean; messages: ContextEvent[\"messages\"] } {\n const prunedIds = new Set<string>();\n for (const [toolCallId, repeatIds] of state.replacements) {\n if (repeatIds.every((repeatId) => state.resultEntryIds.has(repeatId))) {\n prunedIds.add(toolCallId);\n }\n }\n if (prunedIds.size === 0) {\n return { changed: false, messages };\n }\n\n const retained: ContextEvent[\"messages\"] = [];\n let changed = false;\n for (const message of messages) {\n if (message.role === \"toolResult\" && prunedIds.has(message.toolCallId)) {\n changed = true;\n continue;\n }\n if (message.role !== \"assistant\") {\n retained.push(message);\n continue;\n }\n\n const retainedContent = message.content.filter(\n (block) => block.type !== \"toolCall\" || !prunedIds.has(block.id),\n );\n if (retainedContent.length === message.content.length) {\n retained.push(message);\n continue;\n }\n changed = true;\n if (retainedContent.some((block) => block.type !== \"thinking\")) {\n retained.push({ ...message, content: retainedContent });\n }\n }\n return { changed, messages: retained };\n}\n\nexport function mergeRanges(ranges: Range[]) {\n const sorted = ranges.toSorted(([firstStart], [secondStart]) => firstStart - secondStart);\n const merged: Range[] = [];\n\n for (const range of sorted) {\n const previousRange = merged.at(-1);\n if (!previousRange || previousRange[1] < range[0] - 1) {\n merged.push([range[0], range[1]]);\n continue;\n }\n previousRange[1] = Math.max(previousRange[1], range[1]);\n }\n\n return merged;\n}\n\nexport function hasFullCoverage(range: Range, candidates: Range[]): boolean {\n const intersections: Range[] = [];\n for (const candidate of candidates) {\n const start = Math.max(range[0], candidate[0]);\n const end = Math.min(range[1], candidate[1]);\n if (start <= end) intersections.push([start, end]);\n }\n if (intersections.length === 0) return false;\n\n const merged = mergeRanges(intersections);\n return (\n merged.reduce((lines, [start, end]) => lines + end - start + 1, 0) === range[1] - range[0] + 1\n );\n}\n", "import { realpathSync } from \"node:fs\";\nimport { normalize, resolve } from \"node:path\";\nimport { isRecord } from \"../../utils.js\";\nimport { parseInspectToolDetails } from \"../inspector/helpers.js\";\nimport type { Range } from \"../inspector/types.js\";\n\nexport interface ResourceCoverage {\n resource: string;\n range: Range;\n}\n\nfunction getResultText(message: Record<string, unknown>): string | undefined {\n if (!Array.isArray(message.content) || message.content.length !== 1) return;\n\n const content = message.content[0];\n if (!isRecord(content) || content.type !== \"text\" || typeof content.text !== \"string\") return;\n return content.text;\n}\n\nfunction normalizeResourcePath(sourcePath: string, cwd: string): string {\n const absolutePath = resolve(cwd, sourcePath);\n try {\n return normalize(realpathSync(absolutePath));\n } catch {\n return normalize(absolutePath);\n }\n}\n\nexport function getResourceCoverage(\n toolName: string,\n input: Record<string, unknown>,\n result: unknown,\n cwd: string,\n): ResourceCoverage | undefined {\n if (!isRecord(result)) return;\n\n if (toolName === \"inspect\") {\n const inspected = parseInspectToolDetails(result.details);\n if (!inspected) return;\n return {\n resource: normalizeResourcePath(inspected.path, cwd),\n range: inspected.range,\n };\n }\n\n if (toolName !== \"read\") return;\n const sourcePath = input.path;\n const offset = input.offset;\n if (typeof sourcePath !== \"string\" || sourcePath.length === 0) return;\n if (\n offset !== undefined &&\n (typeof offset !== \"number\" || !Number.isInteger(offset) || offset < 1)\n ) {\n return;\n }\n\n const details = isRecord(result.details) ? result.details : undefined;\n const truncation = details?.truncation;\n if (truncation !== undefined && !isRecord(truncation)) return;\n if (isRecord(truncation) && truncation.firstLineExceedsLimit === true) return;\n\n const resultText = getResultText(result);\n if (resultText === undefined) return;\n const continuation = resultText.match(/\\n\\n\\[[^\\n]*Use offset=\\d+ to continue\\.\\]$/)?.[0];\n const visibleText = continuation ? resultText.slice(0, -continuation.length) : resultText;\n const outputLines =\n isRecord(truncation) && truncation.truncated === true\n ? truncation.outputLines\n : visibleText.split(\"\\n\").length;\n if (typeof outputLines !== \"number\" || !Number.isInteger(outputLines) || outputLines <= 0) return;\n\n const start = typeof offset === \"number\" ? offset : 1;\n return {\n resource: normalizeResourcePath(sourcePath, cwd),\n range: [start, start + outputLines - 1],\n };\n}\n", "import type { InspectToolDetails } from \"./types.js\";\n\nexport function parseInspectToolDetails(inspected: unknown) {\n if (!inspected || typeof inspected !== \"object\") return;\n\n const path = (inspected as { path?: unknown }).path;\n const symbol = (inspected as { symbol?: unknown }).symbol;\n const range = (inspected as { range?: unknown }).range;\n\n if (typeof path !== \"string\" || path.length === 0) return;\n if (typeof symbol !== \"string\" || symbol.length === 0) return;\n if (!Array.isArray(range) || range.length !== 2) return;\n\n const start = range[0];\n const end = range[1];\n if (\n typeof start !== \"number\" ||\n typeof end !== \"number\" ||\n !Number.isInteger(start) ||\n !Number.isInteger(end) ||\n start < 1 ||\n end < start\n ) {\n return;\n }\n\n return { path, symbol, range: [start, end] } satisfies InspectToolDetails;\n}\n\nexport function pruneInspectResults(messages: Array<{ role?: string }>) {\n const seen = new Set<string>();\n let changed = false;\n\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index] as {\n role: string;\n toolName?: string;\n details?: unknown;\n isError?: boolean;\n };\n\n if (message.role !== \"toolResult\" || message.toolName !== \"inspect\" || message.isError) {\n continue;\n }\n\n const details = parseInspectToolDetails(message.details);\n if (!details) continue;\n\n const symbolKey = `${details.path}#${details.symbol}`;\n if (!seen.has(symbolKey)) {\n seen.add(symbolKey);\n continue;\n }\n\n changed = true;\n messages.splice(index, 1);\n }\n\n return changed;\n}\n", "import {\n getBranchEntries,\n getEntryId,\n getLastEntryId,\n getMessage,\n getToolResultMessage,\n} from \"../entries.js\";\nimport { isRecord } from \"../../utils.js\";\nimport { hasFullCoverage } from \"./helpers.js\";\nimport { getResourceCoverage } from \"./resources.js\";\nimport type { DeduplicatorState, ResourceResult } from \"./types.js\";\n\nfunction collectToolCallInputs(\n activeEntries: Record<string, unknown>[],\n): Map<string, Record<string, unknown>> {\n const inputsByCallId = new Map<string, Record<string, unknown>>();\n\n for (const entry of activeEntries) {\n const message = getMessage(entry);\n if (message?.role !== \"assistant\" || !Array.isArray(message.content)) continue;\n\n for (const block of message.content) {\n if (!isRecord(block) || block.type !== \"toolCall\") continue;\n if (typeof block.id !== \"string\" || !isRecord(block.arguments)) continue;\n inputsByCallId.set(block.id, block.arguments);\n }\n }\n\n return inputsByCallId;\n}\n\nfunction collectResourceResults(\n activeEntries: Record<string, unknown>[],\n inputsByCallId: Map<string, Record<string, unknown>>,\n cwd: string,\n): ResourceResult[] {\n const results: ResourceResult[] = [];\n for (const entry of activeEntries) {\n const entryId = getEntryId(entry);\n const message = getToolResultMessage(entry);\n if (\n !entryId ||\n !message ||\n message.isError === true ||\n typeof message.toolCallId !== \"string\"\n ) {\n continue;\n }\n\n const input = inputsByCallId.get(message.toolCallId);\n if (!input || (message.toolName !== \"read\" && message.toolName !== \"inspect\")) continue;\n\n const coverage = getResourceCoverage(message.toolName, input, message, cwd);\n if (!coverage) continue;\n results.push({\n entryId,\n range: coverage.range,\n resource: coverage.resource,\n toolCallId: message.toolCallId,\n prunable: true,\n });\n }\n return results;\n}\n\nfunction collectReplacementsById(results: ResourceResult[]): Map<string, string[]> {\n const retainedByResource = new Map<string, ResourceResult[]>();\n const replacementsById = new Map<string, string[]>();\n\n for (let index = results.length - 1; index >= 0; index -= 1) {\n const result = results[index]!;\n const retained = retainedByResource.get(result.resource) ?? [];\n const covering = retained.filter(\n (candidate) => candidate.range[0] <= result.range[1] && candidate.range[1] >= result.range[0],\n );\n\n if (\n hasFullCoverage(\n result.range,\n covering.map(({ range }) => range),\n )\n ) {\n if (result.prunable) {\n replacementsById.set(result.entryId, [\n ...new Set(covering.map((candidate) => candidate.entryId)),\n ]);\n }\n continue;\n }\n retained.push(result);\n retainedByResource.set(result.resource, retained);\n }\n\n return replacementsById;\n}\n\nexport function buildDeduplicatorState(\n entries: Record<string, unknown>[],\n leafId: string | null,\n cwd: string,\n): DeduplicatorState {\n let activeEntries = getBranchEntries(entries, leafId);\n if (activeEntries.length === 0 && leafId !== null) {\n activeEntries = getBranchEntries(entries, getLastEntryId(entries));\n }\n\n const results = collectResourceResults(activeEntries, collectToolCallInputs(activeEntries), cwd);\n const replacementsById = collectReplacementsById(results);\n const replacements = new Map<string, string[]>();\n\n for (const result of results) {\n if (!result.prunable) continue;\n const replacement = replacementsById.get(result.entryId);\n if (!replacement) continue;\n replacements.set(result.toolCallId, replacement);\n }\n\n return { replacements, resultEntryIds: new Set(results.map((result) => result.entryId)) };\n}\n", "import { statSync } from \"node:fs\";\nimport {\n createBashToolDefinition,\n createGrepToolDefinition,\n isGrepToolResult,\n type ExtensionAPI,\n} from \"@earendil-works/pi-coding-agent\";\nimport { createCompactingBashOperations } from \"./bash.js\";\nimport { rewriteTailWithSummaries, extractGrepSummary, formatGrepResult } from \"./grep.js\";\nimport Type from \"typebox\";\n\nexport default function (pi: ExtensionAPI) {\n let writeStartOffset = 0;\n const store = new Map<string, string>();\n const grepTool = createGrepToolDefinition(process.cwd());\n const bashTool = createBashToolDefinition(process.cwd(), {\n operations: createCompactingBashOperations(),\n });\n\n pi.registerTool({\n ...grepTool,\n parameters: Type.Object({\n ...grepTool.parameters.properties,\n context: Type.Optional(\n Type.Number({\n description: \"Number of lines to show before and after each match (default: 0)\",\n maximum: 3,\n }),\n ),\n }),\n });\n\n pi.registerTool({\n ...bashTool,\n description:\n \"Execute a bash command in the current working directory. Strips ANSI escapes, collapses carriage-return updates, removes consecutive duplicate lines, then optionally filters lines with a JavaScript regex before truncating to the last 2000 lines or 50KB. Saved full output is compacted.\",\n parameters: Type.Object({\n ...bashTool.parameters.properties,\n purpose: Type.String({\n description: \"Briefly explain what this command will do and why before running it\",\n minLength: 1,\n maxLength: 256,\n pattern: \"\\\\S\",\n }),\n }),\n prepareArguments: undefined,\n execute(toolCallId, params, signal, onUpdate, ctx) {\n return bashTool.execute(\n toolCallId,\n { command: params.command, timeout: params.timeout },\n signal,\n onUpdate,\n ctx,\n );\n },\n });\n\n pi.on(\"agent_start\", async (_event, ctx) => {\n if (store.size > 0) return;\n\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (!sessionFile) {\n writeStartOffset = 0;\n return;\n }\n\n try {\n writeStartOffset = statSync(sessionFile).size;\n } catch {\n writeStartOffset = 0;\n }\n });\n\n pi.on(\"agent_end\", async (event) => {\n for (const message of event.messages) {\n if (message.role !== \"toolResult\" || message.toolName !== \"grep\") continue;\n const text = message.content.find((content) => content.type === \"text\")?.text;\n if (text === undefined) continue;\n\n const summary = extractGrepSummary(text);\n if (!summary) continue;\n store.set(message.toolCallId, summary);\n }\n });\n\n pi.on(\"session_shutdown\", (event, ctx) => {\n if (store.size === 0) return;\n\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (sessionFile) {\n rewriteTailWithSummaries(sessionFile, writeStartOffset, store);\n }\n if (event.targetSessionFile && event.targetSessionFile !== sessionFile) {\n rewriteTailWithSummaries(event.targetSessionFile, writeStartOffset, store);\n }\n });\n\n pi.on(\"context\", async (event) => {\n if (store.size === 0) return;\n\n let changed = false;\n for (const message of event.messages) {\n if (message.role !== \"toolResult\" || message.toolName !== \"grep\") continue;\n\n const summary = store.get(message.toolCallId);\n if (summary === undefined) continue;\n\n message.content = [{ type: \"text\", text: summary }];\n changed = true;\n }\n\n if (!changed) return;\n return { messages: event.messages };\n });\n\n pi.on(\"tool_result\", async (event) => {\n if (!isGrepToolResult(event) || event.isError) return;\n\n let changed = false;\n const content = event.content.map((item) => {\n if (item.type !== \"text\") return item;\n\n const text = formatGrepResult(item.text);\n if (text === item.text) return item;\n\n changed = true;\n return { ...item, text };\n });\n\n if (changed) return { content };\n });\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport { createLocalBashOperations, type BashOperations } from \"@earendil-works/pi-coding-agent\";\n\nconst localBash = createLocalBashOperations();\nconst MIN_SIMILAR_LENGTH = 10;\nconst SIMILARITY_THRESHOLD = 0.8;\n\nfunction isSimilarLine(previousLine: string, nextLine: string) {\n if (Math.min(previousLine.length, nextLine.length) < MIN_SIMILAR_LENGTH) return false;\n\n const longestLength = Math.max(previousLine.length, nextLine.length);\n if (1 - Math.abs(previousLine.length - nextLine.length) / longestLength < SIMILARITY_THRESHOLD) {\n return false;\n }\n\n const distances = new Uint32Array(nextLine.length + 1);\n for (let nextIndex = 0; nextIndex <= nextLine.length; nextIndex++) {\n distances[nextIndex] = nextIndex;\n }\n\n for (let previousIndex = 1; previousIndex <= previousLine.length; previousIndex++) {\n let diagonalDistance = distances[0]!;\n distances[0] = previousIndex;\n\n for (let nextIndex = 1; nextIndex <= nextLine.length; nextIndex++) {\n const upperDistance = distances[nextIndex]!;\n const editCost = previousLine[previousIndex - 1] === nextLine[nextIndex - 1] ? 0 : 1;\n distances[nextIndex] = Math.min(\n upperDistance + 1,\n distances[nextIndex - 1]! + 1,\n diagonalDistance + editCost,\n );\n diagonalDistance = upperDistance;\n }\n }\n\n return 1 - distances[nextLine.length]! / longestLength >= SIMILARITY_THRESHOLD;\n}\n\nexport class BashResultCompactor {\n private readonly decoder = new TextDecoder();\n private readonly onData: (data: Buffer) => void;\n // Exact regex and carriage-return handling require holding one logical line.\n private currentLine = \"\";\n private carriageLine: string | undefined;\n private hasPendingLine = false;\n private pendingLine: string | undefined;\n private pendingTerminated = false;\n private omittedLines = 0;\n private hasSimilarLines = false;\n\n constructor(onData: (data: Buffer) => void) {\n this.onData = onData;\n }\n\n append(data: Buffer) {\n this.process(this.decoder.decode(data, { stream: true }));\n }\n\n finish() {\n this.process(this.decoder.decode());\n if (this.hasPendingLine) {\n this.emit(this.getNormalizedLine(), false);\n this.resetLine();\n }\n this.flushPending();\n }\n\n private process(text: string) {\n for (const character of text) {\n if (character === \"\\r\") {\n if (\n this.carriageLine === undefined ||\n stripVTControlCharacters(this.currentLine).length > 0\n ) {\n this.carriageLine = this.currentLine;\n }\n this.currentLine = \"\";\n this.hasPendingLine = true;\n continue;\n }\n\n if (character === \"\\n\") {\n this.emit(this.getNormalizedLine(), true);\n this.resetLine();\n continue;\n }\n\n this.currentLine += character;\n this.hasPendingLine = true;\n }\n }\n\n private getNormalizedLine() {\n const normalizedLine = stripVTControlCharacters(this.currentLine);\n if (this.carriageLine !== undefined && normalizedLine.length === 0) {\n return stripVTControlCharacters(this.carriageLine);\n }\n return normalizedLine;\n }\n\n private emit(normalizedLine: string, terminated: boolean) {\n if (this.pendingLine === undefined) {\n this.pendingLine = normalizedLine;\n this.pendingTerminated = terminated;\n return;\n }\n\n if (normalizedLine === this.pendingLine) {\n this.omittedLines++;\n return;\n }\n\n if (isSimilarLine(this.pendingLine, normalizedLine)) {\n this.pendingLine = normalizedLine;\n this.pendingTerminated = terminated;\n this.omittedLines++;\n this.hasSimilarLines = true;\n return;\n }\n\n this.flushPending();\n this.pendingLine = normalizedLine;\n this.pendingTerminated = terminated;\n }\n\n private flushPending() {\n if (this.pendingLine === undefined) return;\n\n const suffix = this.hasSimilarLines ? ` (similar line x${this.omittedLines})` : \"\";\n this.onData(Buffer.from(`${this.pendingLine}${suffix}${this.pendingTerminated ? \"\\n\" : \"\"}`));\n this.pendingLine = undefined;\n this.pendingTerminated = false;\n this.omittedLines = 0;\n this.hasSimilarLines = false;\n }\n\n private resetLine() {\n this.currentLine = \"\";\n this.carriageLine = undefined;\n this.hasPendingLine = false;\n }\n}\n\nexport function createCompactingBashOperations(filter?: string): BashOperations {\n return {\n async exec(command, cwd, options) {\n const compactor = new BashResultCompactor(options.onData);\n try {\n return await localBash.exec(command, cwd, {\n ...options,\n onData: (data) => compactor.append(data),\n });\n } finally {\n compactor.finish();\n }\n },\n };\n}\n", "import {\n appendFileSync,\n existsSync,\n readFileSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\n\nexport function extractGrepSummary(contentText: string): string | null {\n if (contentText === \"No matches found\") return null;\n const notice = contentText.match(/\\n\\n(\\[[^\\n]+\\])$/)?.[1];\n\n const fileLines = new Map<string, Set<number>>();\n const contentLines = contentText.split(\"\\n\");\n let filePath: string | undefined;\n let matched = false;\n\n for (let lineIndex = 0; lineIndex < contentLines.length; lineIndex++) {\n const contentLine = contentLines[lineIndex] ?? \"\";\n const lineMatch = contentLine.match(/^(\\d+): /);\n if (!lineMatch) {\n const nextLine = contentLines[lineIndex + 1] ?? \"\";\n if (contentLine && !/^\\d+- /.test(contentLine) && /^\\d+[:-] /.test(nextLine)) {\n filePath = contentLine;\n }\n continue;\n }\n\n const lineNumStr = lineMatch[1];\n if (!filePath || !lineNumStr) continue;\n\n matched = true;\n const lineNum = parseInt(lineNumStr, 10);\n const existing = fileLines.get(filePath);\n if (existing) {\n existing.add(lineNum);\n } else {\n fileLines.set(filePath, new Set([lineNum]));\n }\n }\n\n if (!matched) return null;\n\n return (\n Array.from(fileLines.entries())\n .map(([filePath, lines]) => `${filePath}: lines_matched=[${Array.from(lines).join(\", \")}]`)\n .join(\"\\n\") + (notice ? `\\n\\n${notice}` : \"\")\n );\n}\n\nexport function rewriteTailWithSummaries(\n sessionFile: string,\n offset: number,\n summaries: Map<string, string>,\n) {\n if (summaries.size === 0) return;\n\n const sessionBuffer = readFileSync(sessionFile);\n if (offset > sessionBuffer.length) return;\n\n const prefixBuffer = sessionBuffer.subarray(0, offset);\n const tailText = sessionBuffer.subarray(offset).toString(\"utf-8\");\n if (tailText.length === 0) return;\n\n let changed = false;\n const rewrittenTail = tailText\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => {\n const entry = JSON.parse(line) as Record<string, unknown>;\n const message = entry.message as Record<string, unknown> | undefined;\n if (\n entry.type === \"message\" &&\n message?.role === \"toolResult\" &&\n typeof message.toolCallId === \"string\" &&\n summaries.has(message.toolCallId)\n ) {\n changed = true;\n return JSON.stringify({\n ...entry,\n message: {\n ...message,\n content: [{ type: \"text\", text: summaries.get(message.toolCallId)! }],\n },\n });\n }\n return line;\n })\n .join(\"\\n\");\n\n if (!changed) return;\n const tempFile = `${sessionFile}.${process.pid}.${Date.now()}.tmp`;\n\n try {\n writeFileSync(tempFile, prefixBuffer);\n appendFileSync(tempFile, `${rewrittenTail}\\n`, \"utf8\");\n renameSync(tempFile, sessionFile);\n } finally {\n if (existsSync(tempFile)) {\n unlinkSync(tempFile);\n }\n }\n}\n\nexport function formatGrepResult(content: string): string {\n const formattedLines: string[] = [];\n const formattedIndexes = new Map<string, number>();\n let currentFilePath: string | undefined;\n let changed = false;\n\n for (const line of content.split(\"\\n\")) {\n const matchLine = line.match(/^(.+?):(\\d+): (.*)$/);\n const contextLine = matchLine ? null : line.match(/^(.+?)-(\\d+)- (.*)$/);\n const filePath = matchLine?.[1] ?? contextLine?.[1];\n const lineNumber = matchLine?.[2] ?? contextLine?.[2];\n const lineText = matchLine?.[3] ?? contextLine?.[3];\n\n if (!filePath || !lineNumber || lineText === undefined) {\n formattedLines.push(line);\n continue;\n }\n\n const lineKey = `${filePath}\\0${lineNumber}`;\n const formattedIndex = formattedIndexes.get(lineKey);\n if (formattedIndex !== undefined) {\n if (matchLine) formattedLines[formattedIndex] = `${lineNumber}: ${lineText}`;\n continue;\n }\n\n if (filePath !== currentFilePath) {\n formattedLines.push(filePath);\n currentFilePath = filePath;\n }\n formattedIndexes.set(lineKey, formattedLines.length);\n formattedLines.push(`${lineNumber}${matchLine ? \":\" : \"-\"} ${lineText}`);\n changed = true;\n }\n\n return changed ? formattedLines.join(\"\\n\") : content;\n}\n", "import { defineTool, truncateHead } from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\nimport { resolveTargetPaths } from \"./files.js\";\nimport { collectSymbols, SYMBOL_KINDS } from \"../languages/index.js\";\nimport type { LanguageSymbol } from \"../languages/index.js\";\nimport type { MapperResult } from \"./types.js\";\nimport { renderCallText } from \"../../utils.js\";\n\nfunction collapseGroupedSymbols(symbols: LanguageSymbol[]) {\n let groupedSymbolKind: \"deps\" | \"public\" | undefined;\n let importsGroupIndex = 0;\n let exportsGroupIndex = 0;\n\n return symbols.flatMap((symbol) => {\n if (symbol.kind !== \"deps\" && symbol.kind !== \"public\") {\n groupedSymbolKind = undefined;\n return [symbol];\n }\n if (symbol.kind === groupedSymbolKind) return [];\n\n groupedSymbolKind = symbol.kind;\n if (symbol.kind === \"deps\") {\n importsGroupIndex += 1;\n return [{ ...symbol, name: `imports~${importsGroupIndex}`, range: undefined }];\n }\n\n exportsGroupIndex += 1;\n return [{ ...symbol, name: `exports~${exportsGroupIndex}`, range: undefined }];\n });\n}\n\nconst codeMap = defineTool({\n name: \"code_map\",\n label: \"Code map\",\n description:\n \"Fast symbol and code blocks offset/limit indexing. Best for: narrowing targets to inspect/read or code discovery.\",\n parameters: Type.Object({\n targets: Type.Array(Type.String(), {\n description: \"Paths or globs to scan (relative to cwd). Keep scope narrow.\",\n }),\n kinds: Type.Optional(\n Type.Array(Type.Union(SYMBOL_KINDS.map((kind) => Type.Literal(kind))), {\n description: \"Abstraction kinds to include. Omit to include all supported.\",\n }),\n ),\n }),\n async execute(_toolCallId, params, signal, _onUpdate, ctx) {\n const kinds = new Set(params.kinds ?? SYMBOL_KINDS);\n const result: MapperResult = { symbols: [], failed: [] };\n let paths: string[] = [];\n try {\n paths = await resolveTargetPaths(ctx.cwd, params.targets, signal);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n details: `code_map target scan failed: ${message}`,\n content: [{ type: \"text\", text: `code_map target scan failed: ${message}` }],\n };\n }\n\n if (paths.length === 0) {\n return {\n isError: false,\n details: \"(no symbols found) targets matched no supported files or symbols\",\n content: [\n {\n type: \"text\",\n text: \"(no symbols found) targets matched no supported files or symbols\",\n },\n ],\n };\n }\n\n for (const path of paths) {\n if (signal?.aborted) {\n return {\n isError: true,\n details: \"code_map aborted\",\n content: [{ type: \"text\", text: \"code_map aborted\" }],\n };\n }\n\n try {\n const symbols = collapseGroupedSymbols(await collectSymbols(ctx.cwd, path, kinds));\n result.symbols.push(...symbols);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.failed.push(`${path}: ${message}`);\n }\n }\n\n const outputLines: string[] = [];\n let outputPath = \"\";\n\n for (const symbol of result.symbols) {\n if (symbol.path !== outputPath) {\n outputPath = symbol.path;\n outputLines.push(symbol.path);\n }\n\n let line = ` [${symbol.public ? \"public \" : \"\"}${symbol.kind}] ${symbol.name}`;\n if (symbol.range) {\n line += ` L${symbol.range[0]}-L${symbol.range[1]}`;\n }\n outputLines.push(line);\n }\n\n if (result.failed.length > 0) {\n outputLines.push(...result.failed.map((failure) => `failed ${failure}`));\n }\n if (outputLines.length === 0) {\n outputLines.push(\"(no symbols found) targets matched no supported files or symbols\");\n }\n\n const truncation = truncateHead(outputLines.join(\"\\n\"));\n const output = truncation.truncated\n ? `${truncation.content}\\n\\n[Output truncated at 2000 lines or 50KB. Narrow targets or kinds.]`\n : truncation.content;\n return { isError: false, details: output, content: [{ type: \"text\", text: output }] };\n },\n renderCall(args, theme, { isPartial }) {\n const targets = Array.isArray(args.targets) ? args.targets.join(\", \") : \"\";\n const kinds = Array.isArray(args.kinds) ? args.kinds.join(\", \") : \"default\";\n\n return renderCallText(\n `${theme.fg(\"toolTitle\", \"code_map\")} ${theme.underline(theme.fg(\"accent\", targets))} ${theme.fg(\"dim\", `[${kinds}]`)}`,\n isPartial,\n );\n },\n});\n\nexport default codeMap;\n", "import picomatch from \"picomatch\";\nimport { runCommand, unique } from \"../../utils.js\";\n\nconst SKIPPED_DIRECTORIES = new Set([\".git\", \".pi\", \"build\", \"coverage\", \"dist\", \"node_modules\"]);\n\nfunction normalizePath(pathValue: string) {\n const normalizedPath = pathValue.replaceAll(\"\\\\\", \"/\");\n return normalizedPath.startsWith(\"./\") ? normalizedPath.slice(2) : normalizedPath;\n}\n\nasync function rgFiles(\n projectPath: string,\n globTargets: string[],\n signal?: AbortSignal,\n) {\n const args = [\"--files\", \"--hidden\"];\n\n for (const skipped of SKIPPED_DIRECTORIES) {\n args.push(\"--glob\", `!**/${skipped}/**`);\n }\n for (const globTarget of globTargets) {\n args.push(\"--glob\", globTarget);\n }\n\n args.push(\".\");\n const commandResult = await runCommand(projectPath, \"rg\", args, {\n signal,\n successExitCodes: [0, 1],\n abortMessage: \"mapper aborted\",\n });\n return commandResult.stdout\n .split(\"\\n\")\n .map((line) => normalizePath(line.trim()))\n .filter((line) => line.length > 0);\n}\n\nasync function grepFiles(\n projectPath: string,\n globTargets: string[],\n signal?: AbortSignal,\n) {\n const args = [\"-r\", \"-I\", \"-l\"];\n\n for (const skipped of SKIPPED_DIRECTORIES) {\n args.push(\"--exclude-dir\", skipped);\n }\n\n args.push(\"-e\", \"\", \".\");\n const commandResult = await runCommand(projectPath, \"grep\", args, {\n signal,\n successExitCodes: [0, 1],\n abortMessage: \"mapper aborted\",\n });\n const paths = commandResult.stdout\n .split(\"\\n\")\n .map((line) => normalizePath(line.trim()))\n .filter((line) => line.length > 0);\n const matchers = globTargets.map((globTarget) => picomatch(globTarget, { dot: true }));\n return paths.filter((pathValue) => matchers.some((matcher) => matcher(pathValue)));\n}\n\nexport async function resolveTargetPaths(\n projectPath: string,\n targets: string[],\n signal?: AbortSignal,\n) {\n const globTargets = targets.flatMap((target) => {\n const normalized = normalizePath(target);\n if (normalized.length === 0) return [];\n if (normalized === \".\") return [\"**\"];\n if (/[*?[\\]{}]/.test(normalized)) return [normalized];\n return [normalized, `${normalized}/**`];\n });\n\n if (globTargets.length === 0) return [];\n\n try {\n const paths = await rgFiles(projectPath, globTargets, signal);\n return unique(paths).sort();\n } catch (rgError) {\n const rgMessage = rgError instanceof Error ? rgError.message : String(rgError);\n if (rgMessage === \"mapper aborted\") {\n throw rgError;\n }\n\n try {\n const paths = await grepFiles(projectPath, globTargets, signal);\n return unique(paths).sort();\n } catch (grepError) {\n const grepMessage = grepError instanceof Error ? grepError.message : String(grepError);\n throw new Error(`mapper file scan failed: rg=${rgMessage}; grep=${grepMessage}`);\n }\n }\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { LANGUAGE_REGISTRY } from \"./index.js\";\nimport type { GrammarInstallSettings } from \"./types.js\";\nimport { getPiPath, isMissingFileError, readJson, runCommand, writeJson } from \"../../utils.js\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\n\nconst GRAMMAR_COVERAGE_TARGET = 0.9;\nconst GRAMMAR_INSTALL_KEY = \"grammarInstall\";\n\nasync function ensureGrammarCachePackage() {\n const grammarCacheDir = getPiPath(\"grammars\");\n const jsonPath = resolve(grammarCacheDir, \"package.json\");\n\n try {\n await readFile(jsonPath, \"utf8\");\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n await writeJson(jsonPath, {\n name: \"tree-sitter-grammars\",\n private: true,\n dependencies: {},\n });\n }\n}\n\nasync function getRepositoryRoot(cwd: string) {\n try {\n const { stdout } = await runCommand(cwd, \"git\", [\"rev-parse\", \"--show-toplevel\"]);\n const repoRoot = stdout.trim();\n return repoRoot.length > 0 ? repoRoot : undefined;\n } catch {}\n}\n\nasync function selectSupportedBuckets(cwd: string) {\n const bucketCounts = new Map<string, number>();\n let totalFileCount = 0;\n\n const { stdout } = await runCommand(cwd, \"bash\", [\n \"-lc\",\n \"git ls-files | sed 's/.*\\\\.//' | sort | uniq -c | sort -rn\",\n ]);\n\n for (const line of stdout.split(/\\r?\\n/)) {\n const lineMatch = line.trim().match(/^(\\d+)\\s+(.+)$/);\n if (!lineMatch) continue;\n\n const rawCount = lineMatch[1];\n const rawExtension = lineMatch[2];\n if (!rawCount || !rawExtension) continue;\n\n const count = Number.parseInt(rawCount, 10);\n const extension = `.${rawExtension.toLowerCase()}`;\n if (!Number.isFinite(count) || count <= 0) continue;\n\n totalFileCount += count;\n for (const languageEntry of LANGUAGE_REGISTRY) {\n if (!languageEntry.profile.extensions.has(extension)) continue;\n const nextCount = bucketCounts.get(languageEntry.bucketName) ?? 0;\n bucketCounts.set(languageEntry.bucketName, nextCount + count);\n break;\n }\n }\n\n if (totalFileCount === 0) return [];\n const rankedBuckets = LANGUAGE_REGISTRY.map((languageEntry) => ({\n count: bucketCounts.get(languageEntry.bucketName) ?? 0,\n packageName: languageEntry.packageName,\n version: languageEntry.version,\n }))\n .filter((bucket) => bucket.count > 0)\n .sort((leftBucket, rightBucket) => rightBucket.count - leftBucket.count);\n\n let coveredCount = 0;\n const pickedBuckets: Array<{ packageName: string; version: string }> = [];\n for (const bucket of rankedBuckets) {\n if (coveredCount / totalFileCount >= GRAMMAR_COVERAGE_TARGET) break;\n coveredCount += bucket.count;\n pickedBuckets.push({\n packageName: bucket.packageName,\n version: bucket.version,\n });\n }\n\n return pickedBuckets;\n}\n\nfunction getMissingGrammarPackages(pickedBuckets: Array<{ packageName: string; version: string }>) {\n const grammarCacheDir = getPiPath(\"grammars\");\n\n return pickedBuckets\n .filter((bucket) => {\n const packagePath = resolve(\n grammarCacheDir,\n \"node_modules\",\n bucket.packageName,\n \"package.json\",\n );\n return !existsSync(packagePath);\n })\n .map((bucket) => `${bucket.packageName}@${bucket.version}`);\n}\n\nfunction readGrammarInstallSettings(settings: Record<string, unknown>) {\n const rawSettings = settings[GRAMMAR_INSTALL_KEY];\n if (!rawSettings || typeof rawSettings !== \"object\") return {};\n\n const settingsMap = rawSettings as Record<string, unknown>;\n const allowed = Array.isArray(settingsMap.allowedRepos)\n ? settingsMap.allowedRepos.filter((repo) => typeof repo === \"string\")\n : undefined;\n const denied = Array.isArray(settingsMap.deniedRepos)\n ? settingsMap.deniedRepos.filter((repo) => typeof repo === \"string\")\n : undefined;\n\n return { allowedRepos: allowed, deniedRepos: denied } satisfies GrammarInstallSettings;\n}\n\nasync function updateGrammarInstallSettings(\n settings: Record<string, unknown>,\n installSettings: GrammarInstallSettings,\n) {\n settings[GRAMMAR_INSTALL_KEY] = installSettings;\n await writeJson(getPiPath(\"settings\"), settings);\n}\n\nexport async function ensureGrammarCache(ctx: ExtensionContext) {\n await ensureGrammarCachePackage();\n\n const repoRoot = await getRepositoryRoot(ctx.cwd);\n if (!repoRoot) return;\n\n const settings = await readJson<Record<string, unknown>>(getPiPath(\"settings\"), {});\n const installSettings = readGrammarInstallSettings(settings);\n const allowed = new Set(installSettings.allowedRepos ?? []);\n const denied = new Set(installSettings.deniedRepos ?? []);\n if (denied.has(repoRoot)) return;\n\n const pickedBuckets = await selectSupportedBuckets(ctx.cwd);\n if (pickedBuckets.length === 0) return;\n\n const missingPkgs = getMissingGrammarPackages(pickedBuckets);\n if (missingPkgs.length === 0) return;\n\n let canInstall = allowed.has(repoRoot);\n if (!canInstall) {\n if (!ctx.hasUI) return;\n\n canInstall = await ctx.ui.confirm(\n \"Install tree-sitter grammars for this repo?\",\n \"surgent installs missing parser grammars for optimized code read, input tokens and context optimizations.\",\n );\n\n if (!canInstall) {\n denied.add(repoRoot);\n await updateGrammarInstallSettings(settings, {\n allowedRepos: [...allowed],\n deniedRepos: [...denied],\n });\n return;\n }\n\n allowed.add(repoRoot);\n await updateGrammarInstallSettings(settings, {\n allowedRepos: [...allowed],\n deniedRepos: [...denied],\n });\n }\n\n await runCommand(getPiPath(\"grammars\"), \"npm\", [\"install\", \"--save-exact\", ...missingPkgs]);\n}\n\nexport async function loadGrammarModule(pkgName: string) {\n const grammarCacheDir = getPiPath(\"grammars\");\n const cacheRequire = createRequire(resolve(grammarCacheDir, \"package.json\"));\n\n let entryPath = \"\";\n try {\n entryPath = cacheRequire.resolve(pkgName);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `grammar package not installed in cache (${grammarCacheDir}): ${pkgName}. ${message}`,\n );\n }\n\n try {\n return await import(pathToFileURL(entryPath).href);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `failed loading grammar module from cache (${grammarCacheDir}): ${pkgName}. ${message}`,\n );\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\n\nexport type SymbolKind = \"func\" | \"class\" | \"method\" | \"decl\" | \"deps\" | \"public\";\n\nexport interface SymbolKindRule {\n kind: SymbolKind;\n parent?: string;\n container?: string;\n topLevelOnly?: boolean;\n}\n\nexport interface LanguageSymbol {\n name: string;\n path: string;\n kind: SymbolKind;\n node: SyntaxNode;\n range?: [number, number];\n public?: boolean;\n}\n\nexport interface LanguageProfile {\n extensions: Set<string>;\n loadLanguage(extension: string): Promise<Language>;\n readNodeName(node: SyntaxNode): string | undefined;\n readContainerName(node: SyntaxNode): string | undefined;\n isPublicSymbol(node: SyntaxNode): boolean;\n resolveSymbolKind(node: SyntaxNode): SymbolKind | undefined;\n shouldSkipSymbol(node: SyntaxNode): boolean;\n}\n\nexport interface SupportedLanguageBucket {\n bucketName: string;\n packageName: string;\n version: string;\n extensions: Set<string>;\n}\n\nexport interface GrammarInstallSettings {\n allowedRepos?: string[];\n deniedRepos?: string[];\n}\n\nexport abstract class RuleBasedLanguageProfile implements LanguageProfile {\n constructor(\n readonly extensions: Set<string>,\n protected readonly nameFieldByType: { __default__: string } & Record<string, string>,\n protected readonly topLevelRoots: Set<string>,\n protected readonly topLevelParents: Set<string>,\n protected readonly typeRule: Map<string, SymbolKindRule[]>,\n ) {}\n\n abstract loadLanguage(extension: string): Promise<Language>;\n\n abstract readNodeName(node: SyntaxNode): string | undefined;\n\n protected findContainerNode(node: SyntaxNode) {\n let current = node.parent;\n while (current) {\n if (this.typeRule.has(current.type)) {\n return current;\n }\n current = current.parent;\n }\n }\n\n protected matchesTopLevelRule(node: SyntaxNode) {\n let current = node.parent;\n\n while (current) {\n if (this.topLevelRoots.has(current.type)) {\n return true;\n }\n if (this.topLevelParents.size > 0 && !this.topLevelParents.has(current.type)) {\n return false;\n }\n current = current.parent;\n }\n\n return false;\n }\n\n protected readFieldText(node: SyntaxNode, fieldName: string) {\n return this.readNodeText(node.childForFieldName(fieldName));\n }\n\n protected readNameField(node: SyntaxNode) {\n const fieldName = this.nameFieldByType[node.type] ?? this.nameFieldByType.__default__;\n return this.readFieldText(node, fieldName);\n }\n\n protected readNodeText(node: SyntaxNode | null | undefined) {\n if (!node) return;\n\n const nodeText = node.text.trim().replaceAll(\"\\n\", \" \");\n return nodeText.length > 0 ? nodeText : undefined;\n }\n\n readContainerName(node: SyntaxNode) {\n const containerNode = this.findContainerNode(node);\n return containerNode ? this.readNodeName(containerNode) : undefined;\n }\n\n isPublicSymbol(node: SyntaxNode) {\n return this.findContainerNode(node)?.type === \"export_statement\";\n }\n\n resolveSymbolKind(node: SyntaxNode) {\n const symbolKindRules = this.typeRule.get(node.type);\n if (!symbolKindRules) return;\n\n for (const symbolKindRule of symbolKindRules) {\n if (symbolKindRule.parent && node.parent?.type !== symbolKindRule.parent) {\n continue;\n }\n\n if (symbolKindRule.container) {\n const containerNode = this.findContainerNode(node);\n if (!containerNode || containerNode.type !== symbolKindRule.container) {\n continue;\n }\n }\n\n if (symbolKindRule.topLevelOnly && !this.matchesTopLevelRule(node)) {\n continue;\n }\n\n return symbolKindRule.kind;\n }\n }\n\n shouldSkipSymbol(_node: SyntaxNode) {\n return false;\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\nimport { loadGrammarModule } from \"./grammar.js\";\nimport { RuleBasedLanguageProfile, type SymbolKindRule } from \"./types.js\";\n\nexport class TypeScriptLanguageProfile extends RuleBasedLanguageProfile {\n constructor() {\n super(\n new Set([\".ts\", \".tsx\", \".js\", \".mjs\", \".cjs\", \".jsx\"]),\n { __default__: \"name\" },\n new Set([\"program\"]),\n new Set([\n \"lexical_declaration\",\n \"variable_declaration\",\n \"variable_declarator\",\n \"export_statement\",\n ]),\n new Map<string, SymbolKindRule[]>([\n [\"function_declaration\", [{ kind: \"func\", topLevelOnly: true }]],\n [\"arrow_function\", [{ kind: \"func\", topLevelOnly: true }]],\n [\"function_expression\", [{ kind: \"func\", topLevelOnly: true }]],\n [\"abstract_class_declaration\", [{ kind: \"class\" }]],\n [\"class_declaration\", [{ kind: \"class\" }]],\n [\"abstract_method_signature\", [{ kind: \"method\", parent: \"class_body\" }]],\n [\n \"method_definition\",\n [\n { kind: \"method\", parent: \"class_body\" },\n { kind: \"method\", parent: \"object\" },\n ],\n ],\n [\"variable_declarator\", [{ kind: \"decl\", topLevelOnly: true }]],\n [\"import_specifier\", [{ kind: \"deps\" }]],\n [\"namespace_import\", [{ kind: \"deps\" }]],\n [\"identifier\", [{ kind: \"deps\", parent: \"import_clause\" }]],\n [\"export_statement\", [{ kind: \"public\", topLevelOnly: true }]],\n ]),\n );\n }\n\n async loadLanguage(extension: string) {\n const languagePack = await loadGrammarModule(\"tree-sitter-typescript\");\n const languageExports =\n typeof languagePack.default === \"object\" && languagePack.default !== null\n ? languagePack.default\n : languagePack;\n\n const typeScriptLanguage = languageExports.typescript as Language | undefined;\n if (!typeScriptLanguage) {\n throw new Error(\"tree-sitter-typescript missing typescript export\");\n }\n\n if (extension === \".tsx\" || extension === \".jsx\") {\n return (languageExports.tsx as Language | undefined) ?? typeScriptLanguage;\n }\n return typeScriptLanguage;\n }\n\n readNodeName(node: SyntaxNode) {\n if (node.type === \"export_statement\") {\n return \"exports\";\n }\n\n if (node.type === \"import_specifier\") {\n const aliasText = this.readFieldText(node, \"alias\");\n if (aliasText) {\n return aliasText;\n }\n }\n\n const nodeName = this.readNameField(node);\n if (nodeName) {\n return nodeName;\n }\n\n if (node.type === \"namespace_import\") {\n return this.readNodeText(node.namedChild(0));\n }\n\n if (node.type === \"identifier\") {\n return this.readNodeText(node);\n }\n\n if (\n node.type === \"arrow_function\" ||\n node.type === \"function_expression\" ||\n node.type === \"function_declaration\"\n ) {\n const declaratorNode = node.parent?.type === \"variable_declarator\" ? node.parent : undefined;\n if (declaratorNode) {\n const declaratorName = this.readFieldText(declaratorNode, \"name\");\n if (declaratorName) {\n return declaratorName;\n }\n }\n\n return \"anonymous\";\n }\n }\n\n shouldSkipSymbol(node: SyntaxNode) {\n if (node.type === \"export_statement\") {\n const inlineNode = node.namedChild(0);\n return (\n node.childForFieldName(\"declaration\") !== null ||\n inlineNode?.type === \"arrow_function\" ||\n inlineNode?.type === \"function_expression\" ||\n inlineNode?.type === \"function_declaration\" ||\n (inlineNode?.type === \"class_declaration\" && inlineNode.childForFieldName(\"name\") !== null)\n );\n }\n if (node.type === \"variable_declarator\") {\n return node.childForFieldName(\"value\")?.type === \"arrow_function\";\n }\n return node.type === \"function_expression\" && node.childForFieldName(\"name\") !== null;\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\nimport { loadGrammarModule } from \"./grammar.js\";\nimport { RuleBasedLanguageProfile, type SymbolKindRule } from \"./types.js\";\n\nexport class PythonLanguageProfile extends RuleBasedLanguageProfile {\n constructor() {\n super(\n new Set([\".py\"]),\n {\n __default__: \"name\",\n assignment: \"left\",\n future_import_statement: \"name\",\n import_from_statement: \"name\",\n import_statement: \"name\",\n },\n new Set([\"module\"]),\n new Set([\"decorated_definition\", \"expression_statement\"]),\n new Map<string, SymbolKindRule[]>([\n [\"class_definition\", [{ kind: \"class\" }]],\n [\n \"function_definition\",\n [\n { kind: \"method\", container: \"class_definition\" },\n { kind: \"func\", topLevelOnly: true },\n ],\n ],\n [\"assignment\", [{ kind: \"decl\", topLevelOnly: true }]],\n [\"future_import_statement\", [{ kind: \"deps\", topLevelOnly: true }]],\n [\"import_from_statement\", [{ kind: \"deps\", topLevelOnly: true }]],\n [\"import_statement\", [{ kind: \"deps\", topLevelOnly: true }]],\n ]),\n );\n }\n\n async loadLanguage(_extension: string) {\n const languagePack = await loadGrammarModule(\"tree-sitter-python\");\n const languageExport = (languagePack.default ?? languagePack) as Language;\n return languageExport;\n }\n\n resolveSymbolKind(node: SyntaxNode) {\n if (\n node.type === \"assignment\" &&\n this.matchesTopLevelRule(node) &&\n this.readFieldText(node, \"left\") === \"__all__\"\n ) {\n return \"public\";\n }\n\n return super.resolveSymbolKind(node);\n }\n\n readNodeName(node: SyntaxNode) {\n const nodeName = this.readNameField(node);\n if (nodeName) {\n return nodeName;\n }\n\n if (node.type === \"dotted_name\" || node.type === \"identifier\") {\n return this.readNodeText(node);\n }\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\nimport { loadGrammarModule } from \"./grammar.js\";\nimport { RuleBasedLanguageProfile, type SymbolKindRule } from \"./types.js\";\n\nexport class GoLanguageProfile extends RuleBasedLanguageProfile {\n constructor() {\n super(\n new Set([\".go\"]),\n { __default__: \"name\" },\n new Set([\"source_file\"]),\n new Set([\n \"const_declaration\",\n \"import_declaration\",\n \"import_spec_list\",\n \"type_declaration\",\n \"var_declaration\",\n \"var_spec_list\",\n ]),\n new Map<string, SymbolKindRule[]>([\n [\"function_declaration\", [{ kind: \"func\", topLevelOnly: true }]],\n [\"method_declaration\", [{ kind: \"method\" }]],\n [\"method_elem\", [{ kind: \"method\", parent: \"interface_type\", container: \"type_spec\" }]],\n [\"const_spec\", [{ kind: \"decl\", topLevelOnly: true }]],\n [\"import_spec\", [{ kind: \"deps\", topLevelOnly: true }]],\n [\"type_alias\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"type_spec\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"var_spec\", [{ kind: \"decl\", topLevelOnly: true }]],\n ]),\n );\n }\n\n async loadLanguage(_extension: string) {\n const languagePack = await loadGrammarModule(\"tree-sitter-go\");\n const languageExport = (languagePack.default ?? languagePack) as Language;\n return languageExport;\n }\n\n readNodeName(node: SyntaxNode) {\n if (node.type === \"import_spec\") {\n const importName = this.readFieldText(node, \"name\");\n if (importName) {\n return importName;\n }\n\n const importPath = this.readFieldText(node, \"path\");\n if (importPath) {\n return importPath.replace(/^(\"|')(.*)\\1$/, \"$2\");\n }\n }\n\n const nodeName = this.readNameField(node);\n if (nodeName) {\n return nodeName;\n }\n\n if (\n node.type === \"field_identifier\" ||\n node.type === \"identifier\" ||\n node.type === \"package_identifier\" ||\n node.type === \"type_identifier\"\n ) {\n return this.readNodeText(node);\n }\n }\n\n readContainerName(node: SyntaxNode) {\n if (node.type === \"method_declaration\") {\n const receiverNode = node.childForFieldName(\"receiver\");\n const receiverParameterNode = receiverNode?.namedChild(0);\n const receiverTypeNode = receiverParameterNode?.childForFieldName(\"type\");\n const receiverType = this.readNodeText(receiverTypeNode);\n if (receiverType) {\n return receiverType.replace(/^\\*+/, \"\");\n }\n }\n\n return super.readContainerName(node);\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\nimport { loadGrammarModule } from \"./grammar.js\";\nimport { RuleBasedLanguageProfile, type SymbolKindRule } from \"./types.js\";\n\nexport class JavaLanguageProfile extends RuleBasedLanguageProfile {\n constructor() {\n super(\n new Set([\".java\"]),\n { __default__: \"name\", exports_module_directive: \"package\" },\n new Set([\"program\"]),\n new Set<string>(),\n new Map<string, SymbolKindRule[]>([\n [\"annotation_type_declaration\", [{ kind: \"class\" }]],\n [\"class_declaration\", [{ kind: \"class\" }]],\n [\"enum_declaration\", [{ kind: \"class\" }]],\n [\"interface_declaration\", [{ kind: \"class\" }]],\n [\"record_declaration\", [{ kind: \"class\" }]],\n [\n \"constructor_declaration\",\n [\n { kind: \"method\", parent: \"class_body\" },\n { kind: \"method\", parent: \"enum_body_declarations\" },\n ],\n ],\n [\n \"method_declaration\",\n [\n { kind: \"method\", parent: \"class_body\" },\n { kind: \"method\", parent: \"enum_body_declarations\" },\n { kind: \"method\", parent: \"interface_body\" },\n ],\n ],\n [\"import_declaration\", [{ kind: \"deps\" }]],\n [\"exports_module_directive\", [{ kind: \"public\", parent: \"module_body\" }]],\n ]),\n );\n }\n\n async loadLanguage(_extension: string) {\n const languagePack = await loadGrammarModule(\"tree-sitter-java\");\n const languageExport = (languagePack.default ?? languagePack) as Language;\n return languageExport;\n }\n\n readNodeName(node: SyntaxNode) {\n const nodeName = this.readNameField(node);\n if (nodeName) {\n return nodeName;\n }\n\n if (node.type === \"import_declaration\") {\n const importText = node.text\n .replace(/^import\\s+/, \"\")\n .replace(/\\s*;\\s*$/, \"\")\n .trim()\n .replaceAll(\"\\n\", \" \");\n return importText.length > 0 ? importText : undefined;\n }\n\n if (node.type === \"identifier\" || node.type === \"scoped_identifier\") {\n return this.readNodeText(node);\n }\n }\n}\n", "import type { Language, SyntaxNode } from \"tree-sitter\";\nimport { loadGrammarModule } from \"./grammar.js\";\nimport { RuleBasedLanguageProfile, type SymbolKindRule } from \"./types.js\";\n\nexport class RustLanguageProfile extends RuleBasedLanguageProfile {\n constructor() {\n super(\n new Set([\".rs\"]),\n { __default__: \"name\", use_declaration: \"argument\" },\n new Set([\"source_file\"]),\n new Set([\"declaration_list\", \"foreign_mod_item\", \"mod_item\"]),\n new Map<string, SymbolKindRule[]>([\n [\n \"function_item\",\n [\n { kind: \"method\", container: \"impl_item\" },\n { kind: \"method\", container: \"trait_item\" },\n { kind: \"func\", topLevelOnly: true },\n ],\n ],\n [\n \"function_signature_item\",\n [\n { kind: \"method\", container: \"trait_item\" },\n { kind: \"func\", topLevelOnly: true },\n ],\n ],\n [\"struct_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"enum_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"union_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"trait_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"type_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"mod_item\", [{ kind: \"class\", topLevelOnly: true }]],\n [\"impl_item\", [{ kind: \"class\" }]],\n [\"macro_definition\", [{ kind: \"func\", topLevelOnly: true }]],\n [\"const_item\", [{ kind: \"decl\", topLevelOnly: true }]],\n [\"static_item\", [{ kind: \"decl\", topLevelOnly: true }]],\n [\"use_declaration\", [{ kind: \"deps\", topLevelOnly: true }]],\n ]),\n );\n }\n\n async loadLanguage(_extension: string) {\n const languagePack = await loadGrammarModule(\"tree-sitter-rust\");\n const languageExport = (languagePack.default ?? languagePack) as Language;\n return languageExport;\n }\n\n readNodeName(node: SyntaxNode) {\n if (node.type === \"impl_item\") {\n return this.readFieldText(node, \"type\");\n }\n\n const nodeName = this.readNameField(node);\n if (nodeName) {\n return nodeName;\n }\n\n if (node.type === \"identifier\" || node.type === \"type_identifier\") {\n return this.readNodeText(node);\n }\n }\n\n isPublicSymbol(node: SyntaxNode) {\n return node.namedChildren.some((childNode) => childNode.type === \"visibility_modifier\");\n }\n\n shouldSkipSymbol(node: SyntaxNode) {\n return node.type === \"impl_item\";\n }\n}\n", "import { readFile } from \"node:fs/promises\";\nimport type { SyntaxNode } from \"tree-sitter\";\nimport { getLanguageProfile } from \"./index.js\";\nimport type { LanguageSymbol, SymbolKind } from \"./types.js\";\nimport { extname, resolve } from \"node:path\";\nimport Parser from \"tree-sitter\";\n\nasync function createCodeParser(extension: string) {\n const languageProfile = getLanguageProfile(extension);\n if (!languageProfile) {\n throw new Error(`missing grammar for extension: ${extension}`);\n }\n const parser = new Parser();\n parser.setLanguage(await languageProfile.loadLanguage(extension));\n return parser;\n}\n\nasync function getParserForPath(path: string, parsers: Map<string, Parser>) {\n const extension = extname(path).toLowerCase();\n const parser = parsers.get(extension);\n if (parser) return parser;\n\n const createdParser = await createCodeParser(extension);\n parsers.set(extension, createdParser);\n return createdParser;\n}\n\nasync function getRootNode(cwd: string, path: string) {\n const parsers = new Map<string, Parser>();\n const absolutePath = resolve(cwd, path);\n\n let code = \"\";\n try {\n code = await readFile(absolutePath, \"utf8\");\n } catch {\n return;\n }\n\n const parser = await getParserForPath(path, parsers);\n const tree = parser.parse(code);\n return tree.rootNode;\n}\n\nexport async function collectSymbols(cwd: string, path: string, kinds: Set<SymbolKind>) {\n const extension = extname(path).toLowerCase();\n const profile = getLanguageProfile(extension);\n if (!profile) return [];\n\n const root = await getRootNode(cwd, path);\n if (!root) return [];\n\n const symbols: LanguageSymbol[] = [];\n const pendingNodes: SyntaxNode[] = [root];\n const symbolIdCounts = new Map<string, number>();\n\n while (pendingNodes.length > 0) {\n const currentNode = pendingNodes.pop();\n if (!currentNode) continue;\n\n for (let childIndex = currentNode.namedChildCount - 1; childIndex >= 0; childIndex -= 1) {\n const namedChild = currentNode.namedChild(childIndex);\n if (namedChild) {\n pendingNodes.push(namedChild);\n }\n }\n\n const symbolKind = profile.resolveSymbolKind(currentNode);\n if (!symbolKind || !kinds.has(symbolKind) || profile.shouldSkipSymbol(currentNode)) {\n continue;\n }\n\n const baseName = profile.readNodeName(currentNode);\n if (!baseName) continue;\n\n const containerName = profile.readContainerName(currentNode);\n const symbolName =\n symbolKind === \"method\" && containerName ? `${containerName}.${baseName}` : baseName;\n\n const symbolIdCount = (symbolIdCounts.get(symbolName) ?? 0) + 1;\n symbolIdCounts.set(symbolName, symbolIdCount);\n const isAnonymous = symbolName === \"anonymous\" && !currentNode.childForFieldName(\"name\");\n\n symbols.push({\n name:\n isAnonymous || symbolIdCount > 1 ? `${symbolName}~${symbolIdCount}` : symbolName,\n path,\n kind: symbolKind,\n node: currentNode,\n range: [currentNode.startPosition.row + 1, currentNode.endPosition.row + 1],\n public: profile.isPublicSymbol(currentNode),\n });\n }\n\n return symbols;\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { ensureGrammarCache } from \"./grammar.js\";\nimport type { LanguageProfile } from \"./types.js\";\nimport { TypeScriptLanguageProfile } from \"./typescript.js\";\nimport { PythonLanguageProfile } from \"./python.js\";\nimport { GoLanguageProfile } from \"./go.js\";\nimport { JavaLanguageProfile } from \"./java.js\";\nimport { RustLanguageProfile } from \"./rust.js\";\n\nexport const LANGUAGE_REGISTRY: Array<{\n bucketName: string;\n packageName: string;\n version: string;\n profile: LanguageProfile;\n}> = [\n {\n bucketName: \"typescript\",\n packageName: \"tree-sitter-typescript\",\n version: \"0.23.2\",\n profile: new TypeScriptLanguageProfile(),\n },\n {\n bucketName: \"python\",\n packageName: \"tree-sitter-python\",\n version: \"0.25.0\",\n profile: new PythonLanguageProfile(),\n },\n {\n bucketName: \"go\",\n packageName: \"tree-sitter-go\",\n version: \"0.25.0\",\n profile: new GoLanguageProfile(),\n },\n {\n bucketName: \"java\",\n packageName: \"tree-sitter-java\",\n version: \"0.23.5\",\n profile: new JavaLanguageProfile(),\n },\n {\n bucketName: \"rust\",\n packageName: \"tree-sitter-rust\",\n version: \"0.24.0\",\n profile: new RustLanguageProfile(),\n },\n];\n\nexport function getLanguageProfile(extension: string) {\n return LANGUAGE_REGISTRY.find(({ profile }) => profile.extensions.has(extension))?.profile;\n}\n\nexport function getSupportedExtensions() {\n const supported = new Set<string>();\n LANGUAGE_REGISTRY.forEach(({ profile }) => {\n profile.extensions.forEach((extension) => supported.add(extension));\n });\n return supported;\n}\n\nexport default function (pi: ExtensionAPI) {\n pi.on(\"session_start\", async (_event, ctx) => {\n try {\n await ensureGrammarCache(ctx);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (ctx.hasUI) {\n ctx.ui.notify(`tree-sitter grammar install failed: ${message}`, \"error\");\n }\n }\n });\n}\n\nexport { collectSymbols } from \"./symbols.js\";\nexport type { LanguageProfile, LanguageSymbol } from \"./types.js\";\nexport const SYMBOL_KINDS = [\"func\", \"class\", \"method\", \"decl\", \"deps\", \"public\"] as const;\n", "import { defineTool } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { inspectSymbol } from \"./inspect.js\";\nimport type { InspectToolDetails } from \"./types.js\";\n\nconst inspect = defineTool({\n name: \"inspect\",\n label: \"Inspect\",\n description: \"Fetch one symbol's full body from one file. Output is safe for targeted edits.\",\n parameters: Type.Object({\n path: Type.String({\n description: \"Exact file path containing target symbol (relative to cwd or absolute)\",\n }),\n symbol: Type.String({\n description:\n \"Exact symbol string for one declaration in file: function name, class name, method name (MyClass.method), synthetic anonymous name (anonymous~1), or duplicate form name~2\",\n }),\n }),\n async execute(_toolCallId, params, signal, _onUpdate, ctx) {\n const path = params.path.trim().replaceAll(\"\\\\\", \"/\");\n const symbol = params.symbol.trim();\n\n if (path.length === 0 || symbol.length === 0 || symbol.includes(\"#\")) {\n return {\n isError: false,\n details: null,\n content: [\n {\n type: \"text\",\n text: \"inspect symbol format invalid. path/symbol must be non-empty; symbol cannot include '#'. use symbol name, e.g. name or name~2\",\n },\n ],\n };\n }\n\n try {\n const inspected = await inspectSymbol(ctx.cwd, path, symbol, signal);\n if (!inspected) {\n return {\n isError: false,\n details: null,\n content: [\n {\n type: \"text\",\n text: \"inspect symbol not found. verify path/symbol; for duplicates use ~n suffix (name~2). then try container symbol. if still missing, run code_map with broader kinds\",\n },\n ],\n };\n }\n\n const details = {\n path: inspected.path,\n symbol: inspected.symbol,\n range: inspected.range,\n } satisfies InspectToolDetails;\n\n return { isError: false, details, content: [{ type: \"text\", text: inspected.text }] };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n isError: true,\n details: null,\n content: [{ type: \"text\", text: `inspect failed: ${message}` }],\n };\n }\n },\n renderCall(args, theme) {\n return new Text(\n `${theme.fg(\"toolTitle\", \"inspect\")} ${theme.underline(theme.fg(\"accent\", args.path))} ${theme.fg(\"warning\", args.symbol)}`,\n 0,\n 0,\n );\n },\n renderResult(result, { expanded }, theme, context) {\n if (!expanded && !context.isError) {\n return new Text(\"\", 0, 0);\n }\n\n const output = result.content[0];\n return new Text(\n `\\n${output?.type === \"text\" ? theme.fg(\"toolOutput\", output.text) : \"\"}`,\n 0,\n 0,\n );\n },\n});\n\nexport default inspect;\n", "import type { SyntaxNode } from \"tree-sitter\";\nimport type { LanguageSymbol } from \"../languages/index.js\";\nimport { collectSymbols, SYMBOL_KINDS } from \"../languages/index.js\";\nimport type { Range } from \"./types.js\";\n\nfunction inspectGroupedSymbols(\n path: string,\n symbolName: string,\n symbols: LanguageSymbol[],\n): { path: string; symbol: string; range: Range; text: string } | undefined {\n const groupedSymbolsMatch = /^(imports|exports)~([1-9]\\d*)$/.exec(symbolName);\n if (!groupedSymbolsMatch) return;\n\n const groupedSymbolKind = groupedSymbolsMatch[1] === \"imports\" ? \"deps\" : \"public\";\n const requestedGroup = Number(groupedSymbolsMatch[2]);\n const groupedNodes: SyntaxNode[] = [];\n const groupedRanges = new Set<string>();\n let symbolsCollapsed = false;\n let symbolsGroupIndex = 0;\n\n for (const symbol of symbols) {\n if (symbol.kind !== groupedSymbolKind) {\n symbolsCollapsed = false;\n continue;\n }\n if (!symbolsCollapsed) {\n symbolsCollapsed = true;\n symbolsGroupIndex += 1;\n }\n if (symbolsGroupIndex !== requestedGroup) continue;\n\n let groupedNode = symbol.node;\n if (groupedSymbolKind === \"deps\") {\n while (groupedNode.parent?.parent) {\n groupedNode = groupedNode.parent;\n }\n }\n\n const groupedRange = `${groupedNode.startIndex}-${groupedNode.endIndex}`;\n if (groupedRanges.has(groupedRange)) continue;\n\n groupedRanges.add(groupedRange);\n groupedNodes.push(groupedNode);\n }\n\n const firstNode = groupedNodes[0];\n const lastNode = groupedNodes[groupedNodes.length - 1];\n if (!firstNode || !lastNode) return;\n return {\n path,\n symbol: symbolName,\n text: groupedNodes.map((groupedNode) => groupedNode.text).join(\"\\n\"),\n range: [\n firstNode.startPosition.row + 1,\n lastNode.endPosition.row + (lastNode.endPosition.column > 0 ? 1 : 0),\n ],\n };\n}\n\nexport async function inspectSymbol(\n cwd: string,\n path: string,\n symbolName: string,\n signal?: AbortSignal,\n): Promise<{ path: string; symbol: string; range: Range; text: string } | undefined> {\n if (signal?.aborted) {\n throw new Error(\"inspector aborted\");\n }\n const kinds = new Set(SYMBOL_KINDS);\n const symbols = await collectSymbols(cwd, path, kinds);\n\n const inspectedGroup = inspectGroupedSymbols(path, symbolName, symbols);\n if (inspectedGroup) return inspectedGroup;\n\n for (const symbol of symbols) {\n if (symbol.name !== symbolName) continue;\n\n return {\n path: symbol.path,\n symbol: symbol.name,\n range: [\n symbol.node.startPosition.row + 1,\n symbol.node.endPosition.row + (symbol.node.endPosition.column > 0 ? 1 : 0),\n ],\n text: symbol.node.text,\n };\n }\n}\n", "import { getEntryId, getMessage, getParentId, getToolResultMessage } from \"../entries.js\";\nimport type { RemovedEntryRemoval } from \"./types.js\";\nimport { isRecord } from \"../../utils.js\";\n\nfunction resolveRemovedId(\n entryId: string | null,\n replacementParents: Map<string, string | null>,\n): string | null {\n const visitedIds = new Set<string>();\n let resolvedId = entryId;\n while (resolvedId && replacementParents.has(resolvedId) && !visitedIds.has(resolvedId)) {\n visitedIds.add(resolvedId);\n resolvedId = replacementParents.get(resolvedId) ?? null;\n }\n return resolvedId;\n}\n\nfunction hasEmptyResult(message: {\n content?: unknown;\n toolName?: unknown;\n}): boolean {\n if (message.toolName !== \"ls\" && message.toolName !== \"find\") {\n return false;\n }\n\n if (!Array.isArray(message.content) || message.content.length !== 1) return false;\n const content = message.content[0];\n if (!isRecord(content) || content.type !== \"text\" || typeof content.text !== \"string\") return false;\n\n return (\n content.text === \"(empty directory)\" ||\n content.text === \"No files found matching pattern\" ||\n content.text === \"No changes found.\" ||\n content.text === \"No changes in selected files.\"\n );\n}\n\nexport function getRemovedToolCallId(message: {\n content?: unknown;\n isError?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n}): string | undefined {\n if (typeof message.toolCallId !== \"string\") return;\n if (message.isError === true) return message.toolName === \"bash\" ? undefined : message.toolCallId;\n return hasEmptyResult(message) ? message.toolCallId : undefined;\n}\n\nexport function removeEntries(entries: Record<string, unknown>[]): RemovedEntryRemoval {\n const removedToolCallIds = new Set<string>();\n const replacementParents = new Map<string, string | null>();\n\n for (const entry of entries) {\n const message = getToolResultMessage(entry);\n const entryId = getEntryId(entry);\n const toolCallId = message ? getRemovedToolCallId(message) : undefined;\n if (!entryId || !toolCallId) continue;\n\n removedToolCallIds.add(toolCallId);\n replacementParents.set(entryId, getParentId(entry));\n }\n\n if (removedToolCallIds.size === 0) {\n return { changed: false, entries, replacementParents };\n }\n\n const retainedEntries: Record<string, unknown>[] = [];\n for (const entry of entries) {\n const entryId = getEntryId(entry);\n if (entryId && replacementParents.has(entryId)) continue;\n\n const message = getMessage(entry);\n if (message?.role !== \"assistant\" || !Array.isArray(message.content)) {\n retainedEntries.push(entry);\n continue;\n }\n\n const retainedContent = message.content.filter(\n (block) =>\n !isRecord(block) ||\n block.type !== \"toolCall\" ||\n typeof block.id !== \"string\" ||\n !removedToolCallIds.has(block.id),\n );\n if (retainedContent.length === message.content.length) {\n retainedEntries.push(entry);\n continue;\n }\n if (entryId && retainedContent.every((block) => isRecord(block) && block.type === \"thinking\")) {\n replacementParents.set(entryId, getParentId(entry));\n continue;\n }\n retainedEntries.push({ ...entry, message: { ...message, content: retainedContent } });\n }\n\n const repairedEntries: Record<string, unknown>[] = [];\n for (const entry of retainedEntries) {\n const updatedEntry = { ...entry };\n let changed = false;\n\n const parentId = getParentId(entry);\n const repairedParentId = resolveRemovedId(parentId, replacementParents);\n if (parentId !== repairedParentId) {\n updatedEntry.parentId = repairedParentId;\n changed = true;\n }\n\n for (const referenceField of [\"fromId\", \"targetId\", \"firstKeptEntryId\"]) {\n const referenceId = entry[referenceField];\n if (typeof referenceId !== \"string\") continue;\n const repairedReferenceId = resolveRemovedId(referenceId, replacementParents);\n if (repairedReferenceId && repairedReferenceId !== referenceId) {\n updatedEntry[referenceField] = repairedReferenceId;\n changed = true;\n }\n }\n repairedEntries.push(changed ? updatedEntry : entry);\n }\n\n return { changed: true, entries: repairedEntries, replacementParents };\n}\n", "import { getToolResultMessage } from \"../entries.js\";\nimport { getRemovedToolCallId } from \"./cleanup.js\";\nimport type { ContextPruneResult } from \"./types.js\";\n\nexport function buildPrunerState(entries: Record<string, unknown>[]): Set<string> {\n const removedToolCallIds = new Set<string>();\n for (const entry of entries) {\n const message = getToolResultMessage(entry);\n const toolCallId = message ? getRemovedToolCallId(message) : undefined;\n if (toolCallId) removedToolCallIds.add(toolCallId);\n }\n return removedToolCallIds;\n}\n\nexport function filterContextMessages(\n messages: ContextPruneResult[\"messages\"],\n state: Set<string>,\n): ContextPruneResult {\n if (state.size === 0) return { changed: false, messages };\n\n const retainedMessages: ContextPruneResult[\"messages\"] = [];\n let changed = false;\n for (const message of messages) {\n if (message.role === \"toolResult\" && state.has(message.toolCallId)) {\n changed = true;\n continue;\n }\n if (message.role !== \"assistant\") {\n retainedMessages.push(message);\n continue;\n }\n\n const retainedContent = message.content.filter(\n (block) => block.type !== \"toolCall\" || !state.has(block.id),\n );\n if (retainedContent.length === message.content.length) {\n retainedMessages.push(message);\n continue;\n }\n changed = true;\n if (retainedContent.some((block) => block.type !== \"thinking\")) {\n retainedMessages.push({ ...message, content: retainedContent });\n }\n }\n return { changed, messages: retainedMessages };\n}\n", "import { getLastEntryId, readSessionEntries, writeSessionEntries } from \"../entries.js\";\nimport { removeEntries } from \"./cleanup.js\";\nimport type { PruneEntriesResult } from \"./types.js\";\n\nfunction pruneEntries(\n entries: Record<string, unknown>[],\n leafId: string | null,\n): PruneEntriesResult {\n const entryRemoval = removeEntries(entries);\n let activeLeafId = leafId;\n while (activeLeafId && entryRemoval.replacementParents.has(activeLeafId)) {\n activeLeafId = entryRemoval.replacementParents.get(activeLeafId) ?? null;\n }\n\n return {\n activeLeafId,\n changed: entryRemoval.changed,\n entries: entryRemoval.entries,\n };\n}\n\nexport function rewritePrunedSessionFile(\n sessionFile: string,\n leafId: string | null,\n fallbackToLastEntry: boolean,\n) {\n const entries = readSessionEntries(sessionFile);\n if (!entries) return;\n\n const effectiveLeafId = leafId ?? (fallbackToLastEntry ? getLastEntryId(entries) : null);\n const pruned = pruneEntries(entries, effectiveLeafId);\n if (!pruned.changed) return;\n writeSessionEntries(sessionFile, pruned.entries);\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { getRemovedToolCallId } from \"./cleanup.js\";\nimport { buildPrunerState, filterContextMessages } from \"./context.js\";\nimport { readSessionEntries } from \"../entries.js\";\nimport { rewritePrunedSessionFile } from \"./session.js\";\n\nfunction loadPrunerState(sessionFile: string | undefined): Set<string> {\n const entries = readSessionEntries(sessionFile);\n return entries ? buildPrunerState(entries) : new Set<string>();\n}\n\nexport default function (pi: ExtensionAPI) {\n let state = new Set<string>();\n\n pi.on(\"session_start\", (_event, ctx) => {\n state = loadPrunerState(ctx.sessionManager.getSessionFile());\n });\n\n pi.on(\"session_tree\", (_event, ctx) => {\n state = loadPrunerState(ctx.sessionManager.getSessionFile());\n });\n\n pi.on(\"agent_end\", (event) => {\n for (const message of event.messages) {\n if (message.role !== \"toolResult\") continue;\n const toolCallId = getRemovedToolCallId(message);\n if (toolCallId) state.add(toolCallId);\n }\n });\n\n pi.on(\"session_shutdown\", (event, ctx) => {\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (sessionFile) {\n rewritePrunedSessionFile(sessionFile, ctx.sessionManager.getLeafId(), false);\n }\n if (event.targetSessionFile && event.targetSessionFile !== sessionFile) {\n rewritePrunedSessionFile(event.targetSessionFile, null, true);\n }\n });\n\n pi.on(\"context\", (event) => {\n const pruned = filterContextMessages(event.messages, state);\n if (pruned.changed) return { messages: pruned.messages };\n });\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport deduplicator from \"./deduplicator/index.js\";\nimport compactor from \"./compactor/index.js\";\nimport codeMap from \"./mapper/index.js\";\nimport inspect from \"./inspector/index.js\";\nimport languages from \"./languages/index.js\";\nimport pruner from \"./pruner/index.js\";\n\nexport default function (pi: ExtensionAPI) {\n compactor(pi);\n languages(pi);\n deduplicator(pi);\n pruner(pi);\n\n pi.registerTool(codeMap);\n pi.registerTool(inspect);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["existsSync", "readFileSync", "renameSync", "unlinkSync", "writeFileSync", "filePath", "Type", "existsSync", "readFile", "resolve", "resolve", "readFile", "existsSync", "readFile", "resolve", "readFile", "Type", "defineTool", "Text", "Type", "defineTool", "Type", "Text"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-optimizer",
|
|
3
|
+
"version": "0.7.0-alpha.4",
|
|
4
|
+
"description": "Context optimization tools for pi coding agent",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./index.js",
|
|
7
|
+
"exports": "./index.js",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22.19"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"pi-package",
|
|
14
|
+
"pi-coding-agent",
|
|
15
|
+
"context-optimization"
|
|
16
|
+
],
|
|
17
|
+
"pi": {
|
|
18
|
+
"extensions": [
|
|
19
|
+
"./index.js"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"picomatch": "^4.0.4",
|
|
24
|
+
"tree-sitter": "0.25.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@earendil-works/pi-coding-agent": "*",
|
|
28
|
+
"@earendil-works/pi-tui": "*",
|
|
29
|
+
"typebox": "*"
|
|
30
|
+
}
|
|
31
|
+
}
|