@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
@@ -0,0 +1,106 @@
1
+ // Slack Events API webhook handler for emoji-triggered reindexing.
2
+ // Handles URL verification challenges and reaction_added events.
3
+ import crypto from 'node:crypto';
4
+ import { getConfig, getServerConfig } from '../config.js';
5
+ import { isSlackSourceConfig } from '../types.js';
6
+ // ── Signature verification ───────────────────────────────────────────────────
7
+ export function verifySlackSignature(rawBody, timestamp, signature, signingSecret) {
8
+ if (!timestamp || !signature)
9
+ return false;
10
+ // Reject requests older than 5 minutes (replay protection)
11
+ const now = Math.floor(Date.now() / 1000);
12
+ if (Math.abs(now - parseInt(timestamp, 10)) > 300)
13
+ return false;
14
+ const sigBasestring = `v0:${timestamp}:${rawBody.toString('utf-8')}`;
15
+ const expected = 'v0=' + crypto
16
+ .createHmac('sha256', signingSecret)
17
+ .update(sigBasestring)
18
+ .digest('hex');
19
+ if (signature.length !== expected.length)
20
+ return false;
21
+ return crypto.timingSafeEqual(Buffer.from(signature, 'utf-8'), Buffer.from(expected, 'utf-8'));
22
+ }
23
+ // ── Factory ──────────────────────────────────────────────────────────────────
24
+ /**
25
+ * Create a Slack webhook handler wired to a specific orchestrator instance.
26
+ */
27
+ export function createSlackWebhookHandler(orchestrator) {
28
+ return async function handleSlackWebhook(req, res) {
29
+ const cfg = getConfig();
30
+ // -- Raw body check ------------------------------------------------
31
+ const rawBody = Buffer.isBuffer(req.body) ? req.body : null;
32
+ if (!rawBody) {
33
+ console.error('[slack-webhook] req.body is not a Buffer — ensure the route uses express.raw()');
34
+ res.status(500).json({ error: 'Server misconfiguration: raw body not available' });
35
+ return;
36
+ }
37
+ // -- Parse payload -------------------------------------------------
38
+ let payload;
39
+ try {
40
+ payload = JSON.parse(rawBody.toString('utf-8'));
41
+ }
42
+ catch {
43
+ res.status(400).json({ error: 'Malformed JSON payload' });
44
+ return;
45
+ }
46
+ // -- URL verification challenge ------------------------------------
47
+ // Slack sends this during app setup; no signature verification needed
48
+ if (payload.type === 'url_verification') {
49
+ res.status(200).json({ challenge: payload.challenge });
50
+ return;
51
+ }
52
+ // -- Signature verification ----------------------------------------
53
+ if (!cfg.slackSigningSecret?.trim()) {
54
+ console.log('[slack-webhook] Rejecting request — signing secret not configured');
55
+ res.status(403).json({ error: 'Forbidden' });
56
+ return;
57
+ }
58
+ const timestamp = req.headers['x-slack-request-timestamp'];
59
+ const signature = req.headers['x-slack-signature'];
60
+ if (!verifySlackSignature(rawBody, timestamp, signature, cfg.slackSigningSecret)) {
61
+ res.status(401).json({ error: 'Invalid or missing Slack signature' });
62
+ return;
63
+ }
64
+ // -- Event routing -------------------------------------------------
65
+ if (payload.type !== 'event_callback' || !payload.event) {
66
+ res.status(200).json({ ok: true, ignored: true, reason: 'not an event_callback' });
67
+ return;
68
+ }
69
+ const event = payload.event;
70
+ if (event.type === 'reaction_added') {
71
+ const reactionEvent = event;
72
+ handleReactionAdded(reactionEvent, orchestrator);
73
+ // Respond immediately (Slack requires <3s)
74
+ res.status(200).json({ ok: true });
75
+ return;
76
+ }
77
+ // Unknown event type — acknowledge but ignore
78
+ res.status(200).json({ ok: true, ignored: true, reason: `unhandled event type: ${event.type}` });
79
+ };
80
+ }
81
+ // ── Event handlers ───────────────────────────────────────────────────────────
82
+ function handleReactionAdded(event, orchestrator) {
83
+ const serverCfg = getServerConfig();
84
+ // Find Slack sources where this reaction matches the trigger emoji
85
+ // and the channel is in the configured channel list
86
+ const matchingSources = serverCfg.sources.filter(s => {
87
+ if (!isSlackSourceConfig(s))
88
+ return false;
89
+ if (s.trigger_emoji !== event.reaction)
90
+ return false;
91
+ if (!s.channels.includes(event.item.channel))
92
+ return false;
93
+ return true;
94
+ });
95
+ if (matchingSources.length === 0) {
96
+ console.log(`[slack-webhook] Reaction :${event.reaction}: on ${event.item.channel} ` +
97
+ `— no matching Slack source configured, ignoring`);
98
+ return;
99
+ }
100
+ for (const source of matchingSources) {
101
+ console.log(`[slack-webhook] Reaction :${event.reaction}: on ${event.item.channel} ` +
102
+ `— queuing reindex for source "${source.name}"`);
103
+ orchestrator.queueSourceReindex(source.name);
104
+ }
105
+ }
106
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/webhooks/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class WorkspaceManager {
2
+ private baseDir;
3
+ private maxBytesPerSession;
4
+ private trackers;
5
+ constructor(baseDir: string, maxBytesPerSession?: number);
6
+ ensureSession(sessionId: string): string;
7
+ writeFile(sessionId: string, filename: string, content: string): boolean;
8
+ readFile(sessionId: string, filename: string): string | null;
9
+ listFiles(sessionId: string, subdir?: string): string[];
10
+ cleanup(sessionId: string): void;
11
+ cleanupAll(): void;
12
+ }
13
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAIA,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAE,MAAoB;IAYrE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAexC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAuBxE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc5D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBvD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAWhC,UAAU,IAAI,IAAI;CAiBrB"}
@@ -0,0 +1,118 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { WorkspaceTracker } from './mcp/tools/bash-session.js';
4
+ export class WorkspaceManager {
5
+ baseDir;
6
+ maxBytesPerSession;
7
+ trackers = new Map();
8
+ constructor(baseDir, maxBytesPerSession = 1024 * 1024) {
9
+ this.baseDir = baseDir;
10
+ this.maxBytesPerSession = maxBytesPerSession;
11
+ try {
12
+ fs.mkdirSync(baseDir, { recursive: true });
13
+ }
14
+ catch (err) {
15
+ const detail = err instanceof Error ? err.message : String(err);
16
+ console.error(`[workspace] Failed to create base directory ${baseDir}: ${detail}`);
17
+ throw new Error(`WorkspaceManager: cannot create base directory: ${detail}`);
18
+ }
19
+ }
20
+ ensureSession(sessionId) {
21
+ const dir = path.join(this.baseDir, sessionId);
22
+ try {
23
+ fs.mkdirSync(dir, { recursive: true });
24
+ }
25
+ catch (err) {
26
+ const detail = err instanceof Error ? err.message : String(err);
27
+ console.error(`[workspace] Failed to create session directory ${dir}: ${detail}`);
28
+ throw new Error(`WorkspaceManager: cannot create session directory: ${detail}`);
29
+ }
30
+ if (!this.trackers.has(sessionId)) {
31
+ this.trackers.set(sessionId, new WorkspaceTracker(this.maxBytesPerSession));
32
+ }
33
+ return dir;
34
+ }
35
+ writeFile(sessionId, filename, content) {
36
+ const tracker = this.trackers.get(sessionId);
37
+ if (!tracker)
38
+ return false;
39
+ const bytes = Buffer.byteLength(content, 'utf-8');
40
+ if (!tracker.trackWrite(bytes))
41
+ return false;
42
+ const filePath = path.join(this.baseDir, sessionId, filename);
43
+ const sessionDir = path.resolve(this.baseDir, sessionId);
44
+ if (!path.resolve(filePath).startsWith(sessionDir + path.sep) && path.resolve(filePath) !== sessionDir) {
45
+ return false;
46
+ }
47
+ try {
48
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
49
+ fs.writeFileSync(filePath, content, 'utf-8');
50
+ }
51
+ catch (err) {
52
+ const detail = err instanceof Error ? err.message : String(err);
53
+ console.error(`[workspace] Failed to write file ${filePath}: ${detail}`);
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ readFile(sessionId, filename) {
59
+ const filePath = path.join(this.baseDir, sessionId, filename);
60
+ const sessionDir = path.resolve(this.baseDir, sessionId);
61
+ if (!path.resolve(filePath).startsWith(sessionDir + path.sep) && path.resolve(filePath) !== sessionDir) {
62
+ return null;
63
+ }
64
+ try {
65
+ return fs.readFileSync(filePath, 'utf-8');
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ listFiles(sessionId, subdir) {
72
+ let dir = path.join(this.baseDir, sessionId);
73
+ if (subdir) {
74
+ dir = path.join(dir, subdir);
75
+ const sessionDir = path.resolve(this.baseDir, sessionId);
76
+ if (!path.resolve(dir).startsWith(sessionDir + path.sep) && path.resolve(dir) !== sessionDir) {
77
+ return [];
78
+ }
79
+ }
80
+ try {
81
+ return fs.readdirSync(dir);
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ }
87
+ cleanup(sessionId) {
88
+ const dir = path.join(this.baseDir, sessionId);
89
+ try {
90
+ fs.rmSync(dir, { recursive: true, force: true });
91
+ }
92
+ catch (err) {
93
+ const detail = err instanceof Error ? err.message : String(err);
94
+ console.error(`[workspace] Failed to cleanup session ${sessionId}: ${detail}`);
95
+ }
96
+ this.trackers.delete(sessionId);
97
+ }
98
+ cleanupAll() {
99
+ let entries;
100
+ try {
101
+ entries = fs.readdirSync(this.baseDir);
102
+ }
103
+ catch {
104
+ entries = [];
105
+ }
106
+ for (const entry of entries) {
107
+ try {
108
+ fs.rmSync(path.join(this.baseDir, entry), { recursive: true, force: true });
109
+ }
110
+ catch (err) {
111
+ const detail = err instanceof Error ? err.message : String(err);
112
+ console.error(`[workspace] Failed to cleanup entry ${entry}: ${detail}`);
113
+ }
114
+ }
115
+ this.trackers.clear();
116
+ }
117
+ }
118
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,28 @@
1
1
  {
2
2
  "name": "@copilotkit/pathfinder",
3
- "version": "1.1.0",
4
- "description": "Pathfinder — agentic docs retrieval for AI agents",
3
+ "version": "1.5.0",
4
+ "description": "Agentic docs retrieval for AI agents — semantic search and filesystem exploration over your documentation and code via MCP.",
5
5
  "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/CopilotKit/pathfinder"
9
+ },
10
+ "homepage": "https://pathfinder.copilotkit.dev",
11
+ "keywords": [
12
+ "mcp",
13
+ "ai",
14
+ "agents",
15
+ "documentation",
16
+ "search",
17
+ "rag",
18
+ "embeddings",
19
+ "copilotkit"
20
+ ],
21
+ "license": "MIT",
6
22
  "main": "dist/index.js",
23
+ "bin": {
24
+ "pathfinder": "dist/cli.js"
25
+ },
7
26
  "publishConfig": {
8
27
  "access": "public"
9
28
  },
@@ -23,8 +42,14 @@
23
42
  "test": "vitest run"
24
43
  },
25
44
  "dependencies": {
45
+ "@discordjs/rest": "^2.6.1",
26
46
  "@modelcontextprotocol/sdk": "^1.25.2",
47
+ "@slack/web-api": "^7.15.0",
48
+ "cheerio": "^1.2.0",
49
+ "commander": "^14.0.3",
27
50
  "cors": "^2.8.5",
51
+ "discord-api-types": "^0.38.44",
52
+ "discord-interactions": "^4.4.0",
28
53
  "dotenv": "^17.3.1",
29
54
  "express": "^5.2.1",
30
55
  "just-bash": "^2.14.0",
@@ -0,0 +1,54 @@
1
+ server:
2
+ name: pathfinder-docs
3
+ version: "1.4.0"
4
+
5
+ sources:
6
+ - name: pathfinder-docs
7
+ type: html
8
+ repo: https://github.com/CopilotKit/pathfinder.git
9
+ path: docs/
10
+ base_url: https://pathfinder.copilotkit.dev/
11
+ url_derivation:
12
+ strip_prefix: "docs/"
13
+ strip_suffix: ".html"
14
+ file_patterns:
15
+ - "**/*.html"
16
+ chunk:
17
+ target_tokens: 600
18
+ overlap_tokens: 50
19
+
20
+ tools:
21
+ - name: search-docs
22
+ type: search
23
+ description: "Search Pathfinder documentation for configuration, deployment, client setup, and usage guides."
24
+ source: pathfinder-docs
25
+ default_limit: 5
26
+ max_limit: 20
27
+ result_format: docs
28
+
29
+ - name: explore-docs
30
+ type: bash
31
+ description: "Explore Pathfinder documentation files using bash commands (find, grep, cat, ls, head)."
32
+ sources: [pathfinder-docs]
33
+ bash:
34
+ session_state: true
35
+ grep_strategy: hybrid
36
+ virtual_files: true
37
+
38
+ embedding:
39
+ provider: openai
40
+ model: text-embedding-3-small
41
+ dimensions: 1536
42
+
43
+ indexing:
44
+ auto_reindex: true
45
+ reindex_hour_utc: 3
46
+ stale_threshold_hours: 24
47
+
48
+ webhook:
49
+ repo_sources:
50
+ "CopilotKit/pathfinder":
51
+ - pathfinder-docs
52
+ path_triggers:
53
+ pathfinder-docs:
54
+ - "docs/"
@@ -0,0 +1,48 @@
1
+ # Pathfinder — agentic docs retrieval for AI agents
2
+ # Copy this file to pathfinder.yaml and customize for your project.
3
+ # Full documentation: https://pathfinder.copilotkit.dev
4
+
5
+ server:
6
+ name: my-project-docs
7
+ version: "1.0.0"
8
+
9
+ sources:
10
+ - name: docs
11
+ type: markdown
12
+ repo: https://github.com/your-org/your-repo.git
13
+ path: docs/
14
+ file_patterns: ["**/*.mdx", "**/*.md"]
15
+ chunk:
16
+ target_tokens: 600
17
+ overlap_tokens: 50
18
+
19
+ tools:
20
+ # Semantic search (RAG) — requires embedding config below
21
+ - name: search-docs
22
+ type: search
23
+ description: "Search documentation for relevant information."
24
+ source: docs
25
+ default_limit: 5
26
+ max_limit: 20
27
+ result_format: docs
28
+
29
+ # Filesystem exploration — no database or API keys needed
30
+ - name: explore-docs
31
+ type: bash
32
+ description: "Explore documentation files using bash commands (find, grep, cat, ls, head)."
33
+ sources: [docs]
34
+ bash:
35
+ session_state: true
36
+ grep_strategy: hybrid # memory | vector | hybrid
37
+ virtual_files: true
38
+
39
+ # Required for search tools (omit for bash-only mode)
40
+ embedding:
41
+ provider: openai
42
+ model: text-embedding-3-small
43
+ dimensions: 1536
44
+
45
+ indexing:
46
+ auto_reindex: true
47
+ reindex_hour_utc: 3
48
+ stale_threshold_hours: 24