@agent-native/dispatch 0.6.1 → 0.8.0
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/README.md +38 -1
- package/dist/actions/apply-dream-proposal.d.ts +3 -0
- package/dist/actions/apply-dream-proposal.d.ts.map +1 -0
- package/dist/actions/apply-dream-proposal.js +11 -0
- package/dist/actions/apply-dream-proposal.js.map +1 -0
- package/dist/actions/create-dream-report.d.ts +3 -0
- package/dist/actions/create-dream-report.d.ts.map +1 -0
- package/dist/actions/create-dream-report.js +67 -0
- package/dist/actions/create-dream-report.js.map +1 -0
- package/dist/actions/create-pylon-ticket.d.ts +3 -0
- package/dist/actions/create-pylon-ticket.d.ts.map +1 -0
- package/dist/actions/create-pylon-ticket.js +94 -0
- package/dist/actions/create-pylon-ticket.js.map +1 -0
- package/dist/actions/create-vault-grant.js +1 -1
- package/dist/actions/create-vault-grant.js.map +1 -1
- package/dist/actions/create-vault-secret.d.ts.map +1 -1
- package/dist/actions/create-vault-secret.js +4 -3
- package/dist/actions/create-vault-secret.js.map +1 -1
- package/dist/actions/create-workspace-resource.js +3 -3
- package/dist/actions/create-workspace-resource.js.map +1 -1
- package/dist/actions/delete-workspace-resource.js +1 -1
- package/dist/actions/delete-workspace-resource.js.map +1 -1
- package/dist/actions/ensure-dream-job.d.ts +3 -0
- package/dist/actions/ensure-dream-job.d.ts.map +1 -0
- package/dist/actions/ensure-dream-job.js +73 -0
- package/dist/actions/ensure-dream-job.js.map +1 -0
- package/dist/actions/get-dream-settings.d.ts +3 -0
- package/dist/actions/get-dream-settings.d.ts.map +1 -0
- package/dist/actions/get-dream-settings.js +11 -0
- package/dist/actions/get-dream-settings.js.map +1 -0
- package/dist/actions/get-dream.d.ts +3 -0
- package/dist/actions/get-dream.d.ts.map +1 -0
- package/dist/actions/get-dream.js +13 -0
- package/dist/actions/get-dream.js.map +1 -0
- package/dist/actions/get-vault-access-settings.d.ts +3 -0
- package/dist/actions/get-vault-access-settings.d.ts.map +1 -0
- package/dist/actions/get-vault-access-settings.js +10 -0
- package/dist/actions/get-vault-access-settings.js.map +1 -0
- package/dist/actions/get-workspace-resource-effective-context.d.ts +3 -0
- package/dist/actions/get-workspace-resource-effective-context.d.ts.map +1 -0
- package/dist/actions/get-workspace-resource-effective-context.js +27 -0
- package/dist/actions/get-workspace-resource-effective-context.js.map +1 -0
- package/dist/actions/grant-vault-secrets-to-app.js +1 -1
- package/dist/actions/grant-vault-secrets-to-app.js.map +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +38 -4
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/list-dream-candidates.d.ts +3 -0
- package/dist/actions/list-dream-candidates.d.ts.map +1 -0
- package/dist/actions/list-dream-candidates.js +68 -0
- package/dist/actions/list-dream-candidates.js.map +1 -0
- package/dist/actions/list-dreams.d.ts +3 -0
- package/dist/actions/list-dreams.d.ts.map +1 -0
- package/dist/actions/list-dreams.js +17 -0
- package/dist/actions/list-dreams.js.map +1 -0
- package/dist/actions/list-integrations-catalog.js +1 -1
- package/dist/actions/list-integrations-catalog.js.map +1 -1
- package/dist/actions/list-vault-grants.js +1 -1
- package/dist/actions/list-vault-grants.js.map +1 -1
- package/dist/actions/list-workspace-apps.d.ts.map +1 -1
- package/dist/actions/list-workspace-apps.js +5 -1
- package/dist/actions/list-workspace-apps.js.map +1 -1
- package/dist/actions/list-workspace-resources-for-app.d.ts +3 -0
- package/dist/actions/list-workspace-resources-for-app.d.ts.map +1 -0
- package/dist/actions/list-workspace-resources-for-app.js +12 -0
- package/dist/actions/list-workspace-resources-for-app.js.map +1 -0
- package/dist/actions/list-workspace-resources.js +1 -1
- package/dist/actions/list-workspace-resources.js.map +1 -1
- package/dist/actions/navigate.d.ts +1 -0
- package/dist/actions/navigate.d.ts.map +1 -1
- package/dist/actions/navigate.js +2 -1
- package/dist/actions/navigate.js.map +1 -1
- package/dist/actions/preview-dream-proposal.d.ts +3 -0
- package/dist/actions/preview-dream-proposal.d.ts.map +1 -0
- package/dist/actions/preview-dream-proposal.js +13 -0
- package/dist/actions/preview-dream-proposal.js.map +1 -0
- package/dist/actions/preview-workspace-resource-change.d.ts +3 -0
- package/dist/actions/preview-workspace-resource-change.d.ts.map +1 -0
- package/dist/actions/preview-workspace-resource-change.js +24 -0
- package/dist/actions/preview-workspace-resource-change.js.map +1 -0
- package/dist/actions/reject-dream-proposal.d.ts +3 -0
- package/dist/actions/reject-dream-proposal.d.ts.map +1 -0
- package/dist/actions/reject-dream-proposal.js +12 -0
- package/dist/actions/reject-dream-proposal.js.map +1 -0
- package/dist/actions/restore-starter-workspace-resources.d.ts +3 -0
- package/dist/actions/restore-starter-workspace-resources.d.ts.map +1 -0
- package/dist/actions/restore-starter-workspace-resources.js +14 -0
- package/dist/actions/restore-starter-workspace-resources.js.map +1 -0
- package/dist/actions/send-code-agent-remote-command.d.ts +3 -0
- package/dist/actions/send-code-agent-remote-command.d.ts.map +1 -0
- package/dist/actions/send-code-agent-remote-command.js +53 -0
- package/dist/actions/send-code-agent-remote-command.js.map +1 -0
- package/dist/actions/set-dream-settings.d.ts +3 -0
- package/dist/actions/set-dream-settings.d.ts.map +1 -0
- package/dist/actions/set-dream-settings.js +41 -0
- package/dist/actions/set-dream-settings.js.map +1 -0
- package/dist/actions/set-vault-access-settings.d.ts +3 -0
- package/dist/actions/set-vault-access-settings.d.ts.map +1 -0
- package/dist/actions/set-vault-access-settings.js +13 -0
- package/dist/actions/set-vault-access-settings.js.map +1 -0
- package/dist/actions/start-workspace-app-creation.d.ts.map +1 -1
- package/dist/actions/start-workspace-app-creation.js +6 -0
- package/dist/actions/start-workspace-app-creation.js.map +1 -1
- package/dist/actions/sync-vault-to-app.js +1 -1
- package/dist/actions/sync-vault-to-app.js.map +1 -1
- package/dist/actions/update-workspace-app-metadata.d.ts +3 -0
- package/dist/actions/update-workspace-app-metadata.d.ts.map +1 -0
- package/dist/actions/update-workspace-app-metadata.js +30 -0
- package/dist/actions/update-workspace-app-metadata.js.map +1 -0
- package/dist/actions/update-workspace-resource.js +1 -1
- package/dist/actions/update-workspace-resource.js.map +1 -1
- package/dist/actions/view-screen.d.ts.map +1 -1
- package/dist/actions/view-screen.js +77 -4
- package/dist/actions/view-screen.js.map +1 -1
- package/dist/components/app-keys-popover.js +16 -5
- package/dist/components/app-keys-popover.js.map +1 -1
- package/dist/components/approval-value-block.d.ts +7 -0
- package/dist/components/approval-value-block.d.ts.map +1 -0
- package/dist/components/approval-value-block.js +22 -0
- package/dist/components/approval-value-block.js.map +1 -0
- package/dist/components/create-app-popover.d.ts.map +1 -1
- package/dist/components/create-app-popover.js +41 -16
- package/dist/components/create-app-popover.js.map +1 -1
- package/dist/components/dispatch-shell.d.ts +4 -4
- package/dist/components/dispatch-shell.d.ts.map +1 -1
- package/dist/components/dispatch-shell.js +6 -6
- package/dist/components/dispatch-shell.js.map +1 -1
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +18 -4
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/messaging-setup-panel.d.ts.map +1 -1
- package/dist/components/messaging-setup-panel.js +2 -2
- package/dist/components/messaging-setup-panel.js.map +1 -1
- package/dist/components/ui/chart.d.ts +1 -1
- package/dist/components/workspace-app-card.d.ts.map +1 -1
- package/dist/components/workspace-app-card.js +63 -3
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/components/workspace-resource-effective-stack.d.ts +11 -0
- package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -0
- package/dist/components/workspace-resource-effective-stack.js +59 -0
- package/dist/components/workspace-resource-effective-stack.js.map +1 -0
- package/dist/components/workspace-resource-impact-preview.d.ts +9 -0
- package/dist/components/workspace-resource-impact-preview.d.ts.map +1 -0
- package/dist/components/workspace-resource-impact-preview.js +39 -0
- package/dist/components/workspace-resource-impact-preview.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +59 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +714 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +44 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/hooks/use-navigation-state.d.ts +3 -0
- package/dist/hooks/use-navigation-state.d.ts.map +1 -1
- package/dist/hooks/use-navigation-state.js +35 -8
- package/dist/hooks/use-navigation-state.js.map +1 -1
- package/dist/lib/catch-all-target.d.ts +2 -0
- package/dist/lib/catch-all-target.d.ts.map +1 -0
- package/dist/lib/catch-all-target.js +95 -0
- package/dist/lib/catch-all-target.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +5 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/workspace-apps.d.ts +9 -0
- package/dist/lib/workspace-apps.d.ts.map +1 -1
- package/dist/lib/workspace-apps.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/pages/$appId.d.ts +2 -2
- package/dist/routes/pages/$appId.d.ts.map +1 -1
- package/dist/routes/pages/$appId.js +17 -8
- package/dist/routes/pages/$appId.js.map +1 -1
- package/dist/routes/pages/approval.d.ts.map +1 -1
- package/dist/routes/pages/approval.js +4 -1
- package/dist/routes/pages/approval.js.map +1 -1
- package/dist/routes/pages/approvals.js +1 -1
- package/dist/routes/pages/approvals.js.map +1 -1
- package/dist/routes/pages/dream-settings.d.ts +34 -0
- package/dist/routes/pages/dream-settings.d.ts.map +1 -0
- package/dist/routes/pages/dream-settings.js +68 -0
- package/dist/routes/pages/dream-settings.js.map +1 -0
- package/dist/routes/pages/dreams.d.ts +5 -0
- package/dist/routes/pages/dreams.d.ts.map +1 -0
- package/dist/routes/pages/dreams.js +435 -0
- package/dist/routes/pages/dreams.js.map +1 -0
- package/dist/routes/pages/integrations.d.ts.map +1 -1
- package/dist/routes/pages/integrations.js +20 -15
- package/dist/routes/pages/integrations.js.map +1 -1
- package/dist/routes/pages/new-app.js +1 -1
- package/dist/routes/pages/new-app.js.map +1 -1
- package/dist/routes/pages/overview.d.ts.map +1 -1
- package/dist/routes/pages/overview.js +5 -1
- package/dist/routes/pages/overview.js.map +1 -1
- package/dist/routes/pages/vault.d.ts.map +1 -1
- package/dist/routes/pages/vault.js +23 -5
- package/dist/routes/pages/vault.js.map +1 -1
- package/dist/routes/pages/workspace.d.ts.map +1 -1
- package/dist/routes/pages/workspace.js +187 -35
- package/dist/routes/pages/workspace.js.map +1 -1
- package/dist/server/lib/app-creation-store.d.ts +13 -0
- package/dist/server/lib/app-creation-store.d.ts.map +1 -1
- package/dist/server/lib/app-creation-store.js +298 -11
- package/dist/server/lib/app-creation-store.js.map +1 -1
- package/dist/server/lib/dispatch-integrations.d.ts +1 -1
- package/dist/server/lib/dispatch-integrations.d.ts.map +1 -1
- package/dist/server/lib/dispatch-integrations.js +9 -4
- package/dist/server/lib/dispatch-integrations.js.map +1 -1
- package/dist/server/lib/dispatch-remote-commands.d.ts +83 -0
- package/dist/server/lib/dispatch-remote-commands.d.ts.map +1 -0
- package/dist/server/lib/dispatch-remote-commands.js +256 -0
- package/dist/server/lib/dispatch-remote-commands.js.map +1 -0
- package/dist/server/lib/dispatch-store.d.ts +26 -0
- package/dist/server/lib/dispatch-store.d.ts.map +1 -1
- package/dist/server/lib/dispatch-store.js +17 -1
- package/dist/server/lib/dispatch-store.js.map +1 -1
- package/dist/server/lib/dreams-store.d.ts +398 -0
- package/dist/server/lib/dreams-store.d.ts.map +1 -0
- package/dist/server/lib/dreams-store.js +2330 -0
- package/dist/server/lib/dreams-store.js.map +1 -0
- package/dist/server/lib/env-config.d.ts.map +1 -1
- package/dist/server/lib/env-config.js +5 -0
- package/dist/server/lib/env-config.js.map +1 -1
- package/dist/server/lib/onboarding-steps.d.ts +12 -0
- package/dist/server/lib/onboarding-steps.d.ts.map +1 -0
- package/dist/server/lib/onboarding-steps.js +47 -0
- package/dist/server/lib/onboarding-steps.js.map +1 -0
- package/dist/server/lib/thread-debug-store.d.ts +2 -2
- package/dist/server/lib/vault-store.d.ts +55 -0
- package/dist/server/lib/vault-store.d.ts.map +1 -1
- package/dist/server/lib/vault-store.js +210 -41
- package/dist/server/lib/vault-store.js.map +1 -1
- package/dist/server/lib/workspace-resources-store.d.ts +181 -17
- package/dist/server/lib/workspace-resources-store.d.ts.map +1 -1
- package/dist/server/lib/workspace-resources-store.js +737 -108
- package/dist/server/lib/workspace-resources-store.js.map +1 -1
- package/dist/server/plugins/agent-chat.d.ts.map +1 -1
- package/dist/server/plugins/agent-chat.js +2 -1
- package/dist/server/plugins/agent-chat.js.map +1 -1
- package/dist/server/plugins/core-routes.d.ts.map +1 -1
- package/dist/server/plugins/core-routes.js +4 -0
- package/dist/server/plugins/core-routes.js.map +1 -1
- package/dist/server/plugins/integrations.js +2 -2
- package/dist/server/plugins/integrations.js.map +1 -1
- package/package.json +15 -11
- package/src/actions/apply-dream-proposal.ts +12 -0
- package/src/actions/create-dream-report.ts +76 -0
- package/src/actions/create-pylon-ticket.ts +109 -0
- package/src/actions/create-vault-grant.ts +1 -1
- package/src/actions/create-vault-secret.ts +4 -3
- package/src/actions/create-workspace-resource.ts +3 -3
- package/src/actions/delete-workspace-resource.ts +1 -1
- package/src/actions/ensure-dream-job.ts +76 -0
- package/src/actions/get-dream-settings.ts +12 -0
- package/src/actions/get-dream.ts +14 -0
- package/src/actions/get-vault-access-settings.ts +11 -0
- package/src/actions/get-workspace-resource-effective-context.ts +34 -0
- package/src/actions/grant-vault-secrets-to-app.ts +1 -1
- package/src/actions/index.spec.ts +26 -0
- package/src/actions/index.ts +39 -4
- package/src/actions/list-dream-candidates.ts +77 -0
- package/src/actions/list-dreams.ts +17 -0
- package/src/actions/list-integrations-catalog.ts +1 -1
- package/src/actions/list-vault-grants.ts +1 -1
- package/src/actions/list-workspace-apps.ts +5 -1
- package/src/actions/list-workspace-resources-for-app.ts +13 -0
- package/src/actions/list-workspace-resources.ts +1 -1
- package/src/actions/navigate.ts +2 -1
- package/src/actions/preview-dream-proposal.ts +14 -0
- package/src/actions/preview-workspace-resource-change.ts +25 -0
- package/src/actions/reject-dream-proposal.ts +12 -0
- package/src/actions/restore-starter-workspace-resources.ts +17 -0
- package/src/actions/send-code-agent-remote-command.ts +59 -0
- package/src/actions/set-dream-settings.spec.ts +81 -0
- package/src/actions/set-dream-settings.ts +44 -0
- package/src/actions/set-vault-access-settings.ts +16 -0
- package/src/actions/start-workspace-app-creation.ts +8 -0
- package/src/actions/sync-vault-to-app.ts +1 -1
- package/src/actions/update-workspace-app-metadata.ts +32 -0
- package/src/actions/update-workspace-resource.ts +1 -1
- package/src/actions/view-screen.ts +94 -3
- package/src/components/app-keys-popover.tsx +23 -7
- package/src/components/approval-value-block.spec.tsx +59 -0
- package/src/components/approval-value-block.tsx +33 -0
- package/src/components/create-app-popover.tsx +50 -16
- package/src/components/dispatch-shell.tsx +16 -15
- package/src/components/layout/Layout.tsx +19 -5
- package/src/components/messaging-setup-panel.tsx +54 -39
- package/src/components/workspace-app-card.tsx +268 -1
- package/src/components/workspace-resource-effective-stack.spec.tsx +125 -0
- package/src/components/workspace-resource-effective-stack.tsx +141 -0
- package/src/components/workspace-resource-impact-preview.spec.tsx +147 -0
- package/src/components/workspace-resource-impact-preview.tsx +116 -0
- package/src/db/migrations.ts +59 -0
- package/src/db/schema.ts +46 -2
- package/src/hooks/use-navigation-state.ts +34 -9
- package/src/lib/catch-all-target.spec.ts +218 -0
- package/src/lib/catch-all-target.ts +99 -0
- package/src/lib/utils.ts +6 -1
- package/src/lib/workspace-apps.ts +9 -0
- package/src/routes/index.ts +1 -0
- package/src/routes/pages/$appId.tsx +21 -8
- package/src/routes/pages/approval.tsx +14 -1
- package/src/routes/pages/approvals.tsx +1 -1
- package/src/routes/pages/dream-settings.spec.ts +130 -0
- package/src/routes/pages/dream-settings.ts +103 -0
- package/src/routes/pages/dreams.tsx +1828 -0
- package/src/routes/pages/integrations.tsx +57 -18
- package/src/routes/pages/new-app.tsx +1 -1
- package/src/routes/pages/overview.tsx +11 -3
- package/src/routes/pages/vault.tsx +76 -9
- package/src/routes/pages/workspace.tsx +577 -97
- package/src/server/lib/app-creation-store.spec.ts +61 -2
- package/src/server/lib/app-creation-store.ts +389 -13
- package/src/server/lib/dispatch-integrations.ts +10 -3
- package/src/server/lib/dispatch-remote-commands.spec.ts +167 -0
- package/src/server/lib/dispatch-remote-commands.ts +375 -0
- package/src/server/lib/dispatch-store.ts +37 -1
- package/src/server/lib/dreams-store.spec.ts +1492 -0
- package/src/server/lib/dreams-store.ts +3168 -0
- package/src/server/lib/env-config.ts +5 -0
- package/src/server/lib/onboarding-steps.ts +49 -0
- package/src/server/lib/vault-store.spec.ts +69 -0
- package/src/server/lib/vault-store.ts +266 -49
- package/src/server/lib/workspace-resource-approval-lifecycle.spec.ts +236 -0
- package/src/server/lib/workspace-resources-store.spec.ts +1106 -0
- package/src/server/lib/workspace-resources-store.ts +1001 -134
- package/src/server/plugins/agent-chat.ts +2 -1
- package/src/server/plugins/core-routes.ts +5 -0
- package/src/server/plugins/integrations.ts +2 -2
- package/dist/actions/sync-workspace-resources-to-all.d.ts +0 -3
- package/dist/actions/sync-workspace-resources-to-all.d.ts.map +0 -1
- package/dist/actions/sync-workspace-resources-to-all.js +0 -9
- package/dist/actions/sync-workspace-resources-to-all.js.map +0 -1
- package/dist/actions/sync-workspace-resources-to-app.d.ts +0 -3
- package/dist/actions/sync-workspace-resources-to-app.d.ts.map +0 -1
- package/dist/actions/sync-workspace-resources-to-app.js +0 -11
- package/dist/actions/sync-workspace-resources-to-app.js.map +0 -1
- package/src/actions/sync-workspace-resources-to-all.ts +0 -10
- package/src/actions/sync-workspace-resources-to-app.ts +0 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dreams.js","sourceRoot":"","sources":["../../../src/routes/pages/dreams.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router\";\nimport { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport { toast } from \"sonner\";\nimport {\n IconAlertTriangle,\n IconBrain,\n IconCalendarTime,\n IconCheck,\n IconCircleDashed,\n IconClock,\n IconDatabase,\n IconFileDiff,\n IconPlayerPlay,\n IconRefresh,\n IconSettings,\n IconX,\n} from \"@tabler/icons-react\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\";\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Separator } from \"@/components/ui/separator\";\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport { Switch } from \"@/components/ui/switch\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport { cn } from \"@/lib/utils\";\nimport {\n dreamSettingsToDraft,\n dreamSettingsUpdateFromDraft,\n splitSourceIds,\n type DreamSettings,\n type DreamSettingsDraft,\n} from \"./dream-settings\";\n\nexport function meta() {\n return [{ title: \"Dreams — Dispatch\" }];\n}\n\ntype DreamStatus =\n | \"running\"\n | \"completed\"\n | \"failed\"\n | \"pending\"\n | \"applied\"\n | \"rejected\"\n | \"stale\"\n | string;\n\ninterface DreamPass {\n id: string;\n title?: string | null;\n summary?: string | null;\n status?: DreamStatus | null;\n sourceId?: string | null;\n query?: string | null;\n error?: string | null;\n createdAt?: number | string | null;\n startedAt?: number | string | null;\n completedAt?: number | string | null;\n updatedAt?: number | string | null;\n candidateCount?: number | null;\n inspectedThreadCount?: number | null;\n inspectedRunCount?: number | null;\n proposalCount?: number | null;\n proposalCounts?: Record<string, number> | null;\n appliedCount?: number | null;\n rejectedCount?: number | null;\n sourceHealth?: DreamSourceHealth[] | null;\n}\n\ninterface DreamEvidence {\n id?: string | null;\n label?: string | null;\n title?: string | null;\n source?: string | null;\n sourceId?: string | null;\n threadId?: string | null;\n threadTitle?: string | null;\n runId?: string | null;\n kind?: string | null;\n quote?: string | null;\n snippet?: string | null;\n summary?: string | null;\n confidence?: number | null;\n createdAt?: number | string | null;\n [key: string]: unknown;\n}\n\ninterface DreamProposal {\n id: string;\n dreamId?: string | null;\n title?: string | null;\n summary?: string | null;\n status?: DreamStatus | null;\n targetType?: string | null;\n targetPath?: string | null;\n type?: string | null;\n target?: string | null;\n path?: string | null;\n risk?: string | null;\n confidence?: number | null;\n rationale?: string | null;\n content?: string | null;\n evidence?: DreamEvidence[] | null;\n sourceRunIds?: string[] | null;\n createdAt?: number | string | null;\n}\n\ninterface CandidateRun {\n id?: string;\n thread?: {\n id: string;\n ownerEmail: string;\n title: string;\n preview: string;\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n };\n title?: string | null;\n summary?: string | null;\n preview?: string | null;\n ownerEmail?: string | null;\n sourceId?: string | null;\n sourceLabel?: string | null;\n threadId?: string | null;\n runId?: string | null;\n status?: string | null;\n score?: number | null;\n reasons?:\n | string[]\n | Array<{\n code: string;\n label: string;\n score: number;\n evidenceCount: number;\n }>\n | null;\n signals?: string[] | null;\n latestRunStatus?: string | null;\n updatedAt?: number | string | null;\n startedAt?: number | string | null;\n completedAt?: number | string | null;\n evidence?: DreamEvidence[] | null;\n}\n\ninterface DreamSourceHealth {\n sourceId: string;\n label?: string | null;\n status: \"ok\" | \"timed_out\" | \"error\" | string;\n startedAt?: number | string | null;\n completedAt?: number | string | null;\n durationMs: number;\n timeoutMs?: number | null;\n inspectedThreadCount: number;\n candidateCount: number;\n errorCount: number;\n threadErrorCount?: number | null;\n message?: string | null;\n}\n\ninterface DreamDetail {\n dream?: DreamPass | null;\n report?: string | null;\n summary?: string | null;\n proposals?: DreamProposal[] | null;\n candidates?: CandidateRun[] | null;\n inspectedRuns?: CandidateRun[] | null;\n evidence?: DreamEvidence[] | null;\n [key: string]: unknown;\n}\n\ntype ListDreamsResponse =\n | DreamPass[]\n | {\n dreams?: DreamPass[];\n items?: DreamPass[];\n results?: DreamPass[];\n };\n\ntype ListCandidatesResponse =\n | CandidateRun[]\n | {\n candidates?: CandidateRun[];\n items?: CandidateRun[];\n results?: CandidateRun[];\n sources?: DreamSourceHealth[];\n sourceHealth?: DreamSourceHealth[];\n };\n\ntype GetDreamResponse = DreamDetail | null;\n\ninterface CreateDreamReportParams {\n sourceId?: string;\n sourceIds?: string[];\n allSources?: boolean;\n query?: string;\n ownerEmail?: string;\n limit?: number;\n sourceTimeoutMs?: number;\n sourceConcurrency?: number;\n sourceStartStaggerMs?: number;\n threadConcurrency?: number;\n threadTimeoutMs?: number;\n title?: string;\n}\n\ninterface CreateDreamReportResult {\n id?: string;\n dreamId?: string;\n dream?: DreamPass;\n}\n\ninterface ProposalMutationParams {\n id: string;\n reason?: string;\n}\n\ninterface DreamProposalPreview {\n operation?: \"create\" | \"update\" | \"append\" | string;\n targetExists?: boolean;\n currentContent?: string | null;\n proposedContent?: string | null;\n target?: {\n type?: string | null;\n path?: string | null;\n kind?: string | null;\n resourceId?: string | null;\n };\n approval?: {\n required?: boolean;\n policyEnabled?: boolean;\n willRequestApproval?: boolean;\n };\n}\n\nfunction normalizeArray<T>(value: unknown, keys: readonly string[]): T[] {\n if (Array.isArray(value)) return value as T[];\n if (!value || typeof value !== \"object\") return [];\n const record = value as Record<string, unknown>;\n for (const key of keys) {\n if (Array.isArray(record[key])) return record[key] as T[];\n }\n return [];\n}\n\nfunction normalizeSourceHealth(value: unknown): DreamSourceHealth[] {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n const record = value as Record<string, unknown>;\n if (Array.isArray(record.sources)) {\n return record.sources as DreamSourceHealth[];\n }\n if (Array.isArray(record.sourceHealth)) {\n return record.sourceHealth as DreamSourceHealth[];\n }\n return [];\n}\n\nfunction formatDate(value: number | string | null | undefined): string {\n if (value == null || value === \"\") return \"n/a\";\n const numeric = Number(value);\n const date = Number.isFinite(numeric) ? new Date(numeric) : new Date(value);\n if (Number.isNaN(date.getTime())) return \"n/a\";\n return date.toLocaleString();\n}\n\nfunction compactDate(value: number | string | null | undefined): string {\n if (value == null || value === \"\") return \"n/a\";\n const numeric = Number(value);\n const date = Number.isFinite(numeric) ? new Date(numeric) : new Date(value);\n if (Number.isNaN(date.getTime())) return \"n/a\";\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction json(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction plural(value: number, singular: string, pluralLabel = `${singular}s`) {\n return `${value} ${value === 1 ? singular : pluralLabel}`;\n}\n\nfunction dreamLabel(dream: DreamPass, index: number): string {\n return dream.title || `Dream pass ${index + 1}`;\n}\n\nfunction proposalTarget(proposal: DreamProposal): string {\n return (\n proposal.targetPath ||\n proposal.path ||\n proposal.target ||\n proposal.targetType ||\n proposal.type ||\n \"memory\"\n );\n}\n\nfunction evidenceLabel(evidence: DreamEvidence, index: number): string {\n return (\n evidence.label ||\n evidence.title ||\n evidence.threadTitle ||\n evidence.source ||\n evidence.threadId ||\n evidence.runId ||\n `Evidence ${index + 1}`\n );\n}\n\nfunction candidateLabel(candidate: CandidateRun): string {\n return (\n candidate.thread?.title ||\n candidate.title ||\n candidate.summary ||\n candidate.thread?.preview ||\n candidate.preview ||\n candidate.thread?.id ||\n candidate.threadId ||\n candidate.runId ||\n candidate.id ||\n \"candidate\"\n );\n}\n\nfunction candidateSignals(candidate: CandidateRun): string[] {\n const reasons = (candidate.reasons ?? []).map((reason) =>\n typeof reason === \"string\" ? reason : reason.label,\n );\n return [...reasons, ...(candidate.signals ?? [])].filter(Boolean);\n}\n\nfunction candidateId(candidate: CandidateRun): string {\n return (\n candidate.id ||\n candidate.thread?.id ||\n candidate.threadId ||\n candidate.runId ||\n candidateLabel(candidate)\n );\n}\n\nfunction candidateStatus(candidate: CandidateRun): string {\n return candidate.latestRunStatus || candidate.status || \"unknown\";\n}\n\nfunction candidateOwner(candidate: CandidateRun): string {\n return candidate.thread?.ownerEmail || candidate.ownerEmail || \"n/a\";\n}\n\nfunction candidateUpdatedAt(candidate: CandidateRun): number | string | null {\n return (\n candidate.updatedAt ||\n candidate.completedAt ||\n candidate.startedAt ||\n candidate.thread?.updatedAt ||\n null\n );\n}\n\nfunction dreamProposalCount(dream: DreamPass): number {\n return dream.proposalCount ?? dream.proposalCounts?.total ?? 0;\n}\n\nfunction dreamInspectedCount(dream: DreamPass): number {\n return dream.inspectedThreadCount ?? dream.inspectedRunCount ?? 0;\n}\n\nfunction resultDreamId(result: CreateDreamReportResult | null | undefined) {\n return result?.dream?.id || result?.dreamId || result?.id || null;\n}\n\nfunction statusVariant(status: DreamStatus | null | undefined) {\n const normalized = String(status || \"pending\").toLowerCase();\n if (normalized === \"failed\") return \"destructive\" as const;\n if (normalized === \"completed\" || normalized === \"applied\")\n return \"default\" as const;\n if (normalized === \"rejected\" || normalized === \"stale\")\n return \"outline\" as const;\n return \"secondary\" as const;\n}\n\nfunction sourceStatusVariant(status: string | null | undefined) {\n const normalized = String(status || \"ok\").toLowerCase();\n if (normalized === \"error\" || normalized === \"timed_out\") {\n return \"destructive\" as const;\n }\n return \"secondary\" as const;\n}\n\nfunction StatusBadge({ status }: { status?: DreamStatus | null }) {\n const normalized = String(status || \"pending\").toLowerCase();\n return (\n <Badge variant={statusVariant(status)} className=\"capitalize\">\n {normalized.replace(/_/g, \" \")}\n </Badge>\n );\n}\n\nfunction SourceHealthPanel({ sources }: { sources: DreamSourceHealth[] }) {\n if (sources.length === 0) return null;\n const unhealthyCount = sources.filter(\n (source) => String(source.status).toLowerCase() !== \"ok\",\n ).length;\n return (\n <Alert variant={unhealthyCount > 0 ? \"destructive\" : \"default\"}>\n <IconDatabase className=\"h-4 w-4\" />\n <AlertTitle>Source health</AlertTitle>\n <AlertDescription>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {sources.map((source) => (\n <Badge\n key={source.sourceId}\n variant={sourceStatusVariant(source.status)}\n className=\"gap-1\"\n title={\n source.message ||\n `${source.inspectedThreadCount} inspected, ${source.candidateCount} candidates, ${source.durationMs}ms of ${source.timeoutMs ?? \"n/a\"}ms`\n }\n >\n {source.label || source.sourceId}:{\" \"}\n {String(source.status).replace(/_/g, \" \")} · {source.durationMs}\n ms\n </Badge>\n ))}\n </div>\n </AlertDescription>\n </Alert>\n );\n}\n\nfunction isApprovalRequestResult(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n const result = record.result as Record<string, unknown> | undefined;\n return result?.approvalRequired === true;\n}\n\nfunction QueryState({ error, label }: { error: unknown; label: string }) {\n if (!error) return null;\n return (\n <Alert variant=\"destructive\">\n <IconAlertTriangle className=\"h-4 w-4\" />\n <AlertTitle>{label}</AlertTitle>\n <AlertDescription>\n {error instanceof Error ? error.message : String(error)}\n </AlertDescription>\n </Alert>\n );\n}\n\nfunction RawBlock({ value }: { value: unknown }) {\n return (\n <pre className=\"max-h-64 overflow-auto rounded-md border bg-muted/30 p-3 text-xs leading-relaxed text-foreground whitespace-pre-wrap break-words\">\n {typeof value === \"string\" ? value : json(value)}\n </pre>\n );\n}\n\nfunction EmptyPanel({\n title,\n description,\n}: {\n title: string;\n description: string;\n}) {\n return (\n <div className=\"rounded-lg border border-dashed bg-muted/20 px-4 py-8 text-center\">\n <div className=\"text-sm font-medium text-foreground\">{title}</div>\n <div className=\"mx-auto mt-1 max-w-md text-xs leading-relaxed text-muted-foreground\">\n {description}\n </div>\n </div>\n );\n}\n\nfunction DreamListSkeleton() {\n return (\n <div className=\"space-y-2\">\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border p-3\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"mt-2 h-3 w-full\" />\n <Skeleton className=\"mt-2 h-3 w-1/2\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction ProposalSkeleton() {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border p-4\">\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"mt-3 h-3 w-full\" />\n <Skeleton className=\"mt-2 h-3 w-3/4\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction StatTile({\n label,\n value,\n icon: Icon,\n}: {\n label: string;\n value: string | number;\n icon: typeof IconBrain;\n}) {\n return (\n <div className=\"rounded-lg border bg-card px-3 py-2.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {label}\n </div>\n <div className=\"mt-1 text-xl font-semibold tabular-nums text-foreground\">\n {value}\n </div>\n </div>\n <Icon size={18} className=\"text-muted-foreground\" />\n </div>\n </div>\n );\n}\n\nfunction DreamSettingsSheet({\n open,\n onOpenChange,\n draft,\n onDraftChange,\n onSave,\n saving,\n loading,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n draft: DreamSettingsDraft;\n onDraftChange: (draft: DreamSettingsDraft) => void;\n onSave: () => void;\n saving: boolean;\n loading: boolean;\n}) {\n const sourceIds = splitSourceIds(draft.sourceIdsText);\n const canSave = draft.schedule.trim().length > 0;\n\n function update<K extends keyof DreamSettingsDraft>(\n key: K,\n value: DreamSettingsDraft[K],\n ) {\n onDraftChange({ ...draft, [key]: value });\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetTrigger asChild>\n <Button variant=\"outline\" disabled={loading}>\n <IconSettings size={15} className=\"mr-1.5\" />\n Settings\n </Button>\n </SheetTrigger>\n <SheetContent className=\"flex w-full flex-col p-0 sm:max-w-2xl\">\n <SheetHeader className=\"border-b px-5 py-4\">\n <div className=\"flex flex-wrap items-center gap-2 pr-8\">\n <Badge variant={draft.enabled ? \"default\" : \"secondary\"}>\n {draft.enabled ? \"Enabled\" : \"Paused\"}\n </Badge>\n <Badge variant=\"outline\" className=\"font-mono\">\n {draft.schedule || \"No schedule\"}\n </Badge>\n </div>\n <SheetTitle className=\"mt-2 text-base\">Dream settings</SheetTitle>\n <SheetDescription>\n Configure recurring dream scope, schedule, and scan limits.\n </SheetDescription>\n </SheetHeader>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"space-y-6 p-5\">\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Schedule\n </div>\n <div className=\"flex items-center justify-between gap-4 rounded-lg border bg-muted/20 px-3 py-3\">\n <div>\n <Label htmlFor=\"dream-enabled\">Recurring dreams</Label>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Saved setting used by dream jobs.\n </div>\n </div>\n <Switch\n id=\"dream-enabled\"\n checked={draft.enabled}\n onCheckedChange={(checked) => update(\"enabled\", checked)}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-[minmax(0,1fr)_180px]\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-schedule\">Cron schedule</Label>\n <Input\n id=\"dream-schedule\"\n value={draft.schedule}\n onChange={(event) => update(\"schedule\", event.target.value)}\n placeholder=\"0 9 * * 1\"\n className=\"font-mono\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-min-candidates\">Min candidates</Label>\n <Input\n id=\"dream-min-candidates\"\n type=\"number\"\n min={0}\n max={50}\n value={draft.minCandidateCount}\n onChange={(event) =>\n update(\"minCandidateCount\", event.target.value)\n }\n />\n </div>\n </div>\n </section>\n\n <Separator />\n\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Sources\n </div>\n <div className=\"flex items-center justify-between gap-4 rounded-lg border bg-muted/20 px-3 py-3\">\n <div>\n <Label htmlFor=\"dream-all-sources\">All sources</Label>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Scan every connected thread-debug source.\n </div>\n </div>\n <Switch\n id=\"dream-all-sources\"\n checked={draft.allSources}\n onCheckedChange={(checked) => update(\"allSources\", checked)}\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-source-id\">Source ID</Label>\n <Input\n id=\"dream-source-id\"\n value={draft.sourceId}\n onChange={(event) => update(\"sourceId\", event.target.value)}\n disabled={draft.allSources || sourceIds.length > 0}\n placeholder=\"current\"\n className=\"font-mono\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-query\">Query</Label>\n <Input\n id=\"dream-query\"\n value={draft.query}\n onChange={(event) => update(\"query\", event.target.value)}\n placeholder=\"Optional search term\"\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-source-ids\">Explicit source IDs</Label>\n <Textarea\n id=\"dream-source-ids\"\n value={draft.sourceIdsText}\n onChange={(event) =>\n update(\"sourceIdsText\", event.target.value)\n }\n disabled={draft.allSources}\n rows={3}\n placeholder=\"One source ID per line\"\n className=\"font-mono\"\n />\n </div>\n </section>\n\n <Separator />\n\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Scan Limits\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-limit\">Candidate limit</Label>\n <Input\n id=\"dream-limit\"\n type=\"number\"\n min={1}\n max={50}\n value={draft.limit}\n onChange={(event) => update(\"limit\", event.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-source-timeout\">\n Source timeout ms\n </Label>\n <Input\n id=\"dream-source-timeout\"\n type=\"number\"\n min={1000}\n max={60000}\n value={draft.sourceTimeoutMs}\n onChange={(event) =>\n update(\"sourceTimeoutMs\", event.target.value)\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-source-concurrency\">\n Source concurrency\n </Label>\n <Input\n id=\"dream-source-concurrency\"\n type=\"number\"\n min={1}\n max={8}\n value={draft.sourceConcurrency}\n onChange={(event) =>\n update(\"sourceConcurrency\", event.target.value)\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-start-stagger\">Start stagger ms</Label>\n <Input\n id=\"dream-start-stagger\"\n type=\"number\"\n min={0}\n max={5000}\n value={draft.sourceStartStaggerMs}\n onChange={(event) =>\n update(\"sourceStartStaggerMs\", event.target.value)\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-thread-concurrency\">\n Thread concurrency\n </Label>\n <Input\n id=\"dream-thread-concurrency\"\n type=\"number\"\n min={1}\n max={10}\n value={draft.threadConcurrency}\n onChange={(event) =>\n update(\"threadConcurrency\", event.target.value)\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"dream-thread-timeout\">\n Thread timeout ms\n </Label>\n <Input\n id=\"dream-thread-timeout\"\n type=\"number\"\n min={1000}\n max={30000}\n value={draft.threadTimeoutMs}\n onChange={(event) =>\n update(\"threadTimeoutMs\", event.target.value)\n }\n />\n </div>\n </div>\n </section>\n </div>\n </ScrollArea>\n\n <SheetFooter className=\"gap-2 border-t px-5 py-4\">\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Close\n </Button>\n <Button disabled={!canSave || saving} onClick={onSave}>\n {saving ? <Spinner className=\"mr-1.5 size-3.5\" /> : null}\n Save settings\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction ProposalCard({\n proposal,\n applying,\n rejecting,\n onApply,\n onReject,\n}: {\n proposal: DreamProposal;\n applying: boolean;\n rejecting: boolean;\n onApply: () => void;\n onReject: (reason?: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [rejectReason, setRejectReason] = useState(\"\");\n const evidence = proposal.evidence ?? [];\n const sourceRunIds = proposal.sourceRunIds ?? [];\n const status = String(proposal.status || \"pending\").toLowerCase();\n const canAct = status === \"pending\";\n const needsApproval =\n proposal.targetType != null && proposal.targetType !== \"personal-memory\";\n const previewQuery = useActionQuery<DreamProposalPreview>(\n \"preview-dream-proposal\",\n { id: proposal.id },\n { enabled: open, staleTime: 0 },\n );\n const preview = previewQuery.data;\n\n return (\n <div className=\"rounded-lg border bg-card\">\n <div className=\"flex flex-col gap-3 border-b px-4 py-3 md:flex-row md:items-start md:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusBadge status={proposal.status} />\n <Badge variant=\"outline\" className=\"font-mono\">\n {proposalTarget(proposal)}\n </Badge>\n {proposal.risk ? (\n <Badge variant=\"secondary\" className=\"capitalize\">\n {proposal.risk} risk\n </Badge>\n ) : null}\n </div>\n <div className=\"mt-2 text-sm font-medium text-foreground\">\n {proposal.title || proposal.summary || proposal.id}\n </div>\n {proposal.summary && proposal.title ? (\n <div className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {proposal.summary}\n </div>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button size=\"sm\" variant={canAct ? \"default\" : \"outline\"}>\n <IconFileDiff size={14} className=\"mr-1.5\" />\n Review\n </Button>\n </SheetTrigger>\n <SheetContent className=\"flex w-full flex-col p-0 sm:max-w-3xl\">\n <SheetHeader className=\"border-b px-5 py-4\">\n <div className=\"flex flex-wrap items-center gap-2 pr-8\">\n <StatusBadge status={proposal.status} />\n <Badge variant=\"outline\" className=\"font-mono\">\n {preview?.target?.path || proposalTarget(proposal)}\n </Badge>\n <Badge variant=\"secondary\" className=\"capitalize\">\n {preview?.operation || \"review\"}\n </Badge>\n {preview?.approval?.willRequestApproval ? (\n <Badge variant=\"secondary\">Approval request</Badge>\n ) : null}\n </div>\n <SheetTitle className=\"mt-2 text-base\">\n {proposal.title || proposal.summary || proposal.id}\n </SheetTitle>\n <SheetDescription>\n {proposal.summary ||\n \"Review the target, evidence, and proposed content before applying this dream proposal.\"}\n </SheetDescription>\n </SheetHeader>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"space-y-5 p-5\">\n {previewQuery.error ? (\n <QueryState\n error={previewQuery.error}\n label=\"Could not preview proposal\"\n />\n ) : null}\n {previewQuery.isLoading ? <ProposalSkeleton /> : null}\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"rounded-lg border bg-muted/20 p-3\">\n <div className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Target\n </div>\n <div className=\"mt-1 break-all font-mono text-xs text-foreground\">\n {preview?.target?.path || proposalTarget(proposal)}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n <Badge variant=\"outline\">\n {preview?.target?.type ||\n proposal.targetType ||\n \"memory\"}\n </Badge>\n {preview?.targetExists ? (\n <Badge variant=\"secondary\">Existing target</Badge>\n ) : (\n <Badge variant=\"secondary\">New target</Badge>\n )}\n </div>\n </div>\n <div className=\"rounded-lg border bg-muted/20 p-3\">\n <div className=\"text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Review gate\n </div>\n <div className=\"mt-1 text-xs leading-relaxed text-foreground\">\n {preview?.approval?.willRequestApproval\n ? \"Applying will create a Dispatch approval request.\"\n : needsApproval\n ? \"Applying writes a shared/workspace resource because approvals are disabled.\"\n : \"Applying writes personal memory directly.\"}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {proposal.risk ? (\n <Badge variant=\"outline\" className=\"capitalize\">\n {proposal.risk} risk\n </Badge>\n ) : null}\n {proposal.confidence != null ? (\n <Badge variant=\"outline\">\n {proposal.confidence}% confidence\n </Badge>\n ) : null}\n </div>\n </div>\n </div>\n\n {proposal.rationale ? (\n <div>\n <div className=\"text-xs font-medium text-foreground\">\n Rationale\n </div>\n <div className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {proposal.rationale}\n </div>\n </div>\n ) : null}\n\n <Separator />\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <div>\n <div className=\"mb-2 text-xs font-medium text-foreground\">\n Current target\n </div>\n {preview?.currentContent ? (\n <RawBlock value={preview.currentContent} />\n ) : (\n <EmptyPanel\n title=\"No existing content\"\n description=\"This proposal would create a new target or append to an empty target.\"\n />\n )}\n </div>\n <div>\n <div className=\"mb-2 text-xs font-medium text-foreground\">\n Proposed content\n </div>\n <RawBlock\n value={preview?.proposedContent || proposal.content}\n />\n </div>\n </div>\n\n <Separator />\n\n <div>\n <div className=\"mb-2 text-xs font-medium text-foreground\">\n Evidence\n </div>\n {sourceRunIds.length > 0 ? (\n <div className=\"mb-2 flex flex-wrap gap-1.5\">\n {sourceRunIds.map((id) => (\n <Badge\n key={id}\n variant=\"outline\"\n className=\"font-mono\"\n >\n {id}\n </Badge>\n ))}\n </div>\n ) : null}\n {evidence.length > 0 ? (\n <div className=\"space-y-2\">\n {evidence.map((item, index) => (\n <div\n key={item.id || `${proposal.id}-review-${index}`}\n className=\"rounded-md border bg-muted/20 px-3 py-2\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-foreground\">\n {evidenceLabel(item, index)}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {formatDate(item.createdAt)}\n </div>\n </div>\n <div className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {item.quote ||\n item.snippet ||\n item.summary ||\n \"No text\"}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyPanel\n title=\"No structured evidence\"\n description=\"The proposal did not include compact evidence records.\"\n />\n )}\n </div>\n\n {canAct ? (\n <div className=\"space-y-2\">\n <Label htmlFor={`reject-${proposal.id}`}>\n Rejection reason\n </Label>\n <Textarea\n id={`reject-${proposal.id}`}\n value={rejectReason}\n onChange={(event) =>\n setRejectReason(event.target.value)\n }\n placeholder=\"Optional note for the audit log\"\n />\n </div>\n ) : null}\n </div>\n </ScrollArea>\n\n <SheetFooter className=\"gap-2 border-t px-5 py-4\">\n <Button\n variant=\"outline\"\n disabled={!canAct || applying || rejecting}\n onClick={() => {\n onReject(rejectReason.trim() || undefined);\n setOpen(false);\n }}\n >\n {rejecting ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <IconX size={14} className=\"mr-1.5\" />\n )}\n Reject\n </Button>\n <Button\n disabled={!canAct || applying || rejecting}\n onClick={() => {\n onApply();\n setOpen(false);\n }}\n >\n {applying ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <IconCheck size={14} className=\"mr-1.5\" />\n )}\n {needsApproval ? \"Request approval\" : \"Apply\"}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n </div>\n </div>\n\n <Accordion type=\"multiple\" className=\"px-4\">\n <AccordionItem value=\"evidence\" className=\"border-b-0\">\n <AccordionTrigger className=\"py-3 text-xs hover:no-underline\">\n Evidence and provenance\n </AccordionTrigger>\n <AccordionContent className=\"space-y-3 pb-4\">\n {sourceRunIds.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {sourceRunIds.map((id) => (\n <Badge key={id} variant=\"outline\" className=\"font-mono\">\n {id}\n </Badge>\n ))}\n </div>\n ) : null}\n {evidence.length > 0 ? (\n <div className=\"space-y-2\">\n {evidence.map((item, index) => (\n <div\n key={item.id || `${proposal.id}-evidence-${index}`}\n className=\"rounded-md border bg-muted/20 px-3 py-2\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-foreground\">\n {evidenceLabel(item, index)}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {formatDate(item.createdAt)}\n </div>\n </div>\n <div className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {item.quote || item.snippet || item.summary || \"No text\"}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-xs text-muted-foreground\">\n No structured evidence attached yet.\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n {proposal.content ? (\n <AccordionItem value=\"content\" className=\"border-b-0\">\n <AccordionTrigger className=\"py-3 text-xs hover:no-underline\">\n Proposed content\n </AccordionTrigger>\n <AccordionContent className=\"pb-4\">\n <RawBlock value={proposal.content} />\n </AccordionContent>\n </AccordionItem>\n ) : null}\n </Accordion>\n </div>\n );\n}\n\nexport default function DreamsRoute() {\n const [searchParams, setSearchParams] = useSearchParams();\n const [selectedDreamId, setSelectedDreamId] = useState<string | null>(\n searchParams.get(\"dreamId\"),\n );\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [settingsDraft, setSettingsDraft] = useState<DreamSettingsDraft>(() =>\n dreamSettingsToDraft(null),\n );\n\n const dreamsQuery = useActionQuery<ListDreamsResponse>(\n \"list-dreams\",\n { limit: 25 },\n { staleTime: 15_000 },\n );\n const candidatesQuery = useActionQuery<ListCandidatesResponse>(\n \"list-dream-candidates\",\n {\n limit: 25,\n sourceTimeoutMs: 30_000,\n sourceConcurrency: 2,\n sourceStartStaggerMs: 250,\n threadConcurrency: 3,\n threadTimeoutMs: 8_000,\n },\n { staleTime: 15_000 },\n );\n const dreamSettingsQuery = useActionQuery<DreamSettings>(\n \"get-dream-settings\",\n {},\n { staleTime: 30_000 },\n );\n const dreamDetailQuery = useActionQuery<GetDreamResponse>(\n \"get-dream\",\n { id: selectedDreamId ?? \"\" },\n { enabled: !!selectedDreamId, staleTime: 10_000 },\n );\n\n const dreams = useMemo(\n () =>\n normalizeArray<DreamPass>(dreamsQuery.data, [\n \"dreams\",\n \"items\",\n \"results\",\n ]),\n [dreamsQuery.data],\n );\n const candidates = useMemo(\n () =>\n normalizeArray<CandidateRun>(candidatesQuery.data, [\n \"candidates\",\n \"items\",\n \"results\",\n ]),\n [candidatesQuery.data],\n );\n const candidateSourceHealth = useMemo(\n () => normalizeSourceHealth(candidatesQuery.data),\n [candidatesQuery.data],\n );\n\n useEffect(() => {\n const urlDreamId = searchParams.get(\"dreamId\");\n if (urlDreamId && urlDreamId !== selectedDreamId) {\n setSelectedDreamId(urlDreamId);\n return;\n }\n if (selectedDreamId && dreams.some((dream) => dream.id === selectedDreamId))\n return;\n const nextId = dreams[0]?.id ?? null;\n setSelectedDreamId(nextId);\n if (nextId && nextId !== urlDreamId) {\n const next = new URLSearchParams(searchParams);\n next.set(\"dreamId\", nextId);\n setSearchParams(next, { replace: true });\n }\n }, [dreams, searchParams, selectedDreamId, setSearchParams]);\n\n function selectDream(dreamId: string) {\n setSelectedDreamId(dreamId);\n const next = new URLSearchParams(searchParams);\n next.set(\"dreamId\", dreamId);\n setSearchParams(next, { replace: true });\n }\n\n const createDream = useActionMutation<\n CreateDreamReportResult,\n CreateDreamReportParams\n >(\"create-dream-report\", {\n onSuccess: (result) => {\n const nextId = resultDreamId(result);\n if (nextId) selectDream(nextId);\n toast.success(\"Dream report created\");\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const applyProposal = useActionMutation<unknown, ProposalMutationParams>(\n \"apply-dream-proposal\",\n {\n onSuccess: (result) => {\n toast.success(\n isApprovalRequestResult(result)\n ? \"Approval requested\"\n : \"Proposal applied\",\n );\n dreamDetailQuery.refetch();\n dreamsQuery.refetch();\n },\n onError: (err) => toast.error(String(err)),\n },\n );\n\n const rejectProposal = useActionMutation<unknown, ProposalMutationParams>(\n \"reject-dream-proposal\",\n {\n onSuccess: () => {\n toast.success(\"Proposal rejected\");\n dreamDetailQuery.refetch();\n dreamsQuery.refetch();\n },\n onError: (err) => toast.error(String(err)),\n },\n );\n const ensureDreamSchedule = useActionMutation<\n unknown,\n Partial<DreamSettings>\n >(\"ensure-dream-job\", {\n onSuccess: () => {\n toast.success(\"Dream schedule updated\");\n dreamSettingsQuery.refetch();\n },\n onError: (err) => toast.error(String(err)),\n });\n const saveDreamSettings = useActionMutation<\n DreamSettings,\n Partial<DreamSettings>\n >(\"set-dream-settings\", {\n onSuccess: (settings) => {\n toast.success(\"Dream settings saved\");\n setSettingsDraft(dreamSettingsToDraft(settings));\n setSettingsOpen(false);\n dreamSettingsQuery.refetch();\n candidatesQuery.refetch();\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const detail = dreamDetailQuery.data ?? null;\n const dreamSettings = dreamSettingsQuery.data ?? null;\n const selectedDream =\n detail?.dream ?? dreams.find((dream) => dream.id === selectedDreamId);\n const proposals = detail?.proposals ?? [];\n const inspectedRuns = detail?.inspectedRuns ?? detail?.candidates ?? [];\n const selectedSourceHealth = selectedDream?.sourceHealth ?? [];\n const pendingProposalCount = proposals.filter(\n (proposal) =>\n String(proposal.status || \"pending\").toLowerCase() === \"pending\",\n ).length;\n const appliedProposalCount = proposals.filter(\n (proposal) => String(proposal.status || \"\").toLowerCase() === \"applied\",\n ).length;\n\n useEffect(() => {\n if (dreamSettings && !settingsOpen) {\n setSettingsDraft(dreamSettingsToDraft(dreamSettings));\n }\n }, [dreamSettings, settingsOpen]);\n\n function handleSettingsOpenChange(open: boolean) {\n if (open) {\n setSettingsDraft(dreamSettingsToDraft(dreamSettings));\n }\n setSettingsOpen(open);\n }\n\n function saveSettings() {\n const update = dreamSettingsUpdateFromDraft(settingsDraft);\n if (!update.schedule) {\n toast.error(\"Add a cron schedule before saving\");\n return;\n }\n saveDreamSettings.mutate(update);\n }\n\n function runDream(scanAllSources = false) {\n createDream.mutate({\n sourceId: scanAllSources ? \"all\" : \"current\",\n allSources: scanAllSources,\n limit: scanAllSources\n ? 8\n : candidates.length > 0\n ? candidates.length\n : 20,\n sourceTimeoutMs: dreamSettings?.sourceTimeoutMs ?? 30_000,\n sourceConcurrency: dreamSettings?.sourceConcurrency ?? 2,\n sourceStartStaggerMs: dreamSettings?.sourceStartStaggerMs ?? 250,\n threadConcurrency: dreamSettings?.threadConcurrency ?? 3,\n threadTimeoutMs: dreamSettings?.threadTimeoutMs ?? 8_000,\n });\n }\n\n function ensureSchedule() {\n ensureDreamSchedule.mutate({\n schedule: dreamSettings?.schedule,\n sourceId: dreamSettings?.sourceId ?? \"all\",\n sourceIds: dreamSettings?.sourceIds,\n allSources: dreamSettings?.allSources ?? true,\n query: dreamSettings?.query ?? undefined,\n limit: dreamSettings?.limit ?? 8,\n sourceTimeoutMs: dreamSettings?.sourceTimeoutMs ?? 30_000,\n sourceConcurrency: dreamSettings?.sourceConcurrency ?? 2,\n sourceStartStaggerMs: dreamSettings?.sourceStartStaggerMs ?? 250,\n threadConcurrency: dreamSettings?.threadConcurrency ?? 3,\n threadTimeoutMs: dreamSettings?.threadTimeoutMs ?? 8_000,\n minCandidateCount: dreamSettings?.minCandidateCount ?? 1,\n });\n }\n\n return (\n <DispatchShell\n title=\"Dreams\"\n description=\"Review agent runs, propose memory improvements, and apply evidence-backed learning changes.\"\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"grid flex-1 gap-2 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label=\"Dream passes\"\n value={dreams.length}\n icon={IconBrain}\n />\n <StatTile\n label=\"Pending proposals\"\n value={pendingProposalCount}\n icon={IconCircleDashed}\n />\n <StatTile\n label=\"Candidate runs\"\n value={candidates.length}\n icon={IconClock}\n />\n <StatTile\n label=\"Inspected threads\"\n value={selectedDream ? dreamInspectedCount(selectedDream) : 0}\n icon={IconCheck}\n />\n </div>\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n {dreamSettings ? (\n <Badge variant=\"outline\" className=\"h-9 px-3\">\n {dreamSettings.enabled ? \"Enabled\" : \"Paused\"} ·{\" \"}\n {dreamSettings.allSources\n ? \"All sources\"\n : dreamSettings.sourceId}{\" \"}\n · {dreamSettings.schedule}\n </Badge>\n ) : null}\n <DreamSettingsSheet\n open={settingsOpen}\n onOpenChange={handleSettingsOpenChange}\n draft={settingsDraft}\n onDraftChange={setSettingsDraft}\n onSave={saveSettings}\n saving={saveDreamSettings.isPending}\n loading={dreamSettingsQuery.isLoading}\n />\n <Button\n variant=\"outline\"\n onClick={() => {\n dreamsQuery.refetch();\n candidatesQuery.refetch();\n if (selectedDreamId) dreamDetailQuery.refetch();\n }}\n >\n <IconRefresh size={15} className=\"mr-1.5\" />\n Refresh\n </Button>\n <Button\n variant=\"outline\"\n onClick={ensureSchedule}\n disabled={ensureDreamSchedule.isPending}\n >\n {ensureDreamSchedule.isPending ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <IconCalendarTime size={15} className=\"mr-1.5\" />\n )}\n Ensure schedule\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => runDream(true)}\n disabled={createDream.isPending}\n >\n {createDream.isPending ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <IconDatabase size={15} className=\"mr-1.5\" />\n )}\n Run all sources\n </Button>\n <Button\n onClick={() => runDream(false)}\n disabled={createDream.isPending}\n >\n {createDream.isPending ? (\n <Spinner className=\"mr-1.5 size-3.5\" />\n ) : (\n <IconPlayerPlay size={15} className=\"mr-1.5\" />\n )}\n Run dream\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 xl:grid-cols-[280px_minmax(0,1fr)_380px]\">\n <section className=\"rounded-lg border bg-card\">\n <div className=\"border-b px-4 py-3\">\n <div className=\"text-sm font-semibold text-foreground\">\n Recent passes\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Reports generated from prior agent activity.\n </div>\n </div>\n <div className=\"max-h-[720px] overflow-auto p-3\">\n <QueryState\n error={dreamsQuery.error}\n label=\"Could not load dream passes\"\n />\n {dreamsQuery.isLoading ? <DreamListSkeleton /> : null}\n {!dreamsQuery.isLoading && !dreamsQuery.error ? (\n dreams.length > 0 ? (\n <div className=\"space-y-2\">\n {dreams.map((dream, index) => {\n const selected = dream.id === selectedDreamId;\n return (\n <button\n key={dream.id}\n type=\"button\"\n onClick={() => selectDream(dream.id)}\n className={cn(\n \"w-full rounded-lg border px-3 py-3 text-left transition-colors\",\n selected\n ? \"border-foreground bg-muted\"\n : \"bg-background hover:border-foreground/30 hover:bg-muted/40\",\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-foreground\">\n {dreamLabel(dream, index)}\n </div>\n <div className=\"mt-1 truncate font-mono text-[11px] text-muted-foreground\">\n {dream.id}\n </div>\n </div>\n <StatusBadge status={dream.status} />\n </div>\n <div className=\"mt-2 line-clamp-2 text-xs leading-relaxed text-muted-foreground\">\n {dream.summary || \"No summary yet.\"}\n </div>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n <Badge variant=\"outline\">\n {plural(dreamProposalCount(dream), \"proposal\")}\n </Badge>\n <Badge variant=\"outline\">\n {plural(dreamInspectedCount(dream), \"run\")}\n </Badge>\n </div>\n <div className=\"mt-2 text-[11px] text-muted-foreground\">\n {compactDate(\n dream.completedAt ??\n dream.updatedAt ??\n dream.startedAt ??\n dream.createdAt,\n )}\n </div>\n </button>\n );\n })}\n </div>\n ) : (\n <EmptyPanel\n title=\"No dreams yet\"\n description=\"Run the first dream pass to review recent agent history and generate proposed memory changes.\"\n />\n )\n ) : null}\n </div>\n </section>\n\n <section className=\"min-w-0 rounded-lg border bg-card\">\n <div className=\"border-b px-4 py-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-foreground\">\n {selectedDream\n ? selectedDream.title || selectedDream.id\n : \"Dream detail\"}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {selectedDream\n ? `Completed ${formatDate(\n selectedDream.completedAt ??\n selectedDream.updatedAt ??\n selectedDream.createdAt,\n )}`\n : \"Select a pass or run a new dream.\"}\n </div>\n </div>\n {selectedDream ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <StatusBadge status={selectedDream.status} />\n <Badge variant=\"outline\">\n {plural(appliedProposalCount, \"applied\", \"applied\")}\n </Badge>\n </div>\n ) : null}\n </div>\n </div>\n\n <div className=\"p-4\">\n <QueryState\n error={dreamDetailQuery.error}\n label=\"Could not load dream detail\"\n />\n {dreamDetailQuery.isLoading ? <ProposalSkeleton /> : null}\n {!selectedDreamId && !dreamDetailQuery.isLoading ? (\n <EmptyPanel\n title=\"Nothing selected\"\n description=\"Choose a recent dream pass or run one from candidate agent runs.\"\n />\n ) : null}\n {selectedDreamId &&\n !dreamDetailQuery.isLoading &&\n !dreamDetailQuery.error ? (\n <Tabs defaultValue=\"proposals\" className=\"w-full\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"proposals\">Proposals</TabsTrigger>\n <TabsTrigger value=\"report\">Report</TabsTrigger>\n <TabsTrigger value=\"sources\">Sources</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"proposals\" className=\"mt-4\">\n {proposals.length > 0 ? (\n <div className=\"space-y-3\">\n {proposals.map((proposal) => (\n <ProposalCard\n key={proposal.id}\n proposal={proposal}\n applying={\n applyProposal.isPending &&\n applyProposal.variables?.id === proposal.id\n }\n rejecting={\n rejectProposal.isPending &&\n rejectProposal.variables?.id === proposal.id\n }\n onApply={() =>\n applyProposal.mutate({\n id: proposal.id,\n })\n }\n onReject={(reason) =>\n rejectProposal.mutate({\n id: proposal.id,\n reason,\n })\n }\n />\n ))}\n </div>\n ) : (\n <EmptyPanel\n title=\"No proposals\"\n description=\"This dream did not produce reviewable memory, skill, job, or instruction changes.\"\n />\n )}\n </TabsContent>\n\n <TabsContent value=\"report\" className=\"mt-4\">\n {detail?.report || detail?.summary ? (\n <RawBlock value={detail.report || detail.summary || \"\"} />\n ) : (\n <EmptyPanel\n title=\"No report text\"\n description=\"The dream detail action did not return a report body.\"\n />\n )}\n </TabsContent>\n\n <TabsContent value=\"sources\" className=\"mt-4\">\n {selectedSourceHealth.length > 0 ? (\n <div className=\"mb-4\">\n <SourceHealthPanel sources={selectedSourceHealth} />\n </div>\n ) : null}\n {inspectedRuns.length > 0 || detail?.evidence?.length ? (\n <Accordion type=\"multiple\" className=\"rounded-lg border\">\n {inspectedRuns.map((run, index) => (\n <AccordionItem\n key={candidateId(run)}\n value={candidateId(run) || `run-${index}`}\n className=\"px-4\"\n >\n <AccordionTrigger className=\"text-sm hover:no-underline\">\n <span className=\"min-w-0 truncate text-left\">\n {candidateLabel(run)}\n </span>\n </AccordionTrigger>\n <AccordionContent className=\"pb-4\">\n <div className=\"grid gap-2 text-xs text-muted-foreground sm:grid-cols-2\">\n <div>\n Thread:{\" \"}\n <span className=\"font-mono text-foreground\">\n {run.thread?.id ?? run.threadId ?? \"n/a\"}\n </span>\n </div>\n <div>\n Run:{\" \"}\n <span className=\"font-mono text-foreground\">\n {run.runId ?? run.id}\n </span>\n </div>\n <div>Owner: {candidateOwner(run)}</div>\n <div>Status: {candidateStatus(run)}</div>\n </div>\n {candidateSignals(run).length > 0 ? (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {candidateSignals(run).map((signal) => (\n <Badge key={signal} variant=\"outline\">\n {signal}\n </Badge>\n ))}\n </div>\n ) : null}\n </AccordionContent>\n </AccordionItem>\n ))}\n {(detail?.evidence ?? []).map((item, index) => (\n <AccordionItem\n key={item.id || `evidence-${index}`}\n value={item.id || `evidence-${index}`}\n className=\"px-4\"\n >\n <AccordionTrigger className=\"text-sm hover:no-underline\">\n {evidenceLabel(item, index)}\n </AccordionTrigger>\n <AccordionContent className=\"pb-4\">\n <RawBlock value={item} />\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n ) : (\n <EmptyPanel\n title=\"No source runs\"\n description=\"This dream has no structured source list yet.\"\n />\n )}\n </TabsContent>\n </Tabs>\n ) : null}\n </div>\n </section>\n\n <section className=\"rounded-lg border bg-card\">\n <div className=\"border-b px-4 py-3\">\n <div>\n <div className=\"text-sm font-semibold text-foreground\">\n Candidate runs\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Grounded signals ready for review.\n </div>\n </div>\n </div>\n <div className=\"max-h-[720px] overflow-auto p-3\">\n <QueryState\n error={candidatesQuery.error}\n label=\"Could not load candidates\"\n />\n {candidatesQuery.isLoading ? <DreamListSkeleton /> : null}\n {!candidatesQuery.isLoading &&\n !candidatesQuery.error &&\n candidateSourceHealth.length > 0 ? (\n <div className=\"mb-3\">\n <SourceHealthPanel sources={candidateSourceHealth} />\n </div>\n ) : null}\n {!candidatesQuery.isLoading && !candidatesQuery.error ? (\n candidates.length > 0 ? (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Run</TableHead>\n <TableHead>Signals</TableHead>\n <TableHead className=\"w-20 text-right\">Score</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {candidates.map((candidate) => {\n const id = candidateId(candidate);\n const signals = candidateSignals(candidate);\n return (\n <TableRow key={id}>\n <TableCell className=\"min-w-0 py-3\">\n <div className=\"max-w-[230px] truncate text-sm font-medium text-foreground\">\n {candidateLabel(candidate)}\n </div>\n <div className=\"mt-1 truncate font-mono text-[11px] text-muted-foreground\">\n {candidate.thread?.id ??\n candidate.threadId ??\n candidate.runId ??\n id}\n </div>\n <div className=\"mt-1 text-[11px] text-muted-foreground\">\n {candidateOwner(candidate)} ·{\" \"}\n {compactDate(candidateUpdatedAt(candidate))}\n </div>\n </TableCell>\n <TableCell className=\"py-3\">\n <div className=\"mt-1 flex flex-wrap gap-1\">\n <Badge variant=\"outline\">\n {candidateStatus(candidate)}\n </Badge>\n {signals.slice(0, 2).map((signal) => (\n <Badge key={signal} variant=\"secondary\">\n {signal}\n </Badge>\n ))}\n </div>\n </TableCell>\n <TableCell className=\"py-3 text-right text-sm tabular-nums text-muted-foreground\">\n {candidate.score ?? \"n/a\"}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n ) : (\n <EmptyPanel\n title=\"No candidates\"\n description=\"No recent runs matched the dream candidate heuristics.\"\n />\n )\n ) : null}\n </div>\n </section>\n </div>\n </div>\n </DispatchShell>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/integrations.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/integrations.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,IAAI;;IAEnB;AAyRD,MAAM,CAAC,OAAO,UAAU,gBAAgB,4CAkIvC"}
|
|
@@ -11,6 +11,7 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "../../comp
|
|
|
11
11
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../../components/ui/dialog.js";
|
|
12
12
|
import { Input } from "../../components/ui/input.js";
|
|
13
13
|
import { Label } from "../../components/ui/label.js";
|
|
14
|
+
import { Tooltip, TooltipContent, TooltipTrigger, } from "../../components/ui/tooltip.js";
|
|
14
15
|
export function meta() {
|
|
15
16
|
return [{ title: "Connections — Dispatch" }];
|
|
16
17
|
}
|
|
@@ -33,7 +34,7 @@ function inferProviderFromKey(key, label) {
|
|
|
33
34
|
}
|
|
34
35
|
return "other";
|
|
35
36
|
}
|
|
36
|
-
function ConnectDialog({ service, open, onOpenChange, }) {
|
|
37
|
+
function ConnectDialog({ service, open, onOpenChange, accessMode, }) {
|
|
37
38
|
const [value, setValue] = useState("");
|
|
38
39
|
const qc = useQueryClient();
|
|
39
40
|
const createSecret = useActionMutation("create-vault-secret", {});
|
|
@@ -62,17 +63,19 @@ function ConnectDialog({ service, open, onOpenChange, }) {
|
|
|
62
63
|
if (!secretId) {
|
|
63
64
|
throw new Error("Secret created but id missing");
|
|
64
65
|
}
|
|
65
|
-
// 2.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
// 2. Manual mode needs grants; all-apps mode only needs sync.
|
|
67
|
+
if (accessMode === "manual") {
|
|
68
|
+
const targets = service.apps.filter((a) => !a.vaultGranted);
|
|
69
|
+
for (const app of targets) {
|
|
70
|
+
try {
|
|
71
|
+
await createGrant.mutateAsync({
|
|
72
|
+
secretId,
|
|
73
|
+
appId: app.appId,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
console.warn(`grant to ${app.appId} failed`, err);
|
|
78
|
+
}
|
|
76
79
|
}
|
|
77
80
|
}
|
|
78
81
|
for (const app of service.apps) {
|
|
@@ -103,11 +106,11 @@ function ConnectDialog({ service, open, onOpenChange, }) {
|
|
|
103
106
|
? service.apps[0].appName
|
|
104
107
|
: `${service.apps.length} apps`, ". Saved to the workspace vault and synced to every app that needs it."] })] }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Key" }), _jsx("div", { className: "font-mono text-sm", children: service.key })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "connector-value", children: "Value" }), _jsx(Input, { id: "connector-value", type: "password", autoComplete: "off", value: value, onChange: (e) => setValue(e.target.value), placeholder: `Paste your ${service.label} key…`, autoFocus: true })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: pending, children: "Cancel" }), _jsx(Button, { onClick: handleSave, disabled: pending || !value.trim(), children: pending ? "Saving…" : "Connect" })] })] }) }));
|
|
105
108
|
}
|
|
106
|
-
function ConnectorCard({ service }) {
|
|
109
|
+
function ConnectorCard({ service, accessMode, }) {
|
|
107
110
|
const [open, setOpen] = useState(false);
|
|
108
111
|
const isConnected = service.apps.some((a) => a.configured);
|
|
109
112
|
const appCount = service.apps.length;
|
|
110
|
-
return (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => setOpen(true), className: "group flex flex-col items-start gap-2 rounded-2xl border bg-card p-5 text-left transition hover:border-foreground/20 hover:bg-card/80 cursor-pointer", children: [_jsxs("div", { className: "flex w-full items-start justify-between gap-2", children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-xl bg-muted", children: _jsx(IconKey, { size: 16, className: "text-muted-foreground" }) }), isConnected ? (_jsxs(Badge, { variant: "secondary", className: "bg-green-500/10 text-green-700 dark:text-green-400 gap-1", children: [_jsx(IconCheck, { size: 12 }), "Connected"] })) : (_jsxs(Badge, { variant: "secondary", className: "bg-amber-500/10 text-amber-700 dark:text-amber-400 gap-1", children: [_jsx(IconCircleDashed, { size: 12 }), "Connect"] }))] }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-sm font-semibold text-foreground truncate", children: service.label }), _jsx("div", { className: "font-mono text-xs text-muted-foreground/80 truncate", children: service.key })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Used by ", appCount, " ", appCount === 1 ? "app" : "apps"] })] }), _jsx(ConnectDialog, { service: service, open: open, onOpenChange: setOpen })] }));
|
|
113
|
+
return (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => setOpen(true), className: "group flex flex-col items-start gap-2 rounded-2xl border bg-card p-5 text-left transition hover:border-foreground/20 hover:bg-card/80 cursor-pointer", children: [_jsxs("div", { className: "flex w-full items-start justify-between gap-2", children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-xl bg-muted", children: _jsx(IconKey, { size: 16, className: "text-muted-foreground" }) }), isConnected ? (_jsxs(Badge, { variant: "secondary", className: "bg-green-500/10 text-green-700 dark:text-green-400 gap-1", children: [_jsx(IconCheck, { size: 12 }), "Connected"] })) : (_jsxs(Badge, { variant: "secondary", className: "bg-amber-500/10 text-amber-700 dark:text-amber-400 gap-1", children: [_jsx(IconCircleDashed, { size: 12 }), "Connect"] }))] }), _jsxs("div", { className: "w-full min-w-0", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { className: "text-sm font-semibold text-foreground truncate", children: service.label }) }), _jsx(TooltipContent, { children: service.label })] }), _jsx("div", { className: "font-mono text-xs text-muted-foreground/80 truncate", children: service.key })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Used by ", appCount, " ", appCount === 1 ? "app" : "apps"] })] }), _jsx(ConnectDialog, { service: service, open: open, onOpenChange: setOpen, accessMode: accessMode })] }));
|
|
111
114
|
}
|
|
112
115
|
function PerAppDetailRow({ app }) {
|
|
113
116
|
const total = (app.integrations ?? []).length;
|
|
@@ -116,7 +119,9 @@ function PerAppDetailRow({ app }) {
|
|
|
116
119
|
}
|
|
117
120
|
export default function ConnectionsRoute() {
|
|
118
121
|
const { data: catalog, isLoading } = useActionQuery("list-integrations-catalog", {});
|
|
122
|
+
const { data: accessSettings } = useActionQuery("get-vault-access-settings", {});
|
|
119
123
|
const apps = catalog || [];
|
|
124
|
+
const accessMode = accessSettings?.mode === "manual" ? "manual" : "all-apps";
|
|
120
125
|
const services = useMemo(() => {
|
|
121
126
|
const map = new Map();
|
|
122
127
|
for (const app of apps) {
|
|
@@ -142,6 +147,6 @@ export default function ConnectionsRoute() {
|
|
|
142
147
|
}, [apps]);
|
|
143
148
|
const available = services.filter((s) => !s.apps.some((a) => a.configured));
|
|
144
149
|
const connected = services.filter((s) => s.apps.some((a) => a.configured));
|
|
145
|
-
return (_jsxs(DispatchShell, { title: "Connections", description: "Connect services once. Apps that need them pick up the key automatically.", children: [isLoading && services.length === 0 && (_jsx("div", { className: "rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground", children: "Discovering apps and credentials\u2026" })), !isLoading && services.length === 0 && (_jsx("div", { className: "rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground", children: "No apps with declared integrations are reachable yet." })), available.length > 0 && (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 flex items-baseline justify-between", children: [_jsx("h2", { className: "text-sm font-medium text-foreground", children: "Available to connect" }), _jsx("span", { className: "text-xs text-muted-foreground", children: available.length })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: available.map((service) => (_jsx(ConnectorCard, { service: service }, service.key))) })] })), connected.length > 0 && (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 mt-2 flex items-baseline justify-between", children: [_jsx("h2", { className: "text-sm font-medium text-foreground", children: "Connected" }), _jsx("span", { className: "text-xs text-muted-foreground", children: connected.length })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: connected.map((service) => (_jsx(ConnectorCard, { service: service }, service.key))) })] })), apps.length > 0 && (_jsxs(Collapsible, { className: "mt-6 rounded-2xl border bg-card", children: [_jsxs(CollapsibleTrigger, { className: "flex w-full items-center justify-between px-4 py-3 text-sm", children: [_jsxs("span", { className: "flex items-center gap-2 text-muted-foreground", children: [_jsx(IconPlugConnected, { size: 14 }), "Per-app status"] }), _jsx(IconChevronRight, { size: 14, className: "text-muted-foreground transition group-data-[state=open]:rotate-90" })] }), _jsxs(CollapsibleContent, { children: [_jsx("div", { className: "border-t", children: apps.map((app) => (_jsx(PerAppDetailRow, { app: app }, app.appId))) }), _jsxs("div", { className: "flex items-center justify-end gap-1.5 border-t px-4 py-2.5 text-xs text-muted-foreground", children: [_jsx(IconLink, { size: 12 }), _jsx("a", { href: "/vault", className: "hover:underline", children: "Open vault for advanced sharing" })] })] })] }))] }));
|
|
150
|
+
return (_jsxs(DispatchShell, { title: "Connections", description: "Connect services once. Apps that need them pick up the key automatically.", children: [isLoading && services.length === 0 && (_jsx("div", { className: "rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground", children: "Discovering apps and credentials\u2026" })), !isLoading && services.length === 0 && (_jsx("div", { className: "rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground", children: "No apps with declared integrations are reachable yet." })), available.length > 0 && (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 flex items-baseline justify-between", children: [_jsx("h2", { className: "text-sm font-medium text-foreground", children: "Available to connect" }), _jsx("span", { className: "text-xs text-muted-foreground", children: available.length })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: available.map((service) => (_jsx(ConnectorCard, { service: service, accessMode: accessMode }, service.key))) })] })), connected.length > 0 && (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 mt-2 flex items-baseline justify-between", children: [_jsx("h2", { className: "text-sm font-medium text-foreground", children: "Connected" }), _jsx("span", { className: "text-xs text-muted-foreground", children: connected.length })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: connected.map((service) => (_jsx(ConnectorCard, { service: service, accessMode: accessMode }, service.key))) })] })), apps.length > 0 && (_jsxs(Collapsible, { className: "mt-6 rounded-2xl border bg-card", children: [_jsxs(CollapsibleTrigger, { className: "flex w-full items-center justify-between px-4 py-3 text-sm", children: [_jsxs("span", { className: "flex items-center gap-2 text-muted-foreground", children: [_jsx(IconPlugConnected, { size: 14 }), "Per-app status"] }), _jsx(IconChevronRight, { size: 14, className: "text-muted-foreground transition group-data-[state=open]:rotate-90" })] }), _jsxs(CollapsibleContent, { children: [_jsx("div", { className: "border-t", children: apps.map((app) => (_jsx(PerAppDetailRow, { app: app }, app.appId))) }), _jsxs("div", { className: "flex items-center justify-end gap-1.5 border-t px-4 py-2.5 text-xs text-muted-foreground", children: [_jsx(IconLink, { size: 12 }), _jsx("a", { href: "/vault", className: "hover:underline", children: "Open vault for advanced sharing" })] })] })] }))] }));
|
|
146
151
|
}
|
|
147
152
|
//# sourceMappingURL=integrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/routes/pages/integrations.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAC/C,CAAC;AAoCD,SAAS,oBAAoB,CAAC,GAAW,EAAE,KAAa;IACtD,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI;QACrB,QAAQ;QACR,OAAO;QACP,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,MAAM;QACN,UAAU;QACV,WAAW;QACX,QAAQ;KACT,EAAE,CAAC;QACF,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;IACnD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,OAAO,EACP,IAAI,EACJ,YAAY,GAKb;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5B,MAAM,YAAY,GAAG,iBAAiB,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,iBAAiB,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAE7D,SAAS,KAAK;QACZ,QAAQ,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,KAAK,UAAU,UAAU;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,uEAAuE;YACvE,sEAAsE;YACtE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;gBAC7C,aAAa,EAAE,OAAO,CAAC,GAAG;gBAC1B,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;aAC3D,CAAC,CAAC;YACH,MAAM,QAAQ,GACX,OAAwC,EAAE,MAAM,EAAE,EAAE;gBACpD,OAA2B,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,8DAA8D;YAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC5D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,WAAW,CAAC;wBAC5B,QAAQ;wBACR,KAAK,EAAE,GAAG,CAAC,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,SAAS,EAAE,GAAG,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,SAAS,EAAE,GAAG,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,EAAE,CAAC,iBAAiB,CAAC;gBACnB,QAAQ,EAAE,CAAC,QAAQ,EAAE,2BAA2B,CAAC;aAClD,CAAC,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,EAAE,CAAC;QACV,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,IAAI,2BAA2B,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GACX,YAAY,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC;IAEzE,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,KAAK,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,YAED,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,MAAC,WAAW,2BAAU,OAAO,CAAC,KAAK,IAAe,EAClD,MAAC,iBAAiB,0BACR,GAAG,EACV,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oCACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO;oCACzB,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,6EAGf,IACP,EACf,eAAK,SAAS,EAAC,WAAW,aACxB,0BACE,KAAC,KAAK,IAAC,SAAS,EAAC,+BAA+B,oBAAY,EAC5D,cAAK,SAAS,EAAC,mBAAmB,YAAE,OAAO,CAAC,GAAG,GAAO,IAClD,EACN,0BACE,KAAC,KAAK,IAAC,OAAO,EAAC,iBAAiB,sBAAc,EAC9C,KAAC,KAAK,IACJ,EAAE,EAAC,iBAAiB,EACpB,IAAI,EAAC,UAAU,EACf,YAAY,EAAC,KAAK,EAClB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,cAAc,OAAO,CAAC,KAAK,OAAO,EAC/C,SAAS,SACT,IACE,IACF,EACN,MAAC,YAAY,eACX,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,QAAQ,EAAE,OAAO,uBAGV,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAC5D,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GACzB,IACI,IACD,GACT,CACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,OAAO,EAAwB;IACtD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAErC,OAAO,CACL,8BACE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5B,SAAS,EAAC,sJAAsJ,aAEhK,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,8DAA8D,YAC3E,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,GAAG,GACnD,EACL,WAAW,CAAC,CAAC,CAAC,CACb,MAAC,KAAK,IACJ,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,0DAA0D,aAEpE,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,iBAEjB,CACT,CAAC,CAAC,CAAC,CACF,MAAC,KAAK,IACJ,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,0DAA0D,aAEpE,KAAC,gBAAgB,IAAC,IAAI,EAAE,EAAE,GAAI,eAExB,CACT,IACG,EACN,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,gDAAgD,YAC5D,OAAO,CAAC,KAAK,GACV,EACN,cAAK,SAAS,EAAC,qDAAqD,YACjE,OAAO,CAAC,GAAG,GACR,IACF,EACN,eAAK,SAAS,EAAC,+BAA+B,yBACnC,QAAQ,OAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAC/C,IACC,EACT,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,GAAI,IACrE,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,GAAG,EAAuB;IACnD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACvE,OAAO,CACL,eAAK,SAAS,EAAC,yEAAyE,aACtF,eAAK,SAAS,EAAC,iCAAiC,aAC9C,cACE,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC,KAAK,EAAE,YAEpC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAChC,EACN,eAAM,SAAS,EAAC,kBAAkB,YAAE,GAAG,CAAC,OAAO,GAAQ,EACtD,CAAC,GAAG,CAAC,SAAS,IAAI,CACjB,eAAM,SAAS,EAAC,+BAA+B,wBAAe,CAC/D,IACG,EACN,eAAM,SAAS,EAAC,+BAA+B,YAC5C,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,GAC9C,IACH,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,CACjD,2BAA2B,EAC3B,EAAE,CACH,CAAC;IACF,MAAM,IAAI,GAAI,OAAwB,IAAI,EAAE,CAAC;IAE7C,MAAM,QAAQ,GAAG,OAAO,CAAY,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE;wBAChB,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,IAAI,EAAE,EAAE;qBACT,CAAC,CAAC;gBACL,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAC/B,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAE3E,OAAO,CACL,MAAC,aAAa,IACZ,KAAK,EAAC,aAAa,EACnB,WAAW,EAAC,2EAA2E,aAEtF,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CACrC,cAAK,SAAS,EAAC,uFAAuF,uDAEhG,CACP,EAEA,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CACtC,cAAK,SAAS,EAAC,uFAAuF,sEAEhG,CACP,EAEA,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CACvB,8BACE,eAAK,SAAS,EAAC,0CAA0C,aACvD,aAAI,SAAS,EAAC,qCAAqC,qCAE9C,EACL,eAAM,SAAS,EAAC,+BAA+B,YAC5C,SAAS,CAAC,MAAM,GACZ,IACH,EACN,cAAK,SAAS,EAAC,0CAA0C,YACtD,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC1B,KAAC,aAAa,IAAmB,OAAO,EAAE,OAAO,IAA7B,OAAO,CAAC,GAAG,CAAsB,CACtD,CAAC,GACE,IACE,CACX,EAEA,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CACvB,8BACE,eAAK,SAAS,EAAC,+CAA+C,aAC5D,aAAI,SAAS,EAAC,qCAAqC,0BAAe,EAClE,eAAM,SAAS,EAAC,+BAA+B,YAC5C,SAAS,CAAC,MAAM,GACZ,IACH,EACN,cAAK,SAAS,EAAC,0CAA0C,YACtD,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC1B,KAAC,aAAa,IAAmB,OAAO,EAAE,OAAO,IAA7B,OAAO,CAAC,GAAG,CAAsB,CACtD,CAAC,GACE,IACE,CACX,EAEA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAClB,MAAC,WAAW,IAAC,SAAS,EAAC,iCAAiC,aACtD,MAAC,kBAAkB,IAAC,SAAS,EAAC,4DAA4D,aACxF,gBAAM,SAAS,EAAC,+CAA+C,aAC7D,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,sBAE1B,EACP,KAAC,gBAAgB,IACf,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,oEAAoE,GAC9E,IACiB,EACrB,MAAC,kBAAkB,eACjB,cAAK,SAAS,EAAC,UAAU,YACtB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,KAAC,eAAe,IAAiB,GAAG,EAAE,GAAG,IAAnB,GAAG,CAAC,KAAK,CAAc,CAC9C,CAAC,GACE,EACN,eAAK,SAAS,EAAC,0FAA0F,aACvG,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,EACtB,YAAG,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,gDAExC,IACA,IACa,IACT,CACf,IACa,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { toast } from \"sonner\";\nimport {\n IconCheck,\n IconChevronRight,\n IconCircleDashed,\n IconKey,\n IconLink,\n IconPlugConnected,\n} from \"@tabler/icons-react\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\n\nexport function meta() {\n return [{ title: \"Connections — Dispatch\" }];\n}\n\ninterface AppRef {\n appId: string;\n appName: string;\n color: string;\n configured: boolean;\n vaultGranted: boolean;\n vaultSecretId?: string;\n}\n\ninterface Service {\n /** Credential key shared across apps (e.g. `OPENAI_API_KEY`). */\n key: string;\n /** Human label from the first app that declares it (`\"OpenAI\"`, `\"Stripe\"`). */\n label: string;\n /** Apps in the workspace that declare this credential. */\n apps: AppRef[];\n}\n\ninterface CatalogApp {\n appId: string;\n appName: string;\n color: string;\n url: string;\n reachable: boolean;\n integrations?: Array<{\n key: string;\n label: string;\n required: boolean;\n configured: boolean;\n vaultGranted: boolean;\n vaultSecretId?: string;\n }>;\n}\n\nfunction inferProviderFromKey(key: string, label: string): string {\n const haystack = `${key} ${label}`.toLowerCase();\n for (const provider of [\n \"google\",\n \"slack\",\n \"sendgrid\",\n \"github\",\n \"stripe\",\n \"hubspot\",\n \"jira\",\n \"bigquery\",\n \"anthropic\",\n \"openai\",\n ]) {\n if (haystack.includes(provider)) return provider;\n }\n return \"other\";\n}\n\nfunction ConnectDialog({\n service,\n open,\n onOpenChange,\n}: {\n service: Service;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const qc = useQueryClient();\n\n const createSecret = useActionMutation(\"create-vault-secret\", {});\n const createGrant = useActionMutation(\"create-vault-grant\", {});\n const syncToApp = useActionMutation(\"sync-vault-to-app\", {});\n\n function reset() {\n setValue(\"\");\n }\n\n async function handleSave() {\n const trimmed = value.trim();\n if (!trimmed) {\n toast.error(\"Enter a value to save\");\n return;\n }\n try {\n // 1. Create the secret (or get the existing one — server treats key as\n // the unique identifier). The server returns { secret: { id, ... } }.\n const created = await createSecret.mutateAsync({\n credentialKey: service.key,\n name: service.label,\n value: trimmed,\n provider: inferProviderFromKey(service.key, service.label),\n });\n const secretId =\n (created as { secret?: { id?: string } })?.secret?.id ??\n (created as { id?: string })?.id;\n if (!secretId) {\n throw new Error(\"Secret created but id missing\");\n }\n\n // 2. Grant + sync to every app that declared this credential.\n const targets = service.apps.filter((a) => !a.vaultGranted);\n for (const app of targets) {\n try {\n await createGrant.mutateAsync({\n secretId,\n appId: app.appId,\n });\n } catch (err) {\n console.warn(`grant to ${app.appId} failed`, err);\n }\n }\n for (const app of service.apps) {\n try {\n await syncToApp.mutateAsync({ appId: app.appId });\n } catch (err) {\n console.warn(`sync to ${app.appId} failed`, err);\n }\n }\n\n qc.invalidateQueries({\n queryKey: [\"action\", \"list-integrations-catalog\"],\n });\n toast.success(`Connected ${service.label}`);\n onOpenChange(false);\n reset();\n } catch (err: any) {\n toast.error(err?.message ?? \"Failed to save credential\");\n }\n }\n\n const pending =\n createSecret.isPending || createGrant.isPending || syncToApp.isPending;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (!next) reset();\n onOpenChange(next);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Connect {service.label}</DialogTitle>\n <DialogDescription>\n Used by{\" \"}\n {service.apps.length === 1\n ? service.apps[0].appName\n : `${service.apps.length} apps`}\n . Saved to the workspace vault and synced to every app that needs\n it.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div>\n <Label className=\"text-xs text-muted-foreground\">Key</Label>\n <div className=\"font-mono text-sm\">{service.key}</div>\n </div>\n <div>\n <Label htmlFor=\"connector-value\">Value</Label>\n <Input\n id=\"connector-value\"\n type=\"password\"\n autoComplete=\"off\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={`Paste your ${service.label} key…`}\n autoFocus\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={pending}\n >\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={pending || !value.trim()}>\n {pending ? \"Saving…\" : \"Connect\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ConnectorCard({ service }: { service: Service }) {\n const [open, setOpen] = useState(false);\n const isConnected = service.apps.some((a) => a.configured);\n const appCount = service.apps.length;\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"group flex flex-col items-start gap-2 rounded-2xl border bg-card p-5 text-left transition hover:border-foreground/20 hover:bg-card/80 cursor-pointer\"\n >\n <div className=\"flex w-full items-start justify-between gap-2\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-muted\">\n <IconKey size={16} className=\"text-muted-foreground\" />\n </div>\n {isConnected ? (\n <Badge\n variant=\"secondary\"\n className=\"bg-green-500/10 text-green-700 dark:text-green-400 gap-1\"\n >\n <IconCheck size={12} />\n Connected\n </Badge>\n ) : (\n <Badge\n variant=\"secondary\"\n className=\"bg-amber-500/10 text-amber-700 dark:text-amber-400 gap-1\"\n >\n <IconCircleDashed size={12} />\n Connect\n </Badge>\n )}\n </div>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-semibold text-foreground truncate\">\n {service.label}\n </div>\n <div className=\"font-mono text-xs text-muted-foreground/80 truncate\">\n {service.key}\n </div>\n </div>\n <div className=\"text-xs text-muted-foreground\">\n Used by {appCount} {appCount === 1 ? \"app\" : \"apps\"}\n </div>\n </button>\n <ConnectDialog service={service} open={open} onOpenChange={setOpen} />\n </>\n );\n}\n\nfunction PerAppDetailRow({ app }: { app: CatalogApp }) {\n const total = (app.integrations ?? []).length;\n const ok = (app.integrations ?? []).filter((i) => i.configured).length;\n return (\n <div className=\"flex items-center justify-between border-t px-4 py-2.5 first:border-t-0\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div\n className=\"h-5 w-5 rounded text-[10px] font-bold text-white flex items-center justify-center shrink-0\"\n style={{ backgroundColor: app.color }}\n >\n {app.appName.charAt(0).toUpperCase()}\n </div>\n <span className=\"text-sm truncate\">{app.appName}</span>\n {!app.reachable && (\n <span className=\"text-xs text-muted-foreground\">offline</span>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {total === 0 ? \"no integrations\" : `${ok}/${total}`}\n </span>\n </div>\n );\n}\n\nexport default function ConnectionsRoute() {\n const { data: catalog, isLoading } = useActionQuery(\n \"list-integrations-catalog\",\n {},\n );\n const apps = (catalog as CatalogApp[]) || [];\n\n const services = useMemo<Service[]>(() => {\n const map = new Map<string, Service>();\n for (const app of apps) {\n for (const intg of app.integrations ?? []) {\n if (!map.has(intg.key)) {\n map.set(intg.key, {\n key: intg.key,\n label: intg.label,\n apps: [],\n });\n }\n map.get(intg.key)!.apps.push({\n appId: app.appId,\n appName: app.appName,\n color: app.color,\n configured: intg.configured,\n vaultGranted: intg.vaultGranted,\n vaultSecretId: intg.vaultSecretId,\n });\n }\n }\n return Array.from(map.values()).sort((a, b) =>\n a.label.localeCompare(b.label),\n );\n }, [apps]);\n\n const available = services.filter((s) => !s.apps.some((a) => a.configured));\n const connected = services.filter((s) => s.apps.some((a) => a.configured));\n\n return (\n <DispatchShell\n title=\"Connections\"\n description=\"Connect services once. Apps that need them pick up the key automatically.\"\n >\n {isLoading && services.length === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n Discovering apps and credentials…\n </div>\n )}\n\n {!isLoading && services.length === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No apps with declared integrations are reachable yet.\n </div>\n )}\n\n {available.length > 0 && (\n <section>\n <div className=\"mb-3 flex items-baseline justify-between\">\n <h2 className=\"text-sm font-medium text-foreground\">\n Available to connect\n </h2>\n <span className=\"text-xs text-muted-foreground\">\n {available.length}\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {available.map((service) => (\n <ConnectorCard key={service.key} service={service} />\n ))}\n </div>\n </section>\n )}\n\n {connected.length > 0 && (\n <section>\n <div className=\"mb-3 mt-2 flex items-baseline justify-between\">\n <h2 className=\"text-sm font-medium text-foreground\">Connected</h2>\n <span className=\"text-xs text-muted-foreground\">\n {connected.length}\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {connected.map((service) => (\n <ConnectorCard key={service.key} service={service} />\n ))}\n </div>\n </section>\n )}\n\n {apps.length > 0 && (\n <Collapsible className=\"mt-6 rounded-2xl border bg-card\">\n <CollapsibleTrigger className=\"flex w-full items-center justify-between px-4 py-3 text-sm\">\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <IconPlugConnected size={14} />\n Per-app status\n </span>\n <IconChevronRight\n size={14}\n className=\"text-muted-foreground transition group-data-[state=open]:rotate-90\"\n />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {apps.map((app) => (\n <PerAppDetailRow key={app.appId} app={app} />\n ))}\n </div>\n <div className=\"flex items-center justify-end gap-1.5 border-t px-4 py-2.5 text-xs text-muted-foreground\">\n <IconLink size={12} />\n <a href=\"/vault\" className=\"hover:underline\">\n Open vault for advanced sharing\n </a>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DispatchShell>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/routes/pages/integrations.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { toast } from \"sonner\";\nimport {\n IconCheck,\n IconChevronRight,\n IconCircleDashed,\n IconKey,\n IconLink,\n IconPlugConnected,\n} from \"@tabler/icons-react\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nexport function meta() {\n return [{ title: \"Connections — Dispatch\" }];\n}\n\ninterface AppRef {\n appId: string;\n appName: string;\n color: string;\n configured: boolean;\n vaultGranted: boolean;\n vaultSecretId?: string;\n}\n\ninterface Service {\n /** Credential key shared across apps (e.g. `OPENAI_API_KEY`). */\n key: string;\n /** Human label from the first app that declares it (`\"OpenAI\"`, `\"Stripe\"`). */\n label: string;\n /** Apps in the workspace that declare this credential. */\n apps: AppRef[];\n}\n\ninterface CatalogApp {\n appId: string;\n appName: string;\n color: string;\n url: string;\n reachable: boolean;\n integrations?: Array<{\n key: string;\n label: string;\n required: boolean;\n configured: boolean;\n vaultGranted: boolean;\n vaultSecretId?: string;\n }>;\n}\n\nfunction inferProviderFromKey(key: string, label: string): string {\n const haystack = `${key} ${label}`.toLowerCase();\n for (const provider of [\n \"google\",\n \"slack\",\n \"sendgrid\",\n \"github\",\n \"stripe\",\n \"hubspot\",\n \"jira\",\n \"bigquery\",\n \"anthropic\",\n \"openai\",\n ]) {\n if (haystack.includes(provider)) return provider;\n }\n return \"other\";\n}\n\nfunction ConnectDialog({\n service,\n open,\n onOpenChange,\n accessMode,\n}: {\n service: Service;\n open: boolean;\n onOpenChange: (next: boolean) => void;\n accessMode: \"all-apps\" | \"manual\";\n}) {\n const [value, setValue] = useState(\"\");\n const qc = useQueryClient();\n\n const createSecret = useActionMutation(\"create-vault-secret\", {});\n const createGrant = useActionMutation(\"create-vault-grant\", {});\n const syncToApp = useActionMutation(\"sync-vault-to-app\", {});\n\n function reset() {\n setValue(\"\");\n }\n\n async function handleSave() {\n const trimmed = value.trim();\n if (!trimmed) {\n toast.error(\"Enter a value to save\");\n return;\n }\n try {\n // 1. Create the secret (or get the existing one — server treats key as\n // the unique identifier). The server returns { secret: { id, ... } }.\n const created = await createSecret.mutateAsync({\n credentialKey: service.key,\n name: service.label,\n value: trimmed,\n provider: inferProviderFromKey(service.key, service.label),\n });\n const secretId =\n (created as { secret?: { id?: string } })?.secret?.id ??\n (created as { id?: string })?.id;\n if (!secretId) {\n throw new Error(\"Secret created but id missing\");\n }\n\n // 2. Manual mode needs grants; all-apps mode only needs sync.\n if (accessMode === \"manual\") {\n const targets = service.apps.filter((a) => !a.vaultGranted);\n for (const app of targets) {\n try {\n await createGrant.mutateAsync({\n secretId,\n appId: app.appId,\n });\n } catch (err) {\n console.warn(`grant to ${app.appId} failed`, err);\n }\n }\n }\n for (const app of service.apps) {\n try {\n await syncToApp.mutateAsync({ appId: app.appId });\n } catch (err) {\n console.warn(`sync to ${app.appId} failed`, err);\n }\n }\n\n qc.invalidateQueries({\n queryKey: [\"action\", \"list-integrations-catalog\"],\n });\n toast.success(`Connected ${service.label}`);\n onOpenChange(false);\n reset();\n } catch (err: any) {\n toast.error(err?.message ?? \"Failed to save credential\");\n }\n }\n\n const pending =\n createSecret.isPending || createGrant.isPending || syncToApp.isPending;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n if (!next) reset();\n onOpenChange(next);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Connect {service.label}</DialogTitle>\n <DialogDescription>\n Used by{\" \"}\n {service.apps.length === 1\n ? service.apps[0].appName\n : `${service.apps.length} apps`}\n . Saved to the workspace vault and synced to every app that needs\n it.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div>\n <Label className=\"text-xs text-muted-foreground\">Key</Label>\n <div className=\"font-mono text-sm\">{service.key}</div>\n </div>\n <div>\n <Label htmlFor=\"connector-value\">Value</Label>\n <Input\n id=\"connector-value\"\n type=\"password\"\n autoComplete=\"off\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={`Paste your ${service.label} key…`}\n autoFocus\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={pending}\n >\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={pending || !value.trim()}>\n {pending ? \"Saving…\" : \"Connect\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ConnectorCard({\n service,\n accessMode,\n}: {\n service: Service;\n accessMode: \"all-apps\" | \"manual\";\n}) {\n const [open, setOpen] = useState(false);\n const isConnected = service.apps.some((a) => a.configured);\n const appCount = service.apps.length;\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"group flex flex-col items-start gap-2 rounded-2xl border bg-card p-5 text-left transition hover:border-foreground/20 hover:bg-card/80 cursor-pointer\"\n >\n <div className=\"flex w-full items-start justify-between gap-2\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-muted\">\n <IconKey size={16} className=\"text-muted-foreground\" />\n </div>\n {isConnected ? (\n <Badge\n variant=\"secondary\"\n className=\"bg-green-500/10 text-green-700 dark:text-green-400 gap-1\"\n >\n <IconCheck size={12} />\n Connected\n </Badge>\n ) : (\n <Badge\n variant=\"secondary\"\n className=\"bg-amber-500/10 text-amber-700 dark:text-amber-400 gap-1\"\n >\n <IconCircleDashed size={12} />\n Connect\n </Badge>\n )}\n </div>\n <div className=\"w-full min-w-0\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"text-sm font-semibold text-foreground truncate\">\n {service.label}\n </div>\n </TooltipTrigger>\n <TooltipContent>{service.label}</TooltipContent>\n </Tooltip>\n <div className=\"font-mono text-xs text-muted-foreground/80 truncate\">\n {service.key}\n </div>\n </div>\n <div className=\"text-xs text-muted-foreground\">\n Used by {appCount} {appCount === 1 ? \"app\" : \"apps\"}\n </div>\n </button>\n <ConnectDialog\n service={service}\n open={open}\n onOpenChange={setOpen}\n accessMode={accessMode}\n />\n </>\n );\n}\n\nfunction PerAppDetailRow({ app }: { app: CatalogApp }) {\n const total = (app.integrations ?? []).length;\n const ok = (app.integrations ?? []).filter((i) => i.configured).length;\n return (\n <div className=\"flex items-center justify-between border-t px-4 py-2.5 first:border-t-0\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div\n className=\"h-5 w-5 rounded text-[10px] font-bold text-white flex items-center justify-center shrink-0\"\n style={{ backgroundColor: app.color }}\n >\n {app.appName.charAt(0).toUpperCase()}\n </div>\n <span className=\"text-sm truncate\">{app.appName}</span>\n {!app.reachable && (\n <span className=\"text-xs text-muted-foreground\">offline</span>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {total === 0 ? \"no integrations\" : `${ok}/${total}`}\n </span>\n </div>\n );\n}\n\nexport default function ConnectionsRoute() {\n const { data: catalog, isLoading } = useActionQuery(\n \"list-integrations-catalog\",\n {},\n );\n const { data: accessSettings } = useActionQuery(\n \"get-vault-access-settings\",\n {},\n );\n const apps = (catalog as CatalogApp[]) || [];\n const accessMode =\n (accessSettings as any)?.mode === \"manual\" ? \"manual\" : \"all-apps\";\n\n const services = useMemo<Service[]>(() => {\n const map = new Map<string, Service>();\n for (const app of apps) {\n for (const intg of app.integrations ?? []) {\n if (!map.has(intg.key)) {\n map.set(intg.key, {\n key: intg.key,\n label: intg.label,\n apps: [],\n });\n }\n map.get(intg.key)!.apps.push({\n appId: app.appId,\n appName: app.appName,\n color: app.color,\n configured: intg.configured,\n vaultGranted: intg.vaultGranted,\n vaultSecretId: intg.vaultSecretId,\n });\n }\n }\n return Array.from(map.values()).sort((a, b) =>\n a.label.localeCompare(b.label),\n );\n }, [apps]);\n\n const available = services.filter((s) => !s.apps.some((a) => a.configured));\n const connected = services.filter((s) => s.apps.some((a) => a.configured));\n\n return (\n <DispatchShell\n title=\"Connections\"\n description=\"Connect services once. Apps that need them pick up the key automatically.\"\n >\n {isLoading && services.length === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n Discovering apps and credentials…\n </div>\n )}\n\n {!isLoading && services.length === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No apps with declared integrations are reachable yet.\n </div>\n )}\n\n {available.length > 0 && (\n <section>\n <div className=\"mb-3 flex items-baseline justify-between\">\n <h2 className=\"text-sm font-medium text-foreground\">\n Available to connect\n </h2>\n <span className=\"text-xs text-muted-foreground\">\n {available.length}\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {available.map((service) => (\n <ConnectorCard\n key={service.key}\n service={service}\n accessMode={accessMode}\n />\n ))}\n </div>\n </section>\n )}\n\n {connected.length > 0 && (\n <section>\n <div className=\"mb-3 mt-2 flex items-baseline justify-between\">\n <h2 className=\"text-sm font-medium text-foreground\">Connected</h2>\n <span className=\"text-xs text-muted-foreground\">\n {connected.length}\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {connected.map((service) => (\n <ConnectorCard\n key={service.key}\n service={service}\n accessMode={accessMode}\n />\n ))}\n </div>\n </section>\n )}\n\n {apps.length > 0 && (\n <Collapsible className=\"mt-6 rounded-2xl border bg-card\">\n <CollapsibleTrigger className=\"flex w-full items-center justify-between px-4 py-3 text-sm\">\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <IconPlugConnected size={14} />\n Per-app status\n </span>\n <IconChevronRight\n size={14}\n className=\"text-muted-foreground transition group-data-[state=open]:rotate-90\"\n />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {apps.map((app) => (\n <PerAppDetailRow key={app.appId} app={app} />\n ))}\n </div>\n <div className=\"flex items-center justify-end gap-1.5 border-t px-4 py-2.5 text-xs text-muted-foreground\">\n <IconLink size={12} />\n <a href=\"/vault\" className=\"hover:underline\">\n Open vault for advanced sharing\n </a>\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n </DispatchShell>\n );\n}\n"]}
|
|
@@ -5,6 +5,6 @@ export function meta() {
|
|
|
5
5
|
return [{ title: "New App — Dispatch" }];
|
|
6
6
|
}
|
|
7
7
|
export default function NewAppRoute() {
|
|
8
|
-
return (_jsx(DispatchShell, { title: "New App", description: "Create a workspace app from a prompt and
|
|
8
|
+
return (_jsx(DispatchShell, { title: "New App", description: "Create a workspace app from a prompt and apply the workspace vault policy.", children: _jsx(NewWorkspaceAppFlow, { sourceApp: "dispatch", className: "px-0 py-0" }) }));
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=new-app.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-app.js","sourceRoot":"","sources":["../../../src/routes/pages/new-app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,SAAS,EACf,WAAW,EAAC,
|
|
1
|
+
{"version":3,"file":"new-app.js","sourceRoot":"","sources":["../../../src/routes/pages/new-app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAC,SAAS,EACf,WAAW,EAAC,4EAA4E,YAExF,KAAC,mBAAmB,IAAC,SAAS,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,GAAG,GACpD,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { NewWorkspaceAppFlow } from \"@agent-native/core/client\";\nimport { DispatchShell } from \"@/components/dispatch-shell\";\n\nexport function meta() {\n return [{ title: \"New App — Dispatch\" }];\n}\n\nexport default function NewAppRoute() {\n return (\n <DispatchShell\n title=\"New App\"\n description=\"Create a workspace app from a prompt and apply the workspace vault policy.\"\n >\n <NewWorkspaceAppFlow sourceApp=\"dispatch\" className=\"px-0 py-0\" />\n </DispatchShell>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/overview.tsx"],"names":[],"mappings":"AAmcA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/overview.tsx"],"names":[],"mappings":"AAmcA,wBAAgB,IAAI;;IAEnB;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,4CA4RpC"}
|
|
@@ -197,7 +197,11 @@ export default function OverviewRoute() {
|
|
|
197
197
|
},
|
|
198
198
|
];
|
|
199
199
|
const hasIncompleteSteps = steps.some((s) => !s.complete && !s.informational);
|
|
200
|
-
return (_jsxs(DispatchShell, { title: "Overview", description: "Create apps, manage shared keys, and route work across your workspace.", children: [_jsx(HomeChatPanel, {}), _jsx(WorkspaceAppsSection, { apps: typedWorkspaceApps, isLoading: appsLoading }), hasIncompleteSteps && (_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconRocket, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Getting started" })] }), _jsx("div", { className: "space-y-2", children: steps.map((step) => (_jsx(StepRow, { step: step }, step.number))) })] })), _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconActivity, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: "At a glance" })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4", children: [_jsx(StatCard, { label: "Vault secrets", help: "Credentials stored in the workspace vault.
|
|
200
|
+
return (_jsxs(DispatchShell, { title: "Overview", description: "Create apps, manage shared keys, and route work across your workspace.", children: [_jsx(HomeChatPanel, {}), _jsx(WorkspaceAppsSection, { apps: typedWorkspaceApps, isLoading: appsLoading }), hasIncompleteSteps && (_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconRocket, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Getting started" })] }), _jsx("div", { className: "space-y-2", children: steps.map((step) => (_jsx(StepRow, { step: step }, step.number))) })] })), _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(IconActivity, { size: 16, className: "text-muted-foreground" }), _jsx("h2", { className: "text-sm font-semibold text-foreground", children: "At a glance" })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4", children: [_jsx(StatCard, { label: "Vault secrets", help: "Credentials stored in the workspace vault.", value: data?.vault?.secretCount || 0, icon: IconKey, cta: (data?.vault?.secretCount || 0) === 0 ? (_jsx(Button, { variant: "outline", size: "sm", asChild: true, children: _jsx(Link, { to: "/vault", children: "Set up vault" }) })) : undefined }), _jsx(StatCard, { label: data?.vault?.accessMode === "manual"
|
|
201
|
+
? "Active grants"
|
|
202
|
+
: "Accessible keys", help: data?.vault?.accessMode === "manual"
|
|
203
|
+
? "Secrets currently granted to apps. Sync them to push credentials."
|
|
204
|
+
: "Vault keys available to every workspace app.", value: data?.vault?.activeGrantCount || 0, icon: IconShieldCheck }), _jsx(StatCard, { label: "Destinations", help: "Saved outbound targets used for proactive sends and scheduled jobs.", value: counts.destinations, icon: IconArrowUpRight, cta: counts.destinations === 0 ? (_jsx(Button, { variant: "outline", size: "sm", asChild: true, children: _jsx(Link, { to: "/destinations", children: "Set up destinations" }) })) : undefined }), _jsx(StatCard, { label: "Agents", help: "Agents available to dispatch for delegation over A2A. This includes the built-in app suite plus any additional agents you add.", value: connectedAgentCount, icon: IconPlugConnected, cta: connectedAgentCount === 0 ? (_jsx(Button, { variant: "outline", size: "sm", asChild: true, children: _jsx(Link, { to: "/agents", children: "Open agents" }) })) : undefined })] })] }), _jsxs("details", { className: "rounded-xl border", children: [_jsxs("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-3 px-5 py-4 text-sm font-semibold text-foreground hover:bg-muted/30 [&::-webkit-details-marker]:hidden", children: [_jsx("span", { children: "Operations detail" }), _jsx("span", { className: "text-xs font-normal text-muted-foreground", children: "Queue, audit, and approvals" })] }), _jsxs("div", { className: "space-y-5 border-t px-5 py-5", children: [_jsx(TaskQueueSection, { stats: taskQueueStats }), _jsxs("div", { className: "grid gap-4 xl:grid-cols-3", children: [_jsxs("section", { className: "rounded-2xl border bg-card p-5 xl:col-span-2", children: [_jsx("div", { className: "flex items-center justify-between", children: _jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Recent activity" }) }), _jsx(RecentActivityList, { isLoading: isLoading, events: data?.recentAudit ?? [] })] }), _jsxs("section", { className: "rounded-2xl border bg-card p-5", children: [_jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Approval mode" }), _jsxs("div", { className: "mt-4 rounded-xl border bg-muted/30 p-4", children: [_jsx("div", { className: "text-sm font-medium text-muted-foreground", children: "Current policy" }), _jsx("div", { className: "mt-2 text-2xl font-semibold text-foreground", children: data?.settings?.enabled ? "Reviewed" : "Immediate" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: data?.settings?.enabled
|
|
201
205
|
? "Changes wait for approval before they apply."
|
|
202
206
|
: "Changes apply immediately and are recorded in audit." })] }), _jsxs("div", { className: "mt-4 space-y-2", children: [(data?.recentApprovals || []).map((approval) => (_jsxs("div", { className: "rounded-xl border px-4 py-3", children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: approval.summary }), _jsxs("div", { className: "mt-1 text-xs text-muted-foreground", children: [approval.status, " \u00B7 requested by ", approval.requestedBy] })] }, approval.id))), (data?.recentApprovals?.length || 0) === 0 && (_jsx("div", { className: "rounded-xl border border-dashed px-4 py-6 text-sm text-muted-foreground", children: "No approval requests." }))] })] })] })] })] })] }));
|
|
203
207
|
}
|