@copilotkit/pathfinder 1.1.0 → 1.4.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 (79) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +61 -249
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +60 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/db/client.d.ts.map +1 -1
  8. package/dist/db/client.js +3 -1
  9. package/dist/db/client.js.map +1 -1
  10. package/dist/db/queries.d.ts +14 -3
  11. package/dist/db/queries.d.ts.map +1 -1
  12. package/dist/db/queries.js +46 -45
  13. package/dist/db/queries.js.map +1 -1
  14. package/dist/db/schema.d.ts +5 -0
  15. package/dist/db/schema.d.ts.map +1 -1
  16. package/dist/db/schema.js +11 -0
  17. package/dist/db/schema.js.map +1 -1
  18. package/dist/index.js +2 -362
  19. package/dist/index.js.map +1 -1
  20. package/dist/indexing/chunking/html.d.ts +7 -0
  21. package/dist/indexing/chunking/html.d.ts.map +1 -0
  22. package/dist/indexing/chunking/html.js +356 -0
  23. package/dist/indexing/chunking/html.js.map +1 -0
  24. package/dist/indexing/chunking/index.js +2 -0
  25. package/dist/indexing/chunking/index.js.map +1 -1
  26. package/dist/indexing/orchestrator.d.ts +1 -0
  27. package/dist/indexing/orchestrator.d.ts.map +1 -1
  28. package/dist/indexing/orchestrator.js +27 -2
  29. package/dist/indexing/orchestrator.js.map +1 -1
  30. package/dist/indexing/source-indexer.d.ts.map +1 -1
  31. package/dist/indexing/source-indexer.js +1 -0
  32. package/dist/indexing/source-indexer.js.map +1 -1
  33. package/dist/ip-limiter.d.ts +11 -0
  34. package/dist/ip-limiter.d.ts.map +1 -0
  35. package/dist/ip-limiter.js +40 -0
  36. package/dist/ip-limiter.js.map +1 -0
  37. package/dist/llms-txt.d.ts +11 -0
  38. package/dist/llms-txt.d.ts.map +1 -0
  39. package/dist/llms-txt.js +43 -0
  40. package/dist/llms-txt.js.map +1 -0
  41. package/dist/mcp/server.d.ts +3 -1
  42. package/dist/mcp/server.d.ts.map +1 -1
  43. package/dist/mcp/server.js +5 -1
  44. package/dist/mcp/server.js.map +1 -1
  45. package/dist/mcp/tools/bash.d.ts +8 -0
  46. package/dist/mcp/tools/bash.d.ts.map +1 -1
  47. package/dist/mcp/tools/bash.js +59 -0
  48. package/dist/mcp/tools/bash.js.map +1 -1
  49. package/dist/mcp/tools/search.d.ts.map +1 -1
  50. package/dist/mcp/tools/search.js +11 -3
  51. package/dist/mcp/tools/search.js.map +1 -1
  52. package/dist/server.d.ts +6 -0
  53. package/dist/server.d.ts.map +1 -0
  54. package/dist/server.js +492 -0
  55. package/dist/server.js.map +1 -0
  56. package/dist/skill-md.d.ts +3 -0
  57. package/dist/skill-md.d.ts.map +1 -0
  58. package/dist/skill-md.js +75 -0
  59. package/dist/skill-md.js.map +1 -0
  60. package/dist/types.d.ts +56 -18
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/types.js +7 -3
  63. package/dist/types.js.map +1 -1
  64. package/dist/workspace.d.ts +13 -0
  65. package/dist/workspace.d.ts.map +1 -0
  66. package/dist/workspace.js +118 -0
  67. package/dist/workspace.js.map +1 -0
  68. package/package.json +14 -2
  69. package/pathfinder-docs.yaml +54 -0
  70. package/pathfinder.example.yaml +48 -0
  71. package/.superpowers/brainstorm/47098-1775507869/content/homepage-mockup.html +0 -324
  72. package/.superpowers/brainstorm/47098-1775507869/state/server-stopped +0 -1
  73. package/.superpowers/brainstorm/47098-1775507869/state/server.log +0 -13
  74. package/.superpowers/brainstorm/47098-1775507869/state/server.pid +0 -1
  75. package/.superpowers/brainstorm/82141-1775511032/content/migration-v2.html +0 -340
  76. package/.superpowers/brainstorm/82141-1775511032/content/migration.html +0 -340
  77. package/.superpowers/brainstorm/82141-1775511032/state/server-stopped +0 -1
  78. package/.superpowers/brainstorm/82141-1775511032/state/server.log +0 -4
  79. package/.superpowers/brainstorm/82141-1775511032/state/server.pid +0 -1
