@copilotkit/pathfinder 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +7 -2
  3. package/dist/cli.js +11 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +8 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +58 -5
  8. package/dist/config.js.map +1 -1
  9. package/dist/db/queries.d.ts +7 -1
  10. package/dist/db/queries.d.ts.map +1 -1
  11. package/dist/db/queries.js +55 -0
  12. package/dist/db/queries.js.map +1 -1
  13. package/dist/faq-txt.d.ts +12 -0
  14. package/dist/faq-txt.d.ts.map +1 -0
  15. package/dist/faq-txt.js +37 -0
  16. package/dist/faq-txt.js.map +1 -0
  17. package/dist/indexing/chunking/index.js +3 -0
  18. package/dist/indexing/chunking/index.js.map +1 -1
  19. package/dist/indexing/chunking/qa.d.ts +8 -0
  20. package/dist/indexing/chunking/qa.d.ts.map +1 -0
  21. package/dist/indexing/chunking/qa.js +22 -0
  22. package/dist/indexing/chunking/qa.js.map +1 -0
  23. package/dist/indexing/distiller.d.ts +29 -0
  24. package/dist/indexing/distiller.d.ts.map +1 -0
  25. package/dist/indexing/distiller.js +104 -0
  26. package/dist/indexing/distiller.js.map +1 -0
  27. package/dist/indexing/orchestrator.d.ts +8 -3
  28. package/dist/indexing/orchestrator.d.ts.map +1 -1
  29. package/dist/indexing/orchestrator.js +98 -93
  30. package/dist/indexing/orchestrator.js.map +1 -1
  31. package/dist/indexing/pipeline.d.ts +18 -0
  32. package/dist/indexing/pipeline.d.ts.map +1 -0
  33. package/dist/indexing/pipeline.js +68 -0
  34. package/dist/indexing/pipeline.js.map +1 -0
  35. package/dist/indexing/providers/discord-api.d.ts +79 -0
  36. package/dist/indexing/providers/discord-api.d.ts.map +1 -0
  37. package/dist/indexing/providers/discord-api.js +167 -0
  38. package/dist/indexing/providers/discord-api.js.map +1 -0
  39. package/dist/indexing/providers/discord.d.ts +25 -0
  40. package/dist/indexing/providers/discord.d.ts.map +1 -0
  41. package/dist/indexing/providers/discord.js +282 -0
  42. package/dist/indexing/providers/discord.js.map +1 -0
  43. package/dist/indexing/providers/file.d.ts +18 -0
  44. package/dist/indexing/providers/file.d.ts.map +1 -0
  45. package/dist/indexing/providers/file.js +262 -0
  46. package/dist/indexing/providers/file.js.map +1 -0
  47. package/dist/indexing/providers/index.d.ts +5 -0
  48. package/dist/indexing/providers/index.d.ts.map +1 -0
  49. package/dist/indexing/providers/index.js +22 -0
  50. package/dist/indexing/providers/index.js.map +1 -0
  51. package/dist/indexing/providers/slack-api.d.ts +62 -0
  52. package/dist/indexing/providers/slack-api.d.ts.map +1 -0
  53. package/dist/indexing/providers/slack-api.js +167 -0
  54. package/dist/indexing/providers/slack-api.js.map +1 -0
  55. package/dist/indexing/providers/slack.d.ts +21 -0
  56. package/dist/indexing/providers/slack.d.ts.map +1 -0
  57. package/dist/indexing/providers/slack.js +192 -0
  58. package/dist/indexing/providers/slack.js.map +1 -0
  59. package/dist/indexing/providers/types.d.ts +56 -0
  60. package/dist/indexing/providers/types.d.ts.map +1 -0
  61. package/dist/indexing/providers/types.js +3 -0
  62. package/dist/indexing/providers/types.js.map +1 -0
  63. package/dist/indexing/url-derivation.d.ts +2 -2
  64. package/dist/indexing/url-derivation.d.ts.map +1 -1
  65. package/dist/indexing/url-derivation.js.map +1 -1
  66. package/dist/indexing/utils.d.ts +19 -0
  67. package/dist/indexing/utils.d.ts.map +1 -0
  68. package/dist/indexing/utils.js +63 -0
  69. package/dist/indexing/utils.js.map +1 -0
  70. package/dist/mcp/server.d.ts.map +1 -1
  71. package/dist/mcp/server.js +4 -0
  72. package/dist/mcp/server.js.map +1 -1
  73. package/dist/mcp/tools/bash-fs.d.ts.map +1 -1
  74. package/dist/mcp/tools/bash-fs.js +4 -1
  75. package/dist/mcp/tools/bash-fs.js.map +1 -1
  76. package/dist/mcp/tools/knowledge.d.ts +13 -0
  77. package/dist/mcp/tools/knowledge.d.ts.map +1 -0
  78. package/dist/mcp/tools/knowledge.js +92 -0
  79. package/dist/mcp/tools/knowledge.js.map +1 -0
  80. package/dist/server.d.ts.map +1 -1
  81. package/dist/server.js +111 -8
  82. package/dist/server.js.map +1 -1
  83. package/dist/types.d.ts +788 -20
  84. package/dist/types.d.ts.map +1 -1
  85. package/dist/types.js +82 -4
  86. package/dist/types.js.map +1 -1
  87. package/dist/validate.d.ts +29 -0
  88. package/dist/validate.d.ts.map +1 -0
  89. package/dist/validate.js +192 -0
  90. package/dist/validate.js.map +1 -0
  91. package/dist/webhooks/discord.d.ts +13 -0
  92. package/dist/webhooks/discord.d.ts.map +1 -0
  93. package/dist/webhooks/discord.js +57 -0
  94. package/dist/webhooks/discord.js.map +1 -0
  95. package/dist/webhooks/slack.d.ts +13 -0
  96. package/dist/webhooks/slack.d.ts.map +1 -0
  97. package/dist/webhooks/slack.js +106 -0
  98. package/dist/webhooks/slack.js.map +1 -0
  99. package/package.json +15 -2
  100. package/dist/indexing/source-indexer.d.ts +0 -68
  101. package/dist/indexing/source-indexer.d.ts.map +0 -1
  102. package/dist/indexing/source-indexer.js +0 -380
  103. package/dist/indexing/source-indexer.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ export interface DiscordMessage {
2
+ id: string;
3
+ author: {
4
+ id: string;
5
+ username: string;
6
+ global_name?: string;
7
+ };
8
+ content: string;
9
+ timestamp: string;
10
+ thread?: {
11
+ id: string;
12
+ message_count: number;
13
+ };
14
+ reactions?: Array<{
15
+ emoji: {
16
+ name: string;
17
+ };
18
+ count: number;
19
+ }>;
20
+ }
21
+ export interface DiscordThread {
22
+ id: string;
23
+ name: string;
24
+ parent_id: string;
25
+ message_count: number;
26
+ owner_id: string;
27
+ created_timestamp: string;
28
+ last_message_id: string;
29
+ archived: boolean;
30
+ }
31
+ export interface DiscordUser {
32
+ id: string;
33
+ displayName: string;
34
+ }
35
+ export interface DiscordApiClientOptions {
36
+ token: string;
37
+ /** Max retries on rate-limited requests (default: 5) */
38
+ maxRetries?: number;
39
+ }
40
+ export declare class DiscordApiClient {
41
+ private rest;
42
+ private maxRetries;
43
+ private userCache;
44
+ private logPrefix;
45
+ constructor(options: DiscordApiClientOptions);
46
+ /**
47
+ * Fetch messages from a text channel, paginated using `after` parameter.
48
+ * If `after` is provided, only messages after that snowflake ID are returned.
49
+ */
50
+ fetchChannelMessages(channelId: string, after?: string, limit?: number): Promise<DiscordMessage[]>;
51
+ /**
52
+ * Fetch all threads in a forum channel (active + archived).
53
+ * Active threads: GET /guilds/{guildId}/threads/active, filtered by parent_id.
54
+ * Archived threads: paginated via before parameter.
55
+ */
56
+ fetchForumThreads(channelId: string, guildId: string): Promise<DiscordThread[]>;
57
+ /**
58
+ * Fetch messages within a thread.
59
+ */
60
+ fetchThreadMessages(threadId: string, limit?: number): Promise<DiscordMessage[]>;
61
+ /**
62
+ * Fetch user info with caching.
63
+ */
64
+ fetchUser(userId: string): Promise<DiscordUser>;
65
+ /**
66
+ * Get a message URL (deterministic, no API call).
67
+ */
68
+ getMessageUrl(guildId: string, channelId: string, messageId: string): string;
69
+ /**
70
+ * Fetch archived threads (public or private) with pagination.
71
+ */
72
+ private fetchArchivedThreads;
73
+ /**
74
+ * Call a Discord API method with retry on rate limit (429) responses.
75
+ * Respects retry_after with exponential backoff fallback.
76
+ */
77
+ private callWithRetry;
78
+ }
79
+ //# sourceMappingURL=discord-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-api.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/discord-api.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD,qBAAa,gBAAgB;IACzB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAmB;gBAExB,OAAO,EAAE,uBAAuB;IAK5C;;;OAGG;IACG,oBAAoB,CACtB,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC;IAgC5B;;;;OAIG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA2BrF;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAItF;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBrD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ5E;;OAEG;YACW,oBAAoB;IA4ClC;;;OAGG;YACW,aAAa;CA8B9B"}
@@ -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"}