@agent-native/dispatch 0.17.6 → 0.19.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.
Files changed (117) hide show
  1. package/dist/actions/grant-vault-secrets-to-app.js +1 -1
  2. package/dist/actions/grant-vault-secrets-to-app.js.map +1 -1
  3. package/dist/actions/list-vault-audit.js +1 -1
  4. package/dist/actions/list-vault-audit.js.map +1 -1
  5. package/dist/actions/list-vault-secret-options.js +2 -9
  6. package/dist/actions/list-vault-secret-options.js.map +1 -1
  7. package/dist/actions/list-vault-secrets.js +1 -1
  8. package/dist/actions/list-vault-secrets.js.map +1 -1
  9. package/dist/actions/set-app-creation-settings.js +1 -1
  10. package/dist/actions/set-app-creation-settings.js.map +1 -1
  11. package/dist/actions/set-vault-access-settings.js +1 -1
  12. package/dist/actions/set-vault-access-settings.js.map +1 -1
  13. package/dist/actions/sync-vault-to-app.js +1 -1
  14. package/dist/actions/sync-vault-to-app.js.map +1 -1
  15. package/dist/actions/view-screen.js +4 -3
  16. package/dist/actions/view-screen.js.map +1 -1
  17. package/dist/components/admin-navigation.d.ts +15 -0
  18. package/dist/components/admin-navigation.d.ts.map +1 -0
  19. package/dist/components/admin-navigation.js +174 -0
  20. package/dist/components/admin-navigation.js.map +1 -0
  21. package/dist/components/automation-run-history-dialog.js +1 -1
  22. package/dist/components/automation-run-history-dialog.js.map +1 -1
  23. package/dist/components/index.d.ts +1 -0
  24. package/dist/components/index.d.ts.map +1 -1
  25. package/dist/components/index.js +1 -0
  26. package/dist/components/index.js.map +1 -1
  27. package/dist/components/layout/Header.d.ts.map +1 -1
  28. package/dist/components/layout/Header.js +9 -0
  29. package/dist/components/layout/Header.js.map +1 -1
  30. package/dist/components/layout/Layout.d.ts +4 -1
  31. package/dist/components/layout/Layout.d.ts.map +1 -1
  32. package/dist/components/layout/Layout.js +14 -117
  33. package/dist/components/layout/Layout.js.map +1 -1
  34. package/dist/components/layout/workspace-apps-rail.d.ts +5 -0
  35. package/dist/components/layout/workspace-apps-rail.d.ts.map +1 -0
  36. package/dist/components/layout/workspace-apps-rail.js +76 -0
  37. package/dist/components/layout/workspace-apps-rail.js.map +1 -0
  38. package/dist/hooks/use-navigation-state.js +38 -15
  39. package/dist/hooks/use-navigation-state.js.map +1 -1
  40. package/dist/lib/automation-display.js +1 -1
  41. package/dist/lib/automation-display.js.map +1 -1
  42. package/dist/routes/index.d.ts.map +1 -1
  43. package/dist/routes/index.js +22 -0
  44. package/dist/routes/index.js.map +1 -1
  45. package/dist/routes/pages/admin._index.d.ts +5 -0
  46. package/dist/routes/pages/admin._index.d.ts.map +1 -0
  47. package/dist/routes/pages/admin._index.js +19 -0
  48. package/dist/routes/pages/admin._index.js.map +1 -0
  49. package/dist/routes/pages/admin.d.ts +5 -0
  50. package/dist/routes/pages/admin.d.ts.map +1 -0
  51. package/dist/routes/pages/admin.js +10 -0
  52. package/dist/routes/pages/admin.js.map +1 -0
  53. package/dist/routes/pages/approval.js +2 -2
  54. package/dist/routes/pages/approval.js.map +1 -1
  55. package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
  56. package/dist/routes/pages/apps.$appId.js +3 -2
  57. package/dist/routes/pages/apps.$appId.js.map +1 -1
  58. package/dist/routes/pages/integrations.d.ts.map +1 -1
  59. package/dist/routes/pages/integrations.js +2 -1
  60. package/dist/routes/pages/integrations.js.map +1 -1
  61. package/dist/routes/pages/operations.js +3 -3
  62. package/dist/routes/pages/operations.js.map +1 -1
  63. package/dist/routes/pages/settings.d.ts.map +1 -1
  64. package/dist/routes/pages/settings.js +1 -1
  65. package/dist/routes/pages/settings.js.map +1 -1
  66. package/dist/routes/pages/transactional-email.$appId.$id.d.ts.map +1 -1
  67. package/dist/routes/pages/transactional-email.$appId.$id.js +5 -2
  68. package/dist/routes/pages/transactional-email.$appId.$id.js.map +1 -1
  69. package/dist/routes/pages/transactional-email.d.ts.map +1 -1
  70. package/dist/routes/pages/transactional-email.js +6 -2
  71. package/dist/routes/pages/transactional-email.js.map +1 -1
  72. package/dist/routes/pages/vault.d.ts.map +1 -1
  73. package/dist/routes/pages/vault.js +20 -16
  74. package/dist/routes/pages/vault.js.map +1 -1
  75. package/dist/server/lib/app-creation-store.js +2 -2
  76. package/dist/server/lib/app-creation-store.js.map +1 -1
  77. package/dist/server/lib/vault-store.d.ts +15 -0
  78. package/dist/server/lib/vault-store.d.ts.map +1 -1
  79. package/dist/server/lib/vault-store.js +110 -17
  80. package/dist/server/lib/vault-store.js.map +1 -1
  81. package/package.json +3 -3
  82. package/src/actions/grant-vault-secrets-to-app.ts +1 -1
  83. package/src/actions/list-vault-audit.ts +1 -1
  84. package/src/actions/list-vault-secret-options.ts +2 -9
  85. package/src/actions/list-vault-secrets.ts +1 -1
  86. package/src/actions/set-app-creation-settings.ts +1 -1
  87. package/src/actions/set-vault-access-settings.ts +1 -1
  88. package/src/actions/sync-vault-to-app.ts +1 -1
  89. package/src/actions/view-screen.spec.ts +1 -0
  90. package/src/actions/view-screen.ts +5 -3
  91. package/src/components/admin-navigation.tsx +278 -0
  92. package/src/components/automation-run-history-dialog.tsx +1 -1
  93. package/src/components/index.ts +1 -0
  94. package/src/components/layout/Header.tsx +8 -0
  95. package/src/components/layout/Layout.spec.tsx +85 -6
  96. package/src/components/layout/Layout.tsx +62 -206
  97. package/src/components/layout/workspace-apps-rail.tsx +154 -0
  98. package/src/hooks/use-navigation-state.spec.ts +11 -0
  99. package/src/hooks/use-navigation-state.ts +36 -15
  100. package/src/lib/automation-display.spec.ts +1 -1
  101. package/src/lib/automation-display.ts +1 -1
  102. package/src/routes/index.spec.ts +8 -0
  103. package/src/routes/index.ts +25 -0
  104. package/src/routes/pages/admin._index.tsx +39 -0
  105. package/src/routes/pages/admin.tsx +15 -0
  106. package/src/routes/pages/approval.tsx +2 -2
  107. package/src/routes/pages/apps.$appId.tsx +7 -2
  108. package/src/routes/pages/integrations.tsx +3 -2
  109. package/src/routes/pages/operations.tsx +3 -3
  110. package/src/routes/pages/settings.tsx +7 -3
  111. package/src/routes/pages/transactional-email.$appId.$id.tsx +9 -2
  112. package/src/routes/pages/transactional-email.tsx +6 -2
  113. package/src/routes/pages/vault.tsx +152 -89
  114. package/src/server/lib/app-creation-store.ts +2 -2
  115. package/src/server/lib/approval-fencing.spec.ts +69 -0
  116. package/src/server/lib/vault-store.spec.ts +59 -0
  117. package/src/server/lib/vault-store.ts +123 -17
