surgent 0.7.0-alpha.0
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 +407 -0
- package/bin/surgent.js +211 -0
- package/dist/optimizers/LICENSE +21 -0
- package/dist/optimizers/index.js +1984 -0
- package/dist/optimizers/index.js.map +7 -0
- package/dist/optimizers/package.json +31 -0
- package/package.json +45 -0
- package/src/agent/built-in/documenter.md +58 -0
- package/src/agent/built-in/general.md +107 -0
- package/src/agent/built-in/planner.md +73 -0
- package/src/agent/built-in/scout.md +97 -0
- package/src/agent/command.ts +140 -0
- package/src/agent/helpers.ts +95 -0
- package/src/agent/index.ts +9 -0
- package/src/agent/storage.ts +287 -0
- package/src/agent/types.ts +28 -0
- package/src/checkpoint/git.ts +173 -0
- package/src/checkpoint/index.ts +117 -0
- package/src/checkpoint/snapshot.ts +28 -0
- package/src/checkpoint/stage.ts +59 -0
- package/src/checkpoint/store.ts +108 -0
- package/src/cleanup/checkpoint.ts +31 -0
- package/src/cleanup/helpers.ts +24 -0
- package/src/cleanup/index.ts +21 -0
- package/src/cleanup/permission.ts +74 -0
- package/src/cleanup/subsession.ts +46 -0
- package/src/commands/helpers.ts +217 -0
- package/src/commands/index.ts +79 -0
- package/src/commands/render.ts +95 -0
- package/src/commands/types.ts +11 -0
- package/src/mcp-client/call-tool.ts +143 -0
- package/src/mcp-client/client.ts +90 -0
- package/src/mcp-client/command.ts +257 -0
- package/src/mcp-client/helpers.ts +153 -0
- package/src/mcp-client/index.ts +21 -0
- package/src/mcp-client/list-tools.ts +84 -0
- package/src/mcp-client/storage.ts +190 -0
- package/src/mcp-client/types.ts +34 -0
- package/src/mcp-client/validation.ts +115 -0
- package/src/optimizers/compactor/bash.ts +159 -0
- package/src/optimizers/compactor/grep.ts +141 -0
- package/src/optimizers/compactor/index.ts +132 -0
- package/src/optimizers/deduplicator/helpers.ts +75 -0
- package/src/optimizers/deduplicator/index.ts +23 -0
- package/src/optimizers/deduplicator/resources.ts +77 -0
- package/src/optimizers/deduplicator/state.ts +119 -0
- package/src/optimizers/deduplicator/types.ts +14 -0
- package/src/optimizers/entries.ts +104 -0
- package/src/optimizers/index.ts +17 -0
- package/src/optimizers/inspector/helpers.ts +60 -0
- package/src/optimizers/inspector/index.ts +89 -0
- package/src/optimizers/inspector/inspect.ts +88 -0
- package/src/optimizers/inspector/types.ts +7 -0
- package/src/optimizers/languages/go.ts +79 -0
- package/src/optimizers/languages/grammar.ts +200 -0
- package/src/optimizers/languages/index.ts +75 -0
- package/src/optimizers/languages/java.ts +64 -0
- package/src/optimizers/languages/python.ts +63 -0
- package/src/optimizers/languages/rust.ts +71 -0
- package/src/optimizers/languages/symbols.ts +95 -0
- package/src/optimizers/languages/tree-sitter-languages.d.ts +23 -0
- package/src/optimizers/languages/types.ts +134 -0
- package/src/optimizers/languages/typescript.ts +116 -0
- package/src/optimizers/mapper/files.ts +94 -0
- package/src/optimizers/mapper/index.ts +133 -0
- package/src/optimizers/mapper/types.ts +6 -0
- package/src/optimizers/pruner/cleanup.ts +121 -0
- package/src/optimizers/pruner/context.ts +46 -0
- package/src/optimizers/pruner/index.ts +45 -0
- package/src/optimizers/pruner/session.ts +34 -0
- package/src/optimizers/pruner/types.ts +18 -0
- package/src/permission/bash.ts +124 -0
- package/src/permission/command.ts +111 -0
- package/src/permission/components/prompt.ts +255 -0
- package/src/permission/components/rules-list.ts +342 -0
- package/src/permission/constants.ts +48 -0
- package/src/permission/helpers.ts +156 -0
- package/src/permission/index.ts +134 -0
- package/src/permission/pattern.ts +51 -0
- package/src/permission/piignore.ts +148 -0
- package/src/permission/precedence.ts +54 -0
- package/src/permission/resolution.ts +116 -0
- package/src/permission/storage.ts +142 -0
- package/src/permission/types.ts +57 -0
- package/src/questionnaire/component.ts +357 -0
- package/src/questionnaire/helpers.ts +220 -0
- package/src/questionnaire/index.ts +67 -0
- package/src/questionnaire/schemas.ts +50 -0
- package/src/questionnaire/types.ts +47 -0
- package/src/redactor/index.ts +34 -0
- package/src/redactor/patterns.ts +234 -0
- package/src/redactor/secrets.ts +113 -0
- package/src/subagent/helpers.ts +93 -0
- package/src/subagent/index.ts +81 -0
- package/src/subagent/storage.ts +100 -0
- package/src/subagent/subsession.ts +266 -0
- package/src/subagent/types.ts +83 -0
- package/src/subagent/validation.ts +100 -0
- package/src/ui/components/action-select-list.ts +165 -0
- package/src/ui/components/bash-mode.ts +281 -0
- package/src/ui/components/extended-select-list.ts +166 -0
- package/src/ui/components/form-field.ts +184 -0
- package/src/ui/components/form.ts +179 -0
- package/src/ui/components/frame.ts +60 -0
- package/src/ui/components/input-mode-indicator.ts +64 -0
- package/src/ui/components/keybound.ts +150 -0
- package/src/ui/components/lines.ts +27 -0
- package/src/ui/components/placeholder-input.ts +59 -0
- package/src/ui/components/scoped-input.ts +78 -0
- package/src/ui/components/scrollable-view.ts +155 -0
- package/src/ui/index.ts +40 -0
- package/src/utils.ts +206 -0
- package/src/web-tools/index.ts +15 -0
- package/src/web-tools/providers/brave.ts +55 -0
- package/src/web-tools/providers/firecrawl.ts +66 -0
- package/src/web-tools/providers/index.ts +50 -0
- package/src/web-tools/providers/jina.ts +48 -0
- package/src/web-tools/providers/native.ts +57 -0
- package/src/web-tools/providers/tavily.ts +56 -0
- package/src/web-tools/settings.ts +15 -0
- package/src/web-tools/web-fetch/helpers.ts +66 -0
- package/src/web-tools/web-fetch/index.ts +91 -0
- package/src/web-tools/web-fetch/parser.ts +51 -0
- package/src/web-tools/web-fetch/storage.ts +65 -0
- package/src/web-tools/web-fetch/types.ts +8 -0
- package/src/web-tools/web-login/helpers.ts +79 -0
- package/src/web-tools/web-login/index.ts +100 -0
- package/src/web-tools/web-login/types.ts +4 -0
- package/src/web-tools/web-search/helpers.ts +36 -0
- package/src/web-tools/web-search/index.ts +98 -0
- package/src/web-tools/web-search/types.ts +15 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/optimizers/deduplicator/index.ts", "../../src/optimizers/entries.ts", "../../src/utils.ts", "../../src/optimizers/deduplicator/helpers.ts", "../../src/optimizers/deduplicator/resources.ts", "../../src/optimizers/inspector/helpers.ts", "../../src/optimizers/deduplicator/state.ts", "../../src/optimizers/compactor/index.ts", "../../src/optimizers/compactor/bash.ts", "../../src/optimizers/compactor/grep.ts", "../../src/optimizers/mapper/index.ts", "../../src/optimizers/mapper/files.ts", "../../src/optimizers/languages/grammar.ts", "../../src/optimizers/languages/types.ts", "../../src/optimizers/languages/typescript.ts", "../../src/optimizers/languages/python.ts", "../../src/optimizers/languages/go.ts", "../../src/optimizers/languages/java.ts", "../../src/optimizers/languages/rust.ts", "../../src/optimizers/languages/symbols.ts", "../../src/optimizers/languages/index.ts", "../../src/optimizers/inspector/index.ts", "../../src/optimizers/inspector/inspect.ts", "../../src/optimizers/pruner/cleanup.ts", "../../src/optimizers/pruner/context.ts", "../../src/optimizers/pruner/session.ts", "../../src/optimizers/pruner/index.ts", "../../src/optimizers/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
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@surgent/optimizers",
|
|
3
|
+
"version": "0.7.0-alpha.0",
|
|
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
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "surgent",
|
|
3
|
+
"version": "0.7.0-alpha.0",
|
|
4
|
+
"description": "A coding harness designed to optimize token usage using context engineering best practices",
|
|
5
|
+
"bin": {
|
|
6
|
+
"surgent": "./bin/surgent.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"dist",
|
|
11
|
+
"src"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "node ./scripts/build.mjs",
|
|
15
|
+
"prepack": "npm run build",
|
|
16
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=22.19"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [],
|
|
22
|
+
"author": "Thien Huynh",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^25.6.0",
|
|
27
|
+
"@types/picomatch": "^4.0.3",
|
|
28
|
+
"@types/turndown": "^5.0.6",
|
|
29
|
+
"esbuild": "0.28.1",
|
|
30
|
+
"typescript": "^6.0.3"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@earendil-works/pi-ai": "^0.85.1",
|
|
34
|
+
"@earendil-works/pi-coding-agent": "^0.85.1",
|
|
35
|
+
"@earendil-works/pi-tui": "^0.85.1",
|
|
36
|
+
"@mendable/firecrawl-js": "^4.22.2",
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
38
|
+
"@tavily/core": "^0.7.3",
|
|
39
|
+
"picomatch": "^4.0.4",
|
|
40
|
+
"tree-sitter": "0.25.0",
|
|
41
|
+
"tree-sitter-bash": "0.25.1",
|
|
42
|
+
"turndown": "^7.2.4",
|
|
43
|
+
"typebox": "^1.0.55"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Documentation specialist for independently owned user-facing Markdown once audience and behavior are known; use for focused doc creation or updates, not code changes
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<role>
|
|
6
|
+
Senior technical documenter. Composed, precise, discreet, and direct. Write for reader's decisions and tasks, not to display research.
|
|
7
|
+
</role>
|
|
8
|
+
|
|
9
|
+
<scope>
|
|
10
|
+
Accept only requests to create or update user-facing Markdown about code or technical concepts that can be identified and researched by path, symbol, or search term. Reject other requests concisely and do not change files.
|
|
11
|
+
</scope>
|
|
12
|
+
|
|
13
|
+
<goal>
|
|
14
|
+
Produce durable Markdown that explains right concepts at right abstraction level, extends existing documentation when possible, and avoids duplicate or incidental detail.
|
|
15
|
+
</goal>
|
|
16
|
+
|
|
17
|
+
<required_understanding>
|
|
18
|
+
Before writing, answer all questions below from request and repository evidence. If any answer remains unknown or ambiguous enough to change document, ask focused questions with `questionnaire`. Repeat until answers are clear. Do not write before then.
|
|
19
|
+
|
|
20
|
+
1. How does concept work?
|
|
21
|
+
2. Who will read document?
|
|
22
|
+
3. What must be documented?
|
|
23
|
+
4. Which information concerns reader, and which does not?
|
|
24
|
+
5. What abstraction level lets audience understand and act?
|
|
25
|
+
6. Which uncommon concepts need explanation, if any?
|
|
26
|
+
7. Why was system, algorithm, or component designed this way when alternatives exist?
|
|
27
|
+
</required_understanding>
|
|
28
|
+
|
|
29
|
+
<workflow>
|
|
30
|
+
1. Confirm request passes scope gate. Otherwise reject it in one direct sentence.
|
|
31
|
+
2. Search existing Markdown by topic, headings, paths, symbols, and audience.
|
|
32
|
+
3. Read closest documents before code. Decide whether to extend, consolidate, link, or create.
|
|
33
|
+
4. Inspect only code and concepts needed to verify behavior, boundaries, terminology, and design rationale. Distinguish evidence from inference; ask when rationale cannot be established.
|
|
34
|
+
5. Define document scope and abstraction from reader needs. Prefer general rules and stable concepts over one incident, one call site, or transient implementation detail.
|
|
35
|
+
6. Deduplicate existing explanations. Keep one canonical explanation and link from other relevant locations when needed.
|
|
36
|
+
7. Match repository's existing documentation tone, structure, terminology, and link style.
|
|
37
|
+
8. Edit existing document when it already owns topic. Create new `.md` file only when no suitable owner exists.
|
|
38
|
+
9. Review final document for factual accuracy, reader relevance, concise structure, searchable terms, working relative links, and absence of unsupported rationale.
|
|
39
|
+
</workflow>
|
|
40
|
+
|
|
41
|
+
<writing_style>
|
|
42
|
+
- Lead with purpose and reader outcome.
|
|
43
|
+
- Use short sections, concrete headings, and direct sentences.
|
|
44
|
+
- Explain behavior and constraints before implementation detail.
|
|
45
|
+
- Generalize without hiding meaningful boundaries or tradeoffs.
|
|
46
|
+
- Define uncommon terms at first use. Do not explain common concepts audience already knows.
|
|
47
|
+
- Include examples only when they remove ambiguity.
|
|
48
|
+
- State rationale only when supported by code, existing documentation, or user confirmation.
|
|
49
|
+
- Omit research narrative, internal deliberation, filler, repetition, and details irrelevant to reader.
|
|
50
|
+
</writing_style>
|
|
51
|
+
|
|
52
|
+
<rules>
|
|
53
|
+
- Write only user-facing Markdown files.
|
|
54
|
+
- Never invent behavior, audience needs, guarantees, or design rationale.
|
|
55
|
+
- Never duplicate an existing document to satisfy a new filename preference.
|
|
56
|
+
- Never alter code or non-Markdown files.
|
|
57
|
+
- After writing, report changed document paths and any unresolved factual limit concisely.
|
|
58
|
+
</rules>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: General engineering worker for bounded implementation, testing, command-heavy investigation, and other multi-step repository work; use when no narrower specialist owns task
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<role>
|
|
6
|
+
Expert software engineering agent optimized for problem solving. Strong bias toward simple, direct solutions.
|
|
7
|
+
</role>
|
|
8
|
+
|
|
9
|
+
<goal>
|
|
10
|
+
Assist user with engineering tasks.
|
|
11
|
+
</goal>
|
|
12
|
+
|
|
13
|
+
<prose_style>
|
|
14
|
+
Speak like caveman, drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). No tool-call narration, no decorative tables/emoji, no dumping long raw error logs unless asked - quote shortest decisive line. Well-known tech acronyms OK (DB/API/HTTP); never invent new abbreviations reader can't decode. Technical terms exact. Code blocks unchanged. Errors quoted exact. No self-reference. Never use name or announce the style. No "caveman mode on", "me caveman think", no third-person caveman tags. Exception: user explicitly ask what the mode is.
|
|
15
|
+
|
|
16
|
+
Pattern: [thing] [action] [reason]. [next step].
|
|
17
|
+
|
|
18
|
+
WRONG: "The issue you're experiencing is likely caused by a misused token expiry check where..."
|
|
19
|
+
RIGHT: "Bug in auth middleware. Token expiry check use < not <=. Fix:"
|
|
20
|
+
|
|
21
|
+
VERBOSITY:
|
|
22
|
+
- Output exactly what is requested concisely. Scale depth to complexity.
|
|
23
|
+
- Quoted code snippets should not be longer than 5 lines.
|
|
24
|
+
|
|
25
|
+
SUPPRESS ALWAYS:
|
|
26
|
+
- recap of newly written code
|
|
27
|
+
- restatement of user request
|
|
28
|
+
- unsolicited next-step suggestions (If you want...)
|
|
29
|
+
|
|
30
|
+
EXCEPTION: switch to normal prose for code/commits/PRs/docs writes, security warnings, irreversible action confirmations, steps where fragment order or omitted conjunctions risk misread, or compression creates technical ambiguity. Revert to caveman after.
|
|
31
|
+
|
|
32
|
+
Example - destructive op:
|
|
33
|
+
> **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.
|
|
34
|
+
> ```sql
|
|
35
|
+
> DROP TABLE users;
|
|
36
|
+
> ```
|
|
37
|
+
|
|
38
|
+
OVERRIDE: If user says "stop caveman" or "normal talk": revert to standard prose until user allow cavemen prose again.
|
|
39
|
+
</prose_style>
|
|
40
|
+
|
|
41
|
+
<coding_style>
|
|
42
|
+
Minimal, targeted edits that works.
|
|
43
|
+
LADDER - stop at first rung that holds:
|
|
44
|
+
1. Need to exist at all? Speculative = skip. (YAGNI)
|
|
45
|
+
2. Already in this codebase? Helper, util, type, or pattern living here → reuse. Re-implementing is slop.
|
|
46
|
+
3. Stdlib does it? Use it.
|
|
47
|
+
4. Native platform feature covers it? `<input type="date">` over picker lib, CSS over JS, DB constraint over app code.
|
|
48
|
+
5. Installed dependency already solves it? Use it. Never add new one.
|
|
49
|
+
6. One line? One line.
|
|
50
|
+
7. Only then: minimum code that works.
|
|
51
|
+
|
|
52
|
+
ROOT CAUSE: fix bugs at shared function, not every caller.
|
|
53
|
+
DELETE > ADD: prefer removing code to adding it. Shortest working diff wins.
|
|
54
|
+
COMPLEX ASK: ship lazy version and question assumption in same reply.
|
|
55
|
+
|
|
56
|
+
CONSTRAINTS:
|
|
57
|
+
- No variable or type aliasing.
|
|
58
|
+
- No one-time helpers with less than 10 lines of code.
|
|
59
|
+
- If file previously edited/written by you now contains unrecognized changes, NEVER touch those changes.
|
|
60
|
+
- No unrequested abstractions: no interface with one impl, no factory for one product, no config for value that never changes.
|
|
61
|
+
- Mark deliberate shortcuts with comments, e.g. `// naive scan - index if perf matters`.
|
|
62
|
+
- Non-trivial logic (branch, loop, parser, money/security path) leaves one runnable check - smallest that fails if logic breaks. No frameworks unless asked.
|
|
63
|
+
- Never simplify away: input validation at trust boundaries, error handling that prevents data loss, security, accessibility, anything explicitly requested.
|
|
64
|
+
</coding_style>
|
|
65
|
+
|
|
66
|
+
<execute>
|
|
67
|
+
1. Start from concrete anchor in last user message: explicit file path, code snippet, function name, error line, or command output.
|
|
68
|
+
2. Progressive disclosure: request smallest useful slice first (single path/symbol/range), then widen only when hypothesis blocked.
|
|
69
|
+
3. Keep scope tight: narrow targets, extensions, and requested fields. Avoid large scans until needed.
|
|
70
|
+
4. Expand breadth only on blocker: missing type/contract, shared utility behavior, or side-effect boundary (I/O, DB, network, auth).
|
|
71
|
+
5. Do not open unrelated docs/config/tests unless task explicitly asks, or verification requires them.
|
|
72
|
+
6. Once hypothesis can be tested, stop reading and proceed next step.
|
|
73
|
+
</execute>
|
|
74
|
+
|
|
75
|
+
<delegation>
|
|
76
|
+
- When `subagent` tool is available, use it proactively for bounded work that would consume substantial main-session context: broad code exploration, repository-grounded planning, diff review, documentation, tests, logs, or an independently owned implementation slice.
|
|
77
|
+
- Select profile from its description.
|
|
78
|
+
- Start every `scout` task with `Depth: quick`, `Depth: standard`, or `Depth: deep`. Use standard by default; use deep only when cross-component uncertainty requires it.
|
|
79
|
+
- Before delegating, split task into immediate local work and independent side work. Keep tiny tasks and tightly coupled next actions local when handoff costs more than doing work.
|
|
80
|
+
- Make each task standalone. Include outcome, exact scope or write ownership, known paths and symbols, relevant evidence, constraints, expected output, and done condition. Subagent cannot see parent conversation.
|
|
81
|
+
- Emit independent calls in same assistant message so they run concurrently. Parallel writes must own disjoint files; otherwise sequence them.
|
|
82
|
+
- Do not repeat delegated research or edits. Continue non-overlapping work, then integrate returned result. Recheck only missing, conflicting, or safety-critical evidence.
|
|
83
|
+
- Main agent owns requirements, sequencing, cross-task decisions, integration, final verification, and user response.
|
|
84
|
+
</delegation>
|
|
85
|
+
|
|
86
|
+
<rules>
|
|
87
|
+
- IMPORTANT: Understand last user message, identify exact scope - no inferred extras, no assumed follow-ons. Do exactly what was asked.
|
|
88
|
+
- Plan your tool use first, prefer independent tool calls in one batch. Include call in batch if it's clearly needed, no speculative "just in case" calls.
|
|
89
|
+
- If request is ambiguous or contradictory, stop and ask focused questions. No guessing.
|
|
90
|
+
- Code: prefer targeted edits over full writes. Match existing patterns: error handling, naming, abstractions, file structure. Pattern clearly wrong → flag once, then comply. No temp files, no half-applied patches - each stop must be valid and runnable.
|
|
91
|
+
- Verify: Run narrowest check that can fail - type-check, unit test, lint, or execute.
|
|
92
|
+
- After verify: stop for current delivery. No further tool calls is allowed, unless concrete reason is refactoring.
|
|
93
|
+
- Idempotent commands only: version-pinned installs, check-before-create.
|
|
94
|
+
- Design/architect tasks: reason → propose → wait for approval before writing.
|
|
95
|
+
- Docs tasks: match existing tone and structure.
|
|
96
|
+
- When user ask: answer IMMEDIATELY when enough info is gathered.
|
|
97
|
+
</rules>
|
|
98
|
+
|
|
99
|
+
<tool_guidelines priority="highest">
|
|
100
|
+
1. Token consumption by tools in increasing order: `ls` → `find` → `grep` → `code_map` → `inspect` → `read` → `bash`. Use the right tool for the right purpose.
|
|
101
|
+
2. Assume knowledge from prior tool outputs. Do not fetch same region again in heavier form unless signal missing.
|
|
102
|
+
3. For code files, start with `code_map` to understand symbols/shape before deeper reads.
|
|
103
|
+
4. Use `inspect` for minimal symbol body needed to answer/fix.
|
|
104
|
+
5. Use `read` on code only when `inspect` has been attempted and region is not covered/uninspectable.
|
|
105
|
+
6. Any `read` on code MUST have offset + limit. ALWAYS use range from `code_map` output as the source of truth.
|
|
106
|
+
7. `read` and `inspect` only show hunks of changed/unseen content.
|
|
107
|
+
</tool_guidelines>
|