@agent-native/dispatch 0.31.3 → 0.31.4

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":"transactional-email.$appId.$id.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.$appId.$id.tsx"],"names":[],"mappings":"AAiCA,wBAAgB,IAAI;;IAEnB;AAwHD,MAAM,CAAC,OAAO,UAAU,6BAA6B,oDAqNpD"}
1
+ {"version":3,"file":"transactional-email.$appId.$id.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.$appId.$id.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,IAAI;;IAEnB;AAwHD,MAAM,CAAC,OAAO,UAAU,6BAA6B,oDAqNpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactional-email.$appId.$id.js","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.$appId.$id.tsx"],"names":[],"mappings":"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","sourcesContent":["import { callAction, useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { IconAlertTriangle, IconArrowLeft } from \"@tabler/icons-react\";\nimport { useQueries, useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { Link, useLocation, useParams } from \"react-router\";\n\nimport {\n aggregateSharedEmails,\n callAppAction,\n fetchAppEmailCatalog,\n type AppEmailCatalog,\n type AppTransactionalEmail,\n type LocalTransactionalEmailCatalog,\n} from \"../../client/transactional-emails\";\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n ActivityTable,\n type EmailActivityEntry,\n} from \"../../components/transactional-email-activity\";\nimport {\n OpenRateCell,\n SendsCell,\n LastSentCell,\n type EmailEngagement,\n type ProviderMetricsResult,\n} from \"../../components/transactional-email-metrics\";\nimport { EmailPreviewPane } from \"../../components/transactional-email-preview\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\n\nexport function meta() {\n return [{ title: \"Transactional email detail — Dispatch\" }];\n}\n\nconst WINDOW_DAYS = 30;\nconst ACTIVITY_LIMIT = 50;\n\ninterface WorkspaceAppRef {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n}\n\n/**\n * Resolves the one email this page shows, plus the app name/path to display.\n * The \"core\" appId is Dispatch's own registry, not a cross-app fetch — see\n * the same split in transactional-email.tsx.\n */\nfunction useEmailDetail(appId: string, id: string) {\n const isCore = appId === \"core\";\n const t = useT();\n\n const localQuery = useActionQuery<LocalTransactionalEmailCatalog>(\n \"list-transactional-emails\",\n { windowDays: WINDOW_DAYS },\n { enabled: isCore },\n );\n\n const appsQuery = useActionQuery<WorkspaceAppRef[]>(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n const readyApps = useMemo(\n () =>\n (appsQuery.data ?? []).filter(\n (candidate) => candidate.status !== \"pending\",\n ),\n [appsQuery.data],\n );\n const app = useMemo(\n () => readyApps.find((candidate) => candidate.id === appId),\n [readyApps, appId],\n );\n const coreCatalogQueries = useQueries({\n queries: readyApps.map((candidate) => ({\n queryKey: [\"transactional-email-catalog\", candidate.id, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(candidate, WINDOW_DAYS),\n enabled: isCore,\n staleTime: Infinity,\n })),\n });\n const remoteQuery = useQuery({\n queryKey: [\"transactional-email-catalog\", appId, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(app!, WINDOW_DAYS),\n enabled: !isCore && !!app,\n staleTime: Infinity,\n });\n\n if (isCore) {\n const appCatalogs = coreCatalogQueries\n .map((query) => query.data)\n .filter((catalog): catalog is AppEmailCatalog => Boolean(catalog));\n const aggregate = localQuery.data\n ? aggregateSharedEmails(localQuery.data, appCatalogs)\n : undefined;\n const email = aggregate?.emails.find((candidate) => candidate.id === id);\n const catalogError = coreCatalogQueries.find(\n (query) => query.data?.error || query.data?.statsError,\n )?.data;\n const queryError = coreCatalogQueries.find((query) => query.isError)?.error;\n const isLoading =\n localQuery.isLoading ||\n appsQuery.isLoading ||\n coreCatalogQueries.some((query) => query.isLoading);\n const isError =\n localQuery.isError || appsQuery.isError || Boolean(queryError);\n return {\n isLoading,\n isError,\n error: localQuery.error ?? appsQuery.error ?? queryError,\n onRetry: () => {\n void localQuery.refetch();\n void appsQuery.refetch();\n for (const query of coreCatalogQueries) void query.refetch();\n },\n appName: t(\"dispatch.transactionalEmail.sharedTitle\"),\n appPath: t(\"dispatch.transactionalEmail.sharedSubtitle\"),\n email,\n catalogError:\n aggregate?.statsError ??\n catalogError?.error ??\n catalogError?.statsError ??\n null,\n notFound: !isLoading && !isError && !email,\n };\n }\n\n const notFound =\n !appsQuery.isLoading &&\n !appsQuery.isError &&\n (!app ||\n (!remoteQuery.isLoading &&\n !remoteQuery.isError &&\n !remoteQuery.data?.error &&\n !remoteQuery.data?.emails.some((candidate) => candidate.id === id)));\n\n return {\n isLoading: appsQuery.isLoading || remoteQuery.isLoading,\n isError: appsQuery.isError || remoteQuery.isError,\n error: appsQuery.error ?? remoteQuery.error,\n onRetry: () => {\n void appsQuery.refetch();\n void remoteQuery.refetch();\n },\n appName: app?.name ?? appId,\n appPath: app?.path ?? \"\",\n email: remoteQuery.data?.emails.find((candidate) => candidate.id === id),\n catalogError: remoteQuery.data?.error ?? null,\n notFound,\n };\n}\n\nexport default function TransactionalEmailDetailRoute() {\n const t = useT();\n const location = useLocation();\n const params = useParams<{ appId: string; id: string }>();\n const appId = params.appId ?? \"\";\n const id = params.id ?? \"\";\n\n const detail = useEmailDetail(appId, id);\n\n const sharedProviderReason = t(\n \"dispatch.transactionalEmail.sharedProviderMetricsUnavailable\",\n );\n const engagementQuery = useQuery({\n queryKey: [\"list-email-engagement\", detail.appPath, id, WINDOW_DAYS],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailEngagement[]>>(\n detail.appPath,\n \"list-email-engagement\",\n { templateIds: [id], windowDays: WINDOW_DAYS },\n \"POST\",\n ),\n enabled: appId !== \"core\" && id.length > 0 && detail.appPath.length > 0,\n });\n const engagementResult = engagementQuery.data;\n const engagementUnavailable =\n appId === \"core\"\n ? sharedProviderReason\n : engagementResult && !engagementResult.available\n ? engagementResult.reason\n : engagementQuery.isError\n ? engagementQuery.error instanceof Error\n ? engagementQuery.error.message\n : String(engagementQuery.error)\n : null;\n const engagement = engagementResult?.available\n ? engagementResult.data.find((entry) => entry.templateId === id)\n : undefined;\n\n const activityQuery = useQuery({\n queryKey: [\"list-email-activity\", detail.appPath, id, ACTIVITY_LIMIT],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailActivityEntry[]>>(\n detail.appPath,\n \"list-email-activity\",\n { templateId: id, limit: ACTIVITY_LIMIT },\n \"GET\",\n ),\n enabled:\n appId !== \"core\" &&\n id.length > 0 &&\n detail.appPath.length > 0 &&\n !engagementUnavailable,\n });\n\n return (\n <DispatchShell\n title={detail.email?.name ?? t(\"dispatch.transactionalEmail.title\")}\n description={t(\"dispatch.transactionalEmail.description\")}\n >\n <div className=\"max-w-3xl space-y-4\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2\">\n <Link\n to={\n location.pathname.startsWith(\"/admin/\")\n ? \"/admin/transactional-email\"\n : \"/transactional-email\"\n }\n >\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.transactionalEmail.title\")}\n </Link>\n </Button>\n\n {detail.isError ? (\n <ActionQueryError error={detail.error} onRetry={detail.onRetry} />\n ) : detail.isLoading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-6 w-64\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n ) : detail.notFound || !detail.email ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.emailNotFound\")}\n </AlertTitle>\n <AlertDescription>\n {detail.catalogError ??\n t(\"dispatch.transactionalEmail.emailNotFoundDescription\")}\n </AlertDescription>\n </Alert>\n ) : (\n <>\n <section className=\"rounded-2xl bg-card p-5\">\n <div className=\"text-lg font-semibold text-foreground\">\n {detail.email.name}\n </div>\n <div className=\"mt-1 font-mono text-xs text-muted-foreground\">\n {detail.email.id}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {detail.appName}\n {detail.appPath ? ` · ${detail.appPath}` : \"\"}\n </div>\n\n <dl className=\"mt-4 space-y-3 text-sm\">\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.trigger\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.trigger}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.recipient\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.recipient}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.sender\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.sender}\n </dd>\n </div>\n </dl>\n\n <div className=\"mt-4 flex flex-wrap gap-6 border-t pt-4 text-sm\">\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.sends\")}\n </div>\n <div className=\"mt-1\">\n <SendsCell\n sent={detail.email.sent}\n failed={detail.email.failed}\n />\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.openRate\")}\n </div>\n <div className=\"mt-1\">\n <OpenRateCell\n engagement={engagement}\n unavailableReason={engagementUnavailable}\n loading={engagementQuery.isLoading}\n />\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.lastSent\")}\n </div>\n <div className=\"mt-1\">\n <LastSentCell\n lastSentAt={detail.email.lastSentAt}\n sent={detail.email.sent}\n />\n </div>\n </div>\n </div>\n </section>\n\n <section className=\"rounded-2xl bg-card p-5\">\n <h2 className=\"text-sm font-medium text-foreground\">\n {t(\"dispatch.transactionalEmail.preview\")}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.previewDescription\")}\n </p>\n <div className=\"mt-4\">\n <EmailPreviewPane\n appId={appId}\n appPath={detail.appPath}\n id={detail.email.id}\n name={detail.email.name}\n />\n </div>\n </section>\n\n <section className=\"rounded-2xl bg-card p-5\">\n <h2 className=\"text-sm font-medium text-foreground\">\n {t(\"dispatch.transactionalEmail.activityLink\")}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </p>\n <div className=\"mt-4\">\n <ActivityTable\n result={\n engagementUnavailable\n ? { available: false, reason: engagementUnavailable }\n : activityQuery.data\n }\n isLoading={activityQuery.isLoading}\n isError={activityQuery.isError}\n error={activityQuery.error}\n onRetry={() => void activityQuery.refetch()}\n />\n </div>\n </section>\n </>\n )}\n </div>\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"transactional-email.$appId.$id.js","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.$appId.$id.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { IconAlertTriangle, IconArrowLeft } from \"@tabler/icons-react\";\nimport { useQueries, useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { Link, useLocation, useParams } from \"react-router\";\n\nimport {\n aggregateSharedEmails,\n callAppAction,\n fetchAppEmailCatalog,\n type AppEmailCatalog,\n type LocalTransactionalEmailCatalog,\n} from \"../../client/transactional-emails\";\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n ActivityTable,\n type EmailActivityEntry,\n} from \"../../components/transactional-email-activity\";\nimport {\n OpenRateCell,\n SendsCell,\n LastSentCell,\n type EmailEngagement,\n type ProviderMetricsResult,\n} from \"../../components/transactional-email-metrics\";\nimport { EmailPreviewPane } from \"../../components/transactional-email-preview\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\n\nexport function meta() {\n return [{ title: \"Transactional email detail — Dispatch\" }];\n}\n\nconst WINDOW_DAYS = 30;\nconst ACTIVITY_LIMIT = 50;\n\ninterface WorkspaceAppRef {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n}\n\n/**\n * Resolves the one email this page shows, plus the app name/path to display.\n * The \"core\" appId is Dispatch's own registry, not a cross-app fetch — see\n * the same split in transactional-email.tsx.\n */\nfunction useEmailDetail(appId: string, id: string) {\n const isCore = appId === \"core\";\n const t = useT();\n\n const localQuery = useActionQuery<LocalTransactionalEmailCatalog>(\n \"list-transactional-emails\",\n { windowDays: WINDOW_DAYS },\n { enabled: isCore },\n );\n\n const appsQuery = useActionQuery<WorkspaceAppRef[]>(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n const readyApps = useMemo(\n () =>\n (appsQuery.data ?? []).filter(\n (candidate) => candidate.status !== \"pending\",\n ),\n [appsQuery.data],\n );\n const app = useMemo(\n () => readyApps.find((candidate) => candidate.id === appId),\n [readyApps, appId],\n );\n const coreCatalogQueries = useQueries({\n queries: readyApps.map((candidate) => ({\n queryKey: [\"transactional-email-catalog\", candidate.id, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(candidate, WINDOW_DAYS),\n enabled: isCore,\n staleTime: Infinity,\n })),\n });\n const remoteQuery = useQuery({\n queryKey: [\"transactional-email-catalog\", appId, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(app!, WINDOW_DAYS),\n enabled: !isCore && !!app,\n staleTime: Infinity,\n });\n\n if (isCore) {\n const appCatalogs = coreCatalogQueries\n .map((query) => query.data)\n .filter((catalog): catalog is AppEmailCatalog => Boolean(catalog));\n const aggregate = localQuery.data\n ? aggregateSharedEmails(localQuery.data, appCatalogs)\n : undefined;\n const email = aggregate?.emails.find((candidate) => candidate.id === id);\n const catalogError = coreCatalogQueries.find(\n (query) => query.data?.error || query.data?.statsError,\n )?.data;\n const queryError = coreCatalogQueries.find((query) => query.isError)?.error;\n const isLoading =\n localQuery.isLoading ||\n appsQuery.isLoading ||\n coreCatalogQueries.some((query) => query.isLoading);\n const isError =\n localQuery.isError || appsQuery.isError || Boolean(queryError);\n return {\n isLoading,\n isError,\n error: localQuery.error ?? appsQuery.error ?? queryError,\n onRetry: () => {\n void localQuery.refetch();\n void appsQuery.refetch();\n for (const query of coreCatalogQueries) void query.refetch();\n },\n appName: t(\"dispatch.transactionalEmail.sharedTitle\"),\n appPath: t(\"dispatch.transactionalEmail.sharedSubtitle\"),\n email,\n catalogError:\n aggregate?.statsError ??\n catalogError?.error ??\n catalogError?.statsError ??\n null,\n notFound: !isLoading && !isError && !email,\n };\n }\n\n const notFound =\n !appsQuery.isLoading &&\n !appsQuery.isError &&\n (!app ||\n (!remoteQuery.isLoading &&\n !remoteQuery.isError &&\n !remoteQuery.data?.error &&\n !remoteQuery.data?.emails.some((candidate) => candidate.id === id)));\n\n return {\n isLoading: appsQuery.isLoading || remoteQuery.isLoading,\n isError: appsQuery.isError || remoteQuery.isError,\n error: appsQuery.error ?? remoteQuery.error,\n onRetry: () => {\n void appsQuery.refetch();\n void remoteQuery.refetch();\n },\n appName: app?.name ?? appId,\n appPath: app?.path ?? \"\",\n email: remoteQuery.data?.emails.find((candidate) => candidate.id === id),\n catalogError: remoteQuery.data?.error ?? null,\n notFound,\n };\n}\n\nexport default function TransactionalEmailDetailRoute() {\n const t = useT();\n const location = useLocation();\n const params = useParams<{ appId: string; id: string }>();\n const appId = params.appId ?? \"\";\n const id = params.id ?? \"\";\n\n const detail = useEmailDetail(appId, id);\n\n const sharedProviderReason = t(\n \"dispatch.transactionalEmail.sharedProviderMetricsUnavailable\",\n );\n const engagementQuery = useQuery({\n queryKey: [\"list-email-engagement\", detail.appPath, id, WINDOW_DAYS],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailEngagement[]>>(\n detail.appPath,\n \"list-email-engagement\",\n { templateIds: [id], windowDays: WINDOW_DAYS },\n \"POST\",\n ),\n enabled: appId !== \"core\" && id.length > 0 && detail.appPath.length > 0,\n });\n const engagementResult = engagementQuery.data;\n const engagementUnavailable =\n appId === \"core\"\n ? sharedProviderReason\n : engagementResult && !engagementResult.available\n ? engagementResult.reason\n : engagementQuery.isError\n ? engagementQuery.error instanceof Error\n ? engagementQuery.error.message\n : String(engagementQuery.error)\n : null;\n const engagement = engagementResult?.available\n ? engagementResult.data.find((entry) => entry.templateId === id)\n : undefined;\n\n const activityQuery = useQuery({\n queryKey: [\"list-email-activity\", detail.appPath, id, ACTIVITY_LIMIT],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailActivityEntry[]>>(\n detail.appPath,\n \"list-email-activity\",\n { templateId: id, limit: ACTIVITY_LIMIT },\n \"GET\",\n ),\n enabled:\n appId !== \"core\" &&\n id.length > 0 &&\n detail.appPath.length > 0 &&\n !engagementUnavailable,\n });\n\n return (\n <DispatchShell\n title={detail.email?.name ?? t(\"dispatch.transactionalEmail.title\")}\n description={t(\"dispatch.transactionalEmail.description\")}\n >\n <div className=\"max-w-3xl space-y-4\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2\">\n <Link\n to={\n location.pathname.startsWith(\"/admin/\")\n ? \"/admin/transactional-email\"\n : \"/transactional-email\"\n }\n >\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.transactionalEmail.title\")}\n </Link>\n </Button>\n\n {detail.isError ? (\n <ActionQueryError error={detail.error} onRetry={detail.onRetry} />\n ) : detail.isLoading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-6 w-64\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n ) : detail.notFound || !detail.email ? (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.emailNotFound\")}\n </AlertTitle>\n <AlertDescription>\n {detail.catalogError ??\n t(\"dispatch.transactionalEmail.emailNotFoundDescription\")}\n </AlertDescription>\n </Alert>\n ) : (\n <>\n <section className=\"rounded-2xl bg-card p-5\">\n <div className=\"text-lg font-semibold text-foreground\">\n {detail.email.name}\n </div>\n <div className=\"mt-1 font-mono text-xs text-muted-foreground\">\n {detail.email.id}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {detail.appName}\n {detail.appPath ? ` · ${detail.appPath}` : \"\"}\n </div>\n\n <dl className=\"mt-4 space-y-3 text-sm\">\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.trigger\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.trigger}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.recipient\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.recipient}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.sender\")}\n </dt>\n <dd className=\"mt-1 text-foreground\">\n {detail.email.sender}\n </dd>\n </div>\n </dl>\n\n <div className=\"mt-4 flex flex-wrap gap-6 border-t pt-4 text-sm\">\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.sends\")}\n </div>\n <div className=\"mt-1\">\n <SendsCell\n sent={detail.email.sent}\n failed={detail.email.failed}\n />\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.openRate\")}\n </div>\n <div className=\"mt-1\">\n <OpenRateCell\n engagement={engagement}\n unavailableReason={engagementUnavailable}\n loading={engagementQuery.isLoading}\n />\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.lastSent\")}\n </div>\n <div className=\"mt-1\">\n <LastSentCell\n lastSentAt={detail.email.lastSentAt}\n sent={detail.email.sent}\n />\n </div>\n </div>\n </div>\n </section>\n\n <section className=\"rounded-2xl bg-card p-5\">\n <h2 className=\"text-sm font-medium text-foreground\">\n {t(\"dispatch.transactionalEmail.preview\")}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.previewDescription\")}\n </p>\n <div className=\"mt-4\">\n <EmailPreviewPane\n appId={appId}\n appPath={detail.appPath}\n id={detail.email.id}\n name={detail.email.name}\n />\n </div>\n </section>\n\n <section className=\"rounded-2xl bg-card p-5\">\n <h2 className=\"text-sm font-medium text-foreground\">\n {t(\"dispatch.transactionalEmail.activityLink\")}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </p>\n <div className=\"mt-4\">\n <ActivityTable\n result={\n engagementUnavailable\n ? { available: false, reason: engagementUnavailable }\n : activityQuery.data\n }\n isLoading={activityQuery.isLoading}\n isError={activityQuery.isError}\n error={activityQuery.error}\n onRetry={() => void activityQuery.refetch()}\n />\n </div>\n </section>\n </>\n )}\n </div>\n </DispatchShell>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transactional-email.js","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.tsx"],"names":[],"mappings":"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","sourcesContent":["import { callAction, useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconAlertTriangle,\n IconChevronRight,\n IconEye,\n IconInfoCircle,\n IconList,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { useQueries, useQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { Link, useLocation } from \"react-router\";\n\nimport {\n aggregateSharedEmails,\n callAppAction,\n fetchAppEmailCatalog,\n type AppEmailCatalog,\n type AppTransactionalEmail,\n type LocalTransactionalEmailCatalog,\n} from \"../../client/transactional-emails\";\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n ActivityTable,\n type EmailActivityEntry,\n} from \"../../components/transactional-email-activity\";\nimport {\n OpenRateCell,\n SendsCell,\n LastSentCell,\n type EmailEngagement,\n type ProviderMetricsResult,\n} from \"../../components/transactional-email-metrics\";\nimport { EmailPreviewPane } from \"../../components/transactional-email-preview\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../components/ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../components/ui/dialog\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../../components/ui/table\";\n\nexport function meta() {\n return [{ title: \"Transactional email — Dispatch\" }];\n}\n\nconst WINDOW_DAYS = 30;\nconst ACTIVITY_LIMIT = 50;\n\ninterface WorkspaceAppRef {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n}\n\n/** Shape of the local `list-transactional-emails` action response. */\nfunction PreviewDialog({\n email,\n appId,\n appPath,\n open,\n onOpenChange,\n}: {\n email: AppTransactionalEmail;\n appId: string;\n appPath: string;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n const t = useT();\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>{email.name}</DialogTitle>\n <DialogDescription>\n {t(\"dispatch.transactionalEmail.previewDescription\")}\n </DialogDescription>\n </DialogHeader>\n {/* Dialog content only mounts while open, so this fetches on open and\n drops the request when closed rather than needing an enabled flag. */}\n <EmailPreviewPane\n appId={appId}\n appPath={appPath}\n id={email.id}\n name={email.name}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ActivityDialog({\n email,\n appPath,\n unavailableReason,\n open,\n onOpenChange,\n}: {\n email: AppTransactionalEmail;\n appPath: string;\n unavailableReason: string | null;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n const t = useT();\n const activityQuery = useQuery({\n queryKey: [\"list-email-activity\", appPath, email.id, ACTIVITY_LIMIT],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailActivityEntry[]>>(\n appPath,\n \"list-email-activity\",\n { templateId: email.id, limit: ACTIVITY_LIMIT },\n \"GET\",\n ),\n enabled: open && !unavailableReason,\n });\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>\n {t(\"dispatch.transactionalEmail.activityTitle\", {\n name: email.name,\n })}\n </DialogTitle>\n <DialogDescription>\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </DialogDescription>\n </DialogHeader>\n <ActivityTable\n result={\n unavailableReason\n ? { available: false, reason: unavailableReason }\n : activityQuery.data\n }\n isLoading={activityQuery.isLoading}\n isError={activityQuery.isError}\n error={activityQuery.error}\n onRetry={() => void activityQuery.refetch()}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EmailRow({\n email,\n appId,\n appPath,\n engagement,\n engagementUnavailable,\n engagementLoading,\n}: {\n email: AppTransactionalEmail;\n appId: string;\n appPath: string;\n engagement: EmailEngagement | undefined;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n const t = useT();\n const location = useLocation();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [activityOpen, setActivityOpen] = useState(false);\n const detailBase = location.pathname.startsWith(\"/admin/\")\n ? \"/admin/transactional-email\"\n : \"/transactional-email\";\n\n return (\n <TableRow>\n <TableCell className=\"align-top\">\n <Link\n to={`${detailBase}/${appId}/${email.id}`}\n className=\"text-sm font-medium text-foreground hover:underline\"\n >\n {email.name}\n </Link>\n <div className=\"font-mono text-xs text-muted-foreground\">\n {email.id}\n </div>\n </TableCell>\n <TableCell className=\"max-w-64 align-top text-xs text-muted-foreground\">\n {email.trigger}\n </TableCell>\n <TableCell className=\"max-w-56 align-top text-xs text-muted-foreground\">\n {email.recipientLabel}\n </TableCell>\n <TableCell className=\"max-w-56 align-top text-xs text-muted-foreground\">\n {email.senderLabel}\n </TableCell>\n <TableCell className=\"align-top text-sm\">\n <SendsCell sent={email.sent} failed={email.failed} />\n </TableCell>\n <TableCell className=\"align-top text-sm\">\n <OpenRateCell\n engagement={engagement}\n unavailableReason={engagementUnavailable}\n loading={engagementLoading}\n />\n </TableCell>\n <TableCell className=\"align-top text-xs text-muted-foreground\">\n <LastSentCell lastSentAt={email.lastSentAt} sent={email.sent} />\n </TableCell>\n <TableCell className=\"align-top\">\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPreviewOpen(true)}\n >\n <IconEye className=\"size-4\" />\n {t(\"dispatch.transactionalEmail.preview\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setActivityOpen(true)}\n >\n <IconList className=\"size-4\" />\n {t(\"dispatch.transactionalEmail.activityLink\")}\n </Button>\n </div>\n <PreviewDialog\n email={email}\n appId={appId}\n appPath={appPath}\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n />\n <ActivityDialog\n email={email}\n appPath={appPath}\n unavailableReason={engagementUnavailable}\n open={activityOpen}\n onOpenChange={setActivityOpen}\n />\n </TableCell>\n </TableRow>\n );\n}\n\nfunction AppEmailTable({\n catalog,\n engagementByTemplate,\n engagementUnavailable,\n engagementLoading,\n}: {\n catalog: AppEmailCatalog;\n engagementByTemplate: Map<string, EmailEngagement>;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n const t = useT();\n\n if (catalog.error) {\n return (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.catalogUnreadable\")}\n </AlertTitle>\n <AlertDescription>{catalog.error}</AlertDescription>\n </Alert>\n );\n }\n\n return (\n <>\n {catalog.statsError ? (\n <Alert className=\"mb-4\">\n <IconInfoCircle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.countsUnreadable\")}\n </AlertTitle>\n <AlertDescription>{catalog.statsError}</AlertDescription>\n </Alert>\n ) : null}\n {catalog.emails.length === 0 ? (\n <div className=\"rounded-xl border border-dashed px-4 py-6 text-sm text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.appSendsNoEmail\")}\n </div>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t(\"dispatch.transactionalEmail.email\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.trigger\")}</TableHead>\n <TableHead>\n {t(\"dispatch.transactionalEmail.recipient\")}\n </TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.sender\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.sends\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.openRate\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.lastSent\")}</TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {catalog.emails.map((email) => (\n <EmailRow\n key={email.id}\n email={email}\n appId={catalog.appId}\n appPath={catalog.appPath}\n engagement={engagementByTemplate.get(email.id)}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementLoading}\n />\n ))}\n </TableBody>\n </Table>\n )}\n </>\n );\n}\n\nfunction AppEmailCard({\n name,\n path,\n open,\n onOpenChange,\n catalog,\n isLoading,\n isError,\n error,\n onRetry,\n engagementByTemplate,\n engagementUnavailable,\n engagementLoading,\n}: {\n name: string;\n path: string;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n catalog: AppEmailCatalog | undefined;\n isLoading: boolean;\n isError: boolean;\n error: unknown;\n onRetry: () => void;\n engagementByTemplate: Map<string, EmailEngagement>;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n return (\n <Collapsible\n open={open}\n onOpenChange={onOpenChange}\n className=\"rounded-2xl bg-card\"\n >\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 p-5 text-left hover:bg-muted/20\">\n <span className=\"flex items-center gap-2\">\n <IconChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"text-sm font-medium text-foreground\">{name}</span>\n </span>\n <span className=\"font-mono text-xs text-muted-foreground\">{path}</span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"border-t px-5 pb-5 pt-4\">\n {isError ? (\n <ActionQueryError error={error} onRetry={onRetry} />\n ) : isLoading || !catalog ? (\n <Skeleton className=\"h-24 w-full\" />\n ) : (\n <AppEmailTable\n catalog={catalog}\n engagementByTemplate={engagementByTemplate}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementLoading}\n />\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport default function TransactionalEmailRoute() {\n const t = useT();\n const appsQuery = useActionQuery<WorkspaceAppRef[]>(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n\n const apps = useMemo(\n () =>\n (appsQuery.data ?? [])\n .filter((app) => app.status !== \"pending\")\n .map((app) => ({ id: app.id, name: app.name, path: app.path })),\n [appsQuery.data],\n );\n\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n const [sharedOpen, setSharedOpen] = useState(true);\n\n const sharedQuery = useActionQuery<LocalTransactionalEmailCatalog>(\n \"list-transactional-emails\",\n { windowDays: WINDOW_DAYS },\n );\n\n const catalogQueries = useQueries({\n queries: apps.map((app) => ({\n queryKey: [\"transactional-email-catalog\", app.id, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(app, WINDOW_DAYS),\n enabled: sharedOpen || expanded[app.id] === true,\n staleTime: Infinity,\n })),\n });\n\n const sharedCatalog = useMemo<AppEmailCatalog | undefined>(() => {\n if (!sharedQuery.data) return undefined;\n const aggregate = aggregateSharedEmails(\n sharedQuery.data,\n catalogQueries\n .map((query) => query.data)\n .filter((catalog): catalog is AppEmailCatalog => Boolean(catalog)),\n );\n return {\n appId: \"core\",\n appName: t(\"dispatch.transactionalEmail.sharedTitle\"),\n appPath: t(\"dispatch.transactionalEmail.sharedSubtitle\"),\n emails: aggregate.emails,\n error: null,\n statsError: aggregate.statsError,\n };\n }, [sharedQuery.data, catalogQueries, t]);\n\n const engagementQueries = useQueries({\n queries: apps.map((app, index) => {\n const catalog = catalogQueries[index]?.data;\n const templateIds =\n catalog && !catalog.error\n ? catalog.emails.map((email) => email.id)\n : [];\n return {\n queryKey: [\n \"list-email-engagement\",\n app.id,\n templateIds.join(\",\"),\n WINDOW_DAYS,\n ],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailEngagement[]>>(\n app.path,\n \"list-email-engagement\",\n { templateIds, windowDays: WINDOW_DAYS },\n \"POST\",\n ),\n enabled: expanded[app.id] === true && templateIds.length > 0,\n };\n }),\n });\n\n const sharedLoading =\n sharedQuery.isLoading ||\n (sharedOpen && catalogQueries.some((query) => query.isLoading));\n const sharedError = catalogQueries.find((query) => query.isError)?.error;\n const sharedProviderReason = t(\n \"dispatch.transactionalEmail.sharedProviderMetricsUnavailable\",\n );\n\n return (\n <DispatchShell\n title={t(\"dispatch.transactionalEmail.title\")}\n description={t(\"dispatch.transactionalEmail.description\")}\n >\n <div className=\"flex flex-col gap-4\">\n <Alert>\n <IconInfoCircle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.retentionTitle\")}\n </AlertTitle>\n <AlertDescription>\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </AlertDescription>\n </Alert>\n\n {appsQuery.isError ? (\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n />\n ) : null}\n\n {appsQuery.isLoading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n </div>\n ) : null}\n\n {!appsQuery.isLoading && apps.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n <IconMail className=\"mx-auto mb-2 size-5\" />\n {t(\"dispatch.transactionalEmail.noApps\")}\n </div>\n ) : null}\n\n <AppEmailCard\n name={t(\"dispatch.transactionalEmail.sharedTitle\")}\n path={t(\"dispatch.transactionalEmail.sharedSubtitle\")}\n open={sharedOpen}\n onOpenChange={setSharedOpen}\n catalog={sharedCatalog}\n isLoading={sharedLoading}\n isError={sharedQuery.isError || Boolean(sharedError)}\n error={sharedQuery.error ?? sharedError}\n onRetry={() => {\n void sharedQuery.refetch();\n for (const query of catalogQueries) void query.refetch();\n }}\n engagementByTemplate={new Map()}\n engagementUnavailable={sharedProviderReason}\n engagementLoading={false}\n />\n\n {apps.map((app, index) => {\n const query = catalogQueries[index];\n const engagementQuery = engagementQueries[index];\n const engagementResult = engagementQuery?.data;\n const engagementUnavailable =\n engagementResult && !engagementResult.available\n ? engagementResult.reason\n : engagementQuery?.isError\n ? engagementQuery.error instanceof Error\n ? engagementQuery.error.message\n : String(engagementQuery.error)\n : null;\n const engagementByTemplate = new Map<string, EmailEngagement>();\n if (engagementResult?.available) {\n for (const entry of engagementResult.data) {\n engagementByTemplate.set(entry.templateId, entry);\n }\n }\n return (\n <AppEmailCard\n key={app.id}\n name={app.name}\n path={app.path}\n open={expanded[app.id] === true}\n onOpenChange={(next) =>\n setExpanded((current) => ({ ...current, [app.id]: next }))\n }\n catalog={query?.data}\n isLoading={query?.isLoading ?? false}\n isError={query?.isError ?? false}\n error={query?.error}\n onRetry={() => void query?.refetch()}\n engagementByTemplate={engagementByTemplate}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementQuery?.isLoading ?? false}\n />\n );\n })}\n </div>\n </DispatchShell>\n );\n}\n"]}
1
+ {"version":3,"file":"transactional-email.js","sourceRoot":"","sources":["../../../src/routes/pages/transactional-email.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconAlertTriangle,\n IconChevronRight,\n IconEye,\n IconInfoCircle,\n IconList,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { useQueries, useQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { Link, useLocation } from \"react-router\";\n\nimport {\n aggregateSharedEmails,\n callAppAction,\n fetchAppEmailCatalog,\n type AppEmailCatalog,\n type AppTransactionalEmail,\n type LocalTransactionalEmailCatalog,\n} from \"../../client/transactional-emails\";\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n ActivityTable,\n type EmailActivityEntry,\n} from \"../../components/transactional-email-activity\";\nimport {\n OpenRateCell,\n SendsCell,\n LastSentCell,\n type EmailEngagement,\n type ProviderMetricsResult,\n} from \"../../components/transactional-email-metrics\";\nimport { EmailPreviewPane } from \"../../components/transactional-email-preview\";\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../components/ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../components/ui/dialog\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../../components/ui/table\";\n\nexport function meta() {\n return [{ title: \"Transactional email — Dispatch\" }];\n}\n\nconst WINDOW_DAYS = 30;\nconst ACTIVITY_LIMIT = 50;\n\ninterface WorkspaceAppRef {\n id: string;\n name: string;\n path: string;\n status?: \"ready\" | \"pending\";\n}\n\n/** Shape of the local `list-transactional-emails` action response. */\nfunction PreviewDialog({\n email,\n appId,\n appPath,\n open,\n onOpenChange,\n}: {\n email: AppTransactionalEmail;\n appId: string;\n appPath: string;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n const t = useT();\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>{email.name}</DialogTitle>\n <DialogDescription>\n {t(\"dispatch.transactionalEmail.previewDescription\")}\n </DialogDescription>\n </DialogHeader>\n {/* Dialog content only mounts while open, so this fetches on open and\n drops the request when closed rather than needing an enabled flag. */}\n <EmailPreviewPane\n appId={appId}\n appPath={appPath}\n id={email.id}\n name={email.name}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ActivityDialog({\n email,\n appPath,\n unavailableReason,\n open,\n onOpenChange,\n}: {\n email: AppTransactionalEmail;\n appPath: string;\n unavailableReason: string | null;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n const t = useT();\n const activityQuery = useQuery({\n queryKey: [\"list-email-activity\", appPath, email.id, ACTIVITY_LIMIT],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailActivityEntry[]>>(\n appPath,\n \"list-email-activity\",\n { templateId: email.id, limit: ACTIVITY_LIMIT },\n \"GET\",\n ),\n enabled: open && !unavailableReason,\n });\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>\n {t(\"dispatch.transactionalEmail.activityTitle\", {\n name: email.name,\n })}\n </DialogTitle>\n <DialogDescription>\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </DialogDescription>\n </DialogHeader>\n <ActivityTable\n result={\n unavailableReason\n ? { available: false, reason: unavailableReason }\n : activityQuery.data\n }\n isLoading={activityQuery.isLoading}\n isError={activityQuery.isError}\n error={activityQuery.error}\n onRetry={() => void activityQuery.refetch()}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EmailRow({\n email,\n appId,\n appPath,\n engagement,\n engagementUnavailable,\n engagementLoading,\n}: {\n email: AppTransactionalEmail;\n appId: string;\n appPath: string;\n engagement: EmailEngagement | undefined;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n const t = useT();\n const location = useLocation();\n const [previewOpen, setPreviewOpen] = useState(false);\n const [activityOpen, setActivityOpen] = useState(false);\n const detailBase = location.pathname.startsWith(\"/admin/\")\n ? \"/admin/transactional-email\"\n : \"/transactional-email\";\n\n return (\n <TableRow>\n <TableCell className=\"align-top\">\n <Link\n to={`${detailBase}/${appId}/${email.id}`}\n className=\"text-sm font-medium text-foreground hover:underline\"\n >\n {email.name}\n </Link>\n <div className=\"font-mono text-xs text-muted-foreground\">\n {email.id}\n </div>\n </TableCell>\n <TableCell className=\"max-w-64 align-top text-xs text-muted-foreground\">\n {email.trigger}\n </TableCell>\n <TableCell className=\"max-w-56 align-top text-xs text-muted-foreground\">\n {email.recipientLabel}\n </TableCell>\n <TableCell className=\"max-w-56 align-top text-xs text-muted-foreground\">\n {email.senderLabel}\n </TableCell>\n <TableCell className=\"align-top text-sm\">\n <SendsCell sent={email.sent} failed={email.failed} />\n </TableCell>\n <TableCell className=\"align-top text-sm\">\n <OpenRateCell\n engagement={engagement}\n unavailableReason={engagementUnavailable}\n loading={engagementLoading}\n />\n </TableCell>\n <TableCell className=\"align-top text-xs text-muted-foreground\">\n <LastSentCell lastSentAt={email.lastSentAt} sent={email.sent} />\n </TableCell>\n <TableCell className=\"align-top\">\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPreviewOpen(true)}\n >\n <IconEye className=\"size-4\" />\n {t(\"dispatch.transactionalEmail.preview\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setActivityOpen(true)}\n >\n <IconList className=\"size-4\" />\n {t(\"dispatch.transactionalEmail.activityLink\")}\n </Button>\n </div>\n <PreviewDialog\n email={email}\n appId={appId}\n appPath={appPath}\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n />\n <ActivityDialog\n email={email}\n appPath={appPath}\n unavailableReason={engagementUnavailable}\n open={activityOpen}\n onOpenChange={setActivityOpen}\n />\n </TableCell>\n </TableRow>\n );\n}\n\nfunction AppEmailTable({\n catalog,\n engagementByTemplate,\n engagementUnavailable,\n engagementLoading,\n}: {\n catalog: AppEmailCatalog;\n engagementByTemplate: Map<string, EmailEngagement>;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n const t = useT();\n\n if (catalog.error) {\n return (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.catalogUnreadable\")}\n </AlertTitle>\n <AlertDescription>{catalog.error}</AlertDescription>\n </Alert>\n );\n }\n\n return (\n <>\n {catalog.statsError ? (\n <Alert className=\"mb-4\">\n <IconInfoCircle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.countsUnreadable\")}\n </AlertTitle>\n <AlertDescription>{catalog.statsError}</AlertDescription>\n </Alert>\n ) : null}\n {catalog.emails.length === 0 ? (\n <div className=\"rounded-xl border border-dashed px-4 py-6 text-sm text-muted-foreground\">\n {t(\"dispatch.transactionalEmail.appSendsNoEmail\")}\n </div>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t(\"dispatch.transactionalEmail.email\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.trigger\")}</TableHead>\n <TableHead>\n {t(\"dispatch.transactionalEmail.recipient\")}\n </TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.sender\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.sends\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.openRate\")}</TableHead>\n <TableHead>{t(\"dispatch.transactionalEmail.lastSent\")}</TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {catalog.emails.map((email) => (\n <EmailRow\n key={email.id}\n email={email}\n appId={catalog.appId}\n appPath={catalog.appPath}\n engagement={engagementByTemplate.get(email.id)}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementLoading}\n />\n ))}\n </TableBody>\n </Table>\n )}\n </>\n );\n}\n\nfunction AppEmailCard({\n name,\n path,\n open,\n onOpenChange,\n catalog,\n isLoading,\n isError,\n error,\n onRetry,\n engagementByTemplate,\n engagementUnavailable,\n engagementLoading,\n}: {\n name: string;\n path: string;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n catalog: AppEmailCatalog | undefined;\n isLoading: boolean;\n isError: boolean;\n error: unknown;\n onRetry: () => void;\n engagementByTemplate: Map<string, EmailEngagement>;\n engagementUnavailable: string | null;\n engagementLoading: boolean;\n}) {\n return (\n <Collapsible\n open={open}\n onOpenChange={onOpenChange}\n className=\"rounded-2xl bg-card\"\n >\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 p-5 text-left hover:bg-muted/20\">\n <span className=\"flex items-center gap-2\">\n <IconChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"text-sm font-medium text-foreground\">{name}</span>\n </span>\n <span className=\"font-mono text-xs text-muted-foreground\">{path}</span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"border-t px-5 pb-5 pt-4\">\n {isError ? (\n <ActionQueryError error={error} onRetry={onRetry} />\n ) : isLoading || !catalog ? (\n <Skeleton className=\"h-24 w-full\" />\n ) : (\n <AppEmailTable\n catalog={catalog}\n engagementByTemplate={engagementByTemplate}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementLoading}\n />\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nexport default function TransactionalEmailRoute() {\n const t = useT();\n const appsQuery = useActionQuery<WorkspaceAppRef[]>(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n\n const apps = useMemo(\n () =>\n (appsQuery.data ?? [])\n .filter((app) => app.status !== \"pending\")\n .map((app) => ({ id: app.id, name: app.name, path: app.path })),\n [appsQuery.data],\n );\n\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n const [sharedOpen, setSharedOpen] = useState(true);\n\n const sharedQuery = useActionQuery<LocalTransactionalEmailCatalog>(\n \"list-transactional-emails\",\n { windowDays: WINDOW_DAYS },\n );\n\n const catalogQueries = useQueries({\n queries: apps.map((app) => ({\n queryKey: [\"transactional-email-catalog\", app.id, WINDOW_DAYS],\n queryFn: () => fetchAppEmailCatalog(app, WINDOW_DAYS),\n enabled: sharedOpen || expanded[app.id] === true,\n staleTime: Infinity,\n })),\n });\n\n const sharedCatalog = useMemo<AppEmailCatalog | undefined>(() => {\n if (!sharedQuery.data) return undefined;\n const aggregate = aggregateSharedEmails(\n sharedQuery.data,\n catalogQueries\n .map((query) => query.data)\n .filter((catalog): catalog is AppEmailCatalog => Boolean(catalog)),\n );\n return {\n appId: \"core\",\n appName: t(\"dispatch.transactionalEmail.sharedTitle\"),\n appPath: t(\"dispatch.transactionalEmail.sharedSubtitle\"),\n emails: aggregate.emails,\n error: null,\n statsError: aggregate.statsError,\n };\n }, [sharedQuery.data, catalogQueries, t]);\n\n const engagementQueries = useQueries({\n queries: apps.map((app, index) => {\n const catalog = catalogQueries[index]?.data;\n const templateIds =\n catalog && !catalog.error\n ? catalog.emails.map((email) => email.id)\n : [];\n return {\n queryKey: [\n \"list-email-engagement\",\n app.id,\n templateIds.join(\",\"),\n WINDOW_DAYS,\n ],\n queryFn: () =>\n callAppAction<ProviderMetricsResult<EmailEngagement[]>>(\n app.path,\n \"list-email-engagement\",\n { templateIds, windowDays: WINDOW_DAYS },\n \"POST\",\n ),\n enabled: expanded[app.id] === true && templateIds.length > 0,\n };\n }),\n });\n\n const sharedLoading =\n sharedQuery.isLoading ||\n (sharedOpen && catalogQueries.some((query) => query.isLoading));\n const sharedError = catalogQueries.find((query) => query.isError)?.error;\n const sharedProviderReason = t(\n \"dispatch.transactionalEmail.sharedProviderMetricsUnavailable\",\n );\n\n return (\n <DispatchShell\n title={t(\"dispatch.transactionalEmail.title\")}\n description={t(\"dispatch.transactionalEmail.description\")}\n >\n <div className=\"flex flex-col gap-4\">\n <Alert>\n <IconInfoCircle className=\"size-4\" />\n <AlertTitle>\n {t(\"dispatch.transactionalEmail.retentionTitle\")}\n </AlertTitle>\n <AlertDescription>\n {t(\"dispatch.transactionalEmail.retentionNote\")}\n </AlertDescription>\n </Alert>\n\n {appsQuery.isError ? (\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n />\n ) : null}\n\n {appsQuery.isLoading ? (\n <div className=\"space-y-3\">\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n </div>\n ) : null}\n\n {!appsQuery.isLoading && apps.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n <IconMail className=\"mx-auto mb-2 size-5\" />\n {t(\"dispatch.transactionalEmail.noApps\")}\n </div>\n ) : null}\n\n <AppEmailCard\n name={t(\"dispatch.transactionalEmail.sharedTitle\")}\n path={t(\"dispatch.transactionalEmail.sharedSubtitle\")}\n open={sharedOpen}\n onOpenChange={setSharedOpen}\n catalog={sharedCatalog}\n isLoading={sharedLoading}\n isError={sharedQuery.isError || Boolean(sharedError)}\n error={sharedQuery.error ?? sharedError}\n onRetry={() => {\n void sharedQuery.refetch();\n for (const query of catalogQueries) void query.refetch();\n }}\n engagementByTemplate={new Map()}\n engagementUnavailable={sharedProviderReason}\n engagementLoading={false}\n />\n\n {apps.map((app, index) => {\n const query = catalogQueries[index];\n const engagementQuery = engagementQueries[index];\n const engagementResult = engagementQuery?.data;\n const engagementUnavailable =\n engagementResult && !engagementResult.available\n ? engagementResult.reason\n : engagementQuery?.isError\n ? engagementQuery.error instanceof Error\n ? engagementQuery.error.message\n : String(engagementQuery.error)\n : null;\n const engagementByTemplate = new Map<string, EmailEngagement>();\n if (engagementResult?.available) {\n for (const entry of engagementResult.data) {\n engagementByTemplate.set(entry.templateId, entry);\n }\n }\n return (\n <AppEmailCard\n key={app.id}\n name={app.name}\n path={app.path}\n open={expanded[app.id] === true}\n onOpenChange={(next) =>\n setExpanded((current) => ({ ...current, [app.id]: next }))\n }\n catalog={query?.data}\n isLoading={query?.isLoading ?? false}\n isError={query?.isError ?? false}\n error={query?.error}\n onRetry={() => void query?.refetch()}\n engagementByTemplate={engagementByTemplate}\n engagementUnavailable={engagementUnavailable}\n engagementLoading={engagementQuery?.isLoading ?? false}\n />\n );\n })}\n </div>\n </DispatchShell>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-gateway.d.ts","sourceRoot":"","sources":["../../../src/server/lib/mcp-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,2BAA2B,EAChC,KAAK,IAAI,EACV,MAAM,wBAAwB,CAAC;AA6BhC,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,uBAAuB,CAAC;AA4B/B,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAkCD,KAAK,uBAAuB,GAAG,2BAA2B,CAAC;AAiC3D,KAAK,iCAAiC,GAClC,WAAW,GACX,SAAS,GACT,cAAc,GACd,cAAc,CAAC;AAEnB,KAAK,wBAAwB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,aAAa,CAAC,EAAE,iCAAiC,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,SAAS,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,iBAAS,wBAAwB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACA,wBAAwB,CA8C1B;AA8YD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,QAAQ,EAAE,4BAA4B,CAAC;IACvC,IAAI,EAAE,wBAAwB,EAAE,CAAC;CAClC,CAAC,CAcD;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CACzD,wBAAwB,EAAE,CAC3B,CAGA;AAED,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG1E;AAED,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAoFD,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAyCtD;AAED,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAmEnC;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,OAAO,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAkDD;AAySD,wBAAsB,oCAAoC,CAAC,KAAK,EAAE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAWD;AAiID,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAqCD"}
1
+ {"version":3,"file":"mcp-gateway.d.ts","sourceRoot":"","sources":["../../../src/server/lib/mcp-gateway.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { getOrgA2ASecret, getOrgDomain } from "@agent-native/core/org";
5
5
  import { buildDeepLink, buildEmbedStartPath, createEmbedSessionTicket, getRequestContext, getRequestOrgId, getRequestUserEmail, } from "@agent-native/core/server";
6
6
  import { discoverAgents, getBuiltinAgents, } from "@agent-native/core/server/agent-discovery";
7
7
  import { DISPATCH_WORKSPACE_SSO_FLAG, isWorkspaceSsoAppUrl, } from "../../shared/workspace-sso.js";
8
- import { listWorkspaceApps, } from "./app-creation-store.js";
8
+ import { listWorkspaceApps } from "./app-creation-store.js";
9
9
  import { getDispatchMcpAppAccessSettings, isAppAllowedByMcpAccess, } from "./mcp-access-store.js";
10
10
  const DISPATCH_APP_ID = "dispatch";
11
11
  const DISPATCH_NAME = "Dispatch";