@useatlas/create 0.0.5 → 0.0.7

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 (952) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/index.ts +253 -36
  4. package/package.json +4 -4
  5. package/templates/docker/Dockerfile +1 -1
  6. package/templates/docker/Dockerfile.sidecar +1 -1
  7. package/templates/docker/bin/__tests__/duckdb-ingest.test.ts +17 -14
  8. package/templates/docker/bin/__tests__/failure-threshold.test.ts +148 -0
  9. package/templates/docker/bin/__tests__/fatal-error-propagation.test.ts +267 -0
  10. package/templates/docker/bin/__tests__/profiler-heuristics.test.ts +5 -5
  11. package/templates/docker/bin/__tests__/schema-drift.test.ts +39 -0
  12. package/templates/docker/bin/atlas.ts +981 -1819
  13. package/templates/docker/bin/benchmark.ts +14 -16
  14. package/templates/docker/bin/enrich.ts +7 -2
  15. package/templates/docker/brand.css +13 -0
  16. package/templates/docker/data/cybersec-semantic/catalog.yml +222 -0
  17. package/templates/docker/data/cybersec-semantic/entities/alerts.yml +195 -0
  18. package/templates/docker/data/cybersec-semantic/entities/assets.yml +191 -0
  19. package/templates/docker/data/cybersec-semantic/entities/compliance_assessments.yml +170 -0
  20. package/templates/docker/data/cybersec-semantic/entities/incidents.yml +219 -0
  21. package/templates/docker/data/cybersec-semantic/entities/organizations.yml +136 -0
  22. package/templates/docker/data/cybersec-semantic/entities/plans.yml +114 -0
  23. package/templates/docker/data/cybersec-semantic/entities/remediation_actions.yml +212 -0
  24. package/templates/docker/data/cybersec-semantic/entities/scan_results.yml +215 -0
  25. package/templates/docker/data/cybersec-semantic/entities/scans.yml +180 -0
  26. package/templates/docker/data/cybersec-semantic/entities/subscriptions.yml +184 -0
  27. package/templates/docker/data/cybersec-semantic/entities/users.yml +140 -0
  28. package/templates/docker/data/cybersec-semantic/entities/vulnerabilities.yml +154 -0
  29. package/templates/docker/data/cybersec-semantic/glossary.yml +207 -0
  30. package/templates/docker/data/cybersec-semantic/metrics/business.yml +148 -0
  31. package/templates/docker/data/cybersec-semantic/metrics/compliance.yml +138 -0
  32. package/templates/docker/data/cybersec-semantic/metrics/security.yml +181 -0
  33. package/templates/docker/data/cybersec.sql +8 -8
  34. package/templates/docker/data/demo.sql +3 -0
  35. package/templates/docker/data/ecommerce-semantic/catalog.yml +221 -0
  36. package/templates/docker/data/ecommerce-semantic/entities/categories.yml +91 -0
  37. package/templates/docker/data/ecommerce-semantic/entities/customers.yml +133 -0
  38. package/templates/docker/data/ecommerce-semantic/entities/email_campaigns.yml +119 -0
  39. package/templates/docker/data/ecommerce-semantic/entities/inventory_levels.yml +153 -0
  40. package/templates/docker/data/ecommerce-semantic/entities/order_items.yml +159 -0
  41. package/templates/docker/data/ecommerce-semantic/entities/orders.yml +199 -0
  42. package/templates/docker/data/ecommerce-semantic/entities/payments.yml +140 -0
  43. package/templates/docker/data/ecommerce-semantic/entities/product_reviews.yml +155 -0
  44. package/templates/docker/data/ecommerce-semantic/entities/products.yml +178 -0
  45. package/templates/docker/data/ecommerce-semantic/entities/promotions.yml +171 -0
  46. package/templates/docker/data/ecommerce-semantic/entities/returns.yml +144 -0
  47. package/templates/docker/data/ecommerce-semantic/entities/sellers.yml +124 -0
  48. package/templates/docker/data/ecommerce-semantic/entities/shipments.yml +159 -0
  49. package/templates/docker/data/ecommerce-semantic/glossary.yml +193 -0
  50. package/templates/docker/data/ecommerce-semantic/metrics/customers.yml +116 -0
  51. package/templates/docker/data/ecommerce-semantic/metrics/operations.yml +131 -0
  52. package/templates/docker/data/ecommerce-semantic/metrics/revenue.yml +120 -0
  53. package/templates/docker/docs/deploy.md +2 -1
  54. package/templates/docker/ee/src/__mocks__/internal.ts +170 -0
  55. package/templates/docker/ee/src/audit/purge-scheduler.ts +113 -0
  56. package/templates/docker/ee/src/audit/retention.ts +467 -0
  57. package/templates/docker/ee/src/auth/ip-allowlist.ts +367 -0
  58. package/templates/docker/ee/src/auth/roles.ts +562 -0
  59. package/templates/docker/ee/src/auth/scim.ts +343 -0
  60. package/templates/docker/ee/src/auth/sso.ts +538 -0
  61. package/templates/docker/ee/src/backups/engine.ts +355 -0
  62. package/templates/docker/ee/src/backups/index.ts +26 -0
  63. package/templates/docker/ee/src/backups/restore.ts +169 -0
  64. package/templates/docker/ee/src/backups/scheduler.ts +153 -0
  65. package/templates/docker/ee/src/backups/verify.ts +124 -0
  66. package/templates/docker/ee/src/branding/white-label.ts +228 -0
  67. package/templates/docker/ee/src/compliance/masking.ts +477 -0
  68. package/templates/docker/ee/src/compliance/patterns.ts +16 -0
  69. package/templates/docker/ee/src/compliance/pii-detection.ts +217 -0
  70. package/templates/docker/ee/src/compliance/reports.ts +402 -0
  71. package/templates/docker/ee/src/deploy-mode.ts +37 -0
  72. package/templates/docker/ee/src/governance/approval.ts +699 -0
  73. package/templates/docker/ee/src/index.ts +74 -0
  74. package/templates/docker/ee/src/platform/domains.ts +562 -0
  75. package/templates/docker/ee/src/platform/model-routing.ts +382 -0
  76. package/templates/docker/ee/src/platform/residency.ts +265 -0
  77. package/templates/docker/ee/src/sla/alerting.ts +382 -0
  78. package/templates/docker/ee/src/sla/index.ts +12 -0
  79. package/templates/docker/ee/src/sla/metrics.ts +275 -0
  80. package/templates/docker/ee/src/test-setup.ts +1 -0
  81. package/templates/docker/next.config.ts +4 -1
  82. package/templates/docker/package.json +49 -29
  83. package/templates/docker/sidecar/Dockerfile +1 -1
  84. package/templates/docker/src/api/index.ts +336 -24
  85. package/templates/docker/src/api/routes/actions.ts +443 -176
  86. package/templates/docker/src/api/routes/admin-abuse.ts +219 -0
  87. package/templates/docker/src/api/routes/admin-approval.ts +418 -0
  88. package/templates/docker/src/api/routes/admin-audit-retention.ts +405 -0
  89. package/templates/docker/src/api/routes/admin-auth.ts +122 -0
  90. package/templates/docker/src/api/routes/admin-branding.ts +252 -0
  91. package/templates/docker/src/api/routes/admin-compliance.ts +352 -0
  92. package/templates/docker/src/api/routes/admin-domains.ts +334 -0
  93. package/templates/docker/src/api/routes/admin-integrations.ts +2667 -0
  94. package/templates/docker/src/api/routes/admin-ip-allowlist.ts +261 -0
  95. package/templates/docker/src/api/routes/admin-learned-patterns.ts +525 -0
  96. package/templates/docker/src/api/routes/admin-model-config.ts +252 -0
  97. package/templates/docker/src/api/routes/admin-onboarding-emails.ts +145 -0
  98. package/templates/docker/src/api/routes/admin-orgs.ts +710 -0
  99. package/templates/docker/src/api/routes/admin-prompts.ts +694 -0
  100. package/templates/docker/src/api/routes/admin-residency.ts +570 -0
  101. package/templates/docker/src/api/routes/admin-roles.ts +296 -0
  102. package/templates/docker/src/api/routes/admin-router.ts +120 -0
  103. package/templates/docker/src/api/routes/admin-sandbox.ts +417 -0
  104. package/templates/docker/src/api/routes/admin-scim.ts +262 -0
  105. package/templates/docker/src/api/routes/admin-sso.ts +545 -0
  106. package/templates/docker/src/api/routes/admin-suggestions.ts +176 -0
  107. package/templates/docker/src/api/routes/admin-usage.ts +310 -0
  108. package/templates/docker/src/api/routes/admin.ts +4156 -898
  109. package/templates/docker/src/api/routes/auth-preamble.ts +105 -0
  110. package/templates/docker/src/api/routes/billing.ts +397 -0
  111. package/templates/docker/src/api/routes/chat.ts +597 -334
  112. package/templates/docker/src/api/routes/conversations.ts +987 -132
  113. package/templates/docker/src/api/routes/demo.ts +673 -0
  114. package/templates/docker/src/api/routes/discord.ts +274 -0
  115. package/templates/docker/src/api/routes/ee-error-handler.ts +32 -0
  116. package/templates/docker/src/api/routes/health.ts +129 -14
  117. package/templates/docker/src/api/routes/middleware.ts +244 -0
  118. package/templates/docker/src/api/routes/onboarding-emails.ts +134 -0
  119. package/templates/docker/src/api/routes/onboarding.ts +1109 -0
  120. package/templates/docker/src/api/routes/openapi.ts +184 -1597
  121. package/templates/docker/src/api/routes/platform-admin.ts +760 -0
  122. package/templates/docker/src/api/routes/platform-backups.ts +436 -0
  123. package/templates/docker/src/api/routes/platform-domains.ts +235 -0
  124. package/templates/docker/src/api/routes/platform-residency.ts +257 -0
  125. package/templates/docker/src/api/routes/platform-sla.ts +379 -0
  126. package/templates/docker/src/api/routes/prompts.ts +221 -0
  127. package/templates/docker/src/api/routes/public-branding.ts +106 -0
  128. package/templates/docker/src/api/routes/query.ts +330 -219
  129. package/templates/docker/src/api/routes/scheduled-tasks.ts +393 -297
  130. package/templates/docker/src/api/routes/semantic.ts +179 -0
  131. package/templates/docker/src/api/routes/sessions.ts +210 -0
  132. package/templates/docker/src/api/routes/shared-domains.ts +98 -0
  133. package/templates/docker/src/api/routes/shared-schemas.ts +139 -0
  134. package/templates/docker/src/api/routes/slack.ts +209 -52
  135. package/templates/docker/src/api/routes/suggestions.ts +233 -0
  136. package/templates/docker/src/api/routes/tables.ts +67 -0
  137. package/templates/docker/src/api/routes/teams.ts +222 -0
  138. package/templates/docker/src/api/routes/validate-sql.ts +188 -0
  139. package/templates/docker/src/api/routes/validation-hook.ts +62 -0
  140. package/templates/docker/src/api/routes/widget-loader.ts +356 -0
  141. package/templates/docker/src/api/routes/widget.ts +428 -0
  142. package/templates/docker/src/api/routes/wizard.ts +852 -0
  143. package/templates/docker/src/api/server.ts +187 -69
  144. package/templates/docker/src/app/error.tsx +5 -2
  145. package/templates/docker/src/app/globals.css +1 -1
  146. package/templates/docker/src/app/layout.tsx +7 -2
  147. package/templates/docker/src/app/page.tsx +39 -5
  148. package/templates/docker/src/components/data-table/data-table-column-header.tsx +99 -0
  149. package/templates/docker/src/components/data-table/data-table-date-filter.tsx +225 -0
  150. package/templates/docker/src/components/data-table/data-table-expandable.tsx +125 -0
  151. package/templates/docker/src/components/data-table/data-table-faceted-filter.tsx +189 -0
  152. package/templates/docker/src/components/data-table/data-table-pagination.tsx +112 -0
  153. package/templates/docker/src/components/data-table/data-table-range-filter.tsx +122 -0
  154. package/templates/docker/src/components/data-table/data-table-slider-filter.tsx +256 -0
  155. package/templates/docker/src/components/data-table/data-table-sort-list.tsx +407 -0
  156. package/templates/docker/src/components/data-table/data-table-toolbar.tsx +149 -0
  157. package/templates/docker/src/components/data-table/data-table-view-options.tsx +89 -0
  158. package/templates/docker/src/components/data-table/data-table.tsx +105 -0
  159. package/templates/docker/src/components/form-dialog.tsx +135 -0
  160. package/templates/docker/src/components/ui/accordion.tsx +66 -0
  161. package/templates/docker/src/components/ui/calendar.tsx +220 -0
  162. package/templates/docker/src/components/ui/checkbox.tsx +32 -0
  163. package/templates/docker/src/components/ui/faceted.tsx +283 -0
  164. package/templates/docker/src/components/ui/form.tsx +167 -0
  165. package/templates/docker/src/components/ui/label.tsx +24 -0
  166. package/templates/docker/src/components/ui/popover.tsx +89 -0
  167. package/templates/docker/src/components/ui/progress.tsx +31 -0
  168. package/templates/docker/src/components/ui/scroll-area.tsx +6 -2
  169. package/templates/docker/src/components/ui/slider.tsx +63 -0
  170. package/templates/docker/src/components/ui/sortable.tsx +581 -0
  171. package/templates/docker/src/components/ui/switch.tsx +35 -0
  172. package/templates/docker/src/components/ui/textarea.tsx +18 -0
  173. package/templates/docker/src/config/data-table.ts +82 -0
  174. package/templates/docker/src/env-check.ts +74 -0
  175. package/templates/docker/src/hooks/use-callback-ref.ts +27 -0
  176. package/templates/docker/src/hooks/use-data-table.ts +316 -0
  177. package/templates/docker/src/hooks/use-debounced-callback.ts +28 -0
  178. package/templates/docker/src/lib/action-types.ts +7 -41
  179. package/templates/docker/src/lib/agent-query.ts +4 -2
  180. package/templates/docker/src/lib/agent.ts +363 -31
  181. package/templates/docker/src/lib/auth/admin-permissions.ts +38 -0
  182. package/templates/docker/src/lib/auth/audit.ts +19 -4
  183. package/templates/docker/src/lib/auth/byot.ts +3 -3
  184. package/templates/docker/src/lib/auth/client.ts +33 -3
  185. package/templates/docker/src/lib/auth/detect.ts +29 -8
  186. package/templates/docker/src/lib/auth/managed.ts +104 -14
  187. package/templates/docker/src/lib/auth/middleware.ts +53 -6
  188. package/templates/docker/src/lib/auth/migrate.ts +140 -15
  189. package/templates/docker/src/lib/auth/oauth-state.ts +123 -0
  190. package/templates/docker/src/lib/auth/org-permissions.ts +55 -0
  191. package/templates/docker/src/lib/auth/permissions.ts +26 -19
  192. package/templates/docker/src/lib/auth/server.ts +355 -9
  193. package/templates/docker/src/lib/auth/simple-key.ts +3 -3
  194. package/templates/docker/src/lib/auth/types.ts +15 -21
  195. package/templates/docker/src/lib/billing/enforcement.ts +368 -0
  196. package/templates/docker/src/lib/billing/plans.ts +155 -0
  197. package/templates/docker/src/lib/cache/index.ts +92 -0
  198. package/templates/docker/src/lib/cache/keys.ts +30 -0
  199. package/templates/docker/src/lib/cache/lru.ts +79 -0
  200. package/templates/docker/src/lib/cache/types.ts +31 -0
  201. package/templates/docker/src/lib/compose-refs.ts +62 -0
  202. package/templates/docker/src/lib/config.ts +563 -11
  203. package/templates/docker/src/lib/connection-types.ts +9 -0
  204. package/templates/docker/src/lib/conversation-types.ts +1 -25
  205. package/templates/docker/src/lib/conversations.ts +345 -14
  206. package/templates/docker/src/lib/data-table.ts +61 -0
  207. package/templates/docker/src/lib/db/connection.ts +793 -39
  208. package/templates/docker/src/lib/db/internal.ts +985 -139
  209. package/templates/docker/src/lib/db/migrate.ts +295 -0
  210. package/templates/docker/src/lib/db/migrations/0000_baseline.sql +703 -0
  211. package/templates/docker/src/lib/db/migrations/0001_teams_installations.sql +14 -0
  212. package/templates/docker/src/lib/db/migrations/0002_discord_installations.sql +14 -0
  213. package/templates/docker/src/lib/db/migrations/0003_telegram_installations.sql +15 -0
  214. package/templates/docker/src/lib/db/migrations/0004_sandbox_credentials.sql +18 -0
  215. package/templates/docker/src/lib/db/migrations/0005_oauth_state.sql +16 -0
  216. package/templates/docker/src/lib/db/migrations/0006_byot_credentials.sql +14 -0
  217. package/templates/docker/src/lib/db/migrations/0007_gchat_installations.sql +15 -0
  218. package/templates/docker/src/lib/db/migrations/0008_github_installations.sql +14 -0
  219. package/templates/docker/src/lib/db/migrations/0009_linear_installations.sql +15 -0
  220. package/templates/docker/src/lib/db/migrations/0010_whatsapp_installations.sql +14 -0
  221. package/templates/docker/src/lib/db/migrations/0011_email_installations.sql +16 -0
  222. package/templates/docker/src/lib/db/migrations/0012_region_migrations.sql +25 -0
  223. package/templates/docker/src/lib/db/schema.ts +1120 -0
  224. package/templates/docker/src/lib/db/source-rate-limit.ts +89 -139
  225. package/templates/docker/src/lib/demo.ts +308 -0
  226. package/templates/docker/src/lib/discord/store.ts +225 -0
  227. package/templates/docker/src/lib/effect/ai.ts +243 -0
  228. package/templates/docker/src/lib/effect/errors.ts +234 -0
  229. package/templates/docker/src/lib/effect/hono.ts +454 -0
  230. package/templates/docker/src/lib/effect/index.ts +137 -0
  231. package/templates/docker/src/lib/effect/layers.ts +496 -0
  232. package/templates/docker/src/lib/effect/services.ts +776 -0
  233. package/templates/docker/src/lib/effect/sql.ts +178 -0
  234. package/templates/docker/src/lib/effect/toolkit.ts +123 -0
  235. package/templates/docker/src/lib/email/delivery.ts +232 -0
  236. package/templates/docker/src/lib/email/engine.ts +349 -0
  237. package/templates/docker/src/lib/email/hooks.ts +107 -0
  238. package/templates/docker/src/lib/email/index.ts +16 -0
  239. package/templates/docker/src/lib/email/scheduler.ts +72 -0
  240. package/templates/docker/src/lib/email/sequence.ts +73 -0
  241. package/templates/docker/src/lib/email/store.ts +163 -0
  242. package/templates/docker/src/lib/email/templates.ts +215 -0
  243. package/templates/docker/src/lib/format.ts +67 -0
  244. package/templates/docker/src/lib/gchat/store.ts +202 -0
  245. package/templates/docker/src/lib/github/store.ts +197 -0
  246. package/templates/docker/src/lib/id.ts +29 -0
  247. package/templates/docker/src/lib/integrations/types.ts +166 -0
  248. package/templates/docker/src/lib/learn/pattern-analyzer.ts +224 -0
  249. package/templates/docker/src/lib/learn/pattern-cache.ts +229 -0
  250. package/templates/docker/src/lib/learn/pattern-proposer.ts +87 -0
  251. package/templates/docker/src/lib/learn/suggestion-helpers.ts +34 -0
  252. package/templates/docker/src/lib/learn/suggestions.ts +139 -0
  253. package/templates/docker/src/lib/linear/store.ts +200 -0
  254. package/templates/docker/src/lib/logger.ts +35 -3
  255. package/templates/docker/src/lib/metering.ts +272 -0
  256. package/templates/docker/src/lib/parsers.ts +99 -0
  257. package/templates/docker/src/lib/plugins/hooks.ts +13 -11
  258. package/templates/docker/src/lib/plugins/index.ts +3 -1
  259. package/templates/docker/src/lib/plugins/registry.ts +58 -6
  260. package/templates/docker/src/lib/plugins/settings.ts +147 -0
  261. package/templates/docker/src/lib/plugins/wiring.ts +6 -9
  262. package/templates/docker/src/lib/profiler.ts +1665 -0
  263. package/templates/docker/src/lib/providers.ts +188 -13
  264. package/templates/docker/src/lib/rls.ts +172 -60
  265. package/templates/docker/src/lib/sandbox/credentials.ts +206 -0
  266. package/templates/docker/src/lib/sandbox/validate.ts +179 -0
  267. package/templates/docker/src/lib/scheduled-task-types.ts +26 -94
  268. package/templates/docker/src/lib/scheduled-tasks.ts +174 -34
  269. package/templates/docker/src/lib/scheduler/delivery.ts +248 -150
  270. package/templates/docker/src/lib/scheduler/engine.ts +190 -154
  271. package/templates/docker/src/lib/scheduler/executor.ts +74 -23
  272. package/templates/docker/src/lib/scheduler/preview.ts +72 -0
  273. package/templates/docker/src/lib/security/abuse.ts +463 -0
  274. package/templates/docker/src/lib/semantic/diff.ts +267 -0
  275. package/templates/docker/src/lib/semantic/entities.ts +167 -0
  276. package/templates/docker/src/lib/semantic/files.ts +283 -0
  277. package/templates/docker/src/lib/semantic/index.ts +27 -0
  278. package/templates/docker/src/lib/{semantic-index.ts → semantic/search.ts} +80 -9
  279. package/templates/docker/src/lib/semantic/sync.ts +581 -0
  280. package/templates/docker/src/lib/{semantic.ts → semantic/whitelist.ts} +189 -3
  281. package/templates/docker/src/lib/settings.ts +817 -0
  282. package/templates/docker/src/lib/sidecar-types.ts +13 -0
  283. package/templates/docker/src/lib/slack/store.ts +134 -25
  284. package/templates/docker/src/lib/startup.ts +528 -362
  285. package/templates/docker/src/lib/teams/store.ts +216 -0
  286. package/templates/docker/src/lib/telegram/store.ts +202 -0
  287. package/templates/docker/src/lib/telemetry.ts +40 -0
  288. package/templates/docker/src/lib/tools/actions/audit.ts +8 -5
  289. package/templates/docker/src/lib/tools/actions/email.ts +3 -1
  290. package/templates/docker/src/lib/tools/actions/handler.ts +276 -93
  291. package/templates/docker/src/lib/tools/actions/jira.ts +2 -2
  292. package/templates/docker/src/lib/tools/backends/detect.ts +16 -0
  293. package/templates/docker/src/lib/tools/backends/index.ts +11 -0
  294. package/templates/docker/src/lib/tools/backends/nsjail.ts +213 -0
  295. package/templates/docker/src/lib/tools/backends/shared.ts +103 -0
  296. package/templates/docker/src/lib/tools/backends/types.ts +26 -0
  297. package/templates/docker/src/lib/tools/explore-nsjail.ts +7 -228
  298. package/templates/docker/src/lib/tools/explore-sandbox.ts +4 -29
  299. package/templates/docker/src/lib/tools/explore-sidecar.ts +18 -2
  300. package/templates/docker/src/lib/tools/explore.ts +246 -54
  301. package/templates/docker/src/lib/tools/index.ts +17 -0
  302. package/templates/docker/src/lib/tools/python-nsjail.ts +11 -139
  303. package/templates/docker/src/lib/tools/python-sandbox.ts +9 -132
  304. package/templates/docker/src/lib/tools/python-sidecar.ts +184 -3
  305. package/templates/docker/src/lib/tools/python-stream.ts +33 -0
  306. package/templates/docker/src/lib/tools/python-wrapper.ts +129 -0
  307. package/templates/docker/src/lib/tools/python.ts +115 -15
  308. package/templates/docker/src/lib/tools/registry.ts +14 -2
  309. package/templates/docker/src/lib/tools/sql.ts +778 -362
  310. package/templates/docker/src/lib/tracing.ts +16 -0
  311. package/templates/docker/src/lib/whatsapp/store.ts +198 -0
  312. package/templates/docker/src/lib/workspace.ts +89 -0
  313. package/templates/docker/src/progress.ts +121 -0
  314. package/templates/docker/src/types/data-table.ts +48 -0
  315. package/templates/docker/src/ui/atlas-chat-reexport.ts +3 -0
  316. package/templates/docker/src/ui/components/actions/action-approval-card.tsx +26 -19
  317. package/templates/docker/src/ui/components/actions/action-status-badge.tsx +3 -3
  318. package/templates/docker/src/ui/components/admin/admin-layout.tsx +57 -39
  319. package/templates/docker/src/ui/components/admin/admin-sidebar.tsx +213 -35
  320. package/templates/docker/src/ui/components/admin/delivery-status-badge.tsx +53 -0
  321. package/templates/docker/src/ui/components/admin/empty-state.tsx +27 -6
  322. package/templates/docker/src/ui/components/admin/entity-detail.tsx +3 -52
  323. package/templates/docker/src/ui/components/admin/error-banner.tsx +2 -2
  324. package/templates/docker/src/ui/components/admin/feature-disabled.tsx +28 -5
  325. package/templates/docker/src/ui/components/admin-content-wrapper.tsx +87 -0
  326. package/templates/docker/src/ui/components/atlas-chat.tsx +449 -166
  327. package/templates/docker/src/ui/components/branding-head.tsx +41 -0
  328. package/templates/docker/src/ui/components/chart/chart-detection.ts +62 -5
  329. package/templates/docker/src/ui/components/chart/result-chart.tsx +316 -125
  330. package/templates/docker/src/ui/components/chat/api-key-bar.tsx +4 -4
  331. package/templates/docker/src/ui/components/chat/data-table.tsx +45 -4
  332. package/templates/docker/src/ui/components/chat/error-banner.tsx +86 -5
  333. package/templates/docker/src/ui/components/chat/follow-up-chips.tsx +29 -0
  334. package/templates/docker/src/ui/components/chat/markdown.tsx +24 -0
  335. package/templates/docker/src/ui/components/chat/prompt-library.tsx +206 -0
  336. package/templates/docker/src/ui/components/chat/python-result-card.tsx +106 -78
  337. package/templates/docker/src/ui/components/chat/result-card-base.tsx +101 -0
  338. package/templates/docker/src/ui/components/chat/share-dialog.tsx +377 -0
  339. package/templates/docker/src/ui/components/chat/sql-result-card.tsx +94 -73
  340. package/templates/docker/src/ui/components/chat/suggestion-chips.tsx +46 -0
  341. package/templates/docker/src/ui/components/chat/tool-part.tsx +16 -4
  342. package/templates/docker/src/ui/components/conversations/conversation-item.tsx +48 -17
  343. package/templates/docker/src/ui/components/conversations/conversation-list.tsx +38 -24
  344. package/templates/docker/src/ui/components/conversations/conversation-sidebar.tsx +66 -7
  345. package/templates/docker/src/ui/components/conversations/delete-confirmation.tsx +9 -2
  346. package/templates/docker/src/ui/components/error-boundary.tsx +66 -0
  347. package/templates/docker/src/ui/components/notebook/delete-cell-dialog.tsx +48 -0
  348. package/templates/docker/src/ui/components/notebook/fork-branch-selector.tsx +68 -0
  349. package/templates/docker/src/ui/components/notebook/notebook-cell-input.tsx +76 -0
  350. package/templates/docker/src/ui/components/notebook/notebook-cell-output.tsx +58 -0
  351. package/templates/docker/src/ui/components/notebook/notebook-cell-toolbar.tsx +91 -0
  352. package/templates/docker/src/ui/components/notebook/notebook-cell.tsx +119 -0
  353. package/templates/docker/src/ui/components/notebook/notebook-empty-state.tsx +19 -0
  354. package/templates/docker/src/ui/components/notebook/notebook-export.ts +287 -0
  355. package/templates/docker/src/ui/components/notebook/notebook-input-bar.tsx +49 -0
  356. package/templates/docker/src/ui/components/notebook/notebook-shell.tsx +266 -0
  357. package/templates/docker/src/ui/components/notebook/notebook-text-cell.tsx +152 -0
  358. package/templates/docker/src/ui/components/notebook/types.ts +39 -0
  359. package/templates/docker/src/ui/components/notebook/use-keyboard-nav.ts +109 -0
  360. package/templates/docker/src/ui/components/notebook/use-notebook.ts +684 -0
  361. package/templates/docker/src/ui/components/org-switcher.tsx +111 -0
  362. package/templates/docker/src/ui/components/region-picker.tsx +103 -0
  363. package/templates/docker/src/ui/components/schema-explorer/schema-explorer.tsx +522 -0
  364. package/templates/docker/src/ui/components/social-icons.tsx +26 -0
  365. package/templates/docker/src/ui/components/tour/guided-tour.tsx +81 -0
  366. package/templates/docker/src/ui/components/tour/index.ts +5 -0
  367. package/templates/docker/src/ui/components/tour/nav-bar.tsx +100 -0
  368. package/templates/docker/src/ui/components/tour/tour-overlay.tsx +298 -0
  369. package/templates/docker/src/ui/components/tour/tour-steps.ts +43 -0
  370. package/templates/docker/src/ui/components/tour/types.ts +21 -0
  371. package/templates/docker/src/ui/components/tour/use-tour.ts +193 -0
  372. package/templates/docker/src/ui/context-reexport.ts +3 -0
  373. package/templates/docker/src/ui/hooks/theme-init-script.ts +17 -0
  374. package/templates/docker/src/ui/hooks/use-admin-fetch.ts +38 -30
  375. package/templates/docker/src/ui/hooks/use-admin-mutation.ts +188 -0
  376. package/templates/docker/src/ui/hooks/use-atlas-transport.ts +225 -0
  377. package/templates/docker/src/ui/hooks/use-branding.ts +68 -0
  378. package/templates/docker/src/ui/hooks/use-conversations.ts +106 -83
  379. package/templates/docker/src/ui/hooks/use-dark-mode.ts +134 -10
  380. package/templates/docker/src/ui/hooks/use-deploy-mode.ts +36 -0
  381. package/templates/docker/src/ui/hooks/use-platform-admin-guard.ts +49 -0
  382. package/templates/docker/src/ui/lib/action-types.ts +11 -63
  383. package/templates/docker/src/ui/lib/admin-schemas.ts +744 -0
  384. package/templates/docker/src/ui/lib/fetch-client.ts +84 -0
  385. package/templates/docker/src/ui/lib/fetch-error.ts +54 -0
  386. package/templates/docker/src/ui/lib/helpers.ts +94 -1
  387. package/templates/docker/src/ui/lib/types.ts +149 -140
  388. package/templates/docker/tsconfig.json +4 -2
  389. package/templates/nextjs-standalone/bin/__tests__/duckdb-ingest.test.ts +17 -14
  390. package/templates/nextjs-standalone/bin/__tests__/failure-threshold.test.ts +148 -0
  391. package/templates/nextjs-standalone/bin/__tests__/fatal-error-propagation.test.ts +267 -0
  392. package/templates/nextjs-standalone/bin/__tests__/profiler-heuristics.test.ts +5 -5
  393. package/templates/nextjs-standalone/bin/__tests__/schema-drift.test.ts +39 -0
  394. package/templates/nextjs-standalone/bin/atlas.ts +981 -1819
  395. package/templates/nextjs-standalone/bin/benchmark.ts +14 -16
  396. package/templates/nextjs-standalone/bin/enrich.ts +7 -2
  397. package/templates/nextjs-standalone/brand.css +13 -0
  398. package/templates/nextjs-standalone/data/cybersec-semantic/catalog.yml +222 -0
  399. package/templates/nextjs-standalone/data/cybersec-semantic/entities/alerts.yml +195 -0
  400. package/templates/nextjs-standalone/data/cybersec-semantic/entities/assets.yml +191 -0
  401. package/templates/nextjs-standalone/data/cybersec-semantic/entities/compliance_assessments.yml +170 -0
  402. package/templates/nextjs-standalone/data/cybersec-semantic/entities/incidents.yml +219 -0
  403. package/templates/nextjs-standalone/data/cybersec-semantic/entities/organizations.yml +136 -0
  404. package/templates/nextjs-standalone/data/cybersec-semantic/entities/plans.yml +114 -0
  405. package/templates/nextjs-standalone/data/cybersec-semantic/entities/remediation_actions.yml +212 -0
  406. package/templates/nextjs-standalone/data/cybersec-semantic/entities/scan_results.yml +215 -0
  407. package/templates/nextjs-standalone/data/cybersec-semantic/entities/scans.yml +180 -0
  408. package/templates/nextjs-standalone/data/cybersec-semantic/entities/subscriptions.yml +184 -0
  409. package/templates/nextjs-standalone/data/cybersec-semantic/entities/users.yml +140 -0
  410. package/templates/nextjs-standalone/data/cybersec-semantic/entities/vulnerabilities.yml +154 -0
  411. package/templates/nextjs-standalone/data/cybersec-semantic/glossary.yml +207 -0
  412. package/templates/nextjs-standalone/data/cybersec-semantic/metrics/business.yml +148 -0
  413. package/templates/nextjs-standalone/data/cybersec-semantic/metrics/compliance.yml +138 -0
  414. package/templates/nextjs-standalone/data/cybersec-semantic/metrics/security.yml +181 -0
  415. package/templates/nextjs-standalone/data/cybersec.sql +8 -8
  416. package/templates/nextjs-standalone/data/demo.sql +3 -0
  417. package/templates/nextjs-standalone/data/ecommerce-semantic/catalog.yml +221 -0
  418. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/categories.yml +91 -0
  419. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/customers.yml +133 -0
  420. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/email_campaigns.yml +119 -0
  421. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/inventory_levels.yml +153 -0
  422. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/order_items.yml +159 -0
  423. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/orders.yml +199 -0
  424. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/payments.yml +140 -0
  425. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/product_reviews.yml +155 -0
  426. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/products.yml +178 -0
  427. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/promotions.yml +171 -0
  428. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/returns.yml +144 -0
  429. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/sellers.yml +124 -0
  430. package/templates/nextjs-standalone/data/ecommerce-semantic/entities/shipments.yml +159 -0
  431. package/templates/nextjs-standalone/data/ecommerce-semantic/glossary.yml +193 -0
  432. package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/customers.yml +116 -0
  433. package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/operations.yml +131 -0
  434. package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/revenue.yml +120 -0
  435. package/templates/nextjs-standalone/docs/deploy.md +2 -1
  436. package/templates/nextjs-standalone/ee/src/__mocks__/internal.ts +170 -0
  437. package/templates/nextjs-standalone/ee/src/audit/purge-scheduler.ts +113 -0
  438. package/templates/nextjs-standalone/ee/src/audit/retention.ts +467 -0
  439. package/templates/nextjs-standalone/ee/src/auth/ip-allowlist.ts +367 -0
  440. package/templates/nextjs-standalone/ee/src/auth/roles.ts +562 -0
  441. package/templates/nextjs-standalone/ee/src/auth/scim.ts +343 -0
  442. package/templates/nextjs-standalone/ee/src/auth/sso.ts +538 -0
  443. package/templates/nextjs-standalone/ee/src/backups/engine.ts +355 -0
  444. package/templates/nextjs-standalone/ee/src/backups/index.ts +26 -0
  445. package/templates/nextjs-standalone/ee/src/backups/restore.ts +169 -0
  446. package/templates/nextjs-standalone/ee/src/backups/scheduler.ts +153 -0
  447. package/templates/nextjs-standalone/ee/src/backups/verify.ts +124 -0
  448. package/templates/nextjs-standalone/ee/src/branding/white-label.ts +228 -0
  449. package/templates/nextjs-standalone/ee/src/compliance/masking.ts +477 -0
  450. package/templates/nextjs-standalone/ee/src/compliance/patterns.ts +16 -0
  451. package/templates/nextjs-standalone/ee/src/compliance/pii-detection.ts +217 -0
  452. package/templates/nextjs-standalone/ee/src/compliance/reports.ts +402 -0
  453. package/templates/nextjs-standalone/ee/src/deploy-mode.ts +37 -0
  454. package/templates/nextjs-standalone/ee/src/governance/approval.ts +699 -0
  455. package/templates/nextjs-standalone/ee/src/index.ts +74 -0
  456. package/templates/nextjs-standalone/ee/src/platform/domains.ts +562 -0
  457. package/templates/nextjs-standalone/ee/src/platform/model-routing.ts +382 -0
  458. package/templates/nextjs-standalone/ee/src/platform/residency.ts +265 -0
  459. package/templates/nextjs-standalone/ee/src/sla/alerting.ts +382 -0
  460. package/templates/nextjs-standalone/ee/src/sla/index.ts +12 -0
  461. package/templates/nextjs-standalone/ee/src/sla/metrics.ts +275 -0
  462. package/templates/nextjs-standalone/ee/src/test-setup.ts +1 -0
  463. package/templates/nextjs-standalone/next.config.ts +1 -1
  464. package/templates/nextjs-standalone/package.json +50 -30
  465. package/templates/nextjs-standalone/src/api/index.ts +336 -24
  466. package/templates/nextjs-standalone/src/api/routes/actions.ts +443 -176
  467. package/templates/nextjs-standalone/src/api/routes/admin-abuse.ts +219 -0
  468. package/templates/nextjs-standalone/src/api/routes/admin-approval.ts +418 -0
  469. package/templates/nextjs-standalone/src/api/routes/admin-audit-retention.ts +405 -0
  470. package/templates/nextjs-standalone/src/api/routes/admin-auth.ts +122 -0
  471. package/templates/nextjs-standalone/src/api/routes/admin-branding.ts +252 -0
  472. package/templates/nextjs-standalone/src/api/routes/admin-compliance.ts +352 -0
  473. package/templates/nextjs-standalone/src/api/routes/admin-domains.ts +334 -0
  474. package/templates/nextjs-standalone/src/api/routes/admin-integrations.ts +2667 -0
  475. package/templates/nextjs-standalone/src/api/routes/admin-ip-allowlist.ts +261 -0
  476. package/templates/nextjs-standalone/src/api/routes/admin-learned-patterns.ts +525 -0
  477. package/templates/nextjs-standalone/src/api/routes/admin-model-config.ts +252 -0
  478. package/templates/nextjs-standalone/src/api/routes/admin-onboarding-emails.ts +145 -0
  479. package/templates/nextjs-standalone/src/api/routes/admin-orgs.ts +710 -0
  480. package/templates/nextjs-standalone/src/api/routes/admin-prompts.ts +694 -0
  481. package/templates/nextjs-standalone/src/api/routes/admin-residency.ts +570 -0
  482. package/templates/nextjs-standalone/src/api/routes/admin-roles.ts +296 -0
  483. package/templates/nextjs-standalone/src/api/routes/admin-router.ts +120 -0
  484. package/templates/nextjs-standalone/src/api/routes/admin-sandbox.ts +417 -0
  485. package/templates/nextjs-standalone/src/api/routes/admin-scim.ts +262 -0
  486. package/templates/nextjs-standalone/src/api/routes/admin-sso.ts +545 -0
  487. package/templates/nextjs-standalone/src/api/routes/admin-suggestions.ts +176 -0
  488. package/templates/nextjs-standalone/src/api/routes/admin-usage.ts +310 -0
  489. package/templates/nextjs-standalone/src/api/routes/admin.ts +4156 -898
  490. package/templates/nextjs-standalone/src/api/routes/auth-preamble.ts +105 -0
  491. package/templates/nextjs-standalone/src/api/routes/billing.ts +397 -0
  492. package/templates/nextjs-standalone/src/api/routes/chat.ts +597 -334
  493. package/templates/nextjs-standalone/src/api/routes/conversations.ts +987 -132
  494. package/templates/nextjs-standalone/src/api/routes/demo.ts +673 -0
  495. package/templates/nextjs-standalone/src/api/routes/discord.ts +274 -0
  496. package/templates/nextjs-standalone/src/api/routes/ee-error-handler.ts +32 -0
  497. package/templates/nextjs-standalone/src/api/routes/health.ts +129 -14
  498. package/templates/nextjs-standalone/src/api/routes/middleware.ts +244 -0
  499. package/templates/nextjs-standalone/src/api/routes/onboarding-emails.ts +134 -0
  500. package/templates/nextjs-standalone/src/api/routes/onboarding.ts +1109 -0
  501. package/templates/nextjs-standalone/src/api/routes/openapi.ts +184 -1597
  502. package/templates/nextjs-standalone/src/api/routes/platform-admin.ts +760 -0
  503. package/templates/nextjs-standalone/src/api/routes/platform-backups.ts +436 -0
  504. package/templates/nextjs-standalone/src/api/routes/platform-domains.ts +235 -0
  505. package/templates/nextjs-standalone/src/api/routes/platform-residency.ts +257 -0
  506. package/templates/nextjs-standalone/src/api/routes/platform-sla.ts +379 -0
  507. package/templates/nextjs-standalone/src/api/routes/prompts.ts +221 -0
  508. package/templates/nextjs-standalone/src/api/routes/public-branding.ts +106 -0
  509. package/templates/nextjs-standalone/src/api/routes/query.ts +330 -219
  510. package/templates/nextjs-standalone/src/api/routes/scheduled-tasks.ts +393 -297
  511. package/templates/nextjs-standalone/src/api/routes/semantic.ts +179 -0
  512. package/templates/nextjs-standalone/src/api/routes/sessions.ts +210 -0
  513. package/templates/nextjs-standalone/src/api/routes/shared-domains.ts +98 -0
  514. package/templates/nextjs-standalone/src/api/routes/shared-schemas.ts +139 -0
  515. package/templates/nextjs-standalone/src/api/routes/slack.ts +209 -52
  516. package/templates/nextjs-standalone/src/api/routes/suggestions.ts +233 -0
  517. package/templates/nextjs-standalone/src/api/routes/tables.ts +67 -0
  518. package/templates/nextjs-standalone/src/api/routes/teams.ts +222 -0
  519. package/templates/nextjs-standalone/src/api/routes/validate-sql.ts +188 -0
  520. package/templates/nextjs-standalone/src/api/routes/validation-hook.ts +62 -0
  521. package/templates/nextjs-standalone/src/api/routes/widget-loader.ts +356 -0
  522. package/templates/nextjs-standalone/src/api/routes/widget.ts +428 -0
  523. package/templates/nextjs-standalone/src/api/routes/wizard.ts +852 -0
  524. package/templates/nextjs-standalone/src/api/server.ts +187 -69
  525. package/templates/nextjs-standalone/src/app/error.tsx +5 -2
  526. package/templates/nextjs-standalone/src/app/globals.css +1 -1
  527. package/templates/nextjs-standalone/src/app/layout.tsx +7 -2
  528. package/templates/nextjs-standalone/src/app/page.tsx +39 -5
  529. package/templates/nextjs-standalone/src/components/data-table/data-table-column-header.tsx +99 -0
  530. package/templates/nextjs-standalone/src/components/data-table/data-table-date-filter.tsx +225 -0
  531. package/templates/nextjs-standalone/src/components/data-table/data-table-expandable.tsx +125 -0
  532. package/templates/nextjs-standalone/src/components/data-table/data-table-faceted-filter.tsx +189 -0
  533. package/templates/nextjs-standalone/src/components/data-table/data-table-pagination.tsx +112 -0
  534. package/templates/nextjs-standalone/src/components/data-table/data-table-range-filter.tsx +122 -0
  535. package/templates/nextjs-standalone/src/components/data-table/data-table-slider-filter.tsx +256 -0
  536. package/templates/nextjs-standalone/src/components/data-table/data-table-sort-list.tsx +407 -0
  537. package/templates/nextjs-standalone/src/components/data-table/data-table-toolbar.tsx +149 -0
  538. package/templates/nextjs-standalone/src/components/data-table/data-table-view-options.tsx +89 -0
  539. package/templates/nextjs-standalone/src/components/data-table/data-table.tsx +105 -0
  540. package/templates/nextjs-standalone/src/components/form-dialog.tsx +135 -0
  541. package/templates/nextjs-standalone/src/components/ui/accordion.tsx +66 -0
  542. package/templates/nextjs-standalone/src/components/ui/calendar.tsx +220 -0
  543. package/templates/nextjs-standalone/src/components/ui/checkbox.tsx +32 -0
  544. package/templates/nextjs-standalone/src/components/ui/faceted.tsx +283 -0
  545. package/templates/nextjs-standalone/src/components/ui/form.tsx +167 -0
  546. package/templates/nextjs-standalone/src/components/ui/label.tsx +24 -0
  547. package/templates/nextjs-standalone/src/components/ui/popover.tsx +89 -0
  548. package/templates/nextjs-standalone/src/components/ui/progress.tsx +31 -0
  549. package/templates/nextjs-standalone/src/components/ui/scroll-area.tsx +6 -2
  550. package/templates/nextjs-standalone/src/components/ui/slider.tsx +63 -0
  551. package/templates/nextjs-standalone/src/components/ui/sortable.tsx +581 -0
  552. package/templates/nextjs-standalone/src/components/ui/switch.tsx +35 -0
  553. package/templates/nextjs-standalone/src/components/ui/textarea.tsx +18 -0
  554. package/templates/nextjs-standalone/src/config/data-table.ts +82 -0
  555. package/templates/nextjs-standalone/src/env-check.ts +74 -0
  556. package/templates/nextjs-standalone/src/hooks/use-callback-ref.ts +27 -0
  557. package/templates/nextjs-standalone/src/hooks/use-data-table.ts +316 -0
  558. package/templates/nextjs-standalone/src/hooks/use-debounced-callback.ts +28 -0
  559. package/templates/nextjs-standalone/src/lib/action-types.ts +7 -41
  560. package/templates/nextjs-standalone/src/lib/agent-query.ts +4 -2
  561. package/templates/nextjs-standalone/src/lib/agent.ts +363 -31
  562. package/templates/nextjs-standalone/src/lib/api-url.ts +2 -3
  563. package/templates/nextjs-standalone/src/lib/auth/admin-permissions.ts +38 -0
  564. package/templates/nextjs-standalone/src/lib/auth/audit.ts +19 -4
  565. package/templates/nextjs-standalone/src/lib/auth/byot.ts +3 -3
  566. package/templates/nextjs-standalone/src/lib/auth/detect.ts +29 -8
  567. package/templates/nextjs-standalone/src/lib/auth/managed.ts +104 -14
  568. package/templates/nextjs-standalone/src/lib/auth/middleware.ts +53 -6
  569. package/templates/nextjs-standalone/src/lib/auth/migrate.ts +140 -15
  570. package/templates/nextjs-standalone/src/lib/auth/oauth-state.ts +123 -0
  571. package/templates/nextjs-standalone/src/lib/auth/org-permissions.ts +55 -0
  572. package/templates/nextjs-standalone/src/lib/auth/permissions.ts +26 -19
  573. package/templates/nextjs-standalone/src/lib/auth/server.ts +355 -9
  574. package/templates/nextjs-standalone/src/lib/auth/simple-key.ts +3 -3
  575. package/templates/nextjs-standalone/src/lib/auth/types.ts +15 -21
  576. package/templates/nextjs-standalone/src/lib/billing/enforcement.ts +368 -0
  577. package/templates/nextjs-standalone/src/lib/billing/plans.ts +155 -0
  578. package/templates/nextjs-standalone/src/lib/cache/index.ts +92 -0
  579. package/templates/nextjs-standalone/src/lib/cache/keys.ts +30 -0
  580. package/templates/nextjs-standalone/src/lib/cache/lru.ts +79 -0
  581. package/templates/nextjs-standalone/src/lib/cache/types.ts +31 -0
  582. package/templates/nextjs-standalone/src/lib/compose-refs.ts +62 -0
  583. package/templates/nextjs-standalone/src/lib/config.ts +563 -11
  584. package/templates/nextjs-standalone/src/lib/connection-types.ts +9 -0
  585. package/templates/nextjs-standalone/src/lib/conversation-types.ts +1 -25
  586. package/templates/nextjs-standalone/src/lib/conversations.ts +345 -14
  587. package/templates/nextjs-standalone/src/lib/data-table.ts +61 -0
  588. package/templates/nextjs-standalone/src/lib/db/connection.ts +793 -39
  589. package/templates/nextjs-standalone/src/lib/db/internal.ts +985 -139
  590. package/templates/nextjs-standalone/src/lib/db/migrate.ts +295 -0
  591. package/templates/nextjs-standalone/src/lib/db/migrations/0000_baseline.sql +703 -0
  592. package/templates/nextjs-standalone/src/lib/db/migrations/0001_teams_installations.sql +14 -0
  593. package/templates/nextjs-standalone/src/lib/db/migrations/0002_discord_installations.sql +14 -0
  594. package/templates/nextjs-standalone/src/lib/db/migrations/0003_telegram_installations.sql +15 -0
  595. package/templates/nextjs-standalone/src/lib/db/migrations/0004_sandbox_credentials.sql +18 -0
  596. package/templates/nextjs-standalone/src/lib/db/migrations/0005_oauth_state.sql +16 -0
  597. package/templates/nextjs-standalone/src/lib/db/migrations/0006_byot_credentials.sql +14 -0
  598. package/templates/nextjs-standalone/src/lib/db/migrations/0007_gchat_installations.sql +15 -0
  599. package/templates/nextjs-standalone/src/lib/db/migrations/0008_github_installations.sql +14 -0
  600. package/templates/nextjs-standalone/src/lib/db/migrations/0009_linear_installations.sql +15 -0
  601. package/templates/nextjs-standalone/src/lib/db/migrations/0010_whatsapp_installations.sql +14 -0
  602. package/templates/nextjs-standalone/src/lib/db/migrations/0011_email_installations.sql +16 -0
  603. package/templates/nextjs-standalone/src/lib/db/migrations/0012_region_migrations.sql +25 -0
  604. package/templates/nextjs-standalone/src/lib/db/schema.ts +1120 -0
  605. package/templates/nextjs-standalone/src/lib/db/source-rate-limit.ts +89 -139
  606. package/templates/nextjs-standalone/src/lib/demo.ts +308 -0
  607. package/templates/nextjs-standalone/src/lib/discord/store.ts +225 -0
  608. package/templates/nextjs-standalone/src/lib/effect/ai.ts +243 -0
  609. package/templates/nextjs-standalone/src/lib/effect/errors.ts +234 -0
  610. package/templates/nextjs-standalone/src/lib/effect/hono.ts +454 -0
  611. package/templates/nextjs-standalone/src/lib/effect/index.ts +137 -0
  612. package/templates/nextjs-standalone/src/lib/effect/layers.ts +496 -0
  613. package/templates/nextjs-standalone/src/lib/effect/services.ts +776 -0
  614. package/templates/nextjs-standalone/src/lib/effect/sql.ts +178 -0
  615. package/templates/nextjs-standalone/src/lib/effect/toolkit.ts +123 -0
  616. package/templates/nextjs-standalone/src/lib/email/delivery.ts +232 -0
  617. package/templates/nextjs-standalone/src/lib/email/engine.ts +349 -0
  618. package/templates/nextjs-standalone/src/lib/email/hooks.ts +107 -0
  619. package/templates/nextjs-standalone/src/lib/email/index.ts +16 -0
  620. package/templates/nextjs-standalone/src/lib/email/scheduler.ts +72 -0
  621. package/templates/nextjs-standalone/src/lib/email/sequence.ts +73 -0
  622. package/templates/nextjs-standalone/src/lib/email/store.ts +163 -0
  623. package/templates/nextjs-standalone/src/lib/email/templates.ts +215 -0
  624. package/templates/nextjs-standalone/src/lib/format.test.ts +117 -0
  625. package/templates/nextjs-standalone/src/lib/format.ts +67 -0
  626. package/templates/nextjs-standalone/src/lib/gchat/store.ts +202 -0
  627. package/templates/nextjs-standalone/src/lib/github/store.ts +197 -0
  628. package/templates/nextjs-standalone/src/lib/id.ts +29 -0
  629. package/templates/nextjs-standalone/src/lib/integrations/types.ts +166 -0
  630. package/templates/nextjs-standalone/src/lib/learn/pattern-analyzer.ts +224 -0
  631. package/templates/nextjs-standalone/src/lib/learn/pattern-cache.ts +229 -0
  632. package/templates/nextjs-standalone/src/lib/learn/pattern-proposer.ts +87 -0
  633. package/templates/nextjs-standalone/src/lib/learn/suggestion-helpers.ts +34 -0
  634. package/templates/nextjs-standalone/src/lib/learn/suggestions.ts +139 -0
  635. package/templates/nextjs-standalone/src/lib/linear/store.ts +200 -0
  636. package/templates/nextjs-standalone/src/lib/logger.ts +35 -3
  637. package/templates/nextjs-standalone/src/lib/metering.ts +272 -0
  638. package/templates/nextjs-standalone/src/lib/parsers.ts +99 -0
  639. package/templates/nextjs-standalone/src/lib/plugins/hooks.ts +13 -11
  640. package/templates/nextjs-standalone/src/lib/plugins/index.ts +3 -1
  641. package/templates/nextjs-standalone/src/lib/plugins/registry.ts +58 -6
  642. package/templates/nextjs-standalone/src/lib/plugins/settings.ts +147 -0
  643. package/templates/nextjs-standalone/src/lib/plugins/wiring.ts +6 -9
  644. package/templates/nextjs-standalone/src/lib/profiler.ts +1665 -0
  645. package/templates/nextjs-standalone/src/lib/providers.ts +188 -13
  646. package/templates/nextjs-standalone/src/lib/rls.ts +172 -60
  647. package/templates/nextjs-standalone/src/lib/sandbox/credentials.ts +206 -0
  648. package/templates/nextjs-standalone/src/lib/sandbox/validate.ts +179 -0
  649. package/templates/nextjs-standalone/src/lib/scheduled-task-types.ts +26 -94
  650. package/templates/nextjs-standalone/src/lib/scheduled-tasks.ts +174 -34
  651. package/templates/nextjs-standalone/src/lib/scheduler/delivery.ts +248 -150
  652. package/templates/nextjs-standalone/src/lib/scheduler/engine.ts +190 -154
  653. package/templates/nextjs-standalone/src/lib/scheduler/executor.ts +74 -23
  654. package/templates/nextjs-standalone/src/lib/scheduler/preview.ts +72 -0
  655. package/templates/nextjs-standalone/src/lib/security/abuse.ts +463 -0
  656. package/templates/nextjs-standalone/src/lib/semantic/diff.ts +267 -0
  657. package/templates/nextjs-standalone/src/lib/semantic/entities.ts +167 -0
  658. package/templates/nextjs-standalone/src/lib/semantic/files.ts +283 -0
  659. package/templates/nextjs-standalone/src/lib/semantic/index.ts +27 -0
  660. package/templates/nextjs-standalone/src/lib/{semantic-index.ts → semantic/search.ts} +80 -9
  661. package/templates/nextjs-standalone/src/lib/semantic/sync.ts +581 -0
  662. package/templates/nextjs-standalone/src/lib/{semantic.ts → semantic/whitelist.ts} +189 -3
  663. package/templates/nextjs-standalone/src/lib/settings.ts +817 -0
  664. package/templates/nextjs-standalone/src/lib/sidecar-types.ts +13 -0
  665. package/templates/nextjs-standalone/src/lib/slack/store.ts +134 -25
  666. package/templates/nextjs-standalone/src/lib/startup.ts +528 -362
  667. package/templates/nextjs-standalone/src/lib/teams/store.ts +216 -0
  668. package/templates/nextjs-standalone/src/lib/telegram/store.ts +202 -0
  669. package/templates/nextjs-standalone/src/lib/telemetry.ts +40 -0
  670. package/templates/nextjs-standalone/src/lib/tools/actions/audit.ts +8 -5
  671. package/templates/nextjs-standalone/src/lib/tools/actions/email.ts +3 -1
  672. package/templates/nextjs-standalone/src/lib/tools/actions/handler.ts +276 -93
  673. package/templates/nextjs-standalone/src/lib/tools/actions/jira.ts +2 -2
  674. package/templates/nextjs-standalone/src/lib/tools/backends/detect.ts +16 -0
  675. package/templates/nextjs-standalone/src/lib/tools/backends/index.ts +11 -0
  676. package/templates/nextjs-standalone/src/lib/tools/backends/nsjail.ts +213 -0
  677. package/templates/nextjs-standalone/src/lib/tools/backends/shared.ts +103 -0
  678. package/templates/nextjs-standalone/src/lib/tools/backends/types.ts +26 -0
  679. package/templates/nextjs-standalone/src/lib/tools/explore-nsjail.ts +7 -228
  680. package/templates/nextjs-standalone/src/lib/tools/explore-sandbox.ts +4 -29
  681. package/templates/nextjs-standalone/src/lib/tools/explore-sidecar.ts +18 -2
  682. package/templates/nextjs-standalone/src/lib/tools/explore.ts +246 -54
  683. package/templates/nextjs-standalone/src/lib/tools/index.ts +17 -0
  684. package/templates/nextjs-standalone/src/lib/tools/python-nsjail.ts +11 -139
  685. package/templates/nextjs-standalone/src/lib/tools/python-sandbox.ts +9 -132
  686. package/templates/nextjs-standalone/src/lib/tools/python-sidecar.ts +184 -3
  687. package/templates/nextjs-standalone/src/lib/tools/python-stream.ts +33 -0
  688. package/templates/nextjs-standalone/src/lib/tools/python-wrapper.ts +129 -0
  689. package/templates/nextjs-standalone/src/lib/tools/python.ts +115 -15
  690. package/templates/nextjs-standalone/src/lib/tools/registry.ts +14 -2
  691. package/templates/nextjs-standalone/src/lib/tools/sql.ts +778 -362
  692. package/templates/nextjs-standalone/src/lib/tracing.ts +16 -0
  693. package/templates/nextjs-standalone/src/lib/whatsapp/store.ts +198 -0
  694. package/templates/nextjs-standalone/src/lib/workspace.ts +89 -0
  695. package/templates/nextjs-standalone/src/progress.ts +121 -0
  696. package/templates/nextjs-standalone/src/types/data-table.ts +48 -0
  697. package/templates/nextjs-standalone/src/ui/atlas-chat-reexport.ts +3 -0
  698. package/templates/nextjs-standalone/src/ui/components/actions/action-approval-card.tsx +26 -19
  699. package/templates/nextjs-standalone/src/ui/components/actions/action-status-badge.tsx +3 -3
  700. package/templates/nextjs-standalone/src/ui/components/admin/admin-layout.tsx +57 -39
  701. package/templates/nextjs-standalone/src/ui/components/admin/admin-sidebar.tsx +213 -35
  702. package/templates/nextjs-standalone/src/ui/components/admin/delivery-status-badge.tsx +53 -0
  703. package/templates/nextjs-standalone/src/ui/components/admin/empty-state.tsx +27 -6
  704. package/templates/nextjs-standalone/src/ui/components/admin/entity-detail.tsx +3 -52
  705. package/templates/nextjs-standalone/src/ui/components/admin/error-banner.tsx +2 -2
  706. package/templates/nextjs-standalone/src/ui/components/admin/feature-disabled.tsx +28 -5
  707. package/templates/nextjs-standalone/src/ui/components/admin-content-wrapper.tsx +87 -0
  708. package/templates/nextjs-standalone/src/ui/components/atlas-chat.tsx +449 -166
  709. package/templates/nextjs-standalone/src/ui/components/branding-head.tsx +41 -0
  710. package/templates/nextjs-standalone/src/ui/components/chart/chart-detection.ts +62 -5
  711. package/templates/nextjs-standalone/src/ui/components/chart/result-chart.tsx +316 -125
  712. package/templates/nextjs-standalone/src/ui/components/chat/api-key-bar.tsx +4 -4
  713. package/templates/nextjs-standalone/src/ui/components/chat/data-table.tsx +45 -4
  714. package/templates/nextjs-standalone/src/ui/components/chat/error-banner.tsx +86 -5
  715. package/templates/nextjs-standalone/src/ui/components/chat/follow-up-chips.tsx +29 -0
  716. package/templates/nextjs-standalone/src/ui/components/chat/markdown.tsx +24 -0
  717. package/templates/nextjs-standalone/src/ui/components/chat/prompt-library.tsx +206 -0
  718. package/templates/nextjs-standalone/src/ui/components/chat/python-result-card.tsx +106 -78
  719. package/templates/nextjs-standalone/src/ui/components/chat/result-card-base.tsx +101 -0
  720. package/templates/nextjs-standalone/src/ui/components/chat/share-dialog.tsx +377 -0
  721. package/templates/nextjs-standalone/src/ui/components/chat/sql-result-card.tsx +94 -73
  722. package/templates/nextjs-standalone/src/ui/components/chat/suggestion-chips.tsx +46 -0
  723. package/templates/nextjs-standalone/src/ui/components/chat/tool-part.tsx +16 -4
  724. package/templates/nextjs-standalone/src/ui/components/conversations/conversation-item.tsx +48 -17
  725. package/templates/nextjs-standalone/src/ui/components/conversations/conversation-list.tsx +38 -24
  726. package/templates/nextjs-standalone/src/ui/components/conversations/conversation-sidebar.tsx +66 -7
  727. package/templates/nextjs-standalone/src/ui/components/conversations/delete-confirmation.tsx +9 -2
  728. package/templates/nextjs-standalone/src/ui/components/error-boundary.tsx +66 -0
  729. package/templates/nextjs-standalone/src/ui/components/notebook/delete-cell-dialog.tsx +48 -0
  730. package/templates/nextjs-standalone/src/ui/components/notebook/fork-branch-selector.tsx +68 -0
  731. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-input.tsx +76 -0
  732. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-output.tsx +58 -0
  733. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-toolbar.tsx +91 -0
  734. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell.tsx +119 -0
  735. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-empty-state.tsx +19 -0
  736. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-export.ts +287 -0
  737. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-input-bar.tsx +49 -0
  738. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-shell.tsx +266 -0
  739. package/templates/nextjs-standalone/src/ui/components/notebook/notebook-text-cell.tsx +152 -0
  740. package/templates/nextjs-standalone/src/ui/components/notebook/types.ts +39 -0
  741. package/templates/nextjs-standalone/src/ui/components/notebook/use-keyboard-nav.ts +109 -0
  742. package/templates/nextjs-standalone/src/ui/components/notebook/use-notebook.ts +684 -0
  743. package/templates/nextjs-standalone/src/ui/components/org-switcher.tsx +111 -0
  744. package/templates/nextjs-standalone/src/ui/components/region-picker.tsx +103 -0
  745. package/templates/nextjs-standalone/src/ui/components/schema-explorer/schema-explorer.tsx +522 -0
  746. package/templates/nextjs-standalone/src/ui/components/social-icons.tsx +26 -0
  747. package/templates/nextjs-standalone/src/ui/components/tour/guided-tour.tsx +81 -0
  748. package/templates/nextjs-standalone/src/ui/components/tour/index.ts +5 -0
  749. package/templates/nextjs-standalone/src/ui/components/tour/nav-bar.tsx +100 -0
  750. package/templates/nextjs-standalone/src/ui/components/tour/tour-overlay.tsx +298 -0
  751. package/templates/nextjs-standalone/src/ui/components/tour/tour-steps.ts +43 -0
  752. package/templates/nextjs-standalone/src/ui/components/tour/types.ts +21 -0
  753. package/templates/nextjs-standalone/src/ui/components/tour/use-tour.ts +193 -0
  754. package/templates/nextjs-standalone/src/ui/context-reexport.ts +3 -0
  755. package/templates/nextjs-standalone/src/ui/hooks/theme-init-script.ts +17 -0
  756. package/templates/nextjs-standalone/src/ui/hooks/use-admin-fetch.ts +38 -30
  757. package/templates/nextjs-standalone/src/ui/hooks/use-admin-mutation.ts +188 -0
  758. package/templates/nextjs-standalone/src/ui/hooks/use-atlas-transport.ts +225 -0
  759. package/templates/nextjs-standalone/src/ui/hooks/use-branding.ts +68 -0
  760. package/templates/nextjs-standalone/src/ui/hooks/use-conversations.ts +106 -83
  761. package/templates/nextjs-standalone/src/ui/hooks/use-dark-mode.ts +134 -10
  762. package/templates/nextjs-standalone/src/ui/hooks/use-deploy-mode.ts +36 -0
  763. package/templates/nextjs-standalone/src/ui/hooks/use-platform-admin-guard.ts +49 -0
  764. package/templates/nextjs-standalone/src/ui/lib/action-types.ts +11 -63
  765. package/templates/nextjs-standalone/src/ui/lib/admin-schemas.ts +744 -0
  766. package/templates/nextjs-standalone/src/ui/lib/fetch-client.ts +84 -0
  767. package/templates/nextjs-standalone/src/ui/lib/fetch-error.ts +54 -0
  768. package/templates/nextjs-standalone/src/ui/lib/helpers.ts +94 -1
  769. package/templates/nextjs-standalone/src/ui/lib/types.ts +149 -140
  770. package/templates/nextjs-standalone/tsconfig.json +3 -2
  771. package/templates/docker/src/api/__tests__/actions.test.ts +0 -683
  772. package/templates/docker/src/api/__tests__/admin.test.ts +0 -820
  773. package/templates/docker/src/api/__tests__/auth.test.ts +0 -165
  774. package/templates/docker/src/api/__tests__/chat.test.ts +0 -376
  775. package/templates/docker/src/api/__tests__/conversations.test.ts +0 -555
  776. package/templates/docker/src/api/__tests__/cors.test.ts +0 -135
  777. package/templates/docker/src/api/__tests__/health-plugin.test.ts +0 -176
  778. package/templates/docker/src/api/__tests__/health.test.ts +0 -283
  779. package/templates/docker/src/api/__tests__/query.test.ts +0 -891
  780. package/templates/docker/src/api/__tests__/scheduled-tasks.test.ts +0 -601
  781. package/templates/docker/src/api/__tests__/slack.test.ts +0 -847
  782. package/templates/docker/src/lib/__tests__/agent-cache.test.ts +0 -439
  783. package/templates/docker/src/lib/__tests__/agent-dialect.test.ts +0 -131
  784. package/templates/docker/src/lib/__tests__/agent-health-annotations.test.ts +0 -166
  785. package/templates/docker/src/lib/__tests__/agent-integration.test.ts +0 -516
  786. package/templates/docker/src/lib/__tests__/config-actions.test.ts +0 -166
  787. package/templates/docker/src/lib/__tests__/config.test.ts +0 -1113
  788. package/templates/docker/src/lib/__tests__/conversations.test.ts +0 -589
  789. package/templates/docker/src/lib/__tests__/errors.test.ts +0 -256
  790. package/templates/docker/src/lib/__tests__/logger.test.ts +0 -200
  791. package/templates/docker/src/lib/__tests__/plugin-aware-validation.test.ts +0 -321
  792. package/templates/docker/src/lib/__tests__/providers.test.ts +0 -130
  793. package/templates/docker/src/lib/__tests__/rls.test.ts +0 -435
  794. package/templates/docker/src/lib/__tests__/scheduled-task-types.test.ts +0 -124
  795. package/templates/docker/src/lib/__tests__/scheduled-tasks.test.ts +0 -550
  796. package/templates/docker/src/lib/__tests__/semantic-index.test.ts +0 -547
  797. package/templates/docker/src/lib/__tests__/semantic-multisource.test.ts +0 -544
  798. package/templates/docker/src/lib/__tests__/semantic.test.ts +0 -363
  799. package/templates/docker/src/lib/__tests__/startup-actions.test.ts +0 -461
  800. package/templates/docker/src/lib/__tests__/startup-first-run.test.ts +0 -429
  801. package/templates/docker/src/lib/__tests__/startup.test.ts +0 -470
  802. package/templates/docker/src/lib/__tests__/tracing.test.ts +0 -28
  803. package/templates/docker/src/lib/auth/__tests__/audit.test.ts +0 -418
  804. package/templates/docker/src/lib/auth/__tests__/byot-integration.test.ts +0 -222
  805. package/templates/docker/src/lib/auth/__tests__/byot.test.ts +0 -366
  806. package/templates/docker/src/lib/auth/__tests__/detect.test.ts +0 -190
  807. package/templates/docker/src/lib/auth/__tests__/managed.test.ts +0 -173
  808. package/templates/docker/src/lib/auth/__tests__/middleware.test.ts +0 -456
  809. package/templates/docker/src/lib/auth/__tests__/migrate.test.ts +0 -203
  810. package/templates/docker/src/lib/auth/__tests__/permissions.test.ts +0 -225
  811. package/templates/docker/src/lib/auth/__tests__/server.test.ts +0 -34
  812. package/templates/docker/src/lib/auth/__tests__/simple-key.test.ts +0 -176
  813. package/templates/docker/src/lib/auth/__tests__/types.test.ts +0 -44
  814. package/templates/docker/src/lib/db/__tests__/connection.test.ts +0 -144
  815. package/templates/docker/src/lib/db/__tests__/internal.test.ts +0 -387
  816. package/templates/docker/src/lib/db/__tests__/registry-health.test.ts +0 -190
  817. package/templates/docker/src/lib/db/__tests__/registry-pool-limits.test.ts +0 -137
  818. package/templates/docker/src/lib/db/__tests__/registry.test.ts +0 -398
  819. package/templates/docker/src/lib/db/__tests__/source-rate-limit.test.ts +0 -130
  820. package/templates/docker/src/lib/errors.ts +0 -154
  821. package/templates/docker/src/lib/plugins/__tests__/hooks-integration.test.ts +0 -204
  822. package/templates/docker/src/lib/plugins/__tests__/hooks.test.ts +0 -529
  823. package/templates/docker/src/lib/plugins/__tests__/migrate.test.ts +0 -875
  824. package/templates/docker/src/lib/plugins/__tests__/registry.test.ts +0 -373
  825. package/templates/docker/src/lib/plugins/__tests__/tools.test.ts +0 -49
  826. package/templates/docker/src/lib/plugins/__tests__/wiring.test.ts +0 -799
  827. package/templates/docker/src/lib/scheduler/__tests__/delivery.test.ts +0 -192
  828. package/templates/docker/src/lib/scheduler/__tests__/engine.test.ts +0 -248
  829. package/templates/docker/src/lib/scheduler/__tests__/format-email.test.ts +0 -96
  830. package/templates/docker/src/lib/scheduler/__tests__/format-slack.test.ts +0 -78
  831. package/templates/docker/src/lib/scheduler/__tests__/format-webhook.test.ts +0 -78
  832. package/templates/docker/src/lib/scheduler/index.ts +0 -7
  833. package/templates/docker/src/lib/slack/__tests__/api.test.ts +0 -160
  834. package/templates/docker/src/lib/slack/__tests__/format.test.ts +0 -237
  835. package/templates/docker/src/lib/slack/__tests__/store.test.ts +0 -188
  836. package/templates/docker/src/lib/slack/__tests__/threads.test.ts +0 -112
  837. package/templates/docker/src/lib/slack/__tests__/verify.test.ts +0 -111
  838. package/templates/docker/src/lib/tools/__tests__/action-permissions.test.ts +0 -594
  839. package/templates/docker/src/lib/tools/__tests__/custom-validation.test.ts +0 -240
  840. package/templates/docker/src/lib/tools/__tests__/explore-backend.test.ts +0 -267
  841. package/templates/docker/src/lib/tools/__tests__/explore-nsjail.test.ts +0 -506
  842. package/templates/docker/src/lib/tools/__tests__/explore-plugin.test.ts +0 -374
  843. package/templates/docker/src/lib/tools/__tests__/explore-sdk-compat.test.ts +0 -82
  844. package/templates/docker/src/lib/tools/__tests__/explore-sidecar.test.ts +0 -210
  845. package/templates/docker/src/lib/tools/__tests__/python-nsjail.test.ts +0 -515
  846. package/templates/docker/src/lib/tools/__tests__/python-sandbox.test.ts +0 -397
  847. package/templates/docker/src/lib/tools/__tests__/python-sidecar.test.ts +0 -365
  848. package/templates/docker/src/lib/tools/__tests__/python.test.ts +0 -331
  849. package/templates/docker/src/lib/tools/__tests__/registry-actions.test.ts +0 -132
  850. package/templates/docker/src/lib/tools/__tests__/registry.test.ts +0 -242
  851. package/templates/docker/src/lib/tools/__tests__/sql-audit.test.ts +0 -227
  852. package/templates/docker/src/lib/tools/__tests__/sql-connection-whitelist.test.ts +0 -100
  853. package/templates/docker/src/lib/tools/__tests__/sql-ratelimit.test.ts +0 -227
  854. package/templates/docker/src/lib/tools/__tests__/sql.test.ts +0 -709
  855. package/templates/docker/src/lib/tools/actions/__tests__/audit.test.ts +0 -211
  856. package/templates/docker/src/lib/tools/actions/__tests__/email.test.ts +0 -378
  857. package/templates/docker/src/lib/tools/actions/__tests__/handler.test.ts +0 -681
  858. package/templates/docker/src/lib/tools/actions/__tests__/jira.test.ts +0 -427
  859. package/templates/docker/src/test-setup.ts +0 -38
  860. package/templates/docker/src/types/vercel-sandbox.d.ts +0 -61
  861. package/templates/docker/src/ui/components/chat/managed-auth-card.tsx +0 -116
  862. package/templates/nextjs-standalone/src/api/__tests__/actions.test.ts +0 -683
  863. package/templates/nextjs-standalone/src/api/__tests__/admin.test.ts +0 -820
  864. package/templates/nextjs-standalone/src/api/__tests__/auth.test.ts +0 -165
  865. package/templates/nextjs-standalone/src/api/__tests__/chat.test.ts +0 -376
  866. package/templates/nextjs-standalone/src/api/__tests__/conversations.test.ts +0 -555
  867. package/templates/nextjs-standalone/src/api/__tests__/cors.test.ts +0 -135
  868. package/templates/nextjs-standalone/src/api/__tests__/health-plugin.test.ts +0 -176
  869. package/templates/nextjs-standalone/src/api/__tests__/health.test.ts +0 -283
  870. package/templates/nextjs-standalone/src/api/__tests__/query.test.ts +0 -891
  871. package/templates/nextjs-standalone/src/api/__tests__/scheduled-tasks.test.ts +0 -601
  872. package/templates/nextjs-standalone/src/api/__tests__/slack.test.ts +0 -847
  873. package/templates/nextjs-standalone/src/app/global-error.tsx +0 -68
  874. package/templates/nextjs-standalone/src/lib/__tests__/agent-cache.test.ts +0 -439
  875. package/templates/nextjs-standalone/src/lib/__tests__/agent-dialect.test.ts +0 -131
  876. package/templates/nextjs-standalone/src/lib/__tests__/agent-health-annotations.test.ts +0 -166
  877. package/templates/nextjs-standalone/src/lib/__tests__/agent-integration.test.ts +0 -516
  878. package/templates/nextjs-standalone/src/lib/__tests__/config-actions.test.ts +0 -166
  879. package/templates/nextjs-standalone/src/lib/__tests__/config.test.ts +0 -1113
  880. package/templates/nextjs-standalone/src/lib/__tests__/conversations.test.ts +0 -589
  881. package/templates/nextjs-standalone/src/lib/__tests__/errors.test.ts +0 -256
  882. package/templates/nextjs-standalone/src/lib/__tests__/logger.test.ts +0 -200
  883. package/templates/nextjs-standalone/src/lib/__tests__/plugin-aware-validation.test.ts +0 -321
  884. package/templates/nextjs-standalone/src/lib/__tests__/providers.test.ts +0 -130
  885. package/templates/nextjs-standalone/src/lib/__tests__/rls.test.ts +0 -435
  886. package/templates/nextjs-standalone/src/lib/__tests__/scheduled-task-types.test.ts +0 -124
  887. package/templates/nextjs-standalone/src/lib/__tests__/scheduled-tasks.test.ts +0 -550
  888. package/templates/nextjs-standalone/src/lib/__tests__/semantic-index.test.ts +0 -547
  889. package/templates/nextjs-standalone/src/lib/__tests__/semantic-multisource.test.ts +0 -544
  890. package/templates/nextjs-standalone/src/lib/__tests__/semantic.test.ts +0 -363
  891. package/templates/nextjs-standalone/src/lib/__tests__/startup-actions.test.ts +0 -461
  892. package/templates/nextjs-standalone/src/lib/__tests__/startup-first-run.test.ts +0 -429
  893. package/templates/nextjs-standalone/src/lib/__tests__/startup.test.ts +0 -470
  894. package/templates/nextjs-standalone/src/lib/__tests__/tracing.test.ts +0 -28
  895. package/templates/nextjs-standalone/src/lib/auth/__tests__/audit.test.ts +0 -418
  896. package/templates/nextjs-standalone/src/lib/auth/__tests__/byot-integration.test.ts +0 -222
  897. package/templates/nextjs-standalone/src/lib/auth/__tests__/byot.test.ts +0 -366
  898. package/templates/nextjs-standalone/src/lib/auth/__tests__/detect.test.ts +0 -190
  899. package/templates/nextjs-standalone/src/lib/auth/__tests__/managed.test.ts +0 -173
  900. package/templates/nextjs-standalone/src/lib/auth/__tests__/middleware.test.ts +0 -456
  901. package/templates/nextjs-standalone/src/lib/auth/__tests__/migrate.test.ts +0 -203
  902. package/templates/nextjs-standalone/src/lib/auth/__tests__/permissions.test.ts +0 -225
  903. package/templates/nextjs-standalone/src/lib/auth/__tests__/server.test.ts +0 -34
  904. package/templates/nextjs-standalone/src/lib/auth/__tests__/simple-key.test.ts +0 -176
  905. package/templates/nextjs-standalone/src/lib/auth/__tests__/types.test.ts +0 -44
  906. package/templates/nextjs-standalone/src/lib/db/__tests__/connection.test.ts +0 -144
  907. package/templates/nextjs-standalone/src/lib/db/__tests__/internal.test.ts +0 -387
  908. package/templates/nextjs-standalone/src/lib/db/__tests__/registry-health.test.ts +0 -190
  909. package/templates/nextjs-standalone/src/lib/db/__tests__/registry-pool-limits.test.ts +0 -137
  910. package/templates/nextjs-standalone/src/lib/db/__tests__/registry.test.ts +0 -398
  911. package/templates/nextjs-standalone/src/lib/db/__tests__/source-rate-limit.test.ts +0 -130
  912. package/templates/nextjs-standalone/src/lib/errors.ts +0 -154
  913. package/templates/nextjs-standalone/src/lib/plugins/__tests__/hooks-integration.test.ts +0 -204
  914. package/templates/nextjs-standalone/src/lib/plugins/__tests__/hooks.test.ts +0 -529
  915. package/templates/nextjs-standalone/src/lib/plugins/__tests__/migrate.test.ts +0 -875
  916. package/templates/nextjs-standalone/src/lib/plugins/__tests__/registry.test.ts +0 -373
  917. package/templates/nextjs-standalone/src/lib/plugins/__tests__/tools.test.ts +0 -49
  918. package/templates/nextjs-standalone/src/lib/plugins/__tests__/wiring.test.ts +0 -799
  919. package/templates/nextjs-standalone/src/lib/scheduler/__tests__/delivery.test.ts +0 -192
  920. package/templates/nextjs-standalone/src/lib/scheduler/__tests__/engine.test.ts +0 -248
  921. package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-email.test.ts +0 -96
  922. package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-slack.test.ts +0 -78
  923. package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-webhook.test.ts +0 -78
  924. package/templates/nextjs-standalone/src/lib/scheduler/index.ts +0 -7
  925. package/templates/nextjs-standalone/src/lib/slack/__tests__/api.test.ts +0 -160
  926. package/templates/nextjs-standalone/src/lib/slack/__tests__/format.test.ts +0 -237
  927. package/templates/nextjs-standalone/src/lib/slack/__tests__/store.test.ts +0 -188
  928. package/templates/nextjs-standalone/src/lib/slack/__tests__/threads.test.ts +0 -112
  929. package/templates/nextjs-standalone/src/lib/slack/__tests__/verify.test.ts +0 -111
  930. package/templates/nextjs-standalone/src/lib/tools/__tests__/action-permissions.test.ts +0 -594
  931. package/templates/nextjs-standalone/src/lib/tools/__tests__/custom-validation.test.ts +0 -240
  932. package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-backend.test.ts +0 -267
  933. package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-nsjail.test.ts +0 -506
  934. package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-plugin.test.ts +0 -374
  935. package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-sdk-compat.test.ts +0 -82
  936. package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-sidecar.test.ts +0 -210
  937. package/templates/nextjs-standalone/src/lib/tools/__tests__/python-nsjail.test.ts +0 -515
  938. package/templates/nextjs-standalone/src/lib/tools/__tests__/python-sandbox.test.ts +0 -397
  939. package/templates/nextjs-standalone/src/lib/tools/__tests__/python-sidecar.test.ts +0 -365
  940. package/templates/nextjs-standalone/src/lib/tools/__tests__/python.test.ts +0 -331
  941. package/templates/nextjs-standalone/src/lib/tools/__tests__/registry-actions.test.ts +0 -132
  942. package/templates/nextjs-standalone/src/lib/tools/__tests__/registry.test.ts +0 -242
  943. package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-audit.test.ts +0 -227
  944. package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-connection-whitelist.test.ts +0 -100
  945. package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-ratelimit.test.ts +0 -227
  946. package/templates/nextjs-standalone/src/lib/tools/__tests__/sql.test.ts +0 -709
  947. package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/audit.test.ts +0 -211
  948. package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/email.test.ts +0 -378
  949. package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/handler.test.ts +0 -681
  950. package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/jira.test.ts +0 -427
  951. package/templates/nextjs-standalone/src/test-setup.ts +0 -38
  952. package/templates/nextjs-standalone/src/ui/components/chat/managed-auth-card.tsx +0 -116
