@5ss/ai-tools 3.7.0 → 3.7.2

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 (90) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{bedrock-agentcore-browser-DwDSP_YL.js → bedrock-agentcore-browser-yrEY9cUi.js} +2 -2
  3. package/dist/{bedrock-agentcore-browser-DwDSP_YL.js.map → bedrock-agentcore-browser-yrEY9cUi.js.map} +1 -1
  4. package/dist/{bedrock-agentcore-code-interpreter-F0dnrAm4.js → bedrock-agentcore-code-interpreter-BnJnDxCp.js} +2 -2
  5. package/dist/{bedrock-agentcore-code-interpreter-F0dnrAm4.js.map → bedrock-agentcore-code-interpreter-BnJnDxCp.js.map} +1 -1
  6. package/dist/{cloudflare-browser-D-HT43hu.js → cloudflare-browser-D9pG4RTj.js} +3 -3
  7. package/dist/{cloudflare-browser-D-HT43hu.js.map → cloudflare-browser-D9pG4RTj.js.map} +1 -1
  8. package/dist/{cloudflare-email-BLI3z96V.js → cloudflare-email-bsq902dg.js} +2 -2
  9. package/dist/{cloudflare-email-BLI3z96V.js.map → cloudflare-email-bsq902dg.js.map} +1 -1
  10. package/dist/{cloudflare-sandbox-DII392Z9.js → cloudflare-sandbox-DHE4fmiq.js} +3 -3
  11. package/dist/{cloudflare-sandbox-DII392Z9.js.map → cloudflare-sandbox-DHE4fmiq.js.map} +1 -1
  12. package/dist/core/index.js +1 -1
  13. package/dist/{define-ieoksEQ0.js → define-DdFALdNf.js} +2 -1
  14. package/dist/define-DdFALdNf.js.map +1 -0
  15. package/dist/{eventbridge-scheduler-CDmO2-Te.js → eventbridge-scheduler-ICepMPWG.js} +2 -2
  16. package/dist/{eventbridge-scheduler-CDmO2-Te.js.map → eventbridge-scheduler-ICepMPWG.js.map} +1 -1
  17. package/dist/{imessage-Dsms04rC.js → imessage-B-0DZfMa.js} +2 -2
  18. package/dist/{imessage-Dsms04rC.js.map → imessage-B-0DZfMa.js.map} +1 -1
  19. package/dist/index-CZX5OeOF.d.ts.map +1 -1
  20. package/dist/{mastra-vector-B8HjvdMT.js → mastra-vector-qKG3L-Rw.js} +2 -2
  21. package/dist/{mastra-vector-B8HjvdMT.js.map → mastra-vector-qKG3L-Rw.js.map} +1 -1
  22. package/dist/modules/artifacts/index.js +2 -2
  23. package/dist/modules/browser/index.js +3 -3
  24. package/dist/modules/calendar/index.js +1 -1
  25. package/dist/modules/code-sandbox/index.js +3 -3
  26. package/dist/modules/content-type/index.js +1 -1
  27. package/dist/modules/crypto/index.js +1 -1
  28. package/dist/modules/document-extract/index.js +2 -2
  29. package/dist/modules/document-render/index.js +2 -2
  30. package/dist/modules/email/index.js +3 -3
  31. package/dist/modules/email-message/index.js +1 -1
  32. package/dist/modules/files/index.js +2 -2
  33. package/dist/modules/image/index.js +2 -2
  34. package/dist/modules/messaging/index.js +6 -6
  35. package/dist/modules/queue/index.js +2 -2
  36. package/dist/modules/rag/index.js +2 -2
  37. package/dist/modules/scheduler/index.js +2 -2
  38. package/dist/modules/skills/index.js +1 -1
  39. package/dist/modules/tasks/index.js +1 -1
  40. package/dist/modules/vector-store/index.js +1 -1
  41. package/dist/modules/web-fetch/index.js +1 -1
  42. package/dist/{pinecone-BvdXAZMi.js → pinecone-tmtu3ZS5.js} +2 -2
  43. package/dist/{pinecone-BvdXAZMi.js.map → pinecone-tmtu3ZS5.js.map} +1 -1
  44. package/dist/{qdrant-D2E2Lxrw.js → qdrant-zbCHUsnv.js} +2 -2
  45. package/dist/{qdrant-D2E2Lxrw.js.map → qdrant-zbCHUsnv.js.map} +1 -1
  46. package/dist/{resend-A2SnRdQ8.js → resend-Cfgm4HuV.js} +2 -2
  47. package/dist/{resend-A2SnRdQ8.js.map → resend-Cfgm4HuV.js.map} +1 -1
  48. package/dist/{s3-CoZQRTfe.js → s3-TKCIZZ2q.js} +2 -2
  49. package/dist/{s3-CoZQRTfe.js.map → s3-TKCIZZ2q.js.map} +1 -1
  50. package/dist/{slack-C9UJ0b61.js → slack-D6XzBS3b.js} +2 -2
  51. package/dist/{slack-C9UJ0b61.js.map → slack-D6XzBS3b.js.map} +1 -1
  52. package/dist/{sqs-DxFnfODk.js → sqs-B50DWyTf.js} +2 -2
  53. package/dist/{sqs-DxFnfODk.js.map → sqs-B50DWyTf.js.map} +1 -1
  54. package/dist/{supabase-vector-DT3qfnt2.js → supabase-vector-CDKOyvj1.js} +2 -2
  55. package/dist/{supabase-vector-DT3qfnt2.js.map → supabase-vector-CDKOyvj1.js.map} +1 -1
  56. package/dist/{teams-NODh3i6U.js → teams-bGfle6pU.js} +2 -2
  57. package/dist/{teams-NODh3i6U.js.map → teams-bGfle6pU.js.map} +1 -1
  58. package/dist/{telegram-CWMHBeKo.js → telegram-B-TZi9fM.js} +2 -2
  59. package/dist/{telegram-CWMHBeKo.js.map → telegram-B-TZi9fM.js.map} +1 -1
  60. package/dist/{textract-2jkPuRiE.js → textract-CthgcP6w.js} +3 -3
  61. package/dist/{textract-2jkPuRiE.js.map → textract-CthgcP6w.js.map} +1 -1
  62. package/dist/{vector-store-CDQaQXFV.js → vector-store-DrwuMOne.js} +6 -6
  63. package/dist/{vector-store-CDQaQXFV.js.map → vector-store-DrwuMOne.js.map} +1 -1
  64. package/dist/vendors/amazon-sp-api/index.js +1 -1
  65. package/dist/vendors/bedrock-agentcore-browser/index.js +1 -1
  66. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +1 -1
  67. package/dist/vendors/cloudflare-browser/index.js +1 -1
  68. package/dist/vendors/cloudflare-email/index.js +1 -1
  69. package/dist/vendors/cloudflare-sandbox/index.js +1 -1
  70. package/dist/vendors/eventbridge-scheduler/index.js +1 -1
  71. package/dist/vendors/imessage/index.js +1 -1
  72. package/dist/vendors/katana/index.js +1 -1
  73. package/dist/vendors/mastra-vector/index.js +1 -1
  74. package/dist/vendors/pinecone/index.js +1 -1
  75. package/dist/vendors/qdrant/index.js +1 -1
  76. package/dist/vendors/resend/index.js +1 -1
  77. package/dist/vendors/s3/index.js +1 -1
  78. package/dist/vendors/shipstation/index.js +1 -1
  79. package/dist/vendors/slack/index.js +1 -1
  80. package/dist/vendors/sqs/index.js +1 -1
  81. package/dist/vendors/supabase-vector/index.js +1 -1
  82. package/dist/vendors/teams/index.js +1 -1
  83. package/dist/vendors/telegram/index.js +1 -1
  84. package/dist/vendors/textract/index.js +1 -1
  85. package/dist/vendors/woocommerce/index.js +1 -1
  86. package/logos/README.md +1 -0
  87. package/logos/pack-logos.json +1 -0
  88. package/logos/shipstation.svg +12 -0
  89. package/package.json +11 -11
  90. package/dist/define-ieoksEQ0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"telegram-CWMHBeKo.js","names":["#token","#http","#post"],"sources":["../src/vendors/telegram/contracts.ts","../src/vendors/telegram/domain.ts","../src/vendors/telegram/client.ts","../src/vendors/telegram/module.ts","../src/vendors/telegram/webhook.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const MAX_MEDIA_BYTES = 20 * 1024 * 1024\n\nexport const telegramChatActionSchema = z.enum([\n\t'typing',\n\t'upload_photo',\n\t'record_video',\n\t'upload_video',\n\t'record_voice',\n\t'upload_voice',\n\t'upload_document',\n\t'choose_sticker',\n\t'find_location',\n\t'record_video_note',\n\t'upload_video_note'\n])\n\nexport const telegramAuthSchema = z.object({\n\tbot_token: z.string().min(1).describe('Telegram bot token from BotFather')\n})\n\nexport type TelegramAuth = z.infer<typeof telegramAuthSchema>\n\nexport const telegramSendTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id (string form of the numeric id)'),\n\ttext: z.string().min(1).max(4096).describe('Message text (max 4096 characters)'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to'),\n\treply_markup: z.unknown().optional().describe('Optional Telegram reply markup object')\n})\n\nexport const telegramMessageOutputSchema = z.object({\n\tmessage_id: z.string().describe('Telegram message id as string'),\n\tfile_id: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe('Telegram file_id when the message carries a document/photo/audio/video attachment')\n})\n\nexport const telegramEditTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to edit'),\n\ttext: z.string().min(1).max(4096).describe('Replacement text (max 4096 characters)'),\n\treply_markup: z.unknown().optional().describe('Optional Telegram reply markup object')\n})\n\nexport const telegramSendChatActionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\taction: telegramChatActionSchema.describe('Chat action shown to the user (typing, upload_photo, …)')\n})\n\nexport const telegramSetReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to react to'),\n\temoji: z.string().min(1).max(32).describe('Any emoji reaction Telegram accepts for this bot/chat')\n})\n\nexport const telegramClearReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to clear reactions on')\n})\n\nexport const telegramSendMediaInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tkind: z.enum(['photo', 'document']).describe('Media kind'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().max(1024).optional().describe('Optional caption (max 1024 characters)'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to'),\n\tcontent_type: z.string().optional().describe('Optional content type for the upload')\n})\n\nexport const telegramDownloadFileInputSchema = z.object({\n\tfile_id: z.string().min(1).describe('Telegram file_id from an inbound attachment'),\n\tfile_name: z.string().min(1).optional().describe('Preferred file name for the download result')\n})\n\nexport const telegramDownloadFileOutputSchema = z.object({\n\tfile_name: z.string(),\n\tfile_size: z.number().optional(),\n\tbody_base64: z.string().describe('Downloaded file body as base64')\n})\n\nexport const telegramAnswerCallbackInputSchema = z.object({\n\tcallback_query_id: z.string().min(1).describe('callback_query.id from an inbound update'),\n\ttext: z.string().max(200).optional().describe('Optional notification text shown to the user'),\n\tshow_alert: z.boolean().optional().describe('When true, show an alert instead of a toast')\n})\n\nexport const telegramSendMediaGroupItemSchema = z.object({\n\tkind: z.enum(['photo', 'document']).describe('Media kind; all items must be photo or all document'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().max(1024).optional().describe('Optional caption on this item'),\n\tcontent_type: z.string().optional().describe('Optional content type')\n})\n\nexport const telegramSendMediaGroupInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\titems: z\n\t\t.array(telegramSendMediaGroupItemSchema)\n\t\t.min(2)\n\t\t.max(10)\n\t\t.describe('2-10 media items; cannot mix photo and document'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to')\n})\n\nexport const telegramSendMediaGroupOutputSchema = z.object({\n\tmessage_ids: z.array(z.string()).describe('Message ids for each media item')\n})\n\nexport const telegramGetBotOutputSchema = z.object({\n\tbot_id: z.string(),\n\tusername: z.string(),\n\tdisplay_name: z.string()\n})\n\nexport const telegramOkOutputSchema = z.object({\n\tok: z.boolean()\n})\n\nexport type TelegramSendTextInput = z.infer<typeof telegramSendTextInputSchema>\nexport type TelegramMessageOutput = z.infer<typeof telegramMessageOutputSchema>\nexport type TelegramEditTextInput = z.infer<typeof telegramEditTextInputSchema>\nexport type TelegramSendChatActionInput = z.infer<typeof telegramSendChatActionInputSchema>\nexport type TelegramSetReactionInput = z.infer<typeof telegramSetReactionInputSchema>\nexport type TelegramClearReactionInput = z.infer<typeof telegramClearReactionInputSchema>\nexport type TelegramSendMediaInput = z.infer<typeof telegramSendMediaInputSchema>\nexport type TelegramDownloadFileInput = z.infer<typeof telegramDownloadFileInputSchema>\nexport type TelegramDownloadFileOutput = z.infer<typeof telegramDownloadFileOutputSchema>\nexport type TelegramAnswerCallbackInput = z.infer<typeof telegramAnswerCallbackInputSchema>\nexport type TelegramSendMediaGroupInput = z.infer<typeof telegramSendMediaGroupInputSchema>\nexport type TelegramSendMediaGroupOutput = z.infer<typeof telegramSendMediaGroupOutputSchema>\nexport type TelegramGetBotOutput = z.infer<typeof telegramGetBotOutputSchema>\n","/**\n * Telegram payload shaping + envelope/result parse.\n * No HTTP — client owns transport.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { base64ToBytes, bytesToBase64, toArrayBuffer } from '../../shared/bytes'\nimport type {\n\tTelegramDownloadFileInput,\n\tTelegramDownloadFileOutput,\n\tTelegramGetBotOutput,\n\tTelegramMessageOutput,\n\tTelegramSendMediaGroupInput,\n\tTelegramSendMediaGroupOutput,\n\tTelegramSendMediaInput\n} from './contracts'\nimport { MAX_MEDIA_BYTES } from './contracts'\n\nexport type TelegramFailureKind = 'definite_rejection' | 'outcome_unknown'\n\nexport class TelegramClientError extends ToolError {\n\treadonly failureKind: TelegramFailureKind\n\n\tconstructor(input: {\n\t\tmessage: string\n\t\tfailureKind: TelegramFailureKind\n\t\tmethod: string\n\t\tstatus?: number\n\t\tretryAfterSeconds?: number\n\t\tcause?: unknown\n\t}) {\n\t\tsuper(input.message, {\n\t\t\tcode: 'upstream',\n\t\t\tretryable: input.failureKind === 'outcome_unknown',\n\t\t\tcause: input.cause,\n\t\t\tdetails: {\n\t\t\t\tmethod: input.method,\n\t\t\t\tfailure_kind: input.failureKind,\n\t\t\t\tstatus: input.status,\n\t\t\t\tretry_after_seconds: input.retryAfterSeconds\n\t\t\t}\n\t\t})\n\t\tthis.name = 'TelegramClientError'\n\t\tthis.failureKind = input.failureKind\n\t}\n}\n\nexport function isTelegramDefiniteRejection(error: unknown): boolean {\n\treturn error instanceof TelegramClientError && error.failureKind === 'definite_rejection'\n}\n\nexport function isTelegramOutcomeUnknown(error: unknown): boolean {\n\treturn error instanceof TelegramClientError && error.failureKind === 'outcome_unknown'\n}\n\n/** Network / abort / transport failures before a parseable Telegram envelope. */\nexport function throwTelegramTransportError(method: string, error: unknown): never {\n\tif (error instanceof TelegramClientError) throw error\n\tconst message = error instanceof Error ? error.message : `${method} request failed`\n\tthrow new TelegramClientError({\n\t\tmessage,\n\t\tfailureKind: 'outcome_unknown',\n\t\tmethod,\n\t\tcause: error\n\t})\n}\n\nfunction isDefiniteStatus(status: number): boolean {\n\treturn status === 400 || status === 401 || status === 403 || status === 404\n}\n\n/** Map Telegram `{ ok, result | description }` (HTTP may be non-2xx). */\nexport function parseResult(label: string, status: number, data: unknown): unknown {\n\tif (!isPlainObject(data) || typeof data['ok'] !== 'boolean') {\n\t\tthrow new TelegramClientError({\n\t\t\tmessage: `${label} returned an invalid envelope`,\n\t\t\tfailureKind: 'outcome_unknown',\n\t\t\tmethod: label\n\t\t})\n\t}\n\tif (status >= 200 && status < 300 && data['ok'] === true && data['result'] !== undefined) {\n\t\treturn data['result']\n\t}\n\tconst parameters = data['parameters']\n\tconst retryAfter =\n\t\tisPlainObject(parameters) && typeof parameters['retry_after'] === 'number' ? parameters['retry_after'] : undefined\n\tthrow new TelegramClientError({\n\t\tmessage: isString(data['description']) ? data['description'] : `${label} failed`,\n\t\tfailureKind: isDefiniteStatus(status) ? 'definite_rejection' : 'outcome_unknown',\n\t\tmethod: label,\n\t\tstatus,\n\t\t...(retryAfter !== undefined && { retryAfterSeconds: retryAfter })\n\t})\n}\n\n/** Prefer largest photo size; else first of document/audio/video/voice/… with a file_id. */\nexport function extractTelegramFileId(message: Record<string, unknown>): string | undefined {\n\tconst photo = message['photo']\n\tif (Array.isArray(photo) && photo.length > 0) {\n\t\tlet best: string | undefined\n\t\tlet bestSize = -1\n\t\tfor (const row of photo) {\n\t\t\tif (!isPlainObject(row) || !isString(row['file_id'])) continue\n\t\t\tconst size = typeof row['file_size'] === 'number' ? row['file_size'] : 0\n\t\t\tif (size >= bestSize) {\n\t\t\t\tbestSize = size\n\t\t\t\tbest = row['file_id']\n\t\t\t}\n\t\t}\n\t\tif (best) return best\n\t}\n\tfor (const key of ['document', 'audio', 'video', 'voice', 'video_note', 'animation', 'sticker'] as const) {\n\t\tconst item = message[key]\n\t\tif (isPlainObject(item) && isString(item['file_id']) && item['file_id'].length > 0) {\n\t\t\treturn item['file_id']\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function parseMessage(value: unknown): TelegramMessageOutput {\n\tif (!isPlainObject(value) || typeof value['message_id'] !== 'number') {\n\t\tthrow new ToolError('Telegram returned an invalid message', { code: 'upstream' })\n\t}\n\tconst fileId = extractTelegramFileId(value)\n\treturn {\n\t\tmessage_id: String(value['message_id']),\n\t\t...(fileId && { file_id: fileId })\n\t}\n}\n\nexport function parseMessages(value: unknown): TelegramSendMediaGroupOutput {\n\tif (!Array.isArray(value)) {\n\t\tthrow new ToolError('Telegram returned an invalid message list', { code: 'upstream' })\n\t}\n\treturn { message_ids: value.map((row) => parseMessage(row).message_id) }\n}\n\nexport function parseOk(value: unknown): void {\n\tif (value !== true) {\n\t\tthrow new ToolError('Telegram returned unexpected result', { code: 'upstream' })\n\t}\n}\n\nexport function parseBot(value: unknown): TelegramGetBotOutput {\n\tif (\n\t\t!isPlainObject(value) ||\n\t\ttypeof value['id'] !== 'number' ||\n\t\t!isString(value['username']) ||\n\t\t!isString(value['first_name'])\n\t) {\n\t\tthrow new ToolError('Telegram getMe returned invalid bot identity', { code: 'upstream' })\n\t}\n\treturn {\n\t\tbot_id: String(value['id']),\n\t\tusername: value['username'],\n\t\tdisplay_name: value['first_name']\n\t}\n}\n\nexport function parseFile(value: unknown): { file_path: string; file_size?: number } {\n\tif (!isPlainObject(value) || !isString(value['file_path'])) {\n\t\tthrow new ToolError('Telegram getFile returned invalid payload', { code: 'upstream' })\n\t}\n\treturn {\n\t\tfile_path: value['file_path'],\n\t\t...(typeof value['file_size'] === 'number' && { file_size: value['file_size'] })\n\t}\n}\n\nexport function parseDownload(\n\tinput: TelegramDownloadFileInput,\n\tfile: { file_path: string; file_size?: number },\n\tbytes: Uint8Array\n): TelegramDownloadFileOutput {\n\treturn {\n\t\tfile_name: input.file_name ?? file.file_path.split('/').pop() ?? input.file_id,\n\t\t...(file.file_size !== undefined && { file_size: file.file_size }),\n\t\tbody_base64: bytesToBase64(bytes)\n\t}\n}\n\nfunction decodeMedia(bodyBase64: string): Uint8Array {\n\tlet bytes: Uint8Array\n\ttry {\n\t\tbytes = base64ToBytes(bodyBase64)\n\t} catch (error) {\n\t\tthrow new ToolError('Invalid base64 body', { code: 'bad_input', cause: error })\n\t}\n\tif (bytes.byteLength === 0) {\n\t\tthrow new ToolError('Media body must not be empty', { code: 'bad_input' })\n\t}\n\tif (bytes.byteLength > MAX_MEDIA_BYTES) {\n\t\tthrow new ToolError('Media exceeds 20 MiB limit', {\n\t\t\tcode: 'too_large',\n\t\t\tdetails: { max_bytes: MAX_MEDIA_BYTES, content_length: bytes.byteLength }\n\t\t})\n\t}\n\treturn bytes\n}\n\nfunction blob(bytes: Uint8Array, contentType: string | undefined): Blob {\n\treturn contentType ? new Blob([toArrayBuffer(bytes)], { type: contentType }) : new Blob([toArrayBuffer(bytes)])\n}\n\n/** Multipart body for sendPhoto / sendDocument. */\nexport function buildMediaForm(input: TelegramSendMediaInput): FormData {\n\tconst bytes = decodeMedia(input.body_base64)\n\tconst form = new FormData()\n\tform.set('chat_id', input.chat_id)\n\tform.set(input.kind === 'photo' ? 'photo' : 'document', blob(bytes, input.content_type), input.file_name)\n\tif (input.caption) form.set('caption', input.caption)\n\tif (input.reply_to_message_id) {\n\t\tform.set('reply_parameters', JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }))\n\t}\n\treturn form\n}\n\n/** Multipart body for sendMediaGroup. */\nexport function buildMediaGroupForm(input: TelegramSendMediaGroupInput): FormData {\n\tif (input.items.length < 2 || input.items.length > 10) {\n\t\tthrow new ToolError('Media groups require between 2 and 10 items', { code: 'bad_input' })\n\t}\n\tconst hasDoc = input.items.some((item) => item.kind === 'document')\n\tconst hasPhoto = input.items.some((item) => item.kind === 'photo')\n\tif (hasDoc && hasPhoto) {\n\t\tthrow new ToolError('Media groups cannot mix photo and document items', { code: 'bad_input' })\n\t}\n\n\tconst form = new FormData()\n\tform.set('chat_id', input.chat_id)\n\tif (input.reply_to_message_id) {\n\t\tform.set('reply_parameters', JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }))\n\t}\n\tconst media = input.items.map((item, index) => {\n\t\tconst bytes = decodeMedia(item.body_base64)\n\t\tform.set(`file${index}`, blob(bytes, item.content_type), item.file_name)\n\t\treturn {\n\t\t\ttype: item.kind,\n\t\t\tmedia: `attach://file${index}`,\n\t\t\t...(item.caption && { caption: item.caption })\n\t\t}\n\t})\n\tform.set('media', JSON.stringify(media))\n\treturn form\n}\n","/**\n * Telegram Bot API vendor client.\n * Host: `new TelegramClient(auth)`. Agent tools: `fromContext(ctx)`.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport type {\n\tTelegramAnswerCallbackInput,\n\tTelegramAuth,\n\tTelegramClearReactionInput,\n\tTelegramDownloadFileInput,\n\tTelegramDownloadFileOutput,\n\tTelegramEditTextInput,\n\tTelegramGetBotOutput,\n\tTelegramMessageOutput,\n\tTelegramSendChatActionInput,\n\tTelegramSendMediaGroupInput,\n\tTelegramSendMediaGroupOutput,\n\tTelegramSendMediaInput,\n\tTelegramSendTextInput,\n\tTelegramSetReactionInput\n} from './contracts'\nimport { telegramAuthSchema } from './contracts'\nimport {\n\tbuildMediaForm,\n\tbuildMediaGroupForm,\n\tisTelegramDefiniteRejection,\n\tisTelegramOutcomeUnknown,\n\tparseBot,\n\tparseDownload,\n\tparseFile,\n\tparseMessage,\n\tparseMessages,\n\tparseOk,\n\tparseResult,\n\tTelegramClientError,\n\tthrowTelegramTransportError\n} from './domain'\n\nexport type TelegramClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class TelegramClient {\n\treadonly #token: string\n\treadonly #http: HttpService\n\n\tconstructor(auth: TelegramAuth, options: TelegramClientOptions = {}) {\n\t\tconst parsed = telegramAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Telegram auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#token = parsed.data.bot_token\n\t\tthis.#http = new HttpService({\n\t\t\t...options,\n\t\t\tbaseURL: 'https://api.telegram.org',\n\t\t\tlabel: 'Telegram'\n\t\t})\n\t}\n\n\tstatic fromContext(ctx: ToolContext): TelegramClient {\n\t\tconst auth = requireAuth(ctx, telegramAuthSchema)\n\t\treturn new TelegramClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\tasync #post(path: string, body: FormData | Record<string, unknown>, label: string): Promise<unknown> {\n\t\ttry {\n\t\t\tconst res = await this.#http.post(path, body, { label, noThrow: true })\n\t\t\treturn parseResult(label, res.status, res.data)\n\t\t} catch (error) {\n\t\t\tthrowTelegramTransportError(label, error)\n\t\t}\n\t}\n\n\t/** POST /bot{token}/sendMessage */\n\tasync sendText(input: TelegramSendTextInput): Promise<TelegramMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchat_id: input.chat_id,\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { reply_markup: input.reply_markup }),\n\t\t\t...(input.reply_to_message_id && {\n\t\t\t\treply_parameters: { message_id: Number.parseInt(input.reply_to_message_id, 10) }\n\t\t\t})\n\t\t}\n\t\treturn parseMessage(await this.#post(`/bot${this.#token}/sendMessage`, body, 'Telegram sendMessage'))\n\t}\n\n\t/** POST /bot{token}/editMessageText */\n\tasync editText(input: TelegramEditTextInput): Promise<TelegramMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchat_id: input.chat_id,\n\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { reply_markup: input.reply_markup })\n\t\t}\n\t\treturn parseMessage(await this.#post(`/bot${this.#token}/editMessageText`, body, 'Telegram editMessageText'))\n\t}\n\n\t/** POST /bot{token}/sendChatAction */\n\tasync sendChatAction(input: TelegramSendChatActionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/sendChatAction`,\n\t\t\t\t{ chat_id: input.chat_id, action: input.action },\n\t\t\t\t'Telegram sendChatAction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/setMessageReaction */\n\tasync setReaction(input: TelegramSetReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setMessageReaction`,\n\t\t\t\t{\n\t\t\t\t\tchat_id: input.chat_id,\n\t\t\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\t\t\treaction: [{ type: 'emoji', emoji: input.emoji }]\n\t\t\t\t},\n\t\t\t\t'Telegram setMessageReaction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/setMessageReaction (empty reaction) */\n\tasync clearReaction(input: TelegramClearReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setMessageReaction`,\n\t\t\t\t{\n\t\t\t\t\tchat_id: input.chat_id,\n\t\t\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\t\t\treaction: []\n\t\t\t\t},\n\t\t\t\t'Telegram setMessageReaction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/sendPhoto | sendDocument */\n\tasync sendMedia(input: TelegramSendMediaInput): Promise<TelegramMessageOutput> {\n\t\tconst path = input.kind === 'photo' ? `/bot${this.#token}/sendPhoto` : `/bot${this.#token}/sendDocument`\n\t\tconst label = input.kind === 'photo' ? 'Telegram sendPhoto' : 'Telegram sendDocument'\n\t\treturn parseMessage(await this.#post(path, buildMediaForm(input), label))\n\t}\n\n\t/** POST /bot{token}/sendMediaGroup */\n\tasync sendMediaGroup(input: TelegramSendMediaGroupInput): Promise<TelegramSendMediaGroupOutput> {\n\t\treturn parseMessages(\n\t\t\tawait this.#post(`/bot${this.#token}/sendMediaGroup`, buildMediaGroupForm(input), 'Telegram sendMediaGroup')\n\t\t)\n\t}\n\n\t/** POST getFile + GET /file/bot{token}/{file_path} */\n\tasync downloadFile(input: TelegramDownloadFileInput): Promise<TelegramDownloadFileOutput> {\n\t\tconst file = parseFile(\n\t\t\tawait this.#post(`/bot${this.#token}/getFile`, { file_id: input.file_id }, 'Telegram getFile')\n\t\t)\n\t\tconst filePath = file.file_path.replace(/^\\/+/, '')\n\t\tlet res: Awaited<ReturnType<HttpService['bytes']>>\n\t\ttry {\n\t\t\tres = await this.#http.bytes('GET', `/file/bot${this.#token}/${filePath}`, {\n\t\t\t\tlabel: 'Telegram downloadFile',\n\t\t\t\tnoThrow: true\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowTelegramTransportError('Telegram downloadFile', error)\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new TelegramClientError({\n\t\t\t\tmessage: `Telegram downloadFile failed with HTTP ${res.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tres.status === 400 || res.status === 401 || res.status === 403 || res.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Telegram downloadFile',\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t}\n\t\treturn parseDownload(input, file, res.bytes)\n\t}\n\n\t/** POST /bot{token}/answerCallbackQuery */\n\tasync answerCallback(input: TelegramAnswerCallbackInput): Promise<void> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tcallback_query_id: input.callback_query_id,\n\t\t\t...(input.text && { text: input.text }),\n\t\t\t...(input.show_alert !== undefined && { show_alert: input.show_alert })\n\t\t}\n\t\tparseOk(await this.#post(`/bot${this.#token}/answerCallbackQuery`, body, 'Telegram answerCallbackQuery'))\n\t}\n\n\t/** POST /bot{token}/getMe */\n\tasync getBot(): Promise<TelegramGetBotOutput> {\n\t\treturn parseBot(await this.#post(`/bot${this.#token}/getMe`, {}, 'Telegram getMe'))\n\t}\n\n\t/** POST /bot{token}/getWebhookInfo */\n\tasync getWebhookInfo(): Promise<{\n\t\turl: string\n\t\tpending_update_count: number\n\t\tlast_error_at_unix?: number\n\t\tlast_error_message?: string\n\t}> {\n\t\tconst value = await this.#post(`/bot${this.#token}/getWebhookInfo`, {}, 'Telegram getWebhookInfo')\n\t\tif (!isPlainObject(value) || !isString(value['url']) || typeof value['pending_update_count'] !== 'number') {\n\t\t\tthrow new ToolError('Telegram getWebhookInfo returned invalid payload', { code: 'upstream' })\n\t\t}\n\t\treturn {\n\t\t\turl: value['url'],\n\t\t\tpending_update_count: value['pending_update_count'],\n\t\t\t...(typeof value['last_error_date'] === 'number' && { last_error_at_unix: value['last_error_date'] }),\n\t\t\t...(isString(value['last_error_message']) && { last_error_message: value['last_error_message'] })\n\t\t}\n\t}\n\n\t/** POST /bot{token}/setWebhook */\n\tasync setWebhook(input: { url: string; secret_token: string; allowed_updates?: string[] }): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setWebhook`,\n\t\t\t\t{\n\t\t\t\t\turl: input.url,\n\t\t\t\t\tsecret_token: input.secret_token,\n\t\t\t\t\tallowed_updates: input.allowed_updates ?? ['message', 'callback_query']\n\t\t\t\t},\n\t\t\t\t'Telegram setWebhook'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/deleteWebhook */\n\tasync deleteWebhook(input?: { drop_pending_updates?: boolean }): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/deleteWebhook`,\n\t\t\t\t{ drop_pending_updates: input?.drop_pending_updates ?? false },\n\t\t\t\t'Telegram deleteWebhook'\n\t\t\t)\n\t\t)\n\t}\n}\n\nexport { isTelegramDefiniteRejection, isTelegramOutcomeUnknown, TelegramClientError }\n","import { z } from 'zod'\n\nimport { defineModule, defineTool } from '../../core/define'\nimport { TelegramClient } from './client'\nimport {\n\ttelegramAnswerCallbackInputSchema,\n\ttelegramAuthSchema,\n\ttelegramClearReactionInputSchema,\n\ttelegramDownloadFileInputSchema,\n\ttelegramDownloadFileOutputSchema,\n\ttelegramEditTextInputSchema,\n\ttelegramGetBotOutputSchema,\n\ttelegramMessageOutputSchema,\n\ttelegramOkOutputSchema,\n\ttelegramSendChatActionInputSchema,\n\ttelegramSendMediaGroupInputSchema,\n\ttelegramSendMediaGroupOutputSchema,\n\ttelegramSendMediaInputSchema,\n\ttelegramSendTextInputSchema,\n\ttelegramSetReactionInputSchema\n} from './contracts'\n\nconst emptyInputSchema = z.object({}).describe('No input fields')\n\nexport const telegramSendTextTool = defineTool({\n\tid: 'telegram-send-text',\n\tname: 'telegramSendText',\n\tdescription:\n\t\t'Send a text message to a Telegram chat. Optional reply_to_message_id anchors a native reply. Returns the new message_id.',\n\tinputSchema: telegramSendTextInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendText(input)\n})\n\nexport const telegramEditTextTool = defineTool({\n\tid: 'telegram-edit-text',\n\tname: 'telegramEditText',\n\tdescription: 'Edit the text of an existing Telegram message. Used for progressive live updates and corrections.',\n\tinputSchema: telegramEditTextInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).editText(input)\n})\n\nexport const telegramSendChatActionTool = defineTool({\n\tid: 'telegram-send-chat-action',\n\tname: 'telegramSendChatAction',\n\tdescription:\n\t\t'Show a chat action to the user (typing, upload_photo, upload_document, and other Telegram actions). Renew while work is in progress.',\n\tinputSchema: telegramSendChatActionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'none',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).sendChatAction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramSetReactionTool = defineTool({\n\tid: 'telegram-set-reaction',\n\tname: 'telegramSetReaction',\n\tdescription:\n\t\t'Set an emoji reaction on a Telegram message. Any emoji Telegram accepts for the bot and chat is allowed.',\n\tinputSchema: telegramSetReactionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).setReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramClearReactionTool = defineTool({\n\tid: 'telegram-clear-reaction',\n\tname: 'telegramClearReaction',\n\tdescription: 'Clear all bot reactions on a Telegram message.',\n\tinputSchema: telegramClearReactionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).clearReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramSendMediaTool = defineTool({\n\tid: 'telegram-send-media',\n\tname: 'telegramSendMedia',\n\tdescription:\n\t\t'Send one photo or document to a Telegram chat from a base64 body. For multiple related files use telegram-send-media-group.',\n\tinputSchema: telegramSendMediaInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMedia(input)\n})\n\nexport const telegramSendMediaGroupTool = defineTool({\n\tid: 'telegram-send-media-group',\n\tname: 'telegramSendMediaGroup',\n\tdescription: 'Send 2-10 photos or 2-10 documents as one Telegram media group. Cannot mix photo and document items.',\n\tinputSchema: telegramSendMediaGroupInputSchema,\n\toutputSchema: telegramSendMediaGroupOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMediaGroup(input)\n})\n\nexport const telegramDownloadFileTool = defineTool({\n\tid: 'telegram-download-file',\n\tname: 'telegramDownloadFile',\n\tdescription: 'Download a Telegram file by file_id and return the body as base64 with optional size and name.',\n\tinputSchema: telegramDownloadFileInputSchema,\n\toutputSchema: telegramDownloadFileOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).downloadFile(input)\n})\n\nexport const telegramAnswerCallbackTool = defineTool({\n\tid: 'telegram-answer-callback',\n\tname: 'telegramAnswerCallback',\n\tdescription: 'Acknowledge a Telegram callback query. Optional text shows a toast or alert to the user.',\n\tinputSchema: telegramAnswerCallbackInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).answerCallback(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramGetBotTool = defineTool({\n\tid: 'telegram-get-bot',\n\tname: 'telegramGetBot',\n\tdescription: 'Return the active Telegram bot identity, including bot_id, username, and display_name.',\n\tinputSchema: emptyInputSchema,\n\toutputSchema: telegramGetBotOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (_input, ctx) => TelegramClient.fromContext(ctx).getBot()\n})\n\nexport const telegramModule = defineModule({\n\tid: 'telegram',\n\ttitle: 'Telegram',\n\tdescription:\n\t\t'Telegram Bot API tools for text, media, media groups, chat actions, reactions, file download, callbacks, and bot identity.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: telegramAuthSchema },\n\tcategories: ['messaging', 'chat'],\n\tclassification: 'pii',\n\ttags: ['telegram'],\n\ttools: [\n\t\ttelegramSendTextTool,\n\t\ttelegramEditTextTool,\n\t\ttelegramSendChatActionTool,\n\t\ttelegramSetReactionTool,\n\t\ttelegramClearReactionTool,\n\t\ttelegramSendMediaTool,\n\t\ttelegramSendMediaGroupTool,\n\t\ttelegramDownloadFileTool,\n\t\ttelegramAnswerCallbackTool,\n\t\ttelegramGetBotTool\n\t]\n})\n","import { isPlainObject, isString } from 'es-toolkit'\n\n/**\n * Verify Telegram webhook secret header (x-telegram-bot-api-secret-token).\n * Exact string match; constant-time comparison when lengths match.\n */\nexport function verifyTelegramWebhookSecret(headerValue: string | null | undefined, expectedSecret: string): boolean {\n\tif (!headerValue) return false\n\tif (expectedSecret.length === 0) return false\n\tif (headerValue.length !== expectedSecret.length) return false\n\n\tlet mismatch = 0\n\tfor (let i = 0; i < headerValue.length; i += 1) {\n\t\tmismatch |= headerValue.charCodeAt(i) ^ expectedSecret.charCodeAt(i)\n\t}\n\treturn mismatch === 0\n}\n\nexport type TelegramInboundMedia = {\n\tkind: string\n\tref?: string\n\tmedia_type?: string\n\tfile_name?: string\n\tfile_size?: number\n\tunique_ref?: string\n}\n\n/** Package-owned normalized inbound event for host routing. */\nexport type TelegramInboundEvent = {\n\tchannel: 'telegram'\n\tevent_id: string\n\tchat_id: string\n\tuser_id?: string\n\tmessage_id?: string\n\ttext?: string\n\tmedia?: TelegramInboundMedia[]\n\treply_to?: string\n\traw_type: string\n\treceived_at: string\n\t/** Present when Telegram groups media into an album. */\n\tmedia_group_id?: string\n\t/** Callback query id when raw_type is callback_query. */\n\tcallback_query_id?: string\n\t/** Opaque callback data when present. */\n\tcallback_data?: string\n\tusername?: string\n\tchat_type?: string\n}\n\nexport type ParseTelegramUpdateResult = { ok: true; event: TelegramInboundEvent } | { ok: false; reason: string }\n\n/**\n * Parse one raw Bot API Update into a normalized inbound event.\n * Returns ok:false for updates the pack does not surface (unsupported chat types, empty noise).\n */\nexport function parseTelegramUpdate(\n\tupdate: unknown,\n\toptions?: { received_at?: string; allow_group_chats?: boolean }\n): ParseTelegramUpdateResult {\n\tif (!isPlainObject(update)) {\n\t\treturn { ok: false, reason: 'update_not_object' }\n\t}\n\tconst updateId = update['update_id']\n\tif (typeof updateId !== 'number') {\n\t\treturn { ok: false, reason: 'missing_update_id' }\n\t}\n\n\tconst receivedAt = options?.received_at ?? new Date().toISOString()\n\tconst allowGroups = options?.allow_group_chats ?? false\n\n\tconst message = asMessage(update['message']) ?? asMessage(update['edited_message'])\n\tif (message) {\n\t\treturn parseMessageUpdate(updateId, message, receivedAt, allowGroups, Boolean(update['edited_message']))\n\t}\n\n\tconst callback = update['callback_query']\n\tif (isPlainObject(callback)) {\n\t\treturn parseCallbackUpdate(updateId, callback, receivedAt, allowGroups)\n\t}\n\n\treturn { ok: false, reason: 'unsupported_update_type' }\n}\n\nfunction parseMessageUpdate(\n\tupdateId: number,\n\tmessage: Record<string, unknown>,\n\treceivedAt: string,\n\tallowGroups: boolean,\n\tedited: boolean\n): ParseTelegramUpdateResult {\n\tconst chat = message['chat']\n\tif (!isPlainObject(chat) || typeof chat['id'] !== 'number') {\n\t\treturn { ok: false, reason: 'missing_chat' }\n\t}\n\tconst chatType = isString(chat['type']) ? chat['type'] : undefined\n\tif (!allowGroups && chatType && chatType !== 'private') {\n\t\treturn { ok: false, reason: 'non_private_chat' }\n\t}\n\n\tconst from = message['from']\n\tconst userId = isPlainObject(from) && typeof from['id'] === 'number' ? String(from['id']) : undefined\n\tconst username = isPlainObject(from) && isString(from['username']) ? from['username'] : undefined\n\tconst messageId = typeof message['message_id'] === 'number' ? String(message['message_id']) : undefined\n\tconst text = firstString(message['text'], message['caption'])\n\tconst media = collectMedia(message)\n\tconst replyTo =\n\t\tisPlainObject(message['reply_to_message']) && typeof message['reply_to_message']['message_id'] === 'number'\n\t\t\t? String(message['reply_to_message']['message_id'])\n\t\t\t: undefined\n\tconst mediaGroupId = isString(message['media_group_id']) ? message['media_group_id'] : undefined\n\n\tif (!text && media.length === 0) {\n\t\treturn { ok: false, reason: 'empty_message' }\n\t}\n\n\tconst event: TelegramInboundEvent = {\n\t\tchannel: 'telegram',\n\t\tevent_id: String(updateId),\n\t\tchat_id: String(chat['id']),\n\t\traw_type: edited ? 'edited_message' : 'message',\n\t\treceived_at: receivedAt,\n\t\t...(userId && { user_id: userId }),\n\t\t...(username && { username }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(text && { text }),\n\t\t...(media.length > 0 && { media }),\n\t\t...(replyTo && { reply_to: replyTo }),\n\t\t...(mediaGroupId && { media_group_id: mediaGroupId }),\n\t\t...(chatType && { chat_type: chatType })\n\t}\n\treturn { ok: true, event }\n}\n\nfunction parseCallbackUpdate(\n\tupdateId: number,\n\tcallback: Record<string, unknown>,\n\treceivedAt: string,\n\tallowGroups: boolean\n): ParseTelegramUpdateResult {\n\tconst message = asMessage(callback['message'])\n\tconst chat = message ? message['chat'] : undefined\n\tif (!isPlainObject(chat) || typeof chat['id'] !== 'number') {\n\t\treturn { ok: false, reason: 'callback_missing_chat' }\n\t}\n\tconst chatType = isString(chat['type']) ? chat['type'] : undefined\n\tif (!allowGroups && chatType && chatType !== 'private') {\n\t\treturn { ok: false, reason: 'non_private_chat' }\n\t}\n\n\tconst from = callback['from']\n\tconst userId = isPlainObject(from) && typeof from['id'] === 'number' ? String(from['id']) : undefined\n\tconst username = isPlainObject(from) && isString(from['username']) ? from['username'] : undefined\n\tconst callbackQueryId = isString(callback['id']) ? callback['id'] : undefined\n\tif (!callbackQueryId) {\n\t\treturn { ok: false, reason: 'callback_missing_id' }\n\t}\n\tconst callbackData = isString(callback['data']) ? callback['data'] : undefined\n\tconst messageId = message && typeof message['message_id'] === 'number' ? String(message['message_id']) : undefined\n\n\tconst event: TelegramInboundEvent = {\n\t\tchannel: 'telegram',\n\t\tevent_id: String(updateId),\n\t\tchat_id: String(chat['id']),\n\t\traw_type: 'callback_query',\n\t\treceived_at: receivedAt,\n\t\tcallback_query_id: callbackQueryId,\n\t\t...(userId && { user_id: userId }),\n\t\t...(username && { username }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(callbackData && { callback_data: callbackData }),\n\t\t...(chatType && { chat_type: chatType })\n\t}\n\treturn { ok: true, event }\n}\n\nfunction asMessage(value: unknown): Record<string, unknown> | undefined {\n\treturn isPlainObject(value) ? value : undefined\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n\tfor (const value of values) {\n\t\tif (isString(value) && value.length > 0) return value\n\t}\n\treturn undefined\n}\n\nfunction collectMedia(message: Record<string, unknown>): TelegramInboundMedia[] {\n\tconst out: TelegramInboundMedia[] = []\n\n\tconst photo = message['photo']\n\tif (Array.isArray(photo) && photo.length > 0) {\n\t\tconst largest = photo[photo.length - 1]\n\t\tif (isPlainObject(largest) && isString(largest['file_id'])) {\n\t\t\tout.push({\n\t\t\t\tkind: 'photo',\n\t\t\t\tref: largest['file_id'],\n\t\t\t\t...(isString(largest['file_unique_id']) ? { unique_ref: largest['file_unique_id'] } : {}),\n\t\t\t\t...(typeof largest['file_size'] === 'number' ? { file_size: largest['file_size'] } : {}),\n\t\t\t\tmedia_type: 'image/jpeg'\n\t\t\t})\n\t\t}\n\t}\n\n\tfor (const key of ['document', 'audio', 'video', 'voice', 'video_note', 'animation', 'sticker'] as const) {\n\t\tconst item = message[key]\n\t\tif (!isPlainObject(item) || !isString(item['file_id'])) continue\n\t\tout.push({\n\t\t\tkind: key,\n\t\t\tref: item['file_id'],\n\t\t\t...(isString(item['file_unique_id']) ? { unique_ref: item['file_unique_id'] } : {}),\n\t\t\t...(typeof item['file_size'] === 'number' ? { file_size: item['file_size'] } : {}),\n\t\t\t...(isString(item['file_name']) ? { file_name: item['file_name'] } : {}),\n\t\t\t...(isString(item['mime_type']) ? { media_type: item['mime_type'] } : {})\n\t\t})\n\t}\n\n\treturn out\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"telegram-B-TZi9fM.js","names":["#token","#http","#post"],"sources":["../src/vendors/telegram/contracts.ts","../src/vendors/telegram/domain.ts","../src/vendors/telegram/client.ts","../src/vendors/telegram/module.ts","../src/vendors/telegram/webhook.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const MAX_MEDIA_BYTES = 20 * 1024 * 1024\n\nexport const telegramChatActionSchema = z.enum([\n\t'typing',\n\t'upload_photo',\n\t'record_video',\n\t'upload_video',\n\t'record_voice',\n\t'upload_voice',\n\t'upload_document',\n\t'choose_sticker',\n\t'find_location',\n\t'record_video_note',\n\t'upload_video_note'\n])\n\nexport const telegramAuthSchema = z.object({\n\tbot_token: z.string().min(1).describe('Telegram bot token from BotFather')\n})\n\nexport type TelegramAuth = z.infer<typeof telegramAuthSchema>\n\nexport const telegramSendTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id (string form of the numeric id)'),\n\ttext: z.string().min(1).max(4096).describe('Message text (max 4096 characters)'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to'),\n\treply_markup: z.unknown().optional().describe('Optional Telegram reply markup object')\n})\n\nexport const telegramMessageOutputSchema = z.object({\n\tmessage_id: z.string().describe('Telegram message id as string'),\n\tfile_id: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe('Telegram file_id when the message carries a document/photo/audio/video attachment')\n})\n\nexport const telegramEditTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to edit'),\n\ttext: z.string().min(1).max(4096).describe('Replacement text (max 4096 characters)'),\n\treply_markup: z.unknown().optional().describe('Optional Telegram reply markup object')\n})\n\nexport const telegramSendChatActionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\taction: telegramChatActionSchema.describe('Chat action shown to the user (typing, upload_photo, …)')\n})\n\nexport const telegramSetReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to react to'),\n\temoji: z.string().min(1).max(32).describe('Any emoji reaction Telegram accepts for this bot/chat')\n})\n\nexport const telegramClearReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tmessage_id: z.string().min(1).describe('Message id to clear reactions on')\n})\n\nexport const telegramSendMediaInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\tkind: z.enum(['photo', 'document']).describe('Media kind'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().max(1024).optional().describe('Optional caption (max 1024 characters)'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to'),\n\tcontent_type: z.string().optional().describe('Optional content type for the upload')\n})\n\nexport const telegramDownloadFileInputSchema = z.object({\n\tfile_id: z.string().min(1).describe('Telegram file_id from an inbound attachment'),\n\tfile_name: z.string().min(1).optional().describe('Preferred file name for the download result')\n})\n\nexport const telegramDownloadFileOutputSchema = z.object({\n\tfile_name: z.string(),\n\tfile_size: z.number().optional(),\n\tbody_base64: z.string().describe('Downloaded file body as base64')\n})\n\nexport const telegramAnswerCallbackInputSchema = z.object({\n\tcallback_query_id: z.string().min(1).describe('callback_query.id from an inbound update'),\n\ttext: z.string().max(200).optional().describe('Optional notification text shown to the user'),\n\tshow_alert: z.boolean().optional().describe('When true, show an alert instead of a toast')\n})\n\nexport const telegramSendMediaGroupItemSchema = z.object({\n\tkind: z.enum(['photo', 'document']).describe('Media kind; all items must be photo or all document'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().max(1024).optional().describe('Optional caption on this item'),\n\tcontent_type: z.string().optional().describe('Optional content type')\n})\n\nexport const telegramSendMediaGroupInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Telegram chat id'),\n\titems: z\n\t\t.array(telegramSendMediaGroupItemSchema)\n\t\t.min(2)\n\t\t.max(10)\n\t\t.describe('2-10 media items; cannot mix photo and document'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional message id to reply to')\n})\n\nexport const telegramSendMediaGroupOutputSchema = z.object({\n\tmessage_ids: z.array(z.string()).describe('Message ids for each media item')\n})\n\nexport const telegramGetBotOutputSchema = z.object({\n\tbot_id: z.string(),\n\tusername: z.string(),\n\tdisplay_name: z.string()\n})\n\nexport const telegramOkOutputSchema = z.object({\n\tok: z.boolean()\n})\n\nexport type TelegramSendTextInput = z.infer<typeof telegramSendTextInputSchema>\nexport type TelegramMessageOutput = z.infer<typeof telegramMessageOutputSchema>\nexport type TelegramEditTextInput = z.infer<typeof telegramEditTextInputSchema>\nexport type TelegramSendChatActionInput = z.infer<typeof telegramSendChatActionInputSchema>\nexport type TelegramSetReactionInput = z.infer<typeof telegramSetReactionInputSchema>\nexport type TelegramClearReactionInput = z.infer<typeof telegramClearReactionInputSchema>\nexport type TelegramSendMediaInput = z.infer<typeof telegramSendMediaInputSchema>\nexport type TelegramDownloadFileInput = z.infer<typeof telegramDownloadFileInputSchema>\nexport type TelegramDownloadFileOutput = z.infer<typeof telegramDownloadFileOutputSchema>\nexport type TelegramAnswerCallbackInput = z.infer<typeof telegramAnswerCallbackInputSchema>\nexport type TelegramSendMediaGroupInput = z.infer<typeof telegramSendMediaGroupInputSchema>\nexport type TelegramSendMediaGroupOutput = z.infer<typeof telegramSendMediaGroupOutputSchema>\nexport type TelegramGetBotOutput = z.infer<typeof telegramGetBotOutputSchema>\n","/**\n * Telegram payload shaping + envelope/result parse.\n * No HTTP — client owns transport.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { base64ToBytes, bytesToBase64, toArrayBuffer } from '../../shared/bytes'\nimport type {\n\tTelegramDownloadFileInput,\n\tTelegramDownloadFileOutput,\n\tTelegramGetBotOutput,\n\tTelegramMessageOutput,\n\tTelegramSendMediaGroupInput,\n\tTelegramSendMediaGroupOutput,\n\tTelegramSendMediaInput\n} from './contracts'\nimport { MAX_MEDIA_BYTES } from './contracts'\n\nexport type TelegramFailureKind = 'definite_rejection' | 'outcome_unknown'\n\nexport class TelegramClientError extends ToolError {\n\treadonly failureKind: TelegramFailureKind\n\n\tconstructor(input: {\n\t\tmessage: string\n\t\tfailureKind: TelegramFailureKind\n\t\tmethod: string\n\t\tstatus?: number\n\t\tretryAfterSeconds?: number\n\t\tcause?: unknown\n\t}) {\n\t\tsuper(input.message, {\n\t\t\tcode: 'upstream',\n\t\t\tretryable: input.failureKind === 'outcome_unknown',\n\t\t\tcause: input.cause,\n\t\t\tdetails: {\n\t\t\t\tmethod: input.method,\n\t\t\t\tfailure_kind: input.failureKind,\n\t\t\t\tstatus: input.status,\n\t\t\t\tretry_after_seconds: input.retryAfterSeconds\n\t\t\t}\n\t\t})\n\t\tthis.name = 'TelegramClientError'\n\t\tthis.failureKind = input.failureKind\n\t}\n}\n\nexport function isTelegramDefiniteRejection(error: unknown): boolean {\n\treturn error instanceof TelegramClientError && error.failureKind === 'definite_rejection'\n}\n\nexport function isTelegramOutcomeUnknown(error: unknown): boolean {\n\treturn error instanceof TelegramClientError && error.failureKind === 'outcome_unknown'\n}\n\n/** Network / abort / transport failures before a parseable Telegram envelope. */\nexport function throwTelegramTransportError(method: string, error: unknown): never {\n\tif (error instanceof TelegramClientError) throw error\n\tconst message = error instanceof Error ? error.message : `${method} request failed`\n\tthrow new TelegramClientError({\n\t\tmessage,\n\t\tfailureKind: 'outcome_unknown',\n\t\tmethod,\n\t\tcause: error\n\t})\n}\n\nfunction isDefiniteStatus(status: number): boolean {\n\treturn status === 400 || status === 401 || status === 403 || status === 404\n}\n\n/** Map Telegram `{ ok, result | description }` (HTTP may be non-2xx). */\nexport function parseResult(label: string, status: number, data: unknown): unknown {\n\tif (!isPlainObject(data) || typeof data['ok'] !== 'boolean') {\n\t\tthrow new TelegramClientError({\n\t\t\tmessage: `${label} returned an invalid envelope`,\n\t\t\tfailureKind: 'outcome_unknown',\n\t\t\tmethod: label\n\t\t})\n\t}\n\tif (status >= 200 && status < 300 && data['ok'] === true && data['result'] !== undefined) {\n\t\treturn data['result']\n\t}\n\tconst parameters = data['parameters']\n\tconst retryAfter =\n\t\tisPlainObject(parameters) && typeof parameters['retry_after'] === 'number' ? parameters['retry_after'] : undefined\n\tthrow new TelegramClientError({\n\t\tmessage: isString(data['description']) ? data['description'] : `${label} failed`,\n\t\tfailureKind: isDefiniteStatus(status) ? 'definite_rejection' : 'outcome_unknown',\n\t\tmethod: label,\n\t\tstatus,\n\t\t...(retryAfter !== undefined && { retryAfterSeconds: retryAfter })\n\t})\n}\n\n/** Prefer largest photo size; else first of document/audio/video/voice/… with a file_id. */\nexport function extractTelegramFileId(message: Record<string, unknown>): string | undefined {\n\tconst photo = message['photo']\n\tif (Array.isArray(photo) && photo.length > 0) {\n\t\tlet best: string | undefined\n\t\tlet bestSize = -1\n\t\tfor (const row of photo) {\n\t\t\tif (!isPlainObject(row) || !isString(row['file_id'])) continue\n\t\t\tconst size = typeof row['file_size'] === 'number' ? row['file_size'] : 0\n\t\t\tif (size >= bestSize) {\n\t\t\t\tbestSize = size\n\t\t\t\tbest = row['file_id']\n\t\t\t}\n\t\t}\n\t\tif (best) return best\n\t}\n\tfor (const key of ['document', 'audio', 'video', 'voice', 'video_note', 'animation', 'sticker'] as const) {\n\t\tconst item = message[key]\n\t\tif (isPlainObject(item) && isString(item['file_id']) && item['file_id'].length > 0) {\n\t\t\treturn item['file_id']\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function parseMessage(value: unknown): TelegramMessageOutput {\n\tif (!isPlainObject(value) || typeof value['message_id'] !== 'number') {\n\t\tthrow new ToolError('Telegram returned an invalid message', { code: 'upstream' })\n\t}\n\tconst fileId = extractTelegramFileId(value)\n\treturn {\n\t\tmessage_id: String(value['message_id']),\n\t\t...(fileId && { file_id: fileId })\n\t}\n}\n\nexport function parseMessages(value: unknown): TelegramSendMediaGroupOutput {\n\tif (!Array.isArray(value)) {\n\t\tthrow new ToolError('Telegram returned an invalid message list', { code: 'upstream' })\n\t}\n\treturn { message_ids: value.map((row) => parseMessage(row).message_id) }\n}\n\nexport function parseOk(value: unknown): void {\n\tif (value !== true) {\n\t\tthrow new ToolError('Telegram returned unexpected result', { code: 'upstream' })\n\t}\n}\n\nexport function parseBot(value: unknown): TelegramGetBotOutput {\n\tif (\n\t\t!isPlainObject(value) ||\n\t\ttypeof value['id'] !== 'number' ||\n\t\t!isString(value['username']) ||\n\t\t!isString(value['first_name'])\n\t) {\n\t\tthrow new ToolError('Telegram getMe returned invalid bot identity', { code: 'upstream' })\n\t}\n\treturn {\n\t\tbot_id: String(value['id']),\n\t\tusername: value['username'],\n\t\tdisplay_name: value['first_name']\n\t}\n}\n\nexport function parseFile(value: unknown): { file_path: string; file_size?: number } {\n\tif (!isPlainObject(value) || !isString(value['file_path'])) {\n\t\tthrow new ToolError('Telegram getFile returned invalid payload', { code: 'upstream' })\n\t}\n\treturn {\n\t\tfile_path: value['file_path'],\n\t\t...(typeof value['file_size'] === 'number' && { file_size: value['file_size'] })\n\t}\n}\n\nexport function parseDownload(\n\tinput: TelegramDownloadFileInput,\n\tfile: { file_path: string; file_size?: number },\n\tbytes: Uint8Array\n): TelegramDownloadFileOutput {\n\treturn {\n\t\tfile_name: input.file_name ?? file.file_path.split('/').pop() ?? input.file_id,\n\t\t...(file.file_size !== undefined && { file_size: file.file_size }),\n\t\tbody_base64: bytesToBase64(bytes)\n\t}\n}\n\nfunction decodeMedia(bodyBase64: string): Uint8Array {\n\tlet bytes: Uint8Array\n\ttry {\n\t\tbytes = base64ToBytes(bodyBase64)\n\t} catch (error) {\n\t\tthrow new ToolError('Invalid base64 body', { code: 'bad_input', cause: error })\n\t}\n\tif (bytes.byteLength === 0) {\n\t\tthrow new ToolError('Media body must not be empty', { code: 'bad_input' })\n\t}\n\tif (bytes.byteLength > MAX_MEDIA_BYTES) {\n\t\tthrow new ToolError('Media exceeds 20 MiB limit', {\n\t\t\tcode: 'too_large',\n\t\t\tdetails: { max_bytes: MAX_MEDIA_BYTES, content_length: bytes.byteLength }\n\t\t})\n\t}\n\treturn bytes\n}\n\nfunction blob(bytes: Uint8Array, contentType: string | undefined): Blob {\n\treturn contentType ? new Blob([toArrayBuffer(bytes)], { type: contentType }) : new Blob([toArrayBuffer(bytes)])\n}\n\n/** Multipart body for sendPhoto / sendDocument. */\nexport function buildMediaForm(input: TelegramSendMediaInput): FormData {\n\tconst bytes = decodeMedia(input.body_base64)\n\tconst form = new FormData()\n\tform.set('chat_id', input.chat_id)\n\tform.set(input.kind === 'photo' ? 'photo' : 'document', blob(bytes, input.content_type), input.file_name)\n\tif (input.caption) form.set('caption', input.caption)\n\tif (input.reply_to_message_id) {\n\t\tform.set('reply_parameters', JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }))\n\t}\n\treturn form\n}\n\n/** Multipart body for sendMediaGroup. */\nexport function buildMediaGroupForm(input: TelegramSendMediaGroupInput): FormData {\n\tif (input.items.length < 2 || input.items.length > 10) {\n\t\tthrow new ToolError('Media groups require between 2 and 10 items', { code: 'bad_input' })\n\t}\n\tconst hasDoc = input.items.some((item) => item.kind === 'document')\n\tconst hasPhoto = input.items.some((item) => item.kind === 'photo')\n\tif (hasDoc && hasPhoto) {\n\t\tthrow new ToolError('Media groups cannot mix photo and document items', { code: 'bad_input' })\n\t}\n\n\tconst form = new FormData()\n\tform.set('chat_id', input.chat_id)\n\tif (input.reply_to_message_id) {\n\t\tform.set('reply_parameters', JSON.stringify({ message_id: Number.parseInt(input.reply_to_message_id, 10) }))\n\t}\n\tconst media = input.items.map((item, index) => {\n\t\tconst bytes = decodeMedia(item.body_base64)\n\t\tform.set(`file${index}`, blob(bytes, item.content_type), item.file_name)\n\t\treturn {\n\t\t\ttype: item.kind,\n\t\t\tmedia: `attach://file${index}`,\n\t\t\t...(item.caption && { caption: item.caption })\n\t\t}\n\t})\n\tform.set('media', JSON.stringify(media))\n\treturn form\n}\n","/**\n * Telegram Bot API vendor client.\n * Host: `new TelegramClient(auth)`. Agent tools: `fromContext(ctx)`.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport type {\n\tTelegramAnswerCallbackInput,\n\tTelegramAuth,\n\tTelegramClearReactionInput,\n\tTelegramDownloadFileInput,\n\tTelegramDownloadFileOutput,\n\tTelegramEditTextInput,\n\tTelegramGetBotOutput,\n\tTelegramMessageOutput,\n\tTelegramSendChatActionInput,\n\tTelegramSendMediaGroupInput,\n\tTelegramSendMediaGroupOutput,\n\tTelegramSendMediaInput,\n\tTelegramSendTextInput,\n\tTelegramSetReactionInput\n} from './contracts'\nimport { telegramAuthSchema } from './contracts'\nimport {\n\tbuildMediaForm,\n\tbuildMediaGroupForm,\n\tisTelegramDefiniteRejection,\n\tisTelegramOutcomeUnknown,\n\tparseBot,\n\tparseDownload,\n\tparseFile,\n\tparseMessage,\n\tparseMessages,\n\tparseOk,\n\tparseResult,\n\tTelegramClientError,\n\tthrowTelegramTransportError\n} from './domain'\n\nexport type TelegramClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class TelegramClient {\n\treadonly #token: string\n\treadonly #http: HttpService\n\n\tconstructor(auth: TelegramAuth, options: TelegramClientOptions = {}) {\n\t\tconst parsed = telegramAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Telegram auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#token = parsed.data.bot_token\n\t\tthis.#http = new HttpService({\n\t\t\t...options,\n\t\t\tbaseURL: 'https://api.telegram.org',\n\t\t\tlabel: 'Telegram'\n\t\t})\n\t}\n\n\tstatic fromContext(ctx: ToolContext): TelegramClient {\n\t\tconst auth = requireAuth(ctx, telegramAuthSchema)\n\t\treturn new TelegramClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\tasync #post(path: string, body: FormData | Record<string, unknown>, label: string): Promise<unknown> {\n\t\ttry {\n\t\t\tconst res = await this.#http.post(path, body, { label, noThrow: true })\n\t\t\treturn parseResult(label, res.status, res.data)\n\t\t} catch (error) {\n\t\t\tthrowTelegramTransportError(label, error)\n\t\t}\n\t}\n\n\t/** POST /bot{token}/sendMessage */\n\tasync sendText(input: TelegramSendTextInput): Promise<TelegramMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchat_id: input.chat_id,\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { reply_markup: input.reply_markup }),\n\t\t\t...(input.reply_to_message_id && {\n\t\t\t\treply_parameters: { message_id: Number.parseInt(input.reply_to_message_id, 10) }\n\t\t\t})\n\t\t}\n\t\treturn parseMessage(await this.#post(`/bot${this.#token}/sendMessage`, body, 'Telegram sendMessage'))\n\t}\n\n\t/** POST /bot{token}/editMessageText */\n\tasync editText(input: TelegramEditTextInput): Promise<TelegramMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchat_id: input.chat_id,\n\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { reply_markup: input.reply_markup })\n\t\t}\n\t\treturn parseMessage(await this.#post(`/bot${this.#token}/editMessageText`, body, 'Telegram editMessageText'))\n\t}\n\n\t/** POST /bot{token}/sendChatAction */\n\tasync sendChatAction(input: TelegramSendChatActionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/sendChatAction`,\n\t\t\t\t{ chat_id: input.chat_id, action: input.action },\n\t\t\t\t'Telegram sendChatAction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/setMessageReaction */\n\tasync setReaction(input: TelegramSetReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setMessageReaction`,\n\t\t\t\t{\n\t\t\t\t\tchat_id: input.chat_id,\n\t\t\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\t\t\treaction: [{ type: 'emoji', emoji: input.emoji }]\n\t\t\t\t},\n\t\t\t\t'Telegram setMessageReaction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/setMessageReaction (empty reaction) */\n\tasync clearReaction(input: TelegramClearReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setMessageReaction`,\n\t\t\t\t{\n\t\t\t\t\tchat_id: input.chat_id,\n\t\t\t\t\tmessage_id: Number.parseInt(input.message_id, 10),\n\t\t\t\t\treaction: []\n\t\t\t\t},\n\t\t\t\t'Telegram setMessageReaction'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/sendPhoto | sendDocument */\n\tasync sendMedia(input: TelegramSendMediaInput): Promise<TelegramMessageOutput> {\n\t\tconst path = input.kind === 'photo' ? `/bot${this.#token}/sendPhoto` : `/bot${this.#token}/sendDocument`\n\t\tconst label = input.kind === 'photo' ? 'Telegram sendPhoto' : 'Telegram sendDocument'\n\t\treturn parseMessage(await this.#post(path, buildMediaForm(input), label))\n\t}\n\n\t/** POST /bot{token}/sendMediaGroup */\n\tasync sendMediaGroup(input: TelegramSendMediaGroupInput): Promise<TelegramSendMediaGroupOutput> {\n\t\treturn parseMessages(\n\t\t\tawait this.#post(`/bot${this.#token}/sendMediaGroup`, buildMediaGroupForm(input), 'Telegram sendMediaGroup')\n\t\t)\n\t}\n\n\t/** POST getFile + GET /file/bot{token}/{file_path} */\n\tasync downloadFile(input: TelegramDownloadFileInput): Promise<TelegramDownloadFileOutput> {\n\t\tconst file = parseFile(\n\t\t\tawait this.#post(`/bot${this.#token}/getFile`, { file_id: input.file_id }, 'Telegram getFile')\n\t\t)\n\t\tconst filePath = file.file_path.replace(/^\\/+/, '')\n\t\tlet res: Awaited<ReturnType<HttpService['bytes']>>\n\t\ttry {\n\t\t\tres = await this.#http.bytes('GET', `/file/bot${this.#token}/${filePath}`, {\n\t\t\t\tlabel: 'Telegram downloadFile',\n\t\t\t\tnoThrow: true\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowTelegramTransportError('Telegram downloadFile', error)\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new TelegramClientError({\n\t\t\t\tmessage: `Telegram downloadFile failed with HTTP ${res.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tres.status === 400 || res.status === 401 || res.status === 403 || res.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Telegram downloadFile',\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t}\n\t\treturn parseDownload(input, file, res.bytes)\n\t}\n\n\t/** POST /bot{token}/answerCallbackQuery */\n\tasync answerCallback(input: TelegramAnswerCallbackInput): Promise<void> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tcallback_query_id: input.callback_query_id,\n\t\t\t...(input.text && { text: input.text }),\n\t\t\t...(input.show_alert !== undefined && { show_alert: input.show_alert })\n\t\t}\n\t\tparseOk(await this.#post(`/bot${this.#token}/answerCallbackQuery`, body, 'Telegram answerCallbackQuery'))\n\t}\n\n\t/** POST /bot{token}/getMe */\n\tasync getBot(): Promise<TelegramGetBotOutput> {\n\t\treturn parseBot(await this.#post(`/bot${this.#token}/getMe`, {}, 'Telegram getMe'))\n\t}\n\n\t/** POST /bot{token}/getWebhookInfo */\n\tasync getWebhookInfo(): Promise<{\n\t\turl: string\n\t\tpending_update_count: number\n\t\tlast_error_at_unix?: number\n\t\tlast_error_message?: string\n\t}> {\n\t\tconst value = await this.#post(`/bot${this.#token}/getWebhookInfo`, {}, 'Telegram getWebhookInfo')\n\t\tif (!isPlainObject(value) || !isString(value['url']) || typeof value['pending_update_count'] !== 'number') {\n\t\t\tthrow new ToolError('Telegram getWebhookInfo returned invalid payload', { code: 'upstream' })\n\t\t}\n\t\treturn {\n\t\t\turl: value['url'],\n\t\t\tpending_update_count: value['pending_update_count'],\n\t\t\t...(typeof value['last_error_date'] === 'number' && { last_error_at_unix: value['last_error_date'] }),\n\t\t\t...(isString(value['last_error_message']) && { last_error_message: value['last_error_message'] })\n\t\t}\n\t}\n\n\t/** POST /bot{token}/setWebhook */\n\tasync setWebhook(input: { url: string; secret_token: string; allowed_updates?: string[] }): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/setWebhook`,\n\t\t\t\t{\n\t\t\t\t\turl: input.url,\n\t\t\t\t\tsecret_token: input.secret_token,\n\t\t\t\t\tallowed_updates: input.allowed_updates ?? ['message', 'callback_query']\n\t\t\t\t},\n\t\t\t\t'Telegram setWebhook'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST /bot{token}/deleteWebhook */\n\tasync deleteWebhook(input?: { drop_pending_updates?: boolean }): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#post(\n\t\t\t\t`/bot${this.#token}/deleteWebhook`,\n\t\t\t\t{ drop_pending_updates: input?.drop_pending_updates ?? false },\n\t\t\t\t'Telegram deleteWebhook'\n\t\t\t)\n\t\t)\n\t}\n}\n\nexport { isTelegramDefiniteRejection, isTelegramOutcomeUnknown, TelegramClientError }\n","import { z } from 'zod'\n\nimport { defineModule, defineTool } from '../../core/define'\nimport { TelegramClient } from './client'\nimport {\n\ttelegramAnswerCallbackInputSchema,\n\ttelegramAuthSchema,\n\ttelegramClearReactionInputSchema,\n\ttelegramDownloadFileInputSchema,\n\ttelegramDownloadFileOutputSchema,\n\ttelegramEditTextInputSchema,\n\ttelegramGetBotOutputSchema,\n\ttelegramMessageOutputSchema,\n\ttelegramOkOutputSchema,\n\ttelegramSendChatActionInputSchema,\n\ttelegramSendMediaGroupInputSchema,\n\ttelegramSendMediaGroupOutputSchema,\n\ttelegramSendMediaInputSchema,\n\ttelegramSendTextInputSchema,\n\ttelegramSetReactionInputSchema\n} from './contracts'\n\nconst emptyInputSchema = z.object({}).describe('No input fields')\n\nexport const telegramSendTextTool = defineTool({\n\tid: 'telegram-send-text',\n\tname: 'telegramSendText',\n\tdescription:\n\t\t'Send a text message to a Telegram chat. Optional reply_to_message_id anchors a native reply. Returns the new message_id.',\n\tinputSchema: telegramSendTextInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendText(input)\n})\n\nexport const telegramEditTextTool = defineTool({\n\tid: 'telegram-edit-text',\n\tname: 'telegramEditText',\n\tdescription: 'Edit the text of an existing Telegram message. Used for progressive live updates and corrections.',\n\tinputSchema: telegramEditTextInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).editText(input)\n})\n\nexport const telegramSendChatActionTool = defineTool({\n\tid: 'telegram-send-chat-action',\n\tname: 'telegramSendChatAction',\n\tdescription:\n\t\t'Show a chat action to the user (typing, upload_photo, upload_document, and other Telegram actions). Renew while work is in progress.',\n\tinputSchema: telegramSendChatActionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'none',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).sendChatAction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramSetReactionTool = defineTool({\n\tid: 'telegram-set-reaction',\n\tname: 'telegramSetReaction',\n\tdescription:\n\t\t'Set an emoji reaction on a Telegram message. Any emoji Telegram accepts for the bot and chat is allowed.',\n\tinputSchema: telegramSetReactionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).setReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramClearReactionTool = defineTool({\n\tid: 'telegram-clear-reaction',\n\tname: 'telegramClearReaction',\n\tdescription: 'Clear all bot reactions on a Telegram message.',\n\tinputSchema: telegramClearReactionInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).clearReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramSendMediaTool = defineTool({\n\tid: 'telegram-send-media',\n\tname: 'telegramSendMedia',\n\tdescription:\n\t\t'Send one photo or document to a Telegram chat from a base64 body. For multiple related files use telegram-send-media-group.',\n\tinputSchema: telegramSendMediaInputSchema,\n\toutputSchema: telegramMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMedia(input)\n})\n\nexport const telegramSendMediaGroupTool = defineTool({\n\tid: 'telegram-send-media-group',\n\tname: 'telegramSendMediaGroup',\n\tdescription: 'Send 2-10 photos or 2-10 documents as one Telegram media group. Cannot mix photo and document items.',\n\tinputSchema: telegramSendMediaGroupInputSchema,\n\toutputSchema: telegramSendMediaGroupOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).sendMediaGroup(input)\n})\n\nexport const telegramDownloadFileTool = defineTool({\n\tid: 'telegram-download-file',\n\tname: 'telegramDownloadFile',\n\tdescription: 'Download a Telegram file by file_id and return the body as base64 with optional size and name.',\n\tinputSchema: telegramDownloadFileInputSchema,\n\toutputSchema: telegramDownloadFileOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TelegramClient.fromContext(ctx).downloadFile(input)\n})\n\nexport const telegramAnswerCallbackTool = defineTool({\n\tid: 'telegram-answer-callback',\n\tname: 'telegramAnswerCallback',\n\tdescription: 'Acknowledge a Telegram callback query. Optional text shows a toast or alert to the user.',\n\tinputSchema: telegramAnswerCallbackInputSchema,\n\toutputSchema: telegramOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => {\n\t\tawait TelegramClient.fromContext(ctx).answerCallback(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const telegramGetBotTool = defineTool({\n\tid: 'telegram-get-bot',\n\tname: 'telegramGetBot',\n\tdescription: 'Return the active Telegram bot identity, including bot_id, username, and display_name.',\n\tinputSchema: emptyInputSchema,\n\toutputSchema: telegramGetBotOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (_input, ctx) => TelegramClient.fromContext(ctx).getBot()\n})\n\nexport const telegramModule = defineModule({\n\tid: 'telegram',\n\ttitle: 'Telegram',\n\tdescription:\n\t\t'Telegram Bot API tools for text, media, media groups, chat actions, reactions, file download, callbacks, and bot identity.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: telegramAuthSchema },\n\tcategories: ['messaging', 'chat'],\n\tclassification: 'pii',\n\ttags: ['telegram'],\n\ttools: [\n\t\ttelegramSendTextTool,\n\t\ttelegramEditTextTool,\n\t\ttelegramSendChatActionTool,\n\t\ttelegramSetReactionTool,\n\t\ttelegramClearReactionTool,\n\t\ttelegramSendMediaTool,\n\t\ttelegramSendMediaGroupTool,\n\t\ttelegramDownloadFileTool,\n\t\ttelegramAnswerCallbackTool,\n\t\ttelegramGetBotTool\n\t]\n})\n","import { isPlainObject, isString } from 'es-toolkit'\n\n/**\n * Verify Telegram webhook secret header (x-telegram-bot-api-secret-token).\n * Exact string match; constant-time comparison when lengths match.\n */\nexport function verifyTelegramWebhookSecret(headerValue: string | null | undefined, expectedSecret: string): boolean {\n\tif (!headerValue) return false\n\tif (expectedSecret.length === 0) return false\n\tif (headerValue.length !== expectedSecret.length) return false\n\n\tlet mismatch = 0\n\tfor (let i = 0; i < headerValue.length; i += 1) {\n\t\tmismatch |= headerValue.charCodeAt(i) ^ expectedSecret.charCodeAt(i)\n\t}\n\treturn mismatch === 0\n}\n\nexport type TelegramInboundMedia = {\n\tkind: string\n\tref?: string\n\tmedia_type?: string\n\tfile_name?: string\n\tfile_size?: number\n\tunique_ref?: string\n}\n\n/** Package-owned normalized inbound event for host routing. */\nexport type TelegramInboundEvent = {\n\tchannel: 'telegram'\n\tevent_id: string\n\tchat_id: string\n\tuser_id?: string\n\tmessage_id?: string\n\ttext?: string\n\tmedia?: TelegramInboundMedia[]\n\treply_to?: string\n\traw_type: string\n\treceived_at: string\n\t/** Present when Telegram groups media into an album. */\n\tmedia_group_id?: string\n\t/** Callback query id when raw_type is callback_query. */\n\tcallback_query_id?: string\n\t/** Opaque callback data when present. */\n\tcallback_data?: string\n\tusername?: string\n\tchat_type?: string\n}\n\nexport type ParseTelegramUpdateResult = { ok: true; event: TelegramInboundEvent } | { ok: false; reason: string }\n\n/**\n * Parse one raw Bot API Update into a normalized inbound event.\n * Returns ok:false for updates the pack does not surface (unsupported chat types, empty noise).\n */\nexport function parseTelegramUpdate(\n\tupdate: unknown,\n\toptions?: { received_at?: string; allow_group_chats?: boolean }\n): ParseTelegramUpdateResult {\n\tif (!isPlainObject(update)) {\n\t\treturn { ok: false, reason: 'update_not_object' }\n\t}\n\tconst updateId = update['update_id']\n\tif (typeof updateId !== 'number') {\n\t\treturn { ok: false, reason: 'missing_update_id' }\n\t}\n\n\tconst receivedAt = options?.received_at ?? new Date().toISOString()\n\tconst allowGroups = options?.allow_group_chats ?? false\n\n\tconst message = asMessage(update['message']) ?? asMessage(update['edited_message'])\n\tif (message) {\n\t\treturn parseMessageUpdate(updateId, message, receivedAt, allowGroups, Boolean(update['edited_message']))\n\t}\n\n\tconst callback = update['callback_query']\n\tif (isPlainObject(callback)) {\n\t\treturn parseCallbackUpdate(updateId, callback, receivedAt, allowGroups)\n\t}\n\n\treturn { ok: false, reason: 'unsupported_update_type' }\n}\n\nfunction parseMessageUpdate(\n\tupdateId: number,\n\tmessage: Record<string, unknown>,\n\treceivedAt: string,\n\tallowGroups: boolean,\n\tedited: boolean\n): ParseTelegramUpdateResult {\n\tconst chat = message['chat']\n\tif (!isPlainObject(chat) || typeof chat['id'] !== 'number') {\n\t\treturn { ok: false, reason: 'missing_chat' }\n\t}\n\tconst chatType = isString(chat['type']) ? chat['type'] : undefined\n\tif (!allowGroups && chatType && chatType !== 'private') {\n\t\treturn { ok: false, reason: 'non_private_chat' }\n\t}\n\n\tconst from = message['from']\n\tconst userId = isPlainObject(from) && typeof from['id'] === 'number' ? String(from['id']) : undefined\n\tconst username = isPlainObject(from) && isString(from['username']) ? from['username'] : undefined\n\tconst messageId = typeof message['message_id'] === 'number' ? String(message['message_id']) : undefined\n\tconst text = firstString(message['text'], message['caption'])\n\tconst media = collectMedia(message)\n\tconst replyTo =\n\t\tisPlainObject(message['reply_to_message']) && typeof message['reply_to_message']['message_id'] === 'number'\n\t\t\t? String(message['reply_to_message']['message_id'])\n\t\t\t: undefined\n\tconst mediaGroupId = isString(message['media_group_id']) ? message['media_group_id'] : undefined\n\n\tif (!text && media.length === 0) {\n\t\treturn { ok: false, reason: 'empty_message' }\n\t}\n\n\tconst event: TelegramInboundEvent = {\n\t\tchannel: 'telegram',\n\t\tevent_id: String(updateId),\n\t\tchat_id: String(chat['id']),\n\t\traw_type: edited ? 'edited_message' : 'message',\n\t\treceived_at: receivedAt,\n\t\t...(userId && { user_id: userId }),\n\t\t...(username && { username }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(text && { text }),\n\t\t...(media.length > 0 && { media }),\n\t\t...(replyTo && { reply_to: replyTo }),\n\t\t...(mediaGroupId && { media_group_id: mediaGroupId }),\n\t\t...(chatType && { chat_type: chatType })\n\t}\n\treturn { ok: true, event }\n}\n\nfunction parseCallbackUpdate(\n\tupdateId: number,\n\tcallback: Record<string, unknown>,\n\treceivedAt: string,\n\tallowGroups: boolean\n): ParseTelegramUpdateResult {\n\tconst message = asMessage(callback['message'])\n\tconst chat = message ? message['chat'] : undefined\n\tif (!isPlainObject(chat) || typeof chat['id'] !== 'number') {\n\t\treturn { ok: false, reason: 'callback_missing_chat' }\n\t}\n\tconst chatType = isString(chat['type']) ? chat['type'] : undefined\n\tif (!allowGroups && chatType && chatType !== 'private') {\n\t\treturn { ok: false, reason: 'non_private_chat' }\n\t}\n\n\tconst from = callback['from']\n\tconst userId = isPlainObject(from) && typeof from['id'] === 'number' ? String(from['id']) : undefined\n\tconst username = isPlainObject(from) && isString(from['username']) ? from['username'] : undefined\n\tconst callbackQueryId = isString(callback['id']) ? callback['id'] : undefined\n\tif (!callbackQueryId) {\n\t\treturn { ok: false, reason: 'callback_missing_id' }\n\t}\n\tconst callbackData = isString(callback['data']) ? callback['data'] : undefined\n\tconst messageId = message && typeof message['message_id'] === 'number' ? String(message['message_id']) : undefined\n\n\tconst event: TelegramInboundEvent = {\n\t\tchannel: 'telegram',\n\t\tevent_id: String(updateId),\n\t\tchat_id: String(chat['id']),\n\t\traw_type: 'callback_query',\n\t\treceived_at: receivedAt,\n\t\tcallback_query_id: callbackQueryId,\n\t\t...(userId && { user_id: userId }),\n\t\t...(username && { username }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(callbackData && { callback_data: callbackData }),\n\t\t...(chatType && { chat_type: chatType })\n\t}\n\treturn { ok: true, event }\n}\n\nfunction asMessage(value: unknown): Record<string, unknown> | undefined {\n\treturn isPlainObject(value) ? value : undefined\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n\tfor (const value of values) {\n\t\tif (isString(value) && value.length > 0) return value\n\t}\n\treturn undefined\n}\n\nfunction collectMedia(message: Record<string, unknown>): TelegramInboundMedia[] {\n\tconst out: TelegramInboundMedia[] = []\n\n\tconst photo = message['photo']\n\tif (Array.isArray(photo) && photo.length > 0) {\n\t\tconst largest = photo[photo.length - 1]\n\t\tif (isPlainObject(largest) && isString(largest['file_id'])) {\n\t\t\tout.push({\n\t\t\t\tkind: 'photo',\n\t\t\t\tref: largest['file_id'],\n\t\t\t\t...(isString(largest['file_unique_id']) ? { unique_ref: largest['file_unique_id'] } : {}),\n\t\t\t\t...(typeof largest['file_size'] === 'number' ? { file_size: largest['file_size'] } : {}),\n\t\t\t\tmedia_type: 'image/jpeg'\n\t\t\t})\n\t\t}\n\t}\n\n\tfor (const key of ['document', 'audio', 'video', 'voice', 'video_note', 'animation', 'sticker'] as const) {\n\t\tconst item = message[key]\n\t\tif (!isPlainObject(item) || !isString(item['file_id'])) continue\n\t\tout.push({\n\t\t\tkind: key,\n\t\t\tref: item['file_id'],\n\t\t\t...(isString(item['file_unique_id']) ? { unique_ref: item['file_unique_id'] } : {}),\n\t\t\t...(typeof item['file_size'] === 'number' ? { file_size: item['file_size'] } : {}),\n\t\t\t...(isString(item['file_name']) ? { file_name: item['file_name'] } : {}),\n\t\t\t...(isString(item['mime_type']) ? { media_type: item['mime_type'] } : {})\n\t\t})\n\t}\n\n\treturn out\n}\n"],"mappings":";;;;;;;;AAEA,MAAa,kBAAkB,KAAK,OAAO;AAE3C,MAAa,2BAA2B,EAAE,KAAK;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAa,qBAAqB,EAAE,OAAO,EAC1C,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,mCAAmC,EAC1E,CAAC;AAID,MAAa,8BAA8B,EAAE,OAAO;CACnD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kDAAkD;CACtF,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,oCAAoC;CAC/E,qBAAqB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,iCAAiC;CAC5F,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uCAAuC;AACtF,CAAC;AAED,MAAa,8BAA8B,EAAE,OAAO;CACnD,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS,+BAA+B;CAC/D,SAAS,EACP,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,mFAAmF;AAC/F,CAAC;AAED,MAAa,8BAA8B,EAAE,OAAO;CACnD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,oBAAoB;CAC3D,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,wCAAwC;CACnF,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uCAAuC;AACtF,CAAC;AAED,MAAa,oCAAoC,EAAE,OAAO;CACzD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,QAAQ,yBAAyB,SAAS,yDAAyD;AACpG,CAAC;AAED,MAAa,iCAAiC,EAAE,OAAO;CACtD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,wBAAwB;CAC/D,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,uDAAuD;AAClG,CAAC;AAED,MAAa,mCAAmC,EAAE,OAAO;CACxD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kCAAkC;AAC1E,CAAC;AAED,MAAa,+BAA+B,EAAE,OAAO;CACpD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,MAAM,EAAE,KAAK,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,SAAS,YAAY;CACzD,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,qBAAqB;CAC7D,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,+BAA+B;CACrE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wCAAwC;CAC1F,qBAAqB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,iCAAiC;CAC5F,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,sCAAsC;AACpF,CAAC;AAED,MAAa,kCAAkC,EAAE,OAAO;CACvD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,6CAA6C;CACjF,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6CAA6C;AAC/F,CAAC;AAED,MAAa,mCAAmC,EAAE,OAAO;CACxD,WAAW,EAAE,OAAO;CACpB,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,gCAAgC;AAClE,CAAC;AAED,MAAa,oCAAoC,EAAE,OAAO;CACzD,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,0CAA0C;CACxF,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,8CAA8C;CAC5F,YAAY,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,6CAA6C;AAC1F,CAAC;AAED,MAAa,mCAAmC,EAAE,OAAO;CACxD,MAAM,EAAE,KAAK,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,SAAS,qDAAqD;CAClG,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,qBAAqB;CAC7D,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,+BAA+B;CACrE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+BAA+B;CACjF,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,uBAAuB;AACrE,CAAC;AAED,MAAa,oCAAoC,EAAE,OAAO;CACzD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB;CACtD,OAAO,EACL,MAAM,gCAAgC,CAAC,CACvC,IAAI,CAAC,CAAC,CACN,IAAI,EAAE,CAAC,CACP,SAAS,iDAAiD;CAC5D,qBAAqB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,iCAAiC;AAC7F,CAAC;AAED,MAAa,qCAAqC,EAAE,OAAO,EAC1D,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,iCAAiC,EAC5E,CAAC;AAED,MAAa,6BAA6B,EAAE,OAAO;CAClD,QAAQ,EAAE,OAAO;CACjB,UAAU,EAAE,OAAO;CACnB,cAAc,EAAE,OAAO;AACxB,CAAC;AAED,MAAa,yBAAyB,EAAE,OAAO,EAC9C,IAAI,EAAE,QAAQ,EACf,CAAC;;;;;;;ACjGD,IAAa,sBAAb,cAAyC,UAAU;CAClD;CAEA,YAAY,OAOT;EACF,MAAM,MAAM,SAAS;GACpB,MAAM;GACN,WAAW,MAAM,gBAAgB;GACjC,OAAO,MAAM;GACb,SAAS;IACR,QAAQ,MAAM;IACd,cAAc,MAAM;IACpB,QAAQ,MAAM;IACd,qBAAqB,MAAM;GAC5B;EACD,CAAC;EACD,KAAK,OAAO;EACZ,KAAK,cAAc,MAAM;CAC1B;AACD;AAEA,SAAgB,4BAA4B,OAAyB;CACpE,OAAO,iBAAiB,uBAAuB,MAAM,gBAAgB;AACtE;AAEA,SAAgB,yBAAyB,OAAyB;CACjE,OAAO,iBAAiB,uBAAuB,MAAM,gBAAgB;AACtE;;AAGA,SAAgB,4BAA4B,QAAgB,OAAuB;CAClF,IAAI,iBAAiB,qBAAqB,MAAM;CAEhD,MAAM,IAAI,oBAAoB;EAC7B,SAFe,iBAAiB,QAAQ,MAAM,UAAU,GAAG,OAAO;EAGlE,aAAa;EACb;EACA,OAAO;CACR,CAAC;AACF;AAEA,SAAS,iBAAiB,QAAyB;CAClD,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW;AACzE;;AAGA,SAAgB,YAAY,OAAe,QAAgB,MAAwB;CAClF,IAAI,CAAC,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,WACjD,MAAM,IAAI,oBAAoB;EAC7B,SAAS,GAAG,MAAM;EAClB,aAAa;EACb,QAAQ;CACT,CAAC;CAEF,IAAI,UAAU,OAAO,SAAS,OAAO,KAAK,UAAU,QAAQ,KAAK,cAAc,KAAA,GAC9E,OAAO,KAAK;CAEb,MAAM,aAAa,KAAK;CACxB,MAAM,aACL,cAAc,UAAU,KAAK,OAAO,WAAW,mBAAmB,WAAW,WAAW,iBAAiB,KAAA;CAC1G,MAAM,IAAI,oBAAoB;EAC7B,SAAS,SAAS,KAAK,cAAc,IAAI,KAAK,iBAAiB,GAAG,MAAM;EACxE,aAAa,iBAAiB,MAAM,IAAI,uBAAuB;EAC/D,QAAQ;EACR;EACA,GAAI,eAAe,KAAA,KAAa,EAAE,mBAAmB,WAAW;CACjE,CAAC;AACF;;AAGA,SAAgB,sBAAsB,SAAsD;CAC3F,MAAM,QAAQ,QAAQ;CACtB,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;EAC7C,IAAI;EACJ,IAAI,WAAW;EACf,KAAK,MAAM,OAAO,OAAO;GACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,IAAI,UAAU,GAAG;GACtD,MAAM,OAAO,OAAO,IAAI,iBAAiB,WAAW,IAAI,eAAe;GACvE,IAAI,QAAQ,UAAU;IACrB,WAAW;IACX,OAAO,IAAI;GACZ;EACD;EACA,IAAI,MAAM,OAAO;CAClB;CACA,KAAK,MAAM,OAAO;EAAC;EAAY;EAAS;EAAS;EAAS;EAAc;EAAa;CAAS,GAAY;EACzG,MAAM,OAAO,QAAQ;EACrB,IAAI,cAAc,IAAI,KAAK,SAAS,KAAK,UAAU,KAAK,KAAK,UAAU,CAAC,SAAS,GAChF,OAAO,KAAK;CAEd;AAED;AAEA,SAAgB,aAAa,OAAuC;CACnE,IAAI,CAAC,cAAc,KAAK,KAAK,OAAO,MAAM,kBAAkB,UAC3D,MAAM,IAAI,UAAU,wCAAwC,EAAE,MAAM,WAAW,CAAC;CAEjF,MAAM,SAAS,sBAAsB,KAAK;CAC1C,OAAO;EACN,YAAY,OAAO,MAAM,aAAa;EACtC,GAAI,UAAU,EAAE,SAAS,OAAO;CACjC;AACD;AAEA,SAAgB,cAAc,OAA8C;CAC3E,IAAI,CAAC,MAAM,QAAQ,KAAK,GACvB,MAAM,IAAI,UAAU,6CAA6C,EAAE,MAAM,WAAW,CAAC;CAEtF,OAAO,EAAE,aAAa,MAAM,KAAK,QAAQ,aAAa,GAAG,CAAC,CAAC,UAAU,EAAE;AACxE;AAEA,SAAgB,QAAQ,OAAsB;CAC7C,IAAI,UAAU,MACb,MAAM,IAAI,UAAU,uCAAuC,EAAE,MAAM,WAAW,CAAC;AAEjF;AAEA,SAAgB,SAAS,OAAsC;CAC9D,IACC,CAAC,cAAc,KAAK,KACpB,OAAO,MAAM,UAAU,YACvB,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,SAAS,MAAM,aAAa,GAE7B,MAAM,IAAI,UAAU,gDAAgD,EAAE,MAAM,WAAW,CAAC;CAEzF,OAAO;EACN,QAAQ,OAAO,MAAM,KAAK;EAC1B,UAAU,MAAM;EAChB,cAAc,MAAM;CACrB;AACD;AAEA,SAAgB,UAAU,OAA2D;CACpF,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,SAAS,MAAM,YAAY,GACxD,MAAM,IAAI,UAAU,6CAA6C,EAAE,MAAM,WAAW,CAAC;CAEtF,OAAO;EACN,WAAW,MAAM;EACjB,GAAI,OAAO,MAAM,iBAAiB,YAAY,EAAE,WAAW,MAAM,aAAa;CAC/E;AACD;AAEA,SAAgB,cACf,OACA,MACA,OAC6B;CAC7B,OAAO;EACN,WAAW,MAAM,aAAa,KAAK,UAAU,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM;EACvE,GAAI,KAAK,cAAc,KAAA,KAAa,EAAE,WAAW,KAAK,UAAU;EAChE,aAAa,cAAc,KAAK;CACjC;AACD;AAEA,SAAS,YAAY,YAAgC;CACpD,IAAI;CACJ,IAAI;EACH,QAAQ,cAAc,UAAU;CACjC,SAAS,OAAO;EACf,MAAM,IAAI,UAAU,uBAAuB;GAAE,MAAM;GAAa,OAAO;EAAM,CAAC;CAC/E;CACA,IAAI,MAAM,eAAe,GACxB,MAAM,IAAI,UAAU,gCAAgC,EAAE,MAAM,YAAY,CAAC;CAE1E,IAAI,MAAM,aAAA,UACT,MAAM,IAAI,UAAU,8BAA8B;EACjD,MAAM;EACN,SAAS;GAAE,WAAW;GAAiB,gBAAgB,MAAM;EAAW;CACzE,CAAC;CAEF,OAAO;AACR;AAEA,SAAS,KAAK,OAAmB,aAAuC;CACvE,OAAO,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC,IAAI,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC;AAC/G;;AAGA,SAAgB,eAAe,OAAyC;CACvE,MAAM,QAAQ,YAAY,MAAM,WAAW;CAC3C,MAAM,OAAO,IAAI,SAAS;CAC1B,KAAK,IAAI,WAAW,MAAM,OAAO;CACjC,KAAK,IAAI,MAAM,SAAS,UAAU,UAAU,YAAY,KAAK,OAAO,MAAM,YAAY,GAAG,MAAM,SAAS;CACxG,IAAI,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,OAAO;CACpD,IAAI,MAAM,qBACT,KAAK,IAAI,oBAAoB,KAAK,UAAU,EAAE,YAAY,OAAO,SAAS,MAAM,qBAAqB,EAAE,EAAE,CAAC,CAAC;CAE5G,OAAO;AACR;;AAGA,SAAgB,oBAAoB,OAA8C;CACjF,IAAI,MAAM,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,IAClD,MAAM,IAAI,UAAU,+CAA+C,EAAE,MAAM,YAAY,CAAC;CAEzF,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,UAAU;CAClE,MAAM,WAAW,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,OAAO;CACjE,IAAI,UAAU,UACb,MAAM,IAAI,UAAU,oDAAoD,EAAE,MAAM,YAAY,CAAC;CAG9F,MAAM,OAAO,IAAI,SAAS;CAC1B,KAAK,IAAI,WAAW,MAAM,OAAO;CACjC,IAAI,MAAM,qBACT,KAAK,IAAI,oBAAoB,KAAK,UAAU,EAAE,YAAY,OAAO,SAAS,MAAM,qBAAqB,EAAE,EAAE,CAAC,CAAC;CAE5G,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,UAAU;EAC9C,MAAM,QAAQ,YAAY,KAAK,WAAW;EAC1C,KAAK,IAAI,OAAO,SAAS,KAAK,OAAO,KAAK,YAAY,GAAG,KAAK,SAAS;EACvE,OAAO;GACN,MAAM,KAAK;GACX,OAAO,gBAAgB;GACvB,GAAI,KAAK,WAAW,EAAE,SAAS,KAAK,QAAQ;EAC7C;CACD,CAAC;CACD,KAAK,IAAI,SAAS,KAAK,UAAU,KAAK,CAAC;CACvC,OAAO;AACR;;;;;;;ACxMA,IAAa,iBAAb,MAAa,eAAe;CAC3B;CACA;CAEA,YAAY,MAAoB,UAAiC,CAAC,GAAG;EACpE,MAAM,SAAS,mBAAmB,UAAU,IAAI;EAChD,IAAI,CAAC,OAAO,SACX,MAAM,IAAI,UAAU,qCAAqC;GACxD,MAAM;GACN,SAAS,EAAE,QAAQ,OAAO,MAAM,OAAO,KAAK,UAAU,MAAM,OAAO,EAAE;EACtE,CAAC;EAEF,KAAKA,SAAS,OAAO,KAAK;EAC1B,KAAKC,QAAQ,IAAI,YAAY;GAC5B,GAAG;GACH,SAAS;GACT,OAAO;EACR,CAAC;CACF;CAEA,OAAO,YAAY,KAAkC;EACpD,MAAM,OAAO,YAAY,KAAK,kBAAkB;EAChD,OAAO,IAAI,eAAe,MAAM;GAC/B,GAAI,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM;GACpC,GAAI,IAAI,UAAU,EAAE,QAAQ,IAAI,OAAO;EACxC,CAAC;CACF;CAEA,MAAMC,MAAM,MAAc,MAA0C,OAAiC;EACpG,IAAI;GACH,MAAM,MAAM,MAAM,KAAKD,MAAM,KAAK,MAAM,MAAM;IAAE;IAAO,SAAS;GAAK,CAAC;GACtE,OAAO,YAAY,OAAO,IAAI,QAAQ,IAAI,IAAI;EAC/C,SAAS,OAAO;GACf,4BAA4B,OAAO,KAAK;EACzC;CACD;;CAGA,MAAM,SAAS,OAA8D;EAC5E,MAAM,OAAgC;GACrC,SAAS,MAAM;GACf,MAAM,MAAM;GACZ,GAAI,MAAM,iBAAiB,KAAA,KAAa,EAAE,cAAc,MAAM,aAAa;GAC3E,GAAI,MAAM,uBAAuB,EAChC,kBAAkB,EAAE,YAAY,OAAO,SAAS,MAAM,qBAAqB,EAAE,EAAE,EAChF;EACD;EACA,OAAO,aAAa,MAAM,KAAKC,MAAM,OAAO,KAAKF,OAAO,eAAe,MAAM,sBAAsB,CAAC;CACrG;;CAGA,MAAM,SAAS,OAA8D;EAC5E,MAAM,OAAgC;GACrC,SAAS,MAAM;GACf,YAAY,OAAO,SAAS,MAAM,YAAY,EAAE;GAChD,MAAM,MAAM;GACZ,GAAI,MAAM,iBAAiB,KAAA,KAAa,EAAE,cAAc,MAAM,aAAa;EAC5E;EACA,OAAO,aAAa,MAAM,KAAKE,MAAM,OAAO,KAAKF,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;CAC7G;;CAGA,MAAM,eAAe,OAAmD;EACvE,QACC,MAAM,KAAKE,MACV,OAAO,KAAKF,OAAO,kBACnB;GAAE,SAAS,MAAM;GAAS,QAAQ,MAAM;EAAO,GAC/C,yBACD,CACD;CACD;;CAGA,MAAM,YAAY,OAAgD;EACjE,QACC,MAAM,KAAKE,MACV,OAAO,KAAKF,OAAO,sBACnB;GACC,SAAS,MAAM;GACf,YAAY,OAAO,SAAS,MAAM,YAAY,EAAE;GAChD,UAAU,CAAC;IAAE,MAAM;IAAS,OAAO,MAAM;GAAM,CAAC;EACjD,GACA,6BACD,CACD;CACD;;CAGA,MAAM,cAAc,OAAkD;EACrE,QACC,MAAM,KAAKE,MACV,OAAO,KAAKF,OAAO,sBACnB;GACC,SAAS,MAAM;GACf,YAAY,OAAO,SAAS,MAAM,YAAY,EAAE;GAChD,UAAU,CAAC;EACZ,GACA,6BACD,CACD;CACD;;CAGA,MAAM,UAAU,OAA+D;EAC9E,MAAM,OAAO,MAAM,SAAS,UAAU,OAAO,KAAKA,OAAO,cAAc,OAAO,KAAKA,OAAO;EAC1F,MAAM,QAAQ,MAAM,SAAS,UAAU,uBAAuB;EAC9D,OAAO,aAAa,MAAM,KAAKE,MAAM,MAAM,eAAe,KAAK,GAAG,KAAK,CAAC;CACzE;;CAGA,MAAM,eAAe,OAA2E;EAC/F,OAAO,cACN,MAAM,KAAKA,MAAM,OAAO,KAAKF,OAAO,kBAAkB,oBAAoB,KAAK,GAAG,yBAAyB,CAC5G;CACD;;CAGA,MAAM,aAAa,OAAuE;EACzF,MAAM,OAAO,UACZ,MAAM,KAAKE,MAAM,OAAO,KAAKF,OAAO,WAAW,EAAE,SAAS,MAAM,QAAQ,GAAG,kBAAkB,CAC9F;EACA,MAAM,WAAW,KAAK,UAAU,QAAQ,QAAQ,EAAE;EAClD,IAAI;EACJ,IAAI;GACH,MAAM,MAAM,KAAKC,MAAM,MAAM,OAAO,YAAY,KAAKD,OAAO,GAAG,YAAY;IAC1E,OAAO;IACP,SAAS;GACV,CAAC;EACF,SAAS,OAAO;GACf,4BAA4B,yBAAyB,KAAK;EAC3D;EACA,IAAI,CAAC,IAAI,IACR,MAAM,IAAI,oBAAoB;GAC7B,SAAS,0CAA0C,IAAI;GACvD,aACC,IAAI,WAAW,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,MAC9E,uBACA;GACJ,QAAQ;GACR,QAAQ,IAAI;EACb,CAAC;EAEF,OAAO,cAAc,OAAO,MAAM,IAAI,KAAK;CAC5C;;CAGA,MAAM,eAAe,OAAmD;EACvE,MAAM,OAAgC;GACrC,mBAAmB,MAAM;GACzB,GAAI,MAAM,QAAQ,EAAE,MAAM,MAAM,KAAK;GACrC,GAAI,MAAM,eAAe,KAAA,KAAa,EAAE,YAAY,MAAM,WAAW;EACtE;EACA,QAAQ,MAAM,KAAKE,MAAM,OAAO,KAAKF,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;CACzG;;CAGA,MAAM,SAAwC;EAC7C,OAAO,SAAS,MAAM,KAAKE,MAAM,OAAO,KAAKF,OAAO,SAAS,CAAC,GAAG,gBAAgB,CAAC;CACnF;;CAGA,MAAM,iBAKH;EACF,MAAM,QAAQ,MAAM,KAAKE,MAAM,OAAO,KAAKF,OAAO,kBAAkB,CAAC,GAAG,yBAAyB;EACjG,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,SAAS,MAAM,MAAM,KAAK,OAAO,MAAM,4BAA4B,UAChG,MAAM,IAAI,UAAU,oDAAoD,EAAE,MAAM,WAAW,CAAC;EAE7F,OAAO;GACN,KAAK,MAAM;GACX,sBAAsB,MAAM;GAC5B,GAAI,OAAO,MAAM,uBAAuB,YAAY,EAAE,oBAAoB,MAAM,mBAAmB;GACnG,GAAI,SAAS,MAAM,qBAAqB,KAAK,EAAE,oBAAoB,MAAM,sBAAsB;EAChG;CACD;;CAGA,MAAM,WAAW,OAAyF;EACzG,QACC,MAAM,KAAKE,MACV,OAAO,KAAKF,OAAO,cACnB;GACC,KAAK,MAAM;GACX,cAAc,MAAM;GACpB,iBAAiB,MAAM,mBAAmB,CAAC,WAAW,gBAAgB;EACvE,GACA,qBACD,CACD;CACD;;CAGA,MAAM,cAAc,OAA2D;EAC9E,QACC,MAAM,KAAKE,MACV,OAAO,KAAKF,OAAO,iBACnB,EAAE,sBAAsB,OAAO,wBAAwB,MAAM,GAC7D,wBACD,CACD;CACD;AACD;;;ACrOA,MAAM,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,iBAAiB;AAEhE,MAAa,uBAAuB,WAAW;CAC9C,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,SAAS,KAAK;AAC9E,CAAC;AAED,MAAa,uBAAuB,WAAW;CAC9C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,SAAS,KAAK;AAC9E,CAAC;AAED,MAAa,6BAA6B,WAAW;CACpD,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ;EAC9B,MAAM,eAAe,YAAY,GAAG,CAAC,CAAC,eAAe,KAAK;EAC1D,OAAO,EAAE,IAAI,KAAK;CACnB;AACD,CAAC;AAED,MAAa,0BAA0B,WAAW;CACjD,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ;EAC9B,MAAM,eAAe,YAAY,GAAG,CAAC,CAAC,YAAY,KAAK;EACvD,OAAO,EAAE,IAAI,KAAK;CACnB;AACD,CAAC;AAED,MAAa,4BAA4B,WAAW;CACnD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ;EAC9B,MAAM,eAAe,YAAY,GAAG,CAAC,CAAC,cAAc,KAAK;EACzD,OAAO,EAAE,IAAI,KAAK;CACnB;AACD,CAAC;AAED,MAAa,wBAAwB,WAAW;CAC/C,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,UAAU,KAAK;AAC/E,CAAC;AAED,MAAa,6BAA6B,WAAW;CACpD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,eAAe,KAAK;AACpF,CAAC;AAED,MAAa,2BAA2B,WAAW;CAClD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,aAAa,KAAK;AAClF,CAAC;AAED,MAAa,6BAA6B,WAAW;CACpD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ;EAC9B,MAAM,eAAe,YAAY,GAAG,CAAC,CAAC,eAAe,KAAK;EAC1D,OAAO,EAAE,IAAI,KAAK;CACnB;AACD,CAAC;AAED,MAAa,qBAAqB,WAAW;CAC5C,IAAI;CACJ,MAAM;CACN,aAAa;CACb,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,QAAQ,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,OAAO;AACxE,CAAC;AAED,MAAa,iBAAiB,aAAa;CAC1C,IAAI;CACJ,OAAO;CACP,aACC;CACD,SAAS;CACT,MAAM;EAAE,MAAM;EAAU,QAAQ;CAAmB;CACnD,YAAY,CAAC,aAAa,MAAM;CAChC,gBAAgB;CAChB,MAAM,CAAC,UAAU;CACjB,OAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,CAAC;;;;;;;ACtKD,SAAgB,4BAA4B,aAAwC,gBAAiC;CACpH,IAAI,CAAC,aAAa,OAAO;CACzB,IAAI,eAAe,WAAW,GAAG,OAAO;CACxC,IAAI,YAAY,WAAW,eAAe,QAAQ,OAAO;CAEzD,IAAI,WAAW;CACf,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAC5C,YAAY,YAAY,WAAW,CAAC,IAAI,eAAe,WAAW,CAAC;CAEpE,OAAO,aAAa;AACrB;;;;;AAuCA,SAAgB,oBACf,QACA,SAC4B;CAC5B,IAAI,CAAC,cAAc,MAAM,GACxB,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAoB;CAEjD,MAAM,WAAW,OAAO;CACxB,IAAI,OAAO,aAAa,UACvB,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAoB;CAGjD,MAAM,aAAa,SAAS,gCAAe,IAAI,KAAK,EAAA,CAAE,YAAY;CAClE,MAAM,cAAc,SAAS,qBAAqB;CAElD,MAAM,UAAU,UAAU,OAAO,UAAU,KAAK,UAAU,OAAO,iBAAiB;CAClF,IAAI,SACH,OAAO,mBAAmB,UAAU,SAAS,YAAY,aAAa,QAAQ,OAAO,iBAAiB,CAAC;CAGxG,MAAM,WAAW,OAAO;CACxB,IAAI,cAAc,QAAQ,GACzB,OAAO,oBAAoB,UAAU,UAAU,YAAY,WAAW;CAGvE,OAAO;EAAE,IAAI;EAAO,QAAQ;CAA0B;AACvD;AAEA,SAAS,mBACR,UACA,SACA,YACA,aACA,QAC4B;CAC5B,MAAM,OAAO,QAAQ;CACrB,IAAI,CAAC,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,UACjD,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAe;CAE5C,MAAM,WAAW,SAAS,KAAK,OAAO,IAAI,KAAK,UAAU,KAAA;CACzD,IAAI,CAAC,eAAe,YAAY,aAAa,WAC5C,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAmB;CAGhD,MAAM,OAAO,QAAQ;CACrB,MAAM,SAAS,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAA;CAC5F,MAAM,WAAW,cAAc,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,KAAK,cAAc,KAAA;CACxF,MAAM,YAAY,OAAO,QAAQ,kBAAkB,WAAW,OAAO,QAAQ,aAAa,IAAI,KAAA;CAC9F,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ,UAAU;CAC5D,MAAM,QAAQ,aAAa,OAAO;CAClC,MAAM,UACL,cAAc,QAAQ,mBAAmB,KAAK,OAAO,QAAQ,mBAAmB,CAAC,kBAAkB,WAChG,OAAO,QAAQ,mBAAmB,CAAC,aAAa,IAChD,KAAA;CACJ,MAAM,eAAe,SAAS,QAAQ,iBAAiB,IAAI,QAAQ,oBAAoB,KAAA;CAEvF,IAAI,CAAC,QAAQ,MAAM,WAAW,GAC7B,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAgB;CAkB7C,OAAO;EAAE,IAAI;EAAM,OAAA;GAdlB,SAAS;GACT,UAAU,OAAO,QAAQ;GACzB,SAAS,OAAO,KAAK,KAAK;GAC1B,UAAU,SAAS,mBAAmB;GACtC,aAAa;GACb,GAAI,UAAU,EAAE,SAAS,OAAO;GAChC,GAAI,YAAY,EAAE,SAAS;GAC3B,GAAI,aAAa,EAAE,YAAY,UAAU;GACzC,GAAI,QAAQ,EAAE,KAAK;GACnB,GAAI,MAAM,SAAS,KAAK,EAAE,MAAM;GAChC,GAAI,WAAW,EAAE,UAAU,QAAQ;GACnC,GAAI,gBAAgB,EAAE,gBAAgB,aAAa;GACnD,GAAI,YAAY,EAAE,WAAW,SAAS;EAEhB;CAAE;AAC1B;AAEA,SAAS,oBACR,UACA,UACA,YACA,aAC4B;CAC5B,MAAM,UAAU,UAAU,SAAS,UAAU;CAC7C,MAAM,OAAO,UAAU,QAAQ,UAAU,KAAA;CACzC,IAAI,CAAC,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,UACjD,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAwB;CAErD,MAAM,WAAW,SAAS,KAAK,OAAO,IAAI,KAAK,UAAU,KAAA;CACzD,IAAI,CAAC,eAAe,YAAY,aAAa,WAC5C,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAmB;CAGhD,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,cAAc,IAAI,KAAK,OAAO,KAAK,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAA;CAC5F,MAAM,WAAW,cAAc,IAAI,KAAK,SAAS,KAAK,WAAW,IAAI,KAAK,cAAc,KAAA;CACxF,MAAM,kBAAkB,SAAS,SAAS,KAAK,IAAI,SAAS,QAAQ,KAAA;CACpE,IAAI,CAAC,iBACJ,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAsB;CAEnD,MAAM,eAAe,SAAS,SAAS,OAAO,IAAI,SAAS,UAAU,KAAA;CACrE,MAAM,YAAY,WAAW,OAAO,QAAQ,kBAAkB,WAAW,OAAO,QAAQ,aAAa,IAAI,KAAA;CAezG,OAAO;EAAE,IAAI;EAAM,OAAA;GAZlB,SAAS;GACT,UAAU,OAAO,QAAQ;GACzB,SAAS,OAAO,KAAK,KAAK;GAC1B,UAAU;GACV,aAAa;GACb,mBAAmB;GACnB,GAAI,UAAU,EAAE,SAAS,OAAO;GAChC,GAAI,YAAY,EAAE,SAAS;GAC3B,GAAI,aAAa,EAAE,YAAY,UAAU;GACzC,GAAI,gBAAgB,EAAE,eAAe,aAAa;GAClD,GAAI,YAAY,EAAE,WAAW,SAAS;EAEhB;CAAE;AAC1B;AAEA,SAAS,UAAU,OAAqD;CACvE,OAAO,cAAc,KAAK,IAAI,QAAQ,KAAA;AACvC;AAEA,SAAS,YAAY,GAAG,QAAuC;CAC9D,KAAK,MAAM,SAAS,QACnB,IAAI,SAAS,KAAK,KAAK,MAAM,SAAS,GAAG,OAAO;AAGlD;AAEA,SAAS,aAAa,SAA0D;CAC/E,MAAM,MAA8B,CAAC;CAErC,MAAM,QAAQ,QAAQ;CACtB,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;EAC7C,MAAM,UAAU,MAAM,MAAM,SAAS;EACrC,IAAI,cAAc,OAAO,KAAK,SAAS,QAAQ,UAAU,GACxD,IAAI,KAAK;GACR,MAAM;GACN,KAAK,QAAQ;GACb,GAAI,SAAS,QAAQ,iBAAiB,IAAI,EAAE,YAAY,QAAQ,kBAAkB,IAAI,CAAC;GACvF,GAAI,OAAO,QAAQ,iBAAiB,WAAW,EAAE,WAAW,QAAQ,aAAa,IAAI,CAAC;GACtF,YAAY;EACb,CAAC;CAEH;CAEA,KAAK,MAAM,OAAO;EAAC;EAAY;EAAS;EAAS;EAAS;EAAc;EAAa;CAAS,GAAY;EACzG,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,GAAG;EACxD,IAAI,KAAK;GACR,MAAM;GACN,KAAK,KAAK;GACV,GAAI,SAAS,KAAK,iBAAiB,IAAI,EAAE,YAAY,KAAK,kBAAkB,IAAI,CAAC;GACjF,GAAI,OAAO,KAAK,iBAAiB,WAAW,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC;GAChF,GAAI,SAAS,KAAK,YAAY,IAAI,EAAE,WAAW,KAAK,aAAa,IAAI,CAAC;GACtE,GAAI,SAAS,KAAK,YAAY,IAAI,EAAE,YAAY,KAAK,aAAa,IAAI,CAAC;EACxE,CAAC;CACF;CAEA,OAAO;AACR"}
@@ -1,10 +1,10 @@
1
1
  import { t as ToolError } from "./errors-DoSpNHvs.js";
2
- import { n as defineModule, r as defineTool } from "./define-ieoksEQ0.js";
2
+ import { n as defineModule, r as defineTool } from "./define-DdFALdNf.js";
3
3
  import { n as requireAuth } from "./provider-CgDAlg6K.js";
4
4
  import { t as artifactRefSchema } from "./artifact-D064mHfK.js";
5
5
  import { t as AwsService } from "./aws-service-Cn_ozX4X.js";
6
6
  import { o as utf8ToBytes } from "./bytes-BxpimpQx.js";
7
- import { H as resolveObjectKey, V as normalizeKeyPrefix, p as S3Client } from "./s3-CoZQRTfe.js";
7
+ import { H as resolveObjectKey, V as normalizeKeyPrefix, p as S3Client } from "./s3-TKCIZZ2q.js";
8
8
  import { n as runBatchItems, t as batchResultSchema } from "./batch-Co1ujeAW.js";
9
9
  import { t as parseAwsJsonBody } from "./aws-json-CecFqzqX.js";
10
10
  import { isPlainObject, isString } from "es-toolkit";
@@ -551,4 +551,4 @@ const textractModule = defineModule({
551
551
  //#endregion
552
552
  export { textractTextChunkSchema as C, textractStatusInputSchema as S, textractExtractResultSchema as _, TextractClient as a, textractExtractTextInputSchema as b, DEFAULT_POLL_INTERVAL_MS as c, MAX_EXTRACT_CHUNK_MAX_CHARS as d, MAX_INLINE_EXTRACT_CHARS as f, textractChunkOptionsSchema as g, textractAuthSchema as h, textractModule as i, DEFAULT_POLL_TIMEOUT_MS as l, MAX_POLL_TIMEOUT_MS as m, textractExtractTextTool as n, DEFAULT_EXTRACT_CHUNK_MAX_CHARS as o, MAX_POLL_INTERVAL_MS as p, textractGetStatusTool as r, DEFAULT_EXTRACT_CHUNK_OVERLAP as s, textractExtractTextBatchTool as t, MAX_BATCH_EXTRACT as u, textractExtractTextBatchInputSchema as v, textractOutputModeSchema as x, textractExtractTextBatchOutputSchema as y };
553
553
 
554
- //# sourceMappingURL=textract-2jkPuRiE.js.map
554
+ //# sourceMappingURL=textract-CthgcP6w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textract-2jkPuRiE.js","names":["#auth","#aws","#storage","#signal","#keyPrefix","#extractRaw","#writeExtractArtifact","#statusRaw","#call","#getJobPayload"],"sources":["../src/vendors/textract/contracts.ts","../src/vendors/textract/domain.ts","../src/vendors/textract/client.ts","../src/vendors/textract/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { artifactRefSchema } from '../../shared/artifact'\nimport { batchResultSchema } from '../../shared/batch'\n\nexport const MAX_BATCH_EXTRACT = 10\nexport const DEFAULT_POLL_TIMEOUT_MS = 60_000\nexport const DEFAULT_POLL_INTERVAL_MS = 2_000\nexport const MAX_POLL_TIMEOUT_MS = 900_000\nexport const MAX_POLL_INTERVAL_MS = 30_000\n\n/** Hard cap for inline extract text returned to the model. */\nexport const MAX_INLINE_EXTRACT_CHARS = 100_000\nexport const DEFAULT_EXTRACT_CHUNK_MAX_CHARS = 1_200\nexport const DEFAULT_EXTRACT_CHUNK_OVERLAP = 200\nexport const MAX_EXTRACT_CHUNK_MAX_CHARS = 8_000\n\nexport const textractAuthSchema = z.object({\n\taccess_key_id: z.string().min(1).describe('AWS access key id'),\n\tsecret_access_key: z.string().min(1).describe('AWS secret access key'),\n\tregion: z.string().min(1).describe('AWS region for Textract and the source S3 bucket'),\n\tbucket: z.string().min(1).describe('AWS S3 bucket containing source documents'),\n\tsession_token: z.string().min(1).optional().describe('Optional session token'),\n\tkey_prefix: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Optional object-key root matching the bound S3 storage (no leading slash). ArtifactRef.key is logical; DocumentLocation uses the wire key under this prefix.'\n\t\t),\n\tpoll_timeout_ms: z\n\t\t.int()\n\t\t.min(1_000)\n\t\t.max(MAX_POLL_TIMEOUT_MS)\n\t\t.optional()\n\t\t.describe('Max time to wait for Textract before returning pending plus job_id (default 60000)'),\n\tpoll_interval_ms: z\n\t\t.int()\n\t\t.min(200)\n\t\t.max(MAX_POLL_INTERVAL_MS)\n\t\t.optional()\n\t\t.describe('Delay between GetDocumentTextDetection polls (default 2000)')\n})\n\nexport type TextractAuth = z.infer<typeof textractAuthSchema>\n\nexport const textractOutputModeSchema = z\n\t.enum(['inline', 'artifact', 'chunks'])\n\t.describe(\n\t\t'How to return extracted text: inline (default, fails if over inline limit), artifact (write to object storage), chunks (split for RAG handoff)'\n\t)\n\nexport type TextractOutputMode = z.infer<typeof textractOutputModeSchema>\n\nexport const textractChunkOptionsSchema = z.object({\n\tmax_chars: z\n\t\t.int()\n\t\t.min(200)\n\t\t.max(MAX_EXTRACT_CHUNK_MAX_CHARS)\n\t\t.optional()\n\t\t.describe(`Chunk size in characters (default ${DEFAULT_EXTRACT_CHUNK_MAX_CHARS})`),\n\toverlap: z\n\t\t.int()\n\t\t.min(0)\n\t\t.max(2_000)\n\t\t.optional()\n\t\t.describe(`Overlap in characters between chunks (default ${DEFAULT_EXTRACT_CHUNK_OVERLAP})`)\n})\n\nexport const textractTextChunkSchema = z.object({\n\tid: z.string().describe('Stable chunk id (document-scoped)'),\n\tindex: z.number().int().nonnegative(),\n\ttext: z.string().describe('Chunk text')\n})\n\nexport type TextractTextChunk = z.infer<typeof textractTextChunkSchema>\n\nconst outputModeFields = {\n\toutput: textractOutputModeSchema.optional(),\n\tdestination_key: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Object key for artifact mode (logical under key_prefix when set). Default extracts/{job_id}.txt'),\n\tchunk: textractChunkOptionsSchema.optional().describe('Chunking options when output is chunks')\n}\n\nexport const textractExtractResultSchema = z.object({\n\tstatus: z.enum(['succeeded', 'pending', 'failed']).describe('Job status'),\n\tjob_id: z.string().optional().describe('Textract job id when started or polled'),\n\ttext: z.string().optional().describe('Extracted LINE text when succeeded and output is inline'),\n\tpage_count: z.int().optional().describe('Document page count when known'),\n\terror: z.string().optional().describe('Failure message when status is failed'),\n\tsource: artifactRefSchema.optional().describe('Source ArtifactRef when known'),\n\toutput: textractOutputModeSchema.optional().describe('Presentation mode used for this result'),\n\tartifact: artifactRefSchema\n\t\t.optional()\n\t\t.describe('Object-store ArtifactRef when output is artifact and status is succeeded'),\n\tchunks: z\n\t\t.array(textractTextChunkSchema)\n\t\t.optional()\n\t\t.describe('Text chunks when output is chunks and status is succeeded')\n})\n\nexport const textractExtractTextInputSchema = z.object({\n\tsource: artifactRefSchema.describe('Document ArtifactRef in object storage (store must be object)'),\n\t...outputModeFields\n})\n\nexport const textractExtractTextBatchInputSchema = z.object({\n\tsources: z\n\t\t.array(artifactRefSchema)\n\t\t.min(1)\n\t\t.max(MAX_BATCH_EXTRACT)\n\t\t.describe('Document ArtifactRefs to extract (max 10)'),\n\t...outputModeFields,\n\tdestination_key_prefix: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Prefix for per-item artifact keys in batch artifact mode (default extracts/)')\n})\n\nexport const textractStatusInputSchema = z.object({\n\tjob_id: z.string().min(1).describe('Job id from a prior extract call'),\n\t...outputModeFields\n})\n\nexport const textractExtractTextBatchOutputSchema = batchResultSchema(textractExtractResultSchema)\n\nexport type TextractExtractResult = z.infer<typeof textractExtractResultSchema>\nexport type TextractExtractTextInput = z.infer<typeof textractExtractTextInputSchema>\nexport type TextractExtractTextBatchInput = z.infer<typeof textractExtractTextBatchInputSchema>\nexport type TextractStatusInput = z.infer<typeof textractStatusInputSchema>\nexport type TextractExtractTextBatchOutput = z.infer<typeof textractExtractTextBatchOutputSchema>\n","/**\n * Textract payload helpers + extract presentation (no HTTP).\n * inline | artifact | chunks — product logic lives in the vendor, not the seam.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\nimport { isArray } from 'es-toolkit/compat'\n\nimport { ToolError } from '../../core/errors'\nimport type { ArtifactRef } from '../../shared/artifact'\nimport { DEFAULT_EXTRACT_CHUNK_MAX_CHARS, DEFAULT_EXTRACT_CHUNK_OVERLAP, MAX_INLINE_EXTRACT_CHARS } from './contracts'\nimport type { TextractExtractResult, TextractOutputMode, TextractTextChunk } from './contracts'\n\nexport function lineTextFromBlocks(payload: Record<string, unknown>): {\n\ttext: string\n\tpage_count?: number\n} {\n\tconst blocks = payload['Blocks']\n\tconst lines: string[] = []\n\tif (isArray(blocks)) {\n\t\tfor (const block of blocks) {\n\t\t\tif (!isPlainObject(block)) continue\n\t\t\tif (block['BlockType'] !== 'LINE') continue\n\t\t\tconst t = block['Text']\n\t\t\tif (isString(t) && t.length > 0) lines.push(t)\n\t\t}\n\t}\n\tconst meta = payload['DocumentMetadata']\n\tlet page_count: number | undefined\n\tif (isPlainObject(meta) && typeof meta['Pages'] === 'number' && Number.isFinite(meta['Pages'])) {\n\t\tpage_count = meta['Pages']\n\t}\n\treturn {\n\t\ttext: lines.join('\\n'),\n\t\t...(page_count !== undefined && { page_count })\n\t}\n}\n\nexport function mapJobStatus(jobStatus: string): 'succeeded' | 'pending' | 'failed' {\n\tif (jobStatus === 'SUCCEEDED' || jobStatus === 'PARTIAL_SUCCESS') return 'succeeded'\n\tif (jobStatus === 'FAILED') return 'failed'\n\treturn 'pending'\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException('Aborted', 'AbortError'))\n\t\t\treturn\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener('abort', onAbort)\n\t\t\tresolve()\n\t\t}, ms)\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer)\n\t\t\treject(new DOMException('Aborted', 'AbortError'))\n\t\t}\n\t\tsignal?.addEventListener('abort', onAbort, { once: true })\n\t})\n}\n\nexport type PresentOptions = {\n\toutput?: TextractOutputMode\n\tdestination_key?: string\n\tchunk?: { max_chars?: number; overlap?: number }\n\t/** Source key hint for default artifact destination. */\n\tsource_key?: string\n}\n\n/**\n * Apply output mode to a raw extract result.\n * - inline: fail with too_large when text exceeds MAX_INLINE_EXTRACT_CHARS\n * - artifact: caller must pass writeArtifact; text is stripped from the result\n * - chunks: split text for RAG handoff; full text stripped\n */\nexport async function presentExtractResult(\n\traw: TextractExtractResult,\n\toptions: PresentOptions,\n\twriteArtifact?: (key: string, text: string) => Promise<ArtifactRef>\n): Promise<TextractExtractResult> {\n\tconst mode: TextractOutputMode = options.output ?? 'inline'\n\n\tif (raw.status !== 'succeeded' || raw.text === undefined) {\n\t\treturn baseResult(raw, mode)\n\t}\n\n\tconst text = raw.text\n\n\tif (mode === 'inline') {\n\t\tif (text.length > MAX_INLINE_EXTRACT_CHARS) {\n\t\t\tthrow new ToolError(\n\t\t\t\t`Extracted text exceeds inline limit (${MAX_INLINE_EXTRACT_CHARS} characters); use output: \"artifact\" or \"chunks\"`,\n\t\t\t\t{\n\t\t\t\t\tcode: 'too_large',\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmax_inline_chars: MAX_INLINE_EXTRACT_CHARS,\n\t\t\t\t\t\tchar_count: text.length,\n\t\t\t\t\t\tsuggested_output: 'artifact'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\treturn baseResult(raw, 'inline')\n\t}\n\n\tif (mode === 'chunks') {\n\t\tconst maxChars = options.chunk?.max_chars ?? DEFAULT_EXTRACT_CHUNK_MAX_CHARS\n\t\tconst overlap = options.chunk?.overlap ?? DEFAULT_EXTRACT_CHUNK_OVERLAP\n\t\tconst pieces = chunkText(text, { max_chars: maxChars, overlap })\n\t\tconst docId = options.source_key ?? raw.job_id ?? 'extract'\n\t\tconst chunks: TextractTextChunk[] = pieces.map((piece, index) => ({\n\t\t\tid: chunkId(docId, index),\n\t\t\tindex,\n\t\t\ttext: piece\n\t\t}))\n\t\tconst out = baseResult(raw, 'chunks')\n\t\tdelete out.text\n\t\tout.chunks = chunks\n\t\treturn out\n\t}\n\n\t// artifact\n\tif (!writeArtifact) {\n\t\tthrow new ToolError('Artifact output requires object storage credentials on extract auth', {\n\t\t\tcode: 'bad_auth'\n\t\t})\n\t}\n\tconst key =\n\t\toptions.destination_key ?? `extracts/${raw.job_id ?? sanitizeKeySegment(options.source_key ?? 'document')}.txt`\n\tconst artifact = await writeArtifact(key, text)\n\tconst out = baseResult(raw, 'artifact')\n\tdelete out.text\n\tout.artifact = artifact\n\treturn out\n}\n\nfunction baseResult(raw: TextractExtractResult, mode: TextractOutputMode): TextractExtractResult {\n\tconst out: TextractExtractResult = {\n\t\tstatus: raw.status,\n\t\toutput: mode\n\t}\n\tif (raw.job_id !== undefined) out.job_id = raw.job_id\n\tif (raw.text !== undefined) out.text = raw.text\n\tif (raw.page_count !== undefined) out.page_count = raw.page_count\n\tif (raw.error !== undefined) out.error = raw.error\n\tif (raw.source !== undefined) out.source = raw.source\n\treturn out\n}\n\nfunction sanitizeKeySegment(value: string): string {\n\tconst base = value.replace(/^.*\\//, '').replace(/[^\\w.-]+/g, '_')\n\treturn base.length > 0 ? base.slice(0, 120) : 'document'\n}\n\nfunction chunkId(documentId: string, index: number): string {\n\treturn `${documentId}#${index}`\n}\n\n/** Overlapping character windows; prefers paragraph/newline soft breaks. */\nfunction chunkText(text: string, options: { max_chars: number; overlap: number }): string[] {\n\tconst maxChars = options.max_chars\n\tconst overlap = Math.min(options.overlap, Math.max(0, maxChars - 1))\n\tconst normalized = text.replace(/\\r\\n/g, '\\n').trim()\n\tif (normalized.length === 0) return []\n\tif (normalized.length <= maxChars) return [normalized]\n\n\tconst chunks: string[] = []\n\tlet start = 0\n\twhile (start < normalized.length) {\n\t\tlet end = Math.min(start + maxChars, normalized.length)\n\t\tif (end < normalized.length) {\n\t\t\tconst window = normalized.slice(start, end)\n\t\t\tconst para = window.lastIndexOf('\\n\\n')\n\t\t\tconst line = window.lastIndexOf('\\n')\n\t\t\tconst soft = para >= maxChars * 0.5 ? para : line >= maxChars * 0.5 ? line : -1\n\t\t\tif (soft > 0) {\n\t\t\t\tend = start + soft\n\t\t\t}\n\t\t}\n\t\tconst piece = normalized.slice(start, end).trim()\n\t\tif (piece.length > 0) chunks.push(piece)\n\t\tif (end >= normalized.length) break\n\t\tconst next = end - overlap\n\t\tstart = next <= start ? end : next\n\t}\n\treturn chunks\n}\n","/**\n * Amazon Textract vendor client (async text detection + presentation).\n * Host: `new TextractClient(auth)`. Agent tools: `fromContext(ctx)`.\n * Output modes (inline | artifact | chunks) live here — not in the seam module.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\nimport { isArray } from 'es-toolkit/compat'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { runBatchItems } from '../../shared/batch'\nimport { utf8ToBytes } from '../../shared/bytes'\nimport { parseAwsJsonBody } from '../../transport/aws-json'\nimport { AwsService } from '../../transport/aws-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport { normalizeKeyPrefix, resolveObjectKey } from '../_storage'\nimport { S3Client } from '../s3'\nimport type {\n\tTextractAuth,\n\tTextractExtractResult,\n\tTextractExtractTextBatchInput,\n\tTextractExtractTextBatchOutput,\n\tTextractExtractTextInput,\n\tTextractStatusInput\n} from './contracts'\nimport {\n\tDEFAULT_POLL_INTERVAL_MS,\n\tDEFAULT_POLL_TIMEOUT_MS,\n\ttextractAuthSchema,\n\ttextractExtractResultSchema\n} from './contracts'\nimport { lineTextFromBlocks, mapJobStatus, presentExtractResult, sleep } from './domain'\nimport type { PresentOptions } from './domain'\n\nexport type TextractClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class TextractClient {\n\treadonly #auth: TextractAuth\n\treadonly #aws: AwsService\n\treadonly #storage: S3Client\n\treadonly #signal: AbortSignal | undefined\n\t/** Normalized key_prefix with trailing `/`, or undefined when unbound. */\n\treadonly #keyPrefix: string | undefined\n\n\tconstructor(auth: TextractAuth, options: TextractClientOptions = {}) {\n\t\tconst parsed = textractAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Textract auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#auth = parsed.data\n\t\tthis.#keyPrefix = parsed.data.key_prefix !== undefined ? normalizeKeyPrefix(parsed.data.key_prefix) : undefined\n\t\tthis.#signal = options.signal\n\t\tthis.#aws = new AwsService({\n\t\t\t...options,\n\t\t\taccessKeyId: this.#auth.access_key_id,\n\t\t\tsecretAccessKey: this.#auth.secret_access_key,\n\t\t\tregion: this.#auth.region,\n\t\t\tservice: 'textract',\n\t\t\tbaseURL: `https://textract.${this.#auth.region}.amazonaws.com`,\n\t\t\tlabel: 'Textract',\n\t\t\t...(this.#auth.session_token && { sessionToken: this.#auth.session_token })\n\t\t})\n\t\tthis.#storage = new S3Client(\n\t\t\t{\n\t\t\t\taccess_key_id: this.#auth.access_key_id,\n\t\t\t\tsecret_access_key: this.#auth.secret_access_key,\n\t\t\t\tregion: this.#auth.region,\n\t\t\t\tbucket: this.#auth.bucket,\n\t\t\t\t...(this.#auth.session_token && { session_token: this.#auth.session_token }),\n\t\t\t\t...(this.#auth.key_prefix && { key_prefix: this.#auth.key_prefix })\n\t\t\t},\n\t\t\toptions\n\t\t)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): TextractClient {\n\t\tconst auth = requireAuth(ctx, textractAuthSchema)\n\t\treturn new TextractClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\t/** StartDocumentTextDetection + poll until done, failed, or timeout → pending; then present. */\n\tasync extractText(input: TextractExtractTextInput): Promise<TextractExtractResult> {\n\t\tconst raw = await this.#extractRaw(input.source)\n\t\treturn presentExtractResult(\n\t\t\traw,\n\t\t\tpresentOpts(input.output, input.destination_key, input.chunk, input.source.key),\n\t\t\t(key, text) => this.#writeExtractArtifact(key, text, input.source.filename)\n\t\t)\n\t}\n\n\t/** GetDocumentTextDetection (paged) for an existing job; then present. */\n\tasync getStatus(input: TextractStatusInput): Promise<TextractExtractResult> {\n\t\tconst raw = await this.#statusRaw(input.job_id)\n\t\treturn presentExtractResult(\n\t\t\traw,\n\t\t\tpresentOpts(input.output, input.destination_key, input.chunk, raw.source?.key),\n\t\t\t(key, text) => this.#writeExtractArtifact(key, text, raw.source?.filename)\n\t\t)\n\t}\n\n\tasync extractTextBatch(input: TextractExtractTextBatchInput): Promise<TextractExtractTextBatchOutput> {\n\t\tconst prefix = input.destination_key_prefix ?? 'extracts/'\n\t\tconst rawBatch = await runBatchItems(input.sources, (source) => this.#extractRaw(source))\n\t\tconst results: TextractExtractTextBatchOutput['results'] = []\n\t\tlet succeeded = 0\n\t\tlet failed = 0\n\n\t\tfor (const row of rawBatch.results) {\n\t\t\tif (!row.ok || row.value === undefined) {\n\t\t\t\tresults.push(row)\n\t\t\t\tfailed += 1\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst source = input.sources[row.index]\n\t\t\tconst destKey =\n\t\t\t\tinput.destination_key ??\n\t\t\t\t`${prefix.replace(/\\/?$/, '/')}${source?.key.replace(/^.*\\//, '') || `item-${row.index}`}.txt`\n\t\t\ttry {\n\t\t\t\tconst presented = await presentExtractResult(\n\t\t\t\t\trow.value,\n\t\t\t\t\tpresentOpts(input.output, destKey, input.chunk, source?.key),\n\t\t\t\t\t(key, text) => this.#writeExtractArtifact(key, text, source?.filename)\n\t\t\t\t)\n\t\t\t\tresults.push({ index: row.index, ok: true, value: presented })\n\t\t\t\tsucceeded += 1\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : 'Presentation failed'\n\t\t\t\tconst code =\n\t\t\t\t\terror instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code : 'internal'\n\t\t\t\tresults.push({\n\t\t\t\t\tindex: row.index,\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: { code, message }\n\t\t\t\t})\n\t\t\t\tfailed += 1\n\t\t\t}\n\t\t}\n\n\t\treturn { results, succeeded, failed }\n\t}\n\n\tasync #extractRaw(source: TextractExtractTextInput['source']): Promise<TextractExtractResult> {\n\t\tif (source.store !== 'object') {\n\t\t\tthrow new ToolError('Textract requires source.store \"object\"', { code: 'bad_input' })\n\t\t}\n\n\t\t// Logical ArtifactRef.key → wire S3 object name under optional key_prefix.\n\t\tconst wireName = resolveObjectKey(source.key, this.#keyPrefix)\n\n\t\tlet start: Record<string, unknown>\n\t\ttry {\n\t\t\tstart = await this.#call('Textract.StartDocumentTextDetection', {\n\t\t\t\tDocumentLocation: {\n\t\t\t\t\tS3Object: {\n\t\t\t\t\t\tBucket: this.#auth.bucket,\n\t\t\t\t\t\tName: wireName\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (error instanceof ToolError) {\n\t\t\t\tthrow new ToolError(error.message, {\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tretryable: error.retryable,\n\t\t\t\t\tcause: error.cause,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\t...(isPlainObject(error.details) ? error.details : {}),\n\t\t\t\t\t\t// Surface logical key to callers (not wire path).\n\t\t\t\t\t\tkey: source.key\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\tconst jobId = start['JobId']\n\t\tif (!isString(jobId) || jobId.length === 0) {\n\t\t\tthrow new ToolError('Textract did not return a JobId', { code: 'upstream' })\n\t\t}\n\n\t\tconst timeoutMs = this.#auth.poll_timeout_ms ?? DEFAULT_POLL_TIMEOUT_MS\n\t\tconst intervalMs = this.#auth.poll_interval_ms ?? DEFAULT_POLL_INTERVAL_MS\n\t\tconst deadline = Date.now() + timeoutMs\n\n\t\ttry {\n\t\t\twhile (Date.now() < deadline) {\n\t\t\t\tconst payload = await this.#getJobPayload(jobId)\n\t\t\t\tconst statusRaw = payload['JobStatus']\n\t\t\t\tconst status = isString(statusRaw) ? mapJobStatus(statusRaw) : 'pending'\n\n\t\t\t\tif (status === 'succeeded') {\n\t\t\t\t\tconst lines = lineTextFromBlocks(payload)\n\t\t\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\t\t\tstatus: 'succeeded',\n\t\t\t\t\t\tjob_id: jobId,\n\t\t\t\t\t\ttext: lines.text,\n\t\t\t\t\t\t...(lines.page_count !== undefined && { page_count: lines.page_count }),\n\t\t\t\t\t\tsource\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (status === 'failed') {\n\t\t\t\t\tconst msg = payload['StatusMessage']\n\t\t\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\tjob_id: jobId,\n\t\t\t\t\t\terror: isString(msg) ? msg : 'Textract job failed',\n\t\t\t\t\t\tsource\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst remaining = deadline - Date.now()\n\t\t\t\tif (remaining <= 0) break\n\t\t\t\tawait sleep(Math.min(intervalMs, remaining), this.#signal)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof ToolError) throw error\n\t\t\tif (error instanceof Error && error.name === 'AbortError') {\n\t\t\t\tthrow new ToolError('Textract extract was aborted', {\n\t\t\t\t\tcode: 'timeout',\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\treturn textractExtractResultSchema.parse({\n\t\t\tstatus: 'pending',\n\t\t\tjob_id: jobId,\n\t\t\tsource\n\t\t})\n\t}\n\n\tasync #statusRaw(jobId: string): Promise<TextractExtractResult> {\n\t\tconst payload = await this.#getJobPayload(jobId)\n\t\tconst statusRaw = payload['JobStatus']\n\t\tconst status = isString(statusRaw) ? mapJobStatus(statusRaw) : 'pending'\n\n\t\tif (status === 'succeeded') {\n\t\t\tconst lines = lineTextFromBlocks(payload)\n\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\tstatus: 'succeeded',\n\t\t\t\tjob_id: jobId,\n\t\t\t\ttext: lines.text,\n\t\t\t\t...(lines.page_count !== undefined && { page_count: lines.page_count })\n\t\t\t})\n\t\t}\n\t\tif (status === 'failed') {\n\t\t\tconst msg = payload['StatusMessage']\n\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\tstatus: 'failed',\n\t\t\t\tjob_id: jobId,\n\t\t\t\terror: isString(msg) ? msg : 'Textract job failed'\n\t\t\t})\n\t\t}\n\t\treturn textractExtractResultSchema.parse({\n\t\t\tstatus: 'pending',\n\t\t\tjob_id: jobId\n\t\t})\n\t}\n\n\tasync #writeExtractArtifact(key: string, text: string, filename?: string) {\n\t\tconst bytes = utf8ToBytes(text)\n\t\tawait this.#storage.putBytes(key, bytes, 'text/plain; charset=utf-8')\n\t\treturn {\n\t\t\tstore: 'object' as const,\n\t\t\tkey,\n\t\t\tmedia_type: 'text/plain',\n\t\t\tbyte_length: bytes.byteLength,\n\t\t\t...(filename && { filename: filename.replace(/\\.[^.]+$/, '') + '.txt' })\n\t\t}\n\t}\n\n\tasync #getJobPayload(jobId: string): Promise<Record<string, unknown>> {\n\t\tconst allBlocks: unknown[] = []\n\t\tlet nextToken: string | undefined\n\t\tlet jobStatus = 'IN_PROGRESS'\n\t\tlet page_count: number | undefined\n\n\t\tdo {\n\t\t\tconst body: Record<string, unknown> = {\n\t\t\t\tJobId: jobId,\n\t\t\t\tMaxResults: 1000,\n\t\t\t\t...(nextToken && { NextToken: nextToken })\n\t\t\t}\n\t\t\tconst page = await this.#call('Textract.GetDocumentTextDetection', body)\n\t\t\tconst status = page['JobStatus']\n\t\t\tif (isString(status)) jobStatus = status\n\n\t\t\tconst blocks = page['Blocks']\n\t\t\tif (isArray(blocks)) allBlocks.push(...blocks)\n\n\t\t\tconst meta = page['DocumentMetadata']\n\t\t\tif (isPlainObject(meta) && typeof meta['Pages'] === 'number') {\n\t\t\t\tpage_count = meta['Pages']\n\t\t\t}\n\n\t\t\tconst token = page['NextToken']\n\t\t\tnextToken = isString(token) && token.length > 0 ? token : undefined\n\t\t\tif (jobStatus !== 'SUCCEEDED' && jobStatus !== 'PARTIAL_SUCCESS') {\n\t\t\t\tnextToken = undefined\n\t\t\t}\n\t\t} while (nextToken)\n\n\t\treturn {\n\t\t\tJobStatus: jobStatus,\n\t\t\tBlocks: allBlocks,\n\t\t\t...(page_count !== undefined && { DocumentMetadata: { Pages: page_count } })\n\t\t}\n\t}\n\n\tasync #call(target: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n\t\tconst res = await this.#aws.post('/', JSON.stringify(body), {\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-amz-json-1.1',\n\t\t\t\t'X-Amz-Target': target\n\t\t\t},\n\t\t\tlabel: `Textract ${target}`,\n\t\t\t// Surface AWS __type / Message instead of a bare \"HTTP 400\"\n\t\t\tnoThrow: true\n\t\t})\n\t\t// ofetch does not JSON-parse application/x-amz-json-1.1 (returns Blob/string)\n\t\tconst payload = await parseAwsJsonBody(res.data)\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(formatTextractError(target, res.status, payload), {\n\t\t\t\tcode: res.status === 401 || res.status === 403 ? 'bad_auth' : 'upstream',\n\t\t\t\tretryable: res.status >= 500 || res.status === 429,\n\t\t\t\tdetails: {\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t...(isPlainObject(payload) && isString(payload['__type']) && { aws_type: payload['__type'] }),\n\t\t\t\t\tbucket: this.#auth.bucket,\n\t\t\t\t\tregion: this.#auth.region\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (!isPlainObject(payload)) {\n\t\t\tthrow new ToolError('Textract returned a non-object payload', { code: 'upstream' })\n\t\t}\n\t\treturn payload\n\t}\n}\n\nfunction presentOpts(\n\toutput: TextractExtractTextInput['output'],\n\tdestinationKey: string | undefined,\n\tchunk: TextractExtractTextInput['chunk'],\n\tsourceKey: string | undefined\n): PresentOptions {\n\tconst opts: PresentOptions = {}\n\tif (output !== undefined) opts.output = output\n\tif (destinationKey !== undefined) opts.destination_key = destinationKey\n\tif (chunk !== undefined) {\n\t\tconst c: NonNullable<PresentOptions['chunk']> = {}\n\t\tif (chunk.max_chars !== undefined) c.max_chars = chunk.max_chars\n\t\tif (chunk.overlap !== undefined) c.overlap = chunk.overlap\n\t\topts.chunk = c\n\t}\n\tif (sourceKey !== undefined) opts.source_key = sourceKey\n\treturn opts\n}\n\nfunction formatTextractError(target: string, status: number, payload: unknown): string {\n\tif (isPlainObject(payload)) {\n\t\tconst type = isString(payload['__type']) ? payload['__type'].split('#').pop() : undefined\n\t\tconst message =\n\t\t\t(isString(payload['message']) && payload['message']) ||\n\t\t\t(isString(payload['Message']) && payload['Message']) ||\n\t\t\tundefined\n\t\tif (type && message) return `Textract ${target}: ${type}: ${message}`\n\t\tif (message) return `Textract ${target}: ${message}`\n\t\tif (type) return `Textract ${target}: ${type} (HTTP ${status})`\n\t}\n\treturn `Textract ${target} failed with HTTP ${status}`\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { TextractClient } from './client'\nimport {\n\ttextractAuthSchema,\n\ttextractExtractResultSchema,\n\ttextractExtractTextBatchInputSchema,\n\ttextractExtractTextBatchOutputSchema,\n\ttextractExtractTextInputSchema,\n\ttextractStatusInputSchema\n} from './contracts'\n\nexport const textractExtractTextTool = defineTool({\n\tid: 'textract-extract-text',\n\tname: 'textractExtractText',\n\tdescription:\n\t\t'Extract text from a document ArtifactRef in S3 via Amazon Textract. Polls until done or timeout. Optional output: inline (default; fails if over size limit), artifact (write text to S3), or chunks (split for RAG). If still running after the wait budget, returns status pending and a job_id for textract-get-status. Source store must be object.',\n\tinputSchema: textractExtractTextInputSchema,\n\toutputSchema: textractExtractResultSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).extractText(input)\n})\n\nexport const textractGetStatusTool = defineTool({\n\tid: 'textract-get-status',\n\tname: 'textractGetStatus',\n\tdescription:\n\t\t'Check a Textract text-detection job by job_id from textract-extract-text. Same optional output modes as extract (inline, artifact, chunks). Does not start a new job.',\n\tinputSchema: textractStatusInputSchema,\n\toutputSchema: textractExtractResultSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).getStatus(input)\n})\n\nexport const textractExtractTextBatchTool = defineTool({\n\tid: 'textract-extract-text-batch',\n\tname: 'textractExtractTextBatch',\n\tdescription:\n\t\t'Extract text from up to 10 document ArtifactRefs via Amazon Textract with optional output modes (inline, artifact, chunks). Returns per-item status without aborting the batch.',\n\tinputSchema: textractExtractTextBatchInputSchema,\n\toutputSchema: textractExtractTextBatchOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).extractTextBatch(input)\n})\n\nexport const textractModule = defineModule({\n\tid: 'textract',\n\ttitle: 'Amazon Textract',\n\tdescription:\n\t\t'Amazon Textract vendor pack: async document text detection from S3 objects with inline, artifact, and chunks output modes (batch supported). Full Textract surface can grow over time.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: textractAuthSchema },\n\tcategories: ['documents', 'ocr', 'aws'],\n\tclassification: 'pii',\n\ttags: ['textract'],\n\ttools: [textractExtractTextTool, textractGetStatusTool, textractExtractTextBatchTool]\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"textract-CthgcP6w.js","names":["#auth","#aws","#storage","#signal","#keyPrefix","#extractRaw","#writeExtractArtifact","#statusRaw","#call","#getJobPayload"],"sources":["../src/vendors/textract/contracts.ts","../src/vendors/textract/domain.ts","../src/vendors/textract/client.ts","../src/vendors/textract/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { artifactRefSchema } from '../../shared/artifact'\nimport { batchResultSchema } from '../../shared/batch'\n\nexport const MAX_BATCH_EXTRACT = 10\nexport const DEFAULT_POLL_TIMEOUT_MS = 60_000\nexport const DEFAULT_POLL_INTERVAL_MS = 2_000\nexport const MAX_POLL_TIMEOUT_MS = 900_000\nexport const MAX_POLL_INTERVAL_MS = 30_000\n\n/** Hard cap for inline extract text returned to the model. */\nexport const MAX_INLINE_EXTRACT_CHARS = 100_000\nexport const DEFAULT_EXTRACT_CHUNK_MAX_CHARS = 1_200\nexport const DEFAULT_EXTRACT_CHUNK_OVERLAP = 200\nexport const MAX_EXTRACT_CHUNK_MAX_CHARS = 8_000\n\nexport const textractAuthSchema = z.object({\n\taccess_key_id: z.string().min(1).describe('AWS access key id'),\n\tsecret_access_key: z.string().min(1).describe('AWS secret access key'),\n\tregion: z.string().min(1).describe('AWS region for Textract and the source S3 bucket'),\n\tbucket: z.string().min(1).describe('AWS S3 bucket containing source documents'),\n\tsession_token: z.string().min(1).optional().describe('Optional session token'),\n\tkey_prefix: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Optional object-key root matching the bound S3 storage (no leading slash). ArtifactRef.key is logical; DocumentLocation uses the wire key under this prefix.'\n\t\t),\n\tpoll_timeout_ms: z\n\t\t.int()\n\t\t.min(1_000)\n\t\t.max(MAX_POLL_TIMEOUT_MS)\n\t\t.optional()\n\t\t.describe('Max time to wait for Textract before returning pending plus job_id (default 60000)'),\n\tpoll_interval_ms: z\n\t\t.int()\n\t\t.min(200)\n\t\t.max(MAX_POLL_INTERVAL_MS)\n\t\t.optional()\n\t\t.describe('Delay between GetDocumentTextDetection polls (default 2000)')\n})\n\nexport type TextractAuth = z.infer<typeof textractAuthSchema>\n\nexport const textractOutputModeSchema = z\n\t.enum(['inline', 'artifact', 'chunks'])\n\t.describe(\n\t\t'How to return extracted text: inline (default, fails if over inline limit), artifact (write to object storage), chunks (split for RAG handoff)'\n\t)\n\nexport type TextractOutputMode = z.infer<typeof textractOutputModeSchema>\n\nexport const textractChunkOptionsSchema = z.object({\n\tmax_chars: z\n\t\t.int()\n\t\t.min(200)\n\t\t.max(MAX_EXTRACT_CHUNK_MAX_CHARS)\n\t\t.optional()\n\t\t.describe(`Chunk size in characters (default ${DEFAULT_EXTRACT_CHUNK_MAX_CHARS})`),\n\toverlap: z\n\t\t.int()\n\t\t.min(0)\n\t\t.max(2_000)\n\t\t.optional()\n\t\t.describe(`Overlap in characters between chunks (default ${DEFAULT_EXTRACT_CHUNK_OVERLAP})`)\n})\n\nexport const textractTextChunkSchema = z.object({\n\tid: z.string().describe('Stable chunk id (document-scoped)'),\n\tindex: z.number().int().nonnegative(),\n\ttext: z.string().describe('Chunk text')\n})\n\nexport type TextractTextChunk = z.infer<typeof textractTextChunkSchema>\n\nconst outputModeFields = {\n\toutput: textractOutputModeSchema.optional(),\n\tdestination_key: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Object key for artifact mode (logical under key_prefix when set). Default extracts/{job_id}.txt'),\n\tchunk: textractChunkOptionsSchema.optional().describe('Chunking options when output is chunks')\n}\n\nexport const textractExtractResultSchema = z.object({\n\tstatus: z.enum(['succeeded', 'pending', 'failed']).describe('Job status'),\n\tjob_id: z.string().optional().describe('Textract job id when started or polled'),\n\ttext: z.string().optional().describe('Extracted LINE text when succeeded and output is inline'),\n\tpage_count: z.int().optional().describe('Document page count when known'),\n\terror: z.string().optional().describe('Failure message when status is failed'),\n\tsource: artifactRefSchema.optional().describe('Source ArtifactRef when known'),\n\toutput: textractOutputModeSchema.optional().describe('Presentation mode used for this result'),\n\tartifact: artifactRefSchema\n\t\t.optional()\n\t\t.describe('Object-store ArtifactRef when output is artifact and status is succeeded'),\n\tchunks: z\n\t\t.array(textractTextChunkSchema)\n\t\t.optional()\n\t\t.describe('Text chunks when output is chunks and status is succeeded')\n})\n\nexport const textractExtractTextInputSchema = z.object({\n\tsource: artifactRefSchema.describe('Document ArtifactRef in object storage (store must be object)'),\n\t...outputModeFields\n})\n\nexport const textractExtractTextBatchInputSchema = z.object({\n\tsources: z\n\t\t.array(artifactRefSchema)\n\t\t.min(1)\n\t\t.max(MAX_BATCH_EXTRACT)\n\t\t.describe('Document ArtifactRefs to extract (max 10)'),\n\t...outputModeFields,\n\tdestination_key_prefix: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Prefix for per-item artifact keys in batch artifact mode (default extracts/)')\n})\n\nexport const textractStatusInputSchema = z.object({\n\tjob_id: z.string().min(1).describe('Job id from a prior extract call'),\n\t...outputModeFields\n})\n\nexport const textractExtractTextBatchOutputSchema = batchResultSchema(textractExtractResultSchema)\n\nexport type TextractExtractResult = z.infer<typeof textractExtractResultSchema>\nexport type TextractExtractTextInput = z.infer<typeof textractExtractTextInputSchema>\nexport type TextractExtractTextBatchInput = z.infer<typeof textractExtractTextBatchInputSchema>\nexport type TextractStatusInput = z.infer<typeof textractStatusInputSchema>\nexport type TextractExtractTextBatchOutput = z.infer<typeof textractExtractTextBatchOutputSchema>\n","/**\n * Textract payload helpers + extract presentation (no HTTP).\n * inline | artifact | chunks — product logic lives in the vendor, not the seam.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\nimport { isArray } from 'es-toolkit/compat'\n\nimport { ToolError } from '../../core/errors'\nimport type { ArtifactRef } from '../../shared/artifact'\nimport { DEFAULT_EXTRACT_CHUNK_MAX_CHARS, DEFAULT_EXTRACT_CHUNK_OVERLAP, MAX_INLINE_EXTRACT_CHARS } from './contracts'\nimport type { TextractExtractResult, TextractOutputMode, TextractTextChunk } from './contracts'\n\nexport function lineTextFromBlocks(payload: Record<string, unknown>): {\n\ttext: string\n\tpage_count?: number\n} {\n\tconst blocks = payload['Blocks']\n\tconst lines: string[] = []\n\tif (isArray(blocks)) {\n\t\tfor (const block of blocks) {\n\t\t\tif (!isPlainObject(block)) continue\n\t\t\tif (block['BlockType'] !== 'LINE') continue\n\t\t\tconst t = block['Text']\n\t\t\tif (isString(t) && t.length > 0) lines.push(t)\n\t\t}\n\t}\n\tconst meta = payload['DocumentMetadata']\n\tlet page_count: number | undefined\n\tif (isPlainObject(meta) && typeof meta['Pages'] === 'number' && Number.isFinite(meta['Pages'])) {\n\t\tpage_count = meta['Pages']\n\t}\n\treturn {\n\t\ttext: lines.join('\\n'),\n\t\t...(page_count !== undefined && { page_count })\n\t}\n}\n\nexport function mapJobStatus(jobStatus: string): 'succeeded' | 'pending' | 'failed' {\n\tif (jobStatus === 'SUCCEEDED' || jobStatus === 'PARTIAL_SUCCESS') return 'succeeded'\n\tif (jobStatus === 'FAILED') return 'failed'\n\treturn 'pending'\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException('Aborted', 'AbortError'))\n\t\t\treturn\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener('abort', onAbort)\n\t\t\tresolve()\n\t\t}, ms)\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer)\n\t\t\treject(new DOMException('Aborted', 'AbortError'))\n\t\t}\n\t\tsignal?.addEventListener('abort', onAbort, { once: true })\n\t})\n}\n\nexport type PresentOptions = {\n\toutput?: TextractOutputMode\n\tdestination_key?: string\n\tchunk?: { max_chars?: number; overlap?: number }\n\t/** Source key hint for default artifact destination. */\n\tsource_key?: string\n}\n\n/**\n * Apply output mode to a raw extract result.\n * - inline: fail with too_large when text exceeds MAX_INLINE_EXTRACT_CHARS\n * - artifact: caller must pass writeArtifact; text is stripped from the result\n * - chunks: split text for RAG handoff; full text stripped\n */\nexport async function presentExtractResult(\n\traw: TextractExtractResult,\n\toptions: PresentOptions,\n\twriteArtifact?: (key: string, text: string) => Promise<ArtifactRef>\n): Promise<TextractExtractResult> {\n\tconst mode: TextractOutputMode = options.output ?? 'inline'\n\n\tif (raw.status !== 'succeeded' || raw.text === undefined) {\n\t\treturn baseResult(raw, mode)\n\t}\n\n\tconst text = raw.text\n\n\tif (mode === 'inline') {\n\t\tif (text.length > MAX_INLINE_EXTRACT_CHARS) {\n\t\t\tthrow new ToolError(\n\t\t\t\t`Extracted text exceeds inline limit (${MAX_INLINE_EXTRACT_CHARS} characters); use output: \"artifact\" or \"chunks\"`,\n\t\t\t\t{\n\t\t\t\t\tcode: 'too_large',\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmax_inline_chars: MAX_INLINE_EXTRACT_CHARS,\n\t\t\t\t\t\tchar_count: text.length,\n\t\t\t\t\t\tsuggested_output: 'artifact'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\treturn baseResult(raw, 'inline')\n\t}\n\n\tif (mode === 'chunks') {\n\t\tconst maxChars = options.chunk?.max_chars ?? DEFAULT_EXTRACT_CHUNK_MAX_CHARS\n\t\tconst overlap = options.chunk?.overlap ?? DEFAULT_EXTRACT_CHUNK_OVERLAP\n\t\tconst pieces = chunkText(text, { max_chars: maxChars, overlap })\n\t\tconst docId = options.source_key ?? raw.job_id ?? 'extract'\n\t\tconst chunks: TextractTextChunk[] = pieces.map((piece, index) => ({\n\t\t\tid: chunkId(docId, index),\n\t\t\tindex,\n\t\t\ttext: piece\n\t\t}))\n\t\tconst out = baseResult(raw, 'chunks')\n\t\tdelete out.text\n\t\tout.chunks = chunks\n\t\treturn out\n\t}\n\n\t// artifact\n\tif (!writeArtifact) {\n\t\tthrow new ToolError('Artifact output requires object storage credentials on extract auth', {\n\t\t\tcode: 'bad_auth'\n\t\t})\n\t}\n\tconst key =\n\t\toptions.destination_key ?? `extracts/${raw.job_id ?? sanitizeKeySegment(options.source_key ?? 'document')}.txt`\n\tconst artifact = await writeArtifact(key, text)\n\tconst out = baseResult(raw, 'artifact')\n\tdelete out.text\n\tout.artifact = artifact\n\treturn out\n}\n\nfunction baseResult(raw: TextractExtractResult, mode: TextractOutputMode): TextractExtractResult {\n\tconst out: TextractExtractResult = {\n\t\tstatus: raw.status,\n\t\toutput: mode\n\t}\n\tif (raw.job_id !== undefined) out.job_id = raw.job_id\n\tif (raw.text !== undefined) out.text = raw.text\n\tif (raw.page_count !== undefined) out.page_count = raw.page_count\n\tif (raw.error !== undefined) out.error = raw.error\n\tif (raw.source !== undefined) out.source = raw.source\n\treturn out\n}\n\nfunction sanitizeKeySegment(value: string): string {\n\tconst base = value.replace(/^.*\\//, '').replace(/[^\\w.-]+/g, '_')\n\treturn base.length > 0 ? base.slice(0, 120) : 'document'\n}\n\nfunction chunkId(documentId: string, index: number): string {\n\treturn `${documentId}#${index}`\n}\n\n/** Overlapping character windows; prefers paragraph/newline soft breaks. */\nfunction chunkText(text: string, options: { max_chars: number; overlap: number }): string[] {\n\tconst maxChars = options.max_chars\n\tconst overlap = Math.min(options.overlap, Math.max(0, maxChars - 1))\n\tconst normalized = text.replace(/\\r\\n/g, '\\n').trim()\n\tif (normalized.length === 0) return []\n\tif (normalized.length <= maxChars) return [normalized]\n\n\tconst chunks: string[] = []\n\tlet start = 0\n\twhile (start < normalized.length) {\n\t\tlet end = Math.min(start + maxChars, normalized.length)\n\t\tif (end < normalized.length) {\n\t\t\tconst window = normalized.slice(start, end)\n\t\t\tconst para = window.lastIndexOf('\\n\\n')\n\t\t\tconst line = window.lastIndexOf('\\n')\n\t\t\tconst soft = para >= maxChars * 0.5 ? para : line >= maxChars * 0.5 ? line : -1\n\t\t\tif (soft > 0) {\n\t\t\t\tend = start + soft\n\t\t\t}\n\t\t}\n\t\tconst piece = normalized.slice(start, end).trim()\n\t\tif (piece.length > 0) chunks.push(piece)\n\t\tif (end >= normalized.length) break\n\t\tconst next = end - overlap\n\t\tstart = next <= start ? end : next\n\t}\n\treturn chunks\n}\n","/**\n * Amazon Textract vendor client (async text detection + presentation).\n * Host: `new TextractClient(auth)`. Agent tools: `fromContext(ctx)`.\n * Output modes (inline | artifact | chunks) live here — not in the seam module.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\nimport { isArray } from 'es-toolkit/compat'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { runBatchItems } from '../../shared/batch'\nimport { utf8ToBytes } from '../../shared/bytes'\nimport { parseAwsJsonBody } from '../../transport/aws-json'\nimport { AwsService } from '../../transport/aws-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport { normalizeKeyPrefix, resolveObjectKey } from '../_storage'\nimport { S3Client } from '../s3'\nimport type {\n\tTextractAuth,\n\tTextractExtractResult,\n\tTextractExtractTextBatchInput,\n\tTextractExtractTextBatchOutput,\n\tTextractExtractTextInput,\n\tTextractStatusInput\n} from './contracts'\nimport {\n\tDEFAULT_POLL_INTERVAL_MS,\n\tDEFAULT_POLL_TIMEOUT_MS,\n\ttextractAuthSchema,\n\ttextractExtractResultSchema\n} from './contracts'\nimport { lineTextFromBlocks, mapJobStatus, presentExtractResult, sleep } from './domain'\nimport type { PresentOptions } from './domain'\n\nexport type TextractClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class TextractClient {\n\treadonly #auth: TextractAuth\n\treadonly #aws: AwsService\n\treadonly #storage: S3Client\n\treadonly #signal: AbortSignal | undefined\n\t/** Normalized key_prefix with trailing `/`, or undefined when unbound. */\n\treadonly #keyPrefix: string | undefined\n\n\tconstructor(auth: TextractAuth, options: TextractClientOptions = {}) {\n\t\tconst parsed = textractAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Textract auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#auth = parsed.data\n\t\tthis.#keyPrefix = parsed.data.key_prefix !== undefined ? normalizeKeyPrefix(parsed.data.key_prefix) : undefined\n\t\tthis.#signal = options.signal\n\t\tthis.#aws = new AwsService({\n\t\t\t...options,\n\t\t\taccessKeyId: this.#auth.access_key_id,\n\t\t\tsecretAccessKey: this.#auth.secret_access_key,\n\t\t\tregion: this.#auth.region,\n\t\t\tservice: 'textract',\n\t\t\tbaseURL: `https://textract.${this.#auth.region}.amazonaws.com`,\n\t\t\tlabel: 'Textract',\n\t\t\t...(this.#auth.session_token && { sessionToken: this.#auth.session_token })\n\t\t})\n\t\tthis.#storage = new S3Client(\n\t\t\t{\n\t\t\t\taccess_key_id: this.#auth.access_key_id,\n\t\t\t\tsecret_access_key: this.#auth.secret_access_key,\n\t\t\t\tregion: this.#auth.region,\n\t\t\t\tbucket: this.#auth.bucket,\n\t\t\t\t...(this.#auth.session_token && { session_token: this.#auth.session_token }),\n\t\t\t\t...(this.#auth.key_prefix && { key_prefix: this.#auth.key_prefix })\n\t\t\t},\n\t\t\toptions\n\t\t)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): TextractClient {\n\t\tconst auth = requireAuth(ctx, textractAuthSchema)\n\t\treturn new TextractClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\t/** StartDocumentTextDetection + poll until done, failed, or timeout → pending; then present. */\n\tasync extractText(input: TextractExtractTextInput): Promise<TextractExtractResult> {\n\t\tconst raw = await this.#extractRaw(input.source)\n\t\treturn presentExtractResult(\n\t\t\traw,\n\t\t\tpresentOpts(input.output, input.destination_key, input.chunk, input.source.key),\n\t\t\t(key, text) => this.#writeExtractArtifact(key, text, input.source.filename)\n\t\t)\n\t}\n\n\t/** GetDocumentTextDetection (paged) for an existing job; then present. */\n\tasync getStatus(input: TextractStatusInput): Promise<TextractExtractResult> {\n\t\tconst raw = await this.#statusRaw(input.job_id)\n\t\treturn presentExtractResult(\n\t\t\traw,\n\t\t\tpresentOpts(input.output, input.destination_key, input.chunk, raw.source?.key),\n\t\t\t(key, text) => this.#writeExtractArtifact(key, text, raw.source?.filename)\n\t\t)\n\t}\n\n\tasync extractTextBatch(input: TextractExtractTextBatchInput): Promise<TextractExtractTextBatchOutput> {\n\t\tconst prefix = input.destination_key_prefix ?? 'extracts/'\n\t\tconst rawBatch = await runBatchItems(input.sources, (source) => this.#extractRaw(source))\n\t\tconst results: TextractExtractTextBatchOutput['results'] = []\n\t\tlet succeeded = 0\n\t\tlet failed = 0\n\n\t\tfor (const row of rawBatch.results) {\n\t\t\tif (!row.ok || row.value === undefined) {\n\t\t\t\tresults.push(row)\n\t\t\t\tfailed += 1\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst source = input.sources[row.index]\n\t\t\tconst destKey =\n\t\t\t\tinput.destination_key ??\n\t\t\t\t`${prefix.replace(/\\/?$/, '/')}${source?.key.replace(/^.*\\//, '') || `item-${row.index}`}.txt`\n\t\t\ttry {\n\t\t\t\tconst presented = await presentExtractResult(\n\t\t\t\t\trow.value,\n\t\t\t\t\tpresentOpts(input.output, destKey, input.chunk, source?.key),\n\t\t\t\t\t(key, text) => this.#writeExtractArtifact(key, text, source?.filename)\n\t\t\t\t)\n\t\t\t\tresults.push({ index: row.index, ok: true, value: presented })\n\t\t\t\tsucceeded += 1\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : 'Presentation failed'\n\t\t\t\tconst code =\n\t\t\t\t\terror instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code : 'internal'\n\t\t\t\tresults.push({\n\t\t\t\t\tindex: row.index,\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: { code, message }\n\t\t\t\t})\n\t\t\t\tfailed += 1\n\t\t\t}\n\t\t}\n\n\t\treturn { results, succeeded, failed }\n\t}\n\n\tasync #extractRaw(source: TextractExtractTextInput['source']): Promise<TextractExtractResult> {\n\t\tif (source.store !== 'object') {\n\t\t\tthrow new ToolError('Textract requires source.store \"object\"', { code: 'bad_input' })\n\t\t}\n\n\t\t// Logical ArtifactRef.key → wire S3 object name under optional key_prefix.\n\t\tconst wireName = resolveObjectKey(source.key, this.#keyPrefix)\n\n\t\tlet start: Record<string, unknown>\n\t\ttry {\n\t\t\tstart = await this.#call('Textract.StartDocumentTextDetection', {\n\t\t\t\tDocumentLocation: {\n\t\t\t\t\tS3Object: {\n\t\t\t\t\t\tBucket: this.#auth.bucket,\n\t\t\t\t\t\tName: wireName\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (error instanceof ToolError) {\n\t\t\t\tthrow new ToolError(error.message, {\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tretryable: error.retryable,\n\t\t\t\t\tcause: error.cause,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\t...(isPlainObject(error.details) ? error.details : {}),\n\t\t\t\t\t\t// Surface logical key to callers (not wire path).\n\t\t\t\t\t\tkey: source.key\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\tconst jobId = start['JobId']\n\t\tif (!isString(jobId) || jobId.length === 0) {\n\t\t\tthrow new ToolError('Textract did not return a JobId', { code: 'upstream' })\n\t\t}\n\n\t\tconst timeoutMs = this.#auth.poll_timeout_ms ?? DEFAULT_POLL_TIMEOUT_MS\n\t\tconst intervalMs = this.#auth.poll_interval_ms ?? DEFAULT_POLL_INTERVAL_MS\n\t\tconst deadline = Date.now() + timeoutMs\n\n\t\ttry {\n\t\t\twhile (Date.now() < deadline) {\n\t\t\t\tconst payload = await this.#getJobPayload(jobId)\n\t\t\t\tconst statusRaw = payload['JobStatus']\n\t\t\t\tconst status = isString(statusRaw) ? mapJobStatus(statusRaw) : 'pending'\n\n\t\t\t\tif (status === 'succeeded') {\n\t\t\t\t\tconst lines = lineTextFromBlocks(payload)\n\t\t\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\t\t\tstatus: 'succeeded',\n\t\t\t\t\t\tjob_id: jobId,\n\t\t\t\t\t\ttext: lines.text,\n\t\t\t\t\t\t...(lines.page_count !== undefined && { page_count: lines.page_count }),\n\t\t\t\t\t\tsource\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (status === 'failed') {\n\t\t\t\t\tconst msg = payload['StatusMessage']\n\t\t\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\tjob_id: jobId,\n\t\t\t\t\t\terror: isString(msg) ? msg : 'Textract job failed',\n\t\t\t\t\t\tsource\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst remaining = deadline - Date.now()\n\t\t\t\tif (remaining <= 0) break\n\t\t\t\tawait sleep(Math.min(intervalMs, remaining), this.#signal)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof ToolError) throw error\n\t\t\tif (error instanceof Error && error.name === 'AbortError') {\n\t\t\t\tthrow new ToolError('Textract extract was aborted', {\n\t\t\t\t\tcode: 'timeout',\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\treturn textractExtractResultSchema.parse({\n\t\t\tstatus: 'pending',\n\t\t\tjob_id: jobId,\n\t\t\tsource\n\t\t})\n\t}\n\n\tasync #statusRaw(jobId: string): Promise<TextractExtractResult> {\n\t\tconst payload = await this.#getJobPayload(jobId)\n\t\tconst statusRaw = payload['JobStatus']\n\t\tconst status = isString(statusRaw) ? mapJobStatus(statusRaw) : 'pending'\n\n\t\tif (status === 'succeeded') {\n\t\t\tconst lines = lineTextFromBlocks(payload)\n\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\tstatus: 'succeeded',\n\t\t\t\tjob_id: jobId,\n\t\t\t\ttext: lines.text,\n\t\t\t\t...(lines.page_count !== undefined && { page_count: lines.page_count })\n\t\t\t})\n\t\t}\n\t\tif (status === 'failed') {\n\t\t\tconst msg = payload['StatusMessage']\n\t\t\treturn textractExtractResultSchema.parse({\n\t\t\t\tstatus: 'failed',\n\t\t\t\tjob_id: jobId,\n\t\t\t\terror: isString(msg) ? msg : 'Textract job failed'\n\t\t\t})\n\t\t}\n\t\treturn textractExtractResultSchema.parse({\n\t\t\tstatus: 'pending',\n\t\t\tjob_id: jobId\n\t\t})\n\t}\n\n\tasync #writeExtractArtifact(key: string, text: string, filename?: string) {\n\t\tconst bytes = utf8ToBytes(text)\n\t\tawait this.#storage.putBytes(key, bytes, 'text/plain; charset=utf-8')\n\t\treturn {\n\t\t\tstore: 'object' as const,\n\t\t\tkey,\n\t\t\tmedia_type: 'text/plain',\n\t\t\tbyte_length: bytes.byteLength,\n\t\t\t...(filename && { filename: filename.replace(/\\.[^.]+$/, '') + '.txt' })\n\t\t}\n\t}\n\n\tasync #getJobPayload(jobId: string): Promise<Record<string, unknown>> {\n\t\tconst allBlocks: unknown[] = []\n\t\tlet nextToken: string | undefined\n\t\tlet jobStatus = 'IN_PROGRESS'\n\t\tlet page_count: number | undefined\n\n\t\tdo {\n\t\t\tconst body: Record<string, unknown> = {\n\t\t\t\tJobId: jobId,\n\t\t\t\tMaxResults: 1000,\n\t\t\t\t...(nextToken && { NextToken: nextToken })\n\t\t\t}\n\t\t\tconst page = await this.#call('Textract.GetDocumentTextDetection', body)\n\t\t\tconst status = page['JobStatus']\n\t\t\tif (isString(status)) jobStatus = status\n\n\t\t\tconst blocks = page['Blocks']\n\t\t\tif (isArray(blocks)) allBlocks.push(...blocks)\n\n\t\t\tconst meta = page['DocumentMetadata']\n\t\t\tif (isPlainObject(meta) && typeof meta['Pages'] === 'number') {\n\t\t\t\tpage_count = meta['Pages']\n\t\t\t}\n\n\t\t\tconst token = page['NextToken']\n\t\t\tnextToken = isString(token) && token.length > 0 ? token : undefined\n\t\t\tif (jobStatus !== 'SUCCEEDED' && jobStatus !== 'PARTIAL_SUCCESS') {\n\t\t\t\tnextToken = undefined\n\t\t\t}\n\t\t} while (nextToken)\n\n\t\treturn {\n\t\t\tJobStatus: jobStatus,\n\t\t\tBlocks: allBlocks,\n\t\t\t...(page_count !== undefined && { DocumentMetadata: { Pages: page_count } })\n\t\t}\n\t}\n\n\tasync #call(target: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {\n\t\tconst res = await this.#aws.post('/', JSON.stringify(body), {\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-amz-json-1.1',\n\t\t\t\t'X-Amz-Target': target\n\t\t\t},\n\t\t\tlabel: `Textract ${target}`,\n\t\t\t// Surface AWS __type / Message instead of a bare \"HTTP 400\"\n\t\t\tnoThrow: true\n\t\t})\n\t\t// ofetch does not JSON-parse application/x-amz-json-1.1 (returns Blob/string)\n\t\tconst payload = await parseAwsJsonBody(res.data)\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(formatTextractError(target, res.status, payload), {\n\t\t\t\tcode: res.status === 401 || res.status === 403 ? 'bad_auth' : 'upstream',\n\t\t\t\tretryable: res.status >= 500 || res.status === 429,\n\t\t\t\tdetails: {\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\t...(isPlainObject(payload) && isString(payload['__type']) && { aws_type: payload['__type'] }),\n\t\t\t\t\tbucket: this.#auth.bucket,\n\t\t\t\t\tregion: this.#auth.region\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (!isPlainObject(payload)) {\n\t\t\tthrow new ToolError('Textract returned a non-object payload', { code: 'upstream' })\n\t\t}\n\t\treturn payload\n\t}\n}\n\nfunction presentOpts(\n\toutput: TextractExtractTextInput['output'],\n\tdestinationKey: string | undefined,\n\tchunk: TextractExtractTextInput['chunk'],\n\tsourceKey: string | undefined\n): PresentOptions {\n\tconst opts: PresentOptions = {}\n\tif (output !== undefined) opts.output = output\n\tif (destinationKey !== undefined) opts.destination_key = destinationKey\n\tif (chunk !== undefined) {\n\t\tconst c: NonNullable<PresentOptions['chunk']> = {}\n\t\tif (chunk.max_chars !== undefined) c.max_chars = chunk.max_chars\n\t\tif (chunk.overlap !== undefined) c.overlap = chunk.overlap\n\t\topts.chunk = c\n\t}\n\tif (sourceKey !== undefined) opts.source_key = sourceKey\n\treturn opts\n}\n\nfunction formatTextractError(target: string, status: number, payload: unknown): string {\n\tif (isPlainObject(payload)) {\n\t\tconst type = isString(payload['__type']) ? payload['__type'].split('#').pop() : undefined\n\t\tconst message =\n\t\t\t(isString(payload['message']) && payload['message']) ||\n\t\t\t(isString(payload['Message']) && payload['Message']) ||\n\t\t\tundefined\n\t\tif (type && message) return `Textract ${target}: ${type}: ${message}`\n\t\tif (message) return `Textract ${target}: ${message}`\n\t\tif (type) return `Textract ${target}: ${type} (HTTP ${status})`\n\t}\n\treturn `Textract ${target} failed with HTTP ${status}`\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { TextractClient } from './client'\nimport {\n\ttextractAuthSchema,\n\ttextractExtractResultSchema,\n\ttextractExtractTextBatchInputSchema,\n\ttextractExtractTextBatchOutputSchema,\n\ttextractExtractTextInputSchema,\n\ttextractStatusInputSchema\n} from './contracts'\n\nexport const textractExtractTextTool = defineTool({\n\tid: 'textract-extract-text',\n\tname: 'textractExtractText',\n\tdescription:\n\t\t'Extract text from a document ArtifactRef in S3 via Amazon Textract. Polls until done or timeout. Optional output: inline (default; fails if over size limit), artifact (write text to S3), or chunks (split for RAG). If still running after the wait budget, returns status pending and a job_id for textract-get-status. Source store must be object.',\n\tinputSchema: textractExtractTextInputSchema,\n\toutputSchema: textractExtractResultSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).extractText(input)\n})\n\nexport const textractGetStatusTool = defineTool({\n\tid: 'textract-get-status',\n\tname: 'textractGetStatus',\n\tdescription:\n\t\t'Check a Textract text-detection job by job_id from textract-extract-text. Same optional output modes as extract (inline, artifact, chunks). Does not start a new job.',\n\tinputSchema: textractStatusInputSchema,\n\toutputSchema: textractExtractResultSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).getStatus(input)\n})\n\nexport const textractExtractTextBatchTool = defineTool({\n\tid: 'textract-extract-text-batch',\n\tname: 'textractExtractTextBatch',\n\tdescription:\n\t\t'Extract text from up to 10 document ArtifactRefs via Amazon Textract with optional output modes (inline, artifact, chunks). Returns per-item status without aborting the batch.',\n\tinputSchema: textractExtractTextBatchInputSchema,\n\toutputSchema: textractExtractTextBatchOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => TextractClient.fromContext(ctx).extractTextBatch(input)\n})\n\nexport const textractModule = defineModule({\n\tid: 'textract',\n\ttitle: 'Amazon Textract',\n\tdescription:\n\t\t'Amazon Textract vendor pack: async document text detection from S3 objects with inline, artifact, and chunks output modes (batch supported). Full Textract surface can grow over time.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: textractAuthSchema },\n\tcategories: ['documents', 'ocr', 'aws'],\n\tclassification: 'pii',\n\ttags: ['textract'],\n\ttools: [textractExtractTextTool, textractGetStatusTool, textractExtractTextBatchTool]\n})\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { n as defineModule, r as defineTool } from "./define-ieoksEQ0.js";
1
+ import { n as defineModule, r as defineTool } from "./define-DdFALdNf.js";
2
2
  import { n as requireAuth } from "./provider-CgDAlg6K.js";
3
3
  import { a as deleteVectorsOutputSchema, c as upsertVectorsInputSchema, i as deleteVectorsInputSchema, l as upsertVectorsOutputSchema, o as queryVectorsInputSchema, s as queryVectorsOutputSchema } from "./schemas-ChOAhdo9.js";
4
- import { a as MastraVectorClient, o as mastraVectorAuthSchema } from "./mastra-vector-B8HjvdMT.js";
5
- import { a as PineconeClient, o as pineconeAuthSchema } from "./pinecone-BvdXAZMi.js";
6
- import { a as QdrantClient, o as qdrantAuthSchema } from "./qdrant-D2E2Lxrw.js";
7
- import { a as SupabaseVectorClient, o as supabaseVectorAuthSchema } from "./supabase-vector-DT3qfnt2.js";
4
+ import { a as MastraVectorClient, o as mastraVectorAuthSchema } from "./mastra-vector-qKG3L-Rw.js";
5
+ import { a as PineconeClient, o as pineconeAuthSchema } from "./pinecone-tmtu3ZS5.js";
6
+ import { a as QdrantClient, o as qdrantAuthSchema } from "./qdrant-zbCHUsnv.js";
7
+ import { a as SupabaseVectorClient, o as supabaseVectorAuthSchema } from "./supabase-vector-CDKOyvj1.js";
8
8
  import { z } from "zod";
9
9
  //#region src/modules/vector-store/contracts.ts
10
10
  /**
@@ -190,4 +190,4 @@ const vectorStoreModule = defineModule({
190
190
  //#endregion
191
191
  export { VectorStoreClient as a, qdrantVectorAuthSchema as c, vectorStoreUpsertTool as i, supabaseVectorSeamAuthSchema as l, vectorStoreModule as n, mastraVectorSeamAuthSchema as o, vectorStoreQueryTool as r, pineconeVectorAuthSchema as s, vectorStoreDeleteTool as t, vectorStoreAuthSchema as u };
192
192
 
193
- //# sourceMappingURL=vector-store-CDQaQXFV.js.map
193
+ //# sourceMappingURL=vector-store-DrwuMOne.js.map