@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,167 @@
|
|
|
1
|
+
// Discord REST API client wrapper — handles pagination, rate limiting, user caching.
|
|
2
|
+
// Uses @discordjs/rest (REST-only, no gateway/WebSocket).
|
|
3
|
+
import { REST } from '@discordjs/rest';
|
|
4
|
+
import { Routes } from 'discord-api-types/v10';
|
|
5
|
+
// ── Rate limit helpers ───────────────────────────────────────────────────────
|
|
6
|
+
function sleep(ms) {
|
|
7
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
9
|
+
// ── Client ───────────────────────────────────────────────────────────────────
|
|
10
|
+
const MAX_PAGES = 100;
|
|
11
|
+
const DEFAULT_PAGE_LIMIT = 100;
|
|
12
|
+
export class DiscordApiClient {
|
|
13
|
+
rest;
|
|
14
|
+
maxRetries;
|
|
15
|
+
userCache = new Map();
|
|
16
|
+
logPrefix = '[discord-api]';
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.rest = new REST({ version: '10', rejectOnRateLimit: ['/'] }).setToken(options.token);
|
|
19
|
+
this.maxRetries = options.maxRetries ?? 5;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fetch messages from a text channel, paginated using `after` parameter.
|
|
23
|
+
* If `after` is provided, only messages after that snowflake ID are returned.
|
|
24
|
+
*/
|
|
25
|
+
async fetchChannelMessages(channelId, after, limit) {
|
|
26
|
+
const messages = [];
|
|
27
|
+
let lastId = after;
|
|
28
|
+
const pageLimit = limit ?? DEFAULT_PAGE_LIMIT;
|
|
29
|
+
let pages = 0;
|
|
30
|
+
do {
|
|
31
|
+
pages++;
|
|
32
|
+
const query = new URLSearchParams({ limit: String(pageLimit) });
|
|
33
|
+
if (lastId)
|
|
34
|
+
query.set('after', lastId);
|
|
35
|
+
const result = await this.callWithRetry(() => this.rest.get(Routes.channelMessages(channelId), { query }));
|
|
36
|
+
if (!result || result.length === 0)
|
|
37
|
+
break;
|
|
38
|
+
messages.push(...result);
|
|
39
|
+
lastId = result[result.length - 1].id;
|
|
40
|
+
// If we got fewer than the page limit, there are no more pages
|
|
41
|
+
if (result.length < pageLimit)
|
|
42
|
+
break;
|
|
43
|
+
if (pages >= MAX_PAGES) {
|
|
44
|
+
console.warn(`${this.logPrefix} fetchChannelMessages hit max pages (${MAX_PAGES}) for channel ${channelId}`);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
} while (true);
|
|
48
|
+
return messages;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fetch all threads in a forum channel (active + archived).
|
|
52
|
+
* Active threads: GET /guilds/{guildId}/threads/active, filtered by parent_id.
|
|
53
|
+
* Archived threads: paginated via before parameter.
|
|
54
|
+
*/
|
|
55
|
+
async fetchForumThreads(channelId, guildId) {
|
|
56
|
+
const threadMap = new Map();
|
|
57
|
+
// 1. Active threads (guild-level, filter by parent_id)
|
|
58
|
+
try {
|
|
59
|
+
const activeResult = await this.callWithRetry(() => this.rest.get(Routes.guildActiveThreads(guildId)));
|
|
60
|
+
for (const thread of activeResult.threads ?? []) {
|
|
61
|
+
if (thread.parent_id === channelId) {
|
|
62
|
+
threadMap.set(thread.id, thread);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
68
|
+
console.warn(`${this.logPrefix} Failed to fetch active threads for guild ${guildId}: ${msg}`);
|
|
69
|
+
}
|
|
70
|
+
// 2. Public archived threads
|
|
71
|
+
await this.fetchArchivedThreads(channelId, 'public', threadMap);
|
|
72
|
+
// 3. Private archived threads
|
|
73
|
+
await this.fetchArchivedThreads(channelId, 'private', threadMap);
|
|
74
|
+
return [...threadMap.values()];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Fetch messages within a thread.
|
|
78
|
+
*/
|
|
79
|
+
async fetchThreadMessages(threadId, limit) {
|
|
80
|
+
return this.fetchChannelMessages(threadId, undefined, limit);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Fetch user info with caching.
|
|
84
|
+
*/
|
|
85
|
+
async fetchUser(userId) {
|
|
86
|
+
const cached = this.userCache.get(userId);
|
|
87
|
+
if (cached)
|
|
88
|
+
return cached;
|
|
89
|
+
const result = await this.callWithRetry(() => this.rest.get(Routes.user(userId)));
|
|
90
|
+
const user = {
|
|
91
|
+
id: result.id,
|
|
92
|
+
displayName: result.global_name ?? result.username,
|
|
93
|
+
};
|
|
94
|
+
this.userCache.set(userId, user);
|
|
95
|
+
return user;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get a message URL (deterministic, no API call).
|
|
99
|
+
*/
|
|
100
|
+
getMessageUrl(guildId, channelId, messageId) {
|
|
101
|
+
return `https://discord.com/channels/${guildId}/${channelId}/${messageId}`;
|
|
102
|
+
}
|
|
103
|
+
// -----------------------------------------------------------------------
|
|
104
|
+
// Private helpers
|
|
105
|
+
// -----------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Fetch archived threads (public or private) with pagination.
|
|
108
|
+
*/
|
|
109
|
+
async fetchArchivedThreads(channelId, type, threadMap) {
|
|
110
|
+
let before;
|
|
111
|
+
let pages = 0;
|
|
112
|
+
do {
|
|
113
|
+
pages++;
|
|
114
|
+
const query = new URLSearchParams();
|
|
115
|
+
if (before)
|
|
116
|
+
query.set('before', before);
|
|
117
|
+
try {
|
|
118
|
+
const result = await this.callWithRetry(() => this.rest.get(`/channels/${channelId}/threads/archived/${type}`, { query }));
|
|
119
|
+
for (const thread of result.threads ?? []) {
|
|
120
|
+
if (!threadMap.has(thread.id)) {
|
|
121
|
+
threadMap.set(thread.id, thread);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!result.has_more || !result.threads?.length)
|
|
125
|
+
break;
|
|
126
|
+
// Use the last thread's ID as the before cursor
|
|
127
|
+
before = result.threads[result.threads.length - 1].id;
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
131
|
+
console.warn(`${this.logPrefix} Failed to fetch ${type} archived threads for channel ${channelId}: ${msg}`);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
if (pages >= MAX_PAGES) {
|
|
135
|
+
console.warn(`${this.logPrefix} fetchArchivedThreads hit max pages (${MAX_PAGES})`);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
} while (true);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Call a Discord API method with retry on rate limit (429) responses.
|
|
142
|
+
* Respects retry_after with exponential backoff fallback.
|
|
143
|
+
*/
|
|
144
|
+
async callWithRetry(fn, attempt = 1) {
|
|
145
|
+
try {
|
|
146
|
+
return await fn();
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const status = error?.status ?? error?.statusCode;
|
|
150
|
+
const isRateLimited = status === 429;
|
|
151
|
+
if (!isRateLimited || attempt > this.maxRetries) {
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
const retryAfter = error?.retryAfter
|
|
155
|
+
?? error?.retry_after;
|
|
156
|
+
// retryAfter from @discordjs/rest is in ms; fallback to exponential backoff in ms
|
|
157
|
+
const delayMs = retryAfter != null
|
|
158
|
+
? Math.max(retryAfter, 1000)
|
|
159
|
+
: Math.max(Math.pow(2, attempt) * 1000, 1000);
|
|
160
|
+
console.warn(`${this.logPrefix} Rate limited (attempt ${attempt}/${this.maxRetries}), ` +
|
|
161
|
+
`retrying in ${delayMs}ms`);
|
|
162
|
+
await sleep(delayMs);
|
|
163
|
+
return this.callWithRetry(fn, attempt + 1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=discord-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-api.js","sourceRoot":"","sources":["../../../src/indexing/providers/discord-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SourceConfig } from '../../types.js';
|
|
2
|
+
import type { DataProvider, AcquisitionResult, ProviderOptions } from './types.js';
|
|
3
|
+
export declare class DiscordDataProvider implements DataProvider {
|
|
4
|
+
private config;
|
|
5
|
+
private apiClient;
|
|
6
|
+
private openaiClient;
|
|
7
|
+
private logPrefix;
|
|
8
|
+
constructor(config: SourceConfig, options: ProviderOptions);
|
|
9
|
+
fullAcquire(): Promise<AcquisitionResult>;
|
|
10
|
+
incrementalAcquire(lastStateToken: string): Promise<AcquisitionResult>;
|
|
11
|
+
getCurrentStateToken(): Promise<string | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Process a text channel: fetch messages with threads, distill via LLM.
|
|
14
|
+
*/
|
|
15
|
+
private processTextChannel;
|
|
16
|
+
/**
|
|
17
|
+
* Process a single text channel thread: fetch replies, resolve users, distill.
|
|
18
|
+
*/
|
|
19
|
+
private processTextThread;
|
|
20
|
+
/**
|
|
21
|
+
* Process a forum channel: fetch threads, extract Q&A directly.
|
|
22
|
+
*/
|
|
23
|
+
private processForumChannel;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=discord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/discord.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAA6C,MAAM,gBAAgB,CAAC;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAe,eAAe,EAAE,MAAM,YAAY,CAAC;AAIhG,qBAAa,mBAAoB,YAAW,YAAY;IACpD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;IAoBpD,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAkCzC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkCtE,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgCpD;;OAEG;YACW,kBAAkB;IA8BhC;;OAEG;YACW,iBAAiB;IA4D/B;;OAEG;YACW,mBAAmB;CA0DpC"}
|
|
@@ -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"}
|