@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.
- package/CHANGELOG.md +39 -1
- package/README.md +65 -248
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +58 -5
- package/dist/config.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +3 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/queries.d.ts +21 -4
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +101 -45
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +11 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/faq-txt.d.ts +12 -0
- package/dist/faq-txt.d.ts.map +1 -0
- package/dist/faq-txt.js +37 -0
- package/dist/faq-txt.js.map +1 -0
- package/dist/index.js +2 -362
- package/dist/index.js.map +1 -1
- package/dist/indexing/chunking/html.d.ts +7 -0
- package/dist/indexing/chunking/html.d.ts.map +1 -0
- package/dist/indexing/chunking/html.js +356 -0
- package/dist/indexing/chunking/html.js.map +1 -0
- package/dist/indexing/chunking/index.js +5 -0
- package/dist/indexing/chunking/index.js.map +1 -1
- package/dist/indexing/chunking/qa.d.ts +8 -0
- package/dist/indexing/chunking/qa.d.ts.map +1 -0
- package/dist/indexing/chunking/qa.js +22 -0
- package/dist/indexing/chunking/qa.js.map +1 -0
- package/dist/indexing/distiller.d.ts +29 -0
- package/dist/indexing/distiller.d.ts.map +1 -0
- package/dist/indexing/distiller.js +104 -0
- package/dist/indexing/distiller.js.map +1 -0
- package/dist/indexing/orchestrator.d.ts +9 -3
- package/dist/indexing/orchestrator.d.ts.map +1 -1
- package/dist/indexing/orchestrator.js +113 -83
- package/dist/indexing/orchestrator.js.map +1 -1
- package/dist/indexing/pipeline.d.ts +18 -0
- package/dist/indexing/pipeline.d.ts.map +1 -0
- package/dist/indexing/pipeline.js +68 -0
- package/dist/indexing/pipeline.js.map +1 -0
- package/dist/indexing/providers/discord-api.d.ts +79 -0
- package/dist/indexing/providers/discord-api.d.ts.map +1 -0
- package/dist/indexing/providers/discord-api.js +167 -0
- package/dist/indexing/providers/discord-api.js.map +1 -0
- package/dist/indexing/providers/discord.d.ts +25 -0
- package/dist/indexing/providers/discord.d.ts.map +1 -0
- package/dist/indexing/providers/discord.js +282 -0
- package/dist/indexing/providers/discord.js.map +1 -0
- package/dist/indexing/providers/file.d.ts +18 -0
- package/dist/indexing/providers/file.d.ts.map +1 -0
- package/dist/indexing/providers/file.js +262 -0
- package/dist/indexing/providers/file.js.map +1 -0
- package/dist/indexing/providers/index.d.ts +5 -0
- package/dist/indexing/providers/index.d.ts.map +1 -0
- package/dist/indexing/providers/index.js +22 -0
- package/dist/indexing/providers/index.js.map +1 -0
- package/dist/indexing/providers/slack-api.d.ts +62 -0
- package/dist/indexing/providers/slack-api.d.ts.map +1 -0
- package/dist/indexing/providers/slack-api.js +167 -0
- package/dist/indexing/providers/slack-api.js.map +1 -0
- package/dist/indexing/providers/slack.d.ts +21 -0
- package/dist/indexing/providers/slack.d.ts.map +1 -0
- package/dist/indexing/providers/slack.js +192 -0
- package/dist/indexing/providers/slack.js.map +1 -0
- package/dist/indexing/providers/types.d.ts +56 -0
- package/dist/indexing/providers/types.d.ts.map +1 -0
- package/dist/indexing/providers/types.js +3 -0
- package/dist/indexing/providers/types.js.map +1 -0
- package/dist/indexing/url-derivation.d.ts +2 -2
- package/dist/indexing/url-derivation.d.ts.map +1 -1
- package/dist/indexing/url-derivation.js.map +1 -1
- package/dist/indexing/utils.d.ts +19 -0
- package/dist/indexing/utils.d.ts.map +1 -0
- package/dist/indexing/utils.js +63 -0
- package/dist/indexing/utils.js.map +1 -0
- package/dist/ip-limiter.d.ts +11 -0
- package/dist/ip-limiter.d.ts.map +1 -0
- package/dist/ip-limiter.js +40 -0
- package/dist/ip-limiter.js.map +1 -0
- package/dist/llms-txt.d.ts +11 -0
- package/dist/llms-txt.d.ts.map +1 -0
- package/dist/llms-txt.js +43 -0
- package/dist/llms-txt.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +9 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/bash-fs.d.ts.map +1 -1
- package/dist/mcp/tools/bash-fs.js +4 -1
- package/dist/mcp/tools/bash-fs.js.map +1 -1
- package/dist/mcp/tools/bash.d.ts +8 -0
- package/dist/mcp/tools/bash.d.ts.map +1 -1
- package/dist/mcp/tools/bash.js +59 -0
- package/dist/mcp/tools/bash.js.map +1 -1
- package/dist/mcp/tools/knowledge.d.ts +13 -0
- package/dist/mcp/tools/knowledge.d.ts.map +1 -0
- package/dist/mcp/tools/knowledge.js +92 -0
- package/dist/mcp/tools/knowledge.js.map +1 -0
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +11 -3
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +595 -0
- package/dist/server.js.map +1 -0
- package/dist/skill-md.d.ts +3 -0
- package/dist/skill-md.d.ts.map +1 -0
- package/dist/skill-md.js +75 -0
- package/dist/skill-md.js.map +1 -0
- package/dist/types.d.ts +844 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +88 -6
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts +29 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +192 -0
- package/dist/validate.js.map +1 -0
- package/dist/webhooks/discord.d.ts +13 -0
- package/dist/webhooks/discord.d.ts.map +1 -0
- package/dist/webhooks/discord.js +57 -0
- package/dist/webhooks/discord.js.map +1 -0
- package/dist/webhooks/slack.d.ts +13 -0
- package/dist/webhooks/slack.d.ts.map +1 -0
- package/dist/webhooks/slack.js +106 -0
- package/dist/webhooks/slack.js.map +1 -0
- package/dist/workspace.d.ts +13 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +118 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +27 -2
- package/pathfinder-docs.yaml +54 -0
- package/pathfinder.example.yaml +48 -0
- package/.superpowers/brainstorm/47098-1775507869/content/homepage-mockup.html +0 -324
- package/.superpowers/brainstorm/47098-1775507869/state/server-stopped +0 -1
- package/.superpowers/brainstorm/47098-1775507869/state/server.log +0 -13
- package/.superpowers/brainstorm/47098-1775507869/state/server.pid +0 -1
- package/.superpowers/brainstorm/82141-1775511032/content/migration-v2.html +0 -340
- package/.superpowers/brainstorm/82141-1775511032/content/migration.html +0 -340
- package/.superpowers/brainstorm/82141-1775511032/state/server-stopped +0 -1
- package/.superpowers/brainstorm/82141-1775511032/state/server.log +0 -4
- package/.superpowers/brainstorm/82141-1775511032/state/server.pid +0 -1
- package/dist/indexing/source-indexer.d.ts +0 -68
- package/dist/indexing/source-indexer.d.ts.map +0 -1
- package/dist/indexing/source-indexer.js +0 -379
- 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":"AAAA,mEAAmE;AACnE,iEAAiE;AAEjE,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAiClD,gFAAgF;AAEhF,MAAM,UAAU,oBAAoB,CAChC,OAAe,EACf,SAA6B,EAC7B,SAA6B,EAC7B,aAAqB;IAErB,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE3C,2DAA2D;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAEhE,MAAM,aAAa,GAAG,MAAM,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM;SAC1B,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;SACnC,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnB,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEvD,OAAO,MAAM,CAAC,eAAe,CACzB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CACjC,CAAC;AACN,CAAC;AAED,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAsC;IAC5E,OAAO,KAAK,UAAU,kBAAkB,CAAC,GAAY,EAAE,GAAa;QAChE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QAExB,qEAAqE;QACrE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;YAChG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC,CAAC;YACnF,OAAO;QACX,CAAC;QAED,qEAAqE;QACrE,IAAI,OAA0B,CAAC;QAC/B,IAAI,CAAC;YACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAsB,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACL,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;QAED,qEAAqE;QACrE,sEAAsE;QACtE,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,OAAO;QACX,CAAC;QAED,qEAAqE;QACrE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YACjF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAuB,CAAC;QACjF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAuB,CAAC;QAEzE,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;YACtE,OAAO;QACX,CAAC;QAED,qEAAqE;QACrE,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACnF,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,KAA2B,CAAC;YAClD,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YACjD,2CAA2C;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,OAAO;QACX,CAAC;QAED,8CAA8C;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC,CAAC;AACN,CAAC;AAED,gFAAgF;AAEhF,SAAS,mBAAmB,CACxB,KAAyB,EACzB,YAAsC;IAEtC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,mEAAmE;IACnE,oDAAoD;IACpD,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACjD,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,CAAC,CAAC,aAAa,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3D,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACP,6BAA6B,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG;YACxE,iDAAiD,CACpD,CAAC;QACF,OAAO;IACX,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CACP,6BAA6B,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG;YACxE,iCAAiC,MAAM,CAAC,IAAI,GAAG,CAClD,CAAC;QACF,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;AACL,CAAC"}
|
|
@@ -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.
|
|
4
|
-
"description": "
|
|
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
|