@agent-native/dispatch 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/README.md +38 -1
  2. package/dist/actions/apply-dream-proposal.d.ts +3 -0
  3. package/dist/actions/apply-dream-proposal.d.ts.map +1 -0
  4. package/dist/actions/apply-dream-proposal.js +11 -0
  5. package/dist/actions/apply-dream-proposal.js.map +1 -0
  6. package/dist/actions/create-dream-report.d.ts +3 -0
  7. package/dist/actions/create-dream-report.d.ts.map +1 -0
  8. package/dist/actions/create-dream-report.js +67 -0
  9. package/dist/actions/create-dream-report.js.map +1 -0
  10. package/dist/actions/create-pylon-ticket.d.ts +3 -0
  11. package/dist/actions/create-pylon-ticket.d.ts.map +1 -0
  12. package/dist/actions/create-pylon-ticket.js +94 -0
  13. package/dist/actions/create-pylon-ticket.js.map +1 -0
  14. package/dist/actions/create-vault-grant.js +1 -1
  15. package/dist/actions/create-vault-grant.js.map +1 -1
  16. package/dist/actions/create-vault-secret.d.ts.map +1 -1
  17. package/dist/actions/create-vault-secret.js +4 -3
  18. package/dist/actions/create-vault-secret.js.map +1 -1
  19. package/dist/actions/create-workspace-resource.js +3 -3
  20. package/dist/actions/create-workspace-resource.js.map +1 -1
  21. package/dist/actions/delete-workspace-resource.js +1 -1
  22. package/dist/actions/delete-workspace-resource.js.map +1 -1
  23. package/dist/actions/ensure-dream-job.d.ts +3 -0
  24. package/dist/actions/ensure-dream-job.d.ts.map +1 -0
  25. package/dist/actions/ensure-dream-job.js +73 -0
  26. package/dist/actions/ensure-dream-job.js.map +1 -0
  27. package/dist/actions/get-dream-settings.d.ts +3 -0
  28. package/dist/actions/get-dream-settings.d.ts.map +1 -0
  29. package/dist/actions/get-dream-settings.js +11 -0
  30. package/dist/actions/get-dream-settings.js.map +1 -0
  31. package/dist/actions/get-dream.d.ts +3 -0
  32. package/dist/actions/get-dream.d.ts.map +1 -0
  33. package/dist/actions/get-dream.js +13 -0
  34. package/dist/actions/get-dream.js.map +1 -0
  35. package/dist/actions/get-vault-access-settings.d.ts +3 -0
  36. package/dist/actions/get-vault-access-settings.d.ts.map +1 -0
  37. package/dist/actions/get-vault-access-settings.js +10 -0
  38. package/dist/actions/get-vault-access-settings.js.map +1 -0
  39. package/dist/actions/get-workspace-resource-effective-context.d.ts +3 -0
  40. package/dist/actions/get-workspace-resource-effective-context.d.ts.map +1 -0
  41. package/dist/actions/get-workspace-resource-effective-context.js +27 -0
  42. package/dist/actions/get-workspace-resource-effective-context.js.map +1 -0
  43. package/dist/actions/grant-vault-secrets-to-app.js +1 -1
  44. package/dist/actions/grant-vault-secrets-to-app.js.map +1 -1
  45. package/dist/actions/index.d.ts.map +1 -1
  46. package/dist/actions/index.js +38 -4
  47. package/dist/actions/index.js.map +1 -1
  48. package/dist/actions/list-dream-candidates.d.ts +3 -0
  49. package/dist/actions/list-dream-candidates.d.ts.map +1 -0
  50. package/dist/actions/list-dream-candidates.js +68 -0
  51. package/dist/actions/list-dream-candidates.js.map +1 -0
  52. package/dist/actions/list-dreams.d.ts +3 -0
  53. package/dist/actions/list-dreams.d.ts.map +1 -0
  54. package/dist/actions/list-dreams.js +17 -0
  55. package/dist/actions/list-dreams.js.map +1 -0
  56. package/dist/actions/list-integrations-catalog.js +1 -1
  57. package/dist/actions/list-integrations-catalog.js.map +1 -1
  58. package/dist/actions/list-vault-grants.js +1 -1
  59. package/dist/actions/list-vault-grants.js.map +1 -1
  60. package/dist/actions/list-workspace-apps.d.ts.map +1 -1
  61. package/dist/actions/list-workspace-apps.js +5 -1
  62. package/dist/actions/list-workspace-apps.js.map +1 -1
  63. package/dist/actions/list-workspace-resources-for-app.d.ts +3 -0
  64. package/dist/actions/list-workspace-resources-for-app.d.ts.map +1 -0
  65. package/dist/actions/list-workspace-resources-for-app.js +12 -0
  66. package/dist/actions/list-workspace-resources-for-app.js.map +1 -0
  67. package/dist/actions/list-workspace-resources.js +1 -1
  68. package/dist/actions/list-workspace-resources.js.map +1 -1
  69. package/dist/actions/navigate.d.ts +1 -0
  70. package/dist/actions/navigate.d.ts.map +1 -1
  71. package/dist/actions/navigate.js +2 -1
  72. package/dist/actions/navigate.js.map +1 -1
  73. package/dist/actions/preview-dream-proposal.d.ts +3 -0
  74. package/dist/actions/preview-dream-proposal.d.ts.map +1 -0
  75. package/dist/actions/preview-dream-proposal.js +13 -0
  76. package/dist/actions/preview-dream-proposal.js.map +1 -0
  77. package/dist/actions/preview-workspace-resource-change.d.ts +3 -0
  78. package/dist/actions/preview-workspace-resource-change.d.ts.map +1 -0
  79. package/dist/actions/preview-workspace-resource-change.js +24 -0
  80. package/dist/actions/preview-workspace-resource-change.js.map +1 -0
  81. package/dist/actions/reject-dream-proposal.d.ts +3 -0
  82. package/dist/actions/reject-dream-proposal.d.ts.map +1 -0
  83. package/dist/actions/reject-dream-proposal.js +12 -0
  84. package/dist/actions/reject-dream-proposal.js.map +1 -0
  85. package/dist/actions/restore-starter-workspace-resources.d.ts +3 -0
  86. package/dist/actions/restore-starter-workspace-resources.d.ts.map +1 -0
  87. package/dist/actions/restore-starter-workspace-resources.js +14 -0
  88. package/dist/actions/restore-starter-workspace-resources.js.map +1 -0
  89. package/dist/actions/send-code-agent-remote-command.d.ts +3 -0
  90. package/dist/actions/send-code-agent-remote-command.d.ts.map +1 -0
  91. package/dist/actions/send-code-agent-remote-command.js +53 -0
  92. package/dist/actions/send-code-agent-remote-command.js.map +1 -0
  93. package/dist/actions/set-dream-settings.d.ts +3 -0
  94. package/dist/actions/set-dream-settings.d.ts.map +1 -0
  95. package/dist/actions/set-dream-settings.js +41 -0
  96. package/dist/actions/set-dream-settings.js.map +1 -0
  97. package/dist/actions/set-vault-access-settings.d.ts +3 -0
  98. package/dist/actions/set-vault-access-settings.d.ts.map +1 -0
  99. package/dist/actions/set-vault-access-settings.js +13 -0
  100. package/dist/actions/set-vault-access-settings.js.map +1 -0
  101. package/dist/actions/start-workspace-app-creation.d.ts.map +1 -1
  102. package/dist/actions/start-workspace-app-creation.js +6 -0
  103. package/dist/actions/start-workspace-app-creation.js.map +1 -1
  104. package/dist/actions/sync-vault-to-app.js +1 -1
  105. package/dist/actions/sync-vault-to-app.js.map +1 -1
  106. package/dist/actions/update-workspace-app-metadata.d.ts +3 -0
  107. package/dist/actions/update-workspace-app-metadata.d.ts.map +1 -0
  108. package/dist/actions/update-workspace-app-metadata.js +30 -0
  109. package/dist/actions/update-workspace-app-metadata.js.map +1 -0
  110. package/dist/actions/update-workspace-resource.js +1 -1
  111. package/dist/actions/update-workspace-resource.js.map +1 -1
  112. package/dist/actions/view-screen.d.ts.map +1 -1
  113. package/dist/actions/view-screen.js +77 -4
  114. package/dist/actions/view-screen.js.map +1 -1
  115. package/dist/components/app-keys-popover.js +16 -5
  116. package/dist/components/app-keys-popover.js.map +1 -1
  117. package/dist/components/approval-value-block.d.ts +7 -0
  118. package/dist/components/approval-value-block.d.ts.map +1 -0
  119. package/dist/components/approval-value-block.js +22 -0
  120. package/dist/components/approval-value-block.js.map +1 -0
  121. package/dist/components/create-app-popover.d.ts.map +1 -1
  122. package/dist/components/create-app-popover.js +41 -16
  123. package/dist/components/create-app-popover.js.map +1 -1
  124. package/dist/components/dispatch-shell.d.ts +4 -4
  125. package/dist/components/dispatch-shell.d.ts.map +1 -1
  126. package/dist/components/dispatch-shell.js +6 -6
  127. package/dist/components/dispatch-shell.js.map +1 -1
  128. package/dist/components/layout/Layout.d.ts.map +1 -1
  129. package/dist/components/layout/Layout.js +18 -4
  130. package/dist/components/layout/Layout.js.map +1 -1
  131. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  132. package/dist/components/messaging-setup-panel.js +2 -2
  133. package/dist/components/messaging-setup-panel.js.map +1 -1
  134. package/dist/components/ui/chart.d.ts +1 -1
  135. package/dist/components/workspace-app-card.d.ts.map +1 -1
  136. package/dist/components/workspace-app-card.js +63 -3
  137. package/dist/components/workspace-app-card.js.map +1 -1
  138. package/dist/components/workspace-resource-effective-stack.d.ts +11 -0
  139. package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -0
  140. package/dist/components/workspace-resource-effective-stack.js +59 -0
  141. package/dist/components/workspace-resource-effective-stack.js.map +1 -0
  142. package/dist/components/workspace-resource-impact-preview.d.ts +9 -0
  143. package/dist/components/workspace-resource-impact-preview.d.ts.map +1 -0
  144. package/dist/components/workspace-resource-impact-preview.js +39 -0
  145. package/dist/components/workspace-resource-impact-preview.js.map +1 -0
  146. package/dist/db/migrations.d.ts.map +1 -1
  147. package/dist/db/migrations.js +59 -0
  148. package/dist/db/migrations.js.map +1 -1
  149. package/dist/db/schema.d.ts +714 -0
  150. package/dist/db/schema.d.ts.map +1 -1
  151. package/dist/db/schema.js +44 -2
  152. package/dist/db/schema.js.map +1 -1
  153. package/dist/hooks/use-navigation-state.d.ts +3 -0
  154. package/dist/hooks/use-navigation-state.d.ts.map +1 -1
  155. package/dist/hooks/use-navigation-state.js +35 -8
  156. package/dist/hooks/use-navigation-state.js.map +1 -1
  157. package/dist/lib/catch-all-target.d.ts +2 -0
  158. package/dist/lib/catch-all-target.d.ts.map +1 -0
  159. package/dist/lib/catch-all-target.js +95 -0
  160. package/dist/lib/catch-all-target.js.map +1 -0
  161. package/dist/lib/utils.d.ts +2 -1
  162. package/dist/lib/utils.d.ts.map +1 -1
  163. package/dist/lib/utils.js +5 -1
  164. package/dist/lib/utils.js.map +1 -1
  165. package/dist/lib/workspace-apps.d.ts +9 -0
  166. package/dist/lib/workspace-apps.d.ts.map +1 -1
  167. package/dist/lib/workspace-apps.js.map +1 -1
  168. package/dist/routes/index.d.ts.map +1 -1
  169. package/dist/routes/index.js +1 -0
  170. package/dist/routes/index.js.map +1 -1
  171. package/dist/routes/pages/$appId.d.ts +2 -2
  172. package/dist/routes/pages/$appId.d.ts.map +1 -1
  173. package/dist/routes/pages/$appId.js +17 -8
  174. package/dist/routes/pages/$appId.js.map +1 -1
  175. package/dist/routes/pages/approval.d.ts.map +1 -1
  176. package/dist/routes/pages/approval.js +4 -1
  177. package/dist/routes/pages/approval.js.map +1 -1
  178. package/dist/routes/pages/approvals.js +1 -1
  179. package/dist/routes/pages/approvals.js.map +1 -1
  180. package/dist/routes/pages/dream-settings.d.ts +34 -0
  181. package/dist/routes/pages/dream-settings.d.ts.map +1 -0
  182. package/dist/routes/pages/dream-settings.js +68 -0
  183. package/dist/routes/pages/dream-settings.js.map +1 -0
  184. package/dist/routes/pages/dreams.d.ts +5 -0
  185. package/dist/routes/pages/dreams.d.ts.map +1 -0
  186. package/dist/routes/pages/dreams.js +435 -0
  187. package/dist/routes/pages/dreams.js.map +1 -0
  188. package/dist/routes/pages/integrations.d.ts.map +1 -1
  189. package/dist/routes/pages/integrations.js +20 -15
  190. package/dist/routes/pages/integrations.js.map +1 -1
  191. package/dist/routes/pages/new-app.js +1 -1
  192. package/dist/routes/pages/new-app.js.map +1 -1
  193. package/dist/routes/pages/overview.d.ts.map +1 -1
  194. package/dist/routes/pages/overview.js +5 -1
  195. package/dist/routes/pages/overview.js.map +1 -1
  196. package/dist/routes/pages/vault.d.ts.map +1 -1
  197. package/dist/routes/pages/vault.js +23 -5
  198. package/dist/routes/pages/vault.js.map +1 -1
  199. package/dist/routes/pages/workspace.d.ts.map +1 -1
  200. package/dist/routes/pages/workspace.js +187 -35
  201. package/dist/routes/pages/workspace.js.map +1 -1
  202. package/dist/server/lib/app-creation-store.d.ts +13 -0
  203. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  204. package/dist/server/lib/app-creation-store.js +298 -11
  205. package/dist/server/lib/app-creation-store.js.map +1 -1
  206. package/dist/server/lib/dispatch-integrations.d.ts +1 -1
  207. package/dist/server/lib/dispatch-integrations.d.ts.map +1 -1
  208. package/dist/server/lib/dispatch-integrations.js +9 -4
  209. package/dist/server/lib/dispatch-integrations.js.map +1 -1
  210. package/dist/server/lib/dispatch-remote-commands.d.ts +83 -0
  211. package/dist/server/lib/dispatch-remote-commands.d.ts.map +1 -0
  212. package/dist/server/lib/dispatch-remote-commands.js +256 -0
  213. package/dist/server/lib/dispatch-remote-commands.js.map +1 -0
  214. package/dist/server/lib/dispatch-store.d.ts +26 -0
  215. package/dist/server/lib/dispatch-store.d.ts.map +1 -1
  216. package/dist/server/lib/dispatch-store.js +17 -1
  217. package/dist/server/lib/dispatch-store.js.map +1 -1
  218. package/dist/server/lib/dreams-store.d.ts +398 -0
  219. package/dist/server/lib/dreams-store.d.ts.map +1 -0
  220. package/dist/server/lib/dreams-store.js +2330 -0
  221. package/dist/server/lib/dreams-store.js.map +1 -0
  222. package/dist/server/lib/env-config.d.ts.map +1 -1
  223. package/dist/server/lib/env-config.js +5 -0
  224. package/dist/server/lib/env-config.js.map +1 -1
  225. package/dist/server/lib/onboarding-steps.d.ts +12 -0
  226. package/dist/server/lib/onboarding-steps.d.ts.map +1 -0
  227. package/dist/server/lib/onboarding-steps.js +47 -0
  228. package/dist/server/lib/onboarding-steps.js.map +1 -0
  229. package/dist/server/lib/thread-debug-store.d.ts +2 -2
  230. package/dist/server/lib/vault-store.d.ts +55 -0
  231. package/dist/server/lib/vault-store.d.ts.map +1 -1
  232. package/dist/server/lib/vault-store.js +210 -41
  233. package/dist/server/lib/vault-store.js.map +1 -1
  234. package/dist/server/lib/workspace-resources-store.d.ts +181 -17
  235. package/dist/server/lib/workspace-resources-store.d.ts.map +1 -1
  236. package/dist/server/lib/workspace-resources-store.js +737 -108
  237. package/dist/server/lib/workspace-resources-store.js.map +1 -1
  238. package/dist/server/plugins/agent-chat.d.ts.map +1 -1
  239. package/dist/server/plugins/agent-chat.js +2 -1
  240. package/dist/server/plugins/agent-chat.js.map +1 -1
  241. package/dist/server/plugins/core-routes.d.ts.map +1 -1
  242. package/dist/server/plugins/core-routes.js +4 -0
  243. package/dist/server/plugins/core-routes.js.map +1 -1
  244. package/dist/server/plugins/integrations.js +2 -2
  245. package/dist/server/plugins/integrations.js.map +1 -1
  246. package/package.json +15 -11
  247. package/src/actions/apply-dream-proposal.ts +12 -0
  248. package/src/actions/create-dream-report.ts +76 -0
  249. package/src/actions/create-pylon-ticket.ts +109 -0
  250. package/src/actions/create-vault-grant.ts +1 -1
  251. package/src/actions/create-vault-secret.ts +4 -3
  252. package/src/actions/create-workspace-resource.ts +3 -3
  253. package/src/actions/delete-workspace-resource.ts +1 -1
  254. package/src/actions/ensure-dream-job.ts +76 -0
  255. package/src/actions/get-dream-settings.ts +12 -0
  256. package/src/actions/get-dream.ts +14 -0
  257. package/src/actions/get-vault-access-settings.ts +11 -0
  258. package/src/actions/get-workspace-resource-effective-context.ts +34 -0
  259. package/src/actions/grant-vault-secrets-to-app.ts +1 -1
  260. package/src/actions/index.spec.ts +26 -0
  261. package/src/actions/index.ts +39 -4
  262. package/src/actions/list-dream-candidates.ts +77 -0
  263. package/src/actions/list-dreams.ts +17 -0
  264. package/src/actions/list-integrations-catalog.ts +1 -1
  265. package/src/actions/list-vault-grants.ts +1 -1
  266. package/src/actions/list-workspace-apps.ts +5 -1
  267. package/src/actions/list-workspace-resources-for-app.ts +13 -0
  268. package/src/actions/list-workspace-resources.ts +1 -1
  269. package/src/actions/navigate.ts +2 -1
  270. package/src/actions/preview-dream-proposal.ts +14 -0
  271. package/src/actions/preview-workspace-resource-change.ts +25 -0
  272. package/src/actions/reject-dream-proposal.ts +12 -0
  273. package/src/actions/restore-starter-workspace-resources.ts +17 -0
  274. package/src/actions/send-code-agent-remote-command.ts +59 -0
  275. package/src/actions/set-dream-settings.spec.ts +81 -0
  276. package/src/actions/set-dream-settings.ts +44 -0
  277. package/src/actions/set-vault-access-settings.ts +16 -0
  278. package/src/actions/start-workspace-app-creation.ts +8 -0
  279. package/src/actions/sync-vault-to-app.ts +1 -1
  280. package/src/actions/update-workspace-app-metadata.ts +32 -0
  281. package/src/actions/update-workspace-resource.ts +1 -1
  282. package/src/actions/view-screen.ts +94 -3
  283. package/src/components/app-keys-popover.tsx +23 -7
  284. package/src/components/approval-value-block.spec.tsx +59 -0
  285. package/src/components/approval-value-block.tsx +33 -0
  286. package/src/components/create-app-popover.tsx +50 -16
  287. package/src/components/dispatch-shell.tsx +16 -15
  288. package/src/components/layout/Layout.tsx +19 -5
  289. package/src/components/messaging-setup-panel.tsx +54 -39
  290. package/src/components/workspace-app-card.tsx +268 -1
  291. package/src/components/workspace-resource-effective-stack.spec.tsx +125 -0
  292. package/src/components/workspace-resource-effective-stack.tsx +141 -0
  293. package/src/components/workspace-resource-impact-preview.spec.tsx +147 -0
  294. package/src/components/workspace-resource-impact-preview.tsx +116 -0
  295. package/src/db/migrations.ts +59 -0
  296. package/src/db/schema.ts +46 -2
  297. package/src/hooks/use-navigation-state.ts +34 -9
  298. package/src/lib/catch-all-target.spec.ts +218 -0
  299. package/src/lib/catch-all-target.ts +99 -0
  300. package/src/lib/utils.ts +6 -1
  301. package/src/lib/workspace-apps.ts +9 -0
  302. package/src/routes/index.ts +1 -0
  303. package/src/routes/pages/$appId.tsx +21 -8
  304. package/src/routes/pages/approval.tsx +14 -1
  305. package/src/routes/pages/approvals.tsx +1 -1
  306. package/src/routes/pages/dream-settings.spec.ts +130 -0
  307. package/src/routes/pages/dream-settings.ts +103 -0
  308. package/src/routes/pages/dreams.tsx +1828 -0
  309. package/src/routes/pages/integrations.tsx +57 -18
  310. package/src/routes/pages/new-app.tsx +1 -1
  311. package/src/routes/pages/overview.tsx +11 -3
  312. package/src/routes/pages/vault.tsx +76 -9
  313. package/src/routes/pages/workspace.tsx +577 -97
  314. package/src/server/lib/app-creation-store.spec.ts +61 -2
  315. package/src/server/lib/app-creation-store.ts +389 -13
  316. package/src/server/lib/dispatch-integrations.ts +10 -3
  317. package/src/server/lib/dispatch-remote-commands.spec.ts +167 -0
  318. package/src/server/lib/dispatch-remote-commands.ts +375 -0
  319. package/src/server/lib/dispatch-store.ts +37 -1
  320. package/src/server/lib/dreams-store.spec.ts +1492 -0
  321. package/src/server/lib/dreams-store.ts +3168 -0
  322. package/src/server/lib/env-config.ts +5 -0
  323. package/src/server/lib/onboarding-steps.ts +49 -0
  324. package/src/server/lib/vault-store.spec.ts +69 -0
  325. package/src/server/lib/vault-store.ts +266 -49
  326. package/src/server/lib/workspace-resource-approval-lifecycle.spec.ts +236 -0
  327. package/src/server/lib/workspace-resources-store.spec.ts +1106 -0
  328. package/src/server/lib/workspace-resources-store.ts +1001 -134
  329. package/src/server/plugins/agent-chat.ts +2 -1
  330. package/src/server/plugins/core-routes.ts +5 -0
  331. package/src/server/plugins/integrations.ts +2 -2
  332. package/dist/actions/sync-workspace-resources-to-all.d.ts +0 -3
  333. package/dist/actions/sync-workspace-resources-to-all.d.ts.map +0 -1
  334. package/dist/actions/sync-workspace-resources-to-all.js +0 -9
  335. package/dist/actions/sync-workspace-resources-to-all.js.map +0 -1
  336. package/dist/actions/sync-workspace-resources-to-app.d.ts +0 -3
  337. package/dist/actions/sync-workspace-resources-to-app.d.ts.map +0 -1
  338. package/dist/actions/sync-workspace-resources-to-app.js +0 -11
  339. package/dist/actions/sync-workspace-resources-to-app.js.map +0 -1
  340. package/src/actions/sync-workspace-resources-to-all.ts +0 -10
  341. package/src/actions/sync-workspace-resources-to-app.ts +0 -12
