token-pilot 0.1.1

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 (142) hide show
  1. package/.claude-plugin/hooks/hooks.json +15 -0
  2. package/.claude-plugin/marketplace.json +15 -0
  3. package/.claude-plugin/plugin.json +9 -0
  4. package/.mcp.json +8 -0
  5. package/CHANGELOG.md +48 -0
  6. package/README.md +282 -0
  7. package/dist/ast-index/binary-manager.d.ts +15 -0
  8. package/dist/ast-index/binary-manager.d.ts.map +1 -0
  9. package/dist/ast-index/binary-manager.js +222 -0
  10. package/dist/ast-index/binary-manager.js.map +1 -0
  11. package/dist/ast-index/client.d.ts +48 -0
  12. package/dist/ast-index/client.d.ts.map +1 -0
  13. package/dist/ast-index/client.js +371 -0
  14. package/dist/ast-index/client.js.map +1 -0
  15. package/dist/ast-index/tar-extract.d.ts +6 -0
  16. package/dist/ast-index/tar-extract.d.ts.map +1 -0
  17. package/dist/ast-index/tar-extract.js +39 -0
  18. package/dist/ast-index/tar-extract.js.map +1 -0
  19. package/dist/ast-index/types.d.ts +78 -0
  20. package/dist/ast-index/types.d.ts.map +1 -0
  21. package/dist/ast-index/types.js +6 -0
  22. package/dist/ast-index/types.js.map +1 -0
  23. package/dist/config/defaults.d.ts +3 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +51 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/loader.d.ts +3 -0
  28. package/dist/config/loader.d.ts.map +1 -0
  29. package/dist/config/loader.js +31 -0
  30. package/dist/config/loader.js.map +1 -0
  31. package/dist/core/context-registry.d.ts +31 -0
  32. package/dist/core/context-registry.d.ts.map +1 -0
  33. package/dist/core/context-registry.js +133 -0
  34. package/dist/core/context-registry.js.map +1 -0
  35. package/dist/core/file-cache.d.ts +34 -0
  36. package/dist/core/file-cache.d.ts.map +1 -0
  37. package/dist/core/file-cache.js +120 -0
  38. package/dist/core/file-cache.js.map +1 -0
  39. package/dist/core/format-duration.d.ts +5 -0
  40. package/dist/core/format-duration.d.ts.map +1 -0
  41. package/dist/core/format-duration.js +13 -0
  42. package/dist/core/format-duration.js.map +1 -0
  43. package/dist/core/session-analytics.d.ts +26 -0
  44. package/dist/core/session-analytics.d.ts.map +1 -0
  45. package/dist/core/session-analytics.js +91 -0
  46. package/dist/core/session-analytics.js.map +1 -0
  47. package/dist/core/symbol-resolver.d.ts +21 -0
  48. package/dist/core/symbol-resolver.d.ts.map +1 -0
  49. package/dist/core/symbol-resolver.js +102 -0
  50. package/dist/core/symbol-resolver.js.map +1 -0
  51. package/dist/core/token-estimator.d.ts +10 -0
  52. package/dist/core/token-estimator.d.ts.map +1 -0
  53. package/dist/core/token-estimator.js +22 -0
  54. package/dist/core/token-estimator.js.map +1 -0
  55. package/dist/core/validation.d.ts +77 -0
  56. package/dist/core/validation.d.ts.map +1 -0
  57. package/dist/core/validation.js +208 -0
  58. package/dist/core/validation.js.map +1 -0
  59. package/dist/formatters/structure.d.ts +13 -0
  60. package/dist/formatters/structure.d.ts.map +1 -0
  61. package/dist/formatters/structure.js +90 -0
  62. package/dist/formatters/structure.js.map +1 -0
  63. package/dist/git/file-watcher.d.ts +17 -0
  64. package/dist/git/file-watcher.d.ts.map +1 -0
  65. package/dist/git/file-watcher.js +54 -0
  66. package/dist/git/file-watcher.js.map +1 -0
  67. package/dist/git/watcher.d.ts +25 -0
  68. package/dist/git/watcher.d.ts.map +1 -0
  69. package/dist/git/watcher.js +95 -0
  70. package/dist/git/watcher.js.map +1 -0
  71. package/dist/handlers/class-hierarchy.d.ts +11 -0
  72. package/dist/handlers/class-hierarchy.d.ts.map +1 -0
  73. package/dist/handlers/class-hierarchy.js +28 -0
  74. package/dist/handlers/class-hierarchy.js.map +1 -0
  75. package/dist/handlers/export-ast-index.d.ts +19 -0
  76. package/dist/handlers/export-ast-index.d.ts.map +1 -0
  77. package/dist/handlers/export-ast-index.js +107 -0
  78. package/dist/handlers/export-ast-index.js.map +1 -0
  79. package/dist/handlers/find-implementations.d.ts +11 -0
  80. package/dist/handlers/find-implementations.d.ts.map +1 -0
  81. package/dist/handlers/find-implementations.js +25 -0
  82. package/dist/handlers/find-implementations.js.map +1 -0
  83. package/dist/handlers/find-usages.d.ts +11 -0
  84. package/dist/handlers/find-usages.d.ts.map +1 -0
  85. package/dist/handlers/find-usages.js +23 -0
  86. package/dist/handlers/find-usages.js.map +1 -0
  87. package/dist/handlers/non-code.d.ts +25 -0
  88. package/dist/handlers/non-code.d.ts.map +1 -0
  89. package/dist/handlers/non-code.js +152 -0
  90. package/dist/handlers/non-code.js.map +1 -0
  91. package/dist/handlers/project-overview.d.ts +8 -0
  92. package/dist/handlers/project-overview.d.ts.map +1 -0
  93. package/dist/handlers/project-overview.js +84 -0
  94. package/dist/handlers/project-overview.js.map +1 -0
  95. package/dist/handlers/read-diff.d.ts +13 -0
  96. package/dist/handlers/read-diff.d.ts.map +1 -0
  97. package/dist/handlers/read-diff.js +174 -0
  98. package/dist/handlers/read-diff.js.map +1 -0
  99. package/dist/handlers/read-range.d.ts +14 -0
  100. package/dist/handlers/read-range.d.ts.map +1 -0
  101. package/dist/handlers/read-range.js +44 -0
  102. package/dist/handlers/read-range.js.map +1 -0
  103. package/dist/handlers/read-symbol.d.ts +16 -0
  104. package/dist/handlers/read-symbol.d.ts.map +1 -0
  105. package/dist/handlers/read-symbol.js +59 -0
  106. package/dist/handlers/read-symbol.js.map +1 -0
  107. package/dist/handlers/search-code.d.ts +14 -0
  108. package/dist/handlers/search-code.d.ts.map +1 -0
  109. package/dist/handlers/search-code.js +27 -0
  110. package/dist/handlers/search-code.js.map +1 -0
  111. package/dist/handlers/smart-read-many.d.ts +14 -0
  112. package/dist/handlers/smart-read-many.d.ts.map +1 -0
  113. package/dist/handlers/smart-read-many.js +32 -0
  114. package/dist/handlers/smart-read-many.js.map +1 -0
  115. package/dist/handlers/smart-read.d.ts +18 -0
  116. package/dist/handlers/smart-read.d.ts.map +1 -0
  117. package/dist/handlers/smart-read.js +86 -0
  118. package/dist/handlers/smart-read.js.map +1 -0
  119. package/dist/hooks/installer.d.ts +16 -0
  120. package/dist/hooks/installer.d.ts.map +1 -0
  121. package/dist/hooks/installer.js +89 -0
  122. package/dist/hooks/installer.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +120 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/integration/context-mode-detector.d.ts +16 -0
  128. package/dist/integration/context-mode-detector.d.ts.map +1 -0
  129. package/dist/integration/context-mode-detector.js +53 -0
  130. package/dist/integration/context-mode-detector.js.map +1 -0
  131. package/dist/server.d.ts +36 -0
  132. package/dist/server.d.ts.map +1 -0
  133. package/dist/server.js +375 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/types.d.ts +122 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +5 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +67 -0
  140. package/skills/install/SKILL.md +14 -0
  141. package/skills/stats/SKILL.md +8 -0
  142. package/start.sh +27 -0
