@agent-native/dispatch 0.38.15 → 0.38.16-nightly-20260927233234
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/create-workspace-resource.d.ts +13 -13
- package/dist/actions/provider-api-register.d.ts +12 -12
- package/dist/components/automation-create-dialog.js +4 -4
- package/dist/components/automation-create-dialog.js.map +1 -1
- package/dist/components/layout/Header.js +1 -1
- package/dist/components/layout/Header.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +7 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +19 -4
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/messaging-setup-panel.d.ts.map +1 -1
- package/dist/components/messaging-setup-panel.js +7 -28
- package/dist/components/messaging-setup-panel.js.map +1 -1
- package/dist/components/transactional-email-send-log.js +1 -1
- package/dist/components/transactional-email-send-log.js.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +1 -20
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.js +1 -26
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/button.d.ts +1 -11
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +1 -33
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/carousel.d.ts +2 -2
- package/dist/components/ui/carousel.d.ts.map +1 -1
- package/dist/components/ui/input.d.ts +1 -3
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +1 -8
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/sidebar.d.ts +4 -2
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/switch.d.ts +1 -4
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/switch.js +1 -7
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/tabs.d.ts +1 -7
- package/dist/components/ui/tabs.d.ts.map +1 -1
- package/dist/components/ui/tabs.js +1 -12
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/toggle.d.ts +1 -12
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/toggle.js +1 -25
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/usage-alerts-panel.d.ts.map +1 -1
- package/dist/components/usage-alerts-panel.js +1 -1
- package/dist/components/usage-alerts-panel.js.map +1 -1
- package/dist/components/workspace-app-search.d.ts.map +1 -1
- package/dist/components/workspace-app-search.js +1 -1
- package/dist/components/workspace-app-search.js.map +1 -1
- package/dist/routes/pages/automations.d.ts.map +1 -1
- package/dist/routes/pages/automations.js +2 -2
- package/dist/routes/pages/automations.js.map +1 -1
- package/dist/routes/pages/metrics.d.ts.map +1 -1
- package/dist/routes/pages/metrics.js +1 -1
- package/dist/routes/pages/metrics.js.map +1 -1
- package/dist/routes/pages/settings.d.ts +9 -0
- package/dist/routes/pages/settings.d.ts.map +1 -1
- package/dist/routes/pages/settings.js +65 -12
- package/dist/routes/pages/settings.js.map +1 -1
- package/dist/routes/pages/thread-debug.js +1 -1
- package/dist/routes/pages/thread-debug.js.map +1 -1
- package/dist/routes/pages/vault.d.ts.map +1 -1
- package/dist/routes/pages/vault.js +2 -2
- package/dist/routes/pages/vault.js.map +1 -1
- package/dist/server/lib/usage-metrics-store.js +2 -3
- package/dist/server/lib/usage-metrics-store.js.map +1 -1
- package/dist/server/plugins/db.d.ts.map +1 -1
- package/dist/server/plugins/db.js +44 -0
- package/dist/server/plugins/db.js.map +1 -1
- package/package.json +4 -4
- package/src/components/automation-create-dialog.tsx +6 -6
- package/src/components/layout/Header.tsx +2 -2
- package/src/components/layout/Layout.spec.tsx +28 -0
- package/src/components/layout/Layout.tsx +73 -43
- package/src/components/messaging-setup-panel.spec.tsx +5 -1
- package/src/components/messaging-setup-panel.tsx +9 -45
- package/src/components/transactional-email-send-log.tsx +1 -1
- package/src/components/ui/alert-dialog.tsx +1 -139
- package/src/components/ui/button.tsx +1 -56
- package/src/components/ui/input.tsx +1 -22
- package/src/components/ui/switch.tsx +1 -27
- package/src/components/ui/tabs.tsx +1 -53
- package/src/components/ui/toggle.tsx +1 -43
- package/src/components/usage-alerts-panel.tsx +6 -12
- package/src/components/workspace-app-search.tsx +2 -1
- package/src/routes/pages/automations.tsx +4 -2
- package/src/routes/pages/metrics.tsx +2 -1
- package/src/routes/pages/settings.spec.tsx +179 -0
- package/src/routes/pages/settings.tsx +179 -119
- package/src/routes/pages/thread-debug.tsx +1 -1
- package/src/routes/pages/vault.tsx +3 -2
- package/src/server/lib/usage-metrics-store.spec.ts +1 -0
- package/src/server/lib/usage-metrics-store.ts +2 -2
- package/src/server/plugins/db.ts +49 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n CHAT_FIRST_MODE_CHANGED_EVENT,\n readChatFirstModeState,\n writeChatFirstMode,\n} from \"@agent-native/core/client/agent-chat\";\nimport { ChangelogSettingsCard } from \"@agent-native/core/client/changelog\";\nimport { LanguagePicker, useT } from \"@agent-native/core/client/i18n\";\nimport { TeamPage } from \"@agent-native/core/client/org\";\nimport {\n SettingsTabsPage,\n useAgentSettingsTabs,\n} from \"@agent-native/core/client/settings\";\nimport { IconShield } from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router\";\n\nimport changelog from \"../../../CHANGELOG.md?raw\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../components/ui/card\";\nimport { Label } from \"../../components/ui/label\";\nimport { Switch } from \"../../components/ui/switch\";\nimport { dispatchAccessDescriptor } from \"../../shared/app-roles.js\";\n\nexport function meta() {\n return [{ title: \"Settings - Dispatch\" }];\n}\n\nexport default function SettingsRoute() {\n const t = useT();\n const agentSettingsTabs = useAgentSettingsTabs({\n usageAppId: \"dispatch\",\n usageViewAllHref: \"/admin/metrics\",\n organizationContent: (\n <div className=\"mx-auto w-full max-w-3xl\">\n <TeamPage\n showTitle={false}\n appRoles={dispatchAccessDescriptor}\n createOrgDescription=\"Set up a team to share dispatch destinations and approvals with your colleagues.\"\n />\n </div>\n ),\n });\n const settingsTabs = [\n ...agentSettingsTabs.filter((tab) => tab.id !== \"integrations\"),\n {\n id: \"admin\",\n label: t(\"dispatch.nav.admin\", { defaultValue: \"Admin\" }),\n icon: IconShield,\n group: \"Admin\",\n href: \"/admin\",\n content: null,\n },\n ];\n const [chatFirstModeState] = useState(() => readChatFirstModeState());\n const [chatFirstMode, setChatFirstMode] = useState(\n () => chatFirstModeState.enabled,\n );\n const [chatFirstStorageNotice, setChatFirstStorageNotice] = useState<\n string | null\n >(\n chatFirstModeState.availability === \"unavailable\"\n ? \"This browser is not allowing local preferences, so Chat-first mode cannot be persisted.\"\n : null,\n );\n\n function updateChatFirstMode(enabled: boolean) {\n const result = writeChatFirstMode(enabled);\n if (!result.ok) {\n setChatFirstStorageNotice(\n \"This browser blocked local preferences, so Chat-first mode was not changed.\",\n );\n return;\n }\n setChatFirstStorageNotice(null);\n setChatFirstMode(enabled);\n window.dispatchEvent(\n new CustomEvent(CHAT_FIRST_MODE_CHANGED_EVENT, {\n detail: { enabled },\n }),\n );\n }\n\n return (\n <DispatchShell\n title={t(\"settings.title\")}\n description={t(\"settings.description\")}\n >\n <SettingsTabsPage\n extraTabs={settingsTabs}\n general={\n <div className=\"mx-auto w-full max-w-3xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.languageTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.languageDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"max-w-xs space-y-1.5\">\n <Label>{t(\"settings.languageLabel\")}</Label>\n <LanguagePicker label={t(\"settings.languageLabel\")} />\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n Chat-first workspace\n </CardTitle>\n <CardDescription>\n Keep chats at the center and open workspace apps in a\n contextual pane beside them.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"flex items-center justify-between gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"dispatch-chat-first-mode\">\n Use chat-first navigation\n </Label>\n <p className=\"text-sm text-muted-foreground\">\n This preference only changes your local Dispatch shell.\n </p>\n <p className=\"text-sm text-muted-foreground\">\n Session watch and follow-up messaging work in this browser\n pane too. Local CLI subscription detection stays in the\n Electron app; Dispatch uses workspace/provider credentials.\n </p>\n </div>\n <Switch\n id=\"dispatch-chat-first-mode\"\n checked={chatFirstMode}\n onCheckedChange={updateChatFirstMode}\n />\n </CardContent>\n {chatFirstStorageNotice ? (\n <p className=\"px-6 pb-4 text-sm text-destructive\" role=\"alert\">\n {chatFirstStorageNotice}\n </p>\n ) : null}\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.workspaceTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.workspaceDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <Button variant=\"outline\" asChild>\n <Link to=\"/admin/workspace\">\n {t(\"settings.openResourceSettings\")}\n </Link>\n </Button>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t(\"settings.deliveryTitle\")}\n </CardTitle>\n <CardDescription>\n {t(\"settings.deliveryDescription\")}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <Button variant=\"outline\" asChild>\n <Link to=\"/admin/destinations\">\n {t(\"settings.openDelivery\")}\n </Link>\n </Button>\n </CardContent>\n </Card>\n </div>\n }\n whatsNew={\n <div className=\"mx-auto w-full max-w-3xl\">\n <ChangelogSettingsCard markdown={changelog} />\n </div>\n }\n />\n </DispatchShell>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/pages/settings.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n CHAT_FIRST_MODE_CHANGED_EVENT,\n readChatFirstModeState,\n writeChatFirstMode,\n} from \"@agent-native/core/client/agent-chat\";\nimport { ChangelogSettingsCard } from \"@agent-native/core/client/changelog\";\nimport {\n useFeatureFlag,\n useFeatureFlagState,\n} from \"@agent-native/core/client/feature-flags\";\nimport { LanguagePicker, useT } from \"@agent-native/core/client/i18n\";\nimport { OrgMembersPage, TeamPage } from \"@agent-native/core/client/org\";\nimport {\n AccountSettingsCard,\n CORE_SETTINGS_PAGES,\n registerSettingsPages,\n SettingsGroup,\n SettingsRow,\n SettingsTabsPage,\n useAgentSettingsTabs,\n type SettingsSearchEntry,\n} from \"@agent-native/core/client/settings\";\nimport { SETTINGS_REDESIGN_FLAG } from \"@agent-native/core/feature-flags/registry\";\nimport { IconShield } from \"@tabler/icons-react\";\nimport { useMemo, useState } from \"react\";\nimport { Link } from \"react-router\";\n\nimport packageChangelog from \"../../../CHANGELOG.md?raw\";\nimport { Button } from \"../../components/ui/button\";\nimport { Switch } from \"../../components/ui/switch\";\nimport { dispatchAccessDescriptor } from \"../../shared/app-roles.js\";\nimport { DISPATCH_CONNECT_APPS_FLAG } from \"../../shared/feature-flags.js\";\n\nconst coreMembersPage = CORE_SETTINGS_PAGES.find(\n (page) => page.id === \"members\",\n);\nif (!coreMembersPage) {\n throw new Error(\"Core Settings has no members page for Dispatch app roles\");\n}\n\nfunction DispatchMembersSettingsPage() {\n return <OrgMembersPage appRoles={dispatchAccessDescriptor} />;\n}\n\n// The redesigned Settings shows Members from core; Dispatch's replaces it so\n// the app-role column stays.\nregisterSettingsPages([\n { ...coreMembersPage, component: DispatchMembersSettingsPage },\n]);\n\nexport function meta() {\n return [{ title: \"Settings - Dispatch\" }];\n}\n\nexport interface DispatchSettingsPageProps {\n /** Raw CHANGELOG.md behind What's new. */\n changelog: string;\n}\n\n/**\n * Dispatch's Settings. The template route renders it with the app's own\n * changelog; `dispatchRoutes` consumers get the default export.\n */\nexport function DispatchSettingsPage({ changelog }: DispatchSettingsPageProps) {\n const t = useT();\n const connectAppsEnabled = useFeatureFlag(DISPATCH_CONNECT_APPS_FLAG.key);\n // Core Preferences owns the interface language in the redesigned Settings,\n // whose Dispatch General page shows `generalGroups` instead of `general`.\n const redesign = useFeatureFlagState(SETTINGS_REDESIGN_FLAG.key).enabled;\n const agentSettingsTabs = useAgentSettingsTabs({\n usageAppId: \"dispatch\",\n usageViewAllHref: \"/admin/metrics\",\n organizationContent: (\n <div className=\"mx-auto w-full max-w-3xl\">\n <TeamPage\n showTitle={false}\n appRoles={dispatchAccessDescriptor}\n createOrgDescription=\"Set up a team to share dispatch destinations and approvals with your colleagues.\"\n />\n </div>\n ),\n });\n const settingsTabs = [\n ...agentSettingsTabs,\n {\n id: \"admin\",\n label: t(\"dispatch.nav.admin\", { defaultValue: \"Admin\" }),\n icon: IconShield,\n group: \"Admin\",\n href: \"/admin\",\n content: null,\n },\n ];\n const [chatFirstModeState] = useState(() => readChatFirstModeState());\n const [chatFirstMode, setChatFirstMode] = useState(\n () => chatFirstModeState.enabled,\n );\n const [chatFirstStorageNotice, setChatFirstStorageNotice] = useState<\n string | null\n >(\n chatFirstModeState.availability === \"unavailable\"\n ? t(\"settings.chatFirstStorageUnavailable\")\n : null,\n );\n\n function updateChatFirstMode(enabled: boolean) {\n const result = writeChatFirstMode(enabled);\n if (!result.ok) {\n setChatFirstStorageNotice(t(\"settings.chatFirstStorageBlocked\"));\n return;\n }\n setChatFirstStorageNotice(null);\n setChatFirstMode(enabled);\n window.dispatchEvent(\n new CustomEvent(CHAT_FIRST_MODE_CHANGED_EVENT, {\n detail: { enabled },\n }),\n );\n }\n\n const generalSearchEntries = useMemo<SettingsSearchEntry[]>(\n () => [\n ...(redesign\n ? []\n : [\n {\n id: \"dispatch-language\",\n label: t(\"settings.languageTitle\"),\n keywords: \"language locale translation i18n\",\n hash: \"language\",\n },\n ]),\n {\n id: \"dispatch-workspace\",\n label: redesign\n ? t(\"settings.resourcesTitle\")\n : t(\"settings.workspaceTitle\"),\n keywords: \"workspace resources integrations vault destinations\",\n hash: \"workspace-resources\",\n },\n {\n id: \"dispatch-chat-first\",\n label: t(\"settings.chatFirstTitle\"),\n keywords: \"chat first codex t3 apps pane navigation\",\n hash: \"chat-first\",\n },\n ],\n [redesign, t],\n );\n\n const chatFirstSwitch = (\n <Switch\n aria-label={t(\"settings.chatFirstAriaLabel\")}\n checked={chatFirstMode}\n onCheckedChange={updateChatFirstMode}\n />\n );\n const chatFirstStorageAlert = chatFirstStorageNotice ? (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {chatFirstStorageNotice}\n </p>\n ) : null;\n const connectAppsRow = connectAppsEnabled ? (\n <SettingsRow\n id=\"connect-apps\"\n label={t(\"settings.connectApps\")}\n description={t(\"settings.connectAppsDescription\")}\n control={\n <Button variant=\"outline\" asChild>\n <Link to=\"/connect\">{t(\"settings.openConnectApps\")}</Link>\n </Button>\n }\n />\n ) : null;\n const resourceSettingsButton = (\n <Button variant=\"outline\" asChild>\n <Link to=\"/workspace\">{t(\"settings.openResourceSettings\")}</Link>\n </Button>\n );\n\n return (\n <SettingsTabsPage\n account={<AccountSettingsCard />}\n extraTabs={settingsTabs}\n generalSearchEntries={generalSearchEntries}\n general={\n <div className=\"mx-auto w-full max-w-2xl space-y-6\">\n <p className=\"text-sm leading-6 text-muted-foreground\">\n {t(\"settings.description\")}\n </p>\n\n <SettingsGroup>\n <SettingsRow\n id=\"language\"\n label={t(\"settings.languageTitle\")}\n description={t(\"settings.languageDescription\")}\n control={\n <div className=\"w-56\">\n <LanguagePicker label={t(\"settings.languageLabel\")} />\n </div>\n }\n />\n <SettingsRow\n id=\"workspace-resources\"\n label={t(\"settings.workspaceTitle\")}\n description={t(\"settings.workspaceDescription\")}\n control={resourceSettingsButton}\n />\n {connectAppsRow}\n </SettingsGroup>\n\n <SettingsGroup id=\"chat-first\">\n <SettingsRow\n label={t(\"settings.chatFirstTitle\")}\n description={t(\"settings.chatFirstDescription\")}\n control={chatFirstSwitch}\n >\n <p className=\"text-sm leading-6 text-muted-foreground\">\n {t(\"settings.chatFirstSessionWatchDescription\")}\n </p>\n {chatFirstStorageAlert}\n </SettingsRow>\n </SettingsGroup>\n </div>\n }\n generalGroups={\n <SettingsGroup id=\"workspace\" title={t(\"settings.workspaceTitle\")}>\n <SettingsRow\n id=\"chat-first\"\n label={t(\"settings.chatFirstTitle\")}\n description={t(\"settings.chatFirstDescription\")}\n control={chatFirstSwitch}\n >\n {chatFirstStorageAlert}\n </SettingsRow>\n <SettingsRow\n id=\"workspace-resources\"\n label={t(\"settings.resourcesTitle\")}\n description={t(\"settings.workspaceDescription\")}\n control={resourceSettingsButton}\n />\n {connectAppsRow}\n </SettingsGroup>\n }\n whatsNew={\n <div className=\"mx-auto w-full max-w-2xl\">\n <ChangelogSettingsCard markdown={changelog} />\n </div>\n }\n />\n );\n}\n\nexport default function SettingsRoute() {\n return <DispatchSettingsPage changelog={packageChangelog} />;\n}\n"]}
|
|
@@ -331,7 +331,7 @@ function ThreadDetail({ detail }) {
|
|
|
331
331
|
null;
|
|
332
332
|
const eventCount = detail.runs.reduce((total, run) => total + run.events.length, 0);
|
|
333
333
|
const toolCount = detail.runs.reduce((total, run) => total + summarizeEvents(run.events).toolStarts, 0);
|
|
334
|
-
return (_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "border-b px-5 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-base font-semibold text-foreground", children: detail.thread.title || detail.thread.preview || detail.thread.id }), _jsxs("div", { className: "mt-1 flex min-w-0 items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { className: "truncate font-mono", children: detail.lookup?.runId || detail.thread.id }), detail.lookup?.runId ? (_jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-7 shrink-0", title: "Copy run ID", "aria-label": "Copy run ID", onClick: () => void navigator.clipboard?.writeText(detail.lookup?.runId ?? ""), children: _jsx(IconCopy, { className: "size-3.5" }) })) : null] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [primaryRun ? (_jsx(Badge, { variant: primaryRun.status === "errored" ? "destructive" : "secondary", children: primaryRun.status })) : null, _jsx(Badge, { variant: "outline", children: detail.source.label })] })] }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [_jsx("span", { className: "truncate", children: detail.thread.ownerEmail }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: [detail.messages.length, " messages"] }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: [detail.runs.length, " runs"] }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: ["updated ", formatDate(detail.thread.updatedAt)] })] })] }), primaryRun ? (_jsx(DiagnosisPanel, { run: primaryRun, eventCount: eventCount, toolCount: toolCount })) : null, _jsxs(Tabs, { defaultValue: "overview", className: "p-5", children: [_jsxs(TabsList, {
|
|
334
|
+
return (_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "border-b px-5 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-base font-semibold text-foreground", children: detail.thread.title || detail.thread.preview || detail.thread.id }), _jsxs("div", { className: "mt-1 flex min-w-0 items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { className: "truncate font-mono", children: detail.lookup?.runId || detail.thread.id }), detail.lookup?.runId ? (_jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-7 shrink-0", title: "Copy run ID", "aria-label": "Copy run ID", onClick: () => void navigator.clipboard?.writeText(detail.lookup?.runId ?? ""), children: _jsx(IconCopy, { className: "size-3.5" }) })) : null] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [primaryRun ? (_jsx(Badge, { variant: primaryRun.status === "errored" ? "destructive" : "secondary", children: primaryRun.status })) : null, _jsx(Badge, { variant: "outline", children: detail.source.label })] })] }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [_jsx("span", { className: "truncate", children: detail.thread.ownerEmail }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: [detail.messages.length, " messages"] }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: [detail.runs.length, " runs"] }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsxs("span", { children: ["updated ", formatDate(detail.thread.updatedAt)] })] })] }), primaryRun ? (_jsx(DiagnosisPanel, { run: primaryRun, eventCount: eventCount, toolCount: toolCount })) : null, _jsxs(Tabs, { defaultValue: "overview", className: "p-5", children: [_jsxs(TabsList, { children: [_jsx(TabsTrigger, { value: "overview", children: "Overview" }), _jsx(TabsTrigger, { value: "timeline", children: "Timeline" }), _jsx(TabsTrigger, { value: "transcript", children: "Transcript" }), _jsx(TabsTrigger, { value: "technical", children: "Technical" })] }), _jsxs(TabsContent, { value: "overview", className: "mt-4 space-y-4", children: [_jsxs("div", { className: "flex items-start gap-2 border-b pb-4 text-sm text-muted-foreground", children: [_jsx(IconInfoCircle, { className: "mt-0.5 size-4 shrink-0" }), _jsx("p", { className: "max-w-2xl leading-relaxed", children: "This is the compact readout. Open Timeline for the last meaningful signals, Transcript for persisted messages and tool calls, or Technical for raw records." })] }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3", children: [_jsx(EvidenceStat, { label: "Created", value: formatDate(detail.thread.createdAt) }), _jsx(EvidenceStat, { label: "Updated", value: formatDate(detail.thread.updatedAt) }), _jsx(EvidenceStat, { label: "Source", value: detail.source.label }), _jsx(EvidenceStat, { label: "Messages", value: detail.messages.length.toLocaleString() }), _jsx(EvidenceStat, { label: "Retained events", value: eventCount.toLocaleString() }), _jsx(EvidenceStat, { label: "Tool starts", value: toolCount.toLocaleString() })] }), detail.messages.length === 0 && eventCount > 0 ? (_jsxs("div", { className: "flex items-start gap-2 rounded-lg border bg-muted/20 px-3 py-3 text-sm text-muted-foreground", children: [_jsx(IconActivity, { className: "mt-0.5 size-4 shrink-0" }), _jsxs("span", { children: ["No persisted messages are available, but this run retained", " ", eventCount.toLocaleString(), " execution events. The timeline is the authoritative audit trail for this run."] })] })) : null] }), _jsx(TabsContent, { value: "timeline", className: "mt-4 space-y-5", children: detail.runs.length > 0 ? (detail.runs.map((run) => (_jsxs("section", { className: "border-b pb-5 last:border-b-0 last:pb-0", children: [_jsxs("div", { className: "mb-3 flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: run.status === "errored" ? "destructive" : "outline", children: run.status }), _jsx("span", { className: "font-mono text-xs text-muted-foreground", children: run.id }), _jsx("span", { className: "text-xs text-muted-foreground", children: formatDuration(run.durationMs) })] }), _jsx(RunTimeline, { run: run })] }, run.id)))) : (_jsx("div", { className: "rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground", children: "No retained runs." })) }), _jsx(TabsContent, { value: "transcript", className: "mt-4 space-y-3", children: detail.messages.length > 0 ? (detail.messages.map((message) => (_jsx(MessageBlock, { message: message }, message.id ?? `message-${message.index}`)))) : (_jsxs("div", { className: "rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground", children: [_jsx("div", { children: "No persisted messages." }), eventCount > 0 ? (_jsx("div", { className: "mt-1", children: "Open Timeline to audit the retained execution events." })) : null] })) }), _jsxs(TabsContent, { value: "technical", className: "mt-4 space-y-3", children: [_jsxs("details", { className: "rounded-lg border", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-3 text-sm font-medium text-foreground", children: [_jsx("span", { children: "Run records" }), _jsxs("span", { className: "text-xs font-normal text-muted-foreground", children: [detail.runs.length, " ", detail.runs.length === 1 ? "run" : "runs"] })] }), _jsx("div", { className: "space-y-4 border-t p-3", children: detail.runs.length > 0 ? (detail.runs.map((run) => (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: run.status === "errored" ? "destructive" : "outline", children: run.status }), _jsx("span", { className: "break-all font-mono text-xs text-foreground", children: run.id })] }), _jsxs("div", { className: "grid gap-3 text-xs sm:grid-cols-2 xl:grid-cols-3", children: [_jsx(EvidenceStat, { label: "Failure code", value: run.errorCode || "n/a" }), _jsx(EvidenceStat, { label: "Terminal reason", value: run.terminalReason || run.abortReason || "n/a" }), _jsx(EvidenceStat, { label: "Dispatch mode", value: run.dispatchMode || "foreground" }), _jsx(EvidenceStat, { label: "Last stage", value: diagnosticStage(run.workerStage) ||
|
|
335
335
|
diagnosticStage(run.diagStage) ||
|
|
336
336
|
"n/a" }), _jsx(EvidenceStat, { label: "Duration", value: formatDuration(run.durationMs ??
|
|
337
337
|
(run.completedAt == null
|