surgent 0.7.0-alpha.2 → 0.7.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +3 -3
  2. package/dist/{optimizers → optimizer}/README.md +3 -3
  3. package/dist/{optimizers → optimizer}/index.js +33 -33
  4. package/dist/{optimizers → optimizer}/index.js.map +1 -1
  5. package/dist/{optimizers → optimizer}/package.json +2 -2
  6. package/package.json +1 -1
  7. package/src/{optimizers → optimizer}/README.md +3 -3
  8. /package/dist/{optimizers → optimizer}/LICENSE +0 -0
  9. /package/src/{optimizers → optimizer}/compactor/bash.ts +0 -0
  10. /package/src/{optimizers → optimizer}/compactor/grep.ts +0 -0
  11. /package/src/{optimizers → optimizer}/compactor/index.ts +0 -0
  12. /package/src/{optimizers → optimizer}/deduplicator/helpers.ts +0 -0
  13. /package/src/{optimizers → optimizer}/deduplicator/index.ts +0 -0
  14. /package/src/{optimizers → optimizer}/deduplicator/resources.ts +0 -0
  15. /package/src/{optimizers → optimizer}/deduplicator/state.ts +0 -0
  16. /package/src/{optimizers → optimizer}/deduplicator/types.ts +0 -0
  17. /package/src/{optimizers → optimizer}/entries.ts +0 -0
  18. /package/src/{optimizers → optimizer}/index.ts +0 -0
  19. /package/src/{optimizers → optimizer}/inspector/helpers.ts +0 -0
  20. /package/src/{optimizers → optimizer}/inspector/index.ts +0 -0
  21. /package/src/{optimizers → optimizer}/inspector/inspect.ts +0 -0
  22. /package/src/{optimizers → optimizer}/inspector/types.ts +0 -0
  23. /package/src/{optimizers → optimizer}/languages/go.ts +0 -0
  24. /package/src/{optimizers → optimizer}/languages/grammar.ts +0 -0
  25. /package/src/{optimizers → optimizer}/languages/index.ts +0 -0
  26. /package/src/{optimizers → optimizer}/languages/java.ts +0 -0
  27. /package/src/{optimizers → optimizer}/languages/python.ts +0 -0
  28. /package/src/{optimizers → optimizer}/languages/rust.ts +0 -0
  29. /package/src/{optimizers → optimizer}/languages/symbols.ts +0 -0
  30. /package/src/{optimizers → optimizer}/languages/tree-sitter-languages.d.ts +0 -0
  31. /package/src/{optimizers → optimizer}/languages/types.ts +0 -0
  32. /package/src/{optimizers → optimizer}/languages/typescript.ts +0 -0
  33. /package/src/{optimizers → optimizer}/mapper/files.ts +0 -0
  34. /package/src/{optimizers → optimizer}/mapper/index.ts +0 -0
  35. /package/src/{optimizers → optimizer}/mapper/types.ts +0 -0
  36. /package/src/{optimizers → optimizer}/pruner/cleanup.ts +0 -0
  37. /package/src/{optimizers → optimizer}/pruner/context.ts +0 -0
  38. /package/src/{optimizers → optimizer}/pruner/index.ts +0 -0
  39. /package/src/{optimizers → optimizer}/pruner/session.ts +0 -0
  40. /package/src/{optimizers → optimizer}/pruner/types.ts +0 -0
package/README.md CHANGED
@@ -76,7 +76,7 @@ npm uninstall -g surgent # remove
76
76
 
77
77
  ## Optimizer package
78
78
 
