@cesarandreslopez/occ 0.8.9 → 0.8.11

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 (79) hide show
  1. package/README.md +9 -4
  2. package/dist/src/code/build.d.ts +49 -1
  3. package/dist/src/code/build.js +127 -33
  4. package/dist/src/code/build.js.map +1 -1
  5. package/dist/src/code/chunk.d.ts +10 -0
  6. package/dist/src/code/chunk.js +14 -1
  7. package/dist/src/code/chunk.js.map +1 -1
  8. package/dist/src/code/command.js +16 -0
  9. package/dist/src/code/command.js.map +1 -1
  10. package/dist/src/code/discover.d.ts +13 -0
  11. package/dist/src/code/discover.js +49 -2
  12. package/dist/src/code/discover.js.map +1 -1
  13. package/dist/src/code/focus.d.ts +31 -0
  14. package/dist/src/code/focus.js +192 -0
  15. package/dist/src/code/focus.js.map +1 -0
  16. package/dist/src/code/incremental.d.ts +75 -0
  17. package/dist/src/code/incremental.js +257 -0
  18. package/dist/src/code/incremental.js.map +1 -0
  19. package/dist/src/code/map.d.ts +36 -1
  20. package/dist/src/code/map.js +83 -4
  21. package/dist/src/code/map.js.map +1 -1
  22. package/dist/src/code/output.js +28 -4
  23. package/dist/src/code/output.js.map +1 -1
  24. package/dist/src/code/parsers.d.ts +1 -0
  25. package/dist/src/code/parsers.js +1 -1
  26. package/dist/src/code/parsers.js.map +1 -1
  27. package/dist/src/code/rank.d.ts +14 -0
  28. package/dist/src/code/rank.js +58 -0
  29. package/dist/src/code/rank.js.map +1 -1
  30. package/dist/src/code/store.d.ts +20 -0
  31. package/dist/src/code/store.js +262 -109
  32. package/dist/src/code/store.js.map +1 -1
  33. package/dist/src/doc/chunk.d.ts +17 -0
  34. package/dist/src/doc/chunk.js +47 -18
  35. package/dist/src/doc/chunk.js.map +1 -1
  36. package/dist/src/doc/inspect-docx.js +13 -3
  37. package/dist/src/doc/inspect-docx.js.map +1 -1
  38. package/dist/src/doc/inspect-pdf.js +12 -17
  39. package/dist/src/doc/inspect-pdf.js.map +1 -1
  40. package/dist/src/index.d.ts +13 -8
  41. package/dist/src/index.js +9 -5
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/inspect/xlsx-cells.d.ts +8 -0
  44. package/dist/src/inspect/xlsx-cells.js +17 -2
  45. package/dist/src/inspect/xlsx-cells.js.map +1 -1
  46. package/dist/src/markdown/convert.js +45 -27
  47. package/dist/src/markdown/convert.js.map +1 -1
  48. package/dist/src/parsers/docx.js +10 -2
  49. package/dist/src/parsers/docx.js.map +1 -1
  50. package/dist/src/parsers/index.js +5 -0
  51. package/dist/src/parsers/index.js.map +1 -1
  52. package/dist/src/parsers/pdf.js +12 -32
  53. package/dist/src/parsers/pdf.js.map +1 -1
  54. package/dist/src/parsers/xlsx.js +11 -1
  55. package/dist/src/parsers/xlsx.js.map +1 -1
  56. package/dist/src/progress-event.d.ts +3 -1
  57. package/dist/src/progress-event.js +31 -1
  58. package/dist/src/progress-event.js.map +1 -1
  59. package/dist/src/sheet/inspect.js +20 -10
  60. package/dist/src/sheet/inspect.js.map +1 -1
  61. package/dist/src/table/inspect-docx.js +10 -1
  62. package/dist/src/table/inspect-docx.js.map +1 -1
  63. package/dist/src/table/inspect-xlsx.js +15 -5
  64. package/dist/src/table/inspect-xlsx.js.map +1 -1
  65. package/dist/src/utils.d.ts +24 -0
  66. package/dist/src/utils.js +91 -2
  67. package/dist/src/utils.js.map +1 -1
  68. package/dist/src/workspace/bundle.d.ts +24 -0
  69. package/dist/src/workspace/bundle.js +303 -97
  70. package/dist/src/workspace/bundle.js.map +1 -1
  71. package/dist/src/workspace/documents.d.ts +4 -0
  72. package/dist/src/workspace/documents.js +15 -2
  73. package/dist/src/workspace/documents.js.map +1 -1
  74. package/dist/src/workspace/prepare-types.d.ts +15 -0
  75. package/dist/src/workspace/prepare-types.js +18 -1
  76. package/dist/src/workspace/prepare-types.js.map +1 -1
  77. package/dist/src/workspace/prepare.js +10 -2
  78. package/dist/src/workspace/prepare.js.map +1 -1
  79. package/package.json +9 -2
