@copilotkit/pathfinder 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.env.example +20 -0
  2. package/.superpowers/brainstorm/47098-1775507869/content/homepage-mockup.html +324 -0
  3. package/.superpowers/brainstorm/47098-1775507869/state/server-stopped +1 -0
  4. package/.superpowers/brainstorm/47098-1775507869/state/server.log +13 -0
  5. package/.superpowers/brainstorm/47098-1775507869/state/server.pid +1 -0
  6. package/.superpowers/brainstorm/82141-1775511032/content/migration-v2.html +340 -0
  7. package/.superpowers/brainstorm/82141-1775511032/content/migration.html +340 -0
  8. package/.superpowers/brainstorm/82141-1775511032/state/server-stopped +1 -0
  9. package/.superpowers/brainstorm/82141-1775511032/state/server.log +4 -0
  10. package/.superpowers/brainstorm/82141-1775511032/state/server.pid +1 -0
  11. package/CHANGELOG.md +26 -0
  12. package/LICENSE +21 -0
  13. package/README.md +284 -0
  14. package/dist/config.d.ts +32 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +180 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/db/client.d.ts +22 -0
  19. package/dist/db/client.d.ts.map +1 -0
  20. package/dist/db/client.js +134 -0
  21. package/dist/db/client.js.map +1 -0
  22. package/dist/db/queries.d.ts +51 -0
  23. package/dist/db/queries.d.ts.map +1 -0
  24. package/dist/db/queries.js +271 -0
  25. package/dist/db/queries.js.map +1 -0
  26. package/dist/db/schema.d.ts +11 -0
  27. package/dist/db/schema.d.ts.map +1 -0
  28. package/dist/db/schema.js +63 -0
  29. package/dist/db/schema.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +366 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/indexing/chunking/code.d.ts +17 -0
  35. package/dist/indexing/chunking/code.d.ts.map +1 -0
  36. package/dist/indexing/chunking/code.js +277 -0
  37. package/dist/indexing/chunking/code.js.map +1 -0
  38. package/dist/indexing/chunking/index.d.ts +6 -0
  39. package/dist/indexing/chunking/index.d.ts.map +1 -0
  40. package/dist/indexing/chunking/index.js +19 -0
  41. package/dist/indexing/chunking/index.js.map +1 -0
  42. package/dist/indexing/chunking/markdown.d.ts +16 -0
  43. package/dist/indexing/chunking/markdown.d.ts.map +1 -0
  44. package/dist/indexing/chunking/markdown.js +283 -0
  45. package/dist/indexing/chunking/markdown.js.map +1 -0
  46. package/dist/indexing/chunking/raw-text.d.ts +11 -0
  47. package/dist/indexing/chunking/raw-text.d.ts.map +1 -0
  48. package/dist/indexing/chunking/raw-text.js +59 -0
  49. package/dist/indexing/chunking/raw-text.js.map +1 -0
  50. package/dist/indexing/embeddings.d.ts +10 -0
  51. package/dist/indexing/embeddings.d.ts.map +1 -0
  52. package/dist/indexing/embeddings.js +78 -0
  53. package/dist/indexing/embeddings.js.map +1 -0
  54. package/dist/indexing/orchestrator.d.ts +69 -0
  55. package/dist/indexing/orchestrator.d.ts.map +1 -0
  56. package/dist/indexing/orchestrator.js +387 -0
  57. package/dist/indexing/orchestrator.js.map +1 -0
  58. package/dist/indexing/source-indexer.d.ts +68 -0
  59. package/dist/indexing/source-indexer.d.ts.map +1 -0
  60. package/dist/indexing/source-indexer.js +379 -0
  61. package/dist/indexing/source-indexer.js.map +1 -0
  62. package/dist/indexing/url-derivation.d.ts +7 -0
  63. package/dist/indexing/url-derivation.d.ts.map +1 -0
  64. package/dist/indexing/url-derivation.js +31 -0
  65. package/dist/indexing/url-derivation.js.map +1 -0
  66. package/dist/mcp/server.d.ts +10 -0
  67. package/dist/mcp/server.d.ts.map +1 -0
  68. package/dist/mcp/server.js +67 -0
  69. package/dist/mcp/server.js.map +1 -0
  70. package/dist/mcp/tools/bash-fs.d.ts +19 -0
  71. package/dist/mcp/tools/bash-fs.d.ts.map +1 -0
  72. package/dist/mcp/tools/bash-fs.js +134 -0
  73. package/dist/mcp/tools/bash-fs.js.map +1 -0
  74. package/dist/mcp/tools/bash-grep.d.ts +29 -0
  75. package/dist/mcp/tools/bash-grep.d.ts.map +1 -0
  76. package/dist/mcp/tools/bash-grep.js +153 -0
  77. package/dist/mcp/tools/bash-grep.js.map +1 -0
  78. package/dist/mcp/tools/bash-related.d.ts +14 -0
  79. package/dist/mcp/tools/bash-related.d.ts.map +1 -0
  80. package/dist/mcp/tools/bash-related.js +54 -0
  81. package/dist/mcp/tools/bash-related.js.map +1 -0
  82. package/dist/mcp/tools/bash-session.d.ts +23 -0
  83. package/dist/mcp/tools/bash-session.d.ts.map +1 -0
  84. package/dist/mcp/tools/bash-session.js +60 -0
  85. package/dist/mcp/tools/bash-session.js.map +1 -0
  86. package/dist/mcp/tools/bash-telemetry.d.ts +26 -0
  87. package/dist/mcp/tools/bash-telemetry.d.ts.map +1 -0
  88. package/dist/mcp/tools/bash-telemetry.js +53 -0
  89. package/dist/mcp/tools/bash-telemetry.js.map +1 -0
  90. package/dist/mcp/tools/bash-virtual-files.d.ts +3 -0
  91. package/dist/mcp/tools/bash-virtual-files.d.ts.map +1 -0
  92. package/dist/mcp/tools/bash-virtual-files.js +65 -0
  93. package/dist/mcp/tools/bash-virtual-files.js.map +1 -0
  94. package/dist/mcp/tools/bash.d.ts +25 -0
  95. package/dist/mcp/tools/bash.d.ts.map +1 -0
  96. package/dist/mcp/tools/bash.js +140 -0
  97. package/dist/mcp/tools/bash.js.map +1 -0
  98. package/dist/mcp/tools/collect.d.ts +13 -0
  99. package/dist/mcp/tools/collect.d.ts.map +1 -0
  100. package/dist/mcp/tools/collect.js +56 -0
  101. package/dist/mcp/tools/collect.js.map +1 -0
  102. package/dist/mcp/tools/search.d.ts +5 -0
  103. package/dist/mcp/tools/search.d.ts.map +1 -0
  104. package/dist/mcp/tools/search.js +68 -0
  105. package/dist/mcp/tools/search.js.map +1 -0
  106. package/dist/types.d.ts +1237 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +163 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/webhooks/github.d.ts +12 -0
  111. package/dist/webhooks/github.d.ts.map +1 -0
  112. package/dist/webhooks/github.js +117 -0
  113. package/dist/webhooks/github.js.map +1 -0
  114. package/package.json +48 -0
