@agent-native/dispatch 0.32.0 → 0.33.0-nightly-20260831223557
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/ask_app.js +0 -1
- package/dist/actions/ask_app.js.map +1 -1
- package/dist/actions/provider-api-register.d.ts +8 -8
- package/dist/components/automation-create-dialog.d.ts +16 -0
- package/dist/components/automation-create-dialog.d.ts.map +1 -0
- package/dist/components/automation-create-dialog.js +213 -0
- package/dist/components/automation-create-dialog.js.map +1 -0
- package/dist/components/automation-details-panel.d.ts.map +1 -1
- package/dist/components/automation-details-panel.js +35 -4
- package/dist/components/automation-details-panel.js.map +1 -1
- package/dist/hooks/use-navigation-state.d.ts +1 -0
- package/dist/hooks/use-navigation-state.d.ts.map +1 -1
- package/dist/hooks/use-navigation-state.js +5 -0
- package/dist/hooks/use-navigation-state.js.map +1 -1
- package/dist/lib/automation-display.d.ts.map +1 -1
- package/dist/lib/automation-display.js +4 -0
- package/dist/lib/automation-display.js.map +1 -1
- package/dist/lib/automations.d.ts +2 -1
- package/dist/lib/automations.d.ts.map +1 -1
- package/dist/lib/automations.js.map +1 -1
- package/dist/routes/pages/automations.d.ts.map +1 -1
- package/dist/routes/pages/automations.js +16 -24
- package/dist/routes/pages/automations.js.map +1 -1
- package/dist/server/lib/mcp-gateway.d.ts.map +1 -1
- package/dist/server/lib/mcp-gateway.js +27 -3
- package/dist/server/lib/mcp-gateway.js.map +1 -1
- package/package.json +3 -3
- package/src/actions/ask_app.ts +0 -1
- package/src/components/automation-create-dialog.tsx +759 -0
- package/src/components/automation-details-panel.tsx +80 -12
- package/src/hooks/use-navigation-state.spec.ts +13 -0
- package/src/hooks/use-navigation-state.ts +6 -0
- package/src/lib/automation-display.ts +2 -0
- package/src/lib/automations.ts +2 -1
- package/src/routes/pages/automations.spec.tsx +11 -0
- package/src/routes/pages/automations.tsx +27 -57
- package/src/server/lib/mcp-gateway.spec.ts +37 -2
- package/src/server/lib/mcp-gateway.ts +40 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-details-panel.js","sourceRoot":"","sources":["../../src/components/automation-details-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport {\n IconAlertTriangle,\n IconClock,\n IconExternalLink,\n IconPlayerPause,\n IconPlayerPlay,\n} from \"@tabler/icons-react\";\nimport { Link } from \"react-router\";\n\nimport {\n automationScopeLabel,\n automationStatus,\n automationTarget,\n} from \"../lib/automation-display\";\nimport {\n automationRunScope,\n type DispatchAutomationItem,\n} from \"../lib/automations\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\ninterface AutomationRun {\n id: string;\n runId: string | null;\n threadId: string | null;\n status: \"running\" | \"success\" | \"error\" | \"interrupted\";\n startedAt: number;\n finishedAt: number | null;\n error: string | null;\n}\n\nexport interface AutomationDetailsPanelProps {\n automation: DispatchAutomationItem;\n isToggling?: boolean;\n onToggle: () => void;\n}\n\nfunction formatTimestamp(value: number | string | null | undefined): string {\n if (value == null) return \"Not recorded\";\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? \"Unknown time\" : date.toLocaleString();\n}\n\nfunction formatDuration(run: AutomationRun): string | null {\n if (!run.finishedAt) return null;\n const seconds = Math.max(\n 0,\n Math.round((run.finishedAt - run.startedAt) / 1000),\n );\n return `${seconds}s`;\n}\n\nfunction runDebugPath(run: AutomationRun): string | null {\n const params = new URLSearchParams();\n if (run.runId) params.set(\"runId\", run.runId);\n else if (run.threadId) params.set(\"threadId\", run.threadId);\n else return null;\n return `/admin/thread-debug?${params.toString()}`;\n}\n\nfunction runStatusVariant(\n status: AutomationRun[\"status\"],\n): \"default\" | \"destructive\" | \"outline\" {\n if (status === \"error\") return \"destructive\";\n if (status === \"success\") return \"default\";\n return \"outline\";\n}\n\nfunction DetailField({\n label,\n value,\n mono = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n}) {\n return (\n <div className=\"min-w-0\">\n <dt className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">\n {label}\n </dt>\n <dd\n className={\n mono\n ? \"mt-1 break-words font-mono text-xs text-foreground\"\n : \"mt-1 break-words text-sm text-foreground\"\n }\n >\n {value}\n </dd>\n </div>\n );\n}\n\nfunction runAsLabel(value: DispatchAutomationItem[\"runAs\"]): string {\n if (value === \"creator\") return \"Creator identity\";\n if (value === \"shared\") return \"Shared identity\";\n return \"Default identity\";\n}\n\nexport function AutomationDetailsPanel({\n automation,\n isToggling = false,\n onToggle,\n}: AutomationDetailsPanelProps) {\n const runsQuery = useActionQuery<AutomationRun[]>(\n \"list-automation-runs\",\n {\n name: automation.name,\n scope: automationRunScope(automation),\n appId: automation.appId ?? \"dispatch\",\n },\n { staleTime: 5_000 },\n );\n const runs = runsQuery.data ?? [];\n const status = automationStatus(automation);\n const isScheduled = automation.triggerType !== \"event\";\n const prompt = automation.body?.trim();\n const hasExecutionTarget = Boolean(\n automation.executionHostId ||\n automation.executionEngine ||\n automation.executionCwd,\n );\n const hasDelivery = Boolean(\n automation.deliveryPlatform ||\n automation.deliveryDestination ||\n automation.deliveryThreadRef,\n );\n\n return (\n <aside className=\"flex min-h-[34rem] min-w-0 flex-col overflow-hidden rounded-lg border bg-card\">\n <header className=\"flex items-start justify-between gap-3 border-b p-5\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span\n className={\n status.tone === \"danger\"\n ? \"size-2 shrink-0 rounded-full bg-destructive\"\n : status.tone === \"default\"\n ? \"size-2 shrink-0 rounded-full bg-primary\"\n : \"size-2 shrink-0 rounded-full bg-muted-foreground/40\"\n }\n />\n <Badge\n variant={status.tone === \"danger\" ? \"destructive\" : \"outline\"}\n className=\"h-5\"\n >\n {status.label}\n </Badge>\n </div>\n <h2 className=\"mt-2 break-words text-base font-semibold text-foreground\">\n {automation.name}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {isScheduled ? \"Schedule\" : \"Event\"} ·{\" \"}\n {automationScopeLabel(automation)}\n </p>\n </div>\n </header>\n\n <div className=\"min-h-0 flex-1 space-y-5 overflow-y-auto p-5\">\n <section>\n <h3 className=\"text-sm font-semibold text-foreground\">Prompt</h3>\n {prompt ? (\n <pre className=\"mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/40 p-3 font-sans text-sm leading-6 text-foreground\">\n {prompt}\n </pre>\n ) : (\n <p className=\"mt-2 rounded-md border border-dashed p-3 text-sm text-muted-foreground\">\n No prompt recorded.\n </p>\n )}\n </section>\n\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Configuration\n </h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n <DetailField\n label=\"Trigger\"\n value={isScheduled ? \"Scheduled\" : \"Event-triggered\"}\n />\n <DetailField\n label={isScheduled ? \"Schedule\" : \"Event\"}\n value={automationTarget(automation)}\n />\n {isScheduled ? (\n <>\n {automation.schedule ? (\n <DetailField\n label=\"Cron expression\"\n value={automation.schedule}\n mono\n />\n ) : null}\n <DetailField\n label=\"Timezone\"\n value={automation.timezone || \"Account default\"}\n />\n </>\n ) : null}\n <DetailField\n label=\"Condition\"\n value={automation.condition || \"Always\"}\n />\n <DetailField\n label=\"Domain\"\n value={automation.domain || \"Default\"}\n />\n <DetailField\n label=\"Model\"\n value={automation.model || \"Default model\"}\n />\n <DetailField label=\"Mode\" value={automation.mode || \"Agentic\"} />\n <DetailField label=\"Runs as\" value={runAsLabel(automation.runAs)} />\n <DetailField\n label=\"Next run\"\n value={\n automation.enabled\n ? formatTimestamp(automation.nextRun)\n : \"Paused\"\n }\n />\n <DetailField\n label=\"Last run\"\n value={formatTimestamp(automation.lastRun)}\n />\n <DetailField\n label=\"Last checked\"\n value={formatTimestamp(automation.lastCheck)}\n />\n <DetailField\n label=\"Created by\"\n value={automation.createdBy || \"Unknown\"}\n />\n </dl>\n </section>\n\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Capabilities\n </h3>\n {automation.mcpTools && automation.mcpTools.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {automation.mcpTools.map((toolName) => (\n <code\n key={toolName}\n className=\"max-w-full break-all rounded bg-muted px-1.5 py-1 text-[11px] text-muted-foreground\"\n >\n {toolName}\n </code>\n ))}\n </div>\n ) : (\n <p className=\"mt-2 text-sm text-muted-foreground\">\n No explicit tool allowlist.\n </p>\n )}\n </section>\n\n {hasExecutionTarget ? (\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Execution target\n </h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n <DetailField\n label=\"Host\"\n value={automation.executionHostId || \"Server default\"}\n mono={Boolean(automation.executionHostId)}\n />\n <DetailField\n label=\"Engine\"\n value={automation.executionEngine || \"Default\"}\n />\n {automation.executionCwd ? (\n <DetailField\n label=\"Working directory\"\n value={automation.executionCwd}\n mono\n />\n ) : null}\n </dl>\n </section>\n ) : null}\n\n {hasDelivery ? (\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">Delivery</h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n {automation.deliveryPlatform ? (\n <DetailField\n label=\"Platform\"\n value={automation.deliveryPlatform}\n />\n ) : null}\n {automation.deliveryDestination ? (\n <DetailField\n label=\"Destination\"\n value={automation.deliveryDestination}\n />\n ) : null}\n {automation.deliveryThreadRef ? (\n <DetailField\n label=\"Thread reference\"\n value={automation.deliveryThreadRef}\n mono\n />\n ) : null}\n </dl>\n </section>\n ) : null}\n\n {automation.lastError ? (\n <section className=\"flex items-start gap-2 border-t border-destructive/30 pt-5\">\n <IconAlertTriangle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold text-destructive\">\n Latest scheduler result\n </h3>\n <p className=\"mt-1 break-words text-sm text-muted-foreground\">\n {automation.lastError}\n </p>\n </div>\n </section>\n ) : null}\n\n <section className=\"border-t pt-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">Past runs</h3>\n {runs.length > 0 ? (\n <Badge variant=\"outline\">{runs.length} shown</Badge>\n ) : null}\n </div>\n <div className=\"mt-3\">\n {runsQuery.isLoading ? (\n <div className=\"space-y-3 rounded-md border p-3\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n ))}\n </div>\n ) : runsQuery.isError ? (\n <ActionQueryError\n error={runsQuery.error}\n onRetry={() => void runsQuery.refetch()}\n />\n ) : runs.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-3 text-sm text-muted-foreground\">\n No execution recorded yet.\n </p>\n ) : (\n <ul className=\"divide-y rounded-md border\">\n {runs.map((run) => {\n const debugPath = runDebugPath(run);\n const duration = formatDuration(run);\n return (\n <li key={run.id} className=\"space-y-2 p-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <Badge variant={runStatusVariant(run.status)}>\n {run.status}\n </Badge>\n <span className=\"text-muted-foreground\">\n {formatTimestamp(run.startedAt)}\n </span>\n {duration ? (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <IconClock className=\"size-3.5\" />\n {duration}\n </span>\n ) : null}\n {debugPath ? (\n <Link\n to={debugPath}\n className=\"ml-auto inline-flex items-center gap-1 text-xs font-medium text-foreground underline-offset-4 hover:underline\"\n >\n <IconExternalLink className=\"size-3.5\" />\n Open debug\n </Link>\n ) : null}\n </div>\n {run.error ? (\n <p className=\"break-words text-sm text-destructive\">\n {run.error}\n </p>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </section>\n </div>\n\n <footer className=\"flex flex-wrap items-center gap-2 border-t p-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggle}\n disabled={automation.canUpdate === false || isToggling}\n >\n {automation.enabled ? <IconPlayerPause /> : <IconPlayerPlay />}\n {automation.enabled ? \"Pause\" : \"Resume\"}\n </Button>\n {automation.canUpdate === false ? (\n <span className=\"text-xs text-muted-foreground\">Read-only</span>\n ) : null}\n </footer>\n </aside>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"automation-details-panel.js","sourceRoot":"","sources":["../../src/components/automation-details-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { appPath } from \"@agent-native/core/client/api-path\";\nimport { writeClipboardText } from \"@agent-native/core/client/clipboard\";\nimport { useActionQuery } from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconCopy,\n IconClock,\n IconExternalLink,\n IconPlayerPause,\n IconPlayerPlay,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router\";\n\nimport {\n automationScopeLabel,\n automationStatus,\n automationTarget,\n} from \"../lib/automation-display\";\nimport {\n automationRunScope,\n type DispatchAutomationItem,\n} from \"../lib/automations\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\ninterface AutomationRun {\n id: string;\n runId: string | null;\n threadId: string | null;\n status: \"running\" | \"success\" | \"error\" | \"interrupted\";\n startedAt: number;\n finishedAt: number | null;\n error: string | null;\n}\n\nexport interface AutomationDetailsPanelProps {\n automation: DispatchAutomationItem;\n isToggling?: boolean;\n onToggle: () => void;\n}\n\nfunction formatTimestamp(value: number | string | null | undefined): string {\n if (value == null) return \"Not recorded\";\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? \"Unknown time\" : date.toLocaleString();\n}\n\nfunction formatDuration(run: AutomationRun): string | null {\n if (!run.finishedAt) return null;\n const seconds = Math.max(\n 0,\n Math.round((run.finishedAt - run.startedAt) / 1000),\n );\n return `${seconds}s`;\n}\n\nfunction runDebugPath(run: AutomationRun): string | null {\n const params = new URLSearchParams();\n if (run.runId) params.set(\"runId\", run.runId);\n else if (run.threadId) params.set(\"threadId\", run.threadId);\n else return null;\n return `/admin/thread-debug?${params.toString()}`;\n}\n\nfunction runStatusVariant(\n status: AutomationRun[\"status\"],\n): \"default\" | \"destructive\" | \"outline\" {\n if (status === \"error\") return \"destructive\";\n if (status === \"success\") return \"default\";\n return \"outline\";\n}\n\nfunction DetailField({\n label,\n value,\n mono = false,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n}) {\n return (\n <div className=\"min-w-0\">\n <dt className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">\n {label}\n </dt>\n <dd\n className={\n mono\n ? \"mt-1 break-words font-mono text-xs text-foreground\"\n : \"mt-1 break-words text-sm text-foreground\"\n }\n >\n {value}\n </dd>\n </div>\n );\n}\n\nfunction runAsLabel(value: DispatchAutomationItem[\"runAs\"]): string {\n if (value === \"creator\") return \"Creator identity\";\n if (value === \"shared\") return \"Shared identity\";\n return \"Default identity\";\n}\n\nexport function AutomationDetailsPanel({\n automation,\n isToggling = false,\n onToggle,\n}: AutomationDetailsPanelProps) {\n const t = useT();\n const runsQuery = useActionQuery<AutomationRun[]>(\n \"list-automation-runs\",\n {\n name: automation.name,\n scope: automationRunScope(automation),\n appId: automation.appId ?? \"dispatch\",\n },\n { staleTime: 5_000 },\n );\n const runs = runsQuery.data ?? [];\n const status = automationStatus(automation);\n const isScheduled = automation.triggerType === \"schedule\";\n const [copied, setCopied] = useState(false);\n const webhookUrl =\n automation.webhookPath && typeof window !== \"undefined\"\n ? window.location.origin + appPath(automation.webhookPath)\n : null;\n const triggerLabel =\n automation.triggerType === \"webhook\"\n ? t(\"jobs.webhook\", { defaultValue: \"Webhook\" })\n : isScheduled\n ? \"Schedule\"\n : \"Event\";\n const prompt = automation.body?.trim();\n const hasExecutionTarget = Boolean(\n automation.executionHostId ||\n automation.executionEngine ||\n automation.executionCwd,\n );\n const hasDelivery = Boolean(\n automation.deliveryPlatform ||\n automation.deliveryDestination ||\n automation.deliveryThreadRef,\n );\n\n return (\n <aside className=\"flex min-h-[34rem] min-w-0 flex-col overflow-hidden rounded-lg border bg-card\">\n <header className=\"flex items-start justify-between gap-3 border-b p-5\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span\n className={\n status.tone === \"danger\"\n ? \"size-2 shrink-0 rounded-full bg-destructive\"\n : status.tone === \"default\"\n ? \"size-2 shrink-0 rounded-full bg-primary\"\n : \"size-2 shrink-0 rounded-full bg-muted-foreground/40\"\n }\n />\n <Badge\n variant={status.tone === \"danger\" ? \"destructive\" : \"outline\"}\n className=\"h-5\"\n >\n {status.label}\n </Badge>\n </div>\n <h2 className=\"mt-2 break-words text-base font-semibold text-foreground\">\n {automation.name}\n </h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {triggerLabel} · {automationScopeLabel(automation)}\n </p>\n </div>\n </header>\n\n <div className=\"min-h-0 flex-1 space-y-5 overflow-y-auto p-5\">\n <section>\n <h3 className=\"text-sm font-semibold text-foreground\">Prompt</h3>\n {prompt ? (\n <pre className=\"mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-md bg-muted/40 p-3 font-sans text-sm leading-6 text-foreground\">\n {prompt}\n </pre>\n ) : (\n <p className=\"mt-2 rounded-md border border-dashed p-3 text-sm text-muted-foreground\">\n No prompt recorded.\n </p>\n )}\n </section>\n\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Configuration\n </h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n <DetailField\n label=\"Trigger\"\n value={\n automation.triggerType === \"webhook\"\n ? t(\"jobs.webhookTrigger\", {\n defaultValue: \"Webhook-triggered\",\n })\n : isScheduled\n ? \"Scheduled\"\n : \"Event-triggered\"\n }\n />\n <DetailField\n label={isScheduled ? \"Schedule\" : \"Event\"}\n value={automationTarget(automation)}\n />\n {isScheduled ? (\n <>\n {automation.schedule ? (\n <DetailField\n label=\"Cron expression\"\n value={automation.schedule}\n mono\n />\n ) : null}\n <DetailField\n label=\"Timezone\"\n value={automation.timezone || \"Account default\"}\n />\n </>\n ) : null}\n {webhookUrl ? (\n <div className=\"col-span-2 rounded-md border border-primary/20 bg-primary/5 p-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-foreground\">\n {t(\"jobs.webhookUrl\", { defaultValue: \"Webhook URL\" })}\n </span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1.5 text-xs\"\n onClick={() => {\n void writeClipboardText(webhookUrl).then((didCopy) => {\n setCopied(didCopy);\n if (didCopy) {\n window.setTimeout(() => setCopied(false), 1800);\n }\n });\n }}\n >\n {copied ? (\n <IconCheck className=\"size-3.5\" />\n ) : (\n <IconCopy className=\"size-3.5\" />\n )}\n {copied\n ? t(\"common.copied\", { defaultValue: \"Copied\" })\n : t(\"common.copy\", { defaultValue: \"Copy URL\" })}\n </Button>\n </div>\n <code className=\"mt-2 block break-all text-[11px] leading-5 text-muted-foreground\">\n {webhookUrl}\n </code>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {t(\"jobs.webhookUrlHint\", {\n defaultValue:\n \"Paste this URL into a service that sends HTTP POST webhooks.\",\n })}\n </p>\n </div>\n ) : null}\n <DetailField\n label=\"Condition\"\n value={automation.condition || \"Always\"}\n />\n <DetailField\n label=\"Domain\"\n value={automation.domain || \"Default\"}\n />\n <DetailField\n label=\"Model\"\n value={automation.model || \"Default model\"}\n />\n <DetailField label=\"Mode\" value={automation.mode || \"Agentic\"} />\n <DetailField label=\"Runs as\" value={runAsLabel(automation.runAs)} />\n {isScheduled ? (\n <DetailField\n label=\"Next run\"\n value={\n automation.enabled\n ? formatTimestamp(automation.nextRun)\n : \"Paused\"\n }\n />\n ) : null}\n <DetailField\n label=\"Last run\"\n value={formatTimestamp(automation.lastRun)}\n />\n <DetailField\n label=\"Last checked\"\n value={formatTimestamp(automation.lastCheck)}\n />\n <DetailField\n label=\"Created by\"\n value={automation.createdBy || \"Unknown\"}\n />\n </dl>\n </section>\n\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Capabilities\n </h3>\n {automation.mcpTools && automation.mcpTools.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {automation.mcpTools.map((toolName) => (\n <code\n key={toolName}\n className=\"max-w-full break-all rounded bg-muted px-1.5 py-1 text-[11px] text-muted-foreground\"\n >\n {toolName}\n </code>\n ))}\n </div>\n ) : (\n <p className=\"mt-2 text-sm text-muted-foreground\">\n No explicit tool allowlist.\n </p>\n )}\n </section>\n\n {hasExecutionTarget ? (\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Execution target\n </h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n <DetailField\n label=\"Host\"\n value={automation.executionHostId || \"Server default\"}\n mono={Boolean(automation.executionHostId)}\n />\n <DetailField\n label=\"Engine\"\n value={automation.executionEngine || \"Default\"}\n />\n {automation.executionCwd ? (\n <DetailField\n label=\"Working directory\"\n value={automation.executionCwd}\n mono\n />\n ) : null}\n </dl>\n </section>\n ) : null}\n\n {hasDelivery ? (\n <section className=\"border-t pt-5\">\n <h3 className=\"text-sm font-semibold text-foreground\">Delivery</h3>\n <dl className=\"mt-3 grid grid-cols-2 gap-x-4 gap-y-4\">\n {automation.deliveryPlatform ? (\n <DetailField\n label=\"Platform\"\n value={automation.deliveryPlatform}\n />\n ) : null}\n {automation.deliveryDestination ? (\n <DetailField\n label=\"Destination\"\n value={automation.deliveryDestination}\n />\n ) : null}\n {automation.deliveryThreadRef ? (\n <DetailField\n label=\"Thread reference\"\n value={automation.deliveryThreadRef}\n mono\n />\n ) : null}\n </dl>\n </section>\n ) : null}\n\n {automation.lastError ? (\n <section className=\"flex items-start gap-2 border-t border-destructive/30 pt-5\">\n <IconAlertTriangle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold text-destructive\">\n Latest scheduler result\n </h3>\n <p className=\"mt-1 break-words text-sm text-muted-foreground\">\n {automation.lastError}\n </p>\n </div>\n </section>\n ) : null}\n\n <section className=\"border-t pt-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-foreground\">Past runs</h3>\n {runs.length > 0 ? (\n <Badge variant=\"outline\">{runs.length} shown</Badge>\n ) : null}\n </div>\n <div className=\"mt-3\">\n {runsQuery.isLoading ? (\n <div className=\"space-y-3 rounded-md border p-3\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n ))}\n </div>\n ) : runsQuery.isError ? (\n <ActionQueryError\n error={runsQuery.error}\n onRetry={() => void runsQuery.refetch()}\n />\n ) : runs.length === 0 ? (\n <p className=\"rounded-md border border-dashed p-3 text-sm text-muted-foreground\">\n No execution recorded yet.\n </p>\n ) : (\n <ul className=\"divide-y rounded-md border\">\n {runs.map((run) => {\n const debugPath = runDebugPath(run);\n const duration = formatDuration(run);\n return (\n <li key={run.id} className=\"space-y-2 p-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <Badge variant={runStatusVariant(run.status)}>\n {run.status}\n </Badge>\n <span className=\"text-muted-foreground\">\n {formatTimestamp(run.startedAt)}\n </span>\n {duration ? (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <IconClock className=\"size-3.5\" />\n {duration}\n </span>\n ) : null}\n {debugPath ? (\n <Link\n to={debugPath}\n className=\"ml-auto inline-flex items-center gap-1 text-xs font-medium text-foreground underline-offset-4 hover:underline\"\n >\n <IconExternalLink className=\"size-3.5\" />\n Open debug\n </Link>\n ) : null}\n </div>\n {run.error ? (\n <p className=\"break-words text-sm text-destructive\">\n {run.error}\n </p>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </section>\n </div>\n\n <footer className=\"flex flex-wrap items-center gap-2 border-t p-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggle}\n disabled={automation.canUpdate === false || isToggling}\n >\n {automation.enabled ? <IconPlayerPause /> : <IconPlayerPlay />}\n {automation.enabled ? \"Pause\" : \"Resume\"}\n </Button>\n {automation.canUpdate === false ? (\n <span className=\"text-xs text-muted-foreground\">Read-only</span>\n ) : null}\n </footer>\n </aside>\n );\n}\n"]}
|
|
@@ -20,6 +20,7 @@ export interface NavigationState {
|
|
|
20
20
|
usageScope?: "me" | "workspace" | "app";
|
|
21
21
|
usageUserEmail?: string;
|
|
22
22
|
usageAppId?: string;
|
|
23
|
+
automationId?: string;
|
|
23
24
|
}
|
|
24
25
|
export declare function useNavigationState(extensions?: DispatchExtensionConfig): void;
|
|
25
26
|
export declare function buildDispatchNavigationState(pathname: string, search?: string, extensions?: DispatchExtensionConfig): NavigationState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-navigation-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-navigation-state.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,wBAAwB,CAAC;AAMhC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"use-navigation-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-navigation-state.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,wBAAwB,CAAC;AAMhC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,uBAAuB,QAoEtE;AAqBD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAK,EACX,UAAU,CAAC,EAAE,uBAAuB,GACnC,eAAe,CAmFjB"}
|
|
@@ -165,6 +165,11 @@ export function buildDispatchNavigationState(pathname, search = "", extensions)
|
|
|
165
165
|
if (usageUserEmail)
|
|
166
166
|
state.usageUserEmail = usageUserEmail;
|
|
167
167
|
}
|
|
168
|
+
if (state.view === "automations") {
|
|
169
|
+
const automationId = new URLSearchParams(search).get("automationId");
|
|
170
|
+
if (automationId)
|
|
171
|
+
state.automationId = automationId;
|
|
172
|
+
}
|
|
168
173
|
return state;
|
|
169
174
|
}
|
|
170
175
|
function routerPath(path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-navigation-state.js","sourceRoot":"","sources":["../../src/hooks/use-navigation-state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isAgentChatHomeHandoffActive,\n markAgentChatHomeHandoff,\n} from \"@agent-native/core/client/agent-chat\";\nimport {\n agentNativePath,\n appBasePath,\n appPath,\n} from \"@agent-native/core/client/api-path\";\nimport { extensionIdFromPathname } from \"@agent-native/core/client/extensions\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport type {\n DispatchExtensionConfig,\n DispatchNavItem,\n} from \"../components/index.js\";\nimport {\n workspaceAppIdFromRoute,\n workspaceAppRoute,\n} from \"../lib/workspace-apps.js\";\n\nexport interface NavigationState {\n view: string;\n path?: string;\n workspaceAppId?: string;\n workspaceAppPath?: string;\n extensionId?: string;\n extensionSlug?: string;\n dreamId?: string;\n threadDebugMode?: string;\n sourceId?: string;\n inspectSourceId?: string;\n ownerEmail?: string;\n failureStatus?: string;\n range?: string;\n query?: string;\n runId?: string;\n threadId?: string;\n agentPath?: string;\n usageScope?: \"me\" | \"workspace\" | \"app\";\n usageUserEmail?: string;\n usageAppId?: string;\n}\n\nexport function useNavigationState(extensions?: DispatchExtensionConfig) {\n const location = useLocation();\n const navigate = useNavigate();\n const qc = useQueryClient();\n\n // Sync current route to application state\n useEffect(() => {\n const localPathname = routerPath(location.pathname);\n const state = buildDispatchNavigationState(\n localPathname,\n location.search,\n extensions,\n );\n\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(state),\n }).catch(() => {});\n }, [extensions, location.pathname, location.search]);\n\n // Listen for navigate commands from agent\n const { data: navCommand } = useQuery({\n queryKey: [\"navigate-command\"],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/navigate\"),\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data) {\n // Return with a timestamp to ensure uniqueness\n return { ...data, _ts: Date.now() };\n }\n return null;\n },\n structuralSharing: false,\n });\n\n useEffect(() => {\n if (!navCommand) return;\n // Delete the one-shot command AFTER reading it\n fetch(agentNativePath(\"/_agent-native/application-state/navigate\"), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n const cmd = navCommand as NavigationState;\n\n // Navigate to a specific path or resolve view name to path\n const resolvedPath =\n cmd.path || resolvePath(cmd.view, extensions, cmd) || \"/overview\";\n const path =\n cmd.view === \"dreams\" && cmd.dreamId && !resolvedPath.includes(\"?\")\n ? `${resolvedPath}?dreamId=${encodeURIComponent(cmd.dreamId)}`\n : resolvedPath;\n const nextPath = routerPath(path);\n if (\n isChatPath(routerPath(location.pathname)) &&\n !isChatPath(pathnameFromPath(nextPath))\n ) {\n if (isAgentChatHomeHandoffActive(\"dispatch\")) {\n markAgentChatHomeHandoff(\"dispatch\");\n }\n }\n void navigate(nextPath);\n qc.setQueryData([\"navigate-command\"], null);\n }, [extensions, location.pathname, navCommand, navigate, qc]);\n}\n\nfunction pathnameFromPath(path: string): string {\n return path.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction isChatPath(pathname: string): boolean {\n return pathname === \"/chat\" || pathname.startsWith(\"/chat/\");\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function buildDispatchNavigationState(\n pathname: string,\n search = \"\",\n extensions?: DispatchExtensionConfig,\n): NavigationState {\n const state: NavigationState = {\n view: resolveView(pathname, extensions),\n path: appPath(pathname),\n };\n\n const threadId = threadIdFromPath(pathname);\n if (threadId) state.threadId = threadId;\n\n if (state.view === \"chat\") {\n const agentPath = new URLSearchParams(search).get(\"agent\")?.trim();\n if (agentPath) state.agentPath = agentPath;\n }\n\n const extensionId = extensionIdFromPathname(pathname);\n if (extensionId) {\n state.view = \"extensions\";\n state.extensionId = extensionId;\n const slug = extensionSlugFromPathname(pathname);\n if (slug) state.extensionSlug = slug;\n return state;\n }\n\n if (state.view === \"workspace-app\") {\n const workspaceAppId = workspaceAppIdFromRoute(pathname);\n if (workspaceAppId) {\n state.workspaceAppId = workspaceAppId;\n state.workspaceAppPath = pathname.replace(/^\\/apps\\/[^/]+/, \"\") || \"/\";\n }\n }\n\n if (state.view === \"dreams\") {\n const params = new URLSearchParams(search);\n const dreamId = params.get(\"dreamId\");\n const sourceId = params.get(\"sourceId\");\n const query = params.get(\"query\");\n if (dreamId) state.dreamId = dreamId;\n if (sourceId) state.sourceId = sourceId;\n if (query) state.query = query;\n }\n\n if (state.view === \"thread-debug\") {\n const params = new URLSearchParams(search);\n const mode = params.get(\"mode\");\n const sourceId = params.get(\"source\");\n const inspectSourceId = params.get(\"inspectSource\");\n const ownerEmail = params.get(\"owner\");\n const status = params.get(\"status\");\n const range = params.get(\"range\");\n const query = params.get(\"query\");\n const runId = params.get(\"runId\");\n const selectedThreadId = params.get(\"threadId\");\n if (mode) state.threadDebugMode = mode;\n if (sourceId) state.sourceId = sourceId;\n if (inspectSourceId) state.inspectSourceId = inspectSourceId;\n if (ownerEmail) state.ownerEmail = ownerEmail;\n if (status) state.failureStatus = status;\n if (range) state.range = range;\n if (query) state.query = query;\n if (runId) state.runId = runId;\n if (selectedThreadId) state.threadId = selectedThreadId;\n }\n\n if (state.view === \"metrics\") {\n const params = new URLSearchParams(search);\n const usageScope = params.get(\"scope\");\n const usageUserEmail = params.get(\"user\");\n const usageAppId = params.get(\"app\");\n if (usageAppId) {\n state.usageScope = \"app\";\n state.usageAppId = usageAppId;\n } else if (usageScope === \"me\" || usageScope === \"workspace\") {\n state.usageScope = usageScope;\n }\n if (usageUserEmail) state.usageUserEmail = usageUserEmail;\n }\n\n return state;\n}\n\nfunction routerPath(path: string): string {\n const basePath = appBasePath();\n if (!basePath) return path;\n let result = path;\n // Iteratively strip basename. A path that arrives doubly-prefixed\n // (e.g. \"/dispatch/dispatch/overview\", possibly from a stale link or a\n // prior bug) would otherwise get partially stripped here and then\n // re-prefixed by react-router's basename, restoring the bad URL.\n for (let i = 0; i < 4; i += 1) {\n if (result === basePath) return \"/\";\n if (!result.startsWith(`${basePath}/`)) break;\n result = result.slice(basePath.length) || \"/\";\n }\n return result;\n}\n\nfunction extensionItemMatchesPath(\n item: DispatchNavItem,\n pathname: string,\n): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction resolveExtensionView(\n pathname: string,\n extensions?: DispatchExtensionConfig,\n): string | undefined {\n return extensions?.navItems?.find((item) =>\n extensionItemMatchesPath(item, pathname),\n )?.id;\n}\n\nfunction resolveExtensionPath(\n view: string | undefined,\n extensions?: DispatchExtensionConfig,\n): string | undefined {\n if (!view) return undefined;\n const item = extensions?.navItems?.find((candidate) => candidate.id === view);\n return item?.adminTo ?? item?.to;\n}\n\nfunction resolveView(\n pathname: string,\n extensions?: DispatchExtensionConfig,\n): string {\n const extensionView = resolveExtensionView(pathname, extensions);\n if (extensionView) return extensionView;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\")) {\n return \"extensions\";\n }\n if (pathname === \"/admin\") return \"admin\";\n if (pathname === \"/admin/agents\" || pathname.startsWith(\"/admin/agents/\")) {\n return \"connected-agents\";\n }\n if (pathname.startsWith(\"/admin/\")) {\n const adminView = resolveView(pathname.slice(\"/admin\".length), extensions);\n return adminView === \"overview\" ? \"admin\" : adminView;\n }\n if (pathname.startsWith(\"/browser-chat\")) return \"browser-chat\";\n if (pathname.startsWith(\"/chat\")) return \"chat\";\n // A route below /apps/ always embeds one app, so it must not collapse to the\n // apps list. An id that fails to decode still resolves here without a\n // `workspaceAppId`, which view-screen reports as an unknown app.\n if (pathname.startsWith(\"/apps/\") && pathname !== \"/apps/\") {\n return \"workspace-app\";\n }\n if (pathname.startsWith(\"/apps\")) return \"apps\";\n if (pathname.startsWith(\"/operations\")) return \"operations\";\n if (pathname.startsWith(\"/metrics\")) return \"metrics\";\n if (pathname.startsWith(\"/new-app\")) return \"new-app\";\n if (pathname.startsWith(\"/vault\")) return \"vault\";\n if (pathname.startsWith(\"/integrations\")) return \"integrations\";\n if (pathname.startsWith(\"/workspace\")) return \"workspace\";\n if (pathname.startsWith(\"/agents\")) return \"agents\";\n if (pathname.startsWith(\"/messaging\")) return \"messaging\";\n if (pathname.startsWith(\"/destinations\")) return \"destinations\";\n if (pathname.startsWith(\"/identities\")) return \"identities\";\n if (pathname.startsWith(\"/approvals\")) return \"approvals\";\n if (pathname.startsWith(\"/automations\")) return \"automations\";\n if (pathname.startsWith(\"/transactional-email\")) {\n return \"transactional-email\";\n }\n if (pathname.startsWith(\"/audit\")) return \"audit\";\n if (pathname.startsWith(\"/dreams\")) return \"dreams\";\n if (pathname.startsWith(\"/thread-debug\")) return \"thread-debug\";\n if (pathname.startsWith(\"/team\")) return \"settings\";\n return \"overview\";\n}\n\nfunction resolvePath(\n view?: string,\n extensions?: DispatchExtensionConfig,\n command?: Pick<\n NavigationState,\n \"extensionId\" | \"threadId\" | \"workspaceAppId\"\n >,\n): string | undefined {\n switch (view) {\n case \"admin\":\n return \"/admin\";\n case \"chat\":\n case \"ask\":\n return command?.threadId && command.threadId.trim()\n ? `/chat/${encodeURIComponent(command.threadId.trim())}`\n : \"/chat\";\n case \"overview\":\n return \"/overview\";\n case \"apps\":\n return \"/apps\";\n case \"workspace-app\":\n return command?.workspaceAppId\n ? workspaceAppRoute(command.workspaceAppId)\n : \"/apps\";\n case \"operations\":\n case \"monitoring\":\n case \"observability\":\n case \"database\":\n return view === \"database\"\n ? \"/admin/operations?view=database\"\n : \"/admin/operations\";\n case \"metrics\":\n case \"usage\":\n return \"/admin/metrics\";\n case \"new-app\":\n case \"create-app\":\n return \"/admin/new-app\";\n case \"vault\":\n case \"secrets\":\n return \"/admin/vault\";\n case \"integrations\":\n return \"/admin/integrations\";\n case \"workspace\":\n case \"resources\":\n return \"/admin/workspace\";\n case \"agents\":\n return \"/agents\";\n case \"connected-agents\":\n return \"/admin/agents\";\n case \"messaging\":\n return \"/admin/messaging\";\n case \"destinations\":\n case \"routes\":\n return \"/admin/destinations\";\n case \"identities\":\n return \"/admin/identities\";\n case \"approvals\":\n return \"/admin/approvals\";\n case \"automations\":\n case \"jobs\":\n return \"/admin/automations\";\n case \"transactional-email\":\n return \"/admin/transactional-email\";\n case \"audit\":\n return \"/admin/audit\";\n case \"dreams\":\n return \"/admin/dreams\";\n case \"thread-debug\":\n case \"threads\":\n return \"/admin/thread-debug\";\n case \"team\":\n return \"/settings/organization\";\n case \"extensions\":\n return command?.extensionId\n ? `/extensions/${encodeURIComponent(command.extensionId)}`\n : \"/extensions\";\n default:\n return resolveExtensionPath(view, extensions);\n }\n}\n\nfunction extensionSlugFromPathname(pathname: string): string | undefined {\n const match = pathname.match(/^\\/extensions\\/[^/]+\\/([^/?#]+)/);\n if (!match?.[1]) return undefined;\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-navigation-state.js","sourceRoot":"","sources":["../../src/hooks/use-navigation-state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isAgentChatHomeHandoffActive,\n markAgentChatHomeHandoff,\n} from \"@agent-native/core/client/agent-chat\";\nimport {\n agentNativePath,\n appBasePath,\n appPath,\n} from \"@agent-native/core/client/api-path\";\nimport { extensionIdFromPathname } from \"@agent-native/core/client/extensions\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport type {\n DispatchExtensionConfig,\n DispatchNavItem,\n} from \"../components/index.js\";\nimport {\n workspaceAppIdFromRoute,\n workspaceAppRoute,\n} from \"../lib/workspace-apps.js\";\n\nexport interface NavigationState {\n view: string;\n path?: string;\n workspaceAppId?: string;\n workspaceAppPath?: string;\n extensionId?: string;\n extensionSlug?: string;\n dreamId?: string;\n threadDebugMode?: string;\n sourceId?: string;\n inspectSourceId?: string;\n ownerEmail?: string;\n failureStatus?: string;\n range?: string;\n query?: string;\n runId?: string;\n threadId?: string;\n agentPath?: string;\n usageScope?: \"me\" | \"workspace\" | \"app\";\n usageUserEmail?: string;\n usageAppId?: string;\n automationId?: string;\n}\n\nexport function useNavigationState(extensions?: DispatchExtensionConfig) {\n const location = useLocation();\n const navigate = useNavigate();\n const qc = useQueryClient();\n\n // Sync current route to application state\n useEffect(() => {\n const localPathname = routerPath(location.pathname);\n const state = buildDispatchNavigationState(\n localPathname,\n location.search,\n extensions,\n );\n\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(state),\n }).catch(() => {});\n }, [extensions, location.pathname, location.search]);\n\n // Listen for navigate commands from agent\n const { data: navCommand } = useQuery({\n queryKey: [\"navigate-command\"],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/navigate\"),\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data) {\n // Return with a timestamp to ensure uniqueness\n return { ...data, _ts: Date.now() };\n }\n return null;\n },\n structuralSharing: false,\n });\n\n useEffect(() => {\n if (!navCommand) return;\n // Delete the one-shot command AFTER reading it\n fetch(agentNativePath(\"/_agent-native/application-state/navigate\"), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n const cmd = navCommand as NavigationState;\n\n // Navigate to a specific path or resolve view name to path\n const resolvedPath =\n cmd.path || resolvePath(cmd.view, extensions, cmd) || \"/overview\";\n const path =\n cmd.view === \"dreams\" && cmd.dreamId && !resolvedPath.includes(\"?\")\n ? `${resolvedPath}?dreamId=${encodeURIComponent(cmd.dreamId)}`\n : resolvedPath;\n const nextPath = routerPath(path);\n if (\n isChatPath(routerPath(location.pathname)) &&\n !isChatPath(pathnameFromPath(nextPath))\n ) {\n if (isAgentChatHomeHandoffActive(\"dispatch\")) {\n markAgentChatHomeHandoff(\"dispatch\");\n }\n }\n void navigate(nextPath);\n qc.setQueryData([\"navigate-command\"], null);\n }, [extensions, location.pathname, navCommand, navigate, qc]);\n}\n\nfunction pathnameFromPath(path: string): string {\n return path.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction isChatPath(pathname: string): boolean {\n return pathname === \"/chat\" || pathname.startsWith(\"/chat/\");\n}\n\nfunction threadIdFromPath(pathname: string): string | null {\n const match = pathname.match(/^\\/chat\\/([^/]+)/);\n if (!match) return null;\n try {\n const value = decodeURIComponent(match[1]).trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nexport function buildDispatchNavigationState(\n pathname: string,\n search = \"\",\n extensions?: DispatchExtensionConfig,\n): NavigationState {\n const state: NavigationState = {\n view: resolveView(pathname, extensions),\n path: appPath(pathname),\n };\n\n const threadId = threadIdFromPath(pathname);\n if (threadId) state.threadId = threadId;\n\n if (state.view === \"chat\") {\n const agentPath = new URLSearchParams(search).get(\"agent\")?.trim();\n if (agentPath) state.agentPath = agentPath;\n }\n\n const extensionId = extensionIdFromPathname(pathname);\n if (extensionId) {\n state.view = \"extensions\";\n state.extensionId = extensionId;\n const slug = extensionSlugFromPathname(pathname);\n if (slug) state.extensionSlug = slug;\n return state;\n }\n\n if (state.view === \"workspace-app\") {\n const workspaceAppId = workspaceAppIdFromRoute(pathname);\n if (workspaceAppId) {\n state.workspaceAppId = workspaceAppId;\n state.workspaceAppPath = pathname.replace(/^\\/apps\\/[^/]+/, \"\") || \"/\";\n }\n }\n\n if (state.view === \"dreams\") {\n const params = new URLSearchParams(search);\n const dreamId = params.get(\"dreamId\");\n const sourceId = params.get(\"sourceId\");\n const query = params.get(\"query\");\n if (dreamId) state.dreamId = dreamId;\n if (sourceId) state.sourceId = sourceId;\n if (query) state.query = query;\n }\n\n if (state.view === \"thread-debug\") {\n const params = new URLSearchParams(search);\n const mode = params.get(\"mode\");\n const sourceId = params.get(\"source\");\n const inspectSourceId = params.get(\"inspectSource\");\n const ownerEmail = params.get(\"owner\");\n const status = params.get(\"status\");\n const range = params.get(\"range\");\n const query = params.get(\"query\");\n const runId = params.get(\"runId\");\n const selectedThreadId = params.get(\"threadId\");\n if (mode) state.threadDebugMode = mode;\n if (sourceId) state.sourceId = sourceId;\n if (inspectSourceId) state.inspectSourceId = inspectSourceId;\n if (ownerEmail) state.ownerEmail = ownerEmail;\n if (status) state.failureStatus = status;\n if (range) state.range = range;\n if (query) state.query = query;\n if (runId) state.runId = runId;\n if (selectedThreadId) state.threadId = selectedThreadId;\n }\n\n if (state.view === \"metrics\") {\n const params = new URLSearchParams(search);\n const usageScope = params.get(\"scope\");\n const usageUserEmail = params.get(\"user\");\n const usageAppId = params.get(\"app\");\n if (usageAppId) {\n state.usageScope = \"app\";\n state.usageAppId = usageAppId;\n } else if (usageScope === \"me\" || usageScope === \"workspace\") {\n state.usageScope = usageScope;\n }\n if (usageUserEmail) state.usageUserEmail = usageUserEmail;\n }\n\n if (state.view === \"automations\") {\n const automationId = new URLSearchParams(search).get(\"automationId\");\n if (automationId) state.automationId = automationId;\n }\n\n return state;\n}\n\nfunction routerPath(path: string): string {\n const basePath = appBasePath();\n if (!basePath) return path;\n let result = path;\n // Iteratively strip basename. A path that arrives doubly-prefixed\n // (e.g. \"/dispatch/dispatch/overview\", possibly from a stale link or a\n // prior bug) would otherwise get partially stripped here and then\n // re-prefixed by react-router's basename, restoring the bad URL.\n for (let i = 0; i < 4; i += 1) {\n if (result === basePath) return \"/\";\n if (!result.startsWith(`${basePath}/`)) break;\n result = result.slice(basePath.length) || \"/\";\n }\n return result;\n}\n\nfunction extensionItemMatchesPath(\n item: DispatchNavItem,\n pathname: string,\n): boolean {\n if (item.match) {\n try {\n if (item.match(pathname)) return true;\n } catch {\n return false;\n }\n }\n return pathname === item.to || pathname.startsWith(`${item.to}/`);\n}\n\nfunction resolveExtensionView(\n pathname: string,\n extensions?: DispatchExtensionConfig,\n): string | undefined {\n return extensions?.navItems?.find((item) =>\n extensionItemMatchesPath(item, pathname),\n )?.id;\n}\n\nfunction resolveExtensionPath(\n view: string | undefined,\n extensions?: DispatchExtensionConfig,\n): string | undefined {\n if (!view) return undefined;\n const item = extensions?.navItems?.find((candidate) => candidate.id === view);\n return item?.adminTo ?? item?.to;\n}\n\nfunction resolveView(\n pathname: string,\n extensions?: DispatchExtensionConfig,\n): string {\n const extensionView = resolveExtensionView(pathname, extensions);\n if (extensionView) return extensionView;\n if (pathname === \"/extensions\" || pathname.startsWith(\"/extensions/\")) {\n return \"extensions\";\n }\n if (pathname === \"/admin\") return \"admin\";\n if (pathname === \"/admin/agents\" || pathname.startsWith(\"/admin/agents/\")) {\n return \"connected-agents\";\n }\n if (pathname.startsWith(\"/admin/\")) {\n const adminView = resolveView(pathname.slice(\"/admin\".length), extensions);\n return adminView === \"overview\" ? \"admin\" : adminView;\n }\n if (pathname.startsWith(\"/browser-chat\")) return \"browser-chat\";\n if (pathname.startsWith(\"/chat\")) return \"chat\";\n // A route below /apps/ always embeds one app, so it must not collapse to the\n // apps list. An id that fails to decode still resolves here without a\n // `workspaceAppId`, which view-screen reports as an unknown app.\n if (pathname.startsWith(\"/apps/\") && pathname !== \"/apps/\") {\n return \"workspace-app\";\n }\n if (pathname.startsWith(\"/apps\")) return \"apps\";\n if (pathname.startsWith(\"/operations\")) return \"operations\";\n if (pathname.startsWith(\"/metrics\")) return \"metrics\";\n if (pathname.startsWith(\"/new-app\")) return \"new-app\";\n if (pathname.startsWith(\"/vault\")) return \"vault\";\n if (pathname.startsWith(\"/integrations\")) return \"integrations\";\n if (pathname.startsWith(\"/workspace\")) return \"workspace\";\n if (pathname.startsWith(\"/agents\")) return \"agents\";\n if (pathname.startsWith(\"/messaging\")) return \"messaging\";\n if (pathname.startsWith(\"/destinations\")) return \"destinations\";\n if (pathname.startsWith(\"/identities\")) return \"identities\";\n if (pathname.startsWith(\"/approvals\")) return \"approvals\";\n if (pathname.startsWith(\"/automations\")) return \"automations\";\n if (pathname.startsWith(\"/transactional-email\")) {\n return \"transactional-email\";\n }\n if (pathname.startsWith(\"/audit\")) return \"audit\";\n if (pathname.startsWith(\"/dreams\")) return \"dreams\";\n if (pathname.startsWith(\"/thread-debug\")) return \"thread-debug\";\n if (pathname.startsWith(\"/team\")) return \"settings\";\n return \"overview\";\n}\n\nfunction resolvePath(\n view?: string,\n extensions?: DispatchExtensionConfig,\n command?: Pick<\n NavigationState,\n \"extensionId\" | \"threadId\" | \"workspaceAppId\"\n >,\n): string | undefined {\n switch (view) {\n case \"admin\":\n return \"/admin\";\n case \"chat\":\n case \"ask\":\n return command?.threadId && command.threadId.trim()\n ? `/chat/${encodeURIComponent(command.threadId.trim())}`\n : \"/chat\";\n case \"overview\":\n return \"/overview\";\n case \"apps\":\n return \"/apps\";\n case \"workspace-app\":\n return command?.workspaceAppId\n ? workspaceAppRoute(command.workspaceAppId)\n : \"/apps\";\n case \"operations\":\n case \"monitoring\":\n case \"observability\":\n case \"database\":\n return view === \"database\"\n ? \"/admin/operations?view=database\"\n : \"/admin/operations\";\n case \"metrics\":\n case \"usage\":\n return \"/admin/metrics\";\n case \"new-app\":\n case \"create-app\":\n return \"/admin/new-app\";\n case \"vault\":\n case \"secrets\":\n return \"/admin/vault\";\n case \"integrations\":\n return \"/admin/integrations\";\n case \"workspace\":\n case \"resources\":\n return \"/admin/workspace\";\n case \"agents\":\n return \"/agents\";\n case \"connected-agents\":\n return \"/admin/agents\";\n case \"messaging\":\n return \"/admin/messaging\";\n case \"destinations\":\n case \"routes\":\n return \"/admin/destinations\";\n case \"identities\":\n return \"/admin/identities\";\n case \"approvals\":\n return \"/admin/approvals\";\n case \"automations\":\n case \"jobs\":\n return \"/admin/automations\";\n case \"transactional-email\":\n return \"/admin/transactional-email\";\n case \"audit\":\n return \"/admin/audit\";\n case \"dreams\":\n return \"/admin/dreams\";\n case \"thread-debug\":\n case \"threads\":\n return \"/admin/thread-debug\";\n case \"team\":\n return \"/settings/organization\";\n case \"extensions\":\n return command?.extensionId\n ? `/extensions/${encodeURIComponent(command.extensionId)}`\n : \"/extensions\";\n default:\n return resolveExtensionPath(view, extensions);\n }\n}\n\nfunction extensionSlugFromPathname(pathname: string): string | undefined {\n const match = pathname.match(/^\\/extensions\\/[^/]+\\/([^/?#]+)/);\n if (!match?.[1]) return undefined;\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-display.d.ts","sourceRoot":"","sources":["../../src/lib/automation-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,CAAC,GACnD,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAC1C,OAAO,CAET;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GACzC,MAAM,CAGR;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"automation-display.d.ts","sourceRoot":"","sources":["../../src/lib/automation-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,CAAC,GACnD,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAC1C,OAAO,CAET;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GACzC,MAAM,CAGR;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAMrE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,GACpD,MAAM,CAMR;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAWxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAExE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAKtE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAUA;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,sBAAsB,EAAE,GACpC,sBAAsB,EAAE,CAa1B"}
|
|
@@ -16,6 +16,8 @@ export function automationTroubleshootPath(item) {
|
|
|
16
16
|
export function automationTarget(item) {
|
|
17
17
|
if (item.triggerType === "event" && item.event)
|
|
18
18
|
return item.event;
|
|
19
|
+
if (item.triggerType === "webhook")
|
|
20
|
+
return "On webhook";
|
|
19
21
|
if (item.scheduleDescription)
|
|
20
22
|
return item.scheduleDescription;
|
|
21
23
|
if (item.schedule)
|
|
@@ -57,6 +59,8 @@ export function automationNextRun(item) {
|
|
|
57
59
|
return "paused";
|
|
58
60
|
if (item.triggerType === "event")
|
|
59
61
|
return "on event";
|
|
62
|
+
if (item.triggerType === "webhook")
|
|
63
|
+
return "on webhook";
|
|
60
64
|
return item.nextRun ? relativeRunTime(item.nextRun) : "not scheduled";
|
|
61
65
|
}
|
|
62
66
|
export function automationStatus(item) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-display.js","sourceRoot":"","sources":["../../src/lib/automation-display.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DispatchAutomationItem } from \"./automations.js\";\n\nexport type AutomationStatusTone =\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"muted\";\n\nexport function automationIdentity(\n item: Pick<DispatchAutomationItem, \"owner\" | \"path\">,\n): string {\n return `${item.owner}:${item.path}`;\n}\n\n/**\n * Dispatch is the workspace-wide surface. Keep legacy resources without an\n * app owner visible in its default view while making an explicit app owner\n * opt into the global filter.\n */\nexport function belongsToDispatch(\n item: Pick<DispatchAutomationItem, \"appId\">,\n): boolean {\n return !item.appId || item.appId === \"dispatch\";\n}\n\nexport function automationTroubleshootPath(\n item: Pick<DispatchAutomationItem, \"name\">,\n): string {\n const params = new URLSearchParams({ mode: \"threads\", query: item.name });\n return `/admin/thread-debug?${params.toString()}`;\n}\n\nexport function automationTarget(item: DispatchAutomationItem): 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\nexport function automationScopeLabel(\n item: Pick<DispatchAutomationItem, \"owner\" | \"scope\">,\n): string {\n return item.scope === \"organization\" ||\n item.owner.startsWith(\"__organization__:\") ||\n item.owner === \"__shared__\"\n ? \"Organization\"\n : \"Personal\";\n}\n\nexport function 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\nexport function automationLastRun(item: DispatchAutomationItem): string {\n return item.lastRun ? relativeRunTime(item.lastRun) : \"never\";\n}\n\nexport function automationLastCheck(item: DispatchAutomationItem): string {\n return item.lastCheck ? relativeRunTime(item.lastCheck) : \"never\";\n}\n\nexport function automationNextRun(item: DispatchAutomationItem): 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\nexport function automationStatus(item: DispatchAutomationItem): {\n label: string;\n tone: AutomationStatusTone;\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: \"Blocked\", tone: \"warning\" };\n if (item.lastStatus === \"success\")\n return { label: \"Healthy\", tone: \"success\" };\n return { label: \"Ready\", tone: \"default\" };\n}\n\nexport function sortAutomations(\n automations: DispatchAutomationItem[],\n): DispatchAutomationItem[] {\n return [...automations].sort((a, b) => {\n const aError =\n a.enabled && (a.lastStatus === \"error\" || a.lastStatus === \"skipped\")\n ? 1\n : 0;\n const bError =\n b.enabled && (b.lastStatus === \"error\" || b.lastStatus === \"skipped\")\n ? 1\n : 0;\n if (aError !== bError) return bError - aError;\n return (b.lastRun || \"\").localeCompare(a.lastRun || \"\");\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"automation-display.js","sourceRoot":"","sources":["../../src/lib/automation-display.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DispatchAutomationItem } from \"./automations.js\";\n\nexport type AutomationStatusTone =\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"muted\";\n\nexport function automationIdentity(\n item: Pick<DispatchAutomationItem, \"owner\" | \"path\">,\n): string {\n return `${item.owner}:${item.path}`;\n}\n\n/**\n * Dispatch is the workspace-wide surface. Keep legacy resources without an\n * app owner visible in its default view while making an explicit app owner\n * opt into the global filter.\n */\nexport function belongsToDispatch(\n item: Pick<DispatchAutomationItem, \"appId\">,\n): boolean {\n return !item.appId || item.appId === \"dispatch\";\n}\n\nexport function automationTroubleshootPath(\n item: Pick<DispatchAutomationItem, \"name\">,\n): string {\n const params = new URLSearchParams({ mode: \"threads\", query: item.name });\n return `/admin/thread-debug?${params.toString()}`;\n}\n\nexport function automationTarget(item: DispatchAutomationItem): string {\n if (item.triggerType === \"event\" && item.event) return item.event;\n if (item.triggerType === \"webhook\") return \"On webhook\";\n if (item.scheduleDescription) return item.scheduleDescription;\n if (item.schedule) return item.schedule;\n return item.triggerType || \"schedule\";\n}\n\nexport function automationScopeLabel(\n item: Pick<DispatchAutomationItem, \"owner\" | \"scope\">,\n): string {\n return item.scope === \"organization\" ||\n item.owner.startsWith(\"__organization__:\") ||\n item.owner === \"__shared__\"\n ? \"Organization\"\n : \"Personal\";\n}\n\nexport function 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\nexport function automationLastRun(item: DispatchAutomationItem): string {\n return item.lastRun ? relativeRunTime(item.lastRun) : \"never\";\n}\n\nexport function automationLastCheck(item: DispatchAutomationItem): string {\n return item.lastCheck ? relativeRunTime(item.lastCheck) : \"never\";\n}\n\nexport function automationNextRun(item: DispatchAutomationItem): string {\n if (!item.enabled) return \"paused\";\n if (item.triggerType === \"event\") return \"on event\";\n if (item.triggerType === \"webhook\") return \"on webhook\";\n return item.nextRun ? relativeRunTime(item.nextRun) : \"not scheduled\";\n}\n\nexport function automationStatus(item: DispatchAutomationItem): {\n label: string;\n tone: AutomationStatusTone;\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: \"Blocked\", tone: \"warning\" };\n if (item.lastStatus === \"success\")\n return { label: \"Healthy\", tone: \"success\" };\n return { label: \"Ready\", tone: \"default\" };\n}\n\nexport function sortAutomations(\n automations: DispatchAutomationItem[],\n): DispatchAutomationItem[] {\n return [...automations].sort((a, b) => {\n const aError =\n a.enabled && (a.lastStatus === \"error\" || a.lastStatus === \"skipped\")\n ? 1\n : 0;\n const bError =\n b.enabled && (b.lastStatus === \"error\" || b.lastStatus === \"skipped\")\n ? 1\n : 0;\n if (aError !== bError) return bError - aError;\n return (b.lastRun || \"\").localeCompare(a.lastRun || \"\");\n });\n}\n"]}
|
|
@@ -7,8 +7,9 @@ export interface DispatchAutomationItem {
|
|
|
7
7
|
orgId?: string;
|
|
8
8
|
scope?: "personal" | "organization";
|
|
9
9
|
canUpdate?: boolean;
|
|
10
|
-
triggerType?: "schedule" | "event" | (string & {});
|
|
10
|
+
triggerType?: "schedule" | "event" | "webhook" | (string & {});
|
|
11
11
|
event?: string;
|
|
12
|
+
webhookPath?: string;
|
|
12
13
|
schedule?: string;
|
|
13
14
|
scheduleDescription?: string;
|
|
14
15
|
condition?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../src/lib/automations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../src/lib/automations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,GACpE,UAAU,GAAG,cAAc,CAQ7B;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAcD,wBAAsB,uBAAuB,IAAI,OAAO,CACtD,sBAAsB,EAAE,CACzB,CAOA;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,sBAAsB,CAAC,CAOjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automations.js","sourceRoot":"","sources":["../../src/lib/automations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"automations.js","sourceRoot":"","sources":["../../src/lib/automations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAuCrE,MAAM,UAAU,kBAAkB,CAChC,UAAqE;IAErE,IAAI,UAAU,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,KAAK,cAAc;QACxC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAChD,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAQD,KAAK,UAAU,sBAAsB,CAAI,QAAkB;IACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GACX,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI;YACjD,CAAC,CAAC,MAAM,CAAE,IAA4B,CAAC,KAAK,CAAC;YAC7C,CAAC,CAAC,2BAA2B,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAG3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAU,QAAQ,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAgC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAwC;IAExC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,4BAA4B,CAAC,EAAE;QAC1E,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,sBAAsB,CAAyB,QAAQ,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import { agentNativePath } from \"@agent-native/core/client/api-path\";\n\nexport interface DispatchAutomationItem {\n id: string;\n name: string;\n path: string;\n owner: string;\n appId?: string;\n orgId?: string;\n scope?: \"personal\" | \"organization\";\n canUpdate?: boolean;\n triggerType?: \"schedule\" | \"event\" | \"webhook\" | (string & {});\n event?: string;\n webhookPath?: string;\n schedule?: string;\n scheduleDescription?: string;\n condition?: string;\n mode?: string;\n domain?: string;\n enabled?: boolean;\n timezone?: string;\n lastStatus?: string;\n lastRun?: string;\n lastCheck?: string;\n lastError?: string;\n nextRun?: string;\n createdBy?: string;\n body?: string;\n model?: string;\n mcpTools?: string[];\n runAs?: \"creator\" | \"shared\";\n executionHostId?: string;\n executionEngine?: string;\n executionCwd?: string;\n deliveryPlatform?: string;\n deliveryDestination?: string;\n deliveryThreadRef?: string;\n}\n\nexport function automationRunScope(\n automation: Pick<DispatchAutomationItem, \"owner\" | \"orgId\" | \"scope\">,\n): \"personal\" | \"organization\" {\n if (automation.owner === \"__shared__\" && !automation.orgId) {\n return \"personal\";\n }\n return automation.scope === \"organization\" ||\n automation.owner.startsWith(\"__organization__:\")\n ? \"organization\"\n : \"personal\";\n}\n\nexport interface SetDispatchAutomationEnabledInput {\n owner: string;\n path: string;\n enabled: boolean;\n}\n\nasync function readAutomationResponse<T>(response: Response): Promise<T> {\n const data = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String((data as { error?: unknown }).error)\n : \"Automation request failed\";\n throw new Error(message);\n }\n return data as T;\n}\n\nexport async function listDispatchAutomations(): Promise<\n DispatchAutomationItem[]\n> {\n const response = await fetch(agentNativePath(\"/_agent-native/automations\"));\n const rows = await readAutomationResponse<unknown>(response);\n if (!Array.isArray(rows)) {\n throw new Error(\"Automation list returned an invalid response\");\n }\n return rows as DispatchAutomationItem[];\n}\n\nexport async function setDispatchAutomationEnabled(\n input: SetDispatchAutomationEnabledInput,\n): Promise<DispatchAutomationItem> {\n const response = await fetch(agentNativePath(\"/_agent-native/automations\"), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n });\n return readAutomationResponse<DispatchAutomationItem>(response);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/automations.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/automations.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,IAAI;;IAEnB;AAkGD,MAAM,CAAC,OAAO,UAAU,gBAAgB,oDA2QvC"}
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { sendToAgentChat } from "@agent-native/core/client/agent-chat";
|
|
3
|
-
import { PromptComposer } from "@agent-native/core/client/composer";
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
2
|
import { useChangeVersions } from "@agent-native/core/client/hooks";
|
|
5
3
|
import { IconFileSearch, IconListDetails, IconPlus, IconSearch, IconSettingsAutomation, } from "@tabler/icons-react";
|
|
6
4
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
7
5
|
import { useMemo, useState } from "react";
|
|
8
6
|
import { Link, useSearchParams } from "react-router";
|
|
9
7
|
import { toast } from "sonner";
|
|
8
|
+
import { AutomationCreateDialog } from "../../components/automation-create-dialog.js";
|
|
10
9
|
import { AutomationDetailsPanel } from "../../components/automation-details-panel.js";
|
|
11
10
|
import { DispatchShell } from "../../components/dispatch-shell.js";
|
|
12
11
|
import { Badge } from "../../components/ui/badge.js";
|
|
13
12
|
import { Button } from "../../components/ui/button.js";
|
|
14
13
|
import { Input } from "../../components/ui/input.js";
|
|
15
|
-
import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover.js";
|
|
16
14
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../../components/ui/select.js";
|
|
17
15
|
import { Skeleton } from "../../components/ui/skeleton.js";
|
|
18
16
|
import { Switch } from "../../components/ui/switch.js";
|
|
@@ -65,25 +63,12 @@ function useToggleAutomation() {
|
|
|
65
63
|
},
|
|
66
64
|
});
|
|
67
65
|
}
|
|
68
|
-
function CreateAutomationButton() {
|
|
66
|
+
function CreateAutomationButton({ onCreated }) {
|
|
69
67
|
const [open, setOpen] = useState(false);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return;
|
|
75
|
-
window.dispatchEvent(new CustomEvent("agent-panel:set-mode", {
|
|
76
|
-
detail: { mode: "chat" },
|
|
77
|
-
}));
|
|
78
|
-
sendToAgentChat({
|
|
79
|
-
message: trimmed,
|
|
80
|
-
context: `The user wants to create a new automation. Scope: ${scope}. Use manage-automations with action=define to create it. Ask clarifying questions if needed about what event to trigger on, conditions, and what actions to take.`,
|
|
81
|
-
submit: true,
|
|
82
|
-
newTab: true,
|
|
83
|
-
});
|
|
84
|
-
setOpen(false);
|
|
85
|
-
}
|
|
86
|
-
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", children: [_jsx(IconPlus, { size: 14 }), "New automation"] }) }), _jsxs(PopoverContent, { align: "end", className: "w-[min(100vw-2rem,24rem)] p-3", children: [_jsx("p", { className: "pb-2 text-sm font-semibold text-foreground", children: "New automation" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you want to automate...", draftScope: "dispatch-automations:create", onSubmit: handleSubmit }), _jsxs("select", { value: scope, onChange: (event) => setScope(event.target.value), className: "mt-2 w-full cursor-pointer rounded-md border border-input bg-background px-3 py-1.5 text-xs text-foreground", children: [_jsx("option", { value: "personal", children: "Personal" }), _jsx("option", { value: "organization", children: "Organization" })] })] })] }));
|
|
68
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Button, { size: "sm", onClick: () => setOpen(true), children: [_jsx(IconPlus, { size: 14 }), "New automation"] }), _jsx(AutomationCreateDialog, { open: open, onOpenChange: setOpen, onCreated: () => {
|
|
69
|
+
setOpen(false);
|
|
70
|
+
onCreated();
|
|
71
|
+
} })] }));
|
|
87
72
|
}
|
|
88
73
|
export default function AutomationsRoute() {
|
|
89
74
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
@@ -91,6 +76,7 @@ export default function AutomationsRoute() {
|
|
|
91
76
|
const [query, setQuery] = useState("");
|
|
92
77
|
const automationsQuery = useAutomations();
|
|
93
78
|
const toggleAutomation = useToggleAutomation();
|
|
79
|
+
const queryClient = useQueryClient();
|
|
94
80
|
const automations = automationsQuery.data ?? [];
|
|
95
81
|
const visibleAutomations = useMemo(() => view === "all"
|
|
96
82
|
? automations
|
|
@@ -105,6 +91,7 @@ export default function AutomationsRoute() {
|
|
|
105
91
|
item.event,
|
|
106
92
|
item.schedule,
|
|
107
93
|
item.scheduleDescription,
|
|
94
|
+
item.webhookPath,
|
|
108
95
|
item.body,
|
|
109
96
|
item.model,
|
|
110
97
|
item.domain,
|
|
@@ -137,10 +124,15 @@ export default function AutomationsRoute() {
|
|
|
137
124
|
next.set("automationId", automationIdentity(item));
|
|
138
125
|
setSearchParams(next);
|
|
139
126
|
}
|
|
140
|
-
return (_jsx(DispatchShell, { title: "Automations", description: "
|
|
127
|
+
return (_jsx(DispatchShell, { title: "Automations", description: "Create schedule, webhook, or app-event automations, then inspect their checks and past runs.", children: _jsxs("section", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-3", children: [_jsxs("div", { className: "relative w-full max-w-sm", children: [_jsx(IconSearch, { size: 15, "aria-hidden": "true", className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { value: query, onChange: (event) => setQuery(event.target.value), placeholder: "Search automations", "aria-label": "Search automations", className: "h-8 pl-8 text-xs" })] }), _jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(IconSettingsAutomation, { size: 16, className: "shrink-0" }), _jsxs("span", { children: [enabledCount, " enabled", errorCount > 0 ? ` · ${errorCount} errors` : ""] })] })] }), _jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [_jsxs(Select, { value: view, onValueChange: (value) => {
|
|
141
128
|
if (value === "dispatch" || value === "all")
|
|
142
129
|
setView(value);
|
|
143
|
-
}, children: [_jsx(SelectTrigger, { className: "h-8 w-[10.5rem] text-xs", "aria-label": "Automation view", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "dispatch", children: "Dispatch automations" }), _jsx(SelectItem, { value: "all", children: "All apps" })] })] }), _jsx(CreateAutomationButton, {
|
|
130
|
+
}, children: [_jsx(SelectTrigger, { className: "h-8 w-[10.5rem] text-xs", "aria-label": "Automation view", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "dispatch", children: "Dispatch automations" }), _jsx(SelectItem, { value: "all", children: "All apps" })] })] }), _jsx(CreateAutomationButton, { onCreated: () => {
|
|
131
|
+
toast.success("Automation created");
|
|
132
|
+
void queryClient.invalidateQueries({
|
|
133
|
+
queryKey: AUTOMATIONS_QUERY_KEY,
|
|
134
|
+
});
|
|
135
|
+
} })] })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(24rem,32rem)]", children: [_jsx("div", { className: "min-w-0 divide-y rounded-lg bg-card", children: automationsQuery.isLoading && ordered.length === 0 ? (Array.from({ length: 4 }).map((_, index) => (_jsxs("div", { className: "px-4 py-3", children: [_jsx(Skeleton, { className: "h-4 w-40" }), _jsx(Skeleton, { className: "mt-2 h-3 w-28" })] }, index)))) : filtered.length > 0 ? (filtered.map((item) => {
|
|
144
136
|
const status = automationStatus(item);
|
|
145
137
|
const canUpdate = item.canUpdate !== false;
|
|
146
138
|
const isToggling = pendingToggleIdentity === automationIdentity(item);
|