@agent-native/dispatch 0.13.13 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/actions/delete-destination.d.ts +12 -12
  2. package/dist/actions/provider-api-audit.d.ts +7 -0
  3. package/dist/actions/provider-api-audit.d.ts.map +1 -0
  4. package/dist/actions/provider-api-audit.js +74 -0
  5. package/dist/actions/provider-api-audit.js.map +1 -0
  6. package/dist/actions/provider-api-catalog.d.ts +1 -1
  7. package/dist/actions/provider-api-request.js +10 -0
  8. package/dist/actions/provider-api-request.js.map +1 -1
  9. package/dist/actions/send-platform-message.d.ts +1 -0
  10. package/dist/actions/send-platform-message.js +43 -22
  11. package/dist/actions/send-platform-message.js.map +1 -1
  12. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  13. package/dist/components/messaging-setup-panel.js +203 -127
  14. package/dist/components/messaging-setup-panel.js.map +1 -1
  15. package/dist/routes/pages/messaging.js +1 -1
  16. package/dist/routes/pages/messaging.js.map +1 -1
  17. package/dist/server/lib/dispatch-integrations.d.ts +7 -1
  18. package/dist/server/lib/dispatch-integrations.d.ts.map +1 -1
  19. package/dist/server/lib/dispatch-integrations.js +178 -8
  20. package/dist/server/lib/dispatch-integrations.js.map +1 -1
  21. package/dist/server/lib/dispatch-routing.d.ts +6 -0
  22. package/dist/server/lib/dispatch-routing.d.ts.map +1 -0
  23. package/dist/server/lib/dispatch-routing.js +30 -0
  24. package/dist/server/lib/dispatch-routing.js.map +1 -0
  25. package/dist/server/lib/env-config.d.ts.map +1 -1
  26. package/dist/server/lib/env-config.js +50 -0
  27. package/dist/server/lib/env-config.js.map +1 -1
  28. package/dist/server/lib/onboarding-steps.d.ts.map +1 -1
  29. package/dist/server/lib/onboarding-steps.js +25 -0
  30. package/dist/server/lib/onboarding-steps.js.map +1 -1
  31. package/dist/server/lib/provider-api.d.ts +2 -2
  32. package/dist/server/lib/provider-api.d.ts.map +1 -1
  33. package/dist/server/plugins/integrations.d.ts.map +1 -1
  34. package/dist/server/plugins/integrations.js +5 -2
  35. package/dist/server/plugins/integrations.js.map +1 -1
  36. package/package.json +2 -2
  37. package/src/actions/provider-api-audit.spec.ts +52 -0
  38. package/src/actions/provider-api-audit.ts +88 -0
  39. package/src/actions/provider-api-request.ts +10 -0
  40. package/src/actions/send-platform-message.spec.ts +108 -0
  41. package/src/actions/send-platform-message.ts +73 -25
  42. package/src/components/messaging-setup-panel.spec.tsx +191 -0
  43. package/src/components/messaging-setup-panel.tsx +472 -193
  44. package/src/routes/pages/messaging.tsx +1 -1
  45. package/src/server/lib/dispatch-integrations.spec.ts +113 -0
  46. package/src/server/lib/dispatch-integrations.ts +239 -6
  47. package/src/server/lib/dispatch-routing.spec.ts +42 -0
  48. package/src/server/lib/dispatch-routing.ts +42 -0
  49. package/src/server/lib/env-config.ts +50 -0
  50. package/src/server/lib/onboarding-steps.ts +32 -0
  51. package/src/server/plugins/integrations.ts +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"messaging-setup-panel.js","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"@agent-native/core/client\";\nimport {\n IconBrandSlack,\n IconBrandTelegram,\n IconBrandWhatsapp,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconExternalLink,\n IconInfoCircle,\n IconLoader2,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Input } from \"./ui/input\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\ninterface EnvStatus {\n key: string;\n label: string;\n required: boolean;\n configured: boolean;\n helpText?: string;\n}\n\ninterface RequiredEnvKey {\n key: string;\n label: string;\n required: boolean;\n helpText?: string;\n}\n\ninterface IntegrationStatus {\n platform: string;\n label: string;\n enabled: boolean;\n configured: boolean;\n webhookUrl?: string;\n requiredEnvKeys?: RequiredEnvKey[];\n}\n\ninterface PlatformDefinition {\n id: \"slack\" | \"telegram\" | \"email\" | \"whatsapp\";\n label: string;\n icon: typeof IconBrandSlack;\n description: string;\n /** Our own docs anchor — keep these on /docs/messaging so users land on\n * the page that explains the platform in plain English. */\n docsUrl: string;\n /** Optional external link (e.g. to the platform's developer console). */\n externalUrl?: string;\n externalLabel?: string;\n setupSteps: string[];\n /** Fallback env keys when the adapter doesn't surface them via\n * `IntegrationStatus.requiredEnvKeys`. The panel prefers adapter-supplied\n * keys when present so optional fields (webhook secrets, etc.) appear\n * automatically. */\n envKeys: string[];\n}\n\nconst PLATFORM_DEFINITIONS: PlatformDefinition[] = [\n {\n id: \"slack\",\n label: \"Slack\",\n icon: IconBrandSlack,\n description: \"Receive mentions and DMs in one workspace-aware dispatch.\",\n docsUrl: \"/docs/messaging#slack\",\n externalUrl: \"https://api.slack.com/apps\",\n externalLabel: \"Open Slack apps\",\n envKeys: [\"SLACK_BOT_TOKEN\", \"SLACK_SIGNING_SECRET\"],\n setupSteps: [\n \"Create or open a Slack app at api.slack.com/apps.\",\n \"Save the bot token and signing secret below — the webhook URL appears once they're saved.\",\n \"Back in Slack, enable Event Subscriptions and paste the webhook URL.\",\n \"Subscribe to app_mention and message.im events, then install the app.\",\n \"Optional but recommended: Basic Information → Display Information → upload an app icon and pick a background color so the bot has a clean avatar in every channel.\",\n ],\n },\n {\n id: \"telegram\",\n label: \"Telegram\",\n icon: IconBrandTelegram,\n description: \"Chat with dispatch through a Telegram bot.\",\n docsUrl: \"/docs/messaging#telegram\",\n externalUrl: \"https://t.me/BotFather\",\n externalLabel: \"Open BotFather\",\n envKeys: [\"TELEGRAM_BOT_TOKEN\"],\n setupSteps: [\n \"Open @BotFather in Telegram and send /newbot.\",\n \"Save the bot token here, then click Set up webhook below.\",\n \"DM the bot in Telegram to test.\",\n ],\n },\n {\n id: \"email\",\n label: \"Email\",\n icon: IconMail,\n description:\n \"Give your agent an email address. People can email it directly or CC it on threads.\",\n docsUrl: \"/docs/messaging#email\",\n externalUrl: \"https://resend.com/webhooks\",\n externalLabel: \"Open Resend webhooks\",\n envKeys: [\"EMAIL_AGENT_ADDRESS\"],\n setupSteps: [\n \"Save your Resend or SendGrid API key (Vault or onboarding).\",\n \"Pick an email address — the easiest is a free <slug>.resend.app address.\",\n \"If using your own domain, add MX records pointing to your provider.\",\n \"Save the address here, then register the webhook URL below in Resend (event: email.received).\",\n ],\n },\n {\n id: \"whatsapp\",\n label: \"WhatsApp\",\n icon: IconBrandWhatsapp,\n description:\n \"Receive WhatsApp messages and reply through a Meta-managed phone number.\",\n docsUrl: \"/docs/messaging#whatsapp\",\n externalUrl: \"https://developers.facebook.com/apps\",\n externalLabel: \"Open Meta developer console\",\n envKeys: [\n \"WHATSAPP_ACCESS_TOKEN\",\n \"WHATSAPP_VERIFY_TOKEN\",\n \"WHATSAPP_PHONE_NUMBER_ID\",\n ],\n setupSteps: [\n \"Create a Meta app and add the WhatsApp product.\",\n \"Save the access token, verify token, and phone number ID below.\",\n \"In Meta's WhatsApp configuration, paste the webhook URL and your verify token.\",\n \"Subscribe to the messages field, then enable here.\",\n ],\n },\n];\n\nfunction HelpTooltip({ content }: { content: string }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground/60 hover:text-foreground cursor-pointer\"\n >\n <IconInfoCircle className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-64 text-xs leading-relaxed\">\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction StatusPill({\n tone,\n label,\n}: {\n tone: \"neutral\" | \"success\" | \"warning\";\n label: string;\n}) {\n const toneClass =\n tone === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-300\"\n : tone === \"warning\"\n ? \"border-amber-500/30 bg-amber-500/10 text-amber-300\"\n : \"border-border bg-muted/40 text-muted-foreground\";\n\n return (\n <span\n className={`inline-flex items-center rounded-full border px-2.5 py-1 text-[11px] font-medium ${toneClass}`}\n >\n {label}\n </span>\n );\n}\n\n/** Render a non-secret env value (e.g. EMAIL_AGENT_ADDRESS) as a copyable\n * text block. We can't read the actual value from the backend (env-status\n * only reports `configured: true|false`), so we offer a one-click reveal\n * that hits a server endpoint, falling back to \"saved\" if the value is\n * not exposed. For now we just render a \"Saved — re-enter to change\"\n * placeholder; a future endpoint can return the actual value. */\nfunction PublicValueReveal({ envKey: _envKey }: { envKey: string }) {\n return (\n <div className=\"rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n Saved. Re-enter below to change.\n </div>\n );\n}\n\nfunction ConnectionStatus({\n configured,\n enabled,\n}: {\n configured: boolean;\n enabled: boolean;\n}) {\n if (enabled) {\n return <StatusPill tone=\"success\" label=\"Connected\" />;\n }\n if (configured) {\n return <StatusPill tone=\"warning\" label=\"Configured, not enabled\" />;\n }\n return <StatusPill tone=\"neutral\" label=\"Not configured\" />;\n}\n\nexport function MessagingSetupPanel() {\n const [statuses, setStatuses] = useState<IntegrationStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [envStatuses, setEnvStatuses] = useState<EnvStatus[]>([]);\n const [envLoading, setEnvLoading] = useState(true);\n const [envValues, setEnvValues] = useState<Record<string, string>>({});\n const [savingKeysFor, setSavingKeysFor] = useState<string | null>(null);\n const [togglingPlatform, setTogglingPlatform] = useState<string | null>(null);\n const [setupPlatform, setSetupPlatform] = useState<string | null>(null);\n const [copiedWebhook, setCopiedWebhook] = useState<string | null>(null);\n\n const refreshStatuses = async () => {\n setLoading(true);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/integrations/status\"),\n );\n const rows = res.ok ? await res.json() : [];\n setStatuses(Array.isArray(rows) ? rows : []);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n let active = true;\n fetch(agentNativePath(\"/_agent-native/integrations/status\"))\n .then((res) => (res.ok ? res.json() : []))\n .then((rows) => {\n if (active) {\n setStatuses(Array.isArray(rows) ? rows : []);\n setLoading(false);\n }\n })\n .catch(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((res) => (res.ok ? res.json() : []))\n .then((rows) => {\n if (active) {\n setEnvStatuses(Array.isArray(rows) ? rows : []);\n setEnvLoading(false);\n }\n })\n .catch(() => {\n if (active) setEnvLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const envStatusByKey = useMemo(\n () => new Map(envStatuses.map((status) => [status.key, status])),\n [envStatuses],\n );\n const statusByPlatform = useMemo(\n () => new Map(statuses.map((status) => [status.platform, status])),\n [statuses],\n );\n\n const refreshEnvStatus = async () => {\n setEnvLoading(true);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/env-status\"));\n const rows = res.ok ? await res.json() : [];\n setEnvStatuses(Array.isArray(rows) ? rows : []);\n } finally {\n setEnvLoading(false);\n }\n };\n\n const saveEnvKeys = async (platform: PlatformDefinition, keys: string[]) => {\n const vars = keys\n .map((key) => ({ key, value: envValues[key]?.trim() || \"\" }))\n .filter((item) => item.value);\n\n if (vars.length === 0) {\n toast.error(\"Add the required credentials first.\");\n return;\n }\n\n setSavingKeysFor(platform.id);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/env-vars\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ vars }),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({}));\n throw new Error(payload.error || \"Failed to save credentials\");\n }\n\n toast.success(`${platform.label} credentials saved`);\n setEnvValues((current) => {\n const next = { ...current };\n for (const key of keys) delete next[key];\n return next;\n });\n await refreshEnvStatus();\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to save credentials\",\n );\n } finally {\n setSavingKeysFor(null);\n }\n };\n\n const togglePlatform = async (\n platform: PlatformDefinition,\n enabled: boolean,\n ) => {\n setTogglingPlatform(platform.id);\n try {\n const action = enabled ? \"disable\" : \"enable\";\n const res = await fetch(\n agentNativePath(`/_agent-native/integrations/${platform.id}/${action}`),\n {\n method: \"POST\",\n },\n );\n if (!res.ok) {\n const payload = await res.json().catch(() => ({}));\n throw new Error(\n payload.error || `Failed to ${action} ${platform.label}`,\n );\n }\n toast.success(\n enabled\n ? `${platform.label} disconnected`\n : `${platform.label} connected`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to update integration\",\n );\n } finally {\n setTogglingPlatform(null);\n }\n };\n\n const runSetup = async (platform: PlatformDefinition) => {\n setSetupPlatform(platform.id);\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/integrations/${platform.id}/setup`),\n {\n method: \"POST\",\n },\n );\n if (!res.ok) {\n const payload = await res.json().catch(() => ({}));\n throw new Error(payload.error || `Failed to set up ${platform.label}`);\n }\n toast.success(\n platform.id === \"telegram\"\n ? \"Telegram webhook registered\"\n : `${platform.label} setup complete`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : `Failed to set up ${platform.label}`,\n );\n } finally {\n setSetupPlatform(null);\n }\n };\n\n const copyWebhook = async (webhookUrl: string) => {\n await navigator.clipboard.writeText(webhookUrl);\n setCopiedWebhook(webhookUrl);\n toast.success(\"Webhook URL copied\");\n setTimeout(() => setCopiedWebhook(null), 1500);\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {PLATFORM_DEFINITIONS.map((platform) => {\n const status = statusByPlatform.get(platform.id);\n const configured = !!status?.configured;\n const enabled = !!status?.enabled;\n // Prefer adapter-supplied env keys (includes optional fields like\n // webhook secrets); fall back to the static list.\n const adapterKeys = status?.requiredEnvKeys;\n const envKeys: RequiredEnvKey[] =\n adapterKeys && adapterKeys.length > 0\n ? adapterKeys\n : platform.envKeys.map((key) => ({\n key,\n label: key,\n required: true,\n }));\n\n return (\n <section\n key={platform.id}\n className=\"rounded-2xl border bg-card p-5\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl border bg-muted/30 text-foreground\">\n <platform.icon size={18} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {platform.label}\n </h3>\n <ConnectionStatus\n configured={configured}\n enabled={enabled}\n />\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {platform.description}\n </p>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs text-muted-foreground\"\n >\n <a href={platform.docsUrl} target=\"_blank\" rel=\"noreferrer\">\n Docs\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n {platform.externalUrl ? (\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs text-muted-foreground\"\n >\n <a\n href={platform.externalUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {platform.externalLabel ?? \"Open\"}\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n\n <Collapsible className=\"mt-5\">\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n <IconChevronRight className=\"h-3.5 w-3.5 transition-transform group-data-[state=open]:rotate-90\" />\n <span>Setup steps</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-2 rounded-xl border bg-muted/20 p-4\">\n <ol className=\"space-y-2 text-sm text-muted-foreground\">\n {platform.setupSteps.map((step, index) => (\n <li key={step} className=\"flex gap-2\">\n <span className=\"text-muted-foreground/60\">\n {index + 1}.\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </div>\n </CollapsibleContent>\n </Collapsible>\n\n <div className=\"mt-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-foreground\">\n Credentials\n </div>\n {envLoading ? (\n <span className=\"text-xs text-muted-foreground\">\n Checking...\n </span>\n ) : null}\n </div>\n <div className=\"space-y-3\">\n {envKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText = envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n // Email agent address is not a secret — show it plainly\n // so users can copy and share it.\n const isPublicValue = envKey.key === \"EMAIL_AGENT_ADDRESS\";\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n {!envKey.required ? (\n <span className=\"ml-1 text-muted-foreground\">\n (optional)\n </span>\n ) : null}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n {isConfigured ? (\n <StatusPill tone=\"success\" label=\"Saved\" />\n ) : (\n <StatusPill\n tone=\"neutral\"\n label={envKey.required ? \"Missing\" : \"Not set\"}\n />\n )}\n </div>\n {isConfigured && isPublicValue ? (\n <PublicValueReveal envKey={envKey.key} />\n ) : !isConfigured ? (\n <Input\n type={isPublicValue ? \"text\" : \"password\"}\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={\n isPublicValue\n ? \"agent@yourcompany.com\"\n : `Enter ${label}`\n }\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n {envKeys.some((k) => !envStatusByKey.get(k.key)?.configured) ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n envKeys.map((k) => k.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Save credentials\"\n )}\n </Button>\n ) : null}\n </div>\n\n {status?.webhookUrl ? (\n <div className=\"mt-4 space-y-2\">\n <div className=\"text-sm font-medium text-foreground\">\n Webhook URL\n </div>\n <div className=\"flex items-center gap-2\">\n <code className=\"flex-1 truncate rounded-md border bg-muted/30 px-3 py-2 text-xs text-foreground\">\n {status.webhookUrl}\n </code>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => copyWebhook(status.webhookUrl!)}\n aria-label={`Copy ${platform.label} webhook URL`}\n >\n {copiedWebhook === status.webhookUrl ? (\n <IconCheck className=\"h-4 w-4\" />\n ) : (\n <IconCopy className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-5 flex flex-wrap items-center justify-end gap-2 border-t border-border pt-4\">\n {platform.id === \"telegram\" && configured ? (\n <Button\n variant=\"outline\"\n onClick={() => runSetup(platform)}\n disabled={setupPlatform === platform.id}\n >\n {setupPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Setting up...\n </>\n ) : (\n \"Set up webhook\"\n )}\n </Button>\n ) : null}\n {!configured && !enabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>\n <Button disabled>Enable</Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Save the required credentials first.\n </TooltipContent>\n </Tooltip>\n ) : (\n <Button\n onClick={() => togglePlatform(platform, enabled)}\n disabled={togglingPlatform === platform.id}\n >\n {togglingPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : enabled ? (\n \"Disable\"\n ) : (\n \"Enable\"\n )}\n </Button>\n )}\n </div>\n </section>\n );\n })}\n </div>\n\n {loading ? (\n <div className=\"rounded-2xl border border-dashed px-4 py-6 text-sm text-muted-foreground\">\n Loading messaging status...\n </div>\n ) : null}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"messaging-setup-panel.js","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n disconnectManagedIntegrationInstallation,\n listManagedIntegrationBudgets,\n listManagedIntegrationInstallations,\n listManagedIntegrationScopes,\n listIntegrationEnvStatuses,\n listIntegrationStatuses,\n managedIntegrationOAuthUrl,\n managedSlackAgentManifestUrl,\n saveIntegrationEnvVars,\n saveManagedIntegrationBudget,\n saveManagedIntegrationScope,\n setIntegrationEnabled,\n setupIntegration,\n testManagedIntegrationInstallation,\n type ClientIntegrationInstallation,\n type ClientIntegrationScope,\n type ClientIntegrationUsageBudget,\n type ClientIntegrationStatus,\n type IntegrationEnvStatus,\n useFormatters,\n useT,\n} from \"@agent-native/core/client\";\nimport {\n listBuiltInChannelIntegrations,\n type IntegrationCatalogEntry,\n type IntegrationCredentialRequirement,\n} from \"@agent-native/core/integrations\";\nimport {\n IconBrandDiscord,\n IconBrandSlack,\n IconBrandTelegram,\n IconBrandTeams,\n IconBrandWhatsapp,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconExternalLink,\n IconFileDescription,\n IconInfoCircle,\n IconLoader2,\n IconMail,\n IconPlug,\n} from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Input } from \"./ui/input\";\nimport { Switch } from \"./ui/switch\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\nconst CHANNELS = listBuiltInChannelIntegrations();\n\nconst PLATFORM_ICONS: Partial<Record<string, typeof IconBrandSlack>> = {\n slack: IconBrandSlack,\n \"microsoft-teams\": IconBrandTeams,\n discord: IconBrandDiscord,\n telegram: IconBrandTelegram,\n whatsapp: IconBrandWhatsapp,\n email: IconMail,\n};\n\nfunction hasMissingRequiredCredentials(\n credentials: readonly IntegrationCredentialRequirement[],\n envStatusByKey: Map<string, IntegrationEnvStatus>,\n) {\n const alternatives = new Map<\n string,\n readonly IntegrationCredentialRequirement[]\n >();\n\n for (const credential of credentials) {\n if (!credential.required) continue;\n if (!credential.alternativeGroup) {\n if (!envStatusByKey.get(credential.key)?.configured) return true;\n continue;\n }\n const group = alternatives.get(credential.alternativeGroup) ?? [];\n alternatives.set(credential.alternativeGroup, [...group, credential]);\n }\n\n return [...alternatives.values()].some((group) =>\n group.every(\n (credential) => !envStatusByKey.get(credential.key)?.configured,\n ),\n );\n}\n\nfunction HelpTooltip({ content }: { content: string }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground/60 hover:text-foreground cursor-pointer\"\n >\n <IconInfoCircle className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-64 text-xs leading-relaxed\">\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction StatusPill({\n tone,\n label,\n}: {\n tone: \"neutral\" | \"success\" | \"warning\";\n label: string;\n}) {\n const toneClass =\n tone === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-300\"\n : tone === \"warning\"\n ? \"border-amber-500/30 bg-amber-500/10 text-amber-300\"\n : \"border-border bg-muted/40 text-muted-foreground\";\n\n return (\n <span\n className={`inline-flex items-center rounded-full border px-2.5 py-1 text-[11px] font-medium ${toneClass}`}\n >\n {label}\n </span>\n );\n}\n\n/** Render a non-secret env value (e.g. EMAIL_AGENT_ADDRESS) as a copyable\n * text block. We can't read the actual value from the backend (env-status\n * only reports `configured: true|false`), so we offer a one-click reveal\n * that hits a server endpoint, falling back to \"saved\" if the value is\n * not exposed. For now we just render a \"Saved — re-enter to change\"\n * placeholder; a future endpoint can return the actual value. */\nfunction PublicValueReveal({ envKey: _envKey }: { envKey: string }) {\n return (\n <div className=\"rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n Saved. Re-enter below to change.\n </div>\n );\n}\n\nfunction ConnectionStatus({\n configured,\n enabled,\n}: {\n configured: boolean;\n enabled: boolean;\n}) {\n if (enabled) {\n return <StatusPill tone=\"success\" label=\"Connected\" />;\n }\n if (configured) {\n return <StatusPill tone=\"warning\" label=\"Configured, not enabled\" />;\n }\n return <StatusPill tone=\"neutral\" label=\"Not configured\" />;\n}\n\nexport function MessagingSetupPanel() {\n const t = useT();\n const { formatDate } = useFormatters();\n const [statuses, setStatuses] = useState<ClientIntegrationStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [envStatuses, setEnvStatuses] = useState<IntegrationEnvStatus[]>([]);\n const [envLoading, setEnvLoading] = useState(true);\n const [envValues, setEnvValues] = useState<Record<string, string>>({});\n const [savingKeysFor, setSavingKeysFor] = useState<string | null>(null);\n const [togglingPlatform, setTogglingPlatform] = useState<string | null>(null);\n const [setupPlatform, setSetupPlatform] = useState<string | null>(null);\n const [copiedWebhook, setCopiedWebhook] = useState<string | null>(null);\n const [installations, setInstallations] = useState<\n ClientIntegrationInstallation[]\n >([]);\n const [installationAction, setInstallationAction] = useState<string | null>(\n null,\n );\n const [scopes, setScopes] = useState<ClientIntegrationScope[]>([]);\n const [budgets, setBudgets] = useState<ClientIntegrationUsageBudget[]>([]);\n const [scopeBudget, setScopeBudget] = useState<Record<string, string>>({});\n const [savingScope, setSavingScope] = useState<string | null>(null);\n\n const refreshStatuses = async () => {\n setLoading(true);\n try {\n setStatuses(await listIntegrationStatuses());\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n let active = true;\n listIntegrationStatuses()\n .then((rows) => {\n if (active) {\n setStatuses(rows);\n setLoading(false);\n }\n })\n .catch(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listManagedIntegrationInstallations(\"slack\")\n .then((rows) => {\n if (active) setInstallations(rows);\n })\n .catch(() => {});\n listManagedIntegrationScopes(\"slack\")\n .then((rows) => {\n if (active) setScopes(rows);\n })\n .catch(() => {});\n listManagedIntegrationBudgets()\n .then((rows) => {\n if (active) setBudgets(rows);\n })\n .catch(() => {});\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listIntegrationEnvStatuses()\n .then((rows) => {\n if (active) {\n setEnvStatuses(rows);\n setEnvLoading(false);\n }\n })\n .catch(() => {\n if (active) setEnvLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const envStatusByKey = useMemo(\n () => new Map(envStatuses.map((status) => [status.key, status])),\n [envStatuses],\n );\n const statusByPlatform = useMemo(\n () => new Map(statuses.map((status) => [status.platform, status])),\n [statuses],\n );\n\n const refreshEnvStatus = async () => {\n setEnvLoading(true);\n try {\n setEnvStatuses(await listIntegrationEnvStatuses());\n } finally {\n setEnvLoading(false);\n }\n };\n\n const saveEnvKeys = async (\n platform: IntegrationCatalogEntry,\n keys: string[],\n ) => {\n const vars = keys\n .map((key) => ({ key, value: envValues[key]?.trim() || \"\" }))\n .filter((item) => item.value);\n\n if (vars.length === 0) {\n toast.error(\"Add the required credentials first.\");\n return;\n }\n\n setSavingKeysFor(platform.id);\n try {\n await saveIntegrationEnvVars(vars);\n\n toast.success(`${platform.name} credentials saved`);\n setEnvValues((current) => {\n const next = { ...current };\n for (const key of keys) delete next[key];\n return next;\n });\n await refreshEnvStatus();\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to save credentials\",\n );\n } finally {\n setSavingKeysFor(null);\n }\n };\n\n const togglePlatform = async (\n platform: IntegrationCatalogEntry,\n enabled: boolean,\n ) => {\n setTogglingPlatform(platform.id);\n try {\n await setIntegrationEnabled(platform.id, !enabled);\n toast.success(\n enabled\n ? `${platform.name} disconnected`\n : `${platform.name} connected`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to update integration\",\n );\n } finally {\n setTogglingPlatform(null);\n }\n };\n\n const runSetup = async (platform: IntegrationCatalogEntry) => {\n setSetupPlatform(platform.id);\n try {\n await setupIntegration(platform.id);\n toast.success(\n platform.id === \"telegram\"\n ? \"Telegram webhook registered\"\n : `${platform.name} setup complete`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : `Failed to set up ${platform.name}`,\n );\n } finally {\n setSetupPlatform(null);\n }\n };\n\n const copyWebhook = async (webhookUrl: string) => {\n await navigator.clipboard.writeText(webhookUrl);\n setCopiedWebhook(webhookUrl);\n toast.success(\"Webhook URL copied\");\n setTimeout(() => setCopiedWebhook(null), 1500);\n };\n\n const runInstallationAction = async (\n installation: ClientIntegrationInstallation,\n action: \"test\" | \"disconnect\",\n ) => {\n setInstallationAction(`${action}:${installation.id}`);\n try {\n await (action === \"test\"\n ? testManagedIntegrationInstallation(installation.id)\n : disconnectManagedIntegrationInstallation(installation.id));\n setInstallations(await listManagedIntegrationInstallations(\"slack\"));\n toast.success(\n action === \"test\"\n ? t(\"messaging.managed.connectionChecked\")\n : t(\"messaging.managed.workspaceDisconnected\"),\n );\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.actionFailed\"),\n );\n } finally {\n setInstallationAction(null);\n }\n };\n\n const updateScopePolicy = async (\n scope: ClientIntegrationScope,\n policy: Partial<ClientIntegrationScope[\"policy\"]>,\n ) => {\n setSavingScope(scope.id);\n try {\n await saveManagedIntegrationScope({\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n conversationType: scope.conversationType,\n trust: scope.trust,\n orgId: scope.orgId,\n serviceOwnerEmail: scope.serviceOwnerEmail,\n defaultModel: scope.defaultModel,\n policy: { ...scope.policy, ...policy },\n });\n setScopes(await listManagedIntegrationScopes(\"slack\"));\n toast.success(t(\"messaging.managed.channelPolicyUpdated\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.policyUpdateFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n const saveScopeBudget = async (scope: ClientIntegrationScope) => {\n const dollars = Number(scopeBudget[scope.id]);\n if (!Number.isFinite(dollars) || dollars <= 0) {\n toast.error(t(\"messaging.managed.positiveMonthlyBudget\"));\n return;\n }\n setSavingScope(`budget:${scope.id}`);\n try {\n await saveManagedIntegrationBudget({\n subject: {\n type: \"scope\",\n scope: {\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n },\n },\n period: \"month\",\n limitMicros: Math.round(dollars * 1_000_000),\n });\n setBudgets(await listManagedIntegrationBudgets());\n toast.success(t(\"messaging.managed.channelBudgetSaved\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.budgetSaveFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 xl:grid-cols-2\">\n {CHANNELS.map((platform) => {\n const status = statusByPlatform.get(platform.id);\n const configured =\n !!status?.configured ||\n (platform.id === \"slack\" &&\n installations.some(\n (installation) => installation.status === \"connected\",\n ));\n const enabled = !!status?.enabled;\n const envKeys = platform.credentialRequirements;\n const missingRequiredCredentials = hasMissingRequiredCredentials(\n envKeys,\n envStatusByKey,\n );\n const Icon = PLATFORM_ICONS[platform.iconKey] ?? IconPlug;\n\n return (\n <section\n key={platform.id}\n className=\"rounded-2xl border bg-card p-5\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl border bg-muted/30 text-foreground\">\n <Icon size={18} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {platform.name}\n </h3>\n <ConnectionStatus\n configured={configured}\n enabled={enabled}\n />\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {platform.description}\n </p>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs text-muted-foreground\"\n >\n <a\n href={platform.documentation.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Docs\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n {platform.documentation.externalHref ? (\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs text-muted-foreground\"\n >\n <a\n href={platform.documentation.externalHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {platform.documentation.externalLabel ?? \"Open\"}\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n\n {platform.id === \"slack\" ? (\n <div className=\"mt-5 space-y-3 rounded-xl border bg-muted/20 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {t(\"messaging.managed.title\")}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"messaging.managed.description\")}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"messaging.managed.agentManifestDescription\")}\n </p>\n </div>\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <a href={managedSlackAgentManifestUrl()}>\n <IconFileDescription className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.agentManifest\")}\n </a>\n </Button>\n {missingRequiredCredentials ? (\n <Button size=\"sm\" disabled>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </Button>\n ) : (\n <Button asChild size=\"sm\">\n <a href={managedIntegrationOAuthUrl(\"slack\")}>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </a>\n </Button>\n )}\n </div>\n {missingRequiredCredentials ? (\n <p className=\"max-w-72 text-xs text-amber-700 dark:text-amber-300\">\n {t(\"messaging.managed.requiredCredentials\")}\n </p>\n ) : null}\n </div>\n </div>\n {installations.length ? (\n <div className=\"space-y-2\">\n {installations.map((installation) => (\n <div\n key={installation.id}\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-lg border bg-background/60 px-3 py-2\"\n >\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {installation.teamName ||\n installation.enterpriseName ||\n installation.teamId ||\n t(\"messaging.managed.workspaceFallback\")}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {t(\"messaging.managed.scopesUpdated\", {\n count: installation.scopes.length,\n date: formatDate(installation.updatedAt, {\n dateStyle: \"medium\",\n }),\n })}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusPill\n tone={\n installation.health === \"healthy\"\n ? \"success\"\n : installation.health === \"degraded\" ||\n installation.health === \"revoked\"\n ? \"warning\"\n : \"neutral\"\n }\n label={t(\n `messaging.managed.health.${installation.health}`,\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(installation, \"test\")\n }\n disabled={\n installationAction === `test:${installation.id}`\n }\n >\n {t(\"messaging.managed.test\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(\n installation,\n \"disconnect\",\n )\n }\n disabled={\n installationAction ===\n `disconnect:${installation.id}`\n }\n >\n {t(\"messaging.managed.disconnect\")}\n </Button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.empty\")}\n </p>\n )}\n </div>\n ) : null}\n\n {platform.id === \"slack\" && scopes.length ? (\n <div className=\"mt-4 space-y-3 rounded-xl border bg-muted/20 p-4\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {t(\"messaging.managed.channelAccessTitle\")}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"messaging.managed.channelAccessDescription\")}\n </p>\n </div>\n {scopes.map((scope) => {\n const subjectId = JSON.stringify([\n scope.platform,\n scope.tenantId,\n scope.conversationId,\n ]);\n const budget = budgets.find(\n (item) =>\n item.subjectType === \"scope\" &&\n item.subjectId === subjectId &&\n item.period === \"month\",\n );\n return (\n <div\n key={scope.id}\n className=\"space-y-3 rounded-lg border bg-background/60 p-3\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <div className=\"font-mono text-xs text-foreground\">\n {scope.conversationId}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {t(\"messaging.managed.isolatedIdentity\", {\n trust: t(\n `messaging.managed.trust.${scope.trust}`,\n ),\n })}\n </div>\n </div>\n <StatusPill\n tone={\n scope.trust === \"trusted\" ? \"success\" : \"warning\"\n }\n label={t(`messaging.managed.trust.${scope.trust}`)}\n />\n </div>\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {[\n [\n \"requireMention\",\n t(\"messaging.managed.requireMention\"),\n ],\n [\"allowGuests\", t(\"messaging.managed.allowGuests\")],\n [\n \"allowExternalShared\",\n t(\"messaging.managed.allowSlackConnect\"),\n ],\n ].map(([key, label]) => (\n <label\n key={key}\n className=\"flex items-center justify-between gap-2 rounded-md border px-2.5 py-2 text-xs\"\n >\n {label}\n <Switch\n checked={\n scope.policy[\n key as keyof ClientIntegrationScope[\"policy\"]\n ]\n }\n disabled={savingScope === scope.id}\n onCheckedChange={(checked) =>\n updateScopePolicy(scope, { [key]: checked })\n }\n />\n </label>\n ))}\n </div>\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"min-w-40 flex-1 space-y-1\">\n <label className=\"text-xs font-medium text-foreground\">\n {t(\"messaging.managed.monthlyBudgetUsd\")}\n </label>\n <Input\n inputMode=\"decimal\"\n value={\n scopeBudget[scope.id] ??\n (budget\n ? String(budget.limitMicros / 1_000_000)\n : \"\")\n }\n onChange={(event) =>\n setScopeBudget((current) => ({\n ...current,\n [scope.id]: event.target.value,\n }))\n }\n placeholder=\"25\"\n />\n </div>\n <Button\n variant=\"outline\"\n onClick={() => saveScopeBudget(scope)}\n disabled={savingScope === `budget:${scope.id}`}\n >\n {t(\"messaging.managed.saveBudget\")}\n </Button>\n </div>\n </div>\n );\n })}\n </div>\n ) : null}\n\n <Collapsible className=\"mt-5\">\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n <IconChevronRight className=\"h-3.5 w-3.5 transition-transform group-data-[state=open]:rotate-90\" />\n <span>Setup steps</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-2 rounded-xl border bg-muted/20 p-4\">\n <ol className=\"space-y-2 text-sm text-muted-foreground\">\n {platform.setup.steps.map((step, index) => (\n <li key={step} className=\"flex gap-2\">\n <span className=\"text-muted-foreground/60\">\n {index + 1}.\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </div>\n </CollapsibleContent>\n </Collapsible>\n\n <div className=\"mt-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-sm font-medium text-foreground\">\n Credentials\n </div>\n {envLoading ? (\n <span className=\"text-xs text-muted-foreground\">\n Checking...\n </span>\n ) : null}\n </div>\n <div className=\"space-y-3\">\n {envKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText = envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n // Email agent address is not a secret — show it plainly\n // so users can copy and share it.\n const isPublicValue = envKey.key === \"EMAIL_AGENT_ADDRESS\";\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n {!envKey.required ? (\n <span className=\"ml-1 text-muted-foreground\">\n (optional)\n </span>\n ) : null}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n {isConfigured ? (\n <StatusPill tone=\"success\" label=\"Saved\" />\n ) : (\n <StatusPill\n tone=\"neutral\"\n label={envKey.required ? \"Missing\" : \"Not set\"}\n />\n )}\n </div>\n {isConfigured && isPublicValue ? (\n <PublicValueReveal envKey={envKey.key} />\n ) : !isConfigured ? (\n <Input\n type={isPublicValue ? \"text\" : \"password\"}\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={\n isPublicValue\n ? \"agent@yourcompany.com\"\n : `Enter ${label}`\n }\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n {missingRequiredCredentials ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n envKeys.map((k) => k.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Save credentials\"\n )}\n </Button>\n ) : null}\n </div>\n\n {status?.webhookUrl ? (\n <div className=\"mt-4 space-y-2\">\n <div className=\"text-sm font-medium text-foreground\">\n Webhook URL\n </div>\n <div className=\"flex items-center gap-2\">\n <code className=\"flex-1 truncate rounded-md border bg-muted/30 px-3 py-2 text-xs text-foreground\">\n {status.webhookUrl}\n </code>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => copyWebhook(status.webhookUrl!)}\n aria-label={`Copy ${platform.name} webhook URL`}\n >\n {copiedWebhook === status.webhookUrl ? (\n <IconCheck className=\"h-4 w-4\" />\n ) : (\n <IconCopy className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-5 flex flex-wrap items-center justify-end gap-2 border-t border-border pt-4\">\n {platform.id === \"telegram\" && configured ? (\n <Button\n variant=\"outline\"\n onClick={() => runSetup(platform)}\n disabled={setupPlatform === platform.id}\n >\n {setupPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Setting up...\n </>\n ) : (\n \"Set up webhook\"\n )}\n </Button>\n ) : null}\n {!configured && !enabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>\n <Button disabled>Enable</Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Save the required credentials first.\n </TooltipContent>\n </Tooltip>\n ) : (\n <Button\n onClick={() => togglePlatform(platform, enabled)}\n disabled={togglingPlatform === platform.id}\n >\n {togglingPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : enabled ? (\n \"Disable\"\n ) : (\n \"Enable\"\n )}\n </Button>\n )}\n </div>\n </section>\n );\n })}\n </div>\n\n {loading ? (\n <div className=\"rounded-2xl border border-dashed px-4 py-6 text-sm text-muted-foreground\">\n Loading messaging status...\n </div>\n ) : null}\n </div>\n );\n}\n"]}
