|
9 | 9 | SPACES_PAGE_SIZE, |
10 | 10 | } from '@/connectors/google-chat/meta' |
11 | 11 | import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' |
12 | | -import { parseTagDate } from '@/connectors/utils' |
| 12 | +import { BoundedLines, CONNECTOR_TEXT_DOCUMENT_MAX_BYTES, parseTagDate } from '@/connectors/utils' |
13 | 13 |
|
14 | 14 | const logger = createLogger('GoogleChatConnector') |
15 | 15 |
|
@@ -218,6 +218,7 @@ function spaceToStub( |
218 | 218 | title: spaceTitle(space), |
219 | 219 | content: '', |
220 | 220 | contentDeferred: true, |
| 221 | + estimatedBytes: CONNECTOR_TEXT_DOCUMENT_MAX_BYTES, |
221 | 222 | mimeType: 'text/plain', |
222 | 223 | sourceUrl: space.spaceUri, |
223 | 224 | contentHash: buildContentHash(space, maxMessages, lookbackDays, syncContext), |
@@ -323,37 +324,28 @@ function senderLabel(sender: ChatUser | undefined): string { |
323 | 324 | * that belongs in a knowledge base is synced through the Google Drive connector |
324 | 325 | * instead, which already handles size caps, OCR, and format parsing. |
325 | 326 | */ |
326 | | -function formatSpaceContent(space: Space, messages: ChatMessage[]): string { |
327 | | - const parts: string[] = [`Space: ${spaceTitle(space)}`] |
| 327 | +function formatSpaceContent( |
| 328 | + space: Space, |
| 329 | + messages: ChatMessage[] |
| 330 | +): { content: string; messageCount: number } { |
| 331 | + const parts = new BoundedLines() |
| 332 | + parts.push(`Space: ${spaceTitle(space)}`) |
328 | 333 | const description = space.spaceDetails?.description?.trim() |
329 | 334 | if (description) parts.push(`Description: ${description}`) |
330 | 335 | const guidelines = space.spaceDetails?.guidelines?.trim() |
331 | 336 | if (guidelines) parts.push(`Guidelines: ${guidelines}`) |
332 | 337 |
|
333 | | - const lines: string[] = [] |
| 338 | + let messageCount = 0 |
334 | 339 | for (const message of messages) { |
335 | 340 | const text = message.text?.trim() || message.fallbackText?.trim() |
336 | 341 | if (!text) continue |
| 342 | + if (messageCount === 0) parts.push('', '--- Messages ---') |
337 | 343 | const timestamp = message.createTime ?? '' |
338 | | - lines.push(`[${timestamp}] ${senderLabel(message.sender)}: ${text}`) |
339 | | - } |
340 | | - |
341 | | - if (lines.length > 0) { |
342 | | - parts.push('') |
343 | | - parts.push('--- Messages ---') |
344 | | - parts.push(...lines) |
| 344 | + if (!parts.push(`[${timestamp}] ${senderLabel(message.sender)}: ${text}`)) break |
| 345 | + messageCount += 1 |
345 | 346 | } |
346 | 347 |
|
347 | | - return parts.join('\n') |
348 | | -} |
349 | | - |
350 | | -/** Number of messages that actually contributed text to the transcript. */ |
351 | | -function countIndexedMessages(messages: ChatMessage[]): number { |
352 | | - let count = 0 |
353 | | - for (const message of messages) { |
354 | | - if (message.text?.trim() || message.fallbackText?.trim()) count++ |
355 | | - } |
356 | | - return count |
| 348 | + return { content: parts.join(), messageCount } |
357 | 349 | } |
358 | 350 |
|
359 | 351 | export const googleChatConnector: ConnectorConfig = { |
@@ -476,12 +468,12 @@ export const googleChatConnector: ConnectorConfig = { |
476 | 468 | * leave a previously indexed transcript in place after the space was cleared |
477 | 469 | * or `lookbackDays` was tightened past every message. |
478 | 470 | */ |
479 | | - const messageCount = countIndexedMessages(messages) |
| 471 | + const { content, messageCount } = formatSpaceContent(space, messages) |
480 | 472 | const stub = spaceToStub(space, maxMessages, lookbackDays, syncContext) |
481 | 473 |
|
482 | 474 | return { |
483 | 475 | ...stub, |
484 | | - content: formatSpaceContent(space, messages), |
| 476 | + content, |
485 | 477 | contentDeferred: false, |
486 | 478 | metadata: { ...stub.metadata, messageCount }, |
487 | 479 | } |
|
0 commit comments