@copilotkit/pathfinder 1.4.0 → 1.6.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 +35 -0
- package/LICENSE +106 -21
- package/README.md +14 -3
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +64 -5
- package/dist/config.js.map +1 -1
- package/dist/db/queries.d.ts +12 -1
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +64 -0
- package/dist/db/queries.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/indexing/chunking/index.js +4 -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 +8 -3
- package/dist/indexing/orchestrator.d.ts.map +1 -1
- package/dist/indexing/orchestrator.js +99 -93
- 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 +24 -0
- package/dist/indexing/providers/index.js.map +1 -0
- package/dist/indexing/providers/notion-api.d.ts +101 -0
- package/dist/indexing/providers/notion-api.d.ts.map +1 -0
- package/dist/indexing/providers/notion-api.js +419 -0
- package/dist/indexing/providers/notion-api.js.map +1 -0
- package/dist/indexing/providers/notion.d.ts +29 -0
- package/dist/indexing/providers/notion.d.ts.map +1 -0
- package/dist/indexing/providers/notion.js +236 -0
- package/dist/indexing/providers/notion.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 +57 -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/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -0
- 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/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/server.d.ts.map +1 -1
- package/dist/server.js +111 -8
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +1075 -79
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +94 -4
- 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 +197 -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/package.json +17 -3
- 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 -380
- package/dist/indexing/source-indexer.js.map +0 -1
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// DiscordDataProvider — Discord thread acquisition via REST API + LLM distillation (text)
|
|
2
|
+
// and direct Q&A extraction (forum). Implements DataProvider.
|
|
3
|
+
import OpenAI from 'openai';
|
|
4
|
+
import { DiscordApiClient } from './discord-api.js';
|
|
5
|
+
import { distillThread } from '../distiller.js';
|
|
6
|
+
import { getConfig } from '../../config.js';
|
|
7
|
+
const MAX_ANSWER_CHARS = 8000;
|
|
8
|
+
export class DiscordDataProvider {
|
|
9
|
+
config;
|
|
10
|
+
apiClient;
|
|
11
|
+
openaiClient = null;
|
|
12
|
+
logPrefix;
|
|
13
|
+
constructor(config, options) {
|
|
14
|
+
if (config.type !== 'discord') {
|
|
15
|
+
throw new Error('DiscordDataProvider requires a discord source config');
|
|
16
|
+
}
|
|
17
|
+
this.config = config;
|
|
18
|
+
const token = options.discordBotToken;
|
|
19
|
+
if (!token) {
|
|
20
|
+
throw new Error('DiscordDataProvider requires a discordBotToken in provider options');
|
|
21
|
+
}
|
|
22
|
+
this.apiClient = new DiscordApiClient({ token });
|
|
23
|
+
// Only create OpenAI client if text channels are configured
|
|
24
|
+
const hasTextChannels = this.config.channels.some(c => c.type === 'text');
|
|
25
|
+
if (hasTextChannels) {
|
|
26
|
+
this.openaiClient = new OpenAI({ apiKey: getConfig().openaiApiKey });
|
|
27
|
+
}
|
|
28
|
+
this.logPrefix = `[discord-provider:${config.name}]`;
|
|
29
|
+
}
|
|
30
|
+
async fullAcquire() {
|
|
31
|
+
console.log(`${this.logPrefix} Starting full acquire for ${this.config.channels.length} channel(s)`);
|
|
32
|
+
const allItems = [];
|
|
33
|
+
let maxSnowflake = '0';
|
|
34
|
+
let failedChannels = 0;
|
|
35
|
+
for (const channel of this.config.channels) {
|
|
36
|
+
try {
|
|
37
|
+
const { items, latestId } = channel.type === 'text'
|
|
38
|
+
? await this.processTextChannel(channel.id)
|
|
39
|
+
: await this.processForumChannel(channel.id);
|
|
40
|
+
allItems.push(...items);
|
|
41
|
+
if (BigInt(latestId) > BigInt(maxSnowflake))
|
|
42
|
+
maxSnowflake = latestId;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
failedChannels++;
|
|
46
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
47
|
+
console.error(`${this.logPrefix} Failed to process channel ${channel.id}: ${msg}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (failedChannels === this.config.channels.length) {
|
|
51
|
+
throw new Error(`All ${failedChannels} channel(s) failed during acquire`);
|
|
52
|
+
}
|
|
53
|
+
console.log(`${this.logPrefix} Full acquire complete: ${allItems.length} Q&A pairs from ${this.config.channels.length} channel(s)`);
|
|
54
|
+
return {
|
|
55
|
+
items: allItems,
|
|
56
|
+
removedIds: [],
|
|
57
|
+
stateToken: maxSnowflake,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async incrementalAcquire(lastStateToken) {
|
|
61
|
+
console.log(`${this.logPrefix} Starting incremental acquire since ${lastStateToken}`);
|
|
62
|
+
const allItems = [];
|
|
63
|
+
let maxSnowflake = lastStateToken;
|
|
64
|
+
let failedChannels = 0;
|
|
65
|
+
for (const channel of this.config.channels) {
|
|
66
|
+
try {
|
|
67
|
+
const { items, latestId } = channel.type === 'text'
|
|
68
|
+
? await this.processTextChannel(channel.id, lastStateToken)
|
|
69
|
+
: await this.processForumChannel(channel.id, lastStateToken);
|
|
70
|
+
allItems.push(...items);
|
|
71
|
+
if (BigInt(latestId) > BigInt(maxSnowflake))
|
|
72
|
+
maxSnowflake = latestId;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
failedChannels++;
|
|
76
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
77
|
+
console.error(`${this.logPrefix} Failed to process channel ${channel.id}: ${msg}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (failedChannels === this.config.channels.length) {
|
|
81
|
+
throw new Error(`All ${failedChannels} channel(s) failed during acquire`);
|
|
82
|
+
}
|
|
83
|
+
console.log(`${this.logPrefix} Incremental acquire complete: ${allItems.length} Q&A pairs`);
|
|
84
|
+
return {
|
|
85
|
+
items: allItems,
|
|
86
|
+
removedIds: [],
|
|
87
|
+
stateToken: maxSnowflake,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async getCurrentStateToken() {
|
|
91
|
+
let maxSnowflake = '0';
|
|
92
|
+
for (const channel of this.config.channels) {
|
|
93
|
+
try {
|
|
94
|
+
if (channel.type === 'text') {
|
|
95
|
+
const messages = await this.apiClient.fetchChannelMessages(channel.id, undefined, 1);
|
|
96
|
+
if (messages.length > 0) {
|
|
97
|
+
const latest = messages[0].id;
|
|
98
|
+
if (BigInt(latest) > BigInt(maxSnowflake))
|
|
99
|
+
maxSnowflake = latest;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const threads = await this.apiClient.fetchForumThreads(channel.id, this.config.guild_id);
|
|
104
|
+
for (const thread of threads) {
|
|
105
|
+
if (BigInt(thread.last_message_id) > BigInt(maxSnowflake)) {
|
|
106
|
+
maxSnowflake = thread.last_message_id;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
113
|
+
console.warn(`${this.logPrefix} Failed to check channel ${channel.id}: ${msg}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return maxSnowflake === '0' ? null : maxSnowflake;
|
|
117
|
+
}
|
|
118
|
+
// -----------------------------------------------------------------------
|
|
119
|
+
// Private helpers
|
|
120
|
+
// -----------------------------------------------------------------------
|
|
121
|
+
/**
|
|
122
|
+
* Process a text channel: fetch messages with threads, distill via LLM.
|
|
123
|
+
*/
|
|
124
|
+
async processTextChannel(channelId, after) {
|
|
125
|
+
const messages = await this.apiClient.fetchChannelMessages(channelId, after);
|
|
126
|
+
const items = [];
|
|
127
|
+
let latestId = after ?? '0';
|
|
128
|
+
// Filter to messages with threads having >= min_thread_replies
|
|
129
|
+
const threads = messages.filter(m => m.thread && m.thread.message_count >= this.config.min_thread_replies);
|
|
130
|
+
console.log(`${this.logPrefix} Channel ${channelId}: ${messages.length} messages, ${threads.length} qualifying threads`);
|
|
131
|
+
for (const message of threads) {
|
|
132
|
+
try {
|
|
133
|
+
const threadItems = await this.processTextThread(channelId, message);
|
|
134
|
+
items.push(...threadItems);
|
|
135
|
+
if (BigInt(message.id) > BigInt(latestId))
|
|
136
|
+
latestId = message.id;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
140
|
+
console.error(`${this.logPrefix} Failed to distill thread ${message.id}: ${msg}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { items, latestId };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Process a single text channel thread: fetch replies, resolve users, distill.
|
|
147
|
+
*/
|
|
148
|
+
async processTextThread(channelId, parentMessage) {
|
|
149
|
+
const threadId = parentMessage.thread.id;
|
|
150
|
+
const replies = await this.apiClient.fetchThreadMessages(threadId);
|
|
151
|
+
// Resolve user display names
|
|
152
|
+
const threadMessages = [];
|
|
153
|
+
for (const reply of replies) {
|
|
154
|
+
let author = reply.author.global_name ?? reply.author.username;
|
|
155
|
+
try {
|
|
156
|
+
const user = await this.apiClient.fetchUser(reply.author.id);
|
|
157
|
+
author = user.displayName;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
161
|
+
console.warn(`${this.logPrefix} Failed to resolve user ${reply.author.id}: ${msg}`);
|
|
162
|
+
}
|
|
163
|
+
threadMessages.push({
|
|
164
|
+
author,
|
|
165
|
+
content: reply.content,
|
|
166
|
+
timestamp: reply.timestamp,
|
|
167
|
+
reactions: reply.reactions?.map(r => ({ name: r.emoji.name, count: r.count })),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Distill the thread
|
|
171
|
+
const distillerResult = await distillThread(threadMessages, {
|
|
172
|
+
model: this.config.distiller_model,
|
|
173
|
+
client: this.openaiClient,
|
|
174
|
+
});
|
|
175
|
+
const items = [];
|
|
176
|
+
const sourceUrl = this.apiClient.getMessageUrl(this.config.guild_id, channelId, parentMessage.id);
|
|
177
|
+
const participants = [...new Set(threadMessages.map(m => m.author))];
|
|
178
|
+
for (let i = 0; i < distillerResult.pairs.length; i++) {
|
|
179
|
+
const pair = distillerResult.pairs[i];
|
|
180
|
+
items.push({
|
|
181
|
+
id: `${channelId}:${parentMessage.id}:${i}`,
|
|
182
|
+
content: `Q: ${pair.question}\n\nA: ${pair.answer}`,
|
|
183
|
+
title: pair.question,
|
|
184
|
+
sourceUrl,
|
|
185
|
+
metadata: {
|
|
186
|
+
channel: channelId,
|
|
187
|
+
participants,
|
|
188
|
+
confidence: pair.confidence,
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return items;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Process a forum channel: fetch threads, extract Q&A directly.
|
|
196
|
+
*/
|
|
197
|
+
async processForumChannel(channelId, afterToken) {
|
|
198
|
+
const allThreads = await this.apiClient.fetchForumThreads(channelId, this.config.guild_id);
|
|
199
|
+
let latestId = afterToken ?? '0';
|
|
200
|
+
const items = [];
|
|
201
|
+
// Filter by min_thread_replies
|
|
202
|
+
let threads = allThreads.filter(t => t.message_count >= this.config.min_thread_replies);
|
|
203
|
+
// For incremental, filter threads with new activity
|
|
204
|
+
if (afterToken) {
|
|
205
|
+
threads = threads.filter(t => BigInt(t.last_message_id) > BigInt(afterToken));
|
|
206
|
+
}
|
|
207
|
+
console.log(`${this.logPrefix} Forum ${channelId}: ${allThreads.length} total threads, ${threads.length} qualifying`);
|
|
208
|
+
for (const thread of threads) {
|
|
209
|
+
try {
|
|
210
|
+
const messages = await this.apiClient.fetchThreadMessages(thread.id);
|
|
211
|
+
const answer = synthesizeForumAnswer(messages, thread.name);
|
|
212
|
+
if (!answer) {
|
|
213
|
+
console.log(`${this.logPrefix} Skipping forum thread ${thread.id} — empty synthesized answer`);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const truncatedAnswer = truncateAnswer(answer);
|
|
217
|
+
const sourceUrl = this.apiClient.getMessageUrl(this.config.guild_id, thread.id, messages[0]?.id ?? thread.id);
|
|
218
|
+
items.push({
|
|
219
|
+
id: `${channelId}:${thread.id}`,
|
|
220
|
+
content: `Q: ${thread.name}\n\nA: ${truncatedAnswer}`,
|
|
221
|
+
title: thread.name,
|
|
222
|
+
sourceUrl,
|
|
223
|
+
metadata: {
|
|
224
|
+
channel: channelId,
|
|
225
|
+
confidence: 1.0,
|
|
226
|
+
forumThread: true,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
if (BigInt(thread.last_message_id) > BigInt(latestId)) {
|
|
230
|
+
latestId = thread.last_message_id;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
235
|
+
console.error(`${this.logPrefix} Failed to process forum thread ${thread.id}: ${msg}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return { items, latestId };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Synthesize an answer from forum thread reply messages.
|
|
243
|
+
*/
|
|
244
|
+
function synthesizeForumAnswer(messages, threadName) {
|
|
245
|
+
if (messages.length === 0)
|
|
246
|
+
return '';
|
|
247
|
+
const firstContent = messages[0]?.content.trim() ?? '';
|
|
248
|
+
const titleLower = threadName.trim().toLowerCase();
|
|
249
|
+
let processedMessages = messages;
|
|
250
|
+
// If the first message starts with or matches the title, strip the title portion
|
|
251
|
+
// but keep any additional content the OP may have added
|
|
252
|
+
if (firstContent.toLowerCase().startsWith(titleLower)) {
|
|
253
|
+
const remainder = firstContent.slice(threadName.trim().length).trim();
|
|
254
|
+
if (!remainder) {
|
|
255
|
+
// First message was just the title restated — skip it
|
|
256
|
+
processedMessages = messages.slice(1);
|
|
257
|
+
}
|
|
258
|
+
// If there's a remainder, keep the full message (OP added context beyond the title)
|
|
259
|
+
}
|
|
260
|
+
else if (titleLower.startsWith(firstContent.toLowerCase()) && firstContent.length > 0) {
|
|
261
|
+
// First message is a truncated version of the title — skip it
|
|
262
|
+
processedMessages = messages.slice(1);
|
|
263
|
+
}
|
|
264
|
+
// Filter out messages with empty/whitespace-only content
|
|
265
|
+
const withContent = processedMessages.filter(m => m.content.trim().length > 0);
|
|
266
|
+
if (withContent.length === 0)
|
|
267
|
+
return '';
|
|
268
|
+
return withContent
|
|
269
|
+
.map(m => `${m.author.global_name ?? m.author.username}: ${m.content}`)
|
|
270
|
+
.join('\n\n');
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Truncate an answer if it exceeds MAX_ANSWER_CHARS.
|
|
274
|
+
*/
|
|
275
|
+
function truncateAnswer(answer) {
|
|
276
|
+
if (answer.length <= MAX_ANSWER_CHARS)
|
|
277
|
+
return answer;
|
|
278
|
+
const truncated = answer.slice(0, MAX_ANSWER_CHARS);
|
|
279
|
+
const lastBreak = truncated.lastIndexOf('\n\n');
|
|
280
|
+
return (lastBreak > 0 ? truncated.slice(0, lastBreak) : truncated) + '\n\n[truncated]';
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=discord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/indexing/providers/discord.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SourceConfig } from '../../types.js';
|
|
2
|
+
import type { DataProvider, AcquisitionResult, ProviderOptions } from './types.js';
|
|
3
|
+
export declare class FileDataProvider implements DataProvider {
|
|
4
|
+
private config;
|
|
5
|
+
private options;
|
|
6
|
+
private logPrefix;
|
|
7
|
+
private skipDirs;
|
|
8
|
+
private maxFileSize;
|
|
9
|
+
constructor(config: SourceConfig, options: ProviderOptions);
|
|
10
|
+
private isLocal;
|
|
11
|
+
fullAcquire(): Promise<AcquisitionResult>;
|
|
12
|
+
incrementalAcquire(lastStateToken: string): Promise<AcquisitionResult>;
|
|
13
|
+
getCurrentStateToken(): Promise<string | null>;
|
|
14
|
+
private ensureRepo;
|
|
15
|
+
private walkFiles;
|
|
16
|
+
private computeLocalSha;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/file.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAe,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBhG,qBAAa,gBAAiB,YAAW,YAAY;IACjD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;IAW1D,OAAO,CAAC,OAAO;IAIT,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAsDzC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwEtE,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAuCtC,UAAU;YA2BV,SAAS;YAiCT,eAAe;CAShC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// FileDataProvider — git-backed and local file data acquisition.
|
|
2
|
+
// Handles clone/pull, file walking, pattern matching, content reading.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { simpleGit } from 'simple-git';
|
|
7
|
+
import { matchesPatterns, hasLowSemanticValue } from '../utils.js';
|
|
8
|
+
import { isFileSourceConfig } from '../../types.js';
|
|
9
|
+
const DEFAULT_SKIP_DIRS = new Set(['node_modules', 'dist', 'build', '.git']);
|
|
10
|
+
const DEFAULT_MAX_FILE_SIZE = 102400; // 100KB
|
|
11
|
+
function repoNameFromUrl(repoUrl) {
|
|
12
|
+
const last = repoUrl.split('/').pop() ?? '';
|
|
13
|
+
return last.replace(/\.git$/, '');
|
|
14
|
+
}
|
|
15
|
+
function authenticatedUrl(repoUrl, githubToken) {
|
|
16
|
+
if (githubToken) {
|
|
17
|
+
return repoUrl.replace('https://github.com/', `https://x-access-token:${githubToken}@github.com/`);
|
|
18
|
+
}
|
|
19
|
+
return repoUrl;
|
|
20
|
+
}
|
|
21
|
+
export class FileDataProvider {
|
|
22
|
+
config;
|
|
23
|
+
options;
|
|
24
|
+
logPrefix;
|
|
25
|
+
skipDirs;
|
|
26
|
+
maxFileSize;
|
|
27
|
+
constructor(config, options) {
|
|
28
|
+
if (!isFileSourceConfig(config)) {
|
|
29
|
+
throw new Error('FileDataProvider cannot handle slack source type');
|
|
30
|
+
}
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.logPrefix = `[file-provider:${config.name}]`;
|
|
34
|
+
this.skipDirs = new Set([...DEFAULT_SKIP_DIRS, ...(config.skip_dirs ?? [])]);
|
|
35
|
+
this.maxFileSize = config.max_file_size ?? DEFAULT_MAX_FILE_SIZE;
|
|
36
|
+
}
|
|
37
|
+
isLocal() {
|
|
38
|
+
return !this.config.repo;
|
|
39
|
+
}
|
|
40
|
+
async fullAcquire() {
|
|
41
|
+
let repoDir;
|
|
42
|
+
let stateToken;
|
|
43
|
+
if (this.isLocal()) {
|
|
44
|
+
repoDir = path.resolve(this.config.path);
|
|
45
|
+
if (!fs.existsSync(repoDir)) {
|
|
46
|
+
throw new Error(`Local source path does not exist: ${repoDir}`);
|
|
47
|
+
}
|
|
48
|
+
stateToken = await this.computeLocalSha(repoDir);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const repoName = repoNameFromUrl(this.config.repo);
|
|
52
|
+
repoDir = path.join(this.options.cloneDir, repoName);
|
|
53
|
+
const git = await this.ensureRepo(repoDir, repoName);
|
|
54
|
+
stateToken = await git.revparse(['HEAD']);
|
|
55
|
+
}
|
|
56
|
+
const walkRoot = this.isLocal()
|
|
57
|
+
? repoDir
|
|
58
|
+
: path.join(repoDir, this.config.path);
|
|
59
|
+
if (!fs.existsSync(walkRoot)) {
|
|
60
|
+
console.warn(`${this.logPrefix} Walk root not found at ${walkRoot}, skipping`);
|
|
61
|
+
return { items: [], removedIds: [], stateToken };
|
|
62
|
+
}
|
|
63
|
+
const allFiles = await this.walkFiles(walkRoot);
|
|
64
|
+
const matchingFiles = allFiles.filter(absPath => {
|
|
65
|
+
const relPath = path.relative(repoDir, absPath);
|
|
66
|
+
return matchesPatterns(relPath, this.config);
|
|
67
|
+
});
|
|
68
|
+
const skipped = allFiles.length - matchingFiles.length;
|
|
69
|
+
console.log(`${this.logPrefix} Found ${matchingFiles.length} files for full acquire` +
|
|
70
|
+
(skipped > 0 ? ` (${skipped} excluded by patterns)` : ''));
|
|
71
|
+
const items = [];
|
|
72
|
+
for (const absPath of matchingFiles) {
|
|
73
|
+
const relPath = path.relative(repoDir, absPath);
|
|
74
|
+
try {
|
|
75
|
+
const content = await fs.promises.readFile(absPath, 'utf-8');
|
|
76
|
+
if (hasLowSemanticValue(content))
|
|
77
|
+
continue;
|
|
78
|
+
items.push({ id: relPath, content });
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
82
|
+
console.error(`${this.logPrefix} Failed to read ${relPath}: ${msg}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { items, removedIds: [], stateToken };
|
|
86
|
+
}
|
|
87
|
+
async incrementalAcquire(lastStateToken) {
|
|
88
|
+
if (this.isLocal()) {
|
|
89
|
+
console.log(`${this.logPrefix} Local source — falling back to full acquire`);
|
|
90
|
+
return this.fullAcquire();
|
|
91
|
+
}
|
|
92
|
+
const repoName = repoNameFromUrl(this.config.repo);
|
|
93
|
+
const repoDir = path.join(this.options.cloneDir, repoName);
|
|
94
|
+
const git = await this.ensureRepo(repoDir, repoName);
|
|
95
|
+
const headSha = await git.revparse(['HEAD']);
|
|
96
|
+
if (headSha === lastStateToken) {
|
|
97
|
+
console.log(`${this.logPrefix} No new commits, skipping`);
|
|
98
|
+
return { items: [], removedIds: [], stateToken: headSha };
|
|
99
|
+
}
|
|
100
|
+
// Unshallow for diff
|
|
101
|
+
try {
|
|
102
|
+
await git.fetch(['--unshallow']);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
106
|
+
if (!msg.includes('unshallow') && !msg.includes('does not make sense')) {
|
|
107
|
+
console.warn(`${this.logPrefix} git fetch --unshallow failed:`, msg);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
let diffOutput;
|
|
111
|
+
try {
|
|
112
|
+
diffOutput = await git.diff(['--name-only', `${lastStateToken}..HEAD`]);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.warn(`${this.logPrefix} git diff failed, falling back to full acquire:`, err);
|
|
116
|
+
return this.fullAcquire();
|
|
117
|
+
}
|
|
118
|
+
const changedFiles = diffOutput.split('\n').map(f => f.trim()).filter(f => f.length > 0);
|
|
119
|
+
const matchingChanged = changedFiles.filter(f => matchesPatterns(f, this.config));
|
|
120
|
+
if (matchingChanged.length === 0) {
|
|
121
|
+
console.log(`${this.logPrefix} No matching changes detected`);
|
|
122
|
+
return { items: [], removedIds: [], stateToken: headSha };
|
|
123
|
+
}
|
|
124
|
+
console.log(`${this.logPrefix} Incremental acquire: ${matchingChanged.length} changed files`);
|
|
125
|
+
// Find deleted files
|
|
126
|
+
const diffStatusOutput = await git.diff(['--name-status', `${lastStateToken}..HEAD`]);
|
|
127
|
+
const deletedFiles = diffStatusOutput.split('\n')
|
|
128
|
+
.filter(line => line.startsWith('D\t'))
|
|
129
|
+
.map(line => line.slice(2).trim())
|
|
130
|
+
.filter(f => matchesPatterns(f, this.config));
|
|
131
|
+
// Read changed (non-deleted) files
|
|
132
|
+
const filesToRead = matchingChanged.filter(f => !deletedFiles.includes(f));
|
|
133
|
+
const items = [];
|
|
134
|
+
for (const relPath of filesToRead) {
|
|
135
|
+
const absPath = path.join(repoDir, relPath);
|
|
136
|
+
if (!fs.existsSync(absPath))
|
|
137
|
+
continue;
|
|
138
|
+
try {
|
|
139
|
+
const stat = await fs.promises.stat(absPath);
|
|
140
|
+
if (stat.size > this.maxFileSize)
|
|
141
|
+
continue;
|
|
142
|
+
const content = await fs.promises.readFile(absPath, 'utf-8');
|
|
143
|
+
if (hasLowSemanticValue(content))
|
|
144
|
+
continue;
|
|
145
|
+
items.push({ id: relPath, content });
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
149
|
+
console.error(`${this.logPrefix} Failed to read ${relPath}: ${msg}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { items, removedIds: deletedFiles, stateToken: headSha };
|
|
153
|
+
}
|
|
154
|
+
async getCurrentStateToken() {
|
|
155
|
+
if (this.isLocal()) {
|
|
156
|
+
const walkRoot = path.resolve(this.config.path);
|
|
157
|
+
if (!fs.existsSync(walkRoot))
|
|
158
|
+
return null;
|
|
159
|
+
return this.computeLocalSha(walkRoot);
|
|
160
|
+
}
|
|
161
|
+
// For git sources: try ls-remote first (no clone needed)
|
|
162
|
+
try {
|
|
163
|
+
let url = this.config.repo;
|
|
164
|
+
if (this.options.githubToken) {
|
|
165
|
+
url = authenticatedUrl(url, this.options.githubToken);
|
|
166
|
+
}
|
|
167
|
+
const git = simpleGit();
|
|
168
|
+
const result = await git.listRemote([url, 'HEAD']);
|
|
169
|
+
const sha = result.split('\t')[0]?.trim();
|
|
170
|
+
return sha || null;
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
174
|
+
console.warn(`${this.logPrefix} ls-remote failed for ${this.config.repo}: ${msg}`);
|
|
175
|
+
// Fall back to local HEAD if clone dir exists
|
|
176
|
+
const repoName = repoNameFromUrl(this.config.repo);
|
|
177
|
+
const repoDir = path.join(this.options.cloneDir, repoName);
|
|
178
|
+
if (!fs.existsSync(repoDir))
|
|
179
|
+
return null;
|
|
180
|
+
try {
|
|
181
|
+
const git = simpleGit(repoDir);
|
|
182
|
+
return await git.revparse(['HEAD']);
|
|
183
|
+
}
|
|
184
|
+
catch (innerErr) {
|
|
185
|
+
const innerMsg = innerErr instanceof Error ? innerErr.message : String(innerErr);
|
|
186
|
+
console.warn(`${this.logPrefix} local HEAD lookup also failed for ${repoDir}: ${innerMsg}`);
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// -----------------------------------------------------------------------
|
|
192
|
+
// Private helpers
|
|
193
|
+
// -----------------------------------------------------------------------
|
|
194
|
+
async ensureRepo(repoDir, repoName) {
|
|
195
|
+
await fs.promises.mkdir(this.options.cloneDir, { recursive: true });
|
|
196
|
+
const gitDir = path.join(repoDir, '.git');
|
|
197
|
+
if (fs.existsSync(gitDir)) {
|
|
198
|
+
console.log(`${this.logPrefix} Pulling latest changes for ${repoName}`);
|
|
199
|
+
const git = simpleGit(repoDir);
|
|
200
|
+
try {
|
|
201
|
+
await git.pull();
|
|
202
|
+
return git;
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.warn(`${this.logPrefix} Corrupted repo at ${repoDir}, re-cloning:`, err);
|
|
206
|
+
await fs.promises.rm(repoDir, { recursive: true, force: true });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const authUrl = authenticatedUrl(this.config.repo, this.options.githubToken);
|
|
210
|
+
console.log(`${this.logPrefix} Cloning ${this.config.repo} into ${repoDir}`);
|
|
211
|
+
const git = simpleGit(this.options.cloneDir);
|
|
212
|
+
const cloneOpts = ['--depth=1'];
|
|
213
|
+
if (this.config.branch) {
|
|
214
|
+
cloneOpts.push('--branch', this.config.branch);
|
|
215
|
+
}
|
|
216
|
+
await git.clone(authUrl, repoName, cloneOpts);
|
|
217
|
+
return simpleGit(repoDir);
|
|
218
|
+
}
|
|
219
|
+
async walkFiles(dir) {
|
|
220
|
+
const results = [];
|
|
221
|
+
let entries;
|
|
222
|
+
try {
|
|
223
|
+
entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
console.warn(`${this.logPrefix} Unable to read directory ${dir}:`, err);
|
|
227
|
+
return results;
|
|
228
|
+
}
|
|
229
|
+
for (const entry of entries) {
|
|
230
|
+
if (this.skipDirs.has(entry.name))
|
|
231
|
+
continue;
|
|
232
|
+
const fullPath = path.join(dir, entry.name);
|
|
233
|
+
if (entry.isDirectory()) {
|
|
234
|
+
const nested = await this.walkFiles(fullPath);
|
|
235
|
+
results.push(...nested);
|
|
236
|
+
}
|
|
237
|
+
else if (entry.isFile()) {
|
|
238
|
+
try {
|
|
239
|
+
const stat = await fs.promises.stat(fullPath);
|
|
240
|
+
if (stat.size > this.maxFileSize)
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
console.warn(`${this.logPrefix} Unable to stat ${fullPath}:`, err);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
results.push(fullPath);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return results;
|
|
251
|
+
}
|
|
252
|
+
async computeLocalSha(walkRoot) {
|
|
253
|
+
const files = await this.walkFiles(walkRoot);
|
|
254
|
+
const hash = createHash('sha256');
|
|
255
|
+
for (const f of files.sort()) {
|
|
256
|
+
const stat = await fs.promises.stat(f);
|
|
257
|
+
hash.update(`${f}:${stat.mtimeMs}\n`);
|
|
258
|
+
}
|
|
259
|
+
return `local-${hash.digest('hex').slice(0, 12)}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/indexing/providers/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DataProviderFactory } from './types.js';
|
|
2
|
+
export declare function registerProvider(type: string, factory: DataProviderFactory): void;
|
|
3
|
+
export declare function getProvider(type: string): DataProviderFactory;
|
|
4
|
+
export type { DataProvider, DataProviderFactory, ProviderOptions, ContentItem, AcquisitionResult } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAItD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAEjF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAM7D;AAED,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Provider registry — maps source type to a DataProvider factory.
|
|
2
|
+
const registry = new Map();
|
|
3
|
+
export function registerProvider(type, factory) {
|
|
4
|
+
registry.set(type, factory);
|
|
5
|
+
}
|
|
6
|
+
export function getProvider(type) {
|
|
7
|
+
const factory = registry.get(type);
|
|
8
|
+
if (!factory) {
|
|
9
|
+
throw new Error(`Unknown provider type: "${type}". Available: ${[...registry.keys()].join(', ')}`);
|
|
10
|
+
}
|
|
11
|
+
return factory;
|
|
12
|
+
}
|
|
13
|
+
// Register built-in providers
|
|
14
|
+
import { FileDataProvider } from './file.js';
|
|
15
|
+
for (const type of ['markdown', 'code', 'raw-text', 'html']) {
|
|
16
|
+
registerProvider(type, (config, options) => new FileDataProvider(config, options));
|
|
17
|
+
}
|
|
18
|
+
import { SlackDataProvider } from './slack.js';
|
|
19
|
+
registerProvider('slack', (config, options) => new SlackDataProvider(config, options));
|
|
20
|
+
import { DiscordDataProvider } from './discord.js';
|
|
21
|
+
registerProvider('discord', (config, options) => new DiscordDataProvider(config, options));
|
|
22
|
+
import { NotionDataProvider } from './notion.js';
|
|
23
|
+
registerProvider('notion', (config, options) => new NotionDataProvider(config, options));
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/indexing/providers/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAIlE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAA4B;IACvE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAID,8BAA8B;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;IAC1D,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,gBAAgB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,gBAAgB,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC"}
|