@@ -5,6 +5,6 @@ export function meta() {
5
5
  return [{ title: "Messaging — Dispatch" }];
6
6
  }
7
7
  export default function MessagingRoute() {
8
- return (_jsx(DispatchShell, { title: "Messaging", description: "Connect Slack and Telegram directly in dispatch so inbound conversations come through one place.", children: _jsx(MessagingSetupPanel, {}) }));
8
+ return (_jsx(DispatchShell, { title: "Messaging", description: "Connect Slack, Microsoft Teams, Discord interactions, Telegram, WhatsApp Cloud API, or provider-webhook email so supported inbound conversations reach one Dispatch inbox.", children: _jsx(MessagingSetupPanel, {}) }));
9
9
  }
10
10
  //# sourceMappingURL=messaging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/routes/pages/messaging.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc;IACpC,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,WAAW,EACjB,WAAW,EAAC,kGAAkG,YAE9G,KAAC,mBAAmB,KAAG,GACT,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { DispatchShell } from \"../../components/dispatch-shell\";\nimport { MessagingSetupPanel } from \"../../components/messaging-setup-panel\";\n\nexport function meta() {\n return [{ title: \"Messaging — Dispatch\" }];\n}\n\nexport default function MessagingRoute() {\n return (\n <DispatchShell\n title=\"Messaging\"\n description=\"Connect Slack and Telegram directly in dispatch so inbound conversations come through one place.\"\n >\n <MessagingSetupPanel />\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/routes/pages/messaging.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc;IACpC,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,WAAW,EACjB,WAAW,EAAC,4KAA4K,YAExL,KAAC,mBAAmB,KAAG,GACT,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { DispatchShell } from \"../../components/dispatch-shell\";\nimport { MessagingSetupPanel } from \"../../components/messaging-setup-panel\";\n\nexport function meta() {\n return [{ title: \"Messaging — Dispatch\" }];\n}\n\nexport default function MessagingRoute() {\n return (\n <DispatchShell\n title=\"Messaging\"\n description=\"Connect Slack, Microsoft Teams, Discord interactions, Telegram, WhatsApp Cloud API, or provider-webhook email so supported inbound conversations reach one Dispatch inbox.\"\n >\n <MessagingSetupPanel />\n </DispatchShell>\n );\n}\n"]}
