@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.
Files changed (112) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +106 -21
  3. package/README.md +14 -3
  4. package/dist/cli.js +11 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +64 -5
  9. package/dist/config.js.map +1 -1
  10. package/dist/db/queries.d.ts +12 -1
  11. package/dist/db/queries.d.ts.map +1 -1
  12. package/dist/db/queries.js +64 -0
  13. package/dist/db/queries.js.map +1 -1
  14. package/dist/faq-txt.d.ts +12 -0
  15. package/dist/faq-txt.d.ts.map +1 -0
  16. package/dist/faq-txt.js +37 -0
  17. package/dist/faq-txt.js.map +1 -0
  18. package/dist/indexing/chunking/index.js +4 -0
  19. package/dist/indexing/chunking/index.js.map +1 -1
  20. package/dist/indexing/chunking/qa.d.ts +8 -0
  21. package/dist/indexing/chunking/qa.d.ts.map +1 -0
  22. package/dist/indexing/chunking/qa.js +22 -0
  23. package/dist/indexing/chunking/qa.js.map +1 -0
  24. package/dist/indexing/distiller.d.ts +29 -0
  25. package/dist/indexing/distiller.d.ts.map +1 -0
  26. package/dist/indexing/distiller.js +104 -0
  27. package/dist/indexing/distiller.js.map +1 -0
  28. package/dist/indexing/orchestrator.d.ts +8 -3
  29. package/dist/indexing/orchestrator.d.ts.map +1 -1
  30. package/dist/indexing/orchestrator.js +99 -93
  31. package/dist/indexing/orchestrator.js.map +1 -1
  32. package/dist/indexing/pipeline.d.ts +18 -0
  33. package/dist/indexing/pipeline.d.ts.map +1 -0
  34. package/dist/indexing/pipeline.js +68 -0
  35. package/dist/indexing/pipeline.js.map +1 -0
  36. package/dist/indexing/providers/discord-api.d.ts +79 -0
  37. package/dist/indexing/providers/discord-api.d.ts.map +1 -0
  38. package/dist/indexing/providers/discord-api.js +167 -0
  39. package/dist/indexing/providers/discord-api.js.map +1 -0
  40. package/dist/indexing/providers/discord.d.ts +25 -0
  41. package/dist/indexing/providers/discord.d.ts.map +1 -0
  42. package/dist/indexing/providers/discord.js +282 -0
  43. package/dist/indexing/providers/discord.js.map +1 -0
  44. package/dist/indexing/providers/file.d.ts +18 -0
  45. package/dist/indexing/providers/file.d.ts.map +1 -0
  46. package/dist/indexing/providers/file.js +262 -0
  47. package/dist/indexing/providers/file.js.map +1 -0
  48. package/dist/indexing/providers/index.d.ts +5 -0
  49. package/dist/indexing/providers/index.d.ts.map +1 -0
  50. package/dist/indexing/providers/index.js +24 -0
  51. package/dist/indexing/providers/index.js.map +1 -0
  52. package/dist/indexing/providers/notion-api.d.ts +101 -0
  53. package/dist/indexing/providers/notion-api.d.ts.map +1 -0
  54. package/dist/indexing/providers/notion-api.js +419 -0
  55. package/dist/indexing/providers/notion-api.js.map +1 -0
  56. package/dist/indexing/providers/notion.d.ts +29 -0
  57. package/dist/indexing/providers/notion.d.ts.map +1 -0
  58. package/dist/indexing/providers/notion.js +236 -0
  59. package/dist/indexing/providers/notion.js.map +1 -0
  60. package/dist/indexing/providers/slack-api.d.ts +62 -0
  61. package/dist/indexing/providers/slack-api.d.ts.map +1 -0
  62. package/dist/indexing/providers/slack-api.js +167 -0
  63. package/dist/indexing/providers/slack-api.js.map +1 -0
  64. package/dist/indexing/providers/slack.d.ts +21 -0
  65. package/dist/indexing/providers/slack.d.ts.map +1 -0
  66. package/dist/indexing/providers/slack.js +192 -0
  67. package/dist/indexing/providers/slack.js.map +1 -0
  68. package/dist/indexing/providers/types.d.ts +57 -0
  69. package/dist/indexing/providers/types.d.ts.map +1 -0
  70. package/dist/indexing/providers/types.js +3 -0
  71. package/dist/indexing/providers/types.js.map +1 -0
  72. package/dist/indexing/url-derivation.d.ts +2 -2
  73. package/dist/indexing/url-derivation.d.ts.map +1 -1
  74. package/dist/indexing/url-derivation.js.map +1 -1
  75. package/dist/indexing/utils.d.ts +19 -0
  76. package/dist/indexing/utils.d.ts.map +1 -0
  77. package/dist/indexing/utils.js +63 -0
  78. package/dist/indexing/utils.js.map +1 -0
  79. package/dist/mcp/server.d.ts.map +1 -1
  80. package/dist/mcp/server.js +4 -0
  81. package/dist/mcp/server.js.map +1 -1
  82. package/dist/mcp/tools/bash-fs.d.ts.map +1 -1
  83. package/dist/mcp/tools/bash-fs.js +4 -1
  84. package/dist/mcp/tools/bash-fs.js.map +1 -1
  85. package/dist/mcp/tools/knowledge.d.ts +13 -0
  86. package/dist/mcp/tools/knowledge.d.ts.map +1 -0
  87. package/dist/mcp/tools/knowledge.js +92 -0
  88. package/dist/mcp/tools/knowledge.js.map +1 -0
  89. package/dist/server.d.ts.map +1 -1
  90. package/dist/server.js +111 -8
  91. package/dist/server.js.map +1 -1
  92. package/dist/types.d.ts +1075 -79
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js +94 -4
  95. package/dist/types.js.map +1 -1
  96. package/dist/validate.d.ts +29 -0
  97. package/dist/validate.d.ts.map +1 -0
  98. package/dist/validate.js +197 -0
  99. package/dist/validate.js.map +1 -0
  100. package/dist/webhooks/discord.d.ts +13 -0
  101. package/dist/webhooks/discord.d.ts.map +1 -0
  102. package/dist/webhooks/discord.js +57 -0
  103. package/dist/webhooks/discord.js.map +1 -0
  104. package/dist/webhooks/slack.d.ts +13 -0
  105. package/dist/webhooks/slack.d.ts.map +1 -0
  106. package/dist/webhooks/slack.js +106 -0
  107. package/dist/webhooks/slack.js.map +1 -0
  108. package/package.json +17 -3
  109. package/dist/indexing/source-indexer.d.ts +0 -68
  110. package/dist/indexing/source-indexer.d.ts.map +0 -1
  111. package/dist/indexing/source-indexer.js +0 -380
  112. package/dist/indexing/source-indexer.js.map +0 -1
