agents 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -1
- package/dist/{agent-routing-CnkaHb-v.d.ts → agent-routing-DE5zmCQ8.d.ts} +1038 -394
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-tool-types.d.ts +26 -26
- package/dist/{agent-tools-C0XJqWzB.d.ts → agent-tools-DtXMTDGM.d.ts} +7 -7
- package/dist/agent-tools.d.ts +21 -21
- package/dist/browser/ai.js +4 -1
- package/dist/browser/ai.js.map +1 -1
- package/dist/browser/tanstack-ai.js.map +1 -1
- package/dist/callable-decorator-DP__HhBA.d.ts +72 -0
- package/dist/callable-decorator.d.ts +18 -0
- package/dist/callable-decorator.js +71 -0
- package/dist/callable-decorator.js.map +1 -0
- package/dist/capability-BjSKYpzg.js.map +1 -1
- package/dist/capability-runner-Be_-PLR1.d.ts +459 -0
- package/dist/channel-Bnm4S7T2.d.ts +491 -0
- package/dist/channels/ai-sdk.d.ts +46 -0
- package/dist/channels/ai-sdk.js +120 -0
- package/dist/channels/ai-sdk.js.map +1 -0
- package/dist/channels/email.d.ts +95 -0
- package/dist/channels/email.js +323 -0
- package/dist/channels/email.js.map +1 -0
- package/dist/channels/index.d.ts +233 -0
- package/dist/channels/index.js +608 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/slack.d.ts +140 -0
- package/dist/channels/slack.js +614 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/tanstack-ai.d.ts +39 -0
- package/dist/channels/tanstack-ai.js +17 -0
- package/dist/channels/tanstack-ai.js.map +1 -0
- package/dist/channels/telegram.d.ts +106 -0
- package/dist/channels/telegram.js +427 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/voice.d.ts +45 -0
- package/dist/channels/voice.js +122 -0
- package/dist/channels/voice.js.map +1 -0
- package/dist/chat/index.d.ts +2325 -2019
- package/dist/chat/index.js +888 -518
- package/dist/chat/index.js.map +1 -1
- package/dist/chat-sdk/index.d.ts +7 -7
- package/dist/chat-sdk/index.js +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/context/index.d.ts +216 -0
- package/dist/context/index.js +454 -0
- package/dist/context/index.js.map +1 -0
- package/dist/{current-agent-CuMErtly.d.ts → current-agent-Da_C9a3b.d.ts} +90 -107
- package/dist/current-agent-DhoDkSnH.js.map +1 -1
- package/dist/{diagnostics-CaBjfz4J.js → diagnostics-BzvaX2UT.js} +5 -1
- package/dist/diagnostics-BzvaX2UT.js.map +1 -0
- package/dist/diagnostics-C4jcz3VK.js +360 -0
- package/dist/diagnostics-C4jcz3VK.js.map +1 -0
- package/dist/index-BB0kqhIz.d.ts +101 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-XDkuQ7zm.d.ts +89 -0
- package/dist/{index-DcSAZKsB.d.ts → index-YSKgfgg9.d.ts} +3 -1
- package/dist/index.d.ts +91 -82
- package/dist/index.js +3 -2
- package/dist/ingress-BfetZbMO.js +83 -0
- package/dist/ingress-BfetZbMO.js.map +1 -0
- package/dist/internal-CYlgHl1l.js +59 -0
- package/dist/internal-CYlgHl1l.js.map +1 -0
- package/dist/internal_context.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +35 -17
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle-CMRGjZdw.js +1299 -0
- package/dist/lifecycle-CMRGjZdw.js.map +1 -0
- package/dist/mcp/client/index.d.ts +20 -20
- package/dist/mcp/index.d.ts +35 -35
- package/dist/mcp/index.js +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.js +1 -1
- package/dist/react.d.ts +4 -4
- package/dist/{retries-CAvxtG9d.d.ts → retries-D9Ds-1lz.d.ts} +17 -6
- package/dist/retries.d.ts +8 -6
- package/dist/retries.js +13 -1
- package/dist/retries.js.map +1 -1
- package/dist/routing/index.d.ts +137 -0
- package/dist/routing/index.js +244 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/sanitize-D9TujEK8.js +79 -0
- package/dist/sanitize-D9TujEK8.js.map +1 -0
- package/dist/scheduler-DD9NdYbF.js +665 -0
- package/dist/scheduler-DD9NdYbF.js.map +1 -0
- package/dist/{scheduler-DQoTGoAW.d.ts → scheduler-Dwh85ZGl.d.ts} +21 -22
- package/dist/schedules/index.d.ts +1 -1
- package/dist/schedules/index.js +1 -1
- package/dist/sentence-chunker-BAidJ4DA.d.ts +68 -0
- package/dist/serializable.d.ts +1 -1
- package/dist/sessions/index.d.ts +441 -0
- package/dist/sessions/index.js +2063 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/skills/index.d.ts +99 -0
- package/dist/skills/index.js +254 -5
- package/dist/skills/index.js.map +1 -1
- package/dist/{src-5W6JNKVb.js → src-DlSHshb2.js} +1460 -1110
- package/dist/src-DlSHshb2.js.map +1 -0
- package/dist/streams/index.d.ts +120 -0
- package/dist/streams/index.js +107 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams-D6tJ0NN9.d.ts +370 -0
- package/dist/streams-DZKgAj9b.js +709 -0
- package/dist/streams-DZKgAj9b.js.map +1 -0
- package/dist/sub-routing.d.ts +12 -12
- package/dist/surface-bZZJqBka.js +17 -0
- package/dist/surface-bZZJqBka.js.map +1 -0
- package/dist/tasks/index.d.ts +64 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks-BRJ5zgya.d.ts +517 -0
- package/dist/tasks-ylZgBjhj.js +1656 -0
- package/dist/tasks-ylZgBjhj.js.map +1 -0
- package/dist/text-segment-joiner-BtAFQSA_.js +57 -0
- package/dist/text-segment-joiner-BtAFQSA_.js.map +1 -0
- package/dist/text-stream-CpdiKrJB.js +272 -0
- package/dist/text-stream-CpdiKrJB.js.map +1 -0
- package/dist/tokens-nHAKcN6M.js +52 -0
- package/dist/tokens-nHAKcN6M.js.map +1 -0
- package/dist/tool-schema-CBjGPrsQ.js +31 -0
- package/dist/tool-schema-CBjGPrsQ.js.map +1 -0
- package/dist/types-B7LojTe4.d.ts +202 -0
- package/dist/types-_Faxb570.d.ts +439 -0
- package/dist/voice/client.d.ts +226 -0
- package/dist/voice/client.js +932 -0
- package/dist/voice/client.js.map +1 -0
- package/dist/voice/errors.d.ts +43 -0
- package/dist/voice/errors.js +41 -0
- package/dist/voice/errors.js.map +1 -0
- package/dist/voice/index.d.ts +271 -0
- package/dist/voice/index.js +1812 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/react.d.ts +167 -0
- package/dist/voice/react.js +234 -0
- package/dist/voice/react.js.map +1 -0
- package/dist/voice/sfu.d.ts +71 -0
- package/dist/voice/sfu.js +157 -0
- package/dist/voice/sfu.js.map +1 -0
- package/dist/voice/text.d.ts +6 -0
- package/dist/voice/text.js +2 -0
- package/dist/voice/types.d.ts +58 -0
- package/dist/voice/types.js +18 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/voice/workers-ai.d.ts +136 -0
- package/dist/voice/workers-ai.js +568 -0
- package/dist/voice/workers-ai.js.map +1 -0
- package/dist/websockets/index.d.ts +192 -0
- package/dist/websockets/index.js +2 -0
- package/dist/websockets-DUfRHPRq.js +502 -0
- package/dist/websockets-DUfRHPRq.js.map +1 -0
- package/dist/workflow-types.d.ts +25 -25
- package/dist/workflows.d.ts +21 -21
- package/dist/workflows.js +1 -1
- package/docs/agent-class.md +2 -2
- package/docs/agent-tools.md +2 -1
- package/docs/channels.md +323 -0
- package/docs/chat-agents.md +6 -13
- package/docs/context.md +131 -0
- package/docs/index.md +15 -12
- package/docs/lifecycle.md +102 -55
- package/docs/long-running-agents.md +2 -2
- package/docs/mcp-servers.md +5 -1
- package/docs/resumable-streaming.md +1 -1
- package/docs/routing.md +105 -0
- package/docs/sessions.md +237 -871
- package/docs/streams.md +213 -0
- package/docs/sub-agents.md +184 -124
- package/docs/tasks.md +246 -0
- package/docs/voice.md +745 -0
- package/package.json +115 -13
- package/dist/capability-runner-CvHGZqUu.d.ts +0 -150
- package/dist/compaction-helpers-iiKMr2TQ.js +0 -340
- package/dist/compaction-helpers-iiKMr2TQ.js.map +0 -1
- package/dist/compaction-helpers-wUz6M3us.d.ts +0 -621
- package/dist/diagnostics-CaBjfz4J.js.map +0 -1
- package/dist/durable-object-lifecycle-D6nNQJJd.js +0 -862
- package/dist/durable-object-lifecycle-D6nNQJJd.js.map +0 -1
- package/dist/experimental/memory/session/index.d.ts +0 -671
- package/dist/experimental/memory/session/index.js +0 -2379
- package/dist/experimental/memory/session/index.js.map +0 -1
- package/dist/experimental/memory/utils/index.d.ts +0 -96
- package/dist/experimental/memory/utils/index.js +0 -79
- package/dist/experimental/memory/utils/index.js.map +0 -1
- package/dist/scheduler-CR9RHGos.js +0 -857
- package/dist/scheduler-CR9RHGos.js.map +0 -1
- package/dist/src-5W6JNKVb.js.map +0 -1
- package/dist/tool-output-truncation-CNnnGZQ3.js +0 -98
- package/dist/tool-output-truncation-CNnnGZQ3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","names":[],"sources":["../../src/channels/adapters/slack.ts"],"sourcesContent":["import type {\n Channel,\n ChannelApprovalRequest,\n ChannelChunk,\n ChannelMessage,\n ChannelRoute,\n ChannelStreamOptions,\n DeliveryResult\n} from \"../channel\";\nimport { collectText, consumeChunks, createPacer } from \"../stream\";\nimport type { ChannelIdentity } from \"../identity\";\nimport {\n isChannelMessageSurface,\n type ChannelMessageSurface\n} from \"../surface\";\nimport {\n matchesPath,\n type ChannelApprovalResponseInput,\n type ChannelInboundMessageInput,\n type ChannelIngress\n} from \"../ingress\";\nimport {\n defaultText,\n emptyIngressResponse,\n encodeUtf8,\n isRecord,\n renderInput,\n uncertain\n} from \"../internal\";\n\n/** The subset of a Slack event used by the adapter, with unknown fields retained. */\nexport type SlackEvent = {\n type?: string;\n user?: string;\n text?: string;\n ts?: string;\n thread_ts?: string;\n channel?: string;\n channel_type?: string;\n subtype?: string;\n bot_id?: string;\n app_id?: string;\n [key: string]: unknown;\n};\n\nexport type SlackAuthorization = {\n team_id?: string;\n user_id?: string;\n is_bot?: boolean;\n [key: string]: unknown;\n};\n\n/** A typed Slack Events API callback retained in an ingress envelope. */\nexport type SlackEventCallback = {\n type: \"event_callback\";\n event_id: string;\n team_id: string;\n event: SlackEvent;\n authorizations?: readonly SlackAuthorization[];\n [key: string]: unknown;\n};\n\n/** A typed Slack URL verification request. */\nexport type SlackUrlVerification = {\n type: \"url_verification\";\n challenge: string;\n [key: string]: unknown;\n};\n\nexport type SlackBlockAction = {\n action_id?: string;\n action_ts?: string;\n value?: string;\n [key: string]: unknown;\n};\n\n/** A typed Slack Block Kit interaction retained in an ingress envelope. */\nexport type SlackBlockActions = {\n type: \"block_actions\";\n team?: { id?: string; [key: string]: unknown };\n user?: {\n id?: string;\n username?: string;\n name?: string;\n [key: string]: unknown;\n };\n channel?: { id?: string; [key: string]: unknown };\n message?: {\n ts?: string;\n thread_ts?: string;\n [key: string]: unknown;\n };\n container?: {\n channel_id?: string;\n message_ts?: string;\n thread_ts?: string;\n [key: string]: unknown;\n };\n actions?: readonly SlackBlockAction[];\n [key: string]: unknown;\n};\n\n/** Authenticated Slack payloads which may be passed to a Channel route. */\nexport type SlackIngressPayload = SlackEventCallback | SlackBlockActions;\n\n/** Authenticated JSON payloads handled before routable events are emitted. */\ntype SlackJsonPayload = SlackEventCallback | SlackUrlVerification;\n\nexport type SlackWebhookOptions = {\n /** Slack app signing secret. */\n signingSecret: string;\n /** Exact webhook pathname accepted by this ingress. @default \"/webhooks/slack\" */\n path?: string;\n /** Maximum accepted request timestamp skew in seconds. @default 300 */\n maxSkewSeconds?: number;\n /** Bot user id used to discard events sent by this app. */\n botUserId?: string;\n};\n\nexport type SlackMessageSurface = ChannelMessageSurface<\n string,\n | {\n channelId: string;\n threadTs?: string;\n /** The reader a channel stream is rendered for. Slack requires it. */\n recipientUserId?: string;\n recipientTeamId?: string;\n }\n | { teamId: string; userId: string }\n>;\n\n/** Configuration for a Slack Channel. */\nexport type SlackChannelOptions = {\n /** Bot token used with chat.postMessage. */\n botToken: string;\n /** Slack Web API origin. @default \"https://slack.com/api\" */\n apiBaseUrl?: string;\n /** Project canonical Channel Markdown into Slack mrkdwn text. */\n toText?: (message: ChannelMessage) => string;\n /**\n * Smallest gap between `chat.appendStream` calls. Chunks produced inside\n * one interval are appended together. @default 500\n */\n streamIntervalMs?: number;\n /** Add signed Slack HTTP ingress to the returned Channel. */\n webhook?: SlackWebhookOptions;\n /** Select an application route from the event, exact payload, and Host context. */\n route?: ChannelRoute<SlackIngressPayload>;\n /** Override fetch for testing or custom network routing. */\n fetch?: typeof globalThis.fetch;\n};\n\ntype SlackApiResponse = {\n ok?: unknown;\n error?: unknown;\n channel?: unknown;\n ts?: unknown;\n};\n\ntype SlackOpenConversationResponse = {\n ok?: unknown;\n error?: unknown;\n channel?: { id?: unknown };\n};\n\ntype ApprovalValue = {\n v: 1;\n interactionId: string;\n decision: \"approve\" | \"reject\";\n};\n\nconst DEFAULT_SLACK_WEBHOOK_PATH = \"/webhooks/slack\";\nconst DEFAULT_MAX_SKEW_SECONDS = 5 * 60;\nconst APPROVE_ACTION_ID = \"cloudflare_channels_approve_v1\";\nconst REJECT_ACTION_ID = \"cloudflare_channels_reject_v1\";\nconst DEFAULT_STREAM_INTERVAL_MS = 500;\nconst SLACK_APPEND_LIMIT = 12_000;\nconst SLACK_TASK_FIELD_LIMIT = 256;\nconst SLACK_CONTEXT_LIMIT = 3000;\nconst AMBIGUOUS_SLACK_ERRORS = new Set([\n \"fatal_error\",\n \"internal_error\",\n \"request_timeout\",\n \"service_unavailable\"\n]);\n\nfunction approvalText(request: ChannelApprovalRequest): string {\n return [\n ...(request.title ? [request.title] : []),\n request.summary,\n `Input:\\n\\`\\`\\`\\n${renderInput(request.input)}\\n\\`\\`\\``\n ].join(\"\\n\\n\");\n}\n\nfunction channelIdentity(teamId: string, channelId: string): string {\n return `slack:${teamId}:channel:${channelId}`;\n}\n\nfunction messageIdentity(\n teamId: string,\n channelId: string,\n timestamp: string\n): string {\n return `${channelIdentity(teamId, channelId)}:message:${timestamp}`;\n}\n\nfunction outboundReference(channelId: string, timestamp: string): string {\n return `slack:channel:${channelId}:message:${timestamp}`;\n}\n\nfunction replySurfaceLabel(\n channelId: string,\n threadTimestamp: string | undefined\n): string {\n return threadTimestamp\n ? `Slack · ${channelId} · thread ${threadTimestamp}`\n : `Slack · ${channelId}`;\n}\n\nfunction threadIdentity(\n teamId: string,\n channelId: string,\n timestamp: string,\n threadTimestamp: string | undefined,\n isDirectMessage: boolean\n): string {\n const channel = channelIdentity(teamId, channelId);\n if (isDirectMessage && threadTimestamp === undefined) return channel;\n return `${channel}:thread:${threadTimestamp ?? timestamp}`;\n}\n\nfunction slackTimestamp(timestamp: string): string | undefined {\n const milliseconds = Number(timestamp) * 1000;\n if (!Number.isFinite(milliseconds)) return undefined;\n try {\n return new Date(milliseconds).toISOString();\n } catch {\n return undefined;\n }\n}\n\nfunction selfUserIds(\n payload: SlackEventCallback,\n configuredBotUserId: string | undefined\n): Set<string> {\n const ids = new Set<string>();\n if (configuredBotUserId) ids.add(configuredBotUserId);\n if (Array.isArray(payload.authorizations)) {\n for (const authorization of payload.authorizations) {\n if (\n authorization?.is_bot === true &&\n typeof authorization.user_id === \"string\"\n ) {\n ids.add(authorization.user_id);\n }\n }\n }\n return ids;\n}\n\nfunction normalizedEvent(\n payload: SlackEventCallback,\n configuredBotUserId: string | undefined\n): ChannelInboundMessageInput | undefined {\n const event = payload.event;\n if (!event || !isRecord(event)) return undefined;\n\n if (event.type !== \"app_mention\" && event.type !== \"message\") {\n return undefined;\n }\n const isMention = event.type === \"app_mention\";\n const isDirectMessage =\n event.type === \"message\" && event.channel_type === \"im\";\n\n if (\n event.subtype !== undefined ||\n typeof event.bot_id === \"string\" ||\n typeof event.app_id === \"string\"\n ) {\n return undefined;\n }\n\n const teamId = payload.team_id;\n const eventId = payload.event_id;\n const channelId = event.channel;\n const actorId = event.user;\n const text = event.text;\n const timestamp = event.ts;\n if (\n typeof teamId !== \"string\" ||\n typeof eventId !== \"string\" ||\n typeof channelId !== \"string\" ||\n typeof actorId !== \"string\" ||\n typeof text !== \"string\" ||\n typeof timestamp !== \"string\"\n ) {\n return undefined;\n }\n\n if (selfUserIds(payload, configuredBotUserId).has(actorId)) {\n return undefined;\n }\n\n const threadTimestamp =\n typeof event.thread_ts === \"string\" ? event.thread_ts : undefined;\n const sentAt = slackTimestamp(timestamp);\n return {\n type: \"message\",\n eventId: `slack:${teamId}:event:${eventId}`,\n thread: {\n id: threadIdentity(\n teamId,\n channelId,\n timestamp,\n threadTimestamp,\n isDirectMessage\n ),\n isDirectMessage\n },\n replySurface: {\n version: 1,\n address: {\n teamId,\n channelId,\n ...((threadTimestamp || !isDirectMessage) && {\n threadTs: threadTimestamp ?? timestamp\n }),\n // Preserve the reader even for a known DM conversation so outbound\n // routing can distinguish it from a top-level public channel.\n recipientUserId: actorId,\n recipientTeamId: teamId\n },\n label: replySurfaceLabel(\n channelId,\n threadTimestamp ?? (isDirectMessage ? undefined : timestamp)\n )\n },\n actor: {\n id: `slack:${teamId}:user:${actorId}`,\n identity: {\n scope: teamId,\n subject: actorId\n },\n isBot: false,\n isSelf: false\n },\n message: {\n id: messageIdentity(teamId, channelId, timestamp),\n text,\n markdown: text,\n ...(isMention && { isMention: true }),\n ...(threadTimestamp &&\n threadTimestamp !== timestamp && {\n reply: {\n id: messageIdentity(teamId, channelId, threadTimestamp)\n }\n }),\n ...(sentAt && { metadata: { sentAt } })\n }\n };\n}\n\nfunction parseApprovalValue(value: string): ApprovalValue | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n return undefined;\n }\n if (\n !isRecord(parsed) ||\n parsed.v !== 1 ||\n typeof parsed.interactionId !== \"string\" ||\n !parsed.interactionId ||\n (parsed.decision !== \"approve\" && parsed.decision !== \"reject\")\n ) {\n return undefined;\n }\n return parsed as ApprovalValue;\n}\n\nasync function sha256Hex(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", encodeUtf8(value));\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\")\n ).join(\"\");\n}\n\nasync function normalizedInteractions(\n payload: SlackBlockActions,\n rawBody: string\n): Promise<readonly ChannelApprovalResponseInput[]> {\n const teamId = payload.team?.id;\n const actorId = payload.user?.id;\n const channelId =\n typeof payload.channel?.id === \"string\"\n ? payload.channel.id\n : payload.container?.channel_id;\n const timestamp =\n typeof payload.message?.ts === \"string\"\n ? payload.message.ts\n : payload.container?.message_ts;\n if (\n typeof teamId !== \"string\" ||\n typeof actorId !== \"string\" ||\n typeof channelId !== \"string\" ||\n typeof timestamp !== \"string\" ||\n !Array.isArray(payload.actions)\n ) {\n return [];\n }\n\n const threadTimestamp =\n typeof payload.message?.thread_ts === \"string\"\n ? payload.message.thread_ts\n : typeof payload.container?.thread_ts === \"string\"\n ? payload.container.thread_ts\n : undefined;\n const isDirectMessage = channelId.startsWith(\"D\");\n const bodyHash = await sha256Hex(rawBody);\n const events: ChannelApprovalResponseInput[] = [];\n\n for (const [index, action] of payload.actions.entries()) {\n if (!action || typeof action.value !== \"string\") continue;\n const expectedDecision =\n action.action_id === APPROVE_ACTION_ID\n ? \"approve\"\n : action.action_id === REJECT_ACTION_ID\n ? \"reject\"\n : undefined;\n if (!expectedDecision) continue;\n\n const approval = parseApprovalValue(action.value);\n if (!approval || approval.decision !== expectedDecision) continue;\n\n const stableEventId = `slack:${teamId}:interaction:sha256:${bodyHash}:action:${index}`;\n const actionTimestamp =\n typeof action.action_ts === \"string\" ? action.action_ts : undefined;\n events.push({\n type: \"approval-response\",\n eventId: stableEventId,\n thread: {\n id: threadIdentity(\n teamId,\n channelId,\n timestamp,\n threadTimestamp,\n isDirectMessage\n ),\n isDirectMessage\n },\n replySurface: {\n version: 1,\n address: {\n teamId,\n channelId,\n threadTs: threadTimestamp ?? timestamp,\n ...(!isDirectMessage && {\n recipientUserId: actorId,\n recipientTeamId: teamId\n })\n },\n label: replySurfaceLabel(channelId, threadTimestamp ?? timestamp)\n },\n actor: {\n id: `slack:${teamId}:user:${actorId}`,\n identity: {\n scope: teamId,\n subject: actorId\n },\n ...(typeof payload.user?.username === \"string\" && {\n username: payload.user.username\n }),\n isBot: false\n },\n interactionId: approval.interactionId,\n decision: approval.decision,\n reference: actionTimestamp\n ? `${channelIdentity(teamId, channelId)}:action:${actionTimestamp}`\n : stableEventId\n });\n }\n\n return events;\n}\n\nfunction bytesFromHex(hex: string): Uint8Array<ArrayBuffer> | undefined {\n if (!/^[a-f0-9]{64}$/.test(hex)) return undefined;\n const bytes = new Uint8Array(hex.length / 2);\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n}\n\nasync function hasValidSignature(\n request: Request,\n rawBody: string,\n signingSecret: string,\n maxSkewSeconds: number\n): Promise<boolean> {\n const timestamp = request.headers.get(\"x-slack-request-timestamp\");\n const signature = request.headers.get(\"x-slack-signature\");\n if (!timestamp || !signature || !/^\\d+$/.test(timestamp)) return false;\n\n const timestampSeconds = Number(timestamp);\n if (\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Math.floor(Date.now() / 1000) - timestampSeconds) > maxSkewSeconds\n ) {\n return false;\n }\n\n const match = signature.match(/^v0=([a-f0-9]{64})$/);\n const signatureBytes = match ? bytesFromHex(match[1]) : undefined;\n if (!signatureBytes) return false;\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n encodeUtf8(signingSecret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"verify\"]\n );\n return crypto.subtle.verify(\n \"HMAC\",\n key,\n signatureBytes,\n encodeUtf8(`v0:${timestamp}:${rawBody}`)\n );\n}\n\nfunction parseJsonPayload(rawBody: string): SlackJsonPayload | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawBody);\n } catch {\n return undefined;\n }\n if (!isRecord(parsed)) return undefined;\n if (parsed.type !== \"url_verification\" && parsed.type !== \"event_callback\") {\n return undefined;\n }\n return parsed as SlackUrlVerification | SlackEventCallback;\n}\n\nfunction parseInteractionPayload(\n rawBody: string\n): SlackBlockActions | undefined {\n const encodedPayload = new URLSearchParams(rawBody).get(\"payload\");\n if (!encodedPayload) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(encodedPayload);\n } catch {\n return undefined;\n }\n return isRecord(parsed) && parsed.type === \"block_actions\"\n ? (parsed as SlackBlockActions)\n : undefined;\n}\n\n/** Create dependency-free, request-signed Slack HTTP ingress. */\nexport function slackWebhook(\n options: SlackWebhookOptions\n): ChannelIngress<SlackIngressPayload> {\n if (!options.signingSecret.trim()) {\n throw new Error(\n \"signingSecret is required to create Slack webhook ingress\"\n );\n }\n const maxSkewSeconds = options.maxSkewSeconds ?? DEFAULT_MAX_SKEW_SECONDS;\n if (!Number.isInteger(maxSkewSeconds) || maxSkewSeconds < 0) {\n throw new Error(\"maxSkewSeconds must be a non-negative integer\");\n }\n\n const path = options.path ?? DEFAULT_SLACK_WEBHOOK_PATH;\n return {\n async receive(request) {\n if (!matchesPath(request, path)) return null;\n if (request.method !== \"POST\") return emptyIngressResponse(405);\n\n const rawBody = await request.text();\n if (\n !(await hasValidSignature(\n request,\n rawBody,\n options.signingSecret,\n maxSkewSeconds\n ))\n ) {\n return emptyIngressResponse(401);\n }\n\n const contentType =\n request.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim() ?? \"\";\n if (contentType === \"application/x-www-form-urlencoded\") {\n const payload = parseInteractionPayload(rawBody);\n if (!payload) return emptyIngressResponse(400);\n const events = await normalizedInteractions(payload, rawBody);\n return {\n events: events.map((event) => ({ event, raw: payload })),\n response: new Response(null, { status: 200 })\n };\n }\n\n const payload = parseJsonPayload(rawBody);\n if (!payload) return emptyIngressResponse(400);\n if (payload.type === \"url_verification\") {\n return typeof payload.challenge === \"string\"\n ? {\n events: [],\n response: Response.json({ challenge: payload.challenge })\n }\n : emptyIngressResponse(400);\n }\n\n const event = normalizedEvent(payload, options.botUserId);\n return {\n events: event ? [{ event, raw: payload }] : [],\n response: new Response(null, { status: 200 })\n };\n }\n };\n}\n\nfunction failed(\n code: string,\n message: string,\n retryable: boolean\n): Extract<DeliveryResult, { status: \"failed\" }> {\n return {\n status: \"failed\",\n retryable,\n error: { code, message }\n };\n}\n\nfunction slackErrorCode(error: string): string {\n return `SLACK_API_ERROR_${error.toUpperCase().replace(/[^A-Z0-9]+/g, \"_\")}`;\n}\n\nfunction classifyApiFailure(\n response: Response,\n payload: SlackApiResponse\n): Exclude<DeliveryResult, { status: \"delivered\" }> {\n if (payload.ok === false) {\n const error =\n typeof payload.error === \"string\" ? payload.error : \"unknown_error\";\n const code = slackErrorCode(error);\n const message = `Slack rejected the message: ${error}`;\n if (response.status >= 500 || AMBIGUOUS_SLACK_ERRORS.has(error)) {\n return uncertain(code, message);\n }\n return failed(\n code,\n message,\n response.status === 429 || error === \"ratelimited\"\n );\n }\n\n if (response.status === 429) {\n return failed(\n \"SLACK_HTTP_ERROR_429\",\n \"Slack rate limited the message\",\n true\n );\n }\n if (response.status >= 400 && response.status < 500) {\n return failed(\n `SLACK_HTTP_ERROR_${response.status}`,\n `Slack rejected the message with HTTP ${response.status}`,\n false\n );\n }\n return uncertain(\n \"SLACK_DELIVERY_ERROR\",\n \"Slack returned an invalid delivery response\"\n );\n}\n\nfunction asApiResponse(value: unknown): SlackApiResponse | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction approvalValue(\n interactionId: string,\n decision: \"approve\" | \"reject\"\n): string {\n return JSON.stringify({\n v: 1,\n interactionId,\n decision\n } satisfies ApprovalValue);\n}\n\n/** A resolved conversation, with the reader a stream should be rendered for. */\ntype SlackDestination = {\n channelId: string;\n threadTs?: string;\n recipientUserId?: string;\n recipientTeamId?: string;\n};\n\ntype SlackTarget = SlackDestination | { teamId: string; userId: string };\n\nfunction optionalId(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction slackTarget(surface: ChannelMessageSurface): SlackTarget | undefined {\n if (\n !isChannelMessageSurface(surface) ||\n surface.version !== 1 ||\n !isRecord(surface.address)\n ) {\n return undefined;\n }\n const address = surface.address;\n if (\"userId\" in address) {\n return typeof address.teamId === \"string\" &&\n address.teamId.length > 0 &&\n typeof address.userId === \"string\" &&\n address.userId.length > 0\n ? { teamId: address.teamId, userId: address.userId }\n : undefined;\n }\n if (typeof address.channelId !== \"string\" || address.channelId.length === 0) {\n return undefined;\n }\n if (\n \"threadTs\" in address &&\n address.threadTs !== undefined &&\n (typeof address.threadTs !== \"string\" || address.threadTs.length === 0)\n ) {\n return undefined;\n }\n const recipientUserId = optionalId(address.recipientUserId);\n const recipientTeamId = optionalId(address.recipientTeamId);\n return {\n channelId: address.channelId,\n ...(typeof address.threadTs === \"string\" && {\n threadTs: address.threadTs\n }),\n // Slack rejects one without the other, so only carry a complete pair.\n ...(recipientUserId &&\n recipientTeamId && { recipientUserId, recipientTeamId })\n };\n}\n\ntype SlackStreamChunk =\n | { type: \"markdown_text\"; text: string }\n | {\n type: \"task_update\";\n id: string;\n title: string;\n status: \"in_progress\" | \"complete\" | \"error\";\n details?: string;\n };\n\nconst SLACK_TASK_STATUS = {\n started: \"in_progress\",\n completed: \"complete\",\n failed: \"error\"\n} as const;\n\nfunction splitText(text: string, limit: number): string[] {\n const pieces: string[] = [];\n let piece = \"\";\n let length = 0;\n for (const character of text) {\n if (length === limit) {\n pieces.push(piece);\n piece = \"\";\n length = 0;\n }\n piece += character;\n length += 1;\n }\n if (piece.length > 0) pieces.push(piece);\n return pieces;\n}\n\nfunction clamp(value: string, limit: number): string {\n const characters = [...value];\n return characters.length <= limit\n ? value\n : `${characters.slice(0, limit - 1).join(\"\")}\\u2026`;\n}\n\nfunction escapeMrkdwn(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction escapeLinkUrl(value: string): string {\n return escapeMrkdwn(value.replaceAll(\"|\", \"%7C\"));\n}\n\nfunction escapeLinkLabel(value: string): string {\n return escapeMrkdwn(value).replaceAll(\"|\", \"|\");\n}\n\n/**\n * Render a neutral chunk as Slack stream content.\n *\n * `reasoning` has no Slack rendering and is dropped. A `source` is collected\n * rather than appended, so it can be rendered once beneath the finished\n * message instead of interrupting the text.\n */\nfunction toStreamChunks(\n chunk: ChannelChunk,\n sources: { url: string; title?: string }[]\n): SlackStreamChunk[] {\n switch (chunk.type) {\n case \"text\":\n return splitText(chunk.text, SLACK_APPEND_LIMIT).map((text) => ({\n type: \"markdown_text\",\n text\n }));\n case \"tool\":\n return [\n {\n type: \"task_update\",\n id: clamp(chunk.id ?? chunk.name, SLACK_TASK_FIELD_LIMIT),\n title: clamp(chunk.title ?? chunk.name, SLACK_TASK_FIELD_LIMIT),\n status: SLACK_TASK_STATUS[chunk.status],\n ...(chunk.detail !== undefined && {\n details: clamp(chunk.detail, SLACK_TASK_FIELD_LIMIT)\n })\n }\n ];\n case \"source\":\n sources.push(chunk);\n return [];\n case \"reasoning\":\n return [];\n }\n}\n\nfunction sourcesBlock(\n sources: readonly { url: string; title?: string }[]\n): Record<string, unknown> {\n const text = sources\n .map(\n (source) =>\n `<${escapeLinkUrl(source.url)}|${escapeLinkLabel(source.title ?? source.url)}>`\n )\n .join(\" \\u00b7 \");\n return {\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: clamp(text, SLACK_CONTEXT_LIMIT) }]\n };\n}\n\n/** Create a configured Slack Web API Channel. */\nexport function slack(\n options: SlackChannelOptions\n): Channel<SlackIngressPayload> {\n if (!options.botToken.trim()) {\n throw new Error(\"botToken is required to create a Slack channel\");\n }\n const fetch = options.fetch ?? globalThis.fetch;\n const apiBaseUrl = (options.apiBaseUrl ?? \"https://slack.com/api\").replace(\n /\\/$/,\n \"\"\n );\n const toText = options.toText ?? defaultText;\n const streamIntervalMs =\n options.streamIntervalMs ?? DEFAULT_STREAM_INTERVAL_MS;\n if (!Number.isInteger(streamIntervalMs) || streamIntervalMs < 0) {\n throw new Error(\"streamIntervalMs must be a non-negative integer\");\n }\n const ingress = options.webhook ? slackWebhook(options.webhook) : undefined;\n\n async function resolveTarget(\n target: SlackTarget\n ): Promise<SlackDestination | DeliveryResult> {\n if (!(\"userId\" in target)) return target;\n\n let response: Response;\n try {\n response = await fetch(`${apiBaseUrl}/conversations.open`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.botToken}`,\n \"content-type\": \"application/json; charset=utf-8\"\n },\n body: JSON.stringify({ users: target.userId })\n });\n } catch {\n return failed(\n \"SLACK_CONTACT_RESOLUTION_FAILED\",\n \"Slack could not resolve a direct-message destination\",\n true\n );\n }\n\n let payload: unknown;\n try {\n payload = await response.json();\n } catch {\n return failed(\n \"SLACK_CONTACT_RESOLUTION_FAILED\",\n \"Slack returned an invalid direct-message destination\",\n response.status === 429 || response.status >= 500\n );\n }\n const result = isRecord(payload)\n ? (payload as SlackOpenConversationResponse)\n : undefined;\n if (result?.ok === true && typeof result.channel?.id === \"string\") {\n return {\n channelId: result.channel.id,\n recipientUserId: target.userId,\n recipientTeamId: target.teamId\n };\n }\n const error = typeof result?.error === \"string\" ? result.error : \"unknown\";\n return failed(\n slackErrorCode(error),\n `Slack could not open a direct message: ${error}`,\n response.status === 429 ||\n response.status >= 500 ||\n error === \"ratelimited\"\n );\n }\n\n async function postMessage(\n destination: ChannelMessageSurface,\n text: string,\n blocks?: readonly Record<string, unknown>[]\n ): Promise<DeliveryResult> {\n const unresolvedTarget = slackTarget(destination);\n if (!unresolvedTarget) {\n return failed(\n \"SLACK_SURFACE_INVALID\",\n `Slack cannot parse the address for Channel \"${destination.channelKey}\"`,\n false\n );\n }\n\n const target = await resolveTarget(unresolvedTarget);\n if (\"status\" in target) return target;\n\n const sent = await callSlack(\"chat.postMessage\", {\n channel: target.channelId,\n text,\n mrkdwn: true,\n ...(target.threadTs && { thread_ts: target.threadTs }),\n ...(blocks && { blocks })\n });\n return \"status\" in sent\n ? sent\n : {\n status: \"delivered\",\n reference: outboundReference(sent.channelId, sent.ts)\n };\n }\n\n /**\n * One transport path for every Slack method this Channel calls.\n *\n * Each of them answers with the conversation and timestamp on success, and\n * every failure mode is classified the same way, so posting and streaming\n * cannot drift apart.\n */\n async function callSlack(\n method: string,\n body: Record<string, unknown>\n ): Promise<\n | { channelId: string; ts: string }\n | Exclude<DeliveryResult, { status: \"delivered\" }>\n > {\n let response: Response;\n try {\n response = await fetch(`${apiBaseUrl}/${method}`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.botToken}`,\n \"content-type\": \"application/json; charset=utf-8\"\n },\n body: JSON.stringify(body)\n });\n } catch {\n return uncertain(\n \"SLACK_DELIVERY_ERROR\",\n \"Slack delivery failed with an unknown outcome\"\n );\n }\n\n let payload: unknown;\n try {\n payload = await response.json();\n } catch {\n payload = undefined;\n }\n const apiResponse = asApiResponse(payload);\n if (\n apiResponse?.ok === true &&\n typeof apiResponse.channel === \"string\" &&\n typeof apiResponse.ts === \"string\"\n ) {\n return { channelId: apiResponse.channel, ts: apiResponse.ts };\n }\n return apiResponse?.ok === true\n ? uncertain(\n \"SLACK_DELIVERY_ERROR\",\n \"Slack returned an invalid delivery response\"\n )\n : classifyApiFailure(response, apiResponse ?? {});\n }\n\n async function streamMessage(\n destination: ChannelMessageSurface,\n chunks: ReadableStream<ChannelChunk>,\n streamOptions: ChannelStreamOptions\n ): Promise<DeliveryResult> {\n const unresolvedTarget = slackTarget(destination);\n if (!unresolvedTarget) {\n await chunks.cancel().catch(() => {});\n return failed(\n \"SLACK_SURFACE_INVALID\",\n `Slack cannot parse the address for Channel \"${destination.channelKey}\"`,\n false\n );\n }\n\n // Slack only permits native channel streaming in a thread. Preserve the\n // simpler top-level application API by collecting and posting one ordinary\n // message; direct-message targets still use native streaming.\n if (\n !(\"userId\" in unresolvedTarget) &&\n !unresolvedTarget.threadTs &&\n !unresolvedTarget.recipientUserId\n ) {\n const collected = await collectText(chunks);\n if (collected.interrupted && collected.text.length === 0) {\n return failed(\n \"SLACK_STREAM_INTERRUPTED\",\n \"The stream ended before producing any content to deliver\",\n false\n );\n }\n const delivered = await postMessage(\n destination,\n toText({\n ...(streamOptions.title && { title: streamOptions.title }),\n markdown: collected.text\n })\n );\n if (!collected.interrupted || delivered.status !== \"delivered\") {\n return delivered;\n }\n return uncertain(\n \"SLACK_STREAM_INTERRUPTED\",\n \"An incomplete answer was delivered because the stream ended early\",\n delivered.reference\n );\n }\n\n const target = await resolveTarget(unresolvedTarget);\n if (\"status\" in target) {\n await chunks.cancel().catch(() => {});\n return target;\n }\n\n const started = await callSlack(\"chat.startStream\", {\n channel: target.channelId,\n ...(target.threadTs && { thread_ts: target.threadTs }),\n ...(target.recipientUserId && {\n recipient_user_id: target.recipientUserId,\n recipient_team_id: target.recipientTeamId\n }),\n // Every call in a stream must use the mode the stream was opened in,\n // so the title goes in a chunk rather than `markdown_text`. Opening\n // with `markdown_text` makes Slack reject each later append with\n // `streaming_mode_mismatch`, losing the whole answer.\n ...(streamOptions.title && {\n chunks: splitText(`${streamOptions.title}\\n\\n`, SLACK_APPEND_LIMIT).map(\n (text) => ({ type: \"markdown_text\", text })\n )\n })\n });\n if (\"status\" in started) {\n await chunks.cancel().catch(() => {});\n return started;\n }\n\n const reference = outboundReference(started.channelId, started.ts);\n const sources: { url: string; title?: string }[] = [];\n const shouldFlush = createPacer(streamIntervalMs);\n let pending: SlackStreamChunk[] = [];\n let appendFailure:\n | Exclude<DeliveryResult, { status: \"delivered\" }>\n | undefined;\n\n return consumeChunks(chunks, {\n async onChunk(chunk) {\n pending.push(...toStreamChunks(chunk, sources));\n if (pending.length === 0 || !shouldFlush()) return;\n const appended = await callSlack(\"chat.appendStream\", {\n channel: started.channelId,\n ts: started.ts,\n chunks: pending\n });\n pending = [];\n if (\"status\" in appended) {\n appendFailure = appended;\n // Stop reading, but still stop the stream: Slack leaves a message\n // stuck in its streaming state otherwise.\n throw new Error(appended.error.message);\n }\n },\n async onFinish(outcome) {\n // Whatever the pacer withheld rides along on the terminal call, so an\n // interrupted answer keeps its tail without an extra round trip.\n const stopped = await callSlack(\"chat.stopStream\", {\n channel: started.channelId,\n ts: started.ts,\n ...(pending.length > 0 && !appendFailure && { chunks: pending }),\n ...(sources.length > 0 && { blocks: [sourcesBlock(sources)] })\n });\n if (\"status\" in stopped) {\n return uncertain(\n stopped.error.code,\n `Slack could not stop the stream: ${stopped.error.message}`,\n reference\n );\n }\n if (appendFailure) {\n return uncertain(\n appendFailure.error.code,\n appendFailure.error.message,\n reference\n );\n }\n if (outcome.interrupted) {\n return uncertain(\n \"SLACK_STREAM_INTERRUPTED\",\n \"The answer ended early, so the Slack message is incomplete\",\n reference\n );\n }\n return { status: \"delivered\", reference };\n }\n });\n }\n\n return {\n ...(options.route && { route: options.route }),\n ...(ingress && { ingress }),\n contactSurface(identity: ChannelIdentity) {\n if (identity.scope === undefined) return null;\n return {\n version: 1,\n address: { teamId: identity.scope, userId: identity.subject },\n label: `Slack · user ${identity.subject}`\n };\n },\n deliver(destination, message) {\n return postMessage(destination, toText(message));\n },\n stream(destination, chunks, streamOptions) {\n return streamMessage(destination, chunks, streamOptions);\n },\n requestApproval(destination, { interactionId, request }) {\n if (interactionId.length === 0) {\n return Promise.resolve(\n failed(\n \"SLACK_INTERACTION_ID_REQUIRED\",\n \"Slack approval requests require a non-empty interaction id\",\n false\n )\n );\n }\n const text = approvalText(request);\n const approveValue = approvalValue(interactionId, \"approve\");\n const rejectValue = approvalValue(interactionId, \"reject\");\n if (\n text.length > 3000 ||\n approveValue.length > 2000 ||\n rejectValue.length > 2000\n ) {\n return Promise.resolve(\n failed(\n \"SLACK_APPROVAL_TOO_LONG\",\n \"Slack approval content exceeds Block Kit limits\",\n false\n )\n );\n }\n return postMessage(destination, text, [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text }\n },\n {\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n action_id: APPROVE_ACTION_ID,\n text: { type: \"plain_text\", text: \"Approve\" },\n style: \"primary\",\n value: approveValue\n },\n {\n type: \"button\",\n action_id: REJECT_ACTION_ID,\n text: { type: \"plain_text\", text: \"Reject\" },\n style: \"danger\",\n value: rejectValue\n }\n ]\n }\n ]);\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { F as ChannelMessageSurface } from "../channel-Bnm4S7T2.js";
|
|
2
|
+
import { n as ChannelHost } from "../index-BB0kqhIz.js";
|
|
3
|
+
|
|
4
|
+
//#region src/channels/tanstack-ai.d.ts
|
|
5
|
+
type CreateSendMessageToolOptions = {
|
|
6
|
+
/** TanStack AI tools carry their name in the definition. */ name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
needsApproval?: boolean;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
/** Adapt one Host-resolved surface to a TanStack AI server tool. */
|
|
12
|
+
declare function createSendMessageTool(
|
|
13
|
+
host: ChannelHost,
|
|
14
|
+
surface: ChannelMessageSurface,
|
|
15
|
+
options: CreateSendMessageToolOptions
|
|
16
|
+
): import("@tanstack/ai").ServerTool<
|
|
17
|
+
{
|
|
18
|
+
type: "object";
|
|
19
|
+
properties: {
|
|
20
|
+
title: {
|
|
21
|
+
type: "string";
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
markdown: {
|
|
25
|
+
type: "string";
|
|
26
|
+
minLength: number;
|
|
27
|
+
description: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
required: string[];
|
|
31
|
+
additionalProperties: false;
|
|
32
|
+
},
|
|
33
|
+
import("@tanstack/ai").SchemaInput,
|
|
34
|
+
string,
|
|
35
|
+
unknown
|
|
36
|
+
>;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { CreateSendMessageToolOptions, createSendMessageTool };
|
|
39
|
+
//# sourceMappingURL=tanstack-ai.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { n as parseChannelMessage, t as channelMessageJsonSchema } from "../tool-schema-CBjGPrsQ.js";
|
|
2
|
+
import { toolDefinition } from "@tanstack/ai";
|
|
3
|
+
//#region src/channels/tanstack-ai.ts
|
|
4
|
+
/** Adapt one Host-resolved surface to a TanStack AI server tool. */
|
|
5
|
+
function createSendMessageTool(host, surface, options) {
|
|
6
|
+
return toolDefinition({
|
|
7
|
+
name: options.name,
|
|
8
|
+
description: options.description ?? "Deliver a message through this Channel",
|
|
9
|
+
inputSchema: channelMessageJsonSchema,
|
|
10
|
+
...options.needsApproval && { needsApproval: true },
|
|
11
|
+
metadata: options.metadata
|
|
12
|
+
}).server(async (value) => host.deliver(surface, parseChannelMessage(value)));
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createSendMessageTool };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=tanstack-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tanstack-ai.js","names":[],"sources":["../../src/channels/tanstack-ai.ts"],"sourcesContent":["import { toolDefinition } from \"@tanstack/ai\";\nimport type { ChannelHost } from \"./host\";\nimport type { ChannelMessageSurface } from \"./surface\";\nimport { channelMessageJsonSchema, parseChannelMessage } from \"./tool-schema\";\n\nexport type CreateSendMessageToolOptions = {\n /** TanStack AI tools carry their name in the definition. */\n name: string;\n description?: string;\n needsApproval?: boolean;\n metadata?: Record<string, unknown>;\n};\n\n/** Adapt one Host-resolved surface to a TanStack AI server tool. */\nexport function createSendMessageTool(\n host: ChannelHost,\n surface: ChannelMessageSurface,\n options: CreateSendMessageToolOptions\n) {\n const definition = toolDefinition({\n name: options.name,\n description:\n options.description ?? \"Deliver a message through this Channel\",\n inputSchema: channelMessageJsonSchema,\n ...(options.needsApproval && { needsApproval: true }),\n metadata: options.metadata\n });\n\n return definition.server(async (value) =>\n host.deliver(surface, parseChannelMessage(value))\n );\n}\n"],"mappings":";;;;AAcA,SAAgB,sBACd,MACA,SACA,SACA;CAUA,OATmB,eAAe;EAChC,MAAM,QAAQ;EACd,aACE,QAAQ,eAAe;EACzB,aAAa;EACb,GAAI,QAAQ,iBAAiB,EAAE,eAAe,KAAK;EACnD,UAAU,QAAQ;CACpB,CAEgB,CAAC,CAAC,OAAO,OAAO,UAC9B,KAAK,QAAQ,SAAS,oBAAoB,KAAK,CAAC,CAClD;AACF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
F as ChannelMessageSurface,
|
|
3
|
+
d as ChannelRoute,
|
|
4
|
+
k as ChannelIngress,
|
|
5
|
+
n as Channel,
|
|
6
|
+
u as ChannelMessage
|
|
7
|
+
} from "../channel-Bnm4S7T2.js";
|
|
8
|
+
|
|
9
|
+
//#region src/channels/adapters/telegram.d.ts
|
|
10
|
+
type TelegramUser = {
|
|
11
|
+
id: number;
|
|
12
|
+
is_bot: boolean;
|
|
13
|
+
first_name: string;
|
|
14
|
+
last_name?: string;
|
|
15
|
+
username?: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
type TelegramChat = {
|
|
19
|
+
id: number;
|
|
20
|
+
type: "private" | "group" | "supergroup" | "channel";
|
|
21
|
+
title?: string;
|
|
22
|
+
username?: string;
|
|
23
|
+
first_name?: string;
|
|
24
|
+
last_name?: string;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
};
|
|
27
|
+
type TelegramMessage = {
|
|
28
|
+
message_id: number;
|
|
29
|
+
date: number;
|
|
30
|
+
chat: TelegramChat;
|
|
31
|
+
message_thread_id?: number;
|
|
32
|
+
from?: TelegramUser;
|
|
33
|
+
sender_chat?: TelegramChat;
|
|
34
|
+
text?: string;
|
|
35
|
+
edit_date?: number;
|
|
36
|
+
reply_to_message?: TelegramMessage;
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
};
|
|
39
|
+
/** Authenticated JSON body delivered by a Telegram webhook. */
|
|
40
|
+
type TelegramUpdate = {
|
|
41
|
+
update_id: number;
|
|
42
|
+
message?: TelegramMessage;
|
|
43
|
+
edited_message?: TelegramMessage;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
};
|
|
46
|
+
type TelegramMessageSurface = ChannelMessageSurface<
|
|
47
|
+
string,
|
|
48
|
+
{
|
|
49
|
+
chatId: string;
|
|
50
|
+
botUserId?: number;
|
|
51
|
+
messageThreadId?: number;
|
|
52
|
+
replyToMessageId?: number;
|
|
53
|
+
}
|
|
54
|
+
>;
|
|
55
|
+
/** Configuration for a Telegram Channel. */
|
|
56
|
+
type TelegramChannelOptions = {
|
|
57
|
+
/** Bot token issued by BotFather. */ botToken: string /** Telegram Bot API origin. @default "https://api.telegram.org" */;
|
|
58
|
+
apiBaseUrl?: string /** Maximum text length accepted by this route. @default 4096 */;
|
|
59
|
+
maxLength?: number /** Project the canonical message into Telegram text. */;
|
|
60
|
+
toText?: (
|
|
61
|
+
message: ChannelMessage
|
|
62
|
+
) => string /** Parse mode for caller-formatted delivery text. */;
|
|
63
|
+
parseMode?: "HTML" | "MarkdownV2";
|
|
64
|
+
/**
|
|
65
|
+
* Smallest gap between `sendMessageDraft` previews. Snapshots produced
|
|
66
|
+
* inside one interval are replaced rather than sent. @default 500
|
|
67
|
+
*/
|
|
68
|
+
streamIntervalMs?: number /** Select an application route from the event, raw update, and Host context. */;
|
|
69
|
+
route?: ChannelRoute<TelegramUpdate> /** Add secret-verified Telegram webhook ingress to the returned Channel. */;
|
|
70
|
+
webhook?: {
|
|
71
|
+
secretToken: string /** Exact webhook pathname accepted by this ingress. @default "/webhooks/telegram" */;
|
|
72
|
+
path?: string;
|
|
73
|
+
} /** Override fetch for testing or custom network routing. */;
|
|
74
|
+
fetch?: typeof globalThis.fetch;
|
|
75
|
+
};
|
|
76
|
+
type TelegramWebhookOptions = {
|
|
77
|
+
/** Telegram webhook secret configured through setWebhook. */ secretToken: string /** Exact webhook pathname accepted by this ingress. @default "/webhooks/telegram" */;
|
|
78
|
+
path?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Numeric user id of this bot, used to prove that an approval reply answers
|
|
81
|
+
* a message this bot sent. Without it, marker replies stay ordinary
|
|
82
|
+
* messages because their provenance cannot be established.
|
|
83
|
+
*/
|
|
84
|
+
botUserId?: number;
|
|
85
|
+
};
|
|
86
|
+
/** Create dependency-free Telegram webhook ingress for a destination chat. */
|
|
87
|
+
declare function telegramWebhook(
|
|
88
|
+
options: TelegramWebhookOptions
|
|
89
|
+
): ChannelIngress<TelegramUpdate>;
|
|
90
|
+
/** Create a configured Telegram Bot API Channel. */
|
|
91
|
+
declare function telegram(
|
|
92
|
+
options: TelegramChannelOptions
|
|
93
|
+
): Channel<TelegramUpdate>;
|
|
94
|
+
//#endregion
|
|
95
|
+
export {
|
|
96
|
+
TelegramChannelOptions,
|
|
97
|
+
TelegramChat,
|
|
98
|
+
TelegramMessage,
|
|
99
|
+
TelegramMessageSurface,
|
|
100
|
+
TelegramUpdate,
|
|
101
|
+
TelegramUser,
|
|
102
|
+
TelegramWebhookOptions,
|
|
103
|
+
telegram,
|
|
104
|
+
telegramWebhook
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=telegram.d.ts.map
|