@@ -0,0 +1,65 @@
1
+ export function generateIndexMd(fileTree) {
2
+ const paths = Object.keys(fileTree).sort();
3
+ const lines = [
4
+ `# INDEX`,
5
+ ``,
6
+ `${paths.length} files available in this virtual filesystem.`,
7
+ ``,
8
+ ];
9
+ if (paths.length === 0)
10
+ return lines.join('\n');
11
+ const tree = {};
12
+ for (const p of paths) {
13
+ const parts = p.split('/').filter(Boolean);
14
+ if (parts.length === 1) {
15
+ if (!tree['/'])
16
+ tree['/'] = [];
17
+ tree['/'].push(parts[0]);
18
+ }
19
+ else {
20
+ const dir = '/' + parts.slice(0, -1).join('/') + '/';
21
+ if (!tree[dir])
22
+ tree[dir] = [];
23
+ tree[dir].push(parts[parts.length - 1]);
24
+ }
25
+ }
26
+ const sortedDirs = Object.keys(tree).sort();
27
+ for (const dir of sortedDirs) {
28
+ lines.push(`## ${dir}`);
29
+ for (const file of tree[dir].sort()) {
30
+ lines.push(`- ${file}`);
31
+ }
32
+ lines.push('');
33
+ }
34
+ return lines.join('\n');
35
+ }
36
+ export function generateSearchTipsMd(searchToolNames) {
37
+ const lines = [
38
+ `# SEARCH TIPS`,
39
+ ``,
40
+ `## Bash Commands`,
41
+ '- `find / -name "*.ts"` — discover files by pattern',
42
+ '- `grep -r "pattern" /` — search file contents',
43
+ '- `cat /path/to/file` — read a specific file',
44
+ '- `head -n 50 /path/to/file` — read first N lines',
45
+ '- `ls /path/` — list directory contents',
46
+ ``,
47
+ ];
48
+ if (searchToolNames.length > 0) {
49
+ lines.push(`## Semantic Search Tools`);
50
+ lines.push(`For broader, meaning-based search, use these companion tools:`);
51
+ lines.push(``);
52
+ for (const name of searchToolNames) {
53
+ lines.push(`- **${name}** — semantic vector search (finds related content even without exact keyword match)`);
54
+ }
55
+ lines.push(``);
56
+ lines.push(`**Tip:** Use grep for exact matches, search tools for conceptual queries.`);
57
+ }
58
+ lines.push(`## Workflow`);
59
+ lines.push('1. Start with `find` or `ls` to understand the directory structure');
60
+ lines.push('2. Use `grep -rl "keyword"` to locate files mentioning a topic');
61
+ lines.push('3. Use `cat` to read the full content of relevant files');
62
+ lines.push(`4. Read INDEX.md for a full file listing`);
63
+ return lines.join('\n');
64
+ }
65
+ //# sourceMappingURL=bash-virtual-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-virtual-files.js","sourceRoot":"","sources":["../../../src/mcp/tools/bash-virtual-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Bash } from 'just-bash';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import type { BashToolConfig } from '../../types.js';
4
+ import { BashSessionState } from './bash-session.js';
5
+ import type { EmbeddingClient } from '../../indexing/embeddings.js';
6
+ interface ExecResult {
7
+ stdout: string;
8
+ stderr: string;
9
+ exitCode: number;
10
+ }
11
+ export declare function formatBashResult(command: string, result: ExecResult): string;
12
+ /** Extracts the target directory from a bare `cd <path>` command. */
13
+ export declare function parseBareCD(command: string): string | null;
14
+ export interface BashToolOptions {
15
+ sessionState?: BashSessionState;
16
+ /** Lazy resolver for session state — called on first tool invocation. */
17
+ getSessionState?: () => BashSessionState | undefined;
18
+ /** Embedding client for vector-backed grep. */
19
+ embeddingClient?: EmbeddingClient;
20
+ /** Names of search tools, used for grep-miss suggestions. */
21
+ searchToolNames?: string[];
22
+ }
23
+ export declare function registerBashTool(server: McpServer, toolConfig: BashToolConfig, bash: Bash, options?: BashToolOptions): void;
24
+ export {};
25
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAM5E;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACrD,+CAA+C;IAC/C,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,eAAe,GAC1B,IAAI,CAuHN"}
@@ -0,0 +1,140 @@
1
+ import { z } from 'zod';
2
+ import { BashSessionState } from './bash-session.js';
3
+ import { parseGrepCommand, parseQmdCommand, vectorGrep } from './bash-grep.js';
4
+ import { parseRelatedCommand, handleRelatedCommand, formatGrepMissSuggestion } from './bash-related.js';
5
+ import { searchChunks, textSearchChunks } from '../../db/queries.js';
6
+ export function formatBashResult(command, result) {
7
+ const parts = [`$ ${command}`];
8
+ if (result.stdout)
9
+ parts.push(result.stdout);
10
+ if (result.stderr)
11
+ parts.push(result.stderr);
12
+ if (result.exitCode !== 0)
13
+ parts.push(`[exit code ${result.exitCode}]`);
14
+ return parts.join('\n');
15
+ }
16
+ /** Extracts the target directory from a bare `cd <path>` command. */
17
+ export function parseBareCD(command) {
18
+ const trimmed = command.trim();
19
+ const match = trimmed.match(/^cd\s+((?:[^\s;&|])+)\s*$/);
20
+ if (match)
21
+ return match[1];
22
+ if (trimmed === 'cd')
23
+ return '/';
24
+ return null;
25
+ }
26
+ export function registerBashTool(server, toolConfig, bash, options) {
27
+ const sessionEnabled = toolConfig.bash?.session_state === true;
28
+ // Session state can be provided directly or via a lazy resolver.
29
+ // The lazy resolver is useful when the session ID isn't known at registration time.
30
+ let resolvedSessionState;
31
+ function getSessionState() {
32
+ if (resolvedSessionState !== undefined)
33
+ return resolvedSessionState;
34
+ if (!sessionEnabled) {
35
+ resolvedSessionState = null;
36
+ return null;
37
+ }
38
+ if (options?.sessionState) {
39
+ resolvedSessionState = options.sessionState;
40
+ return resolvedSessionState;
41
+ }
42
+ if (options?.getSessionState) {
43
+ const state = options.getSessionState();
44
+ if (state) {
45
+ resolvedSessionState = state;
46
+ return state;
47
+ }
48
+ // Resolver returned undefined — not ready yet, try again next call
49
+ return null;
50
+ }
51
+ resolvedSessionState = new BashSessionState();
52
+ return resolvedSessionState;
53
+ }
54
+ const inputSchema = {
55
+ command: z.string().describe("Bash command to execute (e.g., find, grep, cat, head, ls)"),
56
+ };
57
+ server.tool(toolConfig.name, toolConfig.description, inputSchema, async ({ command }) => {
58
+ try {
59
+ const sessionState = getSessionState();
60
+ const cwd = sessionState?.getCwd() ?? '/';
61
+ // Handle bare `cd <path>` — update session CWD without exec
62
+ if (sessionState) {
63
+ const cdTarget = parseBareCD(command);
64
+ if (cdTarget !== null) {
65
+ const resolved = sessionState.resolvePath(cdTarget);
66
+ // Verify directory exists in virtual FS
67
+ const check = await bash.exec(`test -d "${resolved}" && echo ok || echo fail`, { cwd: '/' });
68
+ if (check.stdout.trim() !== 'ok') {
69
+ return {
70
+ content: [{ type: "text", text: formatBashResult(command, {
71
+ stdout: '',
72
+ stderr: `cd: ${cdTarget}: No such file or directory\n`,
73
+ exitCode: 1,
74
+ }) }],
75
+ };
76
+ }
77
+ sessionState.setCwd(resolved);
78
+ return {
79
+ content: [{ type: "text", text: formatBashResult(command, { stdout: '', stderr: '', exitCode: 0 }) }],
80
+ };
81
+ }
82
+ }
83
+ // Intercept `related <path>` command
84
+ if (options?.embeddingClient) {
85
+ const rel = parseRelatedCommand(command);
86
+ if (rel.isRelated) {
87
+ const resolvedPath = sessionState ? sessionState.resolvePath(rel.path) : rel.path;
88
+ // Try to get file content from bash instance
89
+ const escaped = resolvedPath.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
90
+ const catResult = await bash.exec(`cat "${escaped}"`, { cwd: '/' });
91
+ const fileContent = catResult.exitCode === 0 ? catResult.stdout : undefined;
92
+ const relResult = await handleRelatedCommand(resolvedPath, fileContent, options.embeddingClient, (emb, lim) => searchChunks(emb, lim));
93
+ return {
94
+ content: [{ type: "text", text: formatBashResult(command, relResult) }],
95
+ };
96
+ }
97
+ }
98
+ // Intercept `qmd` command for vector-backed semantic search
99
+ const grepStrategy = toolConfig.bash?.grep_strategy;
100
+ if (grepStrategy && grepStrategy !== 'memory' && options?.embeddingClient) {
101
+ const qmd = parseQmdCommand(command);
102
+ if (qmd.isQmd) {
103
+ const qmdResult = await vectorGrep({
104
+ pattern: qmd.query,
105
+ sourceName: undefined, // search all sources
106
+ embeddingClient: options.embeddingClient,
107
+ searchChunksFn: searchChunks,
108
+ textSearchFn: textSearchChunks,
109
+ });
110
+ return {
111
+ content: [{ type: "text", text: formatBashResult(command, qmdResult) }],
112
+ };
113
+ }
114
+ }
115
+ const result = await bash.exec(command, { cwd });
116
+ // Append grep-miss suggestion when grep returns no results
117
+ if (options?.searchToolNames && options.searchToolNames.length > 0) {
118
+ const parsed = parseGrepCommand(command);
119
+ if (parsed.isGrep && result.exitCode === 1 && !result.stdout.trim()) {
120
+ const suggestion = formatGrepMissSuggestion(options.searchToolNames);
121
+ return {
122
+ content: [{ type: "text", text: formatBashResult(command, { ...result, stderr: (result.stderr || '') + suggestion }) }],
123
+ };
124
+ }
125
+ }
126
+ return {
127
+ content: [{ type: "text", text: formatBashResult(command, result) }],
128
+ };
129
+ }
130
+ catch (error) {
131
+ const detail = error instanceof Error ? error.message : String(error);
132
+ console.error(`[${toolConfig.name}] Error: ${detail}`);
133
+ return {
134
+ content: [{ type: "text", text: `Error: ${detail}` }],
135
+ isError: true,
136
+ };
137
+ }
138
+ });
139
+ }
140
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/mcp/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import type { CollectToolConfig } from '../../types.js';
4
+ /**
5
+ * Convert a YAML-defined schema (record of field definitions) into a Zod shape record.
6
+ */
7
+ export declare function yamlSchemaToZod(schema: CollectToolConfig['schema']): Record<string, z.ZodTypeAny>;
8
+ /**
9
+ * Register a collect tool on the MCP server.
10
+ * The tool validates inputs against the YAML-defined schema and writes to the DB.
11
+ */
12
+ export declare function registerCollectTool(server: McpServer, toolConfig: CollectToolConfig): void;
13
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKxD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAgCjG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,iBAAiB,GAC9B,IAAI,CAuBN"}
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { insertCollectedData } from '../../db/queries.js';
3
+ /**
4
+ * Convert a YAML-defined schema (record of field definitions) into a Zod shape record.
5
+ */
6
+ export function yamlSchemaToZod(schema) {
7
+ const shape = {};
8
+ for (const [fieldName, field] of Object.entries(schema)) {
9
+ let fieldSchema;
10
+ switch (field.type) {
11
+ case 'string':
12
+ fieldSchema = z.string();
13
+ break;
14
+ case 'number':
15
+ fieldSchema = z.number();
16
+ break;
17
+ case 'enum':
18
+ fieldSchema = z.enum(field.values);
19
+ break;
20
+ default:
21
+ throw new Error(`Unsupported field type "${field.type}" for field "${fieldName}"`);
22
+ }
23
+ if (field.description) {
24
+ fieldSchema = fieldSchema.describe(field.description);
25
+ }
26
+ if (!field.required) {
27
+ fieldSchema = fieldSchema.optional();
28
+ }
29
+ shape[fieldName] = fieldSchema;
30
+ }
31
+ return shape;
32
+ }
33
+ /**
34
+ * Register a collect tool on the MCP server.
35
+ * The tool validates inputs against the YAML-defined schema and writes to the DB.
36
+ */
37
+ export function registerCollectTool(server, toolConfig) {
38
+ const zodShape = yamlSchemaToZod(toolConfig.schema);
39
+ server.tool(toolConfig.name, toolConfig.description, zodShape, async (input) => {
40
+ try {
41
+ await insertCollectedData(toolConfig.name, input);
42
+ return {
43
+ content: [{ type: "text", text: toolConfig.response }],
44
+ };
45
+ }
46
+ catch (error) {
47
+ const detail = error instanceof Error ? error.message : String(error);
48
+ console.error(`[${toolConfig.name}] Error inserting collected data: ${detail}`);
49
+ return {
50
+ content: [{ type: "text", text: "Error: Failed to store data. Please try again later." }],
51
+ isError: true,
52
+ };
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/mcp/tools/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmC;IAC/D,MAAM,KAAK,GAAiC,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAyB,EAAE,CAAC;QAC9E,IAAI,WAAyB,CAAC;QAE9B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACT,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM;YACV,KAAK,QAAQ;gBACT,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM;YACV,KAAK,MAAM;gBACP,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAA+B,CAAC,CAAC;gBAC5D,MAAM;YACV;gBACI,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,IAAI,gBAAgB,SAAS,GAAG,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClB,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAC/B,MAAiB,EACjB,UAA6B;IAE7B,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,CAAC,IAAI,CACP,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,WAAW,EACtB,QAAQ,EACR,KAAK,EAAE,KAAK,EAAE,EAAE;QACZ,IAAI,CAAC;YACD,MAAM,mBAAmB,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;aAClE,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,qCAAqC,MAAM,EAAE,CAAC,CAAC;YAChF,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sDAAsD,EAAE,CAAC;gBAClG,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { EmbeddingClient } from '../../indexing/embeddings.js';
3
+ import type { SearchToolConfig } from '../../types.js';
4
+ export declare function registerSearchTool(server: McpServer, embeddingClient: EmbeddingClient, toolConfig: SearchToolConfig): void;
5
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AA2CpE,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,gBAAgB,GAC7B,IAAI,CA8BN"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { searchChunks } from '../../db/queries.js';
3
+ function formatDocsResults(results) {
4
+ if (results.length === 0)
5
+ return "No results found.";
6
+ return results.map((r, i) => [
7
+ `SNIPPET ${i + 1}`,
8
+ `TITLE: ${r.title || r.file_path}`,
9
+ `SOURCE: ${r.source_url || r.file_path}`,
10
+ `CONTENT:`,
11
+ r.content,
12
+ ].join('\n')).join('\n\n---\n\n');
13
+ }
14
+ function formatCodeResults(results) {
15
+ if (results.length === 0)
16
+ return "No results found.";
17
+ return results.map((r, i) => [
18
+ `SNIPPET ${i + 1}`,
19
+ `REPOSITORY: ${r.repo_url}`,
20
+ `PATH: ${r.file_path}`,
21
+ `CONTENT:`,
22
+ r.content,
23
+ ].join('\n')).join('\n\n---\n\n');
24
+ }
25
+ function formatRawResults(results) {
26
+ if (results.length === 0)
27
+ return "No results found.";
28
+ return results.map((r, i) => [
29
+ `SNIPPET ${i + 1}`,
30
+ `SOURCE: ${r.source_url || r.file_path}`,
31
+ `CONTENT:`,
32
+ r.content,
33
+ ].join('\n')).join('\n\n---\n\n');
34
+ }
35
+ function formatResults(results, format) {
36
+ switch (format) {
37
+ case 'docs': return formatDocsResults(results);
38
+ case 'code': return formatCodeResults(results);
39
+ default: return formatRawResults(results);
40
+ }
41
+ }
42
+ export function registerSearchTool(server, embeddingClient, toolConfig) {
43
+ const inputSchema = {
44
+ query: z.string().describe("The search query"),
45
+ limit: z.number().min(1).max(toolConfig.max_limit)
46
+ .default(toolConfig.default_limit).optional()
47
+ .describe(`Maximum number of results (default: ${toolConfig.default_limit})`),
48
+ };
49
+ server.tool(toolConfig.name, toolConfig.description, inputSchema, async ({ query, limit }) => {
50
+ const effectiveLimit = limit ?? toolConfig.default_limit;
51
+ try {
52
+ const embedding = await embeddingClient.embed(query);
53
+ const results = await searchChunks(embedding, effectiveLimit, toolConfig.source);
54
+ return {
55
+ content: [{ type: "text", text: formatResults(results, toolConfig.result_format) }],
56
+ };
57
+ }
58
+ catch (error) {
59
+ const detail = error instanceof Error ? error.message : String(error);
60
+ console.error(`[${toolConfig.name}] Error: ${detail}`);
61
+ return {
62
+ content: [{ type: "text", text: "Error: Search failed. Please try again later." }],
63
+ isError: true,
64
+ };
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"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"}