@agent-native/dispatch 0.13.1 → 0.13.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.
- package/dist/actions/create-pylon-ticket.js +2 -1
- package/dist/actions/create-pylon-ticket.js.map +1 -1
- package/dist/actions/send-platform-message.js +7 -7
- package/dist/actions/send-platform-message.js.map +1 -1
- package/dist/components/dispatch-control-plane.js +1 -1
- package/dist/components/dispatch-control-plane.js.map +1 -1
- package/dist/components/layout/Header.d.ts.map +1 -1
- package/dist/components/layout/Header.js +0 -1
- package/dist/components/layout/Header.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +4 -1
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +55 -17
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/hooks/use-navigation-state.js +2 -2
- package/dist/hooks/use-navigation-state.js.map +1 -1
- package/dist/routes/pages/settings.d.ts.map +1 -1
- package/dist/routes/pages/settings.js +4 -2
- package/dist/routes/pages/settings.js.map +1 -1
- package/dist/routes/pages/team.d.ts.map +1 -1
- package/dist/routes/pages/team.js +2 -3
- package/dist/routes/pages/team.js.map +1 -1
- package/package.json +2 -2
- package/src/actions/create-pylon-ticket.ts +2 -1
- package/src/actions/send-platform-message.ts +12 -8
- package/src/components/dispatch-control-plane.tsx +1 -1
- package/src/components/layout/Header.tsx +0 -1
- package/src/components/layout/Layout.tsx +229 -102
- package/src/hooks/use-navigation-state.ts +2 -2
- package/src/routes/pages/settings.tsx +70 -47
- package/src/routes/pages/team.tsx +2 -17
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import { resolveSecret } from "@agent-native/core/server";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { recordAudit } from "../server/lib/dispatch-store.js";
|
|
4
5
|
const PYLON_API_BASE = process.env.PYLON_API_BASE_URL || "https://api.usepylon.com";
|
|
@@ -26,7 +27,7 @@ export default defineAction({
|
|
|
26
27
|
teamId: z.string().optional(),
|
|
27
28
|
}),
|
|
28
29
|
run: async (input) => {
|
|
29
|
-
const apiKey =
|
|
30
|
+
const apiKey = await resolveSecret("PYLON_API_KEY");
|
|
30
31
|
if (!apiKey) {
|
|
31
32
|
throw new Error("PYLON_API_KEY is not set. Add it to the Dispatch Vault.");
|
|
32
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-pylon-ticket.js","sourceRoot":"","sources":["../../src/actions/create-pylon-ticket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,0BAA0B,CAAC;AAE/D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,mNAAmN;IACrN,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACvD,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,KAAK,EAAE;aACP,QAAQ,EAAE;aACV,QAAQ,CAAC,gDAAgD,CAAC;QAC7D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,kFAAkF,CACnF;QACH,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"create-pylon-ticket.js","sourceRoot":"","sources":["../../src/actions/create-pylon-ticket.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineAction } from \"@agent-native/core\";\nimport { resolveSecret } from \"@agent-native/core/server\";\nimport { z } from \"zod\";\n\nimport { recordAudit } from \"../server/lib/dispatch-store.js\";\n\nconst PYLON_API_BASE =\n process.env.PYLON_API_BASE_URL || \"https://api.usepylon.com\";\n\nexport default defineAction({\n description:\n \"Create a Pylon ticket. Use to escalate blockers from client meetings, route unmatched #customer-* posts that have no Slack channel, or open a follow-up that needs tracking. Requires PYLON_API_KEY in the Vault.\",\n schema: z.object({\n title: z.string().min(1).describe(\"Short ticket title\"),\n bodyHtml: z\n .string()\n .min(1)\n .describe(\"HTML body — Pylon renders this in the ticket\"),\n requesterEmail: z\n .string()\n .email()\n .optional()\n .describe(\"Email of the person the ticket is on behalf of\"),\n requesterName: z.string().optional(),\n accountId: z\n .string()\n .optional()\n .describe(\n \"Pylon account ID — provide either this OR requesterEmail to identify the subject\",\n ),\n priority: z.enum([\"urgent\", \"high\", \"medium\", \"low\"]).optional(),\n tags: z.array(z.string()).optional(),\n assigneeId: z.string().optional(),\n teamId: z.string().optional(),\n }),\n run: async (input) => {\n const apiKey = await resolveSecret(\"PYLON_API_KEY\");\n if (!apiKey) {\n throw new Error(\n \"PYLON_API_KEY is not set. Add it to the Dispatch Vault.\",\n );\n }\n if (!input.accountId && !input.requesterEmail) {\n throw new Error(\n \"Pylon requires either accountId or requesterEmail to identify the ticket subject.\",\n );\n }\n\n const payload: Record<string, unknown> = {\n title: input.title,\n body_html: input.bodyHtml,\n };\n if (input.accountId) payload.account_id = input.accountId;\n if (input.requesterEmail) payload.requester_email = input.requesterEmail;\n if (input.requesterName) payload.requester_name = input.requesterName;\n if (input.priority) payload.priority = input.priority;\n if (input.tags?.length) payload.tags = input.tags;\n if (input.assigneeId) payload.assignee_id = input.assigneeId;\n if (input.teamId) payload.team_id = input.teamId;\n\n const res = await fetch(`${PYLON_API_BASE}/issues`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Pylon ticket creation failed (HTTP ${res.status})${text ? `: ${text.slice(0, 500)}` : \"\"}`,\n );\n }\n\n const data = (await res.json().catch(() => null)) as Record<\n string,\n unknown\n > | null;\n const issue =\n data && typeof data === \"object\" && \"issue\" in data\n ? ((data as { issue?: Record<string, unknown> }).issue ?? {})\n : (data ?? {});\n const ticketId =\n issue && typeof (issue as { id?: unknown }).id === \"string\"\n ? (issue as { id: string }).id\n : \"\";\n\n await recordAudit({\n action: \"pylon.ticket.created\",\n targetType: \"pylon-ticket\",\n targetId: ticketId || null,\n summary: `Created Pylon ticket: ${input.title}`,\n metadata: {\n title: input.title,\n priority: input.priority,\n tags: input.tags,\n accountId: input.accountId,\n requesterEmail: input.requesterEmail,\n ticketId,\n },\n });\n\n return {\n ok: true as const,\n ticketId,\n ticket: issue,\n };\n },\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
|
-
import { slackAdapter, telegramAdapter, emailAdapter, } from "@agent-native/core/server";
|
|
2
|
+
import { slackAdapter, telegramAdapter, emailAdapter, isEmailConfigured, resolveSecret, } from "@agent-native/core/server";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { getDestinationById, recordAudit, } from "../server/lib/dispatch-store.js";
|
|
5
5
|
function getAdapter(platform) {
|
|
@@ -7,16 +7,16 @@ function getAdapter(platform) {
|
|
|
7
7
|
return emailAdapter();
|
|
8
8
|
return platform === "slack" ? slackAdapter() : telegramAdapter();
|
|
9
9
|
}
|
|
10
|
-
function assertOutboundConfigured(platform) {
|
|
11
|
-
if (platform === "slack" && !
|
|
10
|
+
async function assertOutboundConfigured(platform) {
|
|
11
|
+
if (platform === "slack" && !(await resolveSecret("SLACK_BOT_TOKEN"))) {
|
|
12
12
|
throw new Error("Slack outbound messaging is not configured");
|
|
13
13
|
}
|
|
14
|
-
if (platform === "telegram" && !
|
|
14
|
+
if (platform === "telegram" && !(await resolveSecret("TELEGRAM_BOT_TOKEN"))) {
|
|
15
15
|
throw new Error("Telegram outbound messaging is not configured");
|
|
16
16
|
}
|
|
17
17
|
if (platform === "email") {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (!(await resolveSecret("EMAIL_AGENT_ADDRESS")) ||
|
|
19
|
+
!(await isEmailConfigured())) {
|
|
20
20
|
throw new Error("Email outbound messaging is not configured");
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -40,7 +40,7 @@ export default defineAction({
|
|
|
40
40
|
if (!resolvedPlatform || !resolvedDestination) {
|
|
41
41
|
throw new Error("A platform and destination are required");
|
|
42
42
|
}
|
|
43
|
-
assertOutboundConfigured(resolvedPlatform);
|
|
43
|
+
await assertOutboundConfigured(resolvedPlatform);
|
|
44
44
|
const adapter = getAdapter(resolvedPlatform);
|
|
45
45
|
if (!adapter.sendMessageToTarget) {
|
|
46
46
|
throw new Error(`Platform ${resolvedPlatform} does not support proactive outbound messaging`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-platform-message.js","sourceRoot":"","sources":["../../src/actions/send-platform-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"send-platform-message.js","sourceRoot":"","sources":["../../src/actions/send-platform-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineAction } from \"@agent-native/core\";\nimport {\n slackAdapter,\n telegramAdapter,\n emailAdapter,\n isEmailConfigured,\n resolveSecret,\n} from \"@agent-native/core/server\";\nimport { z } from \"zod\";\n\nimport {\n getDestinationById,\n recordAudit,\n} from \"../server/lib/dispatch-store.js\";\n\nfunction getAdapter(platform: \"slack\" | \"telegram\" | \"email\") {\n if (platform === \"email\") return emailAdapter();\n return platform === \"slack\" ? slackAdapter() : telegramAdapter();\n}\n\nasync function assertOutboundConfigured(\n platform: \"slack\" | \"telegram\" | \"email\",\n) {\n if (platform === \"slack\" && !(await resolveSecret(\"SLACK_BOT_TOKEN\"))) {\n throw new Error(\"Slack outbound messaging is not configured\");\n }\n if (platform === \"telegram\" && !(await resolveSecret(\"TELEGRAM_BOT_TOKEN\"))) {\n throw new Error(\"Telegram outbound messaging is not configured\");\n }\n if (platform === \"email\") {\n if (\n !(await resolveSecret(\"EMAIL_AGENT_ADDRESS\")) ||\n !(await isEmailConfigured())\n ) {\n throw new Error(\"Email outbound messaging is not configured\");\n }\n }\n}\n\nexport default defineAction({\n description:\n \"Send a proactive message to a saved Slack, Telegram, or email destination.\",\n schema: z.object({\n platform: z.enum([\"slack\", \"telegram\", \"email\"]).optional(),\n destinationId: z.string().optional().describe(\"Saved destination id\"),\n destination: z.string().optional().describe(\"Raw platform destination id\"),\n threadRef: z.string().optional().describe(\"Optional thread reference\"),\n text: z.string().describe(\"Message to send\"),\n }),\n run: async ({ platform, destinationId, destination, threadRef, text }) => {\n const saved = destinationId\n ? await getDestinationById(destinationId)\n : null;\n const resolvedPlatform = (saved?.platform || platform) as\n | \"slack\"\n | \"telegram\"\n | \"email\"\n | undefined;\n const resolvedDestination = saved?.destination || destination;\n const resolvedThreadRef = saved?.threadRef || threadRef || null;\n\n if (!resolvedPlatform || !resolvedDestination) {\n throw new Error(\"A platform and destination are required\");\n }\n\n await assertOutboundConfigured(resolvedPlatform);\n\n const adapter = getAdapter(resolvedPlatform);\n if (!adapter.sendMessageToTarget) {\n throw new Error(\n `Platform ${resolvedPlatform} does not support proactive outbound messaging`,\n );\n }\n\n await adapter.sendMessageToTarget(adapter.formatAgentResponse(text), {\n destination: resolvedDestination,\n threadRef: resolvedThreadRef,\n label: saved?.name || undefined,\n });\n\n await recordAudit({\n action: \"message.sent\",\n targetType: \"destination\",\n targetId: destinationId || resolvedDestination,\n summary: `Sent proactive ${resolvedPlatform} message${saved?.name ? ` to ${saved.name}` : \"\"}`,\n metadata: {\n platform: resolvedPlatform,\n destination: resolvedDestination,\n threadRef: resolvedThreadRef,\n text,\n },\n });\n\n return {\n ok: true,\n platform: resolvedPlatform,\n destination: resolvedDestination,\n threadRef: resolvedThreadRef,\n };\n },\n});\n"]}
|
|
@@ -392,7 +392,7 @@ function ReadinessPanel({ overview, apps, agents, automations, }) {
|
|
|
392
392
|
label: "Team",
|
|
393
393
|
detail: `${overview?.counts?.linkedIdentities ?? 0} linked identities`,
|
|
394
394
|
ok: (overview?.counts?.linkedIdentities ?? 0) > 0,
|
|
395
|
-
to: "/team",
|
|
395
|
+
to: "/settings#team",
|
|
396
396
|
icon: IconUsersGroup,
|
|
397
397
|
},
|
|
398
398
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n PromptComposer,\n agentNativePath,\n isInBuilderFrame,\n useActionQuery,\n useChangeVersions,\n useChatModels,\n useChatThreads,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { RunsTray } from \"@agent-native/core/client/progress\";\nimport {\n IconActivity,\n IconAlertTriangle,\n IconArrowUpRight,\n IconBolt,\n IconBroadcast,\n IconCheck,\n IconClockHour4,\n IconListCheck,\n IconMessages,\n IconPlayerPlay,\n IconPlugConnected,\n IconPlus,\n IconRobot,\n IconRocket,\n IconSettingsAutomation,\n IconShieldCheck,\n IconStack3,\n IconUsersGroup,\n type IconProps,\n} from \"@tabler/icons-react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\n\nimport type { ConnectedAgent } from \"@/components/agents-panel\";\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport {\n listDispatchAutomations,\n setDispatchAutomationEnabled,\n type DispatchAutomationItem,\n type SetDispatchAutomationEnabledInput,\n} from \"@/lib/automations\";\nimport { submitOverviewPrompt } from \"@/lib/overview-chat\";\nimport { cn } from \"@/lib/utils\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\ninterface DispatchOverview {\n counts?: {\n destinations?: number;\n pendingApprovals?: number;\n linkedIdentities?: number;\n activeTokens?: number;\n };\n recentApprovals?: Array<{\n id: string;\n summary: string;\n status: string;\n requestedBy?: string;\n }>;\n recentAudit?: RecentAuditEvent[];\n settings?: {\n enabled?: boolean;\n };\n vault?: {\n secretCount?: number;\n activeGrantCount?: number;\n accessMode?: string;\n };\n}\n\ninterface RecentAuditEvent {\n id: string;\n summary: string;\n actor: string;\n action?: string;\n createdAt: string;\n}\n\ninterface TaskQueueRecentFailure {\n id: string;\n platform: string;\n error: string;\n attempts: number;\n}\n\ninterface TaskQueueStats {\n pending: number;\n processing: number;\n completed_last_hour: number;\n failed_last_hour: number;\n oldest_pending_age_seconds: number;\n recent_failures: TaskQueueRecentFailure[];\n}\n\ntype AutomationItem = DispatchAutomationItem;\n\nconst ZERO_TASK_QUEUE_STATS: TaskQueueStats = {\n pending: 0,\n processing: 0,\n completed_last_hour: 0,\n failed_last_hour: 0,\n oldest_pending_age_seconds: 0,\n recent_failures: [],\n};\n\nconst PROMPT_SUGGESTIONS = [\n \"Summarize the current workspace health\",\n \"Create an app for onboarding requests\",\n \"Check which agents can help with analytics\",\n];\n\nconst AUTOMATIONS_QUERY_KEY = [\n \"dispatch-control-plane\",\n \"automations\",\n] as const;\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat(undefined, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: value >= 10_000 ? 1 : 0,\n }).format(value);\n}\n\nfunction formatAgeSeconds(seconds: number): string {\n if (!seconds || seconds < 0) return \"0s\";\n if (seconds < 60) return `${Math.floor(seconds)}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;\n}\n\nfunction timeAgo(value: number | string | null | undefined): string {\n if (value == null || value === \"\") return \"never\";\n const timestamp =\n typeof value === \"number\" ? value : new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = Math.max(0, Date.now() - timestamp);\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h`;\n return `${Math.floor(diff / 86_400_000)}d`;\n}\n\nfunction relativeRunTime(value: string | null | undefined): string {\n if (!value) return \"never\";\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const suffix = diff >= 0 ? \"from now\" : \"ago\";\n if (abs < 60_000) return diff >= 0 ? \"soon\" : \"now\";\n if (abs < 3_600_000) return `${Math.floor(abs / 60_000)}m ${suffix}`;\n if (abs < 86_400_000) return `${Math.floor(abs / 3_600_000)}h ${suffix}`;\n return `${Math.floor(abs / 86_400_000)}d ${suffix}`;\n}\n\nfunction dateTimeTitle(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return undefined;\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(timestamp);\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary): number {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction threadTitle(thread: ChatThreadSummary): string {\n return thread.title || thread.preview || \"New chat\";\n}\n\nfunction automationTarget(item: AutomationItem): string {\n if (item.triggerType === \"event\" && item.event) return item.event;\n if (item.scheduleDescription) return item.scheduleDescription;\n if (item.schedule) return item.schedule;\n return item.triggerType || \"schedule\";\n}\n\nfunction automationLastRun(item: AutomationItem): string {\n return item.lastRun ? relativeRunTime(item.lastRun) : \"never\";\n}\n\nfunction automationNextRun(item: AutomationItem): string {\n if (!item.enabled) return \"paused\";\n if (item.triggerType === \"event\") return \"on event\";\n return item.nextRun ? relativeRunTime(item.nextRun) : \"not scheduled\";\n}\n\nfunction automationStatus(item: AutomationItem): {\n label: string;\n tone: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n} {\n if (!item.enabled) return { label: \"Paused\", tone: \"muted\" };\n if (item.lastStatus === \"error\") return { label: \"Error\", tone: \"danger\" };\n if (item.lastStatus === \"running\")\n return { label: \"Running\", tone: \"warning\" };\n if (item.lastStatus === \"skipped\")\n return { label: \"Skipped\", tone: \"warning\" };\n if (item.lastStatus === \"success\")\n return { label: \"Healthy\", tone: \"success\" };\n return { label: \"Ready\", tone: \"default\" };\n}\n\nfunction automationIdentity(\n item: Pick<AutomationItem, \"owner\" | \"path\">,\n): string {\n return `${item.owner}:${item.path}`;\n}\n\nfunction StatusDot({\n tone = \"default\",\n}: {\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n}) {\n return (\n <span\n className={cn(\n \"size-2 rounded-full\",\n tone === \"success\" && \"bg-emerald-500\",\n tone === \"warning\" && \"bg-amber-500\",\n tone === \"danger\" && \"bg-destructive\",\n tone === \"muted\" && \"bg-muted-foreground/35\",\n tone === \"default\" && \"bg-primary\",\n )}\n />\n );\n}\n\nfunction useAutomationsStatus() {\n const version = useChangeVersions([\"action\", \"screen-refresh\"]);\n return useQuery<AutomationItem[]>({\n queryKey: [...AUTOMATIONS_QUERY_KEY, version],\n queryFn: listDispatchAutomations,\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction useToggleAutomation() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: setDispatchAutomationEnabled,\n onMutate: async (input: SetDispatchAutomationEnabledInput) => {\n await queryClient.cancelQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n const snapshots = queryClient.getQueriesData<AutomationItem[]>({\n queryKey: AUTOMATIONS_QUERY_KEY,\n });\n\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(input)\n ? { ...item, enabled: input.enabled }\n : item,\n ),\n );\n\n return { snapshots };\n },\n onError: (err, _input, context) => {\n for (const [queryKey, data] of context?.snapshots ?? []) {\n queryClient.setQueryData(queryKey, data);\n }\n toast.error(\n `Could not update automation: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n },\n onSuccess: (updated) => {\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(updated)\n ? updated\n : item,\n ),\n );\n },\n onSettled: () => {\n void queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n },\n });\n}\n\nfunction useTaskQueueStats() {\n return useQuery<TaskQueueStats>({\n queryKey: [\"dispatch-control-plane\", \"task-queue\"],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/integrations/task-queue/status\"),\n );\n if (!res.ok) return ZERO_TASK_QUEUE_STATS;\n const stats = await res.json();\n if (!stats || typeof stats !== \"object\") return ZERO_TASK_QUEUE_STATS;\n return {\n pending: Number(stats.pending ?? 0),\n processing: Number(stats.processing ?? 0),\n completed_last_hour: Number(stats.completed_last_hour ?? 0),\n failed_last_hour: Number(stats.failed_last_hour ?? 0),\n oldest_pending_age_seconds: Number(\n stats.oldest_pending_age_seconds ?? 0,\n ),\n recent_failures: Array.isArray(stats.recent_failures)\n ? stats.recent_failures\n : [],\n };\n },\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction CommandPanel() {\n const { selectedModel } = useChatModels();\n const navigate = useNavigate();\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n if (isInBuilderFrame()) {\n submitOverviewPrompt(trimmed, selectedModel);\n return;\n }\n\n navigate(\"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n },\n },\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconBroadcast size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n Ask Dispatch\n </h2>\n </div>\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Open chat\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n </div>\n <PromptComposer\n placeholder=\"Route work, inspect status, or create an app...\"\n onSubmit={(text) => send(text)}\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {PROMPT_SUGGESTIONS.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-muted-foreground transition hover:border-foreground/30 hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </section>\n );\n}\n\nfunction MetricCard({\n label,\n value,\n detail,\n icon: Icon,\n to,\n tone = \"default\",\n}: {\n label: string;\n value: ReactNode;\n detail: string;\n icon: React.ComponentType<IconProps>;\n to?: string;\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\";\n}) {\n const body = (\n <>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Icon size={15} />\n <span className=\"truncate\">{label}</span>\n </div>\n <StatusDot\n tone={\n tone === \"success\"\n ? \"success\"\n : tone === \"warning\"\n ? \"warning\"\n : tone === \"danger\"\n ? \"danger\"\n : \"default\"\n }\n />\n </div>\n <div className=\"mt-3 text-2xl font-semibold tracking-tight text-foreground\">\n {value}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {detail}\n </div>\n </>\n );\n\n const className = cn(\n \"block min-w-0 rounded-lg border bg-card p-4 transition\",\n to && \"hover:border-foreground/30 hover:bg-muted/20\",\n );\n\n if (to) {\n return (\n <Link to={to} className={className}>\n {body}\n </Link>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n\nfunction ControlPlaneMetrics({\n overview,\n apps,\n agents,\n automations,\n threads,\n taskQueue,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n threads: ChatThreadSummary[];\n taskQueue: TaskQueueStats;\n}) {\n const activeApps = apps.filter((app) => !app.isDispatch && !app.archived);\n const pendingApps = activeApps.filter((app) => app.status === \"pending\");\n const enabledAutomations = automations.filter((item) => item.enabled);\n const automationErrors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n );\n const pendingApprovals = overview?.counts?.pendingApprovals ?? 0;\n const activeRuns = taskQueue.processing;\n\n return (\n <section className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-6\">\n <MetricCard\n label=\"Chats\"\n value={formatNumber(threads.length)}\n detail={`${threads.filter((thread) => thread.messageCount > 0).length} with messages`}\n icon={IconMessages}\n to=\"/chat\"\n />\n <MetricCard\n label=\"Runs\"\n value={formatNumber(activeRuns)}\n detail={`${formatNumber(taskQueue.pending)} queued`}\n icon={IconPlayerPlay}\n tone={\n taskQueue.failed_last_hour > 0\n ? \"danger\"\n : taskQueue.pending > 5\n ? \"warning\"\n : \"default\"\n }\n />\n <MetricCard\n label=\"Apps\"\n value={formatNumber(activeApps.length)}\n detail={`${formatNumber(pendingApps.length)} building`}\n icon={IconStack3}\n to=\"/apps\"\n tone={pendingApps.length > 0 ? \"warning\" : \"default\"}\n />\n <MetricCard\n label=\"Agents\"\n value={formatNumber(agents.length)}\n detail={`${formatNumber(agents.filter((agent) => agent.source === \"custom\").length)} custom`}\n icon={IconRobot}\n to=\"/agents\"\n />\n <MetricCard\n label=\"Automations\"\n value={formatNumber(enabledAutomations.length)}\n detail={`${formatNumber(automationErrors.length)} need attention`}\n icon={IconSettingsAutomation}\n tone={automationErrors.length > 0 ? \"danger\" : \"success\"}\n />\n <MetricCard\n label=\"Approvals\"\n value={formatNumber(pendingApprovals)}\n detail={\n overview?.settings?.enabled ? \"review mode\" : \"immediate changes\"\n }\n icon={IconShieldCheck}\n to=\"/approvals\"\n tone={pendingApprovals > 0 ? \"warning\" : \"default\"}\n />\n </section>\n );\n}\n\nfunction SectionHeader({\n icon: Icon,\n title,\n detail,\n action,\n}: {\n icon: React.ComponentType<IconProps>;\n title: string;\n detail?: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon size={16} className=\"shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {detail ? (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {detail}\n </p>\n ) : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction RecentChatsPanel() {\n const navigate = useNavigate();\n const { threads, activeThreadId, createThread, switchThread } =\n useChatThreads(undefined, undefined, undefined, { autoCreate: false });\n const [creating, setCreating] = useState(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 5),\n [activeThreadId, threads],\n );\n\n function openThread(threadId: string, isNew = false) {\n switchThread(threadId);\n navigate(\"/chat\", {\n state: {\n dispatchThread: {\n id: `${Date.now()}-${threadId}`,\n threadId,\n },\n },\n });\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: isNew },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n setCreating(true);\n try {\n const threadId = await createThread();\n if (threadId) openThread(threadId, true);\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconMessages}\n title=\"Chats\"\n detail={`${visibleThreads.length} recent`}\n action={\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleNewChat}\n disabled={creating}\n >\n <IconPlus size={14} />\n New\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {visibleThreads.length > 0 ? (\n visibleThreads.map((thread) => (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5 text-left transition hover:bg-muted/40\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {threadTitle(thread)}\n </span>\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {thread.preview || `${thread.messageCount} messages`}\n </span>\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n {timeAgo(threadUpdatedAt(thread))}\n </span>\n </button>\n ))\n ) : (\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"block w-full px-3 py-8 text-center text-sm text-muted-foreground transition hover:bg-muted/40\"\n >\n Start a Dispatch chat\n </button>\n )}\n </div>\n </section>\n );\n}\n\nfunction RunsPanel({ taskQueue }: { taskQueue: TaskQueueStats }) {\n const hasFailure = taskQueue.failed_last_hour > 0;\n const hasBacklog =\n taskQueue.pending > 5 || taskQueue.oldest_pending_age_seconds > 300;\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlayerPlay}\n title=\"Runs\"\n detail={\n hasFailure\n ? `${taskQueue.failed_last_hour} failed in the last hour`\n : `${taskQueue.processing} processing`\n }\n action={\n <RunsTray\n triggerVariant=\"pill\"\n hideWhenIdle={false}\n showRecent\n limit={8}\n />\n }\n />\n <div className=\"mt-3 grid grid-cols-4 gap-2\">\n <QueueCell label=\"Queued\" value={taskQueue.pending} />\n <QueueCell label=\"Active\" value={taskQueue.processing} />\n <QueueCell label=\"Done 1h\" value={taskQueue.completed_last_hour} />\n <QueueCell\n label=\"Failed 1h\"\n value={taskQueue.failed_last_hour}\n danger={hasFailure}\n />\n </div>\n <div\n className={cn(\n \"mt-3 rounded-md border px-3 py-2 text-xs\",\n hasFailure\n ? \"border-destructive/30 bg-destructive/5 text-destructive\"\n : hasBacklog\n ? \"border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n : \"bg-muted/20 text-muted-foreground\",\n )}\n >\n Oldest queued: {formatAgeSeconds(taskQueue.oldest_pending_age_seconds)}\n </div>\n {taskQueue.recent_failures.length > 0 ? (\n <div className=\"mt-3 divide-y rounded-md border\">\n {taskQueue.recent_failures.slice(0, 3).map((failure) => (\n <div key={failure.id} className=\"px-3 py-2\">\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <span className=\"font-medium text-foreground\">\n {failure.platform}\n </span>\n <span className=\"text-muted-foreground\">\n {failure.attempts} attempts\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {failure.error || \"(no error message)\"}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction QueueCell({\n label,\n value,\n danger,\n}: {\n label: string;\n value: number;\n danger?: boolean;\n}) {\n return (\n <div className=\"rounded-md border bg-background px-2 py-2\">\n <div\n className={cn(\n \"text-lg font-semibold text-foreground\",\n danger && \"text-destructive\",\n )}\n >\n {formatNumber(value)}\n </div>\n <div className=\"truncate text-[11px] text-muted-foreground\">{label}</div>\n </div>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const visibleApps = apps\n .filter((app) => !app.isDispatch && !app.archived)\n .slice(0, 4);\n const showSkeletons = isLoading && visibleApps.length === 0;\n\n return (\n <section className=\"space-y-3\">\n <SectionHeader\n icon={IconStack3}\n title=\"Projects and apps\"\n detail={`${apps.filter((app) => !app.isDispatch && !app.archived).length} active`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/apps\">\n View all\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n {showSkeletons ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"mt-3 h-3 w-24\" />\n <Skeleton className=\"mt-3 h-3 w-full\" />\n </div>\n ))}\n </div>\n ) : visibleApps.length > 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {visibleApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} className=\"min-h-32\" />\n ))}\n </div>\n ) : (\n <CreateAppPopover />\n )}\n </section>\n );\n}\n\nfunction AutomationsPanel({\n automations,\n isLoading,\n}: {\n automations: AutomationItem[];\n isLoading: boolean;\n}) {\n const toggleAutomation = useToggleAutomation();\n const ordered = useMemo(\n () =>\n [...automations].sort((a, b) => {\n const aError = a.enabled && a.lastStatus === \"error\" ? 1 : 0;\n const bError = b.enabled && b.lastStatus === \"error\" ? 1 : 0;\n if (aError !== bError) return bError - aError;\n return (b.lastRun || \"\").localeCompare(a.lastRun || \"\");\n }),\n [automations],\n );\n const enabled = automations.filter((item) => item.enabled).length;\n const errors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n ).length;\n const pendingToggleIdentity = toggleAutomation.isPending\n ? toggleAutomation.variables\n ? automationIdentity(toggleAutomation.variables)\n : null\n : null;\n\n function handleToggle(item: AutomationItem, enabled: boolean) {\n toggleAutomation.mutate({\n owner: item.owner,\n path: item.path,\n enabled,\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconSettingsAutomation}\n title=\"Automations\"\n detail={`${enabled} enabled · ${errors} errors`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Create\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {isLoading && ordered.length === 0 ? (\n Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : ordered.length > 0 ? (\n ordered.slice(0, 6).map((item) => {\n const status = automationStatus(item);\n const canUpdate = item.canUpdate !== false;\n const isToggling =\n pendingToggleIdentity === automationIdentity(item);\n return (\n <div\n key={item.id}\n className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <StatusDot tone={status.tone} />\n <span className=\"truncate text-sm font-medium text-foreground\">\n {item.name}\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {automationTarget(item)}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px] text-muted-foreground\">\n <span title={dateTimeTitle(item.lastRun)}>\n Last {automationLastRun(item)}\n </span>\n <span title={dateTimeTitle(item.nextRun)}>\n Next {automationNextRun(item)}\n </span>\n </div>\n {item.lastError ? (\n <div className=\"mt-1 truncate text-xs text-destructive\">\n {item.lastError}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col items-end gap-1\">\n <Badge\n variant={\n status.tone === \"danger\" ? \"destructive\" : \"outline\"\n }\n className=\"h-5\"\n >\n {status.label}\n </Badge>\n <Switch\n checked={!!item.enabled}\n disabled={!canUpdate || isToggling}\n aria-label={`${item.enabled ? \"Disable\" : \"Enable\"} automation ${item.name}`}\n onCheckedChange={(checked) => handleToggle(item, checked)}\n />\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No automations yet\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction AgentsPanelSummary({ agents }: { agents: ConnectedAgent[] }) {\n const builtin = agents.filter((agent) => agent.source === \"builtin\");\n const extra = agents.filter((agent) => agent.source !== \"builtin\");\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlugConnected}\n title=\"Agents\"\n detail={`${builtin.length} built in · ${extra.length} added`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/agents\">\n Manage\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {agents.slice(0, 12).map((agent) => (\n <span\n key={agent.id}\n className=\"inline-flex max-w-full items-center gap-2 rounded-md border bg-background px-2.5 py-1.5 text-xs text-muted-foreground\"\n >\n <span\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: agent.color || \"hsl(var(--primary))\" }}\n />\n <span className=\"truncate\">{agent.name}</span>\n </span>\n ))}\n {agents.length === 0 ? (\n <div className=\"w-full rounded-md border border-dashed px-3 py-6 text-center text-sm text-muted-foreground\">\n No agents detected\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalsAndAuditPanel({\n overview,\n isLoading,\n}: {\n overview?: DispatchOverview;\n isLoading: boolean;\n}) {\n const approvals = overview?.recentApprovals ?? [];\n const audit = overview?.recentAudit ?? [];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconActivity}\n title=\"Activity\"\n detail={`${approvals.length} approvals · ${audit.length} audit rows`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/audit\">\n Audit\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 grid gap-3 lg:grid-cols-2\">\n <div className=\"rounded-md border\">\n <div className=\"flex items-center justify-between gap-3 border-b px-3 py-2\">\n <div className=\"text-xs font-medium uppercase text-muted-foreground\">\n Approvals\n </div>\n <Button variant=\"ghost\" size=\"sm\" asChild>\n <Link to=\"/approvals\">Open</Link>\n </Button>\n </div>\n <div className=\"divide-y\">\n {isLoading && approvals.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-24\" />\n </div>\n ))\n ) : approvals.length > 0 ? (\n approvals.slice(0, 4).map((approval) => (\n <div key={approval.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {approval.summary}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <StatusDot\n tone={approval.status === \"pending\" ? \"warning\" : \"muted\"}\n />\n <span>{approval.status}</span>\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No approval requests\n </div>\n )}\n </div>\n </div>\n\n <div className=\"rounded-md border\">\n <div className=\"border-b px-3 py-2 text-xs font-medium uppercase text-muted-foreground\">\n Recent audit\n </div>\n <div className=\"divide-y\">\n {isLoading && audit.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-44\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : audit.length > 0 ? (\n audit.slice(0, 4).map((event) => (\n <div key={event.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {event.summary}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {event.actor} · {timeAgo(event.createdAt)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No audit entries\n </div>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nfunction ReadinessPanel({\n overview,\n apps,\n agents,\n automations,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n}) {\n const rows = [\n {\n label: \"Vault\",\n detail:\n (overview?.vault?.secretCount ?? 0) > 0\n ? `${overview?.vault?.secretCount ?? 0} secrets`\n : \"no secrets\",\n ok: (overview?.vault?.secretCount ?? 0) > 0,\n to: \"/vault\",\n icon: IconShieldCheck,\n },\n {\n label: \"Apps\",\n detail: `${apps.filter((app) => !app.isDispatch && !app.archived).length} active`,\n ok: apps.some((app) => !app.isDispatch && !app.archived),\n to: \"/apps\",\n icon: IconRocket,\n },\n {\n label: \"Agents\",\n detail: `${agents.length} available`,\n ok: agents.length > 0,\n to: \"/agents\",\n icon: IconRobot,\n },\n {\n label: \"Automations\",\n detail: `${automations.filter((item) => item.enabled).length} enabled`,\n ok: automations.every(\n (item) => !item.enabled || item.lastStatus !== \"error\",\n ),\n to: \"/chat\",\n icon: IconBolt,\n },\n {\n label: \"Team\",\n detail: `${overview?.counts?.linkedIdentities ?? 0} linked identities`,\n ok: (overview?.counts?.linkedIdentities ?? 0) > 0,\n to: \"/team\",\n icon: IconUsersGroup,\n },\n ];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader icon={IconListCheck} title=\"Readiness\" />\n <div className=\"mt-3 divide-y rounded-md border\">\n {rows.map((row) => {\n const Icon = row.icon;\n return (\n <Link\n key={row.label}\n to={row.to}\n className=\"flex items-center gap-3 px-3 py-2.5 transition hover:bg-muted/40\"\n >\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-md border\",\n row.ok\n ? \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\"\n : \"bg-background text-muted-foreground\",\n )}\n >\n {row.ok ? <IconCheck size={14} /> : <Icon size={14} />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {row.label}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {row.detail}\n </span>\n </span>\n <IconArrowUpRight size={14} className=\"text-muted-foreground\" />\n </Link>\n );\n })}\n </div>\n </section>\n );\n}\n\nexport function DispatchControlPlane() {\n const { data: overviewData, isLoading: overviewLoading } =\n useActionQuery<DispatchOverview>(\"list-dispatch-overview\", {});\n const { data: connectedAgents = [] } = useActionQuery<ConnectedAgent[]>(\n \"list-connected-agents\",\n {},\n );\n const { data: workspaceApps = [], isLoading: appsLoading } = useActionQuery<\n WorkspaceAppSummary[]\n >(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n { refetchInterval: 2_000 },\n );\n const { threads } = useChatThreads(undefined, undefined, undefined, {\n autoCreate: false,\n });\n const automationsQuery = useAutomationsStatus();\n const taskQueueQuery = useTaskQueueStats();\n\n const overview = overviewData;\n const apps = workspaceApps ?? [];\n const agents = connectedAgents ?? [];\n const automations = automationsQuery.data ?? [];\n const taskQueue = taskQueueQuery.data ?? ZERO_TASK_QUEUE_STATS;\n const visibleThreads = threads.filter((thread) => thread.messageCount > 0);\n\n useEffect(() => {\n const handleRunning = () => {\n void taskQueueQuery.refetch();\n };\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n return () => {\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n };\n }, [taskQueueQuery]);\n\n return (\n <DispatchShell\n title=\"Control plane\"\n description=\"Dispatch is the workspace shell for chats, runs, apps, agents, automations, approvals, and resources.\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(360px,0.92fr)]\">\n <CommandPanel />\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <MetricCard\n label=\"Vault\"\n value={formatNumber(overview?.vault?.secretCount ?? 0)}\n detail={`${formatNumber(overview?.vault?.activeGrantCount ?? 0)} active grants`}\n icon={IconShieldCheck}\n to=\"/vault\"\n tone={\n (overview?.vault?.secretCount ?? 0) > 0 ? \"success\" : \"default\"\n }\n />\n <MetricCard\n label=\"Resources\"\n value={formatNumber(overview?.counts?.destinations ?? 0)}\n detail=\"destinations\"\n icon={IconArrowUpRight}\n to=\"/destinations\"\n />\n </div>\n </div>\n\n <ControlPlaneMetrics\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n threads={visibleThreads}\n taskQueue={taskQueue}\n />\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.15fr)_minmax(340px,0.85fr)]\">\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <RecentChatsPanel />\n <RunsPanel taskQueue={taskQueue} />\n </div>\n <AppsPanel apps={apps} isLoading={appsLoading} />\n <ApprovalsAndAuditPanel\n overview={overview}\n isLoading={overviewLoading}\n />\n </div>\n\n <div className=\"space-y-4\">\n <AutomationsPanel\n automations={automations}\n isLoading={automationsQuery.isLoading}\n />\n <AgentsPanelSummary agents={agents} />\n <ReadinessPanel\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n />\n {taskQueue.failed_last_hour > 0 ? (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"flex items-center gap-2 font-medium\">\n <IconAlertTriangle size={16} />\n Integration failures detected\n </div>\n <div className=\"mt-1 text-xs\">\n Check credentials, destinations, and recent queue errors.\n </div>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </DispatchShell>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dispatch-control-plane.js","sourceRoot":"","sources":["../../src/components/dispatch-control-plane.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n PromptComposer,\n agentNativePath,\n isInBuilderFrame,\n useActionQuery,\n useChangeVersions,\n useChatModels,\n useChatThreads,\n type ChatThreadSummary,\n} from \"@agent-native/core/client\";\nimport { RunsTray } from \"@agent-native/core/client/progress\";\nimport {\n IconActivity,\n IconAlertTriangle,\n IconArrowUpRight,\n IconBolt,\n IconBroadcast,\n IconCheck,\n IconClockHour4,\n IconListCheck,\n IconMessages,\n IconPlayerPlay,\n IconPlugConnected,\n IconPlus,\n IconRobot,\n IconRocket,\n IconSettingsAutomation,\n IconShieldCheck,\n IconStack3,\n IconUsersGroup,\n type IconProps,\n} from \"@tabler/icons-react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\n\nimport type { ConnectedAgent } from \"@/components/agents-panel\";\nimport { CreateAppPopover } from \"@/components/create-app-popover\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { WorkspaceAppCard } from \"@/components/workspace-app-card\";\nimport {\n listDispatchAutomations,\n setDispatchAutomationEnabled,\n type DispatchAutomationItem,\n type SetDispatchAutomationEnabledInput,\n} from \"@/lib/automations\";\nimport { submitOverviewPrompt } from \"@/lib/overview-chat\";\nimport { cn } from \"@/lib/utils\";\nimport type { WorkspaceAppSummary } from \"@/lib/workspace-apps\";\n\ninterface DispatchOverview {\n counts?: {\n destinations?: number;\n pendingApprovals?: number;\n linkedIdentities?: number;\n activeTokens?: number;\n };\n recentApprovals?: Array<{\n id: string;\n summary: string;\n status: string;\n requestedBy?: string;\n }>;\n recentAudit?: RecentAuditEvent[];\n settings?: {\n enabled?: boolean;\n };\n vault?: {\n secretCount?: number;\n activeGrantCount?: number;\n accessMode?: string;\n };\n}\n\ninterface RecentAuditEvent {\n id: string;\n summary: string;\n actor: string;\n action?: string;\n createdAt: string;\n}\n\ninterface TaskQueueRecentFailure {\n id: string;\n platform: string;\n error: string;\n attempts: number;\n}\n\ninterface TaskQueueStats {\n pending: number;\n processing: number;\n completed_last_hour: number;\n failed_last_hour: number;\n oldest_pending_age_seconds: number;\n recent_failures: TaskQueueRecentFailure[];\n}\n\ntype AutomationItem = DispatchAutomationItem;\n\nconst ZERO_TASK_QUEUE_STATS: TaskQueueStats = {\n pending: 0,\n processing: 0,\n completed_last_hour: 0,\n failed_last_hour: 0,\n oldest_pending_age_seconds: 0,\n recent_failures: [],\n};\n\nconst PROMPT_SUGGESTIONS = [\n \"Summarize the current workspace health\",\n \"Create an app for onboarding requests\",\n \"Check which agents can help with analytics\",\n];\n\nconst AUTOMATIONS_QUERY_KEY = [\n \"dispatch-control-plane\",\n \"automations\",\n] as const;\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat(undefined, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: value >= 10_000 ? 1 : 0,\n }).format(value);\n}\n\nfunction formatAgeSeconds(seconds: number): string {\n if (!seconds || seconds < 0) return \"0s\";\n if (seconds < 60) return `${Math.floor(seconds)}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;\n}\n\nfunction timeAgo(value: number | string | null | undefined): string {\n if (value == null || value === \"\") return \"never\";\n const timestamp =\n typeof value === \"number\" ? value : new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = Math.max(0, Date.now() - timestamp);\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h`;\n return `${Math.floor(diff / 86_400_000)}d`;\n}\n\nfunction relativeRunTime(value: string | null | undefined): string {\n if (!value) return \"never\";\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return \"never\";\n const diff = timestamp - Date.now();\n const abs = Math.abs(diff);\n const suffix = diff >= 0 ? \"from now\" : \"ago\";\n if (abs < 60_000) return diff >= 0 ? \"soon\" : \"now\";\n if (abs < 3_600_000) return `${Math.floor(abs / 60_000)}m ${suffix}`;\n if (abs < 86_400_000) return `${Math.floor(abs / 3_600_000)}h ${suffix}`;\n return `${Math.floor(abs / 86_400_000)}d ${suffix}`;\n}\n\nfunction dateTimeTitle(value: string | null | undefined): string | undefined {\n if (!value) return undefined;\n const timestamp = new Date(value).getTime();\n if (!Number.isFinite(timestamp)) return undefined;\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(timestamp);\n}\n\nfunction threadUpdatedAt(thread: ChatThreadSummary): number {\n return Number.isFinite(thread.updatedAt)\n ? thread.updatedAt\n : Number.isFinite(thread.createdAt)\n ? thread.createdAt\n : 0;\n}\n\nfunction threadTitle(thread: ChatThreadSummary): string {\n return thread.title || thread.preview || \"New chat\";\n}\n\nfunction automationTarget(item: AutomationItem): string {\n if (item.triggerType === \"event\" && item.event) return item.event;\n if (item.scheduleDescription) return item.scheduleDescription;\n if (item.schedule) return item.schedule;\n return item.triggerType || \"schedule\";\n}\n\nfunction automationLastRun(item: AutomationItem): string {\n return item.lastRun ? relativeRunTime(item.lastRun) : \"never\";\n}\n\nfunction automationNextRun(item: AutomationItem): string {\n if (!item.enabled) return \"paused\";\n if (item.triggerType === \"event\") return \"on event\";\n return item.nextRun ? relativeRunTime(item.nextRun) : \"not scheduled\";\n}\n\nfunction automationStatus(item: AutomationItem): {\n label: string;\n tone: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n} {\n if (!item.enabled) return { label: \"Paused\", tone: \"muted\" };\n if (item.lastStatus === \"error\") return { label: \"Error\", tone: \"danger\" };\n if (item.lastStatus === \"running\")\n return { label: \"Running\", tone: \"warning\" };\n if (item.lastStatus === \"skipped\")\n return { label: \"Skipped\", tone: \"warning\" };\n if (item.lastStatus === \"success\")\n return { label: \"Healthy\", tone: \"success\" };\n return { label: \"Ready\", tone: \"default\" };\n}\n\nfunction automationIdentity(\n item: Pick<AutomationItem, \"owner\" | \"path\">,\n): string {\n return `${item.owner}:${item.path}`;\n}\n\nfunction StatusDot({\n tone = \"default\",\n}: {\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n}) {\n return (\n <span\n className={cn(\n \"size-2 rounded-full\",\n tone === \"success\" && \"bg-emerald-500\",\n tone === \"warning\" && \"bg-amber-500\",\n tone === \"danger\" && \"bg-destructive\",\n tone === \"muted\" && \"bg-muted-foreground/35\",\n tone === \"default\" && \"bg-primary\",\n )}\n />\n );\n}\n\nfunction useAutomationsStatus() {\n const version = useChangeVersions([\"action\", \"screen-refresh\"]);\n return useQuery<AutomationItem[]>({\n queryKey: [...AUTOMATIONS_QUERY_KEY, version],\n queryFn: listDispatchAutomations,\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction useToggleAutomation() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: setDispatchAutomationEnabled,\n onMutate: async (input: SetDispatchAutomationEnabledInput) => {\n await queryClient.cancelQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n const snapshots = queryClient.getQueriesData<AutomationItem[]>({\n queryKey: AUTOMATIONS_QUERY_KEY,\n });\n\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(input)\n ? { ...item, enabled: input.enabled }\n : item,\n ),\n );\n\n return { snapshots };\n },\n onError: (err, _input, context) => {\n for (const [queryKey, data] of context?.snapshots ?? []) {\n queryClient.setQueryData(queryKey, data);\n }\n toast.error(\n `Could not update automation: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n },\n onSuccess: (updated) => {\n queryClient.setQueriesData<AutomationItem[]>(\n { queryKey: AUTOMATIONS_QUERY_KEY },\n (rows) =>\n rows?.map((item) =>\n automationIdentity(item) === automationIdentity(updated)\n ? updated\n : item,\n ),\n );\n },\n onSettled: () => {\n void queryClient.invalidateQueries({ queryKey: AUTOMATIONS_QUERY_KEY });\n },\n });\n}\n\nfunction useTaskQueueStats() {\n return useQuery<TaskQueueStats>({\n queryKey: [\"dispatch-control-plane\", \"task-queue\"],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/integrations/task-queue/status\"),\n );\n if (!res.ok) return ZERO_TASK_QUEUE_STATS;\n const stats = await res.json();\n if (!stats || typeof stats !== \"object\") return ZERO_TASK_QUEUE_STATS;\n return {\n pending: Number(stats.pending ?? 0),\n processing: Number(stats.processing ?? 0),\n completed_last_hour: Number(stats.completed_last_hour ?? 0),\n failed_last_hour: Number(stats.failed_last_hour ?? 0),\n oldest_pending_age_seconds: Number(\n stats.oldest_pending_age_seconds ?? 0,\n ),\n recent_failures: Array.isArray(stats.recent_failures)\n ? stats.recent_failures\n : [],\n };\n },\n placeholderData: (prev) => prev,\n refetchInterval: 15_000,\n staleTime: 5_000,\n });\n}\n\nfunction CommandPanel() {\n const { selectedModel } = useChatModels();\n const navigate = useNavigate();\n\n function send(message: string) {\n const trimmed = message.trim();\n if (!trimmed) return;\n\n if (isInBuilderFrame()) {\n submitOverviewPrompt(trimmed, selectedModel);\n return;\n }\n\n navigate(\"/chat\", {\n state: {\n dispatchPrompt: {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n message: trimmed,\n selectedModel,\n },\n },\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <IconBroadcast size={16} className=\"text-muted-foreground\" />\n <h2 className=\"text-sm font-semibold text-foreground\">\n Ask Dispatch\n </h2>\n </div>\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Open chat\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n </div>\n <PromptComposer\n placeholder=\"Route work, inspect status, or create an app...\"\n onSubmit={(text) => send(text)}\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {PROMPT_SUGGESTIONS.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n onClick={() => send(suggestion)}\n className=\"cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-muted-foreground transition hover:border-foreground/30 hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n </section>\n );\n}\n\nfunction MetricCard({\n label,\n value,\n detail,\n icon: Icon,\n to,\n tone = \"default\",\n}: {\n label: string;\n value: ReactNode;\n detail: string;\n icon: React.ComponentType<IconProps>;\n to?: string;\n tone?: \"default\" | \"success\" | \"warning\" | \"danger\";\n}) {\n const body = (\n <>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Icon size={15} />\n <span className=\"truncate\">{label}</span>\n </div>\n <StatusDot\n tone={\n tone === \"success\"\n ? \"success\"\n : tone === \"warning\"\n ? \"warning\"\n : tone === \"danger\"\n ? \"danger\"\n : \"default\"\n }\n />\n </div>\n <div className=\"mt-3 text-2xl font-semibold tracking-tight text-foreground\">\n {value}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {detail}\n </div>\n </>\n );\n\n const className = cn(\n \"block min-w-0 rounded-lg border bg-card p-4 transition\",\n to && \"hover:border-foreground/30 hover:bg-muted/20\",\n );\n\n if (to) {\n return (\n <Link to={to} className={className}>\n {body}\n </Link>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n\nfunction ControlPlaneMetrics({\n overview,\n apps,\n agents,\n automations,\n threads,\n taskQueue,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n threads: ChatThreadSummary[];\n taskQueue: TaskQueueStats;\n}) {\n const activeApps = apps.filter((app) => !app.isDispatch && !app.archived);\n const pendingApps = activeApps.filter((app) => app.status === \"pending\");\n const enabledAutomations = automations.filter((item) => item.enabled);\n const automationErrors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n );\n const pendingApprovals = overview?.counts?.pendingApprovals ?? 0;\n const activeRuns = taskQueue.processing;\n\n return (\n <section className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-6\">\n <MetricCard\n label=\"Chats\"\n value={formatNumber(threads.length)}\n detail={`${threads.filter((thread) => thread.messageCount > 0).length} with messages`}\n icon={IconMessages}\n to=\"/chat\"\n />\n <MetricCard\n label=\"Runs\"\n value={formatNumber(activeRuns)}\n detail={`${formatNumber(taskQueue.pending)} queued`}\n icon={IconPlayerPlay}\n tone={\n taskQueue.failed_last_hour > 0\n ? \"danger\"\n : taskQueue.pending > 5\n ? \"warning\"\n : \"default\"\n }\n />\n <MetricCard\n label=\"Apps\"\n value={formatNumber(activeApps.length)}\n detail={`${formatNumber(pendingApps.length)} building`}\n icon={IconStack3}\n to=\"/apps\"\n tone={pendingApps.length > 0 ? \"warning\" : \"default\"}\n />\n <MetricCard\n label=\"Agents\"\n value={formatNumber(agents.length)}\n detail={`${formatNumber(agents.filter((agent) => agent.source === \"custom\").length)} custom`}\n icon={IconRobot}\n to=\"/agents\"\n />\n <MetricCard\n label=\"Automations\"\n value={formatNumber(enabledAutomations.length)}\n detail={`${formatNumber(automationErrors.length)} need attention`}\n icon={IconSettingsAutomation}\n tone={automationErrors.length > 0 ? \"danger\" : \"success\"}\n />\n <MetricCard\n label=\"Approvals\"\n value={formatNumber(pendingApprovals)}\n detail={\n overview?.settings?.enabled ? \"review mode\" : \"immediate changes\"\n }\n icon={IconShieldCheck}\n to=\"/approvals\"\n tone={pendingApprovals > 0 ? \"warning\" : \"default\"}\n />\n </section>\n );\n}\n\nfunction SectionHeader({\n icon: Icon,\n title,\n detail,\n action,\n}: {\n icon: React.ComponentType<IconProps>;\n title: string;\n detail?: string;\n action?: ReactNode;\n}) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon size={16} className=\"shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">\n {title}\n </h2>\n {detail ? (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {detail}\n </p>\n ) : null}\n </div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n );\n}\n\nfunction RecentChatsPanel() {\n const navigate = useNavigate();\n const { threads, activeThreadId, createThread, switchThread } =\n useChatThreads(undefined, undefined, undefined, { autoCreate: false });\n const [creating, setCreating] = useState(false);\n\n const visibleThreads = useMemo(\n () =>\n threads\n .filter(\n (thread) => thread.messageCount > 0 || thread.id === activeThreadId,\n )\n .sort((a, b) => threadUpdatedAt(b) - threadUpdatedAt(a))\n .slice(0, 5),\n [activeThreadId, threads],\n );\n\n function openThread(threadId: string, isNew = false) {\n switchThread(threadId);\n navigate(\"/chat\", {\n state: {\n dispatchThread: {\n id: `${Date.now()}-${threadId}`,\n threadId,\n },\n },\n });\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId, newThread: isNew },\n }),\n );\n });\n }\n\n async function handleNewChat() {\n setCreating(true);\n try {\n const threadId = await createThread();\n if (threadId) openThread(threadId, true);\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconMessages}\n title=\"Chats\"\n detail={`${visibleThreads.length} recent`}\n action={\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleNewChat}\n disabled={creating}\n >\n <IconPlus size={14} />\n New\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {visibleThreads.length > 0 ? (\n visibleThreads.map((thread) => (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => openThread(thread.id)}\n className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5 text-left transition hover:bg-muted/40\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {threadTitle(thread)}\n </span>\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {thread.preview || `${thread.messageCount} messages`}\n </span>\n </span>\n <span className=\"text-[11px] text-muted-foreground\">\n {timeAgo(threadUpdatedAt(thread))}\n </span>\n </button>\n ))\n ) : (\n <button\n type=\"button\"\n onClick={handleNewChat}\n className=\"block w-full px-3 py-8 text-center text-sm text-muted-foreground transition hover:bg-muted/40\"\n >\n Start a Dispatch chat\n </button>\n )}\n </div>\n </section>\n );\n}\n\nfunction RunsPanel({ taskQueue }: { taskQueue: TaskQueueStats }) {\n const hasFailure = taskQueue.failed_last_hour > 0;\n const hasBacklog =\n taskQueue.pending > 5 || taskQueue.oldest_pending_age_seconds > 300;\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlayerPlay}\n title=\"Runs\"\n detail={\n hasFailure\n ? `${taskQueue.failed_last_hour} failed in the last hour`\n : `${taskQueue.processing} processing`\n }\n action={\n <RunsTray\n triggerVariant=\"pill\"\n hideWhenIdle={false}\n showRecent\n limit={8}\n />\n }\n />\n <div className=\"mt-3 grid grid-cols-4 gap-2\">\n <QueueCell label=\"Queued\" value={taskQueue.pending} />\n <QueueCell label=\"Active\" value={taskQueue.processing} />\n <QueueCell label=\"Done 1h\" value={taskQueue.completed_last_hour} />\n <QueueCell\n label=\"Failed 1h\"\n value={taskQueue.failed_last_hour}\n danger={hasFailure}\n />\n </div>\n <div\n className={cn(\n \"mt-3 rounded-md border px-3 py-2 text-xs\",\n hasFailure\n ? \"border-destructive/30 bg-destructive/5 text-destructive\"\n : hasBacklog\n ? \"border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n : \"bg-muted/20 text-muted-foreground\",\n )}\n >\n Oldest queued: {formatAgeSeconds(taskQueue.oldest_pending_age_seconds)}\n </div>\n {taskQueue.recent_failures.length > 0 ? (\n <div className=\"mt-3 divide-y rounded-md border\">\n {taskQueue.recent_failures.slice(0, 3).map((failure) => (\n <div key={failure.id} className=\"px-3 py-2\">\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <span className=\"font-medium text-foreground\">\n {failure.platform}\n </span>\n <span className=\"text-muted-foreground\">\n {failure.attempts} attempts\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {failure.error || \"(no error message)\"}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction QueueCell({\n label,\n value,\n danger,\n}: {\n label: string;\n value: number;\n danger?: boolean;\n}) {\n return (\n <div className=\"rounded-md border bg-background px-2 py-2\">\n <div\n className={cn(\n \"text-lg font-semibold text-foreground\",\n danger && \"text-destructive\",\n )}\n >\n {formatNumber(value)}\n </div>\n <div className=\"truncate text-[11px] text-muted-foreground\">{label}</div>\n </div>\n );\n}\n\nfunction AppsPanel({\n apps,\n isLoading,\n}: {\n apps: WorkspaceAppSummary[];\n isLoading: boolean;\n}) {\n const visibleApps = apps\n .filter((app) => !app.isDispatch && !app.archived)\n .slice(0, 4);\n const showSkeletons = isLoading && visibleApps.length === 0;\n\n return (\n <section className=\"space-y-3\">\n <SectionHeader\n icon={IconStack3}\n title=\"Projects and apps\"\n detail={`${apps.filter((app) => !app.isDispatch && !app.archived).length} active`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/apps\">\n View all\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n {showSkeletons ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"mt-3 h-3 w-24\" />\n <Skeleton className=\"mt-3 h-3 w-full\" />\n </div>\n ))}\n </div>\n ) : visibleApps.length > 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {visibleApps.map((app) => (\n <WorkspaceAppCard key={app.id} app={app} className=\"min-h-32\" />\n ))}\n </div>\n ) : (\n <CreateAppPopover />\n )}\n </section>\n );\n}\n\nfunction AutomationsPanel({\n automations,\n isLoading,\n}: {\n automations: AutomationItem[];\n isLoading: boolean;\n}) {\n const toggleAutomation = useToggleAutomation();\n const ordered = useMemo(\n () =>\n [...automations].sort((a, b) => {\n const aError = a.enabled && a.lastStatus === \"error\" ? 1 : 0;\n const bError = b.enabled && b.lastStatus === \"error\" ? 1 : 0;\n if (aError !== bError) return bError - aError;\n return (b.lastRun || \"\").localeCompare(a.lastRun || \"\");\n }),\n [automations],\n );\n const enabled = automations.filter((item) => item.enabled).length;\n const errors = automations.filter(\n (item) => item.enabled && item.lastStatus === \"error\",\n ).length;\n const pendingToggleIdentity = toggleAutomation.isPending\n ? toggleAutomation.variables\n ? automationIdentity(toggleAutomation.variables)\n : null\n : null;\n\n function handleToggle(item: AutomationItem, enabled: boolean) {\n toggleAutomation.mutate({\n owner: item.owner,\n path: item.path,\n enabled,\n });\n }\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconSettingsAutomation}\n title=\"Automations\"\n detail={`${enabled} enabled · ${errors} errors`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/chat\">\n Create\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 divide-y rounded-md border\">\n {isLoading && ordered.length === 0 ? (\n Array.from({ length: 4 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : ordered.length > 0 ? (\n ordered.slice(0, 6).map((item) => {\n const status = automationStatus(item);\n const canUpdate = item.canUpdate !== false;\n const isToggling =\n pendingToggleIdentity === automationIdentity(item);\n return (\n <div\n key={item.id}\n className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 px-3 py-2.5\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <StatusDot tone={status.tone} />\n <span className=\"truncate text-sm font-medium text-foreground\">\n {item.name}\n </span>\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {automationTarget(item)}\n </div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px] text-muted-foreground\">\n <span title={dateTimeTitle(item.lastRun)}>\n Last {automationLastRun(item)}\n </span>\n <span title={dateTimeTitle(item.nextRun)}>\n Next {automationNextRun(item)}\n </span>\n </div>\n {item.lastError ? (\n <div className=\"mt-1 truncate text-xs text-destructive\">\n {item.lastError}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col items-end gap-1\">\n <Badge\n variant={\n status.tone === \"danger\" ? \"destructive\" : \"outline\"\n }\n className=\"h-5\"\n >\n {status.label}\n </Badge>\n <Switch\n checked={!!item.enabled}\n disabled={!canUpdate || isToggling}\n aria-label={`${item.enabled ? \"Disable\" : \"Enable\"} automation ${item.name}`}\n onCheckedChange={(checked) => handleToggle(item, checked)}\n />\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No automations yet\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction AgentsPanelSummary({ agents }: { agents: ConnectedAgent[] }) {\n const builtin = agents.filter((agent) => agent.source === \"builtin\");\n const extra = agents.filter((agent) => agent.source !== \"builtin\");\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconPlugConnected}\n title=\"Agents\"\n detail={`${builtin.length} built in · ${extra.length} added`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/agents\">\n Manage\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {agents.slice(0, 12).map((agent) => (\n <span\n key={agent.id}\n className=\"inline-flex max-w-full items-center gap-2 rounded-md border bg-background px-2.5 py-1.5 text-xs text-muted-foreground\"\n >\n <span\n className=\"size-2 shrink-0 rounded-full\"\n style={{ backgroundColor: agent.color || \"hsl(var(--primary))\" }}\n />\n <span className=\"truncate\">{agent.name}</span>\n </span>\n ))}\n {agents.length === 0 ? (\n <div className=\"w-full rounded-md border border-dashed px-3 py-6 text-center text-sm text-muted-foreground\">\n No agents detected\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction ApprovalsAndAuditPanel({\n overview,\n isLoading,\n}: {\n overview?: DispatchOverview;\n isLoading: boolean;\n}) {\n const approvals = overview?.recentApprovals ?? [];\n const audit = overview?.recentAudit ?? [];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader\n icon={IconActivity}\n title=\"Activity\"\n detail={`${approvals.length} approvals · ${audit.length} audit rows`}\n action={\n <Button variant=\"outline\" size=\"sm\" asChild>\n <Link to=\"/audit\">\n Audit\n <IconArrowUpRight size={14} />\n </Link>\n </Button>\n }\n />\n <div className=\"mt-3 grid gap-3 lg:grid-cols-2\">\n <div className=\"rounded-md border\">\n <div className=\"flex items-center justify-between gap-3 border-b px-3 py-2\">\n <div className=\"text-xs font-medium uppercase text-muted-foreground\">\n Approvals\n </div>\n <Button variant=\"ghost\" size=\"sm\" asChild>\n <Link to=\"/approvals\">Open</Link>\n </Button>\n </div>\n <div className=\"divide-y\">\n {isLoading && approvals.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"mt-2 h-3 w-24\" />\n </div>\n ))\n ) : approvals.length > 0 ? (\n approvals.slice(0, 4).map((approval) => (\n <div key={approval.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {approval.summary}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <StatusDot\n tone={approval.status === \"pending\" ? \"warning\" : \"muted\"}\n />\n <span>{approval.status}</span>\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No approval requests\n </div>\n )}\n </div>\n </div>\n\n <div className=\"rounded-md border\">\n <div className=\"border-b px-3 py-2 text-xs font-medium uppercase text-muted-foreground\">\n Recent audit\n </div>\n <div className=\"divide-y\">\n {isLoading && audit.length === 0 ? (\n Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"px-3 py-2.5\">\n <Skeleton className=\"h-4 w-44\" />\n <Skeleton className=\"mt-2 h-3 w-28\" />\n </div>\n ))\n ) : audit.length > 0 ? (\n audit.slice(0, 4).map((event) => (\n <div key={event.id} className=\"px-3 py-2.5\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {event.summary}\n </div>\n <div className=\"mt-1 truncate text-xs text-muted-foreground\">\n {event.actor} · {timeAgo(event.createdAt)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n No audit entries\n </div>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nfunction ReadinessPanel({\n overview,\n apps,\n agents,\n automations,\n}: {\n overview?: DispatchOverview;\n apps: WorkspaceAppSummary[];\n agents: ConnectedAgent[];\n automations: AutomationItem[];\n}) {\n const rows = [\n {\n label: \"Vault\",\n detail:\n (overview?.vault?.secretCount ?? 0) > 0\n ? `${overview?.vault?.secretCount ?? 0} secrets`\n : \"no secrets\",\n ok: (overview?.vault?.secretCount ?? 0) > 0,\n to: \"/vault\",\n icon: IconShieldCheck,\n },\n {\n label: \"Apps\",\n detail: `${apps.filter((app) => !app.isDispatch && !app.archived).length} active`,\n ok: apps.some((app) => !app.isDispatch && !app.archived),\n to: \"/apps\",\n icon: IconRocket,\n },\n {\n label: \"Agents\",\n detail: `${agents.length} available`,\n ok: agents.length > 0,\n to: \"/agents\",\n icon: IconRobot,\n },\n {\n label: \"Automations\",\n detail: `${automations.filter((item) => item.enabled).length} enabled`,\n ok: automations.every(\n (item) => !item.enabled || item.lastStatus !== \"error\",\n ),\n to: \"/chat\",\n icon: IconBolt,\n },\n {\n label: \"Team\",\n detail: `${overview?.counts?.linkedIdentities ?? 0} linked identities`,\n ok: (overview?.counts?.linkedIdentities ?? 0) > 0,\n to: \"/settings#team\",\n icon: IconUsersGroup,\n },\n ];\n\n return (\n <section className=\"rounded-lg border bg-card p-4\">\n <SectionHeader icon={IconListCheck} title=\"Readiness\" />\n <div className=\"mt-3 divide-y rounded-md border\">\n {rows.map((row) => {\n const Icon = row.icon;\n return (\n <Link\n key={row.label}\n to={row.to}\n className=\"flex items-center gap-3 px-3 py-2.5 transition hover:bg-muted/40\"\n >\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-md border\",\n row.ok\n ? \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\"\n : \"bg-background text-muted-foreground\",\n )}\n >\n {row.ok ? <IconCheck size={14} /> : <Icon size={14} />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {row.label}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {row.detail}\n </span>\n </span>\n <IconArrowUpRight size={14} className=\"text-muted-foreground\" />\n </Link>\n );\n })}\n </div>\n </section>\n );\n}\n\nexport function DispatchControlPlane() {\n const { data: overviewData, isLoading: overviewLoading } =\n useActionQuery<DispatchOverview>(\"list-dispatch-overview\", {});\n const { data: connectedAgents = [] } = useActionQuery<ConnectedAgent[]>(\n \"list-connected-agents\",\n {},\n );\n const { data: workspaceApps = [], isLoading: appsLoading } = useActionQuery<\n WorkspaceAppSummary[]\n >(\n \"list-workspace-apps\",\n { includeAgentCards: false, includeArchived: true },\n { refetchInterval: 2_000 },\n );\n const { threads } = useChatThreads(undefined, undefined, undefined, {\n autoCreate: false,\n });\n const automationsQuery = useAutomationsStatus();\n const taskQueueQuery = useTaskQueueStats();\n\n const overview = overviewData;\n const apps = workspaceApps ?? [];\n const agents = connectedAgents ?? [];\n const automations = automationsQuery.data ?? [];\n const taskQueue = taskQueueQuery.data ?? ZERO_TASK_QUEUE_STATS;\n const visibleThreads = threads.filter((thread) => thread.messageCount > 0);\n\n useEffect(() => {\n const handleRunning = () => {\n void taskQueueQuery.refetch();\n };\n window.addEventListener(\"agentNative.chatRunning\", handleRunning);\n return () => {\n window.removeEventListener(\"agentNative.chatRunning\", handleRunning);\n };\n }, [taskQueueQuery]);\n\n return (\n <DispatchShell\n title=\"Control plane\"\n description=\"Dispatch is the workspace shell for chats, runs, apps, agents, automations, approvals, and resources.\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.08fr)_minmax(360px,0.92fr)]\">\n <CommandPanel />\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <MetricCard\n label=\"Vault\"\n value={formatNumber(overview?.vault?.secretCount ?? 0)}\n detail={`${formatNumber(overview?.vault?.activeGrantCount ?? 0)} active grants`}\n icon={IconShieldCheck}\n to=\"/vault\"\n tone={\n (overview?.vault?.secretCount ?? 0) > 0 ? \"success\" : \"default\"\n }\n />\n <MetricCard\n label=\"Resources\"\n value={formatNumber(overview?.counts?.destinations ?? 0)}\n detail=\"destinations\"\n icon={IconArrowUpRight}\n to=\"/destinations\"\n />\n </div>\n </div>\n\n <ControlPlaneMetrics\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n threads={visibleThreads}\n taskQueue={taskQueue}\n />\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.15fr)_minmax(340px,0.85fr)]\">\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <RecentChatsPanel />\n <RunsPanel taskQueue={taskQueue} />\n </div>\n <AppsPanel apps={apps} isLoading={appsLoading} />\n <ApprovalsAndAuditPanel\n overview={overview}\n isLoading={overviewLoading}\n />\n </div>\n\n <div className=\"space-y-4\">\n <AutomationsPanel\n automations={automations}\n isLoading={automationsQuery.isLoading}\n />\n <AgentsPanelSummary agents={agents} />\n <ReadinessPanel\n overview={overview}\n apps={apps}\n agents={agents}\n automations={automations}\n />\n {taskQueue.failed_last_hour > 0 ? (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"flex items-center gap-2 font-medium\">\n <IconAlertTriangle size={16} />\n Integration failures detected\n </div>\n <div className=\"mt-1 text-xs\">\n Check credentials, destinations, and recent queue errors.\n </div>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </DispatchShell>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,MAAM,CAAC,EACrB,YAAY,EACZ,eAAsB,GACvB,EAAE;IACD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,mDAsDA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,UAAU;IACf,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE,OAAO;IACjB,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,cAAc;IAC/B,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE,OAAO;IACjB,WAAW,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,UAAU;IACf,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE,OAAO;IACjB,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,cAAc;IAC/B,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE,OAAO;IACjB,WAAW,EAAE,UAAU;CACxB,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IAE5D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,YAAY,EACZ,eAAe,GAAG,IAAI,GAIvB;IACC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,SAAS,aAAa,CAAC,QAAgB;QACrC,QAAQ,CAAC,OAAO,EAAE;YAChB,KAAK,EAAE;gBACL,cAAc,EAAE;oBACd,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE;oBAC/B,QAAQ;iBACT;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,wBAAwB,EAAE;gBACxC,MAAM,EAAE,EAAE,QAAQ,EAAE;aACrB,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,kBAAQ,SAAS,EAAC,yFAAyF,aACxG,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,kCAAkC,EAC5C,OAAO,EAAE,YAAY,gBACV,iBAAiB,YAE5B,KAAC,iBAAiB,KAAG,GACd,CACV,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,wCAAwC,YACpD,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,+CAA+C,YAC1D,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAC7B,CACN,GACG,EACN,eAAK,SAAS,EAAC,kCAAkC,aAC9C,OAAO,EACR,KAAC,cAAc,IAAC,OAAO,EAAC,MAAM,GAAG,EACjC,KAAC,QAAQ,IAAC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,GAAI,EAClD,eAAe,CAAC,CAAC,CAAC,CACjB,KAAC,iBAAiB,IAAC,SAAS,EAAC,oCAAoC,GAAG,CACrE,CAAC,CAAC,CAAC,IAAI,IACJ,IACC,CACV,CAAC;AACJ,CAAC","sourcesContent":["import { AgentToggleButton, LanguagePicker } from \"@agent-native/core/client\";\nimport { RunsTray } from \"@agent-native/core/client/progress\";\nimport { IconLayoutSidebar } from \"@tabler/icons-react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { Button } from \"@/components/ui/button\";\n\nimport { useHeaderTitle, useHeaderActions } from \"./HeaderActions\";\n\nconst pageTitles: Record<string, string> = {\n \"/\": \"Overview\",\n \"/overview\": \"Overview\",\n \"/vault\": \"Vault\",\n \"/integrations\": \"Integrations\",\n \"/workspace\": \"Resources\",\n \"/messaging\": \"Messaging\",\n \"/agents\": \"Agents\",\n \"/destinations\": \"Destinations\",\n \"/identities\": \"Identities\",\n \"/approvals\": \"Approvals\",\n \"/audit\": \"Audit\",\n \"/settings\": \"Settings\",\n};\n\nfunction resolveTitle(pathname: string): string {\n if (pageTitles[pathname]) return pageTitles[pathname];\n\n if (pathname.startsWith(\"/extensions\")) return \"Extensions\";\n\n return \"Dispatch\";\n}\n\nexport function Header({\n onOpenMobile,\n showAgentToggle = true,\n}: {\n onOpenMobile?: () => void;\n showAgentToggle?: boolean;\n}) {\n const location = useLocation();\n const navigate = useNavigate();\n const title = useHeaderTitle();\n const actions = useHeaderActions();\n\n function openRunThread(threadId: string) {\n navigate(\"/chat\", {\n state: {\n dispatchThread: {\n id: `${Date.now()}-${threadId}`,\n threadId,\n },\n },\n });\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n });\n }\n\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-3 border-b border-border bg-background px-4 lg:px-6\">\n {onOpenMobile ? (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 lg:hidden cursor-pointer\"\n onClick={onOpenMobile}\n aria-label=\"Open navigation\"\n >\n <IconLayoutSidebar />\n </Button>\n ) : null}\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {title ?? (\n <h1 className=\"text-lg font-semibold tracking-tight truncate\">\n {resolveTitle(location.pathname)}\n </h1>\n )}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {actions}\n <LanguagePicker variant=\"icon\" />\n <RunsTray limit={8} onOpenThread={openRunThread} />\n {showAgentToggle ? (\n <AgentToggleButton className=\"h-8 w-8 rounded-md hover:bg-accent\" />\n ) : null}\n </div>\n </header>\n );\n}\n"]}
|
|
@@ -22,9 +22,12 @@ export interface DispatchExtensionConfig {
|
|
|
22
22
|
/** Extra React Query keys to invalidate when Dispatch receives DB sync events. */
|
|
23
23
|
queryKeys?: readonly string[];
|
|
24
24
|
}
|
|
25
|
-
export declare function NavContent({ onNavigate, extensions, }: {
|
|
25
|
+
export declare function NavContent({ onNavigate, extensions, collapsed, collapsible, onCollapsedChange, }: {
|
|
26
26
|
onNavigate?: () => void;
|
|
27
27
|
extensions?: DispatchExtensionConfig;
|
|
28
|
+
collapsed?: boolean;
|
|
29
|
+
collapsible?: boolean;
|
|
30
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
28
31
|
}): import("node_modules/@types/react").JSX.Element;
|
|
29
32
|
export declare function Layout({ children, extensions, }: {
|
|
30
33
|
children: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AAyCA,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA0Bf,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mFAAmF;IACnF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,kFAAkF;IAClF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AA2dD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,UAAU,EACV,SAAiB,EACjB,WAAmB,EACnB,iBAAiB,GAClB,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD,mDAwPA;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC,mDA2IA"}
|