@@ -0,0 +1,84 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ export async function handleProjectOverview(projectRoot, astIndex) {
4
+ const lines = [
5
+ `PROJECT OVERVIEW: ${projectRoot}`,
6
+ '',
7
+ ];
8
+ // 1. Try to get ast-index stats
9
+ try {
10
+ const statsRaw = await astIndex.search('', { maxResults: 0 });
11
+ // stats via the stats method is better
12
+ }
13
+ catch {
14
+ // ignore
15
+ }
16
+ // 2. Read package.json / Cargo.toml etc. for project info
17
+ const projectInfo = await detectProjectInfo(projectRoot);
18
+ if (projectInfo) {
19
+ lines.push(`Project: ${projectInfo.name} v${projectInfo.version}`);
20
+ if (projectInfo.description)
21
+ lines.push(`Description: ${projectInfo.description}`);
22
+ lines.push(`Type: ${projectInfo.type}`);
23
+ lines.push('');
24
+ }
25
+ // 3. Use ast-index map for compact project structure
26
+ try {
27
+ const mapResult = await execAstIndexMap(astIndex);
28
+ if (mapResult) {
29
+ lines.push('PROJECT MAP:');
30
+ lines.push(mapResult);
31
+ lines.push('');
32
+ }
33
+ }
34
+ catch {
35
+ // map not available
36
+ }
37
+ lines.push('HINT: Use smart_read() on individual files, or search_code() to find specific symbols.');
38
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
39
+ }
40
+ async function detectProjectInfo(projectRoot) {
41
+ // Try package.json
42
+ try {
43
+ const pkg = JSON.parse(await readFile(resolve(projectRoot, 'package.json'), 'utf-8'));
44
+ return {
45
+ name: pkg.name ?? 'unknown',
46
+ version: pkg.version ?? '0.0.0',
47
+ description: pkg.description,
48
+ type: 'Node.js/TypeScript',
49
+ };
50
+ }
51
+ catch { /* not a node project */ }
52
+ // Try Cargo.toml
53
+ try {
54
+ const cargo = await readFile(resolve(projectRoot, 'Cargo.toml'), 'utf-8');
55
+ const name = cargo.match(/^name\s*=\s*"(.+?)"/m)?.[1] ?? 'unknown';
56
+ const version = cargo.match(/^version\s*=\s*"(.+?)"/m)?.[1] ?? '0.0.0';
57
+ return { name, version, type: 'Rust' };
58
+ }
59
+ catch { /* not a rust project */ }
60
+ // Try pyproject.toml
61
+ try {
62
+ const pyproject = await readFile(resolve(projectRoot, 'pyproject.toml'), 'utf-8');
63
+ const name = pyproject.match(/^name\s*=\s*"(.+?)"/m)?.[1] ?? 'unknown';
64
+ const version = pyproject.match(/^version\s*=\s*"(.+?)"/m)?.[1] ?? '0.0.0';
65
+ return { name, version, type: 'Python' };
66
+ }
67
+ catch { /* not a python project */ }
68
+ // Try go.mod
69
+ try {
70
+ const gomod = await readFile(resolve(projectRoot, 'go.mod'), 'utf-8');
71
+ const name = gomod.match(/^module\s+(.+)/m)?.[1] ?? 'unknown';
72
+ return { name, version: '0.0.0', type: 'Go' };
73
+ }
74
+ catch { /* not a go project */ }
75
+ return null;
76
+ }
77
+ async function execAstIndexMap(astIndex) {
78
+ // ast-index map returns a compact project structure
79
+ // We access it via the internal exec by using search with empty query
80
+ // Actually, we need to expose a map() method. For now, return null.
81
+ // This will be enhanced when we expose more ast-index commands.
82
+ return null;
83
+ }
84
+ //# sourceMappingURL=project-overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-overview.js","sourceRoot":"","sources":["../../src/handlers/project-overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FileCache } from '../core/file-cache.js';
2
+ import type { ContextRegistry } from '../core/context-registry.js';
3
+ export interface ReadDiffArgs {
4
+ path: string;
5
+ context_lines?: number;
6
+ }
7
+ export declare function handleReadDiff(args: ReadDiffArgs, projectRoot: string, fileCache: FileCache, contextRegistry: ContextRegistry): Promise<{
8
+ content: Array<{
9
+ type: 'text';
10
+ text: string;
11
+ }>;
12
+ }>;
13
+ //# sourceMappingURL=read-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-diff.d.ts","sourceRoot":"","sources":["../../src/handlers/read-diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAgE7D"}
@@ -0,0 +1,174 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { createHash } from 'node:crypto';
3
+ import { estimateTokens, formatSavings } from '../core/token-estimator.js';
4
+ import { resolveSafePath } from '../core/validation.js';
5
+ export async function handleReadDiff(args, projectRoot, fileCache, contextRegistry) {
6
+ const absPath = resolveSafePath(projectRoot, args.path);
7
+ const contextLines = args.context_lines ?? 3;
8
+ // Get cached (previous) version
9
+ const cached = fileCache.get(absPath);
10
+ if (!cached) {
11
+ return {
12
+ content: [{
13
+ type: 'text',
14
+ text: `No previous read of ${args.path}. Use smart_read() first, then read_diff() after changes.`,
15
+ }],
16
+ };
17
+ }
18
+ // Read current version
19
+ const currentContent = await readFile(absPath, 'utf-8');
20
+ const currentHash = createHash('sha256').update(currentContent).digest('hex');
21
+ // No changes?
22
+ if (currentHash === cached.hash) {
23
+ return {
24
+ content: [{
25
+ type: 'text',
26
+ text: `NO CHANGES: ${args.path} is unchanged since last read.`,
27
+ }],
28
+ };
29
+ }
30
+ // Compute diff
31
+ const oldLines = cached.lines;
32
+ const newLines = currentContent.split('\n');
33
+ const diff = computeDiff(oldLines, newLines, contextLines);
34
+ const outputLines = [
35
+ `DIFF: ${args.path} (modified since last read)`,
36
+ `PREVIOUS: ${cached.hash.slice(0, 7)} → CURRENT: ${currentHash.slice(0, 7)}`,
37
+ '',
38
+ ...diff,
39
+ ];
40
+ const output = outputLines.join('\n');
41
+ const diffTokens = estimateTokens(output);
42
+ const fullTokens = estimateTokens(currentContent);
43
+ outputLines.push('');
44
+ outputLines.push(formatSavings(diffTokens, fullTokens));
45
+ // Update cache with new content so next diff works correctly
46
+ const fileStat = await stat(absPath);
47
+ fileCache.set(absPath, {
48
+ structure: cached.structure, // reuse structure until next smart_read
49
+ content: currentContent,
50
+ lines: newLines,
51
+ mtime: fileStat.mtimeMs,
52
+ hash: currentHash,
53
+ lastAccess: Date.now(),
54
+ });
55
+ // Update context registry hash
56
+ contextRegistry.setContentHash(absPath, currentHash);
57
+ return { content: [{ type: 'text', text: outputLines.join('\n') }] };
58
+ }
59
+ /**
60
+ * O(n) line diff using a Map for lookups instead of Array.includes().
61
+ * Groups consecutive changes into hunks with surrounding context.
62
+ */
63
+ function computeDiff(oldLines, newLines, contextLines) {
64
+ // Build a set of line -> positions in newLines for O(1) lookup
65
+ const newLineIndex = new Map();
66
+ for (let i = 0; i < newLines.length; i++) {
67
+ const positions = newLineIndex.get(newLines[i]);
68
+ if (positions) {
69
+ positions.push(i);
70
+ }
71
+ else {
72
+ newLineIndex.set(newLines[i], [i]);
73
+ }
74
+ }
75
+ // Walk both arrays, matching lines greedily
76
+ const changes = [];
77
+ let oi = 0;
78
+ let ni = 0;
79
+ while (oi < oldLines.length || ni < newLines.length) {
80
+ if (oi < oldLines.length && ni < newLines.length && oldLines[oi] === newLines[ni]) {
81
+ changes.push({ type: 'same', line: newLines[ni], oldNum: oi + 1, newNum: ni + 1 });
82
+ oi++;
83
+ ni++;
84
+ }
85
+ else if (oi < oldLines.length && !newLineIndex.has(oldLines[oi])) {
86
+ // Line only exists in old — it was removed
87
+ changes.push({ type: 'removed', line: oldLines[oi], oldNum: oi + 1 });
88
+ oi++;
89
+ }
90
+ else if (ni < newLines.length) {
91
+ // Check if the old line exists later in new (i.e., we need to consume added lines first)
92
+ const oldLinePositions = oi < oldLines.length ? newLineIndex.get(oldLines[oi]) : undefined;
93
+ if (oldLinePositions && oldLinePositions.some(p => p >= ni)) {
94
+ // Old line will match later — current newLine is added
95
+ changes.push({ type: 'added', line: newLines[ni], newNum: ni + 1 });
96
+ ni++;
97
+ }
98
+ else if (oi < oldLines.length) {
99
+ // Old line not found ahead — it's removed
100
+ changes.push({ type: 'removed', line: oldLines[oi], oldNum: oi + 1 });
101
+ oi++;
102
+ }
103
+ else {
104
+ // Only new lines remain
105
+ changes.push({ type: 'added', line: newLines[ni], newNum: ni + 1 });
106
+ ni++;
107
+ }
108
+ }
109
+ else {
110
+ // Only old lines remain
111
+ changes.push({ type: 'removed', line: oldLines[oi], oldNum: oi + 1 });
112
+ oi++;
113
+ }
114
+ }
115
+ // Format with context hunks
116
+ return formatHunks(changes, contextLines);
117
+ }
118
+ function formatHunks(changes, contextLines) {
119
+ const output = [];
120
+ // Find change indices
121
+ const changeIndices = [];
122
+ for (let i = 0; i < changes.length; i++) {
123
+ if (changes[i].type !== 'same')
124
+ changeIndices.push(i);
125
+ }
126
+ if (changeIndices.length === 0) {
127
+ return ['(No textual differences detected)'];
128
+ }
129
+ // Build hunks (groups of nearby changes)
130
+ const printed = new Set();
131
+ for (const ci of changeIndices) {
132
+ // Context before
133
+ for (let j = Math.max(0, ci - contextLines); j < ci; j++) {
134
+ if (!printed.has(j) && changes[j].type === 'same') {
135
+ const num = changes[j].newNum ?? changes[j].oldNum ?? 0;
136
+ output.push(` ${String(num).padStart(4)} | ${changes[j].line}`);
137
+ printed.add(j);
138
+ }
139
+ }
140
+ // The change itself
141
+ if (!printed.has(ci)) {
142
+ const c = changes[ci];
143
+ if (c.type === 'removed') {
144
+ output.push(`- ${String(c.oldNum ?? 0).padStart(4)} | ${c.line}`);
145
+ }
146
+ else {
147
+ output.push(`+ ${String(c.newNum ?? 0).padStart(4)} | ${c.line}`);
148
+ }
149
+ printed.add(ci);
150
+ }
151
+ // Context after
152
+ let afterCount = 0;
153
+ for (let j = ci + 1; j < changes.length && afterCount < contextLines; j++) {
154
+ if (changes[j].type === 'same') {
155
+ if (!printed.has(j)) {
156
+ const num = changes[j].newNum ?? changes[j].oldNum ?? 0;
157
+ output.push(` ${String(num).padStart(4)} | ${changes[j].line}`);
158
+ printed.add(j);
159
+ }
160
+ afterCount++;
161
+ }
162
+ else {
163
+ break; // Next change will be handled in its own iteration
164
+ }
165
+ }
166
+ // Add separator if there's a gap to the next change
167
+ const nextChangeIdx = changeIndices[changeIndices.indexOf(ci) + 1];
168
+ if (nextChangeIdx !== undefined && nextChangeIdx - ci > contextLines * 2 + 1) {
169
+ output.push(' ...');
170
+ }
171
+ }
172
+ return output;
173
+ }
174
+ //# sourceMappingURL=read-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-diff.js","sourceRoot":"","sources":["../../src/handlers/read-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { FileCache } from '../core/file-cache.js';
2
+ import type { ContextRegistry } from '../core/context-registry.js';
3
+ export interface ReadRangeArgs {
4
+ path: string;
5
+ start_line: number;
6
+ end_line: number;
7
+ }
8
+ export declare function handleReadRange(args: ReadRangeArgs, projectRoot: string, fileCache: FileCache, contextRegistry: ContextRegistry): Promise<{
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ }>;
13
+ }>;
14
+ //# sourceMappingURL=read-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-range.d.ts","sourceRoot":"","sources":["../../src/handlers/read-range.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA+C7D"}
@@ -0,0 +1,44 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { estimateTokens } from '../core/token-estimator.js';
3
+ import { resolveSafePath } from '../core/validation.js';
4
+ export async function handleReadRange(args, projectRoot, fileCache, contextRegistry) {
5
+ const absPath = resolveSafePath(projectRoot, args.path);
6
+ // Get lines
7
+ const cached = fileCache.get(absPath);
8
+ let lines;
9
+ if (cached) {
10
+ lines = cached.lines;
11
+ }
12
+ else {
13
+ const content = await readFile(absPath, 'utf-8');
14
+ lines = content.split('\n');
15
+ }
16
+ const start = Math.max(0, args.start_line - 1);
17
+ const end = Math.min(lines.length, args.end_line);
18
+ if (start >= lines.length || start >= end) {
19
+ return {
20
+ content: [{
21
+ type: 'text',
22
+ text: `Invalid line range: ${args.start_line}-${args.end_line} (file has ${lines.length} lines)`,
23
+ }],
24
+ };
25
+ }
26
+ const outputLines = [
27
+ `FILE: ${args.path} [L${args.start_line}-${args.end_line}]`,
28
+ '',
29
+ ];
30
+ for (let i = start; i < end; i++) {
31
+ const lineNum = String(i + 1).padStart(4);
32
+ outputLines.push(`${lineNum} | ${lines[i]}`);
33
+ }
34
+ const output = outputLines.join('\n');
35
+ const tokens = estimateTokens(output);
36
+ contextRegistry.trackLoad(absPath, {
37
+ type: 'range',
38
+ startLine: args.start_line,
39
+ endLine: args.end_line,
40
+ tokens,
41
+ });
42
+ return { content: [{ type: 'text', text: output }] };
43
+ }
44
+ //# sourceMappingURL=read-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-range.js","sourceRoot":"","sources":["../../src/handlers/read-range.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAmB,EACnB,WAAmB,EACnB,SAAoB,EACpB,eAAgC;IAEhC,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAExD,YAAY;IACZ,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,KAAe,CAAC;IAEpB,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uBAAuB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,cAAc,KAAK,CAAC,MAAM,SAAS;iBACjG,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAa;QAC5B,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,GAAG;QAC3D,EAAE;KACH,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEtC,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE;QACjC,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,MAAM;KACP,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SymbolResolver } from '../core/symbol-resolver.js';
2
+ import type { FileCache } from '../core/file-cache.js';
3
+ import type { ContextRegistry } from '../core/context-registry.js';
4
+ export interface ReadSymbolArgs {
5
+ path: string;
6
+ symbol: string;
7
+ context_before?: number;
8
+ context_after?: number;
9
+ }
10
+ export declare function handleReadSymbol(args: ReadSymbolArgs, projectRoot: string, symbolResolver: SymbolResolver, fileCache: FileCache, contextRegistry: ContextRegistry): Promise<{
11
+ content: Array<{
12
+ type: 'text';
13
+ text: string;
14
+ }>;
15
+ }>;
16
+ //# sourceMappingURL=read-symbol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-symbol.d.ts","sourceRoot":"","sources":["../../src/handlers/read-symbol.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiE7D"}
@@ -0,0 +1,59 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { estimateTokens } from '../core/token-estimator.js';
3
+ import { resolveSafePath } from '../core/validation.js';
4
+ export async function handleReadSymbol(args, projectRoot, symbolResolver, fileCache, contextRegistry) {
5
+ const absPath = resolveSafePath(projectRoot, args.path);
6
+ // Get file content
7
+ const cached = fileCache.get(absPath);
8
+ let lines;
9
+ if (cached) {
10
+ lines = cached.lines;
11
+ }
12
+ else {
13
+ const content = await readFile(absPath, 'utf-8');
14
+ lines = content.split('\n');
15
+ }
16
+ // Resolve symbol
17
+ const resolved = await symbolResolver.resolve(args.symbol, cached?.structure);
18
+ if (!resolved) {
19
+ return {
20
+ content: [{
21
+ type: 'text',
22
+ text: `Symbol "${args.symbol}" not found in ${args.path}.\nHINT: Use smart_read("${args.path}") to see available symbols.`,
23
+ }],
24
+ };
25
+ }
26
+ // Extract source
27
+ const source = symbolResolver.extractSource(resolved, lines, {
28
+ contextBefore: args.context_before ?? 2,
29
+ contextAfter: args.context_after ?? 0,
30
+ });
31
+ const loc = `[L${resolved.startLine}-${resolved.endLine}]`;
32
+ const lineCount = resolved.endLine - resolved.startLine + 1;
33
+ const outputLines = [
34
+ `FILE: ${args.path}`,
35
+ `SYMBOL: ${args.symbol} (${resolved.symbol.kind}) ${loc} (${lineCount} lines)`,
36
+ '',
37
+ source,
38
+ ];
39
+ // References
40
+ if (resolved.symbol.references.length > 0) {
41
+ outputLines.push('');
42
+ outputLines.push(`REFERENCES: ${resolved.symbol.references.join(', ')}`);
43
+ }
44
+ // Build full output including tracking message, THEN estimate tokens
45
+ outputLines.push('');
46
+ outputLines.push('CONTEXT TRACKED: This symbol is now in your context.');
47
+ const output = outputLines.join('\n');
48
+ const tokens = estimateTokens(output);
49
+ // Track
50
+ contextRegistry.trackLoad(absPath, {
51
+ type: 'symbol',
52
+ symbolName: args.symbol,
53
+ startLine: resolved.startLine,
54
+ endLine: resolved.endLine,
55
+ tokens,
56
+ });
57
+ return { content: [{ type: 'text', text: output }] };
58
+ }
59
+ //# sourceMappingURL=read-symbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-symbol.js","sourceRoot":"","sources":["../../src/handlers/read-symbol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AstIndexClient } from '../ast-index/client.js';
2
+ export interface SearchCodeArgs {
3
+ query: string;
4
+ in_file?: string;
5
+ max_results?: number;
6
+ fuzzy?: boolean;
7
+ }
8
+ export declare function handleSearchCode(args: SearchCodeArgs, astIndex: AstIndexClient): Promise<{
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ }>;
13
+ }>;
14
+ //# sourceMappingURL=search-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-code.d.ts","sourceRoot":"","sources":["../../src/handlers/search-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8B7D"}
@@ -0,0 +1,27 @@
1
+ export async function handleSearchCode(args, astIndex) {
2
+ const results = await astIndex.search(args.query, {
3
+ inFile: args.in_file,
4
+ maxResults: args.max_results ?? 20,
5
+ fuzzy: args.fuzzy,
6
+ });
7
+ if (results.length === 0) {
8
+ return {
9
+ content: [{
10
+ type: 'text',
11
+ text: `No results found for "${args.query}".${args.fuzzy ? '' : '\nHINT: Try fuzzy=true for broader matching.'}`,
12
+ }],
13
+ };
14
+ }
15
+ const lines = [
16
+ `SEARCH: "${args.query}" (${results.length} results)`,
17
+ '',
18
+ ];
19
+ for (const r of results) {
20
+ lines.push(` ${r.file}:${r.line}`);
21
+ lines.push(` ${r.text.trim()}`);
22
+ }
23
+ lines.push('');
24
+ lines.push('HINT: Use read_symbol() or read_range() to load specific results.');
25
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
26
+ }
27
+ //# sourceMappingURL=search-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-code.js","sourceRoot":"","sources":["../../src/handlers/search-code.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAoB,EACpB,QAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;QAChD,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QAClC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C,EAAE;iBACjH,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,YAAY,IAAI,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,WAAW;QACrD,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAEhF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { AstIndexClient } from '../ast-index/client.js';
2
+ import type { FileCache } from '../core/file-cache.js';
3
+ import type { ContextRegistry } from '../core/context-registry.js';
4
+ import type { TokenPilotConfig } from '../types.js';
5
+ export interface SmartReadManyArgs {
6
+ paths: string[];
7
+ }
8
+ export declare function handleSmartReadMany(args: SmartReadManyArgs, projectRoot: string, astIndex: AstIndexClient, fileCache: FileCache, contextRegistry: ContextRegistry, config: TokenPilotConfig): Promise<{
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ }>;
13
+ }>;
14
+ //# sourceMappingURL=smart-read-many.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-read-many.d.ts","sourceRoot":"","sources":["../../src/handlers/smart-read-many.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAyC7D"}
@@ -0,0 +1,32 @@
1
+ import { handleSmartRead } from './smart-read.js';
2
+ export async function handleSmartReadMany(args, projectRoot, astIndex, fileCache, contextRegistry, config) {
3
+ if (!args.paths || args.paths.length === 0) {
4
+ return {
5
+ content: [{ type: 'text', text: 'No paths provided.' }],
6
+ };
7
+ }
8
+ if (args.paths.length > 20) {
9
+ return {
10
+ content: [{ type: 'text', text: `Too many files (${args.paths.length}). Maximum is 20 per batch.` }],
11
+ };
12
+ }
13
+ const results = [];
14
+ let totalTokens = 0;
15
+ for (const path of args.paths) {
16
+ try {
17
+ const result = await handleSmartRead({ path }, projectRoot, astIndex, fileCache, contextRegistry, config);
18
+ const text = result.content[0]?.text ?? '';
19
+ results.push(text);
20
+ // Rough count from output length
21
+ totalTokens += Math.ceil(text.length / 4);
22
+ }
23
+ catch (err) {
24
+ const msg = err instanceof Error ? err.message : String(err);
25
+ results.push(`FILE: ${path}\nERROR: ${msg}`);
26
+ }
27
+ }
28
+ results.push('');
29
+ results.push(`BATCH: ${args.paths.length} files loaded (~${totalTokens} tokens total)`);
30
+ return { content: [{ type: 'text', text: results.join('\n\n---\n\n') }] };
31
+ }
32
+ //# sourceMappingURL=smart-read-many.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-read-many.js","sourceRoot":"","sources":["../../src/handlers/smart-read-many.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAuB,EACvB,WAAmB,EACnB,QAAwB,EACxB,SAAoB,EACpB,eAAgC,EAChC,MAAwB;IAExB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;SAExD,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAI,CAAC,KAAK,CAAC,MAAM,6BAA6B,EAAE,CAAC;SACrG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,EAAE,IAAI,EAAE,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAe,EACf,MAAM,CACP,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,iCAAiC;YACjC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,mBAAmB,WAAW,gBAAgB,CAAC,CAAC;IAExF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AstIndexClient } from '../ast-index/client.js';
2
+ import type { FileCache } from '../core/file-cache.js';
3
+ import type { ContextRegistry } from '../core/context-registry.js';
4
+ import type { TokenPilotConfig } from '../types.js';
5
+ export interface SmartReadArgs {
6
+ path: string;
7
+ show_imports?: boolean;
8
+ show_docs?: boolean;
9
+ show_references?: boolean;
10
+ depth?: number;
11
+ }
12
+ export declare function handleSmartRead(args: SmartReadArgs, projectRoot: string, astIndex: AstIndexClient, fileCache: FileCache, contextRegistry: ContextRegistry, config: TokenPilotConfig): Promise<{
13
+ content: Array<{
14
+ type: 'text';
15
+ text: string;
16
+ }>;
17
+ }>;
18
+ //# sourceMappingURL=smart-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-read.d.ts","sourceRoot":"","sources":["../../src/handlers/smart-read.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA4F7D"}