@agent-native/dispatch 0.14.3 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -128
- package/dist/actions/list_apps.d.ts +1 -0
- package/dist/actions/list_apps.js +16 -8
- package/dist/actions/list_apps.js.map +1 -1
- package/dist/actions/set-mcp-app-access.js +1 -4
- package/dist/actions/set-mcp-app-access.js.map +1 -1
- package/dist/components/action-query-error.d.ts +8 -0
- package/dist/components/action-query-error.d.ts.map +1 -0
- package/dist/components/action-query-error.js +10 -0
- package/dist/components/action-query-error.js.map +1 -0
- package/dist/components/app-keys-popover.d.ts +4 -0
- package/dist/components/app-keys-popover.d.ts.map +1 -1
- package/dist/components/app-keys-popover.js +26 -14
- package/dist/components/app-keys-popover.js.map +1 -1
- package/dist/components/dispatch-control-plane.d.ts.map +1 -1
- package/dist/components/dispatch-control-plane.js +31 -27
- package/dist/components/dispatch-control-plane.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +1 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +19 -21
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/ui/sheet.js +1 -1
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/toast.js +1 -1
- package/dist/components/ui/toast.js.map +1 -1
- package/dist/components/workspace-app-card.d.ts.map +1 -1
- package/dist/components/workspace-app-card.js +8 -5
- package/dist/components/workspace-app-card.js.map +1 -1
- package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -1
- package/dist/components/workspace-resource-effective-stack.js +6 -1
- package/dist/components/workspace-resource-effective-stack.js.map +1 -1
- package/dist/components/workspace-resource-impact-preview.d.ts.map +1 -1
- package/dist/components/workspace-resource-impact-preview.js +6 -1
- package/dist/components/workspace-resource-impact-preview.js.map +1 -1
- package/dist/routes/pages/$appId.d.ts.map +1 -1
- package/dist/routes/pages/$appId.js +6 -1
- package/dist/routes/pages/$appId.js.map +1 -1
- package/dist/routes/pages/agents.d.ts.map +1 -1
- package/dist/routes/pages/agents.js +5 -8
- package/dist/routes/pages/agents.js.map +1 -1
- package/dist/routes/pages/approval.d.ts.map +1 -1
- package/dist/routes/pages/approval.js +6 -1
- package/dist/routes/pages/approval.js.map +1 -1
- package/dist/routes/pages/approvals.d.ts.map +1 -1
- package/dist/routes/pages/approvals.js +8 -5
- package/dist/routes/pages/approvals.js.map +1 -1
- package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
- package/dist/routes/pages/apps.$appId.js +4 -2
- package/dist/routes/pages/apps.$appId.js.map +1 -1
- package/dist/routes/pages/apps.d.ts.map +1 -1
- package/dist/routes/pages/apps.js +9 -3
- package/dist/routes/pages/apps.js.map +1 -1
- package/dist/routes/pages/audit.d.ts.map +1 -1
- package/dist/routes/pages/audit.js +4 -2
- package/dist/routes/pages/audit.js.map +1 -1
- package/dist/routes/pages/chat.d.ts.map +1 -1
- package/dist/routes/pages/chat.js +16 -2
- package/dist/routes/pages/chat.js.map +1 -1
- package/dist/routes/pages/destinations.d.ts.map +1 -1
- package/dist/routes/pages/destinations.js +5 -3
- package/dist/routes/pages/destinations.js.map +1 -1
- package/dist/routes/pages/identities.d.ts.map +1 -1
- package/dist/routes/pages/identities.js +5 -3
- package/dist/routes/pages/identities.js.map +1 -1
- package/dist/routes/pages/integrations.d.ts.map +1 -1
- package/dist/routes/pages/integrations.js +9 -3
- package/dist/routes/pages/integrations.js.map +1 -1
- package/dist/routes/pages/thread-debug.d.ts.map +1 -1
- package/dist/routes/pages/thread-debug.js +7 -6
- package/dist/routes/pages/thread-debug.js.map +1 -1
- package/dist/routes/pages/vault.d.ts.map +1 -1
- package/dist/routes/pages/vault.js +23 -7
- 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 +9 -3
- package/dist/routes/pages/workspace.js.map +1 -1
- package/dist/server/lib/dispatch-store.d.ts.map +1 -1
- package/dist/server/lib/dispatch-store.js +2 -2
- package/dist/server/lib/dispatch-store.js.map +1 -1
- package/dist/server/lib/mcp-access-store.d.ts.map +1 -1
- package/dist/server/lib/mcp-access-store.js +30 -2
- package/dist/server/lib/mcp-access-store.js.map +1 -1
- package/dist/server/plugins/agent-chat.d.ts +1 -1
- package/package.json +2 -2
- package/src/actions/list_apps.spec.ts +52 -0
- package/src/actions/list_apps.ts +16 -8
- package/src/actions/set-mcp-app-access.spec.ts +73 -0
- package/src/actions/set-mcp-app-access.ts +1 -5
- package/src/components/action-query-error.spec.tsx +56 -0
- package/src/components/action-query-error.tsx +32 -0
- package/src/components/app-keys-popover.spec.tsx +85 -0
- package/src/components/app-keys-popover.tsx +76 -50
- package/src/components/dispatch-control-plane.spec.tsx +106 -0
- package/src/components/dispatch-control-plane.tsx +71 -115
- package/src/components/index.ts +1 -0
- package/src/components/layout/Layout.spec.tsx +42 -2
- package/src/components/layout/Layout.tsx +22 -27
- package/src/components/ui/sheet.tsx +1 -1
- package/src/components/ui/toast.tsx +1 -1
- package/src/components/workspace-app-card.spec.tsx +80 -0
- package/src/components/workspace-app-card.tsx +36 -25
- package/src/components/workspace-resource-effective-stack.tsx +13 -1
- package/src/components/workspace-resource-impact-preview.tsx +12 -1
- package/src/routes/pages/$appId.tsx +17 -1
- package/src/routes/pages/agents.tsx +24 -11
- package/src/routes/pages/approval.tsx +16 -4
- package/src/routes/pages/approvals.tsx +108 -89
- package/src/routes/pages/apps.$appId.tsx +9 -2
- package/src/routes/pages/apps.tsx +20 -7
- package/src/routes/pages/audit.tsx +29 -20
- package/src/routes/pages/chat.spec.tsx +94 -0
- package/src/routes/pages/chat.tsx +30 -10
- package/src/routes/pages/destinations.tsx +75 -62
- package/src/routes/pages/identities.tsx +74 -63
- package/src/routes/pages/integrations.tsx +17 -10
- package/src/routes/pages/thread-debug.tsx +18 -12
- package/src/routes/pages/vault.tsx +59 -26
- package/src/routes/pages/workspace.tsx +69 -55
- package/src/server/lib/approval-fencing.spec.ts +113 -2
- package/src/server/lib/dispatch-store.ts +2 -0
- package/src/server/lib/mcp-access-store.spec.ts +116 -4
- package/src/server/lib/mcp-access-store.ts +37 -2
- package/src/server/lib/mcp-gateway.spec.ts +79 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/routes/pages/vault.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconEdit,\n IconEye,\n IconEyeOff,\n IconKey,\n IconPlus,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../../components/ui/alert-dialog\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"../../components/ui/dialog\";\nimport { Input } from \"../../components/ui/input\";\nimport { Label } from \"../../components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { Switch } from \"../../components/ui/switch\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../components/ui/tabs\";\nimport { Textarea } from \"../../components/ui/textarea\";\n\nconst PROVIDERS = [\n \"google\",\n \"slack\",\n \"sendgrid\",\n \"github\",\n \"stripe\",\n \"hubspot\",\n \"jira\",\n \"bigquery\",\n \"anthropic\",\n \"other\",\n];\nconst PROVIDER_NONE_VALUE = \"__none__\";\n\ntype VaultAccessMode = \"all-apps\" | \"manual\";\n\nexport function meta() {\n return [{ title: \"Vault — Dispatch\" }];\n}\n\nfunction AddSecretDialog() {\n const [open, setOpen] = useState(false);\n const [credentialKey, setCredentialKey] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [value, setValue] = useState(\"\");\n const [provider, setProvider] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n\n const create = useActionMutation(\"create-vault-secret\", {\n onSuccess: () => {\n toast.success(\"Secret created\");\n setOpen(false);\n setCredentialKey(\"\");\n setName(\"\");\n setValue(\"\");\n setProvider(\"\");\n setDescription(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button>\n <IconPlus size={16} className=\"mr-1.5\" />\n Add secret\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add vault secret</DialogTitle>\n <DialogDescription>\n Store a credential that can be granted to workspace apps.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n placeholder=\"Google OAuth Client ID\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Credential key (env var name)</Label>\n <Input\n placeholder=\"GOOGLE_CLIENT_ID\"\n value={credentialKey}\n onChange={(e) => setCredentialKey(e.target.value)}\n className=\"font-mono text-sm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Value</Label>\n <Input\n type=\"password\"\n placeholder=\"The secret value\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Provider</Label>\n <Select value={provider} onValueChange={setProvider}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select a provider...\" />\n </SelectTrigger>\n <SelectContent>\n {PROVIDERS.map((p) => (\n <SelectItem key={p} value={p}>\n {p.charAt(0).toUpperCase() + p.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Description (optional)</Label>\n <Textarea\n placeholder=\"What is this secret used for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n onClick={() =>\n create.mutate({\n credentialKey,\n name,\n value,\n provider: provider || undefined,\n description: description || undefined,\n })\n }\n disabled={!credentialKey || !name || !value || create.isPending}\n >\n {create.isPending ? \"Creating...\" : \"Create secret\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EditSecretDialog({ secret }: { secret: any }) {\n const [open, setOpen] = useState(false);\n const [credentialKey, setCredentialKey] = useState(\n secret.credentialKey || \"\",\n );\n const [name, setName] = useState(secret.name || \"\");\n const [value, setValue] = useState(secret.value || \"\");\n const [provider, setProvider] = useState(secret.provider || \"\");\n const [description, setDescription] = useState(secret.description || \"\");\n const [showValue, setShowValue] = useState(false);\n\n const update = useActionMutation(\"update-vault-secret\", {\n onSuccess: () => {\n toast.success(\"Secret updated\");\n setOpen(false);\n setShowValue(false);\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const resetDraft = () => {\n setCredentialKey(secret.credentialKey || \"\");\n setName(secret.name || \"\");\n setValue(secret.value || \"\");\n setProvider(secret.provider || \"\");\n setDescription(secret.description || \"\");\n setShowValue(false);\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen) resetDraft();\n setOpen(nextOpen);\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconEdit size={14} className=\"mr-1\" />\n Edit secret\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit vault secret</DialogTitle>\n <DialogDescription>\n Update the stored key and metadata. Changes sync to the shared\n credential store.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"space-y-4 py-2\"\n onSubmit={(event) => {\n event.preventDefault();\n update.mutate({\n id: secret.id,\n credentialKey,\n name,\n value,\n provider: provider || null,\n description: description || null,\n });\n }}\n >\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-name-${secret.id}`}>Name</Label>\n <Input\n id={`vault-secret-name-${secret.id}`}\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-key-${secret.id}`}>\n Credential key (env var name)\n </Label>\n <Input\n id={`vault-secret-key-${secret.id}`}\n value={credentialKey}\n onChange={(e) => setCredentialKey(e.target.value)}\n className=\"font-mono text-sm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-value-${secret.id}`}>Value</Label>\n <div className=\"flex gap-2\">\n <Input\n id={`vault-secret-value-${secret.id}`}\n type={showValue ? \"text\" : \"password\"}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n className=\"font-mono text-sm\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowValue((current) => !current)}\n aria-label={\n showValue ? \"Hide secret value\" : \"Show secret value\"\n }\n >\n {showValue ? <IconEyeOff size={15} /> : <IconEye size={15} />}\n </Button>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Provider</Label>\n <Select\n value={provider || PROVIDER_NONE_VALUE}\n onValueChange={(nextProvider) =>\n setProvider(\n nextProvider === PROVIDER_NONE_VALUE ? \"\" : nextProvider,\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a provider...\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PROVIDER_NONE_VALUE}>No provider</SelectItem>\n {PROVIDERS.map((p) => (\n <SelectItem key={p} value={p}>\n {p.charAt(0).toUpperCase() + p.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-description-${secret.id}`}>\n Description\n </Label>\n <Textarea\n id={`vault-secret-description-${secret.id}`}\n placeholder=\"What is this secret used for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={\n !credentialKey.trim() ||\n !name.trim() ||\n !value ||\n update.isPending\n }\n >\n {update.isPending ? \"Saving...\" : \"Save changes\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction GrantDialog({\n secretId,\n secretName,\n}: {\n secretId: string;\n secretName: string;\n}) {\n const [open, setOpen] = useState(false);\n const [appId, setAppId] = useState(\"\");\n const { data: catalog } = useActionQuery(\"list-integrations-catalog\", {});\n\n const grant = useActionMutation(\"create-vault-grant\", {\n onSuccess: () => {\n toast.success(`Granted to ${appId}`);\n setOpen(false);\n setAppId(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const apps = (catalog || []).map((a: any) => ({\n id: a.appId,\n name: a.appName,\n }));\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus size={14} className=\"mr-1\" />\n Grant\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Grant \"{secretName}\" to an app</DialogTitle>\n <DialogDescription>\n Choose which app should receive this secret.\n </DialogDescription>\n </DialogHeader>\n <div className=\"py-2\">\n <Select value={appId} onValueChange={setAppId}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select an app...\" />\n </SelectTrigger>\n <SelectContent>\n {apps.map((app: any) => (\n <SelectItem key={app.id} value={app.id}>\n {app.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() => grant.mutate({ secretId, appId })}\n disabled={!appId || grant.isPending}\n >\n {grant.isPending ? \"Granting...\" : \"Grant access\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction VaultAccessSettingsCard({ mode }: { mode: VaultAccessMode }) {\n const update = useActionMutation(\"set-vault-access-settings\", {\n onSuccess: (next: any) =>\n toast.success(\n next?.mode === \"manual\"\n ? \"Manual vault access enabled\"\n : \"All apps can use vault keys\",\n ),\n onError: (err) => toast.error(String(err)),\n });\n const allApps = mode !== \"manual\";\n\n return (\n <div className=\"rounded-xl border bg-card px-4 py-3\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <Label className=\"text-sm font-medium\">\n All apps can use vault keys\n </Label>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {allApps\n ? \"Every workspace app can receive every saved key.\"\n : \"Only apps with explicit grants can receive saved keys.\"}\n </p>\n </div>\n <Switch\n checked={allApps}\n disabled={update.isPending}\n onCheckedChange={(checked) =>\n update.mutate({ mode: checked ? \"all-apps\" : \"manual\" })\n }\n aria-label=\"Allow all workspace apps to use vault keys\"\n />\n </div>\n </div>\n );\n}\n\nfunction SecretRow({\n secret,\n grants,\n accessMode,\n}: {\n secret: any;\n grants: any[];\n accessMode: VaultAccessMode;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [showValue, setShowValue] = useState(false);\n\n const deleteSecret = useActionMutation(\"delete-vault-secret\", {\n onSuccess: () => toast.success(\"Secret deleted\"),\n onError: (err) => toast.error(String(err)),\n });\n const revokeGrant = useActionMutation(\"revoke-vault-grant\", {\n onSuccess: () => toast.success(\"Grant revoked\"),\n onError: (err) => toast.error(String(err)),\n });\n const syncToApp = useActionMutation(\"sync-vault-to-app\", {\n onSuccess: (data: any) =>\n toast.success(`Synced ${data.synced} key(s) to ${data.appId}`),\n onError: (err) => toast.error(String(err)),\n });\n\n const activeGrants = grants.filter((g) => g.status === \"active\");\n const allApps = accessMode !== \"manual\";\n\n return (\n <div className=\"rounded-xl border bg-card\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left cursor-pointer\"\n onClick={() => setExpanded(!expanded)}\n >\n {expanded ? (\n <IconChevronDown size={16} className=\"text-muted-foreground\" />\n ) : (\n <IconChevronRight size={16} className=\"text-muted-foreground\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {secret.name}\n </span>\n {secret.provider && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {secret.provider}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 font-mono text-xs text-muted-foreground\">\n {secret.credentialKey}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {allApps\n ? \"All apps\"\n : `${activeGrants.length} grant${activeGrants.length !== 1 ? \"s\" : \"\"}`}\n </Badge>\n </div>\n </button>\n\n {expanded && (\n <div className=\"border-t px-4 py-3 space-y-3\">\n {secret.description && (\n <p className=\"text-sm text-muted-foreground\">\n {secret.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Value:</span>\n <code className=\"text-xs font-mono text-foreground\">\n {showValue ? secret.value : `••••${secret.value.slice(-4)}`}\n </code>\n <button\n type=\"button\"\n onClick={() => setShowValue(!showValue)}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n >\n {showValue ? <IconEyeOff size={14} /> : <IconEye size={14} />}\n </button>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">\n {allApps ? \"Access\" : \"Grants\"}\n </span>\n {!allApps && (\n <GrantDialog secretId={secret.id} secretName={secret.name} />\n )}\n </div>\n {allApps ? (\n <div className=\"rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground\">\n Available to every workspace app.\n </div>\n ) : activeGrants.length > 0 ? (\n <div className=\"space-y-1.5\">\n {activeGrants.map((grant: any) => (\n <div\n key={grant.id}\n className=\"flex items-center justify-between rounded-lg border px-3 py-2\"\n >\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n {grant.appId}\n </span>\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {grant.syncedAt\n ? `synced ${new Date(grant.syncedAt).toLocaleString()}`\n : \"not synced\"}\n </span>\n </div>\n <div className=\"flex gap-1.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => syncToApp.mutate({ appId: grant.appId })}\n disabled={syncToApp.isPending}\n >\n <IconRefresh size={14} />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n revokeGrant.mutate({ grantId: grant.id })\n }\n disabled={revokeGrant.isPending}\n >\n <IconX size={14} />\n </Button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground\">\n No grants yet.\n </div>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2 border-t pt-3\">\n <EditSecretDialog secret={secret} />\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={deleteSecret.isPending}\n >\n <IconTrash size={14} className=\"mr-1\" />\n Delete secret\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete this secret?</AlertDialogTitle>\n <AlertDialogDescription>\n Removing “{secret.name}” revokes all of its grants. Apps\n that depended on this credential can lose access on the next\n sync. This cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteSecret.mutate({ id: secret.id })}\n >\n Delete secret\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction RequestRow({ request }: { request: any }) {\n const [secretValue, setSecretValue] = useState(\"\");\n\n const approve = useActionMutation(\"approve-vault-request\", {\n onSuccess: () => {\n toast.success(\"Request approved\");\n setSecretValue(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n const deny = useActionMutation(\"deny-vault-request\", {\n onSuccess: () => toast.success(\"Request denied\"),\n onError: (err) => toast.error(String(err)),\n });\n\n return (\n <div className=\"rounded-xl border bg-muted/30 px-4 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n <span className=\"font-mono\">{request.credentialKey}</span> for{\" \"}\n <span className=\"font-semibold\">{request.appId}</span>\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Requested by {request.requestedBy}\n {request.reason && ` — \"${request.reason}\"`}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {request.status === \"pending\"\n ? \"Pending\"\n : request.status === \"approved\"\n ? `Approved by ${request.reviewedBy}`\n : `Denied by ${request.reviewedBy}`}{\" \"}\n · {new Date(request.createdAt).toLocaleString()}\n </div>\n </div>\n {request.status === \"pending\" && (\n <Badge variant=\"outline\" className=\"whitespace-nowrap\">\n Pending\n </Badge>\n )}\n {request.status === \"approved\" && (\n <Badge\n variant=\"secondary\"\n className=\"whitespace-nowrap bg-green-500/10 text-green-700 dark:text-green-400\"\n >\n Approved\n </Badge>\n )}\n {request.status === \"denied\" && (\n <Badge\n variant=\"secondary\"\n className=\"whitespace-nowrap bg-red-500/10 text-red-700 dark:text-red-400\"\n >\n Denied\n </Badge>\n )}\n </div>\n {request.status === \"pending\" && (\n <div className=\"mt-3 flex items-end gap-2 border-t pt-3\">\n <div className=\"flex-1 space-y-1\">\n <Label className=\"text-xs\">Secret value to provision</Label>\n <Input\n type=\"password\"\n placeholder=\"Enter the secret value\"\n value={secretValue}\n onChange={(e) => setSecretValue(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <Button\n size=\"sm\"\n onClick={() => approve.mutate({ id: request.id, secretValue })}\n disabled={!secretValue || approve.isPending}\n >\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => deny.mutate({ id: request.id })}\n disabled={deny.isPending}\n >\n Deny\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nexport default function VaultRoute() {\n const { data: secrets, isLoading: secretsLoading } = useActionQuery(\n \"list-vault-secrets\",\n {},\n );\n const { data: grants } = useActionQuery(\"list-vault-grants\", {});\n const { data: requests } = useActionQuery(\"list-vault-requests\", {});\n const { data: audit } = useActionQuery(\"list-vault-audit\", { limit: 20 });\n const { data: accessSettings } = useActionQuery(\n \"get-vault-access-settings\",\n {},\n );\n const accessMode: VaultAccessMode =\n (accessSettings as any)?.mode === \"manual\" ? \"manual\" : \"all-apps\";\n\n const grantsBySecret = (grants || []).reduce(\n (acc: Record<string, any[]>, g: any) => {\n if (!acc[g.secretId]) acc[g.secretId] = [];\n acc[g.secretId].push(g);\n return acc;\n },\n {} as Record<string, any[]>,\n );\n\n const pendingRequests = (requests || []).filter(\n (r: any) => r.status === \"pending\",\n );\n\n return (\n <DispatchShell\n title=\"Vault\"\n description=\"Centralized secret management for your workspace. Store credentials once and sync them to apps.\"\n >\n <Tabs defaultValue=\"secrets\">\n <TabsList>\n <TabsTrigger value=\"secrets\">\n Secrets {(secrets?.length || 0) > 0 && `(${secrets?.length})`}\n </TabsTrigger>\n <TabsTrigger value=\"requests\">\n Requests{\" \"}\n {pendingRequests.length > 0 && (\n <Badge\n variant=\"secondary\"\n className=\"ml-1.5 h-5 px-1.5 text-xs bg-amber-500/10 text-amber-700 dark:text-amber-400\"\n >\n {pendingRequests.length}\n </Badge>\n )}\n </TabsTrigger>\n <TabsTrigger value=\"audit\">Audit</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"secrets\" className=\"mt-4 space-y-3\">\n <VaultAccessSettingsCard mode={accessMode} />\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <IconKey size={16} />\n {secretsLoading ? (\n <Skeleton className=\"h-4 w-20\" />\n ) : (\n <span>\n {`${secrets?.length || 0} secret${(secrets?.length || 0) !== 1 ? \"s\" : \"\"}`}\n </span>\n )}\n </div>\n <AddSecretDialog />\n </div>\n\n {secretsLoading && (secrets ?? []).length === 0\n ? Array.from({ length: 3 }).map((_, index) => (\n <div\n key={index}\n className=\"rounded-2xl border bg-card px-5 py-4 space-y-2\"\n >\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n ))\n : (secrets || []).map((secret: any) => (\n <SecretRow\n key={secret.id}\n secret={secret}\n grants={grantsBySecret[secret.id] || []}\n accessMode={accessMode}\n />\n ))}\n\n {!secretsLoading && (secrets?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center\">\n <IconKey size={32} className=\"mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-3 text-sm font-medium text-foreground\">\n No secrets yet\n </h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Add your first secret to start sharing credentials across\n workspace apps.\n </p>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"requests\" className=\"mt-4 space-y-3\">\n {(requests || []).map((request: any) => (\n <RequestRow key={request.id} request={request} />\n ))}\n {(requests?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No secret requests yet.\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"audit\" className=\"mt-4 space-y-2\">\n {(audit || []).map((event: any) => (\n <div\n key={event.id}\n className=\"rounded-xl border bg-muted/30 px-4 py-3\"\n >\n <div className=\"text-sm font-medium text-foreground\">\n {event.summary}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {event.actor} · {new Date(event.createdAt).toLocaleString()}\n </div>\n </div>\n ))}\n {(audit?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No vault activity yet.\n </div>\n )}\n </TabsContent>\n </Tabs>\n </DispatchShell>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/routes/pages/vault.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useActionMutation, useActionQuery } from \"@agent-native/core/client\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconEdit,\n IconEye,\n IconEyeOff,\n IconKey,\n IconPlus,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ActionQueryError } from \"../../components/action-query-error\";\nimport { DispatchShell } from \"../../components/dispatch-shell\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../../components/ui/alert-dialog\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"../../components/ui/dialog\";\nimport { Input } from \"../../components/ui/input\";\nimport { Label } from \"../../components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Skeleton } from \"../../components/ui/skeleton\";\nimport { Switch } from \"../../components/ui/switch\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../components/ui/tabs\";\nimport { Textarea } from \"../../components/ui/textarea\";\n\nconst PROVIDERS = [\n \"google\",\n \"slack\",\n \"sendgrid\",\n \"github\",\n \"stripe\",\n \"hubspot\",\n \"jira\",\n \"bigquery\",\n \"anthropic\",\n \"other\",\n];\nconst PROVIDER_NONE_VALUE = \"__none__\";\n\ntype VaultAccessMode = \"all-apps\" | \"manual\";\n\nexport function meta() {\n return [{ title: \"Vault — Dispatch\" }];\n}\n\nfunction AddSecretDialog() {\n const [open, setOpen] = useState(false);\n const [credentialKey, setCredentialKey] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [value, setValue] = useState(\"\");\n const [provider, setProvider] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n\n const create = useActionMutation(\"create-vault-secret\", {\n onSuccess: () => {\n toast.success(\"Secret created\");\n setOpen(false);\n setCredentialKey(\"\");\n setName(\"\");\n setValue(\"\");\n setProvider(\"\");\n setDescription(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button>\n <IconPlus size={16} className=\"mr-1.5\" />\n Add secret\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add vault secret</DialogTitle>\n <DialogDescription>\n Store a credential that can be granted to workspace apps.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input\n placeholder=\"Google OAuth Client ID\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Credential key (env var name)</Label>\n <Input\n placeholder=\"GOOGLE_CLIENT_ID\"\n value={credentialKey}\n onChange={(e) => setCredentialKey(e.target.value)}\n className=\"font-mono text-sm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Value</Label>\n <Input\n type=\"password\"\n placeholder=\"The secret value\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Provider</Label>\n <Select value={provider} onValueChange={setProvider}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select a provider...\" />\n </SelectTrigger>\n <SelectContent>\n {PROVIDERS.map((p) => (\n <SelectItem key={p} value={p}>\n {p.charAt(0).toUpperCase() + p.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Description (optional)</Label>\n <Textarea\n placeholder=\"What is this secret used for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n onClick={() =>\n create.mutate({\n credentialKey,\n name,\n value,\n provider: provider || undefined,\n description: description || undefined,\n })\n }\n disabled={!credentialKey || !name || !value || create.isPending}\n >\n {create.isPending ? \"Creating...\" : \"Create secret\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EditSecretDialog({ secret }: { secret: any }) {\n const [open, setOpen] = useState(false);\n const [credentialKey, setCredentialKey] = useState(\n secret.credentialKey || \"\",\n );\n const [name, setName] = useState(secret.name || \"\");\n const [value, setValue] = useState(secret.value || \"\");\n const [provider, setProvider] = useState(secret.provider || \"\");\n const [description, setDescription] = useState(secret.description || \"\");\n const [showValue, setShowValue] = useState(false);\n\n const update = useActionMutation(\"update-vault-secret\", {\n onSuccess: () => {\n toast.success(\"Secret updated\");\n setOpen(false);\n setShowValue(false);\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const resetDraft = () => {\n setCredentialKey(secret.credentialKey || \"\");\n setName(secret.name || \"\");\n setValue(secret.value || \"\");\n setProvider(secret.provider || \"\");\n setDescription(secret.description || \"\");\n setShowValue(false);\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (nextOpen) resetDraft();\n setOpen(nextOpen);\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconEdit size={14} className=\"mr-1\" />\n Edit secret\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit vault secret</DialogTitle>\n <DialogDescription>\n Update the stored key and metadata. Changes sync to the shared\n credential store.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"space-y-4 py-2\"\n onSubmit={(event) => {\n event.preventDefault();\n update.mutate({\n id: secret.id,\n credentialKey,\n name,\n value,\n provider: provider || null,\n description: description || null,\n });\n }}\n >\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-name-${secret.id}`}>Name</Label>\n <Input\n id={`vault-secret-name-${secret.id}`}\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-key-${secret.id}`}>\n Credential key (env var name)\n </Label>\n <Input\n id={`vault-secret-key-${secret.id}`}\n value={credentialKey}\n onChange={(e) => setCredentialKey(e.target.value)}\n className=\"font-mono text-sm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-value-${secret.id}`}>Value</Label>\n <div className=\"flex gap-2\">\n <Input\n id={`vault-secret-value-${secret.id}`}\n type={showValue ? \"text\" : \"password\"}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n className=\"font-mono text-sm\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowValue((current) => !current)}\n aria-label={\n showValue ? \"Hide secret value\" : \"Show secret value\"\n }\n >\n {showValue ? <IconEyeOff size={15} /> : <IconEye size={15} />}\n </Button>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Provider</Label>\n <Select\n value={provider || PROVIDER_NONE_VALUE}\n onValueChange={(nextProvider) =>\n setProvider(\n nextProvider === PROVIDER_NONE_VALUE ? \"\" : nextProvider,\n )\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select a provider...\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PROVIDER_NONE_VALUE}>No provider</SelectItem>\n {PROVIDERS.map((p) => (\n <SelectItem key={p} value={p}>\n {p.charAt(0).toUpperCase() + p.slice(1)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor={`vault-secret-description-${secret.id}`}>\n Description\n </Label>\n <Textarea\n id={`vault-secret-description-${secret.id}`}\n placeholder=\"What is this secret used for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={\n !credentialKey.trim() ||\n !name.trim() ||\n !value ||\n update.isPending\n }\n >\n {update.isPending ? \"Saving...\" : \"Save changes\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction GrantDialog({\n secretId,\n secretName,\n}: {\n secretId: string;\n secretName: string;\n}) {\n const [open, setOpen] = useState(false);\n const [appId, setAppId] = useState(\"\");\n const { data: catalog } = useActionQuery(\"list-integrations-catalog\", {});\n\n const grant = useActionMutation(\"create-vault-grant\", {\n onSuccess: () => {\n toast.success(`Granted to ${appId}`);\n setOpen(false);\n setAppId(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n\n const apps = (catalog || []).map((a: any) => ({\n id: a.appId,\n name: a.appName,\n }));\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus size={14} className=\"mr-1\" />\n Grant\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Grant \"{secretName}\" to an app</DialogTitle>\n <DialogDescription>\n Choose which app should receive this secret.\n </DialogDescription>\n </DialogHeader>\n <div className=\"py-2\">\n <Select value={appId} onValueChange={setAppId}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select an app...\" />\n </SelectTrigger>\n <SelectContent>\n {apps.map((app: any) => (\n <SelectItem key={app.id} value={app.id}>\n {app.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() => grant.mutate({ secretId, appId })}\n disabled={!appId || grant.isPending}\n >\n {grant.isPending ? \"Granting...\" : \"Grant access\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction VaultAccessSettingsCard({ mode }: { mode: VaultAccessMode }) {\n const update = useActionMutation(\"set-vault-access-settings\", {\n onSuccess: (next: any) =>\n toast.success(\n next?.mode === \"manual\"\n ? \"Manual vault access enabled\"\n : \"All apps can use vault keys\",\n ),\n onError: (err) => toast.error(String(err)),\n });\n const allApps = mode !== \"manual\";\n\n return (\n <div className=\"rounded-xl border bg-card px-4 py-3\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <Label className=\"text-sm font-medium\">\n All apps can use vault keys\n </Label>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {allApps\n ? \"Every workspace app can receive every saved key.\"\n : \"Only apps with explicit grants can receive saved keys.\"}\n </p>\n </div>\n <Switch\n checked={allApps}\n disabled={update.isPending}\n onCheckedChange={(checked) =>\n update.mutate({ mode: checked ? \"all-apps\" : \"manual\" })\n }\n aria-label=\"Allow all workspace apps to use vault keys\"\n />\n </div>\n </div>\n );\n}\n\nfunction SecretRow({\n secret,\n grants,\n accessMode,\n}: {\n secret: any;\n grants: any[];\n accessMode: VaultAccessMode;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [showValue, setShowValue] = useState(false);\n\n const deleteSecret = useActionMutation(\"delete-vault-secret\", {\n onSuccess: () => toast.success(\"Secret deleted\"),\n onError: (err) => toast.error(String(err)),\n });\n const revokeGrant = useActionMutation(\"revoke-vault-grant\", {\n onSuccess: () => toast.success(\"Grant revoked\"),\n onError: (err) => toast.error(String(err)),\n });\n const syncToApp = useActionMutation(\"sync-vault-to-app\", {\n onSuccess: (data: any) =>\n toast.success(`Synced ${data.synced} key(s) to ${data.appId}`),\n onError: (err) => toast.error(String(err)),\n });\n\n const activeGrants = grants.filter((g) => g.status === \"active\");\n const allApps = accessMode !== \"manual\";\n\n return (\n <div className=\"rounded-xl border bg-card\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-3 px-4 py-3 text-left cursor-pointer\"\n onClick={() => setExpanded(!expanded)}\n >\n {expanded ? (\n <IconChevronDown size={16} className=\"text-muted-foreground\" />\n ) : (\n <IconChevronRight size={16} className=\"text-muted-foreground\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {secret.name}\n </span>\n {secret.provider && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {secret.provider}\n </Badge>\n )}\n </div>\n <div className=\"mt-0.5 font-mono text-xs text-muted-foreground\">\n {secret.credentialKey}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {allApps\n ? \"All apps\"\n : `${activeGrants.length} grant${activeGrants.length !== 1 ? \"s\" : \"\"}`}\n </Badge>\n </div>\n </button>\n\n {expanded && (\n <div className=\"border-t px-4 py-3 space-y-3\">\n {secret.description && (\n <p className=\"text-sm text-muted-foreground\">\n {secret.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Value:</span>\n <code className=\"text-xs font-mono text-foreground\">\n {showValue ? secret.value : `••••${secret.value.slice(-4)}`}\n </code>\n <button\n type=\"button\"\n onClick={() => setShowValue(!showValue)}\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n >\n {showValue ? <IconEyeOff size={14} /> : <IconEye size={14} />}\n </button>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">\n {allApps ? \"Access\" : \"Grants\"}\n </span>\n {!allApps && (\n <GrantDialog secretId={secret.id} secretName={secret.name} />\n )}\n </div>\n {allApps ? (\n <div className=\"rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground\">\n Available to every workspace app.\n </div>\n ) : activeGrants.length > 0 ? (\n <div className=\"space-y-1.5\">\n {activeGrants.map((grant: any) => (\n <div\n key={grant.id}\n className=\"flex items-center justify-between rounded-lg border px-3 py-2\"\n >\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n {grant.appId}\n </span>\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {grant.syncedAt\n ? `synced ${new Date(grant.syncedAt).toLocaleString()}`\n : \"not synced\"}\n </span>\n </div>\n <div className=\"flex gap-1.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => syncToApp.mutate({ appId: grant.appId })}\n disabled={syncToApp.isPending}\n >\n <IconRefresh size={14} />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n revokeGrant.mutate({ grantId: grant.id })\n }\n disabled={revokeGrant.isPending}\n >\n <IconX size={14} />\n </Button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground\">\n No grants yet.\n </div>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2 border-t pt-3\">\n <EditSecretDialog secret={secret} />\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={deleteSecret.isPending}\n >\n <IconTrash size={14} className=\"mr-1\" />\n Delete secret\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete this secret?</AlertDialogTitle>\n <AlertDialogDescription>\n Removing “{secret.name}” revokes all of its grants. Apps\n that depended on this credential can lose access on the next\n sync. This cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => deleteSecret.mutate({ id: secret.id })}\n >\n Delete secret\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction RequestRow({ request }: { request: any }) {\n const [secretValue, setSecretValue] = useState(\"\");\n\n const approve = useActionMutation(\"approve-vault-request\", {\n onSuccess: () => {\n toast.success(\"Request approved\");\n setSecretValue(\"\");\n },\n onError: (err) => toast.error(String(err)),\n });\n const deny = useActionMutation(\"deny-vault-request\", {\n onSuccess: () => toast.success(\"Request denied\"),\n onError: (err) => toast.error(String(err)),\n });\n\n return (\n <div className=\"rounded-xl border bg-muted/30 px-4 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n <span className=\"font-mono\">{request.credentialKey}</span> for{\" \"}\n <span className=\"font-semibold\">{request.appId}</span>\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Requested by {request.requestedBy}\n {request.reason && ` — \"${request.reason}\"`}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {request.status === \"pending\"\n ? \"Pending\"\n : request.status === \"approved\"\n ? `Approved by ${request.reviewedBy}`\n : `Denied by ${request.reviewedBy}`}{\" \"}\n · {new Date(request.createdAt).toLocaleString()}\n </div>\n </div>\n {request.status === \"pending\" && (\n <Badge variant=\"outline\" className=\"whitespace-nowrap\">\n Pending\n </Badge>\n )}\n {request.status === \"approved\" && (\n <Badge\n variant=\"secondary\"\n className=\"whitespace-nowrap bg-green-500/10 text-green-700 dark:text-green-400\"\n >\n Approved\n </Badge>\n )}\n {request.status === \"denied\" && (\n <Badge\n variant=\"secondary\"\n className=\"whitespace-nowrap bg-red-500/10 text-red-700 dark:text-red-400\"\n >\n Denied\n </Badge>\n )}\n </div>\n {request.status === \"pending\" && (\n <div className=\"mt-3 flex items-end gap-2 border-t pt-3\">\n <div className=\"flex-1 space-y-1\">\n <Label className=\"text-xs\">Secret value to provision</Label>\n <Input\n type=\"password\"\n placeholder=\"Enter the secret value\"\n value={secretValue}\n onChange={(e) => setSecretValue(e.target.value)}\n className=\"h-8 text-sm\"\n />\n </div>\n <Button\n size=\"sm\"\n onClick={() => approve.mutate({ id: request.id, secretValue })}\n disabled={!secretValue || approve.isPending}\n >\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => deny.mutate({ id: request.id })}\n disabled={deny.isPending}\n >\n Deny\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nexport default function VaultRoute() {\n const secretsQuery = useActionQuery(\"list-vault-secrets\", {});\n const grantsQuery = useActionQuery(\"list-vault-grants\", {});\n const requestsQuery = useActionQuery(\"list-vault-requests\", {});\n const auditQuery = useActionQuery(\"list-vault-audit\", { limit: 20 });\n const accessQuery = useActionQuery(\"get-vault-access-settings\", {});\n const { data: secrets, isLoading: secretsLoading } = secretsQuery;\n const { data: grants } = grantsQuery;\n const { data: requests } = requestsQuery;\n const { data: audit } = auditQuery;\n const { data: accessSettings } = accessQuery;\n const accessMode: VaultAccessMode =\n (accessSettings as any)?.mode === \"manual\" ? \"manual\" : \"all-apps\";\n\n const grantsBySecret = (grants || []).reduce(\n (acc: Record<string, any[]>, g: any) => {\n if (!acc[g.secretId]) acc[g.secretId] = [];\n acc[g.secretId].push(g);\n return acc;\n },\n {} as Record<string, any[]>,\n );\n\n const pendingRequests = (requests || []).filter(\n (r: any) => r.status === \"pending\",\n );\n\n return (\n <DispatchShell\n title=\"Vault\"\n description=\"Centralized secret management for your workspace. Store credentials once and sync them to apps.\"\n >\n <Tabs defaultValue=\"secrets\">\n <TabsList>\n <TabsTrigger value=\"secrets\">\n Secrets {(secrets?.length || 0) > 0 && `(${secrets?.length})`}\n </TabsTrigger>\n <TabsTrigger value=\"requests\">\n Requests{\" \"}\n {pendingRequests.length > 0 && (\n <Badge\n variant=\"secondary\"\n className=\"ml-1.5 h-5 px-1.5 text-xs bg-amber-500/10 text-amber-700 dark:text-amber-400\"\n >\n {pendingRequests.length}\n </Badge>\n )}\n </TabsTrigger>\n <TabsTrigger value=\"audit\">Audit</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"secrets\" className=\"mt-4 space-y-3\">\n {secretsQuery.isError ||\n grantsQuery.isError ||\n accessQuery.isError ? (\n <ActionQueryError\n error={\n secretsQuery.error ?? grantsQuery.error ?? accessQuery.error\n }\n onRetry={() => {\n void secretsQuery.refetch();\n void grantsQuery.refetch();\n void accessQuery.refetch();\n }}\n />\n ) : null}\n <VaultAccessSettingsCard mode={accessMode} />\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <IconKey size={16} />\n {secretsLoading ? (\n <Skeleton className=\"h-4 w-20\" />\n ) : (\n <span>\n {`${secrets?.length || 0} secret${(secrets?.length || 0) !== 1 ? \"s\" : \"\"}`}\n </span>\n )}\n </div>\n <AddSecretDialog />\n </div>\n\n {!secretsQuery.isError &&\n secretsLoading &&\n (secrets ?? []).length === 0\n ? Array.from({ length: 3 }).map((_, index) => (\n <div\n key={index}\n className=\"rounded-2xl border bg-card px-5 py-4 space-y-2\"\n >\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n ))\n : (secrets || []).map((secret: any) => (\n <SecretRow\n key={secret.id}\n secret={secret}\n grants={grantsBySecret[secret.id] || []}\n accessMode={accessMode}\n />\n ))}\n\n {!secretsQuery.isError &&\n !secretsLoading &&\n (secrets?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center\">\n <IconKey\n size={32}\n className=\"mx-auto text-muted-foreground/50\"\n />\n <h3 className=\"mt-3 text-sm font-medium text-foreground\">\n No secrets yet\n </h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Add your first secret to start sharing credentials across\n workspace apps.\n </p>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"requests\" className=\"mt-4 space-y-3\">\n {requestsQuery.isError ? (\n <ActionQueryError\n error={requestsQuery.error}\n onRetry={() => void requestsQuery.refetch()}\n />\n ) : null}\n {(requests || []).map((request: any) => (\n <RequestRow key={request.id} request={request} />\n ))}\n {!requestsQuery.isError && (requests?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No secret requests yet.\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"audit\" className=\"mt-4 space-y-2\">\n {auditQuery.isError ? (\n <ActionQueryError\n error={auditQuery.error}\n onRetry={() => void auditQuery.refetch()}\n />\n ) : null}\n {(audit || []).map((event: any) => (\n <div\n key={event.id}\n className=\"rounded-xl border bg-muted/30 px-4 py-3\"\n >\n <div className=\"text-sm font-medium text-foreground\">\n {event.summary}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {event.actor} · {new Date(event.createdAt).toLocaleString()}\n </div>\n </div>\n ))}\n {!auditQuery.isError && (audit?.length || 0) === 0 && (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n No vault activity yet.\n </div>\n )}\n </TabsContent>\n </Tabs>\n </DispatchShell>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/workspace.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/workspace.tsx"],"names":[],"mappings":"AAiEA,wBAAgB,IAAI;;IAEnB;AAq7BD,MAAM,CAAC,OAAO,UAAU,cAAc,oDA+JrC"}
|
|
@@ -3,6 +3,7 @@ import { useActionMutation, useActionQuery } from "@agent-native/core/client";
|
|
|
3
3
|
import { IconAlertCircle, IconBook, IconChevronDown, IconChevronRight, IconCircleCheck, IconCode, IconEdit, IconFileText, IconPlus, IconPlugConnected, IconTrash, IconUser, IconX, } from "@tabler/icons-react";
|
|
4
4
|
import { useEffect, useState } from "react";
|
|
5
5
|
import { toast } from "sonner";
|
|
6
|
+
import { ActionQueryError } from "../../components/action-query-error.js";
|
|
6
7
|
import { DispatchShell } from "../../components/dispatch-shell.js";
|
|
7
8
|
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "../../components/ui/alert-dialog.js";
|
|
8
9
|
import { Badge } from "../../components/ui/badge.js";
|
|
@@ -300,8 +301,10 @@ function GlobalContextSection({ resources }) {
|
|
|
300
301
|
}) })] }));
|
|
301
302
|
}
|
|
302
303
|
export default function WorkspaceRoute() {
|
|
303
|
-
const
|
|
304
|
-
const
|
|
304
|
+
const resourcesQuery = useActionQuery("list-workspace-resources", {});
|
|
305
|
+
const grantsQuery = useActionQuery("list-workspace-resource-grants", {});
|
|
306
|
+
const { data: resources, isLoading } = resourcesQuery;
|
|
307
|
+
const { data: grants } = grantsQuery;
|
|
305
308
|
const grantsByResource = (grants || []).reduce((acc, g) => {
|
|
306
309
|
if (!acc[g.resourceId])
|
|
307
310
|
acc[g.resourceId] = [];
|
|
@@ -322,6 +325,9 @@ export default function WorkspaceRoute() {
|
|
|
322
325
|
}
|
|
323
326
|
return (_jsx("div", { className: "space-y-3", children: items.map((resource) => (_jsx(ResourceRow, { resource: resource, grants: grantsByResource[resource.id] || [] }, resource.id))) }));
|
|
324
327
|
}
|
|
325
|
-
return (_jsxs(DispatchShell, { title: "Workspace Resources", description: "Manage inherited workspace skills, guardrail instructions, agent profiles, reference resources, and MCP servers. All-app resources are available to every app without syncing.", children: [
|
|
328
|
+
return (_jsxs(DispatchShell, { title: "Workspace Resources", description: "Manage inherited workspace skills, guardrail instructions, agent profiles, reference resources, and MCP servers. All-app resources are available to every app without syncing.", children: [resourcesQuery.isError || grantsQuery.isError ? (_jsx(ActionQueryError, { error: resourcesQuery.error ?? grantsQuery.error, onRetry: () => {
|
|
329
|
+
void resourcesQuery.refetch();
|
|
330
|
+
void grantsQuery.refetch();
|
|
331
|
+
} })) : null, _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-sm text-muted-foreground", children: isLoading ? (_jsx(Skeleton, { className: "h-4 w-24" })) : (`${resources?.length || 0} resource${(resources?.length || 0) !== 1 ? "s" : ""}`) }), _jsx("div", { className: "flex gap-2", children: _jsx(AddResourceDialog, {}) })] }), !resourcesQuery.isError ? (_jsx(GlobalContextSection, { resources: resources || [] })) : null, !resourcesQuery.isError && !grantsQuery.isError ? (_jsxs(Tabs, { defaultValue: "skills", children: [_jsxs(TabsList, { children: [_jsxs(TabsTrigger, { value: "skills", children: ["Skills ", skills.length > 0 && `(${skills.length})`] }), _jsxs(TabsTrigger, { value: "instructions", children: ["Instructions", " ", instructions.length > 0 && `(${instructions.length})`] }), _jsxs(TabsTrigger, { value: "agents", children: ["Agents ", agents.length > 0 && `(${agents.length})`] }), _jsxs(TabsTrigger, { value: "knowledge", children: ["Knowledge ", knowledge.length > 0 && `(${knowledge.length})`] }), _jsxs(TabsTrigger, { value: "mcp", children: ["MCP ", mcpServers.length > 0 && `(${mcpServers.length})`] })] }), _jsx(TabsContent, { value: "skills", className: "mt-4", children: _jsx(ResourceList, { items: skills, emptyText: "No workspace skills yet. Add a skill to share agent guidance across apps." }) }), _jsx(TabsContent, { value: "instructions", className: "mt-4", children: _jsx(ResourceList, { items: instructions, emptyText: "No workspace instructions yet. Add instructions to set behavioral rules across apps." }) }), _jsx(TabsContent, { value: "agents", className: "mt-4", children: _jsx(ResourceList, { items: agents, emptyText: "No workspace agents yet. Add a reusable agent profile to share specialist agents across apps." }) }), _jsx(TabsContent, { value: "knowledge", className: "mt-4", children: _jsx(ResourceList, { items: knowledge, emptyText: "No knowledge packs yet. Add GTM, product, or domain context that apps can reuse." }) }), _jsx(TabsContent, { value: "mcp", className: "mt-4", children: _jsx(ResourceList, { items: mcpServers, emptyText: "No workspace MCP servers yet. Add an HTTP MCP server to share external tools across apps." }) })] })) : null] }));
|
|
326
332
|
}
|
|
327
333
|
//# sourceMappingURL=workspace.js.map
|