79
- surgent includes [`pi-context-optimizer`](https://www.npmjs.com/package/pi-context-optimizer), a standalone Pi extension for structural code navigation and automatic context cleanup. Install it separately when using Pi without surgent; package page covers features and setup.
79
+ surgent includes [`pi-optimizer`](https://www.npmjs.com/package/pi-optimizer), a standalone Pi extension for structural code navigation and automatic context cleanup. Install it separately when using Pi without surgent; package page covers features and setup.
80
80
 
81
81
  ## Connect a model
82
82
 
@@ -362,12 +362,12 @@ pnpm install
362
362
  npm link
363
363
  ```
364
364
 
365
- `pnpm build` builds only the distributable optimizer package in `dist/optimizers`. npm runs this build automatically through `prepack` when packaging surgent.
365
+ `pnpm build` builds only the distributable optimizer package in `dist/optimizer`. npm runs this build automatically through `prepack` when packaging surgent.
366
366
 
367
367
  To publish the standalone optimizer artifact after building it:
368
368
 
369
369
  ```bash
370
- npm publish ./dist/optimizers --access public
370
+ npm publish ./dist/optimizer --access public
371
371
  ```
372
372
 
373
373
  ## Reference
@@ -1,4 +1,4 @@
1
- # pi-context-optimizer
1
+ # pi-optimizer
2
2
 
3
3
  Context optimization extension for [Pi](https://github.com/earendil-works/pi). It gives coding agents more useful context by improving code navigation and reducing repeated or noisy tool output. It is also built into [surgent](https://github.com/thien2218/surgent).
4
4
 
@@ -6,7 +6,7 @@ Context optimization extension for [Pi](https://github.com/earendil-works/pi). I
6
6
 
7
7
  Long coding sessions accumulate large tool results, repeated file content, and output that no longer helps with current task. That context costs tokens and can distract model from relevant code.
8
8
 
9
- `pi-context-optimizer` keeps useful evidence while removing avoidable noise. It works automatically after installation and adds structural tools for reading only code needed for current task.
9
+ `pi-optimizer` keeps useful evidence while removing avoidable noise. It works automatically after installation and adds structural tools for reading only code needed for current task.
10
10
 
11
11
  ## What it does
12
12
 
@@ -30,7 +30,7 @@ These changes reduce context growth, improve prompt-cache reuse, and leave more
30
30
  Install package through Pi:
31
31
 
32
32
  ```bash
33
- pi install npm:pi-context-optimizer
33
+ pi install npm:pi-optimizer
34
34
  ```
35
35
 
36
36
  Confirm installation:
@@ -1,7 +1,7 @@
1
- // src/optimizers/deduplicator/index.ts
1
+ // src/optimizer/deduplicator/index.ts
2
2
  import "@earendil-works/pi-coding-agent";
3
3
 
4
- // src/optimizers/entries.ts
4
+ // src/optimizer/entries.ts
5
5
  import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
6
6
 
7
7
  // src/utils.ts
@@ -111,7 +111,7 @@ function renderCallText(text, isPartial) {
111
111
  return container;
112
112
  }
113
113
 
114
- // src/optimizers/entries.ts
114
+ // src/optimizer/entries.ts
115
115
  function readSessionEntries(sessionFile) {
116
116
  if (!sessionFile || !existsSync(sessionFile)) return;
117
117
  try {
@@ -192,7 +192,7 @@ function getLastEntryId(entries) {
192
192
  return null;
193
193
  }
194
194
 
195
- // src/optimizers/deduplicator/helpers.ts
195
+ // src/optimizer/deduplicator/helpers.ts
196
196
  function filterDeduplicatedMessages(messages, state) {
197
197
  const prunedIds = /* @__PURE__ */ new Set();
198
198
  for (const [toolCallId, repeatIds] of state.replacements) {
@@ -253,11 +253,11 @@ function hasFullCoverage(range, candidates) {
253
253
  return merged.reduce((lines, [start, end]) => lines + end - start + 1, 0) === range[1] - range[0] + 1;
254
254
  }
255
255
 
256
- // src/optimizers/deduplicator/resources.ts
256
+ // src/optimizer/deduplicator/resources.ts
257
257
  import { realpathSync } from "node:fs";
258
258
  import { normalize, resolve } from "node:path";
259
259
 
260
- // src/optimizers/inspector/helpers.ts
260
+ // src/optimizer/inspector/helpers.ts
261
261
  function parseInspectToolDetails(inspected) {
262
262
  if (!inspected || typeof inspected !== "object") return;
263
263
  const path = inspected.path;
@@ -274,7 +274,7 @@ function parseInspectToolDetails(inspected) {
274
274
  return { path, symbol, range: [start, end] };
275
275
  }
276
276
 
277
- // src/optimizers/deduplicator/resources.ts
277
+ // src/optimizer/deduplicator/resources.ts
278
278
  function getResultText(message) {
279
279
  if (!Array.isArray(message.content) || message.content.length !== 1) return;
280
280
  const content = message.content[0];
@@ -323,7 +323,7 @@ function getResourceCoverage(toolName, input, result, cwd) {
323
323
  };
324
324
  }
325
325
 
326
- // src/optimizers/deduplicator/state.ts
326
+ // src/optimizer/deduplicator/state.ts
327
327
  function collectToolCallInputs(activeEntries) {
328
328
  const inputsByCallId = /* @__PURE__ */ new Map();
329
329
  for (const entry of activeEntries) {
@@ -401,7 +401,7 @@ function buildDeduplicatorState(entries, leafId, cwd) {
401
401
  return { replacements, resultEntryIds: new Set(results.map((result) => result.entryId)) };
402
402
  }
403
403
 
404
- // src/optimizers/deduplicator/index.ts
404
+ // src/optimizer/deduplicator/index.ts
405
405
  function deduplicator_default(pi) {
406
406
  let state = buildDeduplicatorState([], null, "");
407
407
  pi.on("session_start", (_event, ctx) => {
@@ -418,7 +418,7 @@ function deduplicator_default(pi) {
418
418
  });
419
419
  }
420
420
 
421
- // src/optimizers/compactor/index.ts
421
+ // src/optimizer/compactor/index.ts
422
422
  import { statSync } from "node:fs";
423
423
  import {
424
424
  createBashToolDefinition,
@@ -426,7 +426,7 @@ import {
426
426
  isGrepToolResult
427
427
  } from "@earendil-works/pi-coding-agent";
428
428
 
429
- // src/optimizers/compactor/bash.ts
429
+ // src/optimizer/compactor/bash.ts
430
430
  import { stripVTControlCharacters } from "node:util";
431
431
  import { createLocalBashOperations } from "@earendil-works/pi-coding-agent";
432
432
  var localBash = createLocalBashOperations();
@@ -561,7 +561,7 @@ function createCompactingBashOperations(filter) {
561
561
  };
562
562
  }
563
563
 
564
- // src/optimizers/compactor/grep.ts
564
+ // src/optimizer/compactor/grep.ts
565
565
  import {
566
566
  appendFileSync,
567
567
  existsSync as existsSync2,
@@ -671,7 +671,7 @@ function formatGrepResult(content) {
671
671
  return changed ? formattedLines.join("\n") : content;
672
672
  }
673
673
 
674
- // src/optimizers/compactor/index.ts
674
+ // src/optimizer/compactor/index.ts
675
675
  import Type from "typebox";
676
676
  function compactor_default(pi) {
677
677
  let writeStartOffset = 0;
@@ -775,11 +775,11 @@ function compactor_default(pi) {
775
775
  });
776
776
  }
777
777
 
778
- // src/optimizers/mapper/index.ts
778
+ // src/optimizer/mapper/index.ts
779
779
  import { defineTool, truncateHead } from "@earendil-works/pi-coding-agent";
780
780
  import { Type as Type2 } from "typebox";
781
781
 
782
- // src/optimizers/mapper/files.ts
782
+ // src/optimizer/mapper/files.ts
783
783
  import picomatch from "picomatch";
784
784
  var SKIPPED_DIRECTORIES = /* @__PURE__ */ new Set([".git", ".pi", "build", "coverage", "dist", "node_modules"]);
785
785
  function normalizePath(pathValue) {
@@ -844,7 +844,7 @@ async function resolveTargetPaths(projectPath, targets, signal) {
844
844
  }
845
845
  }
846
846
 
847
- // src/optimizers/languages/grammar.ts
847
+ // src/optimizer/languages/grammar.ts
848
848
  import { existsSync as existsSync3 } from "node:fs";
849
849
  import { readFile as readFile2 } from "node:fs/promises";
850
850
  import { resolve as resolve2 } from "node:path";
@@ -1000,7 +1000,7 @@ async function loadGrammarModule(pkgName) {
1000
1000
  }
1001
1001
  }
1002
1002
 
1003
- // src/optimizers/languages/types.ts
1003
+ // src/optimizer/languages/types.ts
1004
1004
  var RuleBasedLanguageProfile = class {
1005
1005
  constructor(extensions, nameFieldByType, topLevelRoots, topLevelParents, typeRule) {
1006
1006
  this.extensions = extensions;
@@ -1079,7 +1079,7 @@ var RuleBasedLanguageProfile = class {
1079
1079
  }
1080
1080
  };
1081
1081
 
1082
- // src/optimizers/languages/typescript.ts
1082
+ // src/optimizer/languages/typescript.ts
1083
1083
  var TypeScriptLanguageProfile = class extends RuleBasedLanguageProfile {
1084
1084
  constructor() {
1085
1085
  super(
@@ -1169,7 +1169,7 @@ var TypeScriptLanguageProfile = class extends RuleBasedLanguageProfile {
1169
1169
  }
1170
1170
  };
1171
1171
 
1172
- // src/optimizers/languages/python.ts
1172
+ // src/optimizer/languages/python.ts
1173
1173
  var PythonLanguageProfile = class extends RuleBasedLanguageProfile {
1174
1174
  constructor() {
1175
1175
  super(
@@ -1221,7 +1221,7 @@ var PythonLanguageProfile = class extends RuleBasedLanguageProfile {
1221
1221
  }
1222
1222
  };
1223
1223
 
1224
- // src/optimizers/languages/go.ts
1224
+ // src/optimizer/languages/go.ts
1225
1225
  var GoLanguageProfile = class extends RuleBasedLanguageProfile {
1226
1226
  constructor() {
1227
1227
  super(
@@ -1286,7 +1286,7 @@ var GoLanguageProfile = class extends RuleBasedLanguageProfile {
1286
1286
  }
1287
1287
  };
1288
1288
 
1289
- // src/optimizers/languages/java.ts
1289
+ // src/optimizer/languages/java.ts
1290
1290
  var JavaLanguageProfile = class extends RuleBasedLanguageProfile {
1291
1291
  constructor() {
1292
1292
  super(
@@ -1340,7 +1340,7 @@ var JavaLanguageProfile = class extends RuleBasedLanguageProfile {
1340
1340
  }
1341
1341
  };
1342
1342
 
1343
- // src/optimizers/languages/rust.ts
1343
+ // src/optimizer/languages/rust.ts
1344
1344
  var RustLanguageProfile = class extends RuleBasedLanguageProfile {
1345
1345
  constructor() {
1346
1346
  super(
@@ -1403,7 +1403,7 @@ var RustLanguageProfile = class extends RuleBasedLanguageProfile {
1403
1403
  }
1404
1404
  };
1405
1405
 
1406
- // src/optimizers/languages/symbols.ts
1406
+ // src/optimizer/languages/symbols.ts
1407
1407
  import { readFile as readFile3 } from "node:fs/promises";
1408
1408
  import { extname, resolve as resolve3 } from "node:path";
1409
1409
  import Parser from "tree-sitter";
@@ -1478,7 +1478,7 @@ async function collectSymbols(cwd, path, kinds) {
1478
1478
  return symbols;
1479
1479
  }
1480
1480
 
1481
- // src/optimizers/languages/index.ts
1481
+ // src/optimizer/languages/index.ts
1482
1482
  var LANGUAGE_REGISTRY = [
1483
1483
  {
1484
1484
  bucketName: "typescript",
@@ -1528,7 +1528,7 @@ function languages_default(pi) {
1528
1528
  }
1529
1529
  var SYMBOL_KINDS = ["func", "class", "method", "decl", "deps", "public"];
1530
1530
 
1531
- // src/optimizers/mapper/index.ts
1531
+ // src/optimizer/mapper/index.ts
1532
1532
  function collapseGroupedSymbols(symbols) {
1533
1533
  let groupedSymbolKind;
1534
1534
  let importsGroupIndex = 0;
@@ -1640,12 +1640,12 @@ var codeMap = defineTool({
1640
1640
  });
1641
1641
  var mapper_default = codeMap;
1642
1642
 
1643
- // src/optimizers/inspector/index.ts
1643
+ // src/optimizer/inspector/index.ts
1644
1644
  import { defineTool as defineTool2 } from "@earendil-works/pi-coding-agent";
1645
1645
  import { Text as Text2 } from "@earendil-works/pi-tui";
1646
1646
  import { Type as Type3 } from "typebox";
1647
1647
 
1648
- // src/optimizers/inspector/inspect.ts
1648
+ // src/optimizer/inspector/inspect.ts
1649
1649
  function inspectGroupedSymbols(path, symbolName, symbols) {
1650
1650
  const groupedSymbolsMatch = /^(imports|exports)~([1-9]\d*)$/.exec(symbolName);
1651
1651
  if (!groupedSymbolsMatch) return;
@@ -1711,7 +1711,7 @@ async function inspectSymbol(cwd, path, symbolName, signal) {
1711
1711
  }
1712
1712
  }
1713
1713
 
1714
- // src/optimizers/inspector/index.ts
1714
+ // src/optimizer/inspector/index.ts
1715
1715
  var inspect = defineTool2({
1716
1716
  name: "inspect",
1717
1717
  label: "Inspect",
@@ -1790,7 +1790,7 @@ ${output?.type === "text" ? theme.fg("toolOutput", output.text) : ""}`,
1790
1790
  });