@@ -28,6 +28,11 @@ import {
28
28
  } from "@/components/ui/dialog";
29
29
  import { Input } from "@/components/ui/input";
30
30
  import { Label } from "@/components/ui/label";
31
+ import {
32
+ Tooltip,
33
+ TooltipContent,
34
+ TooltipTrigger,
35
+ } from "@/components/ui/tooltip";
31
36
 
32
37
  export function meta() {
33
38
  return [{ title: "Connections — Dispatch" }];
@@ -90,10 +95,12 @@ function ConnectDialog({
90
95
  service,
91
96
  open,
92
97
  onOpenChange,
98
+ accessMode,
93
99
  }: {
94
100
  service: Service;
95
101
  open: boolean;
96
102
  onOpenChange: (next: boolean) => void;
103
+ accessMode: "all-apps" | "manual";
97
104
  }) {
98
105
  const [value, setValue] = useState("");
99
106
  const qc = useQueryClient();
@@ -128,16 +135,18 @@ function ConnectDialog({
128
135
  throw new Error("Secret created but id missing");
129
136
  }
130
137
 
131
- // 2. Grant + sync to every app that declared this credential.
132
- const targets = service.apps.filter((a) => !a.vaultGranted);
133
- for (const app of targets) {
134
- try {
135
- await createGrant.mutateAsync({
136
- secretId,
137
- appId: app.appId,
138
- });
139
- } catch (err) {
140
- console.warn(`grant to ${app.appId} failed`, err);
138
+ // 2. Manual mode needs grants; all-apps mode only needs sync.
139
+ if (accessMode === "manual") {
140
+ const targets = service.apps.filter((a) => !a.vaultGranted);
141
+ for (const app of targets) {
142
+ try {
143
+ await createGrant.mutateAsync({
144
+ secretId,
145
+ appId: app.appId,
146
+ });
147
+ } catch (err) {
148
+ console.warn(`grant to ${app.appId} failed`, err);
149
+ }
141
150
  }
142
151
  }
143
152
  for (const app of service.apps) {
@@ -217,7 +226,13 @@ function ConnectDialog({
217
226
  );
218
227
  }
219
228
 
220
- function ConnectorCard({ service }: { service: Service }) {
229
+ function ConnectorCard({
230
+ service,
231
+ accessMode,
232
+ }: {
233
+ service: Service;
234
+ accessMode: "all-apps" | "manual";
235
+ }) {
221
236
  const [open, setOpen] = useState(false);
222
237
  const isConnected = service.apps.some((a) => a.configured);
223
238
  const appCount = service.apps.length;
@@ -251,10 +266,15 @@ function ConnectorCard({ service }: { service: Service }) {
251
266
  </Badge>
252
267
  )}
253
268
  </div>
254
- <div className="min-w-0">
255
- <div className="text-sm font-semibold text-foreground truncate">
256
- {service.label}
257
- </div>
269
+ <div className="w-full min-w-0">
270
+ <Tooltip>
271
+ <TooltipTrigger asChild>
272
+ <div className="text-sm font-semibold text-foreground truncate">
273
+ {service.label}
274
+ </div>
275
+ </TooltipTrigger>
276
+ <TooltipContent>{service.label}</TooltipContent>
277
+ </Tooltip>
258
278
  <div className="font-mono text-xs text-muted-foreground/80 truncate">
259
279
  {service.key}
260
280
  </div>
@@ -263,7 +283,12 @@ function ConnectorCard({ service }: { service: Service }) {
263
283
  Used by {appCount} {appCount === 1 ? "app" : "apps"}
264
284
  </div>
265
285
  </button>
266
- <ConnectDialog service={service} open={open} onOpenChange={setOpen} />
286
+ <ConnectDialog
287
+ service={service}
288
+ open={open}
289
+ onOpenChange={setOpen}
290
+ accessMode={accessMode}
291
+ />
267
292
  </>
268
293
  );
269
294
  }
@@ -297,7 +322,13 @@ export default function ConnectionsRoute() {
297
322
  "list-integrations-catalog",
298
323
  {},
299
324
  );
325
+ const { data: accessSettings } = useActionQuery(
326
+ "get-vault-access-settings",
327
+ {},
328
+ );
300
329
  const apps = (catalog as CatalogApp[]) || [];
330
+ const accessMode =
331
+ (accessSettings as any)?.mode === "manual" ? "manual" : "all-apps";
301
332
 
302
333
  const services = useMemo<Service[]>(() => {
303
334
  const map = new Map<string, Service>();
@@ -357,7 +388,11 @@ export default function ConnectionsRoute() {
357
388
  </div>
358
389
  <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-3">
359
390
  {available.map((service) => (
360
- <ConnectorCard key={service.key} service={service} />
391
+ <ConnectorCard
392
+ key={service.key}
393
+ service={service}
394
+ accessMode={accessMode}
395
+ />
361
396
  ))}
362
397
  </div>
363
398
  </section>
@@ -373,7 +408,11 @@ export default function ConnectionsRoute() {
373
408
  </div>
374
409
  <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-3">
375
410
  {connected.map((service) => (
376
- <ConnectorCard key={service.key} service={service} />
411
+ <ConnectorCard
412
+ key={service.key}
413
+ service={service}
414
+ accessMode={accessMode}
415
+ />
377
416
  ))}
378
417
  </div>
379
418
  </section>
@@ -9,7 +9,7 @@ export default function NewAppRoute() {
9
9
  return (
10
10
  <DispatchShell
11
11
  title="New App"
12
- description="Create a workspace app from a prompt and grant it selected vault keys."
12
+ description="Create a workspace app from a prompt and apply the workspace vault policy."
13
13
  >
14
14
  <NewWorkspaceAppFlow sourceApp="dispatch" className="px-0 py-0" />
15
15
  </DispatchShell>
@@ -617,7 +617,7 @@ export default function OverviewRoute() {
617
617
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
618
618
  <StatCard
619
619
  label="Vault secrets"
620
- help="Credentials stored in the workspace vault. Grant them to apps from the Vault page."
620
+ help="Credentials stored in the workspace vault."
621
621
  value={data?.vault?.secretCount || 0}
622
622
  icon={IconKey}
623
623
  cta={
@@ -629,8 +629,16 @@ export default function OverviewRoute() {
629
629
  }
630
630
  />
631
631
  <StatCard
632
- label="Active grants"
633
- help="Secrets currently granted to apps. Sync them to push credentials."
632
+ label={
633
+ data?.vault?.accessMode === "manual"
634
+ ? "Active grants"
635
+ : "Accessible keys"
636
+ }
637
+ help={
638
+ data?.vault?.accessMode === "manual"
639
+ ? "Secrets currently granted to apps. Sync them to push credentials."
640
+ : "Vault keys available to every workspace app."
641
+ }
634
642
  value={data?.vault?.activeGrantCount || 0}
635
643
  icon={IconShieldCheck}
636
644
  />
@@ -37,6 +37,7 @@ import {
37
37
  } from "@/components/ui/alert-dialog";
38
38
  import { Input } from "@/components/ui/input";
39
39
  import { Label } from "@/components/ui/label";
40
+ import { Switch } from "@/components/ui/switch";
40
41
  import {
41
42
  Select,
42
43
  SelectContent,
@@ -61,6 +62,8 @@ const PROVIDERS = [
61
62
  "other",
62
63
  ];
63
64
 
65
+ type VaultAccessMode = "all-apps" | "manual";
66
+
64
67
  export function meta() {
65
68
  return [{ title: "Vault — Dispatch" }];
66
69
  }
@@ -241,7 +244,53 @@ function GrantDialog({
241
244
  );
242
245
  }
243
246
 
244
- function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
247
+ function VaultAccessSettingsCard({ mode }: { mode: VaultAccessMode }) {
248
+ const update = useActionMutation("set-vault-access-settings", {
249
+ onSuccess: (next: any) =>
250
+ toast.success(
251
+ next?.mode === "manual"
252
+ ? "Manual vault access enabled"
253
+ : "All apps can use vault keys",
254
+ ),
255
+ onError: (err) => toast.error(String(err)),
256
+ });
257
+ const allApps = mode !== "manual";
258
+
259
+ return (
260
+ <div className="rounded-xl border bg-card px-4 py-3">
261
+ <div className="flex items-center justify-between gap-4">
262
+ <div className="min-w-0">
263
+ <Label className="text-sm font-medium">
264
+ All apps can use vault keys
265
+ </Label>
266
+ <p className="mt-1 text-xs text-muted-foreground">
267
+ {allApps
268
+ ? "Every workspace app can receive every saved key."
269
+ : "Only apps with explicit grants can receive saved keys."}
270
+ </p>
271
+ </div>
272
+ <Switch
273
+ checked={allApps}
274
+ disabled={update.isPending}
275
+ onCheckedChange={(checked) =>
276
+ update.mutate({ mode: checked ? "all-apps" : "manual" })
277
+ }
278
+ aria-label="Allow all workspace apps to use vault keys"
279
+ />
280
+ </div>
281
+ </div>
282
+ );
283
+ }
284
+
285
+ function SecretRow({
286
+ secret,
287
+ grants,
288
+ accessMode,
289
+ }: {
290
+ secret: any;
291
+ grants: any[];
292
+ accessMode: VaultAccessMode;
293
+ }) {
245
294
  const [expanded, setExpanded] = useState(false);
246
295
  const [showValue, setShowValue] = useState(false);
247
296
 
@@ -260,6 +309,7 @@ function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
260
309
  });
261
310
 
262
311
  const activeGrants = grants.filter((g) => g.status === "active");
312
+ const allApps = accessMode !== "manual";
263
313
 
264
314
  return (
265
315
  <div className="rounded-xl border bg-card">
@@ -290,7 +340,9 @@ function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
290
340
  </div>
291
341
  <div className="flex items-center gap-2">
292
342
  <Badge variant="outline" className="text-xs">
293
- {activeGrants.length} grant{activeGrants.length !== 1 ? "s" : ""}
343
+ {allApps
344
+ ? "All apps"
345
+ : `${activeGrants.length} grant${activeGrants.length !== 1 ? "s" : ""}`}
294
346
  </Badge>
295
347
  </div>
296
348
  </button>
@@ -320,11 +372,17 @@ function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
320
372
  <div className="space-y-2">
321
373
  <div className="flex items-center justify-between">
322
374
  <span className="text-xs font-medium text-foreground">
323
- Grants
375
+ {allApps ? "Access" : "Grants"}
324
376
  </span>
325
- <GrantDialog secretId={secret.id} secretName={secret.name} />
377
+ {!allApps && (
378
+ <GrantDialog secretId={secret.id} secretName={secret.name} />
379
+ )}
326
380
  </div>
327
- {activeGrants.length > 0 ? (
381
+ {allApps ? (
382
+ <div className="rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground">
383
+ Available to every workspace app.
384
+ </div>
385
+ ) : activeGrants.length > 0 ? (
328
386
  <div className="space-y-1.5">
329
387
  {activeGrants.map((grant: any) => (
330
388
  <div
@@ -366,7 +424,7 @@ function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
366
424
  </div>
367
425
  ) : (
368
426
  <div className="rounded-lg border border-dashed px-3 py-4 text-center text-xs text-muted-foreground">
369
- No grants yet. Grant this secret to an app to share it.
427
+ No grants yet.
370
428
  </div>
371
429
  )}
372
430
  </div>
@@ -388,8 +446,8 @@ function SecretRow({ secret, grants }: { secret: any; grants: any[] }) {
388
446
  <AlertDialogTitle>Delete this secret?</AlertDialogTitle>
389
447
  <AlertDialogDescription>
390
448
  Removing “{secret.name}” revokes all of its grants. Apps
391
- that depended on this credential will lose access on the
392
- next sync. This cannot be undone.
449
+ that depended on this credential can lose access on the next
450
+ sync. This cannot be undone.
393
451
  </AlertDialogDescription>
394
452
  </AlertDialogHeader>
395
453
  <AlertDialogFooter>
@@ -508,6 +566,12 @@ export default function VaultRoute() {
508
566
  const { data: grants } = useActionQuery("list-vault-grants", {});
509
567
  const { data: requests } = useActionQuery("list-vault-requests", {});
510
568
  const { data: audit } = useActionQuery("list-vault-audit", { limit: 20 });
569
+ const { data: accessSettings } = useActionQuery(
570
+ "get-vault-access-settings",
571
+ {},
572
+ );
573
+ const accessMode: VaultAccessMode =
574
+ (accessSettings as any)?.mode === "manual" ? "manual" : "all-apps";
511
575
 
512
576
  const grantsBySecret = (grants || []).reduce(
513
577
  (acc: Record<string, any[]>, g: any) => {
@@ -525,7 +589,7 @@ export default function VaultRoute() {
525
589
  return (
526
590
  <DispatchShell
527
591
  title="Vault"
528
- description="Centralized secret management for your workspace. Store credentials once, grant them to apps."
592
+ description="Centralized secret management for your workspace. Store credentials once and sync them to apps."
529
593
  >
530
594
  <Tabs defaultValue="secrets">
531
595
  <TabsList>
@@ -547,6 +611,8 @@ export default function VaultRoute() {
547
611
  </TabsList>
548
612
 
549
613
  <TabsContent value="secrets" className="mt-4 space-y-3">
614
+ <VaultAccessSettingsCard mode={accessMode} />
615
+
550
616
  <div className="flex items-center justify-between">
551
617
  <div className="flex items-center gap-2 text-sm text-muted-foreground">
552
618
  <IconKey size={16} />
@@ -576,6 +642,7 @@ export default function VaultRoute() {
576
642
  key={secret.id}
577
643
  secret={secret}
578
644
  grants={grantsBySecret[secret.id] || []}
645
+ accessMode={accessMode}
579
646
  />
580
647
  ))}
581
648