@copilotkit/pathfinder 1.1.0 → 1.5.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 (154) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/README.md +65 -248
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +70 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +8 -0
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +58 -5
  10. package/dist/config.js.map +1 -1
  11. package/dist/db/client.d.ts.map +1 -1
  12. package/dist/db/client.js +3 -1
  13. package/dist/db/client.js.map +1 -1
  14. package/dist/db/queries.d.ts +21 -4
  15. package/dist/db/queries.d.ts.map +1 -1
  16. package/dist/db/queries.js +101 -45
  17. package/dist/db/queries.js.map +1 -1
  18. package/dist/db/schema.d.ts +5 -0
  19. package/dist/db/schema.d.ts.map +1 -1
  20. package/dist/db/schema.js +11 -0
  21. package/dist/db/schema.js.map +1 -1
  22. package/dist/faq-txt.d.ts +12 -0
  23. package/dist/faq-txt.d.ts.map +1 -0
  24. package/dist/faq-txt.js +37 -0
  25. package/dist/faq-txt.js.map +1 -0
  26. package/dist/index.js +2 -362
  27. package/dist/index.js.map +1 -1
  28. package/dist/indexing/chunking/html.d.ts +7 -0
  29. package/dist/indexing/chunking/html.d.ts.map +1 -0
  30. package/dist/indexing/chunking/html.js +356 -0
  31. package/dist/indexing/chunking/html.js.map +1 -0
  32. package/dist/indexing/chunking/index.js +5 -0
  33. package/dist/indexing/chunking/index.js.map +1 -1
  34. package/dist/indexing/chunking/qa.d.ts +8 -0
  35. package/dist/indexing/chunking/qa.d.ts.map +1 -0
  36. package/dist/indexing/chunking/qa.js +22 -0
  37. package/dist/indexing/chunking/qa.js.map +1 -0
  38. package/dist/indexing/distiller.d.ts +29 -0
  39. package/dist/indexing/distiller.d.ts.map +1 -0
  40. package/dist/indexing/distiller.js +104 -0
  41. package/dist/indexing/distiller.js.map +1 -0
  42. package/dist/indexing/orchestrator.d.ts +9 -3
  43. package/dist/indexing/orchestrator.d.ts.map +1 -1
  44. package/dist/indexing/orchestrator.js +113 -83
  45. package/dist/indexing/orchestrator.js.map +1 -1
  46. package/dist/indexing/pipeline.d.ts +18 -0
  47. package/dist/indexing/pipeline.d.ts.map +1 -0
  48. package/dist/indexing/pipeline.js +68 -0
  49. package/dist/indexing/pipeline.js.map +1 -0
  50. package/dist/indexing/providers/discord-api.d.ts +79 -0
  51. package/dist/indexing/providers/discord-api.d.ts.map +1 -0
  52. package/dist/indexing/providers/discord-api.js +167 -0
  53. package/dist/indexing/providers/discord-api.js.map +1 -0
  54. package/dist/indexing/providers/discord.d.ts +25 -0
  55. package/dist/indexing/providers/discord.d.ts.map +1 -0
  56. package/dist/indexing/providers/discord.js +282 -0
  57. package/dist/indexing/providers/discord.js.map +1 -0
  58. package/dist/indexing/providers/file.d.ts +18 -0
  59. package/dist/indexing/providers/file.d.ts.map +1 -0
  60. package/dist/indexing/providers/file.js +262 -0
  61. package/dist/indexing/providers/file.js.map +1 -0
  62. package/dist/indexing/providers/index.d.ts +5 -0
  63. package/dist/indexing/providers/index.d.ts.map +1 -0
  64. package/dist/indexing/providers/index.js +22 -0
  65. package/dist/indexing/providers/index.js.map +1 -0
  66. package/dist/indexing/providers/slack-api.d.ts +62 -0
  67. package/dist/indexing/providers/slack-api.d.ts.map +1 -0
  68. package/dist/indexing/providers/slack-api.js +167 -0
  69. package/dist/indexing/providers/slack-api.js.map +1 -0
  70. package/dist/indexing/providers/slack.d.ts +21 -0
  71. package/dist/indexing/providers/slack.d.ts.map +1 -0
  72. package/dist/indexing/providers/slack.js +192 -0
  73. package/dist/indexing/providers/slack.js.map +1 -0
  74. package/dist/indexing/providers/types.d.ts +56 -0
  75. package/dist/indexing/providers/types.d.ts.map +1 -0
  76. package/dist/indexing/providers/types.js +3 -0
  77. package/dist/indexing/providers/types.js.map +1 -0
  78. package/dist/indexing/url-derivation.d.ts +2 -2
  79. package/dist/indexing/url-derivation.d.ts.map +1 -1
  80. package/dist/indexing/url-derivation.js.map +1 -1
  81. package/dist/indexing/utils.d.ts +19 -0
  82. package/dist/indexing/utils.d.ts.map +1 -0
  83. package/dist/indexing/utils.js +63 -0
  84. package/dist/indexing/utils.js.map +1 -0
  85. package/dist/ip-limiter.d.ts +11 -0
  86. package/dist/ip-limiter.d.ts.map +1 -0
  87. package/dist/ip-limiter.js +40 -0
  88. package/dist/ip-limiter.js.map +1 -0
  89. package/dist/llms-txt.d.ts +11 -0
  90. package/dist/llms-txt.d.ts.map +1 -0
  91. package/dist/llms-txt.js +43 -0
  92. package/dist/llms-txt.js.map +1 -0
  93. package/dist/mcp/server.d.ts +3 -1
  94. package/dist/mcp/server.d.ts.map +1 -1
  95. package/dist/mcp/server.js +9 -1
  96. package/dist/mcp/server.js.map +1 -1
  97. package/dist/mcp/tools/bash-fs.d.ts.map +1 -1
  98. package/dist/mcp/tools/bash-fs.js +4 -1
  99. package/dist/mcp/tools/bash-fs.js.map +1 -1
  100. package/dist/mcp/tools/bash.d.ts +8 -0
  101. package/dist/mcp/tools/bash.d.ts.map +1 -1
  102. package/dist/mcp/tools/bash.js +59 -0
  103. package/dist/mcp/tools/bash.js.map +1 -1
  104. package/dist/mcp/tools/knowledge.d.ts +13 -0
  105. package/dist/mcp/tools/knowledge.d.ts.map +1 -0
  106. package/dist/mcp/tools/knowledge.js +92 -0
  107. package/dist/mcp/tools/knowledge.js.map +1 -0
  108. package/dist/mcp/tools/search.d.ts.map +1 -1
  109. package/dist/mcp/tools/search.js +11 -3
  110. package/dist/mcp/tools/search.js.map +1 -1
  111. package/dist/server.d.ts +6 -0
  112. package/dist/server.d.ts.map +1 -0
  113. package/dist/server.js +595 -0
  114. package/dist/server.js.map +1 -0
  115. package/dist/skill-md.d.ts +3 -0
  116. package/dist/skill-md.d.ts.map +1 -0
  117. package/dist/skill-md.js +75 -0
  118. package/dist/skill-md.js.map +1 -0
  119. package/dist/types.d.ts +844 -38
  120. package/dist/types.d.ts.map +1 -1
  121. package/dist/types.js +88 -6
  122. package/dist/types.js.map +1 -1
  123. package/dist/validate.d.ts +29 -0
  124. package/dist/validate.d.ts.map +1 -0
  125. package/dist/validate.js +192 -0
  126. package/dist/validate.js.map +1 -0
  127. package/dist/webhooks/discord.d.ts +13 -0
  128. package/dist/webhooks/discord.d.ts.map +1 -0
  129. package/dist/webhooks/discord.js +57 -0
  130. package/dist/webhooks/discord.js.map +1 -0
  131. package/dist/webhooks/slack.d.ts +13 -0
  132. package/dist/webhooks/slack.d.ts.map +1 -0
  133. package/dist/webhooks/slack.js +106 -0
  134. package/dist/webhooks/slack.js.map +1 -0
  135. package/dist/workspace.d.ts +13 -0
  136. package/dist/workspace.d.ts.map +1 -0
  137. package/dist/workspace.js +118 -0
  138. package/dist/workspace.js.map +1 -0
  139. package/package.json +27 -2
  140. package/pathfinder-docs.yaml +54 -0
  141. package/pathfinder.example.yaml +48 -0
  142. package/.superpowers/brainstorm/47098-1775507869/content/homepage-mockup.html +0 -324
  143. package/.superpowers/brainstorm/47098-1775507869/state/server-stopped +0 -1
  144. package/.superpowers/brainstorm/47098-1775507869/state/server.log +0 -13
  145. package/.superpowers/brainstorm/47098-1775507869/state/server.pid +0 -1
  146. package/.superpowers/brainstorm/82141-1775511032/content/migration-v2.html +0 -340
  147. package/.superpowers/brainstorm/82141-1775511032/content/migration.html +0 -340
  148. package/.superpowers/brainstorm/82141-1775511032/state/server-stopped +0 -1
  149. package/.superpowers/brainstorm/82141-1775511032/state/server.log +0 -4
  150. package/.superpowers/brainstorm/82141-1775511032/state/server.pid +0 -1
  151. package/dist/indexing/source-indexer.d.ts +0 -68
  152. package/dist/indexing/source-indexer.d.ts.map +0 -1
  153. package/dist/indexing/source-indexer.js +0 -379
  154. package/dist/indexing/source-indexer.js.map +0 -1