1791
1791
  var inspector_default = inspect;
1792
1792
 
1793
- // src/optimizers/pruner/cleanup.ts
1793
+ // src/optimizer/pruner/cleanup.ts
1794
1794
  function resolveRemovedId(entryId, replacementParents) {
1795
1795
  const visitedIds = /* @__PURE__ */ new Set();
1796
1796
  let resolvedId = entryId;
@@ -1874,7 +1874,7 @@ function removeEntries(entries) {
1874
1874
  return { changed: true, entries: repairedEntries, replacementParents };
1875
1875
  }
1876
1876
 
1877
- // src/optimizers/pruner/context.ts
1877
+ // src/optimizer/pruner/context.ts
1878
1878
  function buildPrunerState(entries) {
1879
1879
  const removedToolCallIds = /* @__PURE__ */ new Set();
1880
1880
  for (const entry of entries) {
@@ -1912,7 +1912,7 @@ function filterContextMessages(messages, state) {
1912
1912
  return { changed, messages: retainedMessages };
1913
1913
  }
1914
1914
 
1915
- // src/optimizers/pruner/session.ts
1915
+ // src/optimizer/pruner/session.ts
1916
1916
  function pruneEntries(entries, leafId) {
1917
1917
  const entryRemoval = removeEntries(entries);
1918
1918
  let activeLeafId = leafId;
@@ -1934,7 +1934,7 @@ function rewritePrunedSessionFile(sessionFile, leafId, fallbackToLastEntry) {
1934
1934
  writeSessionEntries(sessionFile, pruned.entries);
1935
1935
  }
1936
1936
 
1937
- // src/optimizers/pruner/index.ts
1937
+ // src/optimizer/pruner/index.ts
1938
1938
  function loadPrunerState(sessionFile) {
1939
1939
  const entries = readSessionEntries(sessionFile);
1940
1940
  return entries ? buildPrunerState(entries) : /* @__PURE__ */ new Set();
@@ -1969,7 +1969,7 @@ function pruner_default(pi) {
1969
1969
  });
1970
1970
  }
1971
1971
 
1972
- // src/optimizers/index.ts
1972
+ // src/optimizer/index.ts
1973
1973
  function index_default(pi) {
1974
1974
  compactor_default(pi);
1975
1975
  languages_default(pi);
@@ -1,6 +1,6 @@
1
1
  {
2
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"],
3
+ "sources": ["../../src/optimizer/deduplicator/index.ts", "../../src/optimizer/entries.ts", "../../src/utils.ts", "../../src/optimizer/deduplicator/helpers.ts", "../../src/optimizer/deduplicator/resources.ts", "../../src/optimizer/inspector/helpers.ts", "../../src/optimizer/deduplicator/state.ts", "../../src/optimizer/compactor/index.ts", "../../src/optimizer/compactor/bash.ts", "../../src/optimizer/compactor/grep.ts", "../../src/optimizer/mapper/index.ts", "../../src/optimizer/mapper/files.ts", "../../src/optimizer/languages/grammar.ts", "../../src/optimizer/languages/types.ts", "../../src/optimizer/languages/typescript.ts", "../../src/optimizer/languages/python.ts", "../../src/optimizer/languages/go.ts", "../../src/optimizer/languages/java.ts", "../../src/optimizer/languages/rust.ts", "../../src/optimizer/languages/symbols.ts", "../../src/optimizer/languages/index.ts", "../../src/optimizer/inspector/index.ts", "../../src/optimizer/inspector/inspect.ts", "../../src/optimizer/pruner/cleanup.ts", "../../src/optimizer/pruner/context.ts", "../../src/optimizer/pruner/session.ts", "../../src/optimizer/pruner/index.ts", "../../src/optimizer/index.ts"],
4
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
5
  "mappings": "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",
6
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"]
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "pi-context-optimizer",
3
- "version": "0.7.0-alpha.2",
2
+ "name": "pi-optimizer",
3
+ "version": "0.7.0-alpha.4",
4
4
  "description": "Context optimization tools for pi coding agent",
5
5
  "type": "module",
6
6
  "main": "./index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "surgent",
3
- "version": "0.7.0-alpha.2",
3
+ "version": "0.7.0-alpha.4",
4
4
  "description": "A pre-built Pi coding agent built around automatic context optimization to keep your sessions longer than it should be",
5
5
  "bin": {
6
6
  "surgent": "./bin/surgent.js"
@@ -1,4 +1,4 @@
1
- # pi-context-optimizer
1
+ # pi-optimizer
2
2
 
3
3
  Context optimization extension for [Pi](https://github.com/earendil-works/pi). It gives coding agents more useful context by improving code navigation and reducing repeated or noisy tool output. It is also built into [surgent](https://github.com/thien2218/surgent).
4
4
 
@@ -6,7 +6,7 @@ Context optimization extension for [Pi](https://github.com/earendil-works/pi). I
6
6
 
7
7
  Long coding sessions accumulate large tool results, repeated file content, and output that no longer helps with current task. That context costs tokens and can distract model from relevant code.
8
8
 
9
- `pi-context-optimizer` keeps useful evidence while removing avoidable noise. It works automatically after installation and adds structural tools for reading only code needed for current task.
9
+ `pi-optimizer` keeps useful evidence while removing avoidable noise. It works automatically after installation and adds structural tools for reading only code needed for current task.
10
10
 
11
11
  ## What it does
12
12
 
@@ -30,7 +30,7 @@ These changes reduce context growth, improve prompt-cache reuse, and leave more
30
30
  Install package through Pi:
31
31
 
32
32
  ```bash
33
- pi install npm:pi-context-optimizer
33
+ pi install npm:pi-optimizer
34
34
  ```
35
35
 
36
36
  Confirm installation:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes