@agent-native/dispatch 0.14.1 → 0.14.3

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.
@@ -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 {\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"]}
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 primaryEnvKeys = envKeys.filter(\n (envKey) => envKey.key !== \"SLACK_BOT_TOKEN\",\n );\n const legacyEnvKeys = envKeys.filter(\n (envKey) => envKey.key === \"SLACK_BOT_TOKEN\",\n );\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 {primaryEnvKeys.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 {legacyEnvKeys.length ? (\n <Collapsible>\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>{legacyEnvKeys[0]?.label}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-2 space-y-3 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4\">\n <p className=\"text-xs text-muted-foreground\">\n {legacyEnvKeys[0]?.helpText}\n </p>\n {legacyEnvKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText =\n envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\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 </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n <StatusPill\n tone={isConfigured ? \"success\" : \"neutral\"}\n label={isConfigured ? \"Saved\" : \"Not set\"}\n />\n </div>\n {!isConfigured ? (\n <Input\n type=\"password\"\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={`Enter ${label}`}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n {legacyEnvKeys.some(\n (envKey) =>\n !envStatusByKey.get(envKey.key)?.configured,\n ) ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n legacyEnvKeys.map((envKey) => envKey.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id\n ? \"Saving...\"\n : \"Save credentials\"}\n </Button>\n ) : null}\n </div>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\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"]}
@@ -35,7 +35,7 @@ export interface DispatchCtx {
35
35
  }
36
36
  export declare function requireDispatchCtx(): DispatchCtx;
37
37
  export declare function getApprovalPolicy(): Promise<DispatchApprovalPolicy>;
38
- export declare function setApprovalPolicy(input: DispatchApprovalPolicy): Promise<DispatchApprovalPolicy | {
38
+ export declare function setApprovalPolicy(input: DispatchApprovalPolicy): Promise<{
39
39
  id: string;
40
40
  ownerEmail: string;
41
41
  orgId: string | null;
@@ -52,6 +52,9 @@ export declare function setApprovalPolicy(input: DispatchApprovalPolicy): Promis
52
52
  reviewedAt: number | null;
53
53
  createdAt: number;
54
54
  updatedAt: number;
55
+ } | {
56
+ enabled: boolean;
57
+ approverEmails: string[];
55
58
  }>;
56
59
  export declare function recordAudit(input: {
57
60
  action: string;
@@ -206,39 +209,39 @@ export declare function listApprovalRequests(): Promise<{
206
209
  updatedAt: number;
207
210
  }[]>;
208
211
  export declare function approveRequest(requestId: string): Promise<{
212
+ afterValue: string | null;
213
+ beforeValue: string | null;
214
+ changeType: string;
215
+ createdAt: number;
209
216
  id: string;
210
- ownerEmail: string;
211
217
  orgId: string | null;
212
- changeType: string;
213
- targetType: string;
214
- targetId: string | null;
215
- status: string;
216
- summary: string;
218
+ ownerEmail: string;
217
219
  payload: string;
218
- beforeValue: string | null;
219
- afterValue: string | null;
220
220
  requestedBy: string;
221
- reviewedBy: string | null;
222
221
  reviewedAt: number | null;
223
- createdAt: number;
222
+ reviewedBy: string | null;
223
+ status: string;
224
+ summary: string;
225
+ targetId: string | null;
226
+ targetType: string;
224
227
  updatedAt: number;
225
228
  }>;
226
229
  export declare function rejectRequest(requestId: string, reason?: string | null): Promise<{
230
+ afterValue: string | null;
231
+ beforeValue: string | null;
232
+ changeType: string;
233
+ createdAt: number;
227
234
  id: string;
228
- ownerEmail: string;
229
235
  orgId: string | null;
230
- changeType: string;
231
- targetType: string;
232
- targetId: string | null;
233
- status: string;
234
- summary: string;
236
+ ownerEmail: string;
235
237
  payload: string;
236
- beforeValue: string | null;
237
- afterValue: string | null;
238
238
  requestedBy: string;
239
- reviewedBy: string | null;
240
239
  reviewedAt: number | null;
241
- createdAt: number;
240
+ reviewedBy: string | null;
241
+ status: string;
242
+ summary: string;
243
+ targetId: string | null;
244
+ targetType: string;
242
245
  updatedAt: number;
243
246
  }>;
244
247
  export declare function createLinkToken(platform: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/dispatch-store.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import crypto from "node:crypto";
2
- import { and, desc, eq, isNull, or } from "@agent-native/core/db/schema";
2
+ import { and, desc, eq, isNull, or, sql } from "@agent-native/core/db/schema";
3
3
  import { getRequestUserEmail, getRequestOrgId, } from "@agent-native/core/server";
4
4
  import { getOrgSetting, putOrgSetting } from "@agent-native/core/settings";
5
5
  import { getDb, schema } from "../../db/index.js";
6
6
  export const SHARED_DISPATCH_OWNER = "dispatch@shared";
7
7
  const APPROVAL_POLICY_KEY = "dispatch-approval-policy";
8
+ const APPROVAL_APPLY_LEASE_MS = 5 * 60 * 1000;
8
9
  // ─── /link rate limiting ──────────────────────────────────────────────────
9
10
  //
10
11
  // Failed `/link <token>` attempts are rate-limited per `(platform, externalUserId)`
@@ -116,8 +117,7 @@ export async function getApprovalPolicy() {
116
117
  : [],
117
118
  };
118
119
  }
119
- async function applyApprovalPolicy(input, actor = currentOwnerEmail()) {
120
- const orgId = currentOrgId();
120
+ async function applyApprovalPolicy(input, actor = currentOwnerEmail(), orgId = currentOrgId()) {
121
121
  if (!orgId) {
122
122
  throw new Error("Dispatch approval settings require an active organization");
123
123
  }
@@ -135,7 +135,10 @@ async function applyApprovalPolicy(input, actor = currentOwnerEmail()) {
135
135
  metadata: input,
136
136
  actor,
137
137
  });
138
- return getApprovalPolicy();
138
+ return {
139
+ enabled: input.enabled,
140
+ approverEmails: input.approverEmails,
141
+ };
139
142
  }
140
143
  export async function setApprovalPolicy(input) {
141
144
  const current = await getApprovalPolicy();
@@ -395,7 +398,7 @@ async function applyApprovedRequest(request) {
395
398
  return applyDestinationDelete(payload.id, request.reviewedBy || currentOwnerEmail(), requestCtx);
396
399
  }
397
400
  if (request.changeType === "approval-policy.update") {
398
- return applyApprovalPolicy(payload, request.reviewedBy || currentOwnerEmail());
401
+ return applyApprovalPolicy(payload, request.reviewedBy || currentOwnerEmail(), requestCtx.orgId);
399
402
  }
400
403
  if (request.changeType === "dream-proposal.apply") {
401
404
  const { applyApprovedDreamProposal } = await import("./dreams-store.js");
@@ -421,23 +424,53 @@ export async function approveRequest(requestId) {
421
424
  const request = await getApprovalRequest(requestId, ctx);
422
425
  if (!request)
423
426
  throw new Error("Approval request not found");
424
- if (request.status !== "pending") {
425
- throw new Error("Only pending approvals can be approved");
426
- }
427
427
  const timestamp = now();
428
- await db
428
+ const staleApplyingBefore = timestamp - APPROVAL_APPLY_LEASE_MS;
429
+ // Fence the transition on the current status so a concurrent approve can't
430
+ // both win. A crashed worker can leave its lease in "applying", so reclaim
431
+ // only a lease that has been idle for the full lease interval.
432
+ const claimed = await db
433
+ .update(schema.dispatchApprovalRequests)
434
+ .set({
435
+ status: "applying",
436
+ updatedAt: timestamp,
437
+ })
438
+ .where(and(eq(schema.dispatchApprovalRequests.id, requestId), ctxScope(schema.dispatchApprovalRequests, ctx), or(eq(schema.dispatchApprovalRequests.status, "pending"), and(eq(schema.dispatchApprovalRequests.status, "applying"), sql `${schema.dispatchApprovalRequests.updatedAt} < ${staleApplyingBefore}`))))
439
+ .returning();
440
+ if (claimed.length === 0) {
441
+ const current = (await getApprovalRequest(requestId, ctx)) ?? request;
442
+ if (current.status === "applying") {
443
+ throw new Error("Approval is already being applied");
444
+ }
445
+ return current;
446
+ }
447
+ const applying = claimed[0];
448
+ try {
449
+ await applyApprovedRequest(applying);
450
+ }
451
+ catch (error) {
452
+ // Applying a request can have succeeded partially before throwing. Do not
453
+ // return it to pending: that would allow an immediate retry to duplicate a
454
+ // non-idempotent effect. Keep the lease until it becomes stale, which
455
+ // serializes any recovery attempt behind the same fencing rule.
456
+ await db
457
+ .update(schema.dispatchApprovalRequests)
458
+ .set({ updatedAt: now() })
459
+ .where(and(eq(schema.dispatchApprovalRequests.id, requestId), ctxScope(schema.dispatchApprovalRequests, ctx), eq(schema.dispatchApprovalRequests.status, "applying")));
460
+ throw error;
461
+ }
462
+ const [updated] = await db
429
463
  .update(schema.dispatchApprovalRequests)
430
464
  .set({
431
465
  status: "approved",
432
466
  reviewedBy: currentOwnerEmail(),
433
467
  reviewedAt: timestamp,
434
- updatedAt: timestamp,
468
+ updatedAt: now(),
435
469
  })
436
- .where(eq(schema.dispatchApprovalRequests.id, requestId));
437
- const updated = await getApprovalRequest(requestId, ctx);
470
+ .where(and(eq(schema.dispatchApprovalRequests.id, requestId), eq(schema.dispatchApprovalRequests.status, "applying")))
471
+ .returning();
438
472
  if (!updated)
439
473
  throw new Error("Approval request disappeared");
440
- await applyApprovedRequest(updated);
441
474
  await recordAudit({
442
475
  action: "approval.approved",
443
476
  targetType: updated.targetType,
@@ -449,14 +482,12 @@ export async function approveRequest(requestId) {
449
482
  }
450
483
  export async function rejectRequest(requestId, reason) {
451
484
  const db = getDb();
452
- const request = await getApprovalRequest(requestId);
485
+ const ctx = requireDispatchCtx();
486
+ const request = await getApprovalRequest(requestId, ctx);
453
487
  if (!request)
454
488
  throw new Error("Approval request not found");
455
- if (request.status !== "pending") {
456
- throw new Error("Only pending approvals can be rejected");
457
- }
458
489
  const timestamp = now();
459
- await db
490
+ const claimed = await db
460
491
  .update(schema.dispatchApprovalRequests)
461
492
  .set({
462
493
  status: "rejected",
@@ -464,15 +495,20 @@ export async function rejectRequest(requestId, reason) {
464
495
  reviewedAt: timestamp,
465
496
  updatedAt: timestamp,
466
497
  })
467
- .where(eq(schema.dispatchApprovalRequests.id, requestId));
498
+ .where(and(eq(schema.dispatchApprovalRequests.id, requestId), eq(schema.dispatchApprovalRequests.status, "pending")))
499
+ .returning();
500
+ if (claimed.length === 0) {
501
+ return (await getApprovalRequest(requestId, ctx)) ?? request;
502
+ }
503
+ const updated = claimed[0];
468
504
  await recordAudit({
469
505
  action: "approval.rejected",
470
- targetType: request.targetType,
506
+ targetType: updated.targetType,
471
507
  targetId: requestId,
472
- summary: `Rejected ${request.summary}`,
473
- metadata: { request, reason: reason || null },
508
+ summary: `Rejected ${updated.summary}`,
509
+ metadata: { request: updated, reason: reason || null },
474
510
  });
475
- return getApprovalRequest(requestId);
511
+ return updated;
476
512
  }
477
513
  export async function createLinkToken(platform) {
478
514
  const db = getDb();