@@ -0,0 +1,236 @@
1
+ // NotionDataProvider — Notion page acquisition via API client.
2
+ // Implements DataProvider: discovers pages from root_pages, databases, or workspace search,
3
+ // fetches markdown content, and detects deletions during incremental acquire.
4
+ import { NotionApiClient } from './notion-api.js';
5
+ import { getIndexedItemIds } from '../../db/queries.js';
6
+ export class NotionDataProvider {
7
+ config;
8
+ apiClient;
9
+ logPrefix;
10
+ constructor(config, options) {
11
+ if (config.type !== 'notion') {
12
+ throw new Error('NotionDataProvider requires a notion source config');
13
+ }
14
+ this.config = config;
15
+ const token = options.notionToken;
16
+ if (!token) {
17
+ throw new Error('NotionDataProvider requires a notionToken in provider options');
18
+ }
19
+ this.apiClient = new NotionApiClient(token, {
20
+ maxDepth: this.config.max_depth,
21
+ });
22
+ this.logPrefix = `[notion-provider:${config.name}]`;
23
+ }
24
+ async fullAcquire() {
25
+ console.log(`${this.logPrefix} Starting full acquire`);
26
+ const pages = await this.discoverAllPages();
27
+ console.log(`${this.logPrefix} Discovered ${pages.size} page(s)`);
28
+ const { items, maxTime, failedCount } = await this.acquireContent(pages);
29
+ if (failedCount === pages.size && pages.size > 0) {
30
+ throw new Error(`All ${failedCount} page(s) failed during acquire`);
31
+ }
32
+ console.log(`${this.logPrefix} Full acquire complete: ${items.length} item(s)`);
33
+ return {
34
+ items,
35
+ removedIds: [],
36
+ stateToken: maxTime || new Date().toISOString(),
37
+ };
38
+ }
39
+ async incrementalAcquire(lastStateToken) {
40
+ console.log(`${this.logPrefix} Starting incremental acquire since ${lastStateToken}`);
41
+ // Discover full page set for deletion detection
42
+ const allPages = await this.discoverAllPages();
43
+ const allPageIds = new Set(allPages.keys());
44
+ // Discover recently edited pages
45
+ const editedPages = await this.discoverEditedPages(lastStateToken);
46
+ // Detect deletions
47
+ const indexedIds = await getIndexedItemIds(this.config.name);
48
+ const removedIds = [];
49
+ for (const id of indexedIds) {
50
+ if (!allPageIds.has(id)) {
51
+ removedIds.push(id);
52
+ }
53
+ }
54
+ // Early return if no changes
55
+ if (editedPages.size === 0 && removedIds.length === 0) {
56
+ console.log(`${this.logPrefix} No changes detected`);
57
+ return { items: [], removedIds: [], stateToken: lastStateToken };
58
+ }
59
+ // Acquire content only for edited pages
60
+ const { items, maxTime, failedCount } = await this.acquireContent(editedPages);
61
+ if (failedCount === editedPages.size && editedPages.size > 0) {
62
+ throw new Error(`All ${failedCount} page(s) failed during acquire`);
63
+ }
64
+ console.log(`${this.logPrefix} Incremental acquire complete: ${items.length} item(s), ${removedIds.length} removal(s)`);
65
+ return {
66
+ items,
67
+ removedIds,
68
+ stateToken: maxTime || lastStateToken,
69
+ };
70
+ }
71
+ async getCurrentStateToken() {
72
+ const pages = await this.apiClient.searchPages();
73
+ if (pages.length === 0)
74
+ return null;
75
+ let maxTime = '';
76
+ for (const page of pages) {
77
+ if (page.lastEditedTime > maxTime) {
78
+ maxTime = page.lastEditedTime;
79
+ }
80
+ }
81
+ return maxTime || null;
82
+ }
83
+ // -----------------------------------------------------------------------
84
+ // Private: discovery
85
+ // -----------------------------------------------------------------------
86
+ /**
87
+ * Discover all pages — full page set for indexing or deletion detection.
88
+ */
89
+ async discoverAllPages() {
90
+ const pages = new Map();
91
+ const hasRootPages = this.config.root_pages.length > 0;
92
+ const hasDatabases = this.config.databases.length > 0;
93
+ if (!hasRootPages && !hasDatabases) {
94
+ // Search-all mode
95
+ const results = await this.apiClient.searchPages();
96
+ for (const page of results) {
97
+ pages.set(page.id, page);
98
+ }
99
+ return pages;
100
+ }
101
+ // Fetch root pages
102
+ for (const pageId of this.config.root_pages) {
103
+ try {
104
+ const page = await this.apiClient.getPageMeta(pageId);
105
+ pages.set(page.id, page);
106
+ }
107
+ catch (err) {
108
+ const msg = err instanceof Error ? err.message : String(err);
109
+ console.warn(`${this.logPrefix} Failed to fetch root page ${pageId}: ${msg}`);
110
+ }
111
+ }
112
+ // Query databases
113
+ for (const dbId of this.config.databases) {
114
+ try {
115
+ const entries = await this.apiClient.queryDatabase(dbId);
116
+ for (const entry of entries) {
117
+ pages.set(entry.id, entry);
118
+ }
119
+ }
120
+ catch (err) {
121
+ const msg = err instanceof Error ? err.message : String(err);
122
+ console.warn(`${this.logPrefix} Failed to query database ${dbId}: ${msg}`);
123
+ }
124
+ }
125
+ return pages;
126
+ }
127
+ /**
128
+ * Discover recently edited pages — only pages edited after the given timestamp.
129
+ */
130
+ async discoverEditedPages(editedAfter) {
131
+ const pages = new Map();
132
+ const hasRootPages = this.config.root_pages.length > 0;
133
+ const hasDatabases = this.config.databases.length > 0;
134
+ if (!hasRootPages && !hasDatabases) {
135
+ const results = await this.apiClient.searchPages(editedAfter);
136
+ for (const page of results) {
137
+ pages.set(page.id, page);
138
+ }
139
+ return pages;
140
+ }
141
+ // Fetch root pages and filter by time
142
+ const cutoff = new Date(editedAfter).getTime();
143
+ for (const pageId of this.config.root_pages) {
144
+ try {
145
+ const page = await this.apiClient.getPageMeta(pageId);
146
+ if (new Date(page.lastEditedTime).getTime() > cutoff) {
147
+ pages.set(page.id, page);
148
+ }
149
+ }
150
+ catch (err) {
151
+ const msg = err instanceof Error ? err.message : String(err);
152
+ console.warn(`${this.logPrefix} Failed to fetch root page ${pageId}: ${msg}`);
153
+ }
154
+ }
155
+ // Query databases with time filter
156
+ for (const dbId of this.config.databases) {
157
+ try {
158
+ const entries = await this.apiClient.queryDatabase(dbId, editedAfter);
159
+ for (const entry of entries) {
160
+ pages.set(entry.id, entry);
161
+ }
162
+ }
163
+ catch (err) {
164
+ const msg = err instanceof Error ? err.message : String(err);
165
+ console.warn(`${this.logPrefix} Failed to query database ${dbId}: ${msg}`);
166
+ }
167
+ }
168
+ return pages;
169
+ }
170
+ // -----------------------------------------------------------------------
171
+ // Private: content acquisition
172
+ // -----------------------------------------------------------------------
173
+ /**
174
+ * Acquire content for a set of pages. Returns items, max edit time, and failure count.
175
+ */
176
+ async acquireContent(pages) {
177
+ const items = [];
178
+ let maxTime = '';
179
+ let failedCount = 0;
180
+ for (const [id, page] of pages) {
181
+ try {
182
+ let content = await this.apiClient.getPageContent(id);
183
+ // Prepend YAML frontmatter if page has properties and include_properties is enabled
184
+ if (page.properties && this.config.include_properties) {
185
+ const frontmatter = this.buildFrontmatter(page.properties);
186
+ if (frontmatter) {
187
+ content = `${frontmatter}\n\n${content}`;
188
+ }
189
+ }
190
+ // Empty pages get title-only content
191
+ if (!content.trim()) {
192
+ content = `# ${page.title}`;
193
+ }
194
+ items.push({
195
+ id: page.id,
196
+ content,
197
+ title: page.title,
198
+ sourceUrl: page.url,
199
+ metadata: {
200
+ parentType: page.parentType,
201
+ parentId: page.parentId,
202
+ },
203
+ });
204
+ if (page.lastEditedTime > maxTime) {
205
+ maxTime = page.lastEditedTime;
206
+ }
207
+ }
208
+ catch (err) {
209
+ failedCount++;
210
+ const msg = err instanceof Error ? err.message : String(err);
211
+ console.warn(`${this.logPrefix} Failed to acquire content for page ${id}: ${msg}`);
212
+ }
213
+ }
214
+ return { items, maxTime, failedCount };
215
+ }
216
+ /**
217
+ * Build YAML frontmatter from page properties.
218
+ * Skips the "title" key (redundant with page title) and null/empty values.
219
+ */
220
+ buildFrontmatter(properties) {
221
+ const lines = [];
222
+ for (const [key, value] of Object.entries(properties)) {
223
+ // Skip title property — it's already the page title
224
+ if (key.toLowerCase() === 'title')
225
+ continue;
226
+ // Skip null/empty values
227
+ if (!value)
228
+ continue;
229
+ lines.push(`${key}: ${value}`);
230
+ }
231
+ if (lines.length === 0)
232
+ return null;
233
+ return `---\n${lines.join('\n')}\n---`;
234
+ }
235
+ }
236
+ //# sourceMappingURL=notion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion.js","sourceRoot":"","sources":["../../../src/indexing/providers/notion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { WebClient } from '@slack/web-api';
2
+ export interface SlackMessage {
3
+ ts: string;
4
+ user?: string;
5
+ text?: string;
6
+ thread_ts?: string;
7
+ reply_count?: number;
8
+ reactions?: Array<{
9
+ name: string;
10
+ count: number;
11
+ }>;
12
+ team?: string;
13
+ }
14
+ export interface SlackUser {
15
+ id: string;
16
+ displayName: string;
17
+ teamId?: string;
18
+ }
19
+ export interface SlackApiClientOptions {
20
+ token: string;
21
+ /** Max retries on rate-limited requests (default: 5) */
22
+ maxRetries?: number;
23
+ }
24
+ export declare class SlackApiClient {
25
+ private client;
26
+ private maxRetries;
27
+ private userCache;
28
+ private teamNameCache;
29
+ private logPrefix;
30
+ constructor(options: SlackApiClientOptions);
31
+ /**
32
+ * Fetch channel message history, paginated. Returns all top-level messages.
33
+ * If `oldest` is provided, only messages after that timestamp are returned.
34
+ */
35
+ fetchChannelHistory(channelId: string, oldest?: string, limit?: number): Promise<SlackMessage[]>;
36
+ /**
37
+ * Fetch all replies in a thread, paginated.
38
+ */
39
+ fetchThreadReplies(channelId: string, threadTs: string): Promise<SlackMessage[]>;
40
+ /**
41
+ * Fetch user info with caching. Returns display name with workspace suffix
42
+ * for external users in Slack Connect channels.
43
+ */
44
+ fetchUserInfo(userId: string): Promise<SlackUser>;
45
+ /**
46
+ * Get a permalink URL for a specific message.
47
+ */
48
+ getChannelPermalink(channelId: string, messageTs: string): Promise<string>;
49
+ /**
50
+ * Resolve a team ID to a team name (for Slack Connect workspace suffix).
51
+ * Caches results. Returns null if lookup fails (e.g., no permission).
52
+ */
53
+ private resolveTeamName;
54
+ /**
55
+ * Call a Slack API method with retry on rate limit (429) responses.
56
+ * Respects Retry-After header with exponential backoff fallback.
57
+ */
58
+ private callWithRetry;
59
+ /** Expose the underlying WebClient for testing/advanced usage. */
60
+ get webClient(): WebClient;
61
+ }
62
+ //# sourceMappingURL=slack-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-api.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/slack-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAIlE,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAYD,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAiB;gBAEtB,OAAO,EAAE,qBAAqB;IAQ1C;;;OAGG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCtG;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgCtF;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA+BvD;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhF;;;OAGG;YACW,eAAe;IAiB7B;;;OAGG;YACW,aAAa;IA6B3B,kEAAkE;IAClE,IAAI,SAAS,IAAI,SAAS,CAEzB;CACJ"}
@@ -0,0 +1,167 @@
1
+ // Slack Web API client wrapper — handles pagination, rate limiting, user caching.
2
+ import { WebClient } from '@slack/web-api';
3
+ // ── Rate limit helpers ───────────────────────────────────────────────────────
4
+ function sleep(ms) {
5
+ return new Promise(resolve => setTimeout(resolve, ms));
6
+ }
7
+ // ── Client ───────────────────────────────────────────────────────────────────
8
+ const MAX_PAGES = 100;
9
+ export class SlackApiClient {
10
+ client;
11
+ maxRetries;
12
+ userCache = new Map();
13
+ teamNameCache = new Map();
14
+ logPrefix = '[slack-api]';
15
+ constructor(options) {
16
+ this.client = new WebClient(options.token, {
17
+ // Disable built-in retry so we handle it ourselves
18
+ retryConfig: { retries: 0 },
19
+ });
20
+ this.maxRetries = options.maxRetries ?? 5;
21
+ }
22
+ /**
23
+ * Fetch channel message history, paginated. Returns all top-level messages.
24
+ * If `oldest` is provided, only messages after that timestamp are returned.
25
+ */
26
+ async fetchChannelHistory(channelId, oldest, limit) {
27
+ const messages = [];
28
+ let cursor;
29
+ const pageLimit = limit ?? 200;
30
+ let pages = 0;
31
+ do {
32
+ pages++;
33
+ const result = await this.callWithRetry(() => this.client.conversations.history({
34
+ channel: channelId,
35
+ oldest,
36
+ cursor,
37
+ limit: pageLimit,
38
+ }));
39
+ const rawMessages = result.messages;
40
+ if (rawMessages) {
41
+ messages.push(...rawMessages);
42
+ }
43
+ // When an explicit limit is provided, don't paginate — return just the first page
44
+ if (limit !== undefined)
45
+ break;
46
+ cursor = result.response_metadata?.next_cursor;
47
+ if (pages >= MAX_PAGES) {
48
+ console.warn(`${this.logPrefix} fetchChannelHistory hit max pages (${MAX_PAGES}) for channel ${channelId}`);
49
+ break;
50
+ }
51
+ } while (cursor);
52
+ return messages;
53
+ }
54
+ /**
55
+ * Fetch all replies in a thread, paginated.
56
+ */
57
+ async fetchThreadReplies(channelId, threadTs) {
58
+ const messages = [];
59
+ let cursor;
60
+ let pages = 0;
61
+ do {
62
+ pages++;
63
+ const result = await this.callWithRetry(() => this.client.conversations.replies({
64
+ channel: channelId,
65
+ ts: threadTs,
66
+ cursor,
67
+ limit: 200,
68
+ }));
69
+ const rawMessages = result.messages;
70
+ if (rawMessages) {
71
+ messages.push(...rawMessages);
72
+ }
73
+ cursor = result.response_metadata?.next_cursor;
74
+ if (pages >= MAX_PAGES) {
75
+ console.warn(`${this.logPrefix} fetchThreadReplies hit max pages (${MAX_PAGES}) for thread ${threadTs}`);
76
+ break;
77
+ }
78
+ } while (cursor);
79
+ return messages;
80
+ }
81
+ /**
82
+ * Fetch user info with caching. Returns display name with workspace suffix
83
+ * for external users in Slack Connect channels.
84
+ */
85
+ async fetchUserInfo(userId) {
86
+ const cached = this.userCache.get(userId);
87
+ if (cached)
88
+ return cached;
89
+ const result = await this.callWithRetry(() => this.client.users.info({ user: userId }));
90
+ const user = result.user;
91
+ const profile = user?.profile;
92
+ const displayName = profile?.display_name || profile?.real_name || userId;
93
+ const teamId = user?.team_id;
94
+ let fullName = displayName;
95
+ if (teamId) {
96
+ const teamName = await this.resolveTeamName(teamId);
97
+ if (teamName) {
98
+ fullName = `${displayName} (${teamName})`;
99
+ }
100
+ }
101
+ const slackUser = {
102
+ id: userId,
103
+ displayName: fullName,
104
+ teamId,
105
+ };
106
+ this.userCache.set(userId, slackUser);
107
+ return slackUser;
108
+ }
109
+ /**
110
+ * Get a permalink URL for a specific message.
111
+ */
112
+ async getChannelPermalink(channelId, messageTs) {
113
+ const result = await this.callWithRetry(() => this.client.chat.getPermalink({
114
+ channel: channelId,
115
+ message_ts: messageTs,
116
+ }));
117
+ return result.permalink;
118
+ }
119
+ /**
120
+ * Resolve a team ID to a team name (for Slack Connect workspace suffix).
121
+ * Caches results. Returns null if lookup fails (e.g., no permission).
122
+ */
123
+ async resolveTeamName(teamId) {
124
+ const cached = this.teamNameCache.get(teamId);
125
+ if (cached !== undefined)
126
+ return cached || null;
127
+ try {
128
+ const result = await this.callWithRetry(() => this.client.team.info({ team: teamId }));
129
+ const name = result.team?.name ?? null;
130
+ this.teamNameCache.set(teamId, name ?? '');
131
+ return name;
132
+ }
133
+ catch {
134
+ this.teamNameCache.set(teamId, '');
135
+ return null;
136
+ }
137
+ }
138
+ /**
139
+ * Call a Slack API method with retry on rate limit (429) responses.
140
+ * Respects Retry-After header with exponential backoff fallback.
141
+ */
142
+ async callWithRetry(fn, attempt = 1) {
143
+ try {
144
+ return await fn();
145
+ }
146
+ catch (error) {
147
+ const isRateLimited = error?.code === 'slack_webapi_rate_limited_error'
148
+ || error?.data?.error === 'ratelimited';
149
+ if (!isRateLimited || attempt > this.maxRetries) {
150
+ throw error;
151
+ }
152
+ const retryAfter = error?.data?.retryAfter
153
+ || error?.retryAfter
154
+ || Math.pow(2, attempt);
155
+ const delayMs = Math.max(retryAfter * 1000, 1000);
156
+ console.warn(`${this.logPrefix} Rate limited (attempt ${attempt}/${this.maxRetries}), ` +
157
+ `retrying in ${retryAfter}s`);
158
+ await sleep(delayMs);
159
+ return this.callWithRetry(fn, attempt + 1);
160
+ }
161
+ }
162
+ /** Expose the underlying WebClient for testing/advanced usage. */
163
+ get webClient() {
164
+ return this.client;
165
+ }
166
+ }
167
+ //# sourceMappingURL=slack-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-api.js","sourceRoot":"","sources":["../../../src/indexing/providers/slack-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SourceConfig } from '../../types.js';
2
+ import type { DataProvider, AcquisitionResult, ProviderOptions } from './types.js';
3
+ export declare class SlackDataProvider 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 single channel: fetch threads, distill, return items.
14
+ */
15
+ private processChannel;
16
+ /**
17
+ * Process a single thread: fetch replies, resolve users, distill, create items.
18
+ */
19
+ private processThread;
20
+ }
21
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/indexing/providers/slack.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAe,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhG,qBAAa,iBAAkB,YAAW,YAAY;IAClD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;IAcpD,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IA+BzC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+BtE,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAwBpD;;OAEG;YACW,cAAc;IA+B5B;;OAEG;YACW,aAAa;CAqE9B"}