@@ -1,6 +1,12 @@
1
- import type { IncomingMessage, PlatformAdapter } from "@agent-native/core/server";
1
+ import type { IncomingMessage, IntegrationExecutionContext, PlatformAdapter } from "@agent-native/core/server";
2
2
  export declare function identityKeyForIncoming(incoming: IncomingMessage): string | null;
3
3
  export declare function resolveDispatchOwner(incoming: IncomingMessage): Promise<string>;
4
+ /**
5
+ * Resolve a personal DM user or a workspace-qualified channel service
6
+ * principal. Managed Slack channels never silently inherit one requester's
7
+ * personal credentials or memory.
8
+ */
9
+ export declare function resolveDispatchExecutionContext(incoming: IncomingMessage): Promise<IntegrationExecutionContext>;
4
10
  export declare function beforeDispatchProcess(incoming: IncomingMessage, adapter: PlatformAdapter): Promise<{
5
11
  handled: true;
6
12
  responseText?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-integrations.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-integrations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAsBnC,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,GACxB,MAAM,GAAG,IAAI,CAmBf;AA4ID,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CA8DjB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC,CA0CxE"}
1
+ {"version":3,"file":"dispatch-integrations.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-integrations.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,eAAe,EACf,2BAA2B,EAC3B,eAAe,EAChB,MAAM,2BAA2B,CAAC;AA2BnC,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,GACxB,MAAM,GAAG,IAAI,CAmBf;AA4OD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CA8DjB;AAED;;;;GAIG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,2BAA2B,CAAC,CAgGtC;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC,CAwDxE"}
@@ -1,7 +1,9 @@
1
1
  import crypto from "node:crypto";
2
+ import { evaluateIntegrationScopePolicy, getActiveIntegrationInstallationByKey, getIntegrationScope, resolveIntegrationTokenBundle, saveIntegrationScope, slackInstallationKey, } from "@agent-native/core/integrations";
2
3
  import { resolveOrgIdForEmail } from "@agent-native/core/org";
3
- import { withConfiguredAppBasePath } from "@agent-native/core/server";
4
+ import { readDeployCredentialEnv, resolveSecret, withConfiguredAppBasePath, } from "@agent-native/core/server";
4
5
  import { handleRemoteCodeCommand } from "./dispatch-remote-commands.js";
6
+ import { dispatchIntegrationRoutingHint, } from "./dispatch-routing.js";
5
7
  import { consumeLinkToken, resolveLinkedOwner } from "./dispatch-store.js";
6
8
  const slackProfileCache = new Map();
7
9
  const SLACK_PROFILE_CACHE_TTL = 10 * 60 * 1000;
@@ -76,6 +78,27 @@ function configuredDispatchIdentitiesUrl() {
76
78
  return null;
77
79
  }
78
80
  }