@@ -0,0 +1,1120 @@
1
+ /**
2
+ * Drizzle schema — single source of truth for the internal database.
3
+ *
4
+ * Used by `drizzle-kit generate` to produce versioned SQL migration files.
5
+ * NOT imported at runtime — the migration runner executes raw SQL files.
6
+ *
7
+ * Convention: tables are ordered chronologically by when they were introduced.
8
+ * EE tables (backups, masking, scim, sla) are included here so they are
9
+ * part of the standard migration path instead of lazy ensureTable() calls.
10
+ */
11
+
12
+ import {
13
+ pgTable,
14
+ uuid,
15
+ text,
16
+ boolean,
17
+ integer,
18
+ bigint,
19
+ real,
20
+ doublePrecision,
21
+ timestamp,
22
+ jsonb,
23
+ index,
24
+ uniqueIndex,
25
+ check,
26
+ primaryKey,
27
+ varchar,
28
+ } from "drizzle-orm/pg-core";
29
+ import { sql } from "drizzle-orm";
30
+
31
+ // ---------------------------------------------------------------------------
32
+ // Core tables
33
+ // ---------------------------------------------------------------------------
34
+
35
+ export const auditLog = pgTable(
36
+ "audit_log",
37
+ {
38
+ id: uuid("id").primaryKey().defaultRandom(),
39
+ timestamp: timestamp("timestamp", { withTimezone: true }).notNull().defaultNow(),
40
+ userId: text("user_id"),
41
+ userLabel: text("user_label"),
42
+ authMode: text("auth_mode").notNull(),
43
+ sql: text("sql").notNull(),
44
+ durationMs: integer("duration_ms").notNull(),
45
+ rowCount: integer("row_count"),
46
+ success: boolean("success").notNull(),
47
+ error: text("error"),
48
+ // Multi-database columns
49
+ sourceId: text("source_id"),
50
+ sourceType: text("source_type"),
51
+ targetHost: text("target_host"),
52
+ // Data classification
53
+ tablesAccessed: jsonb("tables_accessed"),
54
+ columnsAccessed: jsonb("columns_accessed"),
55
+ // Org scoping
56
+ orgId: text("org_id"),
57
+ // Soft-delete (retention purge)
58
+ deletedAt: timestamp("deleted_at", { withTimezone: true }),
59
+ },
60
+ (t) => [
61
+ index("idx_audit_log_timestamp").on(t.timestamp),
62
+ index("idx_audit_log_user_id").on(t.userId),
63
+ index("idx_audit_log_source_id").on(t.sourceId),
64
+ index("idx_audit_log_tables_accessed").using("gin", t.tablesAccessed),
65
+ index("idx_audit_log_columns_accessed").using("gin", t.columnsAccessed),
66
+ index("idx_audit_log_org").on(t.orgId),
67
+ index("idx_audit_log_deleted_at").on(t.deletedAt).where(sql`deleted_at IS NOT NULL`),
68
+ ],
69
+ );
70
+
71
+ export const conversations = pgTable(
72
+ "conversations",
73
+ {
74
+ id: uuid("id").primaryKey().defaultRandom(),
75
+ userId: text("user_id"),
76
+ title: text("title"),
77
+ surface: text("surface").default("web"),
78
+ connectionId: text("connection_id"),
79
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
80
+ updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow(),
81
+ // Saved/starred
82
+ starred: boolean("starred").notNull().default(false),
83
+ // Sharing
84
+ shareToken: varchar("share_token", { length: 64 }),
85
+ shareExpiresAt: timestamp("share_expires_at", { withTimezone: true }),
86
+ shareMode: varchar("share_mode", { length: 10 }).notNull().default("public"),
87
+ // Notebook
88
+ notebookState: jsonb("notebook_state"),
89
+ // Org scoping
90
+ orgId: text("org_id"),
91
+ // Soft-delete
92
+ deletedAt: timestamp("deleted_at", { withTimezone: true }),
93
+ },
94
+ (t) => [
95
+ index("idx_conversations_user").on(t.userId),
96
+ index("idx_conversations_starred").on(t.userId, t.starred).where(sql`starred = true`),
97
+ uniqueIndex("idx_conversations_share_token").on(t.shareToken).where(sql`share_token IS NOT NULL`),
98
+ check("chk_share_mode", sql`share_mode IN ('public', 'org')`),
99
+ index("idx_conversations_org").on(t.orgId),
100
+ ],
101
+ );
102
+
103
+ export const messages = pgTable(
104
+ "messages",
105
+ {
106
+ id: uuid("id").primaryKey().defaultRandom(),
107
+ conversationId: uuid("conversation_id").references(() => conversations.id, { onDelete: "cascade" }),
108
+ role: text("role").notNull(),
109
+ content: jsonb("content").notNull(),
110
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
111
+ },
112
+ (t) => [
113
+ index("idx_messages_conversation").on(t.conversationId),
114
+ ],
115
+ );
116
+
117
+ // ---------------------------------------------------------------------------
118
+ // Slack integration
119
+ // ---------------------------------------------------------------------------
120
+
121
+ export const slackInstallations = pgTable(
122
+ "slack_installations",
123
+ {
124
+ teamId: text("team_id").primaryKey(),
125
+ botToken: text("bot_token").notNull(),
126
+ orgId: text("org_id"),
127
+ workspaceName: text("workspace_name"),
128
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
129
+ },
130
+ (t) => [
131
+ index("idx_slack_installations_org").on(t.orgId),
132
+ ],
133
+ );
134
+
135
+ export const slackThreads = pgTable(
136
+ "slack_threads",
137
+ {
138
+ threadTs: text("thread_ts").notNull(),
139
+ channelId: text("channel_id").notNull(),
140
+ conversationId: uuid("conversation_id").notNull(),
141
+ },
142
+ (t) => [
143
+ primaryKey({ columns: [t.threadTs, t.channelId] }),
144
+ index("idx_slack_threads_conversation").on(t.conversationId),
145
+ ],
146
+ );
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Action framework
150
+ // ---------------------------------------------------------------------------
151
+
152
+ export const actionLog = pgTable(
153
+ "action_log",
154
+ {
155
+ id: uuid("id").primaryKey().defaultRandom(),
156
+ requestedAt: timestamp("requested_at", { withTimezone: true }).notNull().defaultNow(),
157
+ resolvedAt: timestamp("resolved_at", { withTimezone: true }),
158
+ executedAt: timestamp("executed_at", { withTimezone: true }),
159
+ requestedBy: text("requested_by"),
160
+ approvedBy: text("approved_by"),
161
+ authMode: text("auth_mode").notNull(),
162
+ actionType: text("action_type").notNull(),
163
+ target: text("target").notNull(),
164
+ summary: text("summary").notNull(),
165
+ payload: jsonb("payload").notNull(),
166
+ status: text("status").notNull().default("pending"),
167
+ result: jsonb("result"),
168
+ error: text("error"),
169
+ rollbackInfo: jsonb("rollback_info"),
170
+ conversationId: uuid("conversation_id"),
171
+ requestId: text("request_id"),
172
+ // Org scoping
173
+ orgId: text("org_id"),
174
+ },
175
+ (t) => [
176
+ index("idx_action_log_requested_by").on(t.requestedBy),
177
+ index("idx_action_log_status").on(t.status),
178
+ index("idx_action_log_action_type").on(t.actionType),
179
+ index("idx_action_log_conversation").on(t.conversationId),
180
+ index("idx_action_log_org").on(t.orgId),
181
+ ],
182
+ );
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // Scheduled tasks
186
+ // ---------------------------------------------------------------------------
187
+
188
+ export const scheduledTasks = pgTable(
189
+ "scheduled_tasks",
190
+ {
191
+ id: uuid("id").primaryKey().defaultRandom(),
192
+ ownerId: text("owner_id").notNull(),
193
+ name: text("name").notNull(),
194
+ question: text("question").notNull(),
195
+ cronExpression: text("cron_expression").notNull(),
196
+ deliveryChannel: text("delivery_channel").notNull().default("webhook"),
197
+ recipients: jsonb("recipients").notNull().default(sql`'[]'`),
198
+ connectionId: text("connection_id"),
199
+ approvalMode: text("approval_mode").notNull().default("auto"),
200
+ enabled: boolean("enabled").notNull().default(true),
201
+ lastRunAt: timestamp("last_run_at", { withTimezone: true }),
202
+ nextRunAt: timestamp("next_run_at", { withTimezone: true }),
203
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
204
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
205
+ // Org scoping
206
+ orgId: text("org_id"),
207
+ },
208
+ (t) => [
209
+ index("idx_scheduled_tasks_owner").on(t.ownerId),
210
+ index("idx_scheduled_tasks_enabled").on(t.enabled).where(sql`enabled = true`),
211
+ index("idx_scheduled_tasks_next_run").on(t.nextRunAt).where(sql`enabled = true`),
212
+ index("idx_scheduled_tasks_org").on(t.orgId),
213
+ ],
214
+ );
215
+
216
+ export const scheduledTaskRuns = pgTable(
217
+ "scheduled_task_runs",
218
+ {
219
+ id: uuid("id").primaryKey().defaultRandom(),
220
+ taskId: uuid("task_id").notNull().references(() => scheduledTasks.id, { onDelete: "cascade" }),
221
+ startedAt: timestamp("started_at", { withTimezone: true }).notNull().defaultNow(),
222
+ completedAt: timestamp("completed_at", { withTimezone: true }),
223
+ status: text("status").notNull().default("running"),
224
+ conversationId: uuid("conversation_id"),
225
+ actionId: uuid("action_id"),
226
+ error: text("error"),
227
+ tokensUsed: integer("tokens_used"),
228
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
229
+ // Delivery tracking
230
+ deliveryStatus: text("delivery_status"),
231
+ deliveryError: text("delivery_error"),
232
+ },
233
+ (t) => [
234
+ index("idx_scheduled_task_runs_task").on(t.taskId),
235
+ index("idx_scheduled_task_runs_status").on(t.status),
236
+ ],
237
+ );
238
+
239
+ // ---------------------------------------------------------------------------
240
+ // Admin-managed connections
241
+ // ---------------------------------------------------------------------------
242
+
243
+ export const connections = pgTable(
244
+ "connections",
245
+ {
246
+ id: text("id").primaryKey(),
247
+ url: text("url").notNull(),
248
+ type: text("type").notNull(),
249
+ description: text("description"),
250
+ schemaName: text("schema_name"),
251
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
252
+ updatedAt: timestamp("updated_at", { withTimezone: true }).defaultNow(),
253
+ // Org scoping
254
+ orgId: text("org_id"),
255
+ },
256
+ (t) => [
257
+ index("idx_connections_org").on(t.orgId),
258
+ ],
259
+ );
260
+
261
+ // ---------------------------------------------------------------------------
262
+ // Token usage
263
+ // ---------------------------------------------------------------------------
264
+
265
+ export const tokenUsage = pgTable(
266
+ "token_usage",
267
+ {
268
+ id: uuid("id").primaryKey().defaultRandom(),
269
+ userId: text("user_id"),
270
+ conversationId: text("conversation_id"),
271
+ promptTokens: integer("prompt_tokens").notNull().default(0),
272
+ completionTokens: integer("completion_tokens").notNull().default(0),
273
+ model: text("model"),
274
+ provider: text("provider"),
275
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
276
+ // Org scoping
277
+ orgId: text("org_id"),
278
+ },
279
+ (t) => [
280
+ index("idx_token_usage_user_id").on(t.userId),
281
+ index("idx_token_usage_created_at").on(t.createdAt),
282
+ index("idx_token_usage_org").on(t.orgId),
283
+ ],
284
+ );
285
+
286
+ // ---------------------------------------------------------------------------
287
+ // Invitations
288
+ // ---------------------------------------------------------------------------
289
+
290
+ export const invitations = pgTable(
291
+ "invitations",
292
+ {
293
+ id: uuid("id").primaryKey().defaultRandom(),
294
+ email: text("email").notNull(),
295
+ role: text("role").notNull().default("member"),
296
+ token: text("token").notNull().unique(),
297
+ status: text("status").notNull().default("pending"),
298
+ invitedBy: text("invited_by"),
299
+ expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
300
+ acceptedAt: timestamp("accepted_at", { withTimezone: true }),
301
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
302
+ },
303
+ (t) => [
304
+ index("idx_invitations_email").on(t.email),
305
+ index("idx_invitations_token").on(t.token),
306
+ index("idx_invitations_status").on(t.status),
307
+ uniqueIndex("idx_invitations_pending_email").on(t.email).where(sql`status = 'pending'`),
308
+ ],
309
+ );
310
+
311
+ // ---------------------------------------------------------------------------
312
+ // Plugin & application settings
313
+ // ---------------------------------------------------------------------------
314
+
315
+ export const pluginSettings = pgTable("plugin_settings", {
316
+ pluginId: text("plugin_id").primaryKey(),
317
+ enabled: boolean("enabled").notNull().default(true),
318
+ config: jsonb("config"),
319
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
320
+ // Org scoping
321
+ orgId: text("org_id"),
322
+ });
323
+
324
+ export const settings = pgTable(
325
+ "settings",
326
+ {
327
+ key: text("key").notNull(),
328
+ value: text("value").notNull(),
329
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
330
+ updatedBy: text("updated_by"),
331
+ orgId: text("org_id"),
332
+ },
333
+ (t) => [
334
+ // Replaces the original PK. Global settings: one row per key where org_id IS NULL.
335
+ // Per-org overrides: one row per (key, org_id) pair.
336
+ uniqueIndex("uq_settings_key_global").on(t.key).where(sql`org_id IS NULL`),
337
+ uniqueIndex("uq_settings_key_org").on(t.key, t.orgId).where(sql`org_id IS NOT NULL`),
338
+ ],
339
+ );
340
+
341
+ // ---------------------------------------------------------------------------
342
+ // Semantic entities (DB-backed semantic layer)
343
+ // ---------------------------------------------------------------------------
344
+
345
+ export const semanticEntities = pgTable(
346
+ "semantic_entities",
347
+ {
348
+ id: uuid("id").primaryKey().defaultRandom(),
349
+ orgId: text("org_id").notNull(),
350
+ entityType: text("entity_type").notNull(),
351
+ name: text("name").notNull(),
352
+ yamlContent: text("yaml_content").notNull(),
353
+ connectionId: text("connection_id"),
354
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
355
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
356
+ },
357
+ (t) => [
358
+ uniqueIndex("idx_semantic_entities_org_type_name").on(t.orgId, t.entityType, t.name),
359
+ index("idx_semantic_entities_org").on(t.orgId),
360
+ index("idx_semantic_entities_org_type").on(t.orgId, t.entityType),
361
+ ],
362
+ );
363
+
364
+ // ---------------------------------------------------------------------------
365
+ // Learned patterns (dynamic learning layer)
366
+ // ---------------------------------------------------------------------------
367
+
368
+ export const learnedPatterns = pgTable(
369
+ "learned_patterns",
370
+ {
371
+ id: uuid("id").primaryKey().defaultRandom(),
372
+ orgId: text("org_id"),
373
+ patternSql: text("pattern_sql").notNull(),
374
+ description: text("description"),
375
+ sourceEntity: text("source_entity"),
376
+ sourceQueries: jsonb("source_queries"),
377
+ confidence: real("confidence").notNull().default(0.1),
378
+ repetitionCount: integer("repetition_count").notNull().default(1),
379
+ status: text("status").notNull().default("pending"),
380
+ proposedBy: text("proposed_by"),
381
+ reviewedBy: text("reviewed_by"),
382
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
383
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
384
+ reviewedAt: timestamp("reviewed_at", { withTimezone: true }),
385
+ },
386
+ (t) => [
387
+ index("idx_learned_patterns_org_status").on(t.orgId, t.status),
388
+ index("idx_learned_patterns_org_entity").on(t.orgId, t.sourceEntity),
389
+ ],
390
+ );
391
+
392
+ // ---------------------------------------------------------------------------
393
+ // Prompt library
394
+ // ---------------------------------------------------------------------------
395
+
396
+ export const promptCollections = pgTable(
397
+ "prompt_collections",
398
+ {
399
+ id: uuid("id").primaryKey().defaultRandom(),
400
+ orgId: text("org_id"),
401
+ name: text("name").notNull(),
402
+ industry: text("industry").notNull(),
403
+ description: text("description").notNull().default(""),
404
+ isBuiltin: boolean("is_builtin").notNull().default(false),
405
+ sortOrder: integer("sort_order").notNull().default(0),
406
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
407
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
408
+ },
409
+ (t) => [
410
+ index("idx_prompt_collections_org").on(t.orgId),
411
+ index("idx_prompt_collections_builtin").on(t.isBuiltin).where(sql`is_builtin = true`),
412
+ ],
413
+ );
414
+
415
+ export const promptItems = pgTable(
416
+ "prompt_items",
417
+ {
418
+ id: uuid("id").primaryKey().defaultRandom(),
419
+ collectionId: uuid("collection_id").notNull().references(() => promptCollections.id, { onDelete: "cascade" }),
420
+ question: text("question").notNull(),
421
+ description: text("description"),
422
+ category: text("category"),
423
+ sortOrder: integer("sort_order").notNull().default(0),
424
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
425
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
426
+ },
427
+ (t) => [
428
+ index("idx_prompt_items_collection").on(t.collectionId),
429
+ ],
430
+ );
431
+
432
+ // ---------------------------------------------------------------------------
433
+ // Query suggestions
434
+ // ---------------------------------------------------------------------------
435
+
436
+ export const querySuggestions = pgTable(
437
+ "query_suggestions",
438
+ {
439
+ id: uuid("id").primaryKey().defaultRandom(),
440
+ orgId: text("org_id"),
441
+ description: text("description").notNull(),
442
+ patternSql: text("pattern_sql").notNull(),
443
+ normalizedHash: text("normalized_hash").notNull(),
444
+ tablesInvolved: jsonb("tables_involved").notNull().default(sql`'[]'`),
445
+ primaryTable: text("primary_table"),
446
+ frequency: integer("frequency").notNull().default(1),
447
+ clickedCount: integer("clicked_count").notNull().default(0),
448
+ score: real("score").notNull().default(0),
449
+ lastSeenAt: timestamp("last_seen_at", { withTimezone: true }).notNull().defaultNow(),
450
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
451
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
452
+ },
453
+ (t) => [
454
+ // UNIQUE NULLS NOT DISTINCT — requires PostgreSQL 15+
455
+ // Handled via raw SQL in migration since Drizzle doesn't support NULLS NOT DISTINCT
456
+ index("idx_query_suggestions_org_table").on(t.orgId, t.primaryTable),
457
+ index("idx_query_suggestions_org_score").on(t.orgId, sql`score DESC`),
458
+ index("idx_query_suggestions_tables").using("gin", t.tablesInvolved),
459
+ ],
460
+ );
461
+
462
+ // ---------------------------------------------------------------------------
463
+ // Usage metering
464
+ // ---------------------------------------------------------------------------
465
+
466
+ export const usageEvents = pgTable(
467
+ "usage_events",
468
+ {
469
+ id: uuid("id").primaryKey().defaultRandom(),
470
+ workspaceId: text("workspace_id"),
471
+ userId: text("user_id"),
472
+ eventType: text("event_type").notNull(),
473
+ quantity: integer("quantity").notNull().default(1),
474
+ metadata: jsonb("metadata"),
475
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
476
+ },
477
+ (t) => [
478
+ index("idx_usage_events_workspace").on(t.workspaceId, t.createdAt),
479
+ index("idx_usage_events_type").on(t.eventType, t.createdAt),
480
+ index("idx_usage_events_user").on(t.userId, t.createdAt),
481
+ ],
482
+ );
483
+
484
+ export const usageSummaries = pgTable(
485
+ "usage_summaries",
486
+ {
487
+ id: uuid("id").primaryKey().defaultRandom(),
488
+ workspaceId: text("workspace_id").notNull(),
489
+ period: text("period").notNull(),
490
+ periodStart: timestamp("period_start", { withTimezone: true }).notNull(),
491
+ queryCount: integer("query_count").notNull().default(0),
492
+ tokenCount: integer("token_count").notNull().default(0),
493
+ activeUsers: integer("active_users").notNull().default(0),
494
+ storageBytes: bigint("storage_bytes", { mode: "bigint" }).notNull().default(BigInt(0)),
495
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
496
+ },
497
+ (t) => [
498
+ uniqueIndex("idx_usage_summaries_ws_period").on(t.workspaceId, t.period, t.periodStart),
499
+ index("idx_usage_summaries_workspace").on(t.workspaceId, t.periodStart),
500
+ ],
501
+ );
502
+
503
+ // ---------------------------------------------------------------------------
504
+ // Enterprise SSO providers
505
+ // ---------------------------------------------------------------------------
506
+
507
+ export const ssoProviders = pgTable(
508
+ "sso_providers",
509
+ {
510
+ id: uuid("id").primaryKey().defaultRandom(),
511
+ orgId: text("org_id").notNull(),
512
+ type: text("type").notNull(),
513
+ issuer: text("issuer").notNull(),
514
+ domain: text("domain").notNull(),
515
+ enabled: boolean("enabled").notNull().default(false),
516
+ config: jsonb("config").notNull().default(sql`'{}'`),
517
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
518
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
519
+ ssoEnforced: boolean("sso_enforced").notNull().default(false),
520
+ },
521
+ (t) => [
522
+ check("chk_sso_type", sql`type IN ('saml', 'oidc')`),
523
+ index("idx_sso_providers_org").on(t.orgId),
524
+ uniqueIndex("idx_sso_providers_domain").on(t.domain),
525
+ index("idx_sso_providers_enabled").on(t.orgId, t.enabled).where(sql`enabled = true`),
526
+ ],
527
+ );
528
+
529
+ // ---------------------------------------------------------------------------
530
+ // Demo leads
531
+ // ---------------------------------------------------------------------------
532
+
533
+ export const demoLeads = pgTable(
534
+ "demo_leads",
535
+ {
536
+ id: uuid("id").primaryKey().defaultRandom(),
537
+ email: text("email").notNull().unique(),
538
+ ipAddress: text("ip_address"),
539
+ userAgent: text("user_agent"),
540
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
541
+ lastActiveAt: timestamp("last_active_at", { withTimezone: true }).notNull().defaultNow(),
542
+ sessionCount: integer("session_count").notNull().default(1),
543
+ },
544
+ (t) => [
545
+ index("idx_demo_leads_created").on(t.createdAt),
546
+ ],
547
+ );
548
+
549
+ // ---------------------------------------------------------------------------
550
+ // Enterprise IP allowlist
551
+ // ---------------------------------------------------------------------------
552
+
553
+ export const ipAllowlist = pgTable(
554
+ "ip_allowlist",
555
+ {
556
+ id: uuid("id").primaryKey().defaultRandom(),
557
+ orgId: text("org_id").notNull(),
558
+ cidr: text("cidr").notNull(),
559
+ description: text("description"),
560
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
561
+ createdBy: text("created_by"),
562
+ },
563
+ (t) => [
564
+ uniqueIndex("ip_allowlist_org_id_cidr_unique").on(t.orgId, t.cidr),
565
+ index("idx_ip_allowlist_org").on(t.orgId),
566
+ ],
567
+ );
568
+
569
+ // ---------------------------------------------------------------------------
570
+ // Enterprise custom roles
571
+ // ---------------------------------------------------------------------------
572
+
573
+ export const customRoles = pgTable(
574
+ "custom_roles",
575
+ {
576
+ id: uuid("id").primaryKey().defaultRandom(),
577
+ orgId: text("org_id").notNull(),
578
+ name: text("name").notNull(),
579
+ description: text("description").notNull().default(""),
580
+ permissions: jsonb("permissions").notNull().default(sql`'[]'`),
581
+ isBuiltin: boolean("is_builtin").notNull().default(false),
582
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
583
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
584
+ },
585
+ (t) => [
586
+ uniqueIndex("idx_custom_roles_org_name").on(t.orgId, t.name),
587
+ index("idx_custom_roles_org").on(t.orgId),
588
+ index("idx_custom_roles_builtin").on(t.isBuiltin).where(sql`is_builtin = true`),
589
+ ],
590
+ );
591
+
592
+ // ---------------------------------------------------------------------------
593
+ // User onboarding
594
+ // ---------------------------------------------------------------------------
595
+
596
+ export const userOnboarding = pgTable("user_onboarding", {
597
+ userId: text("user_id").primaryKey(),
598
+ tourCompletedAt: timestamp("tour_completed_at", { withTimezone: true }),
599
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
600
+ });
601
+
602
+ // ---------------------------------------------------------------------------
603
+ // Audit retention config
604
+ // ---------------------------------------------------------------------------
605
+
606
+ export const auditRetentionConfig = pgTable(
607
+ "audit_retention_config",
608
+ {
609
+ id: uuid("id").primaryKey().defaultRandom(),
610
+ orgId: text("org_id").notNull().unique(),
611
+ retentionDays: integer("retention_days"),
612
+ hardDeleteDelayDays: integer("hard_delete_delay_days").notNull().default(30),
613
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
614
+ updatedBy: text("updated_by"),
615
+ lastPurgeAt: timestamp("last_purge_at", { withTimezone: true }),
616
+ lastPurgeCount: integer("last_purge_count"),
617
+ },
618
+ (t) => [
619
+ index("idx_audit_retention_config_org").on(t.orgId),
620
+ ],
621
+ );
622
+
623
+ // ---------------------------------------------------------------------------
624
+ // Workspace model config
625
+ // ---------------------------------------------------------------------------
626
+
627
+ export const workspaceModelConfig = pgTable(
628
+ "workspace_model_config",
629
+ {
630
+ id: uuid("id").primaryKey().defaultRandom(),
631
+ orgId: text("org_id").notNull().unique(),
632
+ provider: text("provider").notNull(),
633
+ model: text("model").notNull(),
634
+ apiKeyEncrypted: text("api_key_encrypted").notNull(),
635
+ baseUrl: text("base_url"),
636
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
637
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
638
+ },
639
+ (t) => [
640
+ check("chk_model_provider", sql`provider IN ('anthropic', 'openai', 'azure-openai', 'custom')`),
641
+ index("idx_workspace_model_config_org").on(t.orgId),
642
+ ],
643
+ );
644
+
645
+ // ---------------------------------------------------------------------------
646
+ // Approval workflows
647
+ // ---------------------------------------------------------------------------
648
+
649
+ export const approvalRules = pgTable(
650
+ "approval_rules",
651
+ {
652
+ id: uuid("id").primaryKey().defaultRandom(),
653
+ orgId: text("org_id").notNull(),
654
+ name: text("name").notNull(),
655
+ ruleType: text("rule_type").notNull(),
656
+ pattern: text("pattern").notNull().default(""),
657
+ threshold: integer("threshold"),
658
+ enabled: boolean("enabled").notNull().default(true),
659
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
660
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
661
+ },
662
+ (t) => [
663
+ check("chk_approval_rule_type", sql`rule_type IN ('table', 'column', 'cost')`),
664
+ index("idx_approval_rules_org").on(t.orgId),
665
+ index("idx_approval_rules_org_enabled").on(t.orgId).where(sql`enabled = true`),
666
+ ],
667
+ );
668
+
669
+ export const approvalQueue = pgTable(
670
+ "approval_queue",
671
+ {
672
+ id: uuid("id").primaryKey().defaultRandom(),
673
+ orgId: text("org_id").notNull(),
674
+ ruleId: uuid("rule_id").notNull(),
675
+ ruleName: text("rule_name").notNull(),
676
+ requesterId: text("requester_id").notNull(),
677
+ requesterEmail: text("requester_email"),
678
+ querySql: text("query_sql").notNull(),
679
+ explanation: text("explanation"),
680
+ connectionId: text("connection_id").notNull().default("default"),
681
+ tablesAccessed: jsonb("tables_accessed").default(sql`'[]'`),
682
+ columnsAccessed: jsonb("columns_accessed").default(sql`'[]'`),
683
+ status: text("status").notNull().default("pending"),
684
+ reviewerId: text("reviewer_id"),
685
+ reviewerEmail: text("reviewer_email"),
686
+ reviewComment: text("review_comment"),
687
+ reviewedAt: timestamp("reviewed_at", { withTimezone: true }),
688
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
689
+ expiresAt: timestamp("expires_at", { withTimezone: true }).notNull().default(sql`now() + interval '24 hours'`),
690
+ },
691
+ (t) => [
692
+ check("chk_approval_status", sql`status IN ('pending', 'approved', 'denied', 'expired')`),
693
+ index("idx_approval_queue_org_status").on(t.orgId, t.status),
694
+ index("idx_approval_queue_expires").on(t.expiresAt).where(sql`status = 'pending'`),
695
+ index("idx_approval_queue_requester").on(t.requesterId),
696
+ ],
697
+ );
698
+
699
+ // ---------------------------------------------------------------------------
700
+ // Workspace branding
701
+ // ---------------------------------------------------------------------------
702
+
703
+ export const workspaceBranding = pgTable(
704
+ "workspace_branding",
705
+ {
706
+ id: uuid("id").primaryKey().defaultRandom(),
707
+ orgId: text("org_id").notNull().unique(),
708
+ logoUrl: text("logo_url"),
709
+ logoText: text("logo_text"),
710
+ primaryColor: text("primary_color"),
711
+ faviconUrl: text("favicon_url"),
712
+ hideAtlasBranding: boolean("hide_atlas_branding").notNull().default(false),
713
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
714
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
715
+ },
716
+ (t) => [
717
+ index("idx_workspace_branding_org").on(t.orgId),
718
+ ],
719
+ );
720
+
721
+ // ---------------------------------------------------------------------------
722
+ // Onboarding emails
723
+ // ---------------------------------------------------------------------------
724
+
725
+ export const onboardingEmails = pgTable(
726
+ "onboarding_emails",
727
+ {
728
+ id: uuid("id").primaryKey().defaultRandom(),
729
+ userId: text("user_id").notNull(),
730
+ orgId: text("org_id").notNull(),
731
+ step: text("step").notNull(),
732
+ triggeredBy: text("triggered_by").notNull(),
733
+ sentAt: timestamp("sent_at", { withTimezone: true }).notNull().defaultNow(),
734
+ },
735
+ (t) => [
736
+ uniqueIndex("idx_onboarding_emails_user_step").on(t.userId, t.step),
737
+ index("idx_onboarding_emails_org").on(t.orgId),
738
+ ],
739
+ );
740
+
741
+ // ---------------------------------------------------------------------------
742
+ // Email preferences
743
+ // ---------------------------------------------------------------------------
744
+
745
+ export const emailPreferences = pgTable("email_preferences", {
746
+ userId: text("user_id").primaryKey(),
747
+ onboardingEmails: boolean("onboarding_emails").notNull().default(true),
748
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
749
+ });
750
+
751
+ // ---------------------------------------------------------------------------
752
+ // Abuse prevention
753
+ // ---------------------------------------------------------------------------
754
+
755
+ export const abuseEvents = pgTable(
756
+ "abuse_events",
757
+ {
758
+ id: uuid("id").primaryKey().defaultRandom(),
759
+ workspaceId: text("workspace_id").notNull(),
760
+ level: text("level").notNull(),
761
+ triggerType: text("trigger_type").notNull(),
762
+ message: text("message").notNull(),
763
+ metadata: jsonb("metadata").notNull().default(sql`'{}'`),
764
+ actor: text("actor").notNull().default("system"),
765
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
766
+ },
767
+ (t) => [
768
+ index("idx_abuse_events_workspace").on(t.workspaceId, t.createdAt),
769
+ index("idx_abuse_events_level").on(t.level),
770
+ ],
771
+ );
772
+
773
+ // ---------------------------------------------------------------------------
774
+ // Custom domains
775
+ // ---------------------------------------------------------------------------
776
+
777
+ export const customDomains = pgTable(
778
+ "custom_domains",
779
+ {
780
+ id: uuid("id").primaryKey().defaultRandom(),
781
+ workspaceId: text("workspace_id").notNull(),
782
+ domain: text("domain").notNull().unique(),
783
+ status: text("status").notNull().default("pending"),
784
+ railwayDomainId: text("railway_domain_id"),
785
+ cnameTarget: text("cname_target"),
786
+ certificateStatus: text("certificate_status"),
787
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
788
+ verifiedAt: timestamp("verified_at", { withTimezone: true }),
789
+ },
790
+ (t) => [
791
+ check("chk_domain_status", sql`status IN ('pending', 'verified', 'failed')`),
792
+ index("idx_custom_domains_workspace").on(t.workspaceId),
793
+ index("idx_custom_domains_status").on(t.status),
794
+ ],
795
+ );
796
+
797
+ // ---------------------------------------------------------------------------
798
+ // EE: Backups
799
+ // ---------------------------------------------------------------------------
800
+
801
+ export const backups = pgTable(
802
+ "backups",
803
+ {
804
+ id: text("id").primaryKey().default(sql`gen_random_uuid()::text`),
805
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
806
+ sizeBytes: bigint("size_bytes", { mode: "bigint" }),
807
+ status: text("status").notNull().default("in_progress"),
808
+ storagePath: text("storage_path").notNull(),
809
+ retentionExpiresAt: timestamp("retention_expires_at", { withTimezone: true }).notNull(),
810
+ errorMessage: text("error_message"),
811
+ },
812
+ (t) => [
813
+ index("idx_backups_status").on(t.status, sql`created_at DESC`),
814
+ ],
815
+ );
816
+
817
+ export const backupConfig = pgTable("backup_config", {
818
+ id: text("id").primaryKey().default("_default"),
819
+ schedule: text("schedule").notNull().default("0 3 * * *"),
820
+ retentionDays: integer("retention_days").notNull().default(30),
821
+ storagePath: text("storage_path").notNull().default("./backups"),
822
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
823
+ });
824
+
825
+ // ---------------------------------------------------------------------------
826
+ // EE: PII column classifications (compliance/masking)
827
+ // ---------------------------------------------------------------------------
828
+
829
+ export const piiColumnClassifications = pgTable(
830
+ "pii_column_classifications",
831
+ {
832
+ id: text("id").primaryKey().default(sql`gen_random_uuid()::text`),
833
+ orgId: text("org_id").notNull(),
834
+ tableName: text("table_name").notNull(),
835
+ columnName: text("column_name").notNull(),
836
+ connectionId: text("connection_id").notNull().default("default"),
837
+ category: text("category").notNull(),
838
+ confidence: text("confidence").notNull().default("medium"),
839
+ maskingStrategy: text("masking_strategy").notNull().default("partial"),
840
+ reviewed: boolean("reviewed").notNull().default(false),
841
+ dismissed: boolean("dismissed").notNull().default(false),
842
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
843
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
844
+ },
845
+ (t) => [
846
+ uniqueIndex("pii_column_classifications_unique").on(t.orgId, t.tableName, t.columnName, t.connectionId),
847
+ ],
848
+ );
849
+
850
+ // ---------------------------------------------------------------------------
851
+ // EE: SCIM group mappings
852
+ // ---------------------------------------------------------------------------
853
+
854
+ export const scimGroupMappings = pgTable(
855
+ "scim_group_mappings",
856
+ {
857
+ id: uuid("id").primaryKey().defaultRandom(),
858
+ orgId: text("org_id").notNull(),
859
+ scimGroupName: text("scim_group_name").notNull(),
860
+ roleName: text("role_name").notNull(),
861
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
862
+ },
863
+ (t) => [
864
+ uniqueIndex("scim_group_mappings_org_group").on(t.orgId, t.scimGroupName),
865
+ ],
866
+ );
867
+
868
+ // ---------------------------------------------------------------------------
869
+ // EE: SLA metrics
870
+ // ---------------------------------------------------------------------------
871
+
872
+ export const slaMetrics = pgTable(
873
+ "sla_metrics",
874
+ {
875
+ id: text("id").primaryKey().default(sql`gen_random_uuid()::text`),
876
+ workspaceId: text("workspace_id").notNull(),
877
+ latencyMs: doublePrecision("latency_ms").notNull(),
878
+ isError: boolean("is_error").notNull().default(false),
879
+ recordedAt: timestamp("recorded_at", { withTimezone: true }).notNull().defaultNow(),
880
+ },
881
+ (t) => [
882
+ index("idx_sla_metrics_ws_time").on(t.workspaceId, sql`recorded_at DESC`),
883
+ ],
884
+ );
885
+
886
+ export const slaAlerts = pgTable(
887
+ "sla_alerts",
888
+ {
889
+ id: text("id").primaryKey().default(sql`gen_random_uuid()::text`),
890
+ workspaceId: text("workspace_id").notNull(),
891
+ alertType: text("alert_type").notNull(),
892
+ status: text("status").notNull().default("firing"),
893
+ currentValue: doublePrecision("current_value").notNull(),
894
+ threshold: doublePrecision("threshold").notNull(),
895
+ message: text("message").notNull(),
896
+ firedAt: timestamp("fired_at", { withTimezone: true }).notNull().defaultNow(),
897
+ resolvedAt: timestamp("resolved_at", { withTimezone: true }),
898
+ acknowledgedAt: timestamp("acknowledged_at", { withTimezone: true }),
899
+ acknowledgedBy: text("acknowledged_by"),
900
+ },
901
+ (t) => [
902
+ index("idx_sla_alerts_ws").on(t.workspaceId, t.status),
903
+ ],
904
+ );
905
+
906
+ export const slaThresholds = pgTable("sla_thresholds", {
907
+ workspaceId: text("workspace_id").primaryKey(),
908
+ latencyP99Ms: doublePrecision("latency_p99_ms").notNull().default(5000),
909
+ errorRatePct: doublePrecision("error_rate_pct").notNull().default(5),
910
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
911
+ });
912
+
913
+ // ---------------------------------------------------------------------------
914
+ // Teams integration (0001_teams_installations.sql)
915
+ // ---------------------------------------------------------------------------
916
+
917
+ export const teamsInstallations = pgTable(
918
+ "teams_installations",
919
+ {
920
+ tenantId: text("tenant_id").primaryKey(),
921
+ orgId: text("org_id"),
922
+ tenantName: text("tenant_name"),
923
+ appPassword: text("app_password"),
924
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
925
+ },
926
+ (t) => [
927
+ index("idx_teams_installations_org").on(t.orgId),
928
+ ],
929
+ );
930
+
931
+ // ---------------------------------------------------------------------------
932
+ // Discord integration (0002_discord_installations.sql)
933
+ // ---------------------------------------------------------------------------
934
+
935
+ export const discordInstallations = pgTable(
936
+ "discord_installations",
937
+ {
938
+ guildId: text("guild_id").primaryKey(),
939
+ orgId: text("org_id"),
940
+ guildName: text("guild_name"),
941
+ botToken: text("bot_token"),
942
+ applicationId: text("application_id"),
943
+ publicKey: text("public_key"),
944
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
945
+ },
946
+ (t) => [
947
+ index("idx_discord_installations_org").on(t.orgId),
948
+ ],
949
+ );
950
+
951
+ // ---------------------------------------------------------------------------
952
+ // Telegram integration (0003_telegram_installations.sql)
953
+ // ---------------------------------------------------------------------------
954
+
955
+ export const telegramInstallations = pgTable(
956
+ "telegram_installations",
957
+ {
958
+ botId: text("bot_id").primaryKey(),
959
+ botToken: text("bot_token").notNull(),
960
+ botUsername: text("bot_username"),
961
+ orgId: text("org_id"),
962
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
963
+ },
964
+ (t) => [
965
+ index("idx_telegram_installations_org").on(t.orgId),
966
+ ],
967
+ );
968
+
969
+ // ---------------------------------------------------------------------------
970
+ // Google Chat integration (0007_gchat_installations.sql)
971
+ // ---------------------------------------------------------------------------
972
+
973
+ export const gchatInstallations = pgTable(
974
+ "gchat_installations",
975
+ {
976
+ projectId: text("project_id").primaryKey(),
977
+ serviceAccountEmail: text("service_account_email").notNull(),
978
+ credentialsJson: text("credentials_json").notNull(),
979
+ orgId: text("org_id"),
980
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
981
+ },
982
+ (t) => [
983
+ index("idx_gchat_installations_org").on(t.orgId),
984
+ ],
985
+ );
986
+
987
+ // ---------------------------------------------------------------------------
988
+ // GitHub integration (0008_github_installations.sql)
989
+ // ---------------------------------------------------------------------------
990
+
991
+ export const githubInstallations = pgTable(
992
+ "github_installations",
993
+ {
994
+ userId: text("user_id").primaryKey(),
995
+ accessToken: text("access_token").notNull(),
996
+ username: text("username"),
997
+ orgId: text("org_id"),
998
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
999
+ },
1000
+ (t) => [
1001
+ index("idx_github_installations_org").on(t.orgId),
1002
+ ],
1003
+ );
1004
+
1005
+ // ---------------------------------------------------------------------------
1006
+ // Linear integration (0009_linear_installations.sql)
1007
+ // ---------------------------------------------------------------------------
1008
+
1009
+ export const linearInstallations = pgTable(
1010
+ "linear_installations",
1011
+ {
1012
+ userId: text("user_id").primaryKey(),
1013
+ apiKey: text("api_key").notNull(),
1014
+ userName: text("user_name"),
1015
+ userEmail: text("user_email"),
1016
+ orgId: text("org_id"),
1017
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
1018
+ },
1019
+ (t) => [
1020
+ index("idx_linear_installations_org").on(t.orgId),
1021
+ ],
1022
+ );
1023
+
1024
+ // ---------------------------------------------------------------------------
1025
+ // WhatsApp integration (0010_whatsapp_installations.sql)
1026
+ // ---------------------------------------------------------------------------
1027
+
1028
+ export const whatsappInstallations = pgTable(
1029
+ "whatsapp_installations",
1030
+ {
1031
+ phoneNumberId: text("phone_number_id").primaryKey(),
1032
+ accessToken: text("access_token").notNull(),
1033
+ displayPhone: text("display_phone"),
1034
+ orgId: text("org_id"),
1035
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
1036
+ },
1037
+ (t) => [
1038
+ index("idx_whatsapp_installations_org").on(t.orgId),
1039
+ ],
1040
+ );
1041
+
1042
+ // ---------------------------------------------------------------------------
1043
+ // Email integration (0011_email_installations.sql)
1044
+ // ---------------------------------------------------------------------------
1045
+
1046
+ export const emailInstallations = pgTable(
1047
+ "email_installations",
1048
+ {
1049
+ configId: text("config_id").primaryKey().$defaultFn(() => crypto.randomUUID()),
1050
+ provider: text("provider").notNull(),
1051
+ senderAddress: text("sender_address").notNull(),
1052
+ config: jsonb("config").notNull().$type<Record<string, unknown>>().default({}),
1053
+ orgId: text("org_id"),
1054
+ installedAt: timestamp("installed_at", { withTimezone: true }).defaultNow(),
1055
+ },
1056
+ (t) => [
1057
+ uniqueIndex("idx_email_installations_org").on(t.orgId),
1058
+ ],
1059
+ );
1060
+
1061
+ // ---------------------------------------------------------------------------
1062
+ // OAuth state (0005_oauth_state.sql)
1063
+ // ---------------------------------------------------------------------------
1064
+
1065
+ export const oauthState = pgTable("oauth_state", {
1066
+ nonce: text("nonce").primaryKey(),
1067
+ orgId: text("org_id"),
1068
+ provider: text("provider").notNull(),
1069
+ expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
1070
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
1071
+ }, (t) => [
1072
+ index("idx_oauth_state_expires").on(t.expiresAt),
1073
+ ]);
1074
+
1075
+ // ---------------------------------------------------------------------------
1076
+ // Region migrations (0012_region_migrations.sql)
1077
+ // ---------------------------------------------------------------------------
1078
+
1079
+ export const regionMigrations = pgTable(
1080
+ "region_migrations",
1081
+ {
1082
+ id: text("id").primaryKey(),
1083
+ workspaceId: text("workspace_id").notNull(),
1084
+ sourceRegion: text("source_region").notNull(),
1085
+ targetRegion: text("target_region").notNull(),
1086
+ status: text("status").notNull().default("pending"),
1087
+ requestedBy: text("requested_by"),
1088
+ errorMessage: text("error_message"),
1089
+ requestedAt: timestamp("requested_at", { withTimezone: true }).notNull().defaultNow(),
1090
+ completedAt: timestamp("completed_at", { withTimezone: true }),
1091
+ },
1092
+ (t) => [
1093
+ index("idx_region_migrations_workspace").on(t.workspaceId),
1094
+ index("idx_region_migrations_status").on(t.status),
1095
+ uniqueIndex("idx_region_migrations_one_active")
1096
+ .on(t.workspaceId)
1097
+ .where(sql`status IN ('pending', 'in_progress')`),
1098
+ ],
1099
+ );
1100
+
1101
+ // ---------------------------------------------------------------------------
1102
+ // Sandbox credentials (0004_sandbox_credentials.sql)
1103
+ // ---------------------------------------------------------------------------
1104
+
1105
+ export const sandboxCredentials = pgTable(
1106
+ "sandbox_credentials",
1107
+ {
1108
+ id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()),
1109
+ orgId: text("org_id").notNull(),
1110
+ provider: text("provider").notNull(),
1111
+ credentials: jsonb("credentials").notNull(),
1112
+ displayName: text("display_name"),
1113
+ validatedAt: timestamp("validated_at", { withTimezone: true }),
1114
+ connectedAt: timestamp("connected_at", { withTimezone: true }).defaultNow(),
1115
+ },
1116
+ (t) => [
1117
+ uniqueIndex("sandbox_credentials_org_provider").on(t.orgId, t.provider),
1118
+ index("idx_sandbox_credentials_org").on(t.orgId),
1119
+ ],
1120
+ );