@@ -0,0 +1,257 @@
1
+ import { realpath, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_EXCLUDE_DIRS, discoverCodeFiles, wouldDiscoverPath } from './discover.js';
4
+ import { getLanguageSpec, normalizePath, stripImportSuffix } from './languages.js';
5
+ import { resolveImportPath } from './parsers.js';
6
+ import { abortIfNeeded, createIgnoreMatcher, mapWithConcurrency } from '../utils.js';
7
+ function buildDiff(added, modified, deleted) {
8
+ return {
9
+ added,
10
+ modified,
11
+ deleted,
12
+ hasChanges: added.length > 0 || modified.length > 0 || deleted.length > 0,
13
+ };
14
+ }
15
+ /**
16
+ * Diff the manifest against a full discovery pass: files on disk that are
17
+ * missing from the manifest are added, size/mtime mismatches are modified,
18
+ * and manifest entries absent from discovery are deleted.
19
+ */
20
+ export async function computeManifestDiff(manifest, repoRoot, discoverOptions = {}, signal) {
21
+ const resolvedRoot = path.resolve(repoRoot);
22
+ abortIfNeeded(signal);
23
+ const discovered = await discoverCodeFiles(resolvedRoot, { ...discoverOptions, signal });
24
+ const statted = await mapWithConcurrency(discovered, 32, async (filePath) => {
25
+ try {
26
+ const fileStat = await stat(filePath);
27
+ if (!fileStat.isFile())
28
+ return null;
29
+ return {
30
+ path: filePath,
31
+ relativePath: normalizePath(path.relative(resolvedRoot, filePath)),
32
+ size: fileStat.size,
33
+ mtimeMs: fileStat.mtimeMs,
34
+ };
35
+ }
36
+ catch {
37
+ // Disappeared between discovery and stat — treated as absent.
38
+ return null;
39
+ }
40
+ }, signal);
41
+ const manifestByRel = new Map();
42
+ for (const entry of manifest)
43
+ manifestByRel.set(entry.relativePath, entry);
44
+ const added = [];
45
+ const modified = [];
46
+ const seen = new Set();
47
+ for (const current of statted) {
48
+ if (!current)
49
+ continue;
50
+ seen.add(current.relativePath);
51
+ const previous = manifestByRel.get(current.relativePath);
52
+ if (!previous) {
53
+ added.push(current);
54
+ }
55
+ else if (previous.size !== current.size || previous.mtimeMs !== current.mtimeMs) {
56
+ modified.push(current);
57
+ }
58
+ }
59
+ const deleted = [];
60
+ for (const entry of manifest) {
61
+ if (!seen.has(entry.relativePath)) {
62
+ deleted.push({ path: path.resolve(resolvedRoot, entry.relativePath), relativePath: entry.relativePath });
63
+ }
64
+ }
65
+ return buildDiff(added, modified, deleted);
66
+ }
67
+ /**
68
+ * Watcher fast path: classify an explicit changed-file list without a
69
+ * discovery pass. Entries outside the repo, without a language spec,
70
+ * rejected by the same ignore matcher discovery uses, or that discovery
71
+ * would never yield (dot-segments, excluded directories, symlinks — see
72
+ * wouldDiscoverPath) are dropped — required so the result is equivalent to
73
+ * what a full rebuild would have seen. On case-insensitive filesystems a
74
+ * stat can succeed for a stale casing after a case-only rename; such entries
75
+ * are redirected to the on-disk casing (stale casing deleted if indexed,
76
+ * real casing classified normally).
77
+ */
78
+ export async function classifyChangedFiles(changedFiles, manifest, repoRoot, discoverOptions = {}, signal) {
79
+ const resolvedRoot = path.resolve(repoRoot);
80
+ abortIfNeeded(signal);
81
+ const excludeDir = discoverOptions.excludeDir ?? DEFAULT_EXCLUDE_DIRS;
82
+ const ignoreMatcher = await createIgnoreMatcher(resolvedRoot, {
83
+ excludeDir,
84
+ noGitignore: discoverOptions.noGitignore,
85
+ ignorePatterns: discoverOptions.ignorePatterns,
86
+ overlayIgnorePatterns: discoverOptions.overlayIgnorePatterns,
87
+ });
88
+ const manifestByRel = new Map();
89
+ for (const entry of manifest)
90
+ manifestByRel.set(entry.relativePath, entry);
91
+ const added = [];
92
+ const modified = [];
93
+ const deleted = [];
94
+ const seen = new Set();
95
+ let realRoot;
96
+ // Case-rename redirects append the on-disk casing for another pass.
97
+ const queue = [...changedFiles];
98
+ for (let cursor = 0; cursor < queue.length; cursor++) {
99
+ abortIfNeeded(signal);
100
+ const changed = queue[cursor];
101
+ const absolutePath = path.isAbsolute(changed) ? path.resolve(changed) : path.resolve(resolvedRoot, changed);
102
+ const relativePath = normalizePath(path.relative(resolvedRoot, absolutePath));
103
+ if (relativePath.startsWith('..'))
104
+ continue;
105
+ if (!getLanguageSpec(absolutePath))
106
+ continue;
107
+ if (ignoreMatcher.ignores(relativePath))
108
+ continue;
109
+ if (seen.has(relativePath))
110
+ continue;
111
+ seen.add(relativePath);
112
+ if (!await wouldDiscoverPath(resolvedRoot, absolutePath, excludeDir))
113
+ continue;
114
+ try {
115
+ const fileStat = await stat(absolutePath);
116
+ if (!fileStat.isFile())
117
+ continue;
118
+ // Case-insensitive filesystems (macOS APFS default) stat a stale
119
+ // casing successfully after a case-only rename; indexing it would
120
+ // duplicate the file. Compare against the on-disk casing (realpath
121
+ // is symlink-safe here — wouldDiscoverPath already rejected symlinks)
122
+ // and redirect to the real path.
123
+ realRoot ??= await realpath(resolvedRoot);
124
+ const realRelativePath = normalizePath(path.relative(realRoot, await realpath(absolutePath)));
125
+ if (realRelativePath !== relativePath) {
126
+ if (manifestByRel.has(relativePath))
127
+ deleted.push({ path: absolutePath, relativePath });
128
+ queue.push(path.resolve(resolvedRoot, realRelativePath));
129
+ continue;
130
+ }
131
+ const entry = { path: absolutePath, relativePath, size: fileStat.size, mtimeMs: fileStat.mtimeMs };
132
+ if (manifestByRel.has(relativePath))
133
+ modified.push(entry);
134
+ else
135
+ added.push(entry);
136
+ }
137
+ catch {
138
+ // Absent on disk: a deletion if indexed before, otherwise nothing to do.
139
+ if (manifestByRel.has(relativePath))
140
+ deleted.push({ path: absolutePath, relativePath });
141
+ }
142
+ }
143
+ return buildDiff(added, modified, deleted);
144
+ }
145
+ /**
146
+ * Candidate stems for an import specifier: the last path segment, the same
147
+ * segment without its extension, and the last dotted segment (Python-style
148
+ * `pkg.mod` specifiers). Used only as a conservative prefilter — a match
149
+ * triggers re-resolution, never a direct edit of the cached parse.
150
+ */
151
+ function specifierStems(specifier) {
152
+ const stripped = stripImportSuffix(specifier);
153
+ const lastSegment = stripped.split('/').pop() ?? stripped;
154
+ const stems = new Set([lastSegment]);
155
+ const withoutExtension = lastSegment.replace(/\.[^.]+$/, '');
156
+ if (withoutExtension)
157
+ stems.add(withoutExtension);
158
+ const lastDotted = stripped.split('.').filter(Boolean).pop();
159
+ if (lastDotted)
160
+ stems.add(lastDotted);
161
+ return [...stems];
162
+ }
163
+ /**
164
+ * `ParsedFile.imports[].resolvedPath` is parse-time state: adding or deleting
165
+ * files can change how an *unchanged* importer resolves. Returns the absolute
166
+ * paths of cached files whose imports would resolve differently today, so the
167
+ * caller can re-parse them (imports are never patched in place).
168
+ *
169
+ * Only imports that could plausibly be affected are re-checked: those whose
170
+ * specifier stem matches an added file's basename or parent directory (covers
171
+ * both `./x` → `x.ts` and `./x` → `x/index.ts`, plus extension-priority
172
+ * shadowing of an existing resolution), bare-directory specifiers (`.`/`..`)
173
+ * when an `index.*`/`__init__.py` was added, still-unresolved non-relative
174
+ * specifiers when anything was added (tsconfig `paths` exact aliases like
175
+ * `@api` never stem-match the mapped file's basename), and those whose
176
+ * resolved target was deleted. A flagged import is re-resolved via the same
177
+ * resolveImportPath the parsers use; any difference from the cached
178
+ * annotation flags the file.
179
+ */
180
+ export function findResolutionImpactedFiles(cachedFiles, diff, repoRoot) {
181
+ if (diff.added.length === 0 && diff.deleted.length === 0)
182
+ return [];
183
+ const addedStems = new Set();
184
+ let addedIndexLike = false;
185
+ for (const added of diff.added) {
186
+ const baseName = path.basename(added.path, path.extname(added.path));
187
+ addedStems.add(baseName);
188
+ addedStems.add(path.basename(path.dirname(added.path)));
189
+ if (baseName === 'index' || baseName === '__init__')
190
+ addedIndexLike = true;
191
+ }
192
+ const deletedSet = new Set(diff.deleted.map((entry) => entry.path));
193
+ const hasAdded = diff.added.length > 0;
194
+ const impacted = new Set();
195
+ for (const file of cachedFiles) {
196
+ if (deletedSet.has(file.path))
197
+ continue; // Deleted files are removed, never re-parsed.
198
+ const language = getLanguageSpec(file.path)?.name ?? file.language;
199
+ for (const fileImport of file.imports) {
200
+ const stems = specifierStems(fileImport.specifier);
201
+ const stemMatch = stems.some((stem) => addedStems.has(stem));
202
+ // `.`/`./`/`..`-style specifiers carry no usable stem; a new index.*
203
+ // (or __init__.py) anywhere can change how they resolve.
204
+ const directoryMatch = addedIndexLike
205
+ && stems.every((stem) => stem === '.' || stem === '..' || stem === '');
206
+ // Exact tsconfig `paths` aliases resolve to files whose basenames never
207
+ // intersect the alias stem, so every still-unresolved non-relative
208
+ // specifier is re-checked whenever files appear. Cheap: tsconfig
209
+ // parsing is memoized per repoRoot and misses stay undefined.
210
+ const unresolvedBare = hasAdded
211
+ && fileImport.resolvedPath == null
212
+ && !fileImport.specifier.startsWith('.');
213
+ const targetDeleted = fileImport.resolvedPath != null && deletedSet.has(fileImport.resolvedPath);
214
+ if (!stemMatch && !directoryMatch && !unresolvedBare && !targetDeleted)
215
+ continue;
216
+ const outcome = resolveImportPath(language, { repoRoot }, file.path, fileImport.specifier);
217
+ if (outcome !== fileImport.resolvedPath) {
218
+ impacted.add(file.path);
219
+ break;
220
+ }
221
+ }
222
+ }
223
+ return [...impacted].sort();
224
+ }
225
+ /**
226
+ * Merge cached parse results with fresh ones: drop `removals` (deleted files
227
+ * plus everything re-parsed), insert the fresh entries, and sort both outputs
228
+ * by absolute path with the default string comparator — reproducing the
229
+ * `discovered.sort()` order a full build would produce, which is what makes
230
+ * incremental output deep-equal a fresh full build.
231
+ */
232
+ export function spliceIndexInputs(cachedFiles, cachedSkipped, removals, fresh) {
233
+ const parsedByPath = new Map();
234
+ for (const file of cachedFiles)
235
+ parsedByPath.set(file.path, file);
236
+ const skippedByPath = new Map();
237
+ for (const skipped of cachedSkipped)
238
+ skippedByPath.set(skipped.path, skipped);
239
+ for (const removal of removals) {
240
+ parsedByPath.delete(removal);
241
+ skippedByPath.delete(removal);
242
+ }
243
+ for (const file of fresh.parsedFiles) {
244
+ parsedByPath.set(file.path, file);
245
+ skippedByPath.delete(file.path);
246
+ }
247
+ for (const skipped of fresh.skippedFiles) {
248
+ skippedByPath.set(skipped.path, skipped);
249
+ parsedByPath.delete(skipped.path);
250
+ }
251
+ const byPath = (left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0;
252
+ return {
253
+ parsedFiles: [...parsedByPath.values()].sort(byPath),
254
+ skippedFiles: [...skippedByPath.values()].sort(byPath),
255
+ };
256
+ }
257
+ //# sourceMappingURL=incremental.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../../src/code/incremental.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,13 @@ export declare const RepoMapModeSchema: z.ZodEnum<{
26
26
  pack: "pack";
27
27
  }>;