81
+ async function resolveManagedSlackInstallation(incoming) {
82
+ if (incoming.platform !== "slack")
83
+ return null;
84
+ const teamId = contextString(incoming.platformContext.teamId);
85
+ const apiAppId = contextString(incoming.platformContext.apiAppId);
86
+ if (!teamId)
87
+ return null;
88
+ try {
89
+ return await getActiveIntegrationInstallationByKey("slack", slackInstallationKey({ teamId, apiAppId }));
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ async function resolveManagedSlackToken(incoming) {
96
+ const installation = await resolveManagedSlackInstallation(incoming);
97
+ if (!installation)
98
+ return null;
99
+ const bundle = await resolveIntegrationTokenBundle("slack", installation.installationKey);
100
+ return bundle?.accessToken ?? null;
101
+ }
79
102
  function formatTelegramLinkRequiredMessage() {
80
103
  const identitiesUrl = configuredDispatchIdentitiesUrl();
81
104
  const linkStep = identitiesUrl
@@ -83,14 +106,26 @@ function formatTelegramLinkRequiredMessage() {
83
106
  : "Open Dispatch while signed in, create a Telegram link token, then send `/link <token>` here.";
84
107
  return `Telegram is connected, but this Telegram account is not linked to an Agent-Native user yet. ${linkStep} After that I can use your Builder.io org and connected apps.`;
85
108
  }
109
+ function formatSlackLinkRequiredMessage() {
110
+ const identitiesUrl = configuredDispatchIdentitiesUrl();
111
+ const linkStep = identitiesUrl
112
+ ? `Open ${identitiesUrl}, create a Slack link token, then send \`/link <token>\` in this DM.`
113
+ : "Open Dispatch while signed in, create a Slack link token, then send `/link <token>` in this DM.";
114
+ return `Agent Native is ready, but this Slack account is not linked to an Agent Native user yet. ${linkStep}`;
115
+ }
86
116
  async function resolveSlackSenderProfile(incoming) {
87
- if (incoming.platform !== "slack")
88
- return { email: null, name: null };
89
- const token = process.env.SLACK_BOT_TOKEN;
117
+ if (incoming.platform !== "slack") {
118
+ return { email: null, name: null, trust: "unknown" };
119
+ }
120
+ const managedToken = await resolveManagedSlackToken(incoming);
121
+ const token = managedToken ??
122
+ (await resolveSecret("SLACK_BOT_TOKEN")) ??
123
+ readDeployCredentialEnv("SLACK_BOT_TOKEN");
90
124
  const userId = contextString(incoming.senderId);
91
125
  const teamId = contextString(incoming.platformContext.teamId);
92
- if (!token || !userId)
93
- return { email: null, name: null };
126
+ if (!token || !userId) {
127
+ return { email: null, name: null, trust: "unknown" };
128
+ }
94
129
  // Slack user IDs are scoped per workspace, so without a teamId we can't
95
130
  // safely cache: two installs of the bot in different workspaces could
96
131
  // share user-id strings and collide on a single "default" key. Skip the
@@ -115,8 +150,13 @@ async function resolveSlackSenderProfile(incoming) {
115
150
  data.user?.real_name?.trim() ||
116
151
  data.user?.name?.trim() ||
117
152
  null,
153
+ trust: data.user?.is_ultra_restricted === true
154
+ ? "external_shared"
155
+ : data.user?.is_restricted === true
156
+ ? "guest"
157
+ : "trusted",
118
158
  }
119
- : { email: null, name: null };
159
+ : { email: null, name: null, trust: "unknown" };
120
160
  if (cacheKey) {
121
161
  slackProfileCache.set(cacheKey, {
122
162
  profile,
@@ -126,7 +166,7 @@ async function resolveSlackSenderProfile(incoming) {
126
166
  return profile;
127
167
  }
128
168
  catch {
129
- return { email: null, name: null };
169
+ return { email: null, name: null, trust: "unknown" };
130
170
  }
131
171
  }
132
172
  async function resolveSlackOwnerFromVerifiedEmail(incoming) {
@@ -142,6 +182,35 @@ async function resolveSlackOwnerFromVerifiedEmail(incoming) {
142
182
  const orgId = await resolveOrgIdForEmail(profile.email);
143
183
  return orgId ? profile.email : null;
144
184
  }
185
+ async function resolveSlackConversationTrust(incoming, actorTrust) {
186
+ if (incoming.triggerKind === "dm") {
187
+ return { trust: actorTrust, conversationType: "direct_message" };
188
+ }
189
+ const token = await resolveManagedSlackToken(incoming);
190
+ const channel = contextString(incoming.platformContext.channelId);
191
+ if (!token || !channel) {
192
+ return { trust: "unknown", conversationType: "channel" };
193
+ }
194
+ try {
195
+ const params = new URLSearchParams({ channel });
196
+ const response = await fetch(`https://slack.com/api/conversations.info?${params}`, { headers: { Authorization: `Bearer ${token}` } });
197
+ const data = (await response.json());
198
+ if (!data.ok) {
199
+ return { trust: "unknown", conversationType: "channel" };
200
+ }
201
+ return {
202
+ trust: data.channel?.is_ext_shared ? "external_shared" : actorTrust,
203
+ conversationType: data.channel?.is_im
204
+ ? "direct_message"
205
+ : data.channel?.is_mpim
206
+ ? "group_direct_message"
207
+ : "channel",
208
+ };
209
+ }
210
+ catch {
211
+ return { trust: "unknown", conversationType: "channel" };
212
+ }
213
+ }
145
214
  export async function resolveDispatchOwner(incoming) {
146
215
  try {
147
216
  const externalUserId = identityKeyForIncoming(incoming);
@@ -204,11 +273,112 @@ export async function resolveDispatchOwner(incoming) {
204
273
  return fallbackOwnerForIncoming(incoming);
205
274
  }
206
275
  }
276
+ /**
277
+ * Resolve a personal DM user or a workspace-qualified channel service
278
+ * principal. Managed Slack channels never silently inherit one requester's
279
+ * personal credentials or memory.
280
+ */
281
+ export async function resolveDispatchExecutionContext(incoming) {
282
+ if (incoming.platform !== "slack" || incoming.triggerKind === "dm") {
283
+ const ownerEmail = await resolveDispatchOwner(incoming);
284
+ if (incoming.platform === "slack" &&
285
+ ownerEmail.endsWith("@integration.local")) {
286
+ // Preserve a credential-less principal long enough for beforeProcess to
287
+ // deliver linking guidance or consume `/link <token>`. Never run the
288
+ // agent under this synthetic owner.
289
+ incoming.platformContext.identityLinkRequired = true;
290
+ }
291
+ return {
292
+ ownerEmail,
293
+ orgId: (await resolveOrgIdForEmail(ownerEmail)) ?? null,
294
+ principalType: "user",
295
+ };
296
+ }
297
+ const installation = await resolveManagedSlackInstallation(incoming);
298
+ if (!installation) {
299
+ // Preserve the legacy manually configured app path while managed installs
300
+ // roll out. Its behavior remains explicit and visible in Settings.
301
+ const ownerEmail = await resolveDispatchOwner(incoming);
302
+ return {
303
+ ownerEmail,
304
+ orgId: (await resolveOrgIdForEmail(ownerEmail)) ?? null,
305
+ principalType: "user",
306
+ };
307
+ }
308
+ const teamId = contextString(incoming.platformContext.teamId);
309
+ const channelId = contextString(incoming.platformContext.channelId);
310
+ if (!teamId || !channelId) {
311
+ throw new Error("Slack channel identity is incomplete");
312
+ }
313
+ const profile = await resolveSlackSenderProfile(incoming);
314
+ const conversation = await resolveSlackConversationTrust(incoming, profile.trust);
315
+ const access = {
316
+ ownerEmail: installation.ownerEmail,
317
+ orgId: installation.orgId,
318
+ };
319
+ const key = {
320
+ platform: "slack",
321
+ tenantId: teamId,
322
+ conversationId: channelId,
323
+ };
324
+ let scope = await getIntegrationScope(key, access);
325
+ if (!scope && incoming.triggerKind === "mention") {
326
+ scope = await saveIntegrationScope({
327
+ ...key,
328
+ conversationType: conversation.conversationType,
329
+ trust: conversation.trust,
330
+ orgId: installation.orgId,
331
+ installationId: installation.id,
332
+ }, access);
333
+ }
334
+ if (!scope)
335
+ throw new Error("Slack channel is not enabled for Agent Native");
336
+ const decision = evaluateIntegrationScopePolicy(scope, {
337
+ // Thread replies reached this point only after the adapter's active-task
338
+ // gate, so they are continuation steering rather than ambient chatter.
339
+ mentioned: incoming.triggerKind === "mention" ||
340
+ incoming.triggerKind === "thread_reply",
341
+ });
342
+ if (!decision.allowed) {
343
+ throw new Error(`Slack channel policy denied: ${decision.reason}`);
344
+ }
345
+ incoming.integrationScopeId = scope.id;
346
+ if (scope.defaultModel) {
347
+ incoming.platformContext.defaultModel = scope.defaultModel;
348
+ }
349
+ incoming.actorTrust = {
350
+ memberType: conversation.trust === "guest"
351
+ ? "guest"
352
+ : conversation.trust === "external_shared"
353
+ ? "external"
354
+ : conversation.trust === "trusted"
355
+ ? "member"
356
+ : "unknown",
357
+ verified: conversation.trust !== "unknown",
358
+ };
359
+ return {
360
+ ownerEmail: scope.serviceOwnerEmail,
361
+ orgId: scope.orgId,
362
+ principalType: "service",
363
+ installationId: installation.id,
364
+ scopeId: scope.id,
365
+ };
366
+ }
207
367
  export async function beforeDispatchProcess(incoming, adapter) {
208
368
  const trimmed = incoming.text.trim();
209
369
  const commandText = contextString(incoming.platformContext.rawText) || trimmed;
210
370
  const match = commandText.match(/^\/link(?:@\w+)?\s+([a-zA-Z0-9_-]+)$/);
211
371
  if (!match) {
372
+ const routedIncoming = incoming;
373
+ routedIncoming.routingHint ??= dispatchIntegrationRoutingHint(trimmed);
374
+ if (incoming.platform === "slack" &&
375
+ incoming.triggerKind === "dm" &&
376
+ incoming.platformContext.identityLinkRequired === true) {
377
+ return {
378
+ handled: true,
379
+ responseText: formatSlackLinkRequiredMessage(),
380
+ };
381
+ }
212
382
  if (platformRequiresExplicitLink(incoming)) {
213
383
  const owner = await resolveLinkedOwner(incoming.platform, identityKeyForIncoming(incoming), { allowAnyOrgFallback: true });
214
384
  if (!owner) {