package/dist/server.js ADDED
@@ -0,0 +1,492 @@
1
+ import express from "express";
2
+ import cors from "cors";
3
+ import { randomUUID } from "node:crypto";
4
+ import { Bash } from "just-bash";
5
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
6
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
7
+ import { createMcpServer } from "./mcp/server.js";
8
+ import { buildBashFilesMap, rebuildBashInstance } from "./mcp/tools/bash-fs.js";
9
+ import { initializeSchema, closePool } from "./db/client.js";
10
+ import { getIndexStats, getAllChunksForLlms } from "./db/queries.js";
11
+ import { getConfig, getServerConfig, hasSearchTools, hasCollectTools, hasBashSemanticSearch } from "./config.js";
12
+ import { IndexingOrchestrator } from "./indexing/orchestrator.js";
13
+ import { createWebhookHandler } from "./webhooks/github.js";
14
+ import { SessionStateManager } from "./mcp/tools/bash-session.js";
15
+ import { BashTelemetry } from "./mcp/tools/bash-telemetry.js";
16
+ import { insertCollectedData } from "./db/queries.js";
17
+ import { IpSessionLimiter } from "./ip-limiter.js";
18
+ import { WorkspaceManager } from "./workspace.js";
19
+ import { generateLlmsTxt, generateLlmsFullTxt } from "./llms-txt.js";
20
+ import { generateSkillMd } from "./skill-md.js";
21
+ const app = express();
22
+ app.use(cors({
23
+ origin: "*",
24
+ exposedHeaders: ["Mcp-Session-Id"],
25
+ }));
26
+ // Advertise llms.txt via Link header on all responses
27
+ app.use((_req, res, next) => {
28
+ res.setHeader('Link', '</llms.txt>; rel="llms-txt"');
29
+ next();
30
+ });
31
+ // ---------------------------------------------------------------------------
32
+ // Webhook endpoint — registered BEFORE express.json() so the handler receives
33
+ // a raw Buffer for HMAC signature verification.
34
+ //
35
+ // The handler is wired to the real orchestrator during start(). Until then,
36
+ // requests receive 503 (server still initializing).
37
+ // ---------------------------------------------------------------------------
38
+ let webhookHandler = null;
39
+ let orchestratorRef = null;
40
+ const startedAt = new Date();
41
+ const bashInstances = new Map();
42
+ const sessionStateManager = new SessionStateManager();
43
+ let bashTelemetry;
44
+ let telemetryFlushInterval;
45
+ async function refreshBashInstances(sourceNames, logPrefix = "webhook") {
46
+ const serverCfg = getServerConfig();
47
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
48
+ const searchToolNames = serverCfg.tools.filter(t => t.type === 'search').map(t => t.name);
49
+ for (const tool of bashTools) {
50
+ const affected = tool.sources.some(s => sourceNames.includes(s));
51
+ if (!affected)
52
+ continue;
53
+ const toolSources = serverCfg.sources.filter(s => tool.sources.includes(s.name));
54
+ const virtualFiles = tool.bash?.virtual_files === true;
55
+ const { bash, fileCount } = await rebuildBashInstance(toolSources, {
56
+ virtualFiles,
57
+ searchToolNames: virtualFiles ? searchToolNames : undefined,
58
+ cloneDir: getConfig().cloneDir,
59
+ });
60
+ bashInstances.set(tool.name, bash);
61
+ console.log(`[${logPrefix}] Refreshed bash tool "${tool.name}": ${fileCount} files`);
62
+ }
63
+ }
64
+ app.post("/webhooks/github", express.raw({ type: "application/json" }), async (req, res) => {
65
+ const handler = webhookHandler;
66
+ if (!handler) {
67
+ res.status(503).json({ error: "Server still initializing" });
68
+ return;
69
+ }
70
+ try {
71
+ await handler(req, res);
72
+ // Schedule bash refresh after reindexing. The orchestrator runs async,
73
+ // so we use a delay heuristic — TODO: replace with event-based notification.
74
+ const serverCfg = getServerConfig();
75
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
76
+ if (bashTools.length > 0) {
77
+ const REFRESH_DELAY_MS = 30_000;
78
+ setTimeout(() => {
79
+ refreshBashInstances(serverCfg.sources.map(s => s.name)).catch(err => console.error('[webhook] Bash refresh failed:', err));
80
+ }, REFRESH_DELAY_MS);
81
+ }
82
+ }
83
+ catch (err) {
84
+ console.error("[webhook] Handler error:", err);
85
+ if (!res.headersSent) {
86
+ res.status(500).json({ error: "Internal webhook handler error" });
87
+ }
88
+ }
89
+ });
90
+ // JSON parser for all other routes
91
+ app.use(express.json());
92
+ // ---------------------------------------------------------------------------
93
+ // OAuth discovery stubs — tell MCP clients that no auth is required.
94
+ // Newer Claude Code versions probe these before connecting.
95
+ // ---------------------------------------------------------------------------
96
+ // Return resource metadata with no authorization servers — signals "no auth required"
97
+ // per RFC 9728. Newer Claude Code versions probe this before connecting.
98
+ app.get("/.well-known/oauth-protected-resource", (req, res) => {
99
+ const host = req.headers.host || `localhost:${getConfig().port}`;
100
+ const proto = req.headers["x-forwarded-proto"] || "http";
101
+ res.json({
102
+ resource: `${proto}://${host}`,
103
+ });
104
+ });
105
+ app.get("/.well-known/oauth-authorization-server", (_req, res) => {
106
+ res.status(404).json({ error: "No authorization server — this resource does not require authentication" });
107
+ });
108
+ app.post("/register", (_req, res) => {
109
+ res.status(404).json({ error: "No authorization server — this resource does not require authentication" });
110
+ });
111
+ // ---------------------------------------------------------------------------
112
+ // MCP endpoint — session-based (initialize once, then tool calls reuse session)
113
+ // ---------------------------------------------------------------------------
114
+ const transports = {};
115
+ const sessionLastActivity = {};
116
+ let SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes default, overridden by config
117
+ let ipLimiter;
118
+ let workspaceManager;
119
+ // Reap idle sessions every 5 minutes
120
+ setInterval(() => {
121
+ const now = Date.now();
122
+ let reaped = 0;
123
+ for (const sid of Object.keys(sessionLastActivity)) {
124
+ if (now - sessionLastActivity[sid] > SESSION_TTL_MS) {
125
+ delete transports[sid];
126
+ delete sessionLastActivity[sid];
127
+ try {
128
+ sessionStateManager.cleanup(sid);
129
+ }
130
+ catch (e) {
131
+ console.error(`[mcp] Session state cleanup failed for ${sid.slice(0, 8)}:`, e);
132
+ }
133
+ try {
134
+ ipLimiter?.remove(sid);
135
+ }
136
+ catch (e) {
137
+ console.error(`[mcp] IP limiter cleanup failed:`, e);
138
+ }
139
+ try {
140
+ workspaceManager?.cleanup(sid);
141
+ }
142
+ catch (e) {
143
+ console.error(`[mcp] Workspace cleanup failed for ${sid.slice(0, 8)}:`, e);
144
+ }
145
+ reaped++;
146
+ }
147
+ }
148
+ if (reaped > 0) {
149
+ console.log(`[mcp] Reaped ${reaped} idle sessions (${Object.keys(transports).length} active)`);
150
+ }
151
+ }, 5 * 60 * 1000);
152
+ function clientIp(req) {
153
+ return req.headers["x-forwarded-for"]?.split(",")[0]?.trim()
154
+ || req.socket.remoteAddress
155
+ || "unknown";
156
+ }
157
+ app.post("/mcp", async (req, res) => {
158
+ try {
159
+ const sessionId = req.headers["mcp-session-id"];
160
+ const ip = clientIp(req);
161
+ // Existing session — route to its transport
162
+ if (sessionId && transports[sessionId]) {
163
+ sessionLastActivity[sessionId] = Date.now();
164
+ const method = req.body?.method;
165
+ if (method === 'tools/call') {
166
+ const params = req.body?.params;
167
+ const toolName = params?.name ?? 'unknown';
168
+ const args = params?.arguments;
169
+ const toolCfg = getServerConfig().tools.find(t => t.name === toolName);
170
+ if (toolCfg?.type === 'collect') {
171
+ try {
172
+ const dataPreview = JSON.stringify(args ?? {}).slice(0, 200);
173
+ console.log(`[mcp] ${toolName}(${dataPreview}) [${ip}]`);
174
+ }
175
+ catch {
176
+ console.log(`[mcp] ${toolName}(<unserializable>) [${ip}]`);
177
+ }
178
+ }
179
+ else if (toolCfg?.type === 'bash') {
180
+ const cmd = args?.command ?? '';
181
+ console.log(`[mcp] ${toolName}(${JSON.stringify(cmd).slice(0, 200)}) [${ip}]`);
182
+ }
183
+ else {
184
+ const query = args?.query ?? '';
185
+ const limit = args?.limit;
186
+ const extra = limit ? ` limit=${limit}` : '';
187
+ console.log(`[mcp] ${toolName}("${query}"${extra}) [${ip}]`);
188
+ }
189
+ }
190
+ else if (method === 'tools/list') {
191
+ console.log(`[mcp] tools/list [${ip}]`);
192
+ }
193
+ await transports[sessionId].handleRequest(req, res, req.body);
194
+ return;
195
+ }
196
+ // New session — must be an initialize request
197
+ if (!sessionId && isInitializeRequest(req.body)) {
198
+ const transport = new StreamableHTTPServerTransport({
199
+ sessionIdGenerator: () => randomUUID(),
200
+ onsessioninitialized: (sid) => {
201
+ transports[sid] = transport;
202
+ sessionLastActivity[sid] = Date.now();
203
+ if (ipLimiter && !ipLimiter.tryAdd(ip, sid)) {
204
+ // Rate limit exceeded — tear down immediately
205
+ console.warn(`[mcp] IP rate limit exceeded for ${ip}, closing session ${sid.slice(0, 8)}`);
206
+ delete transports[sid];
207
+ delete sessionLastActivity[sid];
208
+ transport.close?.();
209
+ return;
210
+ }
211
+ workspaceManager?.ensureSession(sid);
212
+ console.log(`[mcp] New session ${sid.slice(0, 8)} (${Object.keys(transports).length} active) [${ip}]`);
213
+ },
214
+ });
215
+ transport.onclose = () => {
216
+ const sid = transport.sessionId;
217
+ if (sid && transports[sid]) {
218
+ delete transports[sid];
219
+ delete sessionLastActivity[sid];
220
+ sessionStateManager.cleanup(sid);
221
+ ipLimiter?.remove(sid);
222
+ workspaceManager?.cleanup(sid);
223
+ console.log(`[mcp] Session ${sid.slice(0, 8)} closed (${Object.keys(transports).length} active)`);
224
+ }
225
+ };
226
+ const server = createMcpServer(bashInstances, sessionStateManager, () => transport.sessionId ?? undefined, bashTelemetry, workspaceManager);
227
+ await server.connect(transport);
228
+ await transport.handleRequest(req, res, req.body);
229
+ return;
230
+ }
231
+ // Invalid request
232
+ res.status(400).json({
233
+ jsonrpc: "2.0",
234
+ error: { code: -32000, message: "Bad Request: No valid session. Send an initialize request first." },
235
+ id: null,
236
+ });
237
+ }
238
+ catch (error) {
239
+ console.error("[MCP] Error handling POST request:", error);
240
+ if (!res.headersSent) {
241
+ res.status(500).json({
242
+ jsonrpc: "2.0",
243
+ error: { code: -32603, message: "Internal server error" },
244
+ id: null,
245
+ });
246
+ }
247
+ }
248
+ });
249
+ // SSE stream for server-initiated notifications.
250
+ // Returns 405 when no valid session — the SDK interprets this as
251
+ // "server doesn't offer SSE at GET" which is the expected no-auth path.
252
+ // Returning 400 instead would cause the SDK to throw and trigger auth flow.
253
+ app.get("/mcp", async (req, res) => {
254
+ const sessionId = req.headers["mcp-session-id"];
255
+ if (sessionId && transports[sessionId]) {
256
+ await transports[sessionId].handleRequest(req, res);
257
+ }
258
+ else {
259
+ res.status(405).json({
260
+ jsonrpc: "2.0",
261
+ error: { code: -32000, message: "Method Not Allowed" },
262
+ id: null,
263
+ });
264
+ }
265
+ });
266
+ // Session termination
267
+ app.delete("/mcp", async (req, res) => {
268
+ const sessionId = req.headers["mcp-session-id"];
269
+ if (sessionId && transports[sessionId]) {
270
+ await transports[sessionId].handleRequest(req, res);
271
+ }
272
+ else {
273
+ res.status(400).json({
274
+ jsonrpc: "2.0",
275
+ error: { code: -32000, message: "Invalid or missing session ID" },
276
+ id: null,
277
+ });
278
+ }
279
+ });
280
+ // ---------------------------------------------------------------------------
281
+ // Health check
282
+ // ---------------------------------------------------------------------------
283
+ app.get("/health", async (_req, res) => {
284
+ const uptime = Math.floor((Date.now() - startedAt.getTime()) / 1000);
285
+ const needsDb = hasSearchTools() || hasCollectTools() || hasBashSemanticSearch();
286
+ if (!needsDb) {
287
+ res.json({
288
+ status: "ok",
289
+ server: getServerConfig().server.name,
290
+ uptime_seconds: uptime,
291
+ started_at: startedAt.toISOString(),
292
+ indexing: false,
293
+ index: "not_configured",
294
+ });
295
+ return;
296
+ }
297
+ try {
298
+ const stats = await getIndexStats();
299
+ res.json({
300
+ status: "ok",
301
+ server: getServerConfig().server.name,
302
+ uptime_seconds: uptime,
303
+ started_at: startedAt.toISOString(),
304
+ indexing: orchestratorRef?.isIndexing() ?? false,
305
+ index: {
306
+ total_chunks: stats.totalChunks,
307
+ by_source: stats.bySource,
308
+ indexed_repos: stats.indexedRepos,
309
+ sources: stats.indexStates.map((s) => ({
310
+ type: s.source_type,
311
+ key: s.source_key,
312
+ status: s.status,
313
+ last_indexed: s.last_indexed_at,
314
+ commit: s.last_commit_sha?.slice(0, 8) ?? null,
315
+ error: s.error_message ?? null,
316
+ })),
317
+ },
318
+ });
319
+ }
320
+ catch (err) {
321
+ console.error("[health] Database unavailable:", err);
322
+ res.status(503).json({
323
+ status: "degraded",
324
+ server: getServerConfig().server.name,
325
+ uptime_seconds: uptime,
326
+ started_at: startedAt.toISOString(),
327
+ index: "unavailable",
328
+ error: err instanceof Error ? err.message : String(err),
329
+ });
330
+ }
331
+ });
332
+ // ---------------------------------------------------------------------------
333
+ // llms.txt and llms-full.txt — cached, invalidated on reindex
334
+ // ---------------------------------------------------------------------------
335
+ let cachedLlmsTxt = null;
336
+ let cachedLlmsFullTxt = null;
337
+ app.get('/llms.txt', async (_req, res) => {
338
+ try {
339
+ if (!cachedLlmsTxt) {
340
+ const chunks = await getAllChunksForLlms();
341
+ cachedLlmsTxt = generateLlmsTxt(chunks, getServerConfig().server.name);
342
+ }
343
+ res.type('text/plain').send(cachedLlmsTxt);
344
+ }
345
+ catch (err) {
346
+ console.error("[llms.txt] Generation failed:", err);
347
+ res.status(503).type('text/plain').send('# Service unavailable\nIndex not ready.');
348
+ }
349
+ });
350
+ app.get('/llms-full.txt', async (_req, res) => {
351
+ try {
352
+ if (!cachedLlmsFullTxt) {
353
+ const chunks = await getAllChunksForLlms();
354
+ cachedLlmsFullTxt = generateLlmsFullTxt(chunks);
355
+ }
356
+ res.type('text/plain').send(cachedLlmsFullTxt);
357
+ }
358
+ catch (err) {
359
+ console.error("[llms-full.txt] Generation failed:", err);
360
+ res.status(503).type('text/plain').send('Service unavailable — index not ready.');
361
+ }
362
+ });
363
+ // ---------------------------------------------------------------------------
364
+ // skill.md — dynamically generated from server config
365
+ // ---------------------------------------------------------------------------
366
+ app.get('/.well-known/skills/default/skill.md', (_req, res) => {
367
+ try {
368
+ res.type('text/markdown').send(generateSkillMd(getServerConfig()));
369
+ }
370
+ catch (err) {
371
+ console.error('[skill.md] Generation failed:', err);
372
+ res.status(500).type('text/plain').send('Error generating skill.md');
373
+ }
374
+ });
375
+ // ---------------------------------------------------------------------------
376
+ // Startup
377
+ // ---------------------------------------------------------------------------
378
+ export async function startServer(options) {
379
+ if (options?.configPath) {
380
+ process.env.PATHFINDER_CONFIG = options.configPath;
381
+ }
382
+ const cfg = getConfig();
383
+ const serverCfg = getServerConfig();
384
+ const port = options?.port ?? cfg.port;
385
+ // Configure session TTL and IP rate limiter from config
386
+ const maxSessionsPerIp = serverCfg.server.max_sessions_per_ip ?? 20;
387
+ SESSION_TTL_MS = (serverCfg.server.session_ttl_minutes ?? 30) * 60 * 1000;
388
+ ipLimiter = new IpSessionLimiter(maxSessionsPerIp);
389
+ console.log(`[startup] IP rate limit: ${maxSessionsPerIp} sessions/IP, TTL: ${serverCfg.server.session_ttl_minutes ?? 30}m`);
390
+ // Initialize workspace manager if any bash tool has workspace enabled
391
+ const hasBashWorkspace = serverCfg.tools.some(t => t.type === 'bash' && t.bash?.workspace === true);
392
+ const workspaceDir = process.env.WORKSPACE_DIR ?? '/tmp/pathfinder-workspaces';
393
+ if (hasBashWorkspace) {
394
+ workspaceManager = new WorkspaceManager(workspaceDir);
395
+ console.log(`[startup] Workspace manager enabled (dir: ${workspaceDir})`);
396
+ }
397
+ const needsDb = hasSearchTools() || hasCollectTools() || hasBashSemanticSearch();
398
+ if (needsDb) {
399
+ console.log("[startup] Initializing database schema...");
400
+ await initializeSchema();
401
+ console.log("[startup] Database schema ready.");
402
+ // Set up bash telemetry with periodic flush
403
+ bashTelemetry = new BashTelemetry(insertCollectedData);
404
+ telemetryFlushInterval = setInterval(() => {
405
+ bashTelemetry?.flush().catch(err => console.error('[telemetry] Periodic flush failed:', err instanceof Error ? err.message : String(err)));
406
+ }, 60_000);
407
+ console.log("[startup] Bash telemetry enabled (60s flush interval).");
408
+ }
409
+ // Log active sources from config
410
+ const sourceNames = serverCfg.sources.map(s => `${s.name} (${s.type})`);
411
+ console.log(`[startup] Active sources: ${sourceNames.join(', ')}`);
412
+ // Build shared Bash instances for bash tools. The filesystem is shared;
413
+ // per-session CWD tracking is handled at the tool registration layer.
414
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
415
+ const searchToolNames = serverCfg.tools.filter(t => t.type === 'search').map(t => t.name);
416
+ for (const tool of bashTools) {
417
+ const toolSources = serverCfg.sources.filter(s => tool.sources.includes(s.name));
418
+ const virtualFiles = tool.bash?.virtual_files === true;
419
+ const filesMap = await buildBashFilesMap(toolSources, {
420
+ virtualFiles,
421
+ searchToolNames: virtualFiles ? searchToolNames : undefined,
422
+ cloneDir: cfg.cloneDir,
423
+ });
424
+ bashInstances.set(tool.name, new Bash({ files: filesMap, cwd: '/' }));
425
+ console.log(`[startup] Bash tool "${tool.name}": ${Object.keys(filesMap).length} files loaded`);
426
+ }
427
+ // Indexing and webhooks only needed when search tools are configured
428
+ if (hasSearchTools()) {
429
+ const orchestrator = new IndexingOrchestrator();
430
+ orchestratorRef = orchestrator;
431
+ webhookHandler = createWebhookHandler(orchestrator);
432
+ orchestrator.onReindexComplete = (sourceNames) => {
433
+ // Invalidate llms.txt caches so next request regenerates
434
+ cachedLlmsTxt = null;
435
+ cachedLlmsFullTxt = null;
436
+ refreshBashInstances(sourceNames, "reindex").catch((err) => {
437
+ console.error("[reindex] Bash refresh failed:", err);
438
+ });
439
+ };
440
+ orchestrator.checkAndIndex().catch((err) => {
441
+ console.error("[startup] Initial index check failed:", err);
442
+ });
443
+ orchestrator.startNightlyReindex();
444
+ }
445
+ else {
446
+ console.log("[startup] No search tools configured — skipping indexing");
447
+ }
448
+ const serverName = serverCfg.server.name;
449
+ const server = app.listen(port, () => {
450
+ console.log(`[${serverName}] Running at http://localhost:${port}/mcp`);
451
+ console.log(`[health] http://localhost:${port}/health`);
452
+ });
453
+ server.on("error", (err) => {
454
+ if (err.code === "EADDRINUSE") {
455
+ console.error(`[startup] Port ${port} is already in use. Set PORT env var to use a different port.`);
456
+ }
457
+ else {
458
+ console.error(`[startup] Server error:`, err);
459
+ }
460
+ process.exit(1);
461
+ });
462
+ // -------------------------------------------------------------------
463
+ // Graceful shutdown
464
+ // -------------------------------------------------------------------
465
+ async function shutdown(signal) {
466
+ console.log(`\n[shutdown] Received ${signal}, shutting down...`);
467
+ if (telemetryFlushInterval)
468
+ clearInterval(telemetryFlushInterval);
469
+ try {
470
+ await bashTelemetry?.flush();
471
+ }
472
+ catch (e) {
473
+ console.error('[shutdown] Telemetry flush failed:', e);
474
+ }
475
+ try {
476
+ workspaceManager?.cleanupAll();
477
+ }
478
+ catch (e) {
479
+ console.error('[shutdown] Workspace cleanup failed:', e);
480
+ }
481
+ try {
482
+ await closePool();
483
+ }
484
+ catch (e) {
485
+ console.error('[shutdown] DB pool close failed:', e);
486
+ }
487
+ process.exit(0);
488
+ }
489
+ process.on("SIGINT", () => shutdown("SIGINT"));
490
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
491
+ }
492
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAA8B,MAAM,SAAS,CAAC;AACrD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjH,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,GAAG,CAAC,GAAG,CACH,IAAI,CAAC;IACD,MAAM,EAAE,GAAG;IACX,cAAc,EAAE,CAAC,gBAAgB,CAAC;CACrC,CAAC,CACL,CAAC;AAEF,sDAAsD;AACtD,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACxB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC;AACX,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,6EAA6E;AAC7E,oDAAoD;AACpD,8EAA8E;AAE9E,IAAI,cAAc,GAA4D,IAAI,CAAC;AACnF,IAAI,eAAe,GAAgC,IAAI,CAAC;AACxD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;AAC7B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAC;AAC9C,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACtD,IAAI,aAAwC,CAAC;AAC7C,IAAI,sBAAkE,CAAC;AAEvE,KAAK,UAAU,oBAAoB,CAAC,WAAqB,EAAE,SAAS,GAAG,SAAS;IAC5E,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE1F,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE;YAC/D,YAAY;YACZ,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAC3D,QAAQ,EAAE,SAAS,EAAE,CAAC,QAAQ;SACjC,CAAC,CAAC;QACH,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,0BAA0B,IAAI,CAAC,IAAI,MAAM,SAAS,QAAQ,CAAC,CAAC;IACzF,CAAC;AACL,CAAC;AAED,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC1G,MAAM,OAAO,GAAG,cAAc,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IACD,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,uEAAuE;QACvE,6EAA6E;QAC7E,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,MAAM,CAAC;YAChC,UAAU,CAAC,GAAG,EAAE;gBACZ,oBAAoB,CAChB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACrC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC,CAAC;YACzE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,8EAA8E;AAC9E,qEAAqE;AACrE,4DAA4D;AAC5D,8EAA8E;AAE9E,sFAAsF;AACtF,yEAAyE;AACzE,GAAG,CAAC,GAAG,CAAC,uCAAuC,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;IACzD,GAAG,CAAC,IAAI,CAAC;QACL,QAAQ,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE;KACjC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,yCAAyC,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAChF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yEAAyE,EAAE,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yEAAyE,EAAE,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAE9E,MAAM,UAAU,GAAkD,EAAE,CAAC;AACrE,MAAM,mBAAmB,GAA2B,EAAE,CAAC;AACvD,IAAI,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,2CAA2C;AAChF,IAAI,SAAuC,CAAC;AAC5C,IAAI,gBAA8C,CAAC;AAEnD,qCAAqC;AACrC,WAAW,CAAC,GAAG,EAAE;IACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,cAAc,EAAE,CAAC;YAClD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC;gBAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;YACvI,IAAI,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;YACnG,IAAI,CAAC;gBAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,sCAAsC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;YACjI,MAAM,EAAE,CAAC;QACb,CAAC;IACL,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,mBAAmB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC;IACnG,CAAC;AACL,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAElB,SAAS,QAAQ,CAAC,GAAY;IAC1B,OAAQ,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;WACjE,GAAG,CAAC,MAAM,CAAC,aAAa;WACxB,SAAS,CAAC;AACrB,CAAC;AAED,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACnD,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEzB,4CAA4C;QAC5C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,mBAAmB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC;YACtD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAA6C,CAAC;gBACvE,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,EAAE,SAAgD,CAAC;gBACtE,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBACvE,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,IAAI,WAAW,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC7D,CAAC;oBAAC,MAAM,CAAC;wBACL,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,uBAAuB,EAAE,GAAG,CAAC,CAAC;oBAC/D,CAAC;gBACL,CAAC;qBAAM,IAAI,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACnF,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBAChC,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;oBAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC;iBAAM,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO;QACX,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAChD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;gBACtC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC1B,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;oBAC5B,mBAAmB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACtC,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;wBAC1C,8CAA8C;wBAC9C,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;wBAC3F,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;wBACvB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;wBAChC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;wBACpB,OAAO;oBACX,CAAC;oBACD,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,aAAa,EAAE,GAAG,CAAC,CAAC;gBAC3G,CAAC;aACJ,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;gBAChC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;oBACvB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBAChC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACjC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;oBACvB,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC;gBACtG,CAAC;YACL,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;YAC5I,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO;QACX,CAAC;QAED,kBAAkB;QAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,kEAAkE,EAAE;YACpG,EAAE,EAAE,IAAI;SACX,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;gBACzD,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iDAAiD;AACjD,iEAAiE;AACjE,wEAAwE;AACxE,4EAA4E;AAC5E,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAClD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE;YACtD,EAAE,EAAE,IAAI;SACX,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACrD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;IACtE,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACjE,EAAE,EAAE,IAAI;SACX,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,cAAc,EAAE,IAAI,eAAe,EAAE,IAAI,qBAAqB,EAAE,CAAC;IAEjF,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI;YACrC,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,SAAS,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,gBAAgB;SAC1B,CAAC,CAAC;QACH,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI;YACrC,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,SAAS,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAG,eAA+C,EAAE,UAAU,EAAE,IAAI,KAAK;YACjF,KAAK,EAAE;gBACH,YAAY,EAAE,KAAK,CAAC,WAAW;gBAC/B,SAAS,EAAE,KAAK,CAAC,QAAQ;gBACzB,aAAa,EAAE,KAAK,CAAC,YAAY;gBACjC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,IAAI,EAAE,CAAC,CAAC,WAAW;oBACnB,GAAG,EAAE,CAAC,CAAC,UAAU;oBACjB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,YAAY,EAAE,CAAC,CAAC,eAAe;oBAC/B,MAAM,EAAE,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI;oBAC9C,KAAK,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;iBACjC,CAAC,CAAC;aACN;SACJ,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI;YACrC,cAAc,EAAE,MAAM;YACtB,UAAU,EAAE,SAAS,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAE5C,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACxD,IAAI,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC3C,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACvF,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC3C,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtF,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,GAAG,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC7E,IAAI,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzE,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAuB;IACrD,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IACvD,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;IAEvC,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC;IACpE,cAAc,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1E,SAAS,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,4BAA4B,gBAAgB,sBAAsB,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,GAAG,CAAC,CAAC;IAE7H,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;IACpG,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,4BAA4B,CAAC;IAC/E,IAAI,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,6CAA6C,YAAY,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,EAAE,IAAI,eAAe,EAAE,IAAI,qBAAqB,EAAE,CAAC;IAEjF,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,MAAM,gBAAgB,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,4CAA4C;QAC5C,aAAa,GAAG,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAAC;QACvD,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,aAAa,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAC/B,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACxG,CAAC;QACN,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnE,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1F,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;YAClD,YAAY;YACZ,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAC3D,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC;IACpG,CAAC;IAED,qEAAqE;IACrE,IAAI,cAAc,EAAE,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAChD,eAAe,GAAG,YAAY,CAAC;QAC/B,cAAc,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAEpD,YAAY,CAAC,iBAAiB,GAAG,CAAC,WAAW,EAAE,EAAE;YAC7C,yDAAyD;YACzD,aAAa,GAAG,IAAI,CAAC;YACrB,iBAAiB,GAAG,IAAI,CAAC;YACzB,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvD,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,mBAAmB,EAAE,CAAC;IACvC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,iCAAiC,IAAI,MAAM,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,+DAA+D,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,oBAAoB;IACpB,sEAAsE;IAEtE,KAAK,UAAU,QAAQ,CAAC,MAAc;QAClC,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,oBAAoB,CAAC,CAAC;QACjE,IAAI,sBAAsB;YAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAClE,IAAI,CAAC;YAAC,MAAM,aAAa,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAC3G,IAAI,CAAC;YAAC,gBAAgB,EAAE,UAAU,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAC/G,IAAI,CAAC;YAAC,MAAM,SAAS,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ServerConfig } from './types.js';
2
+ export declare function generateSkillMd(config: ServerConfig): string;
3
+ //# sourceMappingURL=skill-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-md.d.ts","sourceRoot":"","sources":["../src/skill-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4E5D"}
@@ -0,0 +1,75 @@
1
+ export function generateSkillMd(config) {
2
+ const searchTools = config.tools.filter(t => t.type === 'search').map(t => t.name);
3
+ const bashTools = config.tools.filter(t => t.type === 'bash').map(t => t.name);
4
+ const collectTools = config.tools.filter(t => t.type === 'collect').map(t => t.name);
5
+ const sources = config.sources.map(s => `${s.name} (${s.type})`);
6
+ const hasWorkspace = config.tools.some(t => t.type === 'bash' && t.bash?.workspace === true);
7
+ const hasQmd = config.tools.some(t => t.type === 'bash' && t.bash?.grep_strategy && t.bash.grep_strategy !== 'memory');
8
+ const lines = [
9
+ `# ${config.server.name}`,
10
+ '',
11
+ 'Pathfinder is an MCP server providing semantic search and filesystem exploration over documentation and code.',
12
+ '',
13
+ '## Available Tools',
14
+ '',
15
+ ];
16
+ if (searchTools.length > 0) {
17
+ lines.push('### Semantic Search');
18
+ for (const name of searchTools)
19
+ lines.push(`- **${name}**: Search indexed content by meaning. Use for conceptual queries like "how does auth work?"`);
20
+ lines.push('');
21
+ }
22
+ if (bashTools.length > 0) {
23
+ lines.push('### Filesystem Exploration');
24
+ for (const name of bashTools)
25
+ lines.push(`- **${name}**: Run bash commands (find, grep, cat, ls, head, tail, cd) over a virtual filesystem of docs/code`);
26
+ lines.push('');
27
+ lines.push('#### Supported Commands');
28
+ lines.push('- `find / -name "*.mdx"` — find files by pattern');
29
+ lines.push('- `grep -rl "pattern" /path` — search file contents (standard grep, all flags work)');
30
+ lines.push('- `cat /path/to/file.mdx` — read file contents');
31
+ lines.push('- `ls /path/` — list directory contents');
32
+ lines.push('- `cd /path/` — change working directory (persists across calls)');
33
+ if (hasQmd) {
34
+ lines.push('- `qmd "natural language query"` — semantic search via embeddings (returns file:line:content)');
35
+ }
36
+ lines.push('- `related /path/to/file.mdx` — find semantically similar files');
37
+ if (hasWorkspace) {
38
+ lines.push('');
39
+ lines.push('#### Workspace');
40
+ lines.push('- `/workspace/` is a writable area for saving intermediate results');
41
+ lines.push('- Use `echo "content" > /workspace/notes.md` to save files');
42
+ lines.push('- Workspace is session-scoped and size-limited');
43
+ }
44
+ lines.push('');
45
+ }
46
+ if (collectTools.length > 0) {
47
+ lines.push('### Data Collection');
48
+ for (const name of collectTools)
49
+ lines.push(`- **${name}**: Submit structured data`);
50
+ lines.push('');
51
+ }
52
+ lines.push('## When to Use Search vs Explore');
53
+ lines.push('');
54
+ lines.push('| Need | Tool |');
55
+ lines.push('|------|------|');
56
+ lines.push('| Conceptual question ("how does X work?") | search |');
57
+ lines.push('| Find exact code or config | explore (grep) |');
58
+ lines.push('| Browse directory structure | explore (find, ls) |');
59
+ lines.push('| Read a specific file | explore (cat) |');
60
+ if (hasQmd)
61
+ lines.push('| Semantic code search | explore (qmd) |');
62
+ lines.push('');
63
+ lines.push('## Sources');
64
+ lines.push('');
65
+ for (const s of sources)
66
+ lines.push(`- ${s}`);
67
+ lines.push('');
68
+ lines.push('## Limitations');
69
+ lines.push('');
70
+ lines.push('- Filesystem is read-only (except /workspace/)');
71
+ lines.push('- File content is from the last index update, not real-time');
72
+ lines.push('- Pipes in bash commands are limited to basic patterns');
73
+ return lines.join('\n');
74
+ }
75
+ //# sourceMappingURL=skill-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-md.js","sourceRoot":"","sources":["../src/skill-md.ts"],"names":[],"mappings":"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"}