@@ -1 +1 @@
1
- {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/routes/pages/vault.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\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 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 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 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
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/routes/pages/vault.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useOrgRole } from \"@agent-native/core/client/org\";\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 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 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({\n request,\n canManage,\n}: {\n request: any;\n canManage: boolean;\n}) {\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\" && canManage ? (\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 ) : request.status === \"pending\" ? (\n <p className=\"mt-3 border-t pt-3 text-xs text-muted-foreground\">\n Waiting for a workspace owner or admin to review this request.\n </p>\n ) : null}\n </div>\n );\n}\n\nexport default function VaultRoute() {\n const { org, role, isLoading: orgLoading, error: orgError } = useOrgRole();\n const accessReady = !orgLoading && !orgError && !!org;\n const canManageVault =\n accessReady && (!org.orgId || role === \"owner\" || role === \"admin\");\n const secretsQuery = useActionQuery(\n \"list-vault-secrets\",\n {},\n { enabled: canManageVault },\n );\n const grantsQuery = useActionQuery(\n \"list-vault-grants\",\n {},\n { enabled: canManageVault },\n );\n const requestsQuery = useActionQuery(\n \"list-vault-requests\",\n {},\n { enabled: accessReady },\n );\n const auditQuery = useActionQuery(\n \"list-vault-audit\",\n { limit: 20 },\n { enabled: canManageVault },\n );\n const accessQuery = useActionQuery(\n \"get-vault-access-settings\",\n {},\n { enabled: accessReady },\n );\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 {canManageVault ? (\n <TabsTrigger value=\"audit\">Audit</TabsTrigger>\n ) : null}\n </TabsList>\n\n <TabsContent value=\"secrets\" className=\"mt-4 space-y-3\">\n {!accessReady ? (\n <div className=\"rounded-2xl border border-dashed px-6 py-12 text-center text-sm text-muted-foreground\">\n Checking workspace access…\n </div>\n ) : !canManageVault ? (\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 Vault management is restricted\n </h3>\n <p className=\"mx-auto mt-1 max-w-md text-sm text-muted-foreground\">\n Workspace owners and admins manage shared secret values. Use a\n request from the app that needs a key, and an admin can review\n it from the Requests tab.\n </p>\n </div>\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 {accessReady && canManageVault ? (\n <>\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 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 </>\n ) : null}\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\n key={request.id}\n request={request}\n canManage={canManageVault}\n />\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 {canManageVault ? (\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 ) : null}\n </Tabs>\n </DispatchShell>\n );\n}\n"]}
@@ -9,7 +9,7 @@ import { getSetting, putSetting } from "@agent-native/core/settings";
9
9
  import { assertValidWorkspaceAppId } from "@agent-native/core/shared";
10
10
  import { identityKeyForIncoming } from "./dispatch-integrations.js";
11
11
  import { currentOrgId, currentOwnerEmail, recordAudit, resolveLinkedOwner, } from "./dispatch-store.js";
12
- import { createRequest, listSecrets } from "./vault-store.js";
12
+ import { createRequest, listSecretOptions } from "./vault-store.js";
13
13
  import { grantWorkspaceResourcesToApp, listWorkspaceResourceOptions, } from "./workspace-resources-store.js";
14
14
  const SETTINGS_KEY = "dispatch-app-creation-settings";
15
15
  const BUILDER_BRANCH_PROJECT_SECRET_KEY = "BUILDER_BRANCH_PROJECT_ID";
@@ -1497,7 +1497,7 @@ export async function startWorkspaceAppCreation(input) {
1497
1497
  }
1498
1498
  }
1499
1499
  const selectedKeys = input.secretIds?.length
1500
- ? (await listSecrets())
1500
+ ? (await listSecretOptions())
1501
1501
  .filter((secret) => input.secretIds?.includes(secret.id))
1502
1502
  .map((secret) => secret.credentialKey)
1503
1503
  : [];