28
28
  export type RepoMapMode = z.infer<typeof RepoMapModeSchema>;
29
+ /** Opt-in query/path focus. Absent or empty → global structural rank only (no behavior change). */
30
+ export declare const RepoMapFocusSchema: z.ZodObject<{
31
+ query: z.ZodOptional<z.ZodString>;
32
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
33
+ graphDepth: z.ZodOptional<z.ZodNumber>;
34
+ }, z.core.$strip>;
35
+ export type RepoMapFocus = z.infer<typeof RepoMapFocusSchema>;
29
36
  export declare const RepoMapOptionsSchema: z.ZodObject<{
30
37
  tokenBudget: z.ZodNumber;
31
38
  mode: z.ZodOptional<z.ZodEnum<{
@@ -52,6 +59,11 @@ export declare const RepoMapOptionsSchema: z.ZodObject<{
52
59
  biasExports: z.ZodOptional<z.ZodBoolean>;
53
60
  includeExternal: z.ZodOptional<z.ZodBoolean>;
54
61
  }, z.core.$strip>>;
62
+ focus: z.ZodOptional<z.ZodObject<{
63
+ query: z.ZodOptional<z.ZodString>;
64
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
65
+ graphDepth: z.ZodOptional<z.ZodNumber>;
66
+ }, z.core.$strip>>;
55
67
  }, z.core.$strip>;
56
68
  type RepoMapSerializableOptions = z.infer<typeof RepoMapOptionsSchema>;
57
69
  /** Runtime options. `countTokens` is a function, so it lives here, off the Zod schema. */
@@ -85,8 +97,17 @@ export declare const RepoMapEntrySchema: z.ZodObject<{
85
97
  contentReason: z.ZodOptional<z.ZodString>;
86
98
  tokens: z.ZodNumber;
87
99
  droppedSymbols: z.ZodNumber;
100
+ focusScore: z.ZodOptional<z.ZodNumber>;
101
+ focusReasons: z.ZodOptional<z.ZodArray<z.ZodString>>;
88
102
  }, z.core.$strip>;
89
103
  export type RepoMapEntry = z.infer<typeof RepoMapEntrySchema>;
104
+ /** Echoed focus selector plus how many files the focus touched. */
105
+ export declare const RepoMapFocusResultSchema: z.ZodObject<{
106
+ query: z.ZodOptional<z.ZodString>;
107
+ paths: z.ZodArray<z.ZodString>;
108
+ matchedFiles: z.ZodNumber;
109
+ }, z.core.$strip>;
110
+ export type RepoMapFocusResult = z.infer<typeof RepoMapFocusResultSchema>;
90
111
  export declare const RepoMapResultSchema: z.ZodObject<{
91
112
  mode: z.ZodEnum<{
92
113
  map: "map";
@@ -120,12 +141,19 @@ export declare const RepoMapResultSchema: z.ZodObject<{
120
141
  contentReason: z.ZodOptional<z.ZodString>;
121
142
  tokens: z.ZodNumber;
122
143
  droppedSymbols: z.ZodNumber;
144
+ focusScore: z.ZodOptional<z.ZodNumber>;
145
+ focusReasons: z.ZodOptional<z.ZodArray<z.ZodString>>;
123
146
  }, z.core.$strip>>;
124
147
  droppedFiles: z.ZodNumber;
125
148
  droppedSymbols: z.ZodNumber;
126
149
  truncated: z.ZodBoolean;
127
150
  rankIterations: z.ZodNumber;
128
151
  rankConverged: z.ZodBoolean;
152
+ focus: z.ZodOptional<z.ZodObject<{
153
+ query: z.ZodOptional<z.ZodString>;
154
+ paths: z.ZodArray<z.ZodString>;
155
+ matchedFiles: z.ZodNumber;
156
+ }, z.core.$strip>>;
129
157
  }, z.core.$strip>;
130
158
  export type RepoMapResult = z.infer<typeof RepoMapResultSchema>;
131
159
  /**
@@ -140,6 +168,13 @@ export declare function repoMapSignatureLine(symbol: RepoMapSymbol): string;
140
168
  * matches the emitted document exactly.
141
169
  */
142
170
  export declare function repoMapEntryToMarkdown(entry: RepoMapEntry, mode: RepoMapMode): string;
143
- /** Build a token-budgeted, importance-ranked repo map (or pack) from an index. */
171
+ /**
172
+ * Build a token-budgeted, importance-ranked repo map (or pack) from an index.
173
+ *
174
+ * The index should be treated as immutable after construction: the underlying
175
+ * ranking is memoized per index object (see `rankNodesCached`) with only a
176
+ * `files`/`nodes`/`edges` length fingerprint, so in-place mutations that keep
177
+ * those lengths constant are not detected and reuse the cached ranking.
178
+ */
144
179
  export declare function buildRepoMap(index: CodebaseIndex, options: RepoMapOptions): RepoMapResult;
145
180
  export {};
@@ -16,9 +16,16 @@ import { z } from 'zod';
16
16
  import { estimateTokenCount } from '../tokens.js';
17
17
  import { extractKeySection } from './query.js';
18
18
  import { toNormalizedSymbolKind } from './types.js';
19
- import { rankNodes, RankOptionsSchema } from './rank.js';
19
+ import { rankNodesCached, RankOptionsSchema } from './rank.js';
20
+ import { computeFocusScores } from './focus.js';
20
21
  export const RepoMapFormatSchema = z.enum(['markdown', 'xml', 'json', 'plain']);
21
22
  export const RepoMapModeSchema = z.enum(['map', 'pack']);
23
+ /** Opt-in query/path focus. Absent or empty → global structural rank only (no behavior change). */
24
+ export const RepoMapFocusSchema = z.object({
25
+ query: z.string().optional(),
26
+ paths: z.array(z.string()).optional(),
27
+ graphDepth: z.number().int().nonnegative().optional(),
28
+ });
22
29
  export const RepoMapOptionsSchema = z.object({
23
30
  tokenBudget: z.number().int().positive(),
24
31
  mode: RepoMapModeSchema.optional(),
@@ -26,6 +33,7 @@ export const RepoMapOptionsSchema = z.object({
26
33
  compress: z.boolean().optional(),
27
34
  maxSymbolsPerFile: z.number().int().positive().optional(),
28
35
  rank: RankOptionsSchema.optional(),
36
+ focus: RepoMapFocusSchema.optional(),
29
37
  });
30
38
  export const RepoMapSymbolSchema = z.object({
31
39
  name: z.string(),
@@ -46,6 +54,16 @@ export const RepoMapEntrySchema = z.object({
46
54
  contentReason: z.string().optional(),
47
55
  tokens: z.number(),
48
56
  droppedSymbols: z.number(),
57
+ /** 0–100 focus relevance (present only when a focus is active). */
58
+ focusScore: z.number().optional(),
59
+ /** Human-readable reasons this file matched the focus. */
60
+ focusReasons: z.array(z.string()).optional(),
61
+ });
62
+ /** Echoed focus selector plus how many files the focus touched. */
63
+ export const RepoMapFocusResultSchema = z.object({
64
+ query: z.string().optional(),
65
+ paths: z.array(z.string()),
66
+ matchedFiles: z.number(),
49
67
  });
50
68
  export const RepoMapResultSchema = z.object({
51
69
  mode: RepoMapModeSchema,
@@ -60,9 +78,27 @@ export const RepoMapResultSchema = z.object({
60
78
  truncated: z.boolean(),
61
79
  rankIterations: z.number(),
62
80
  rankConverged: z.boolean(),
81
+ focus: RepoMapFocusResultSchema.optional(),
63
82
  });
64
83
  const APPROX_CHARS_PER_TOKEN = 4;
65
84
  const DEFAULT_COMPRESS_CHARS = 4_000;
85
+ // Focus blend: `combined = global * 0.35 + focus * 0.65`. The focus score is
86
+ // normalized against a FIXED saturation (not a per-run max) so a strong query
87
+ // hit stays high even when another file has a huge path score.
88
+ const FOCUS_SATURATION = 10;
89
+ const FOCUS_GLOBAL_WEIGHT = 0.35;
90
+ const FOCUS_RELEVANCE_WEIGHT = 0.65;
91
+ function round1(value) {
92
+ return Math.round(value * 10) / 10;
93
+ }
94
+ /** A focus is active only if it carries a non-blank query term or path. */
95
+ function isFocusActive(focus) {
96
+ if (focus == null)
97
+ return false;
98
+ if ((focus.query ?? '').trim().length > 0)
99
+ return true;
100
+ return (focus.paths ?? []).some((value) => value.trim().length > 0);
101
+ }
66
102
  function symbolKey(parts) {
67
103
  return [parts.type, parts.name, parts.line ?? '', parts.containerName ?? ''].join('|');
68
104
  }
@@ -142,14 +178,24 @@ function buildContentEntry(file, charBudget) {
142
178
  return null;
143
179
  }
144
180
  }
145
- /** Build a token-budgeted, importance-ranked repo map (or pack) from an index. */
181
+ /**
182
+ * Build a token-budgeted, importance-ranked repo map (or pack) from an index.
183
+ *
184
+ * The index should be treated as immutable after construction: the underlying
185
+ * ranking is memoized per index object (see `rankNodesCached`) with only a
186
+ * `files`/`nodes`/`edges` length fingerprint, so in-place mutations that keep
187
+ * those lengths constant are not detected and reuse the cached ranking.
188
+ */
146
189
  export function buildRepoMap(index, options) {
147
190
  const mode = options.mode ?? 'map';
148
191
  const format = options.format ?? 'markdown';
149
192
  const compress = options.compress ?? false;
150
193
  const countTokens = options.countTokens ?? estimateTokenCount;
151
194
  const budget = options.tokenBudget;
152
- const ranking = rankNodes(index, options.rank);
195
+ // Cached per index object: repeated map calls (e.g. focused maps) skip
196
+ // PageRank. The shared RankResult is read-only here — fileScores is copied
197
+ // before any sort and nodes are only iterated.
198
+ const ranking = rankNodesCached(index, options.rank);
153
199
  const fileByPath = new Map();
154
200
  for (const file of index.files)
155
201
  fileByPath.set(file.path, file);
@@ -163,11 +209,35 @@ export function buildRepoMap(index, options) {
163
209
  else
164
210
  rankedSymbolsByPath.set(node.path, [node]);
165
211
  }
212
+ // Focus (opt-in): blend per-file relevance with the global structural rank and
213
+ // re-sort the admission order. The greedy loop below only depends on iteration
214
+ // order, so this is the entire behavioral change — budgeting is untouched.
215
+ const focus = options.focus;
216
+ let orderedFileScores = ranking.fileScores;
217
+ let focusByPath;
218
+ let focusResult;
219
+ if (isFocusActive(focus)) {
220
+ focusByPath = computeFocusScores(index, focus);
221
+ const focusScores = focusByPath;
222
+ orderedFileScores = [...ranking.fileScores]
223
+ .map((fileScore) => {
224
+ const focusNormalized = Math.min(1, (focusScores.get(fileScore.path)?.score ?? 0) / FOCUS_SATURATION);
225
+ const globalNormalized = fileScore.normalizedScore / 100;
226
+ return { fileScore, combined: globalNormalized * FOCUS_GLOBAL_WEIGHT + focusNormalized * FOCUS_RELEVANCE_WEIGHT };
227
+ })
228
+ .sort((a, b) => b.combined - a.combined)
229
+ .map((item) => item.fileScore);
230
+ focusResult = {
231
+ query: (focus.query ?? '').trim() || undefined,
232
+ paths: (focus.paths ?? []).map((value) => value.trim()).filter(Boolean),
233
+ matchedFiles: [...focusByPath.values()].filter((entry) => entry.score > 0).length,
234
+ };
235
+ }
166
236
  const entries = [];
167
237
  let tokensUsed = 0;
168
238
  let droppedFiles = 0;
169
239
  let droppedSymbols = 0;
170
- for (const fileScore of ranking.fileScores) {
240
+ for (const fileScore of orderedFileScores) {
171
241
  const file = fileByPath.get(fileScore.path);
172
242
  if (!file)
173
243
  continue;
@@ -211,6 +281,14 @@ export function buildRepoMap(index, options) {
211
281
  tokens: 0,
212
282
  droppedSymbols: 0,
213
283
  };
284
+ // Focus metadata stays OUT of `repoMapEntryToMarkdown`, so token budgeting
285
+ // is identical whether or not a focus is active.
286
+ if (focusByPath) {
287
+ const fileFocus = focusByPath.get(file.path);
288
+ entry.focusScore = round1(Math.min(1, (fileFocus?.score ?? 0) / FOCUS_SATURATION) * 100);
289
+ if (fileFocus && fileFocus.reasons.length > 0)
290
+ entry.focusReasons = fileFocus.reasons;
291
+ }
214
292
  entry.tokens = countTokens(repoMapEntryToMarkdown(entry, mode));
215
293
  return entry;
216
294
  };
@@ -270,6 +348,7 @@ export function buildRepoMap(index, options) {
270
348
  truncated: droppedFiles > 0 || droppedSymbols > 0,
271
349
  rankIterations: ranking.iterations,
272
350
  rankConverged: ranking.converged,
351
+ focus: focusResult,
273
352
  };
274
353
  }
275
354
  //# sourceMappingURL=map.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map.js","sourceRoot":"","sources":["../../../src/code/map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../../src/code/map.ts"],"names":[],"mappings":"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"}
@@ -306,9 +306,23 @@ export function formatModuleCoupling(result, ci = false) {
306
306
  // ── Repo map / pack ───────────────────────────────────────────────────────
307
307
  // Repo-map output is meant to be pasted into an LLM, so it is deliberately
308
308
  // plain (no ANSI colors) regardless of the `ci` flag.
309
+ /** One-line description of an active focus, or '' when there is none. */
310
+ function focusDescriptor(result) {
311
+ const focus = result.focus;
312
+ if (!focus)
313
+ return '';
314
+ const parts = [];
315
+ if (focus.query)
316
+ parts.push(`query "${focus.query}"`);
317
+ if (focus.paths.length > 0)
318
+ parts.push(`${focus.paths.length} path(s)`);
319
+ const what = parts.length > 0 ? parts.join(' + ') : 'focus';
320
+ return `${what}, ${focus.matchedFiles} matched`;
321
+ }
309
322
  function repoMapHeader(result) {
310
323
  const tokenizer = result.tokenizer && result.tokenizer !== 'heuristic' ? `, ${result.tokenizer}` : '';
311
- return `# Repo Map — ${result.entries.length}/${result.totalFiles} files, ${result.tokensUsed}/${result.tokenBudget} tokens${tokenizer}`;
324
+ const focus = result.focus ? ` focus: ${focusDescriptor(result)}` : '';
325
+ return `# Repo Map — ${result.entries.length}/${result.totalFiles} files, ${result.tokensUsed}/${result.tokenBudget} tokens${tokenizer}${focus}`;
312
326
  }
313
327
  function repoMapFooter(result) {
314
328
  if (!result.truncated)
@@ -330,8 +344,9 @@ export function formatRepoMapMarkdown(result) {
330
344
  return blocks.join('\n\n') + '\n';
331
345
  }
332
346
  export function formatRepoMapPlain(result) {
347
+ const focus = result.focus ? ` — focus: ${focusDescriptor(result)}` : '';
333
348
  const lines = [
334
- `Repo Map (${result.entries.length}/${result.totalFiles} files, ${result.tokensUsed}/${result.tokenBudget} tokens)`,
349
+ `Repo Map (${result.entries.length}/${result.totalFiles} files, ${result.tokensUsed}/${result.tokenBudget} tokens)${focus}`,
335
350
  '',
336
351
  ];
337
352
  for (const entry of result.entries) {
@@ -360,7 +375,8 @@ function escapeXml(value) {
360
375
  .replace(/"/g, '&quot;');
361
376
  }
362
377
  function repoMapEntryToXml(entry, mode) {
363
- const lines = [` <file path="${escapeXml(entry.relativePath)}" score="${entry.normalizedScore.toFixed(1)}" language="${escapeXml(entry.language)}">`];
378
+ const focusAttr = entry.focusScore != null ? ` focusScore="${entry.focusScore.toFixed(1)}"` : '';
379
+ const lines = [` <file path="${escapeXml(entry.relativePath)}" score="${entry.normalizedScore.toFixed(1)}"${focusAttr} language="${escapeXml(entry.language)}">`];
364
380
  for (const symbol of entry.symbols) {
365
381
  lines.push(` <symbol kind="${escapeXml(symbol.kind)}" exported="${symbol.exported}"${symbol.line != null ? ` line="${symbol.line}"` : ''}>${escapeXml(symbol.signature)}</symbol>`);
366
382
  }
@@ -370,9 +386,17 @@ function repoMapEntryToXml(entry, mode) {
370
386
  lines.push(' </file>');
371
387
  return lines.join('\n');
372
388
  }
389
+ function repoMapFocusXmlAttrs(result) {
390
+ const focus = result.focus;
391
+ if (!focus)
392
+ return '';
393
+ const query = focus.query ? ` focusQuery="${escapeXml(focus.query)}"` : '';
394
+ const paths = focus.paths.length > 0 ? ` focusPaths="${escapeXml(focus.paths.join(';'))}"` : '';
395
+ return `${query}${paths} focusMatched="${focus.matchedFiles}"`;
396
+ }
373
397
  export function formatRepoMapXml(result) {
374
398
  const lines = [
375
- `<repomap mode="${result.mode}" tokens="${result.tokensUsed}" budget="${result.tokenBudget}" files="${result.entries.length}" totalFiles="${result.totalFiles}"${result.truncated ? ' truncated="true"' : ''}>`,
399
+ `<repomap mode="${result.mode}" tokens="${result.tokensUsed}" budget="${result.tokenBudget}" files="${result.entries.length}" totalFiles="${result.totalFiles}"${result.truncated ? ' truncated="true"' : ''}${repoMapFocusXmlAttrs(result)}>`,
376
400
  ];
377
401
  for (const entry of result.entries)
378
402
  lines.push(repoMapEntryToXml(entry, result.mode));