package/dist/server.js ADDED
@@ -0,0 +1,595 @@
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, getFaqChunks } from "./db/queries.js";
11
+ import { getConfig, getServerConfig, hasSearchTools, hasKnowledgeTools, hasCollectTools, hasBashSemanticSearch } from "./config.js";
12
+ import { isSlackSourceConfig, isDiscordSourceConfig } from "./types.js";
13
+ import { IndexingOrchestrator } from "./indexing/orchestrator.js";
14
+ import { createWebhookHandler } from "./webhooks/github.js";
15
+ import { createSlackWebhookHandler } from "./webhooks/slack.js";
16
+ import { createDiscordWebhookHandler } from "./webhooks/discord.js";
17
+ import { SessionStateManager } from "./mcp/tools/bash-session.js";
18
+ import { BashTelemetry } from "./mcp/tools/bash-telemetry.js";
19
+ import { insertCollectedData } from "./db/queries.js";
20
+ import { IpSessionLimiter } from "./ip-limiter.js";
21
+ import { WorkspaceManager } from "./workspace.js";
22
+ import { generateLlmsTxt, generateLlmsFullTxt } from "./llms-txt.js";
23
+ import { generateFaqTxt } from "./faq-txt.js";
24
+ import { generateSkillMd } from "./skill-md.js";
25
+ const app = express();
26
+ app.use(cors({
27
+ origin: "*",
28
+ exposedHeaders: ["Mcp-Session-Id"],
29
+ }));
30
+ // Advertise llms.txt via Link header on all responses
31
+ app.use((_req, res, next) => {
32
+ res.setHeader('Link', '</llms.txt>; rel="llms-txt", </faq.txt>; rel="faq"');
33
+ next();
34
+ });
35
+ // ---------------------------------------------------------------------------
36
+ // Webhook endpoint — registered BEFORE express.json() so the handler receives
37
+ // a raw Buffer for HMAC signature verification.
38
+ //
39
+ // The handler is wired to the real orchestrator during start(). Until then,
40
+ // requests receive 503 (server still initializing).
41
+ // ---------------------------------------------------------------------------
42
+ let webhookHandler = null;
43
+ let slackWebhookHandler = null;
44
+ let discordWebhookHandler = null;
45
+ let orchestratorRef = null;
46
+ const startedAt = new Date();
47
+ const bashInstances = new Map();
48
+ const sessionStateManager = new SessionStateManager();
49
+ let bashTelemetry;
50
+ let telemetryFlushInterval;
51
+ async function refreshBashInstances(sourceNames, logPrefix = "webhook") {
52
+ const serverCfg = getServerConfig();
53
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
54
+ const searchToolNames = serverCfg.tools.filter(t => t.type === 'search').map(t => t.name);
55
+ for (const tool of bashTools) {
56
+ const affected = tool.sources.some(s => sourceNames.includes(s));
57
+ if (!affected)
58
+ continue;
59
+ const toolSources = serverCfg.sources.filter(s => tool.sources.includes(s.name));
60
+ const virtualFiles = tool.bash?.virtual_files === true;
61
+ const { bash, fileCount } = await rebuildBashInstance(toolSources, {
62
+ virtualFiles,
63
+ searchToolNames: virtualFiles ? searchToolNames : undefined,
64
+ cloneDir: getConfig().cloneDir,
65
+ });
66
+ bashInstances.set(tool.name, bash);
67
+ console.log(`[${logPrefix}] Refreshed bash tool "${tool.name}": ${fileCount} files`);
68
+ }
69
+ }
70
+ app.post("/webhooks/github", express.raw({ type: "application/json" }), async (req, res) => {
71
+ const handler = webhookHandler;
72
+ if (!handler) {
73
+ res.status(503).json({ error: "Server still initializing" });
74
+ return;
75
+ }
76
+ try {
77
+ await handler(req, res);
78
+ // Schedule bash refresh after reindexing. The orchestrator runs async,
79
+ // so we use a delay heuristic — TODO: replace with event-based notification.
80
+ const serverCfg = getServerConfig();
81
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
82
+ if (bashTools.length > 0) {
83
+ const REFRESH_DELAY_MS = 30_000;
84
+ setTimeout(() => {
85
+ refreshBashInstances(serverCfg.sources.map(s => s.name)).catch(err => console.error('[webhook] Bash refresh failed:', err));
86
+ }, REFRESH_DELAY_MS);
87
+ }
88
+ }
89
+ catch (err) {
90
+ console.error("[webhook] Handler error:", err);
91
+ if (!res.headersSent) {
92
+ res.status(500).json({ error: "Internal webhook handler error" });
93
+ }
94
+ }
95
+ });
96
+ // Slack webhook endpoint — also before express.json() for raw body signature verification
97
+ app.post("/webhooks/slack", express.raw({ type: "application/json" }), async (req, res) => {
98
+ const handler = slackWebhookHandler;
99
+ if (!handler) {
100
+ res.status(503).json({ error: "Server still initializing" });
101
+ return;
102
+ }
103
+ try {
104
+ await handler(req, res);
105
+ }
106
+ catch (err) {
107
+ console.error("[slack-webhook] Handler error:", err);
108
+ if (!res.headersSent) {
109
+ res.status(500).json({ error: "Internal webhook handler error" });
110
+ }
111
+ }
112
+ });
113
+ // Discord webhook endpoint — also before express.json() for raw body signature verification
114
+ app.post("/webhooks/discord", express.raw({ type: "application/json" }), async (req, res) => {
115
+ const handler = discordWebhookHandler;
116
+ if (!handler) {
117
+ res.status(503).json({ error: "Server still initializing" });
118
+ return;
119
+ }
120
+ try {
121
+ await handler(req, res);
122
+ }
123
+ catch (err) {
124
+ console.error("[discord-webhook] Handler error:", err);
125
+ if (!res.headersSent) {
126
+ res.status(500).json({ error: "Internal webhook handler error" });
127
+ }
128
+ }
129
+ });
130
+ // JSON parser for all other routes
131
+ app.use(express.json());
132
+ // ---------------------------------------------------------------------------
133
+ // OAuth discovery stubs — tell MCP clients that no auth is required.
134
+ // Newer Claude Code versions probe these before connecting.
135
+ // ---------------------------------------------------------------------------
136
+ // Return resource metadata with no authorization servers — signals "no auth required"
137
+ // per RFC 9728. Newer Claude Code versions probe this before connecting.
138
+ app.get("/.well-known/oauth-protected-resource", (req, res) => {
139
+ const host = req.headers.host || `localhost:${getConfig().port}`;
140
+ const proto = req.headers["x-forwarded-proto"] || "http";
141
+ res.json({
142
+ resource: `${proto}://${host}`,
143
+ });
144
+ });
145
+ app.get("/.well-known/oauth-authorization-server", (_req, res) => {
146
+ res.status(404).json({ error: "No authorization server — this resource does not require authentication" });
147
+ });
148
+ app.post("/register", (_req, res) => {
149
+ res.status(404).json({ error: "No authorization server — this resource does not require authentication" });
150
+ });
151
+ // ---------------------------------------------------------------------------
152
+ // MCP endpoint — session-based (initialize once, then tool calls reuse session)
153
+ // ---------------------------------------------------------------------------
154
+ const transports = {};
155
+ const sessionLastActivity = {};
156
+ let SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes default, overridden by config
157
+ let ipLimiter;
158
+ let workspaceManager;
159
+ // Reap idle sessions every 5 minutes
160
+ setInterval(() => {
161
+ const now = Date.now();
162
+ let reaped = 0;
163
+ for (const sid of Object.keys(sessionLastActivity)) {
164
+ if (now - sessionLastActivity[sid] > SESSION_TTL_MS) {
165
+ delete transports[sid];
166
+ delete sessionLastActivity[sid];
167
+ try {
168
+ sessionStateManager.cleanup(sid);
169
+ }
170
+ catch (e) {
171
+ console.error(`[mcp] Session state cleanup failed for ${sid.slice(0, 8)}:`, e);
172
+ }
173
+ try {
174
+ ipLimiter?.remove(sid);
175
+ }
176
+ catch (e) {
177
+ console.error(`[mcp] IP limiter cleanup failed:`, e);
178
+ }
179
+ try {
180
+ workspaceManager?.cleanup(sid);
181
+ }
182
+ catch (e) {
183
+ console.error(`[mcp] Workspace cleanup failed for ${sid.slice(0, 8)}:`, e);
184
+ }
185
+ reaped++;
186
+ }
187
+ }
188
+ if (reaped > 0) {
189
+ console.log(`[mcp] Reaped ${reaped} idle sessions (${Object.keys(transports).length} active)`);
190
+ }
191
+ }, 5 * 60 * 1000);
192
+ function clientIp(req) {
193
+ return req.headers["x-forwarded-for"]?.split(",")[0]?.trim()
194
+ || req.socket.remoteAddress
195
+ || "unknown";
196
+ }
197
+ app.post("/mcp", async (req, res) => {
198
+ try {
199
+ const sessionId = req.headers["mcp-session-id"];
200
+ const ip = clientIp(req);
201
+ // Existing session — route to its transport
202
+ if (sessionId && transports[sessionId]) {
203
+ sessionLastActivity[sessionId] = Date.now();
204
+ const method = req.body?.method;
205
+ if (method === 'tools/call') {
206
+ const params = req.body?.params;
207
+ const toolName = params?.name ?? 'unknown';
208
+ const args = params?.arguments;
209
+ const toolCfg = getServerConfig().tools.find(t => t.name === toolName);
210
+ if (toolCfg?.type === 'collect') {
211
+ try {
212
+ const dataPreview = JSON.stringify(args ?? {}).slice(0, 200);
213
+ console.log(`[mcp] ${toolName}(${dataPreview}) [${ip}]`);
214
+ }
215
+ catch {
216
+ console.log(`[mcp] ${toolName}(<unserializable>) [${ip}]`);
217
+ }
218
+ }
219
+ else if (toolCfg?.type === 'bash') {
220
+ const cmd = args?.command ?? '';
221
+ console.log(`[mcp] ${toolName}(${JSON.stringify(cmd).slice(0, 200)}) [${ip}]`);
222
+ }
223
+ else {
224
+ const query = args?.query ?? '';
225
+ const limit = args?.limit;
226
+ const extra = limit ? ` limit=${limit}` : '';
227
+ console.log(`[mcp] ${toolName}("${query}"${extra}) [${ip}]`);
228
+ }
229
+ }
230
+ else if (method === 'tools/list') {
231
+ console.log(`[mcp] tools/list [${ip}]`);
232
+ }
233
+ await transports[sessionId].handleRequest(req, res, req.body);
234
+ return;
235
+ }
236
+ // New session — must be an initialize request
237
+ if (!sessionId && isInitializeRequest(req.body)) {
238
+ const transport = new StreamableHTTPServerTransport({
239
+ sessionIdGenerator: () => randomUUID(),
240
+ onsessioninitialized: (sid) => {
241
+ transports[sid] = transport;
242
+ sessionLastActivity[sid] = Date.now();
243
+ if (ipLimiter && !ipLimiter.tryAdd(ip, sid)) {
244
+ // Rate limit exceeded — tear down immediately
245
+ console.warn(`[mcp] IP rate limit exceeded for ${ip}, closing session ${sid.slice(0, 8)}`);
246
+ delete transports[sid];
247
+ delete sessionLastActivity[sid];
248
+ transport.close?.();
249
+ return;
250
+ }
251
+ workspaceManager?.ensureSession(sid);
252
+ console.log(`[mcp] New session ${sid.slice(0, 8)} (${Object.keys(transports).length} active) [${ip}]`);
253
+ },
254
+ });
255
+ transport.onclose = () => {
256
+ const sid = transport.sessionId;
257
+ if (sid && transports[sid]) {
258
+ delete transports[sid];
259
+ delete sessionLastActivity[sid];
260
+ sessionStateManager.cleanup(sid);
261
+ ipLimiter?.remove(sid);
262
+ workspaceManager?.cleanup(sid);
263
+ console.log(`[mcp] Session ${sid.slice(0, 8)} closed (${Object.keys(transports).length} active)`);
264
+ }
265
+ };
266
+ const server = createMcpServer(bashInstances, sessionStateManager, () => transport.sessionId ?? undefined, bashTelemetry, workspaceManager);
267
+ await server.connect(transport);
268
+ await transport.handleRequest(req, res, req.body);
269
+ return;
270
+ }
271
+ // Invalid request
272
+ res.status(400).json({
273
+ jsonrpc: "2.0",
274
+ error: { code: -32000, message: "Bad Request: No valid session. Send an initialize request first." },
275
+ id: null,
276
+ });
277
+ }
278
+ catch (error) {
279
+ console.error("[MCP] Error handling POST request:", error);
280
+ if (!res.headersSent) {
281
+ res.status(500).json({
282
+ jsonrpc: "2.0",
283
+ error: { code: -32603, message: "Internal server error" },
284
+ id: null,
285
+ });
286
+ }
287
+ }
288
+ });
289
+ // SSE stream for server-initiated notifications.
290
+ // Returns 405 when no valid session — the SDK interprets this as
291
+ // "server doesn't offer SSE at GET" which is the expected no-auth path.
292
+ // Returning 400 instead would cause the SDK to throw and trigger auth flow.
293
+ app.get("/mcp", async (req, res) => {
294
+ const sessionId = req.headers["mcp-session-id"];
295
+ if (sessionId && transports[sessionId]) {
296
+ await transports[sessionId].handleRequest(req, res);
297
+ }
298
+ else {
299
+ res.status(405).json({
300
+ jsonrpc: "2.0",
301
+ error: { code: -32000, message: "Method Not Allowed" },
302
+ id: null,
303
+ });
304
+ }
305
+ });
306
+ // Session termination
307
+ app.delete("/mcp", async (req, res) => {
308
+ const sessionId = req.headers["mcp-session-id"];
309
+ if (sessionId && transports[sessionId]) {
310
+ await transports[sessionId].handleRequest(req, res);
311
+ }
312
+ else {
313
+ res.status(400).json({
314
+ jsonrpc: "2.0",
315
+ error: { code: -32000, message: "Invalid or missing session ID" },
316
+ id: null,
317
+ });
318
+ }
319
+ });
320
+ // ---------------------------------------------------------------------------
321
+ // Health check
322
+ // ---------------------------------------------------------------------------
323
+ app.get("/health", async (_req, res) => {
324
+ const uptime = Math.floor((Date.now() - startedAt.getTime()) / 1000);
325
+ const needsDb = hasSearchTools() || hasKnowledgeTools() || hasCollectTools() || hasBashSemanticSearch();
326
+ if (!needsDb) {
327
+ res.json({
328
+ status: "ok",
329
+ server: getServerConfig().server.name,
330
+ uptime_seconds: uptime,
331
+ started_at: startedAt.toISOString(),
332
+ indexing: false,
333
+ index: "not_configured",
334
+ });
335
+ return;
336
+ }
337
+ try {
338
+ const stats = await getIndexStats();
339
+ res.json({
340
+ status: "ok",
341
+ server: getServerConfig().server.name,
342
+ uptime_seconds: uptime,
343
+ started_at: startedAt.toISOString(),
344
+ indexing: orchestratorRef?.isIndexing() ?? false,
345
+ index: {
346
+ total_chunks: stats.totalChunks,
347
+ by_source: stats.bySource,
348
+ indexed_repos: stats.indexedRepos,
349
+ sources: stats.indexStates.map((s) => ({
350
+ type: s.source_type,
351
+ key: s.source_key,
352
+ status: s.status,
353
+ last_indexed: s.last_indexed_at,
354
+ commit: s.last_commit_sha?.slice(0, 8) ?? null,
355
+ error: s.error_message ?? null,
356
+ })),
357
+ },
358
+ });
359
+ }
360
+ catch (err) {
361
+ console.error("[health] Database unavailable:", err);
362
+ res.status(503).json({
363
+ status: "degraded",
364
+ server: getServerConfig().server.name,
365
+ uptime_seconds: uptime,
366
+ started_at: startedAt.toISOString(),
367
+ index: "unavailable",
368
+ error: err instanceof Error ? err.message : String(err),
369
+ });
370
+ }
371
+ });
372
+ // ---------------------------------------------------------------------------
373
+ // llms.txt and llms-full.txt — cached, invalidated on reindex
374
+ // ---------------------------------------------------------------------------
375
+ let cachedLlmsTxt = null;
376
+ let cachedLlmsFullTxt = null;
377
+ let cachedFaqTxt = null;
378
+ app.get('/llms.txt', async (_req, res) => {
379
+ try {
380
+ if (!cachedLlmsTxt) {
381
+ const chunks = await getAllChunksForLlms();
382
+ cachedLlmsTxt = generateLlmsTxt(chunks, getServerConfig().server.name);
383
+ }
384
+ res.type('text/plain').send(cachedLlmsTxt);
385
+ }
386
+ catch (err) {
387
+ console.error("[llms.txt] Generation failed:", err);
388
+ res.status(503).type('text/plain').send('# Service unavailable\nIndex not ready.');
389
+ }
390
+ });
391
+ app.get('/llms-full.txt', async (_req, res) => {
392
+ try {
393
+ if (!cachedLlmsFullTxt) {
394
+ const chunks = await getAllChunksForLlms();
395
+ cachedLlmsFullTxt = generateLlmsFullTxt(chunks);
396
+ }
397
+ res.type('text/plain').send(cachedLlmsFullTxt);
398
+ }
399
+ catch (err) {
400
+ console.error("[llms-full.txt] Generation failed:", err);
401
+ res.status(503).type('text/plain').send('Service unavailable — index not ready.');
402
+ }
403
+ });
404
+ app.get('/faq.txt', async (_req, res) => {
405
+ try {
406
+ if (!cachedFaqTxt) {
407
+ const serverCfg = getServerConfig();
408
+ // Find FAQ sources: sources with category === 'faq'
409
+ const faqSources = serverCfg.sources
410
+ .filter(s => ('category' in s) && s.category === 'faq')
411
+ .map(s => ({
412
+ name: s.name,
413
+ confidenceThreshold: isSlackSourceConfig(s) ? s.confidence_threshold
414
+ : isDiscordSourceConfig(s) ? s.confidence_threshold
415
+ : 0.7,
416
+ }));
417
+ if (faqSources.length === 0) {
418
+ cachedFaqTxt = generateFaqTxt([], serverCfg.server.name, []);
419
+ }
420
+ else {
421
+ // Fetch FAQ chunks per source with its confidence threshold
422
+ const allChunks = [];
423
+ for (const src of faqSources) {
424
+ try {
425
+ const chunks = await getFaqChunks([src.name], src.confidenceThreshold);
426
+ allChunks.push(...chunks);
427
+ }
428
+ catch (err) {
429
+ const msg = err instanceof Error ? err.message : String(err);
430
+ console.error(`[faq.txt] Failed to fetch chunks for source "${src.name}": ${msg}`);
431
+ }
432
+ }
433
+ cachedFaqTxt = generateFaqTxt(allChunks, serverCfg.server.name, faqSources);
434
+ }
435
+ }
436
+ res.type('text/plain').send(cachedFaqTxt);
437
+ }
438
+ catch (err) {
439
+ console.error("[faq.txt] Generation failed:", err);
440
+ res.status(503).type('text/plain').send('# Service unavailable\nFAQ index not ready.');
441
+ }
442
+ });
443
+ // ---------------------------------------------------------------------------
444
+ // skill.md — dynamically generated from server config
445
+ // ---------------------------------------------------------------------------
446
+ app.get('/.well-known/skills/default/skill.md', (_req, res) => {
447
+ try {
448
+ res.type('text/markdown').send(generateSkillMd(getServerConfig()));
449
+ }
450
+ catch (err) {
451
+ console.error('[skill.md] Generation failed:', err);
452
+ res.status(500).type('text/plain').send('Error generating skill.md');
453
+ }
454
+ });
455
+ // ---------------------------------------------------------------------------
456
+ // Startup
457
+ // ---------------------------------------------------------------------------
458
+ export async function startServer(options) {
459
+ if (options?.configPath) {
460
+ process.env.PATHFINDER_CONFIG = options.configPath;
461
+ }
462
+ const cfg = getConfig();
463
+ const serverCfg = getServerConfig();
464
+ const port = options?.port ?? cfg.port;
465
+ // Configure session TTL and IP rate limiter from config
466
+ const maxSessionsPerIp = serverCfg.server.max_sessions_per_ip ?? 20;
467
+ SESSION_TTL_MS = (serverCfg.server.session_ttl_minutes ?? 30) * 60 * 1000;
468
+ ipLimiter = new IpSessionLimiter(maxSessionsPerIp);
469
+ console.log(`[startup] IP rate limit: ${maxSessionsPerIp} sessions/IP, TTL: ${serverCfg.server.session_ttl_minutes ?? 30}m`);
470
+ // Initialize workspace manager if any bash tool has workspace enabled
471
+ const hasBashWorkspace = serverCfg.tools.some(t => t.type === 'bash' && t.bash?.workspace === true);
472
+ const workspaceDir = process.env.WORKSPACE_DIR ?? '/tmp/pathfinder-workspaces';
473
+ if (hasBashWorkspace) {
474
+ workspaceManager = new WorkspaceManager(workspaceDir);
475
+ console.log(`[startup] Workspace manager enabled (dir: ${workspaceDir})`);
476
+ }
477
+ const needsDb = hasSearchTools() || hasKnowledgeTools() || hasCollectTools() || hasBashSemanticSearch();
478
+ if (needsDb) {
479
+ console.log("[startup] Initializing database schema...");
480
+ await initializeSchema();
481
+ console.log("[startup] Database schema ready.");
482
+ // Set up bash telemetry with periodic flush
483
+ bashTelemetry = new BashTelemetry(insertCollectedData);
484
+ telemetryFlushInterval = setInterval(() => {
485
+ bashTelemetry?.flush().catch(err => console.error('[telemetry] Periodic flush failed:', err instanceof Error ? err.message : String(err)));
486
+ }, 60_000);
487
+ console.log("[startup] Bash telemetry enabled (60s flush interval).");
488
+ }
489
+ // Log active sources from config
490
+ const sourceNames = serverCfg.sources.map(s => `${s.name} (${s.type})`);
491
+ console.log(`[startup] Active sources: ${sourceNames.join(', ')}`);
492
+ // Build shared Bash instances for bash tools. The filesystem is shared;
493
+ // per-session CWD tracking is handled at the tool registration layer.
494
+ const bashTools = serverCfg.tools.filter(t => t.type === 'bash');
495
+ const searchToolNames = serverCfg.tools.filter(t => t.type === 'search').map(t => t.name);
496
+ for (const tool of bashTools) {
497
+ const toolSources = serverCfg.sources.filter(s => tool.sources.includes(s.name));
498
+ const virtualFiles = tool.bash?.virtual_files === true;
499
+ const filesMap = await buildBashFilesMap(toolSources, {
500
+ virtualFiles,
501
+ searchToolNames: virtualFiles ? searchToolNames : undefined,
502
+ cloneDir: cfg.cloneDir,
503
+ });
504
+ bashInstances.set(tool.name, new Bash({ files: filesMap, cwd: '/' }));
505
+ console.log(`[startup] Bash tool "${tool.name}": ${Object.keys(filesMap).length} files loaded`);
506
+ }
507
+ // Indexing and webhooks only needed when search tools are configured
508
+ if (hasSearchTools() || hasKnowledgeTools()) {
509
+ const orchestrator = new IndexingOrchestrator();
510
+ orchestratorRef = orchestrator;
511
+ webhookHandler = createWebhookHandler(orchestrator);
512
+ // Wire up Slack webhook if any slack sources are configured
513
+ const hasSlackSources = serverCfg.sources.some(s => s.type === 'slack');
514
+ if (hasSlackSources) {
515
+ slackWebhookHandler = createSlackWebhookHandler(orchestrator);
516
+ console.log('[startup] Slack webhook handler enabled');
517
+ }
518
+ // Wire up Discord webhook if any discord sources are configured
519
+ const hasDiscordSources = serverCfg.sources.some(s => s.type === 'discord');
520
+ if (hasDiscordSources) {
521
+ discordWebhookHandler = createDiscordWebhookHandler(orchestrator);
522
+ console.log('[startup] Discord webhook handler enabled');
523
+ }
524
+ orchestrator.onReindexComplete = (sourceNames) => {
525
+ // Invalidate caches so next request regenerates
526
+ cachedLlmsTxt = null;
527
+ cachedLlmsFullTxt = null;
528
+ cachedFaqTxt = null;
529
+ refreshBashInstances(sourceNames, "reindex").catch((err) => {
530
+ console.error("[reindex] Bash refresh failed:", err);
531
+ });
532
+ };
533
+ orchestrator.checkAndIndex()
534
+ .then(() => {
535
+ // Always refresh bash instances after startup index check.
536
+ // The initial bash build (above) runs before repos are cloned,
537
+ // so the filesystem may be empty. If checkAndIndex skipped
538
+ // reindexing (DB already current), onReindexComplete won't fire
539
+ // and the bash filesystem would stay empty without this.
540
+ const allSourceNames = serverCfg.sources.map(s => s.name);
541
+ return refreshBashInstances(allSourceNames, "startup-refresh");
542
+ })
543
+ .catch((err) => {
544
+ console.error("[startup] Initial index check failed:", err);
545
+ });
546
+ orchestrator.startNightlyReindex();
547
+ }
548
+ else {
549
+ console.log("[startup] No search tools configured — skipping indexing");
550
+ }
551
+ const serverName = serverCfg.server.name;
552
+ const server = app.listen(port, () => {
553
+ console.log(`[${serverName}] Running at http://localhost:${port}/mcp`);
554
+ console.log(`[health] http://localhost:${port}/health`);
555
+ });
556
+ server.on("error", (err) => {
557
+ if (err.code === "EADDRINUSE") {
558
+ console.error(`[startup] Port ${port} is already in use. Set PORT env var to use a different port.`);
559
+ }
560
+ else {
561
+ console.error(`[startup] Server error:`, err);
562
+ }
563
+ process.exit(1);
564
+ });
565
+ // -------------------------------------------------------------------
566
+ // Graceful shutdown
567
+ // -------------------------------------------------------------------
568
+ async function shutdown(signal) {
569
+ console.log(`\n[shutdown] Received ${signal}, shutting down...`);
570
+ if (telemetryFlushInterval)
571
+ clearInterval(telemetryFlushInterval);
572
+ try {
573
+ await bashTelemetry?.flush();
574
+ }
575
+ catch (e) {
576
+ console.error('[shutdown] Telemetry flush failed:', e);
577
+ }
578
+ try {
579
+ workspaceManager?.cleanupAll();
580
+ }
581
+ catch (e) {
582
+ console.error('[shutdown] Workspace cleanup failed:', e);
583
+ }
584
+ try {
585
+ await closePool();
586
+ }
587
+ catch (e) {
588
+ console.error('[shutdown] DB pool close failed:', e);
589
+ }
590
+ process.exit(0);
591
+ }
592
+ process.on("SIGINT", () => shutdown("SIGINT"));
593
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
594
+ }
595
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -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"}