spine-framework 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/LICENSE.md +213 -8
  2. package/README.md +327 -0
  3. package/package.json +107 -217
  4. package/src/cli/commands/init.ts +192 -0
  5. package/src/cli/commands/install.ts +25 -0
  6. package/src/cli/commands/list.ts +33 -0
  7. package/src/cli/commands/migrate.ts +24 -0
  8. package/src/cli/index.ts +46 -0
  9. package/src/components/AppLayout.tsx +21 -0
  10. package/src/components/AuthGuard.tsx +21 -0
  11. package/src/components/RoleGuard.tsx +23 -0
  12. package/src/components/index.ts +3 -0
  13. package/src/contexts/AppContext.tsx +122 -0
  14. package/src/contexts/AuthContext.tsx +87 -0
  15. package/src/contexts/SpineContext.tsx +46 -0
  16. package/src/contexts/index.ts +3 -0
  17. package/src/hooks/index.ts +4 -0
  18. package/src/hooks/useItems.ts +78 -0
  19. package/src/hooks/useThreads.ts +73 -0
  20. package/src/hooks/useWebSocket.ts +97 -0
  21. package/src/index.ts +22 -0
  22. package/src/types/index.ts +163 -0
  23. package/src/utils/api.ts +88 -0
  24. package/src/utils/client.ts +146 -0
  25. package/src/utils/config.ts +20 -0
  26. package/src/utils/index.ts +3 -0
  27. package/.framework/README.md +0 -129
  28. package/.framework/cli/bin.cjs +0 -14
  29. package/.framework/cli/commands/agents.ts +0 -153
  30. package/.framework/cli/commands/auth.ts +0 -94
  31. package/.framework/cli/commands/create-app.ts +0 -185
  32. package/.framework/cli/commands/dev.ts +0 -113
  33. package/.framework/cli/commands/doctor.ts +0 -442
  34. package/.framework/cli/commands/generate.ts +0 -332
  35. package/.framework/cli/commands/init.ts +0 -186
  36. package/.framework/cli/commands/install-app.ts +0 -565
  37. package/.framework/cli/commands/items.ts +0 -253
  38. package/.framework/cli/commands/migrate.ts +0 -139
  39. package/.framework/cli/commands/migrations.ts +0 -141
  40. package/.framework/cli/commands/pipelines.ts +0 -166
  41. package/.framework/cli/commands/status.ts +0 -197
  42. package/.framework/cli/commands/system.ts +0 -184
  43. package/.framework/cli/commands/test.ts +0 -227
  44. package/.framework/cli/commands/uninstall-app.ts +0 -166
  45. package/.framework/cli/context.ts +0 -268
  46. package/.framework/cli/env-loader.ts +0 -36
  47. package/.framework/cli/index.ts +0 -116
  48. package/.framework/cli/welcome.cjs +0 -45
  49. package/.framework/docs/API.md +0 -384
  50. package/.framework/docs/STABILITY.md +0 -52
  51. package/.framework/docs/admin-routes.md +0 -76
  52. package/.framework/docs/api-docs-progress.md +0 -38
  53. package/.framework/docs/api-governance.md +0 -146
  54. package/.framework/docs/api-testing-results.md +0 -212
  55. package/.framework/docs/apis/admin-configs.md +0 -567
  56. package/.framework/docs/apis/admin-data.md +0 -272
  57. package/.framework/docs/apis/index.md +0 -231
  58. package/.framework/docs/apis/internal.md +0 -295
  59. package/.framework/docs/apis/runtime.md +0 -537
  60. package/.framework/docs/assembly-launch-guide.md +0 -138
  61. package/.framework/docs/audit-results.md +0 -590
  62. package/.framework/docs/authorization-model.md +0 -170
  63. package/.framework/docs/db-api-inventory.md +0 -95
  64. package/.framework/docs/examples/custom-app/README.md +0 -77
  65. package/.framework/docs/examples/custom-function/README.md +0 -27
  66. package/.framework/docs/examples/custom-function/handler.ts +0 -48
  67. package/.framework/docs/examples/custom-webhook/README.md +0 -68
  68. package/.framework/docs/gap-remediation-backlog.md +0 -103
  69. package/.framework/docs/guides/cli-guide.md +0 -224
  70. package/.framework/docs/guides/getting-started.md +0 -103
  71. package/.framework/docs/guides/import-guide.md +0 -193
  72. package/.framework/docs/guides/testing-guide.md +0 -229
  73. package/.framework/docs/permission-examples.md +0 -326
  74. package/.framework/docs/ui-adoption-verification.md +0 -111
  75. package/.framework/docs/ui-api-coverage.md +0 -84
  76. package/.framework/docs/v2-compatibility-audit.md +0 -228
  77. package/.framework/functions/.gitkeep +0 -1
  78. package/.framework/functions/_shared/agent-runner.ts +0 -1097
  79. package/.framework/functions/_shared/app-manifest.ts +0 -184
  80. package/.framework/functions/_shared/audit.ts +0 -150
  81. package/.framework/functions/_shared/db.ts +0 -178
  82. package/.framework/functions/_shared/index.ts +0 -391
  83. package/.framework/functions/_shared/middleware.ts +0 -490
  84. package/.framework/functions/_shared/permissions.ts +0 -1325
  85. package/.framework/functions/_shared/pipeline-runner.ts +0 -731
  86. package/.framework/functions/_shared/principal.ts +0 -818
  87. package/.framework/functions/_shared/resolve-ids.ts +0 -106
  88. package/.framework/functions/_shared/schema-utils.ts +0 -967
  89. package/.framework/functions/_shared/testing.ts +0 -258
  90. package/.framework/functions/_shared/trigger-engine.ts +0 -425
  91. package/.framework/functions/_shared/webhook-registration.ts +0 -168
  92. package/.framework/functions/_shared/webhook-registry.ts +0 -129
  93. package/.framework/functions/account-nodes.ts +0 -111
  94. package/.framework/functions/admin-data.ts +0 -606
  95. package/.framework/functions/ai-agents.ts +0 -323
  96. package/.framework/functions/api-keys.ts +0 -376
  97. package/.framework/functions/apps.ts +0 -483
  98. package/.framework/functions/auth.ts +0 -196
  99. package/.framework/functions/debug-auth.ts +0 -107
  100. package/.framework/functions/embeddings.ts +0 -556
  101. package/.framework/functions/integration-routes.ts +0 -523
  102. package/.framework/functions/integrations.ts +0 -319
  103. package/.framework/functions/item-progress.ts +0 -272
  104. package/.framework/functions/logs.ts +0 -438
  105. package/.framework/functions/observability.ts +0 -275
  106. package/.framework/functions/pipeline-executions.ts +0 -494
  107. package/.framework/functions/pipelines.ts +0 -485
  108. package/.framework/functions/prompt-configs.ts +0 -339
  109. package/.framework/functions/roles.ts +0 -387
  110. package/.framework/functions/system-cron.ts +0 -742
  111. package/.framework/functions/system.ts +0 -323
  112. package/.framework/functions/tests.ts +0 -119
  113. package/.framework/functions/timers.ts +0 -357
  114. package/.framework/functions/triggers.ts +0 -563
  115. package/.framework/functions/types.ts +0 -604
  116. package/.framework/index.html +0 -16
  117. package/.framework/migrations/000_foundation.sql +0 -1266
  118. package/.framework/migrations/001_seed.sql +0 -163
  119. package/.framework/migrations/002_seed_constraints.sql +0 -19
  120. package/.framework/migrations/003_auth_user_trigger.sql +0 -67
  121. package/.framework/src/App.tsx +0 -133
  122. package/.framework/src/apps/admin/index.tsx +0 -173
  123. package/.framework/src/components/AppWrapper.tsx +0 -56
  124. package/.framework/src/components/CustomAppLoader.tsx +0 -116
  125. package/.framework/src/components/admin/AdminListPage.tsx +0 -151
  126. package/.framework/src/components/admin/AdminSidebar.tsx +0 -166
  127. package/.framework/src/components/admin/AdminStatsCard.tsx +0 -62
  128. package/.framework/src/components/admin/SortableTableHeader.tsx +0 -42
  129. package/.framework/src/components/app-shell/GenericAppShell.tsx +0 -181
  130. package/.framework/src/components/app-shell/GenericDetailPage.tsx +0 -200
  131. package/.framework/src/components/app-shell/GenericListPage.tsx +0 -116
  132. package/.framework/src/components/app-sidebar.tsx +0 -228
  133. package/.framework/src/components/auth/ProtectedRoute.tsx +0 -88
  134. package/.framework/src/components/layout/AppShell.tsx +0 -91
  135. package/.framework/src/components/layout/Header.tsx +0 -88
  136. package/.framework/src/components/layout/Layout.tsx +0 -95
  137. package/.framework/src/components/layout/Sidebar.tsx +0 -329
  138. package/.framework/src/components/runtime/DataDetailHeader.tsx +0 -77
  139. package/.framework/src/components/runtime/DataDetailPage.tsx +0 -171
  140. package/.framework/src/components/runtime/DataFilters.tsx +0 -91
  141. package/.framework/src/components/runtime/DataHeader.tsx +0 -68
  142. package/.framework/src/components/runtime/DataListPage.tsx +0 -124
  143. package/.framework/src/components/runtime/DataStats.tsx +0 -70
  144. package/.framework/src/components/runtime/DataTable.tsx +0 -174
  145. package/.framework/src/components/runtime/SchemaDetailForm.tsx +0 -134
  146. package/.framework/src/components/runtime/index.ts +0 -18
  147. package/.framework/src/components/search-form.tsx +0 -29
  148. package/.framework/src/components/shared/AgentView.tsx +0 -213
  149. package/.framework/src/components/shared/FieldRenderer.tsx +0 -478
  150. package/.framework/src/components/shared/SchemaFields.tsx +0 -226
  151. package/.framework/src/components/ui/DataTable.tsx +0 -343
  152. package/.framework/src/components/ui/Form.tsx +0 -281
  153. package/.framework/src/components/ui/ItemCard.tsx +0 -296
  154. package/.framework/src/components/ui/ItemListView.tsx +0 -308
  155. package/.framework/src/components/ui/LoadingSpinner.tsx +0 -52
  156. package/.framework/src/components/ui/Modal.tsx +0 -61
  157. package/.framework/src/components/ui/RichTextEditor.tsx +0 -210
  158. package/.framework/src/components/ui/accordion.tsx +0 -82
  159. package/.framework/src/components/ui/alert-dialog.tsx +0 -197
  160. package/.framework/src/components/ui/alert.tsx +0 -76
  161. package/.framework/src/components/ui/aspect-ratio.tsx +0 -11
  162. package/.framework/src/components/ui/avatar.tsx +0 -110
  163. package/.framework/src/components/ui/badge.tsx +0 -49
  164. package/.framework/src/components/ui/breadcrumb.tsx +0 -122
  165. package/.framework/src/components/ui/button-group.tsx +0 -83
  166. package/.framework/src/components/ui/button.tsx +0 -65
  167. package/.framework/src/components/ui/calendar.tsx +0 -222
  168. package/.framework/src/components/ui/card.tsx +0 -100
  169. package/.framework/src/components/ui/carousel.tsx +0 -240
  170. package/.framework/src/components/ui/chart.tsx +0 -368
  171. package/.framework/src/components/ui/checkbox.tsx +0 -31
  172. package/.framework/src/components/ui/collapsible.tsx +0 -33
  173. package/.framework/src/components/ui/combobox.tsx +0 -299
  174. package/.framework/src/components/ui/command.tsx +0 -193
  175. package/.framework/src/components/ui/context-menu.tsx +0 -261
  176. package/.framework/src/components/ui/dialog.tsx +0 -165
  177. package/.framework/src/components/ui/direction.tsx +0 -6
  178. package/.framework/src/components/ui/drawer.tsx +0 -132
  179. package/.framework/src/components/ui/dropdown-menu.tsx +0 -269
  180. package/.framework/src/components/ui/empty.tsx +0 -104
  181. package/.framework/src/components/ui/field.tsx +0 -238
  182. package/.framework/src/components/ui/hover-card.tsx +0 -42
  183. package/.framework/src/components/ui/input-group.tsx +0 -153
  184. package/.framework/src/components/ui/input-otp.tsx +0 -87
  185. package/.framework/src/components/ui/input.tsx +0 -19
  186. package/.framework/src/components/ui/item.tsx +0 -196
  187. package/.framework/src/components/ui/kbd.tsx +0 -26
  188. package/.framework/src/components/ui/label.tsx +0 -22
  189. package/.framework/src/components/ui/menubar.tsx +0 -277
  190. package/.framework/src/components/ui/native-select.tsx +0 -61
  191. package/.framework/src/components/ui/navigation-menu.tsx +0 -164
  192. package/.framework/src/components/ui/pagination.tsx +0 -129
  193. package/.framework/src/components/ui/popover.tsx +0 -87
  194. package/.framework/src/components/ui/progress.tsx +0 -31
  195. package/.framework/src/components/ui/radio-group.tsx +0 -42
  196. package/.framework/src/components/ui/resizable.tsx +0 -50
  197. package/.framework/src/components/ui/scroll-area.tsx +0 -53
  198. package/.framework/src/components/ui/select.tsx +0 -195
  199. package/.framework/src/components/ui/separator.tsx +0 -26
  200. package/.framework/src/components/ui/sheet.tsx +0 -145
  201. package/.framework/src/components/ui/sidebar.tsx +0 -706
  202. package/.framework/src/components/ui/skeleton.tsx +0 -13
  203. package/.framework/src/components/ui/slider.tsx +0 -59
  204. package/.framework/src/components/ui/sonner.tsx +0 -47
  205. package/.framework/src/components/ui/spinner.tsx +0 -10
  206. package/.framework/src/components/ui/switch.tsx +0 -33
  207. package/.framework/src/components/ui/table-primitives.tsx +0 -141
  208. package/.framework/src/components/ui/table.tsx +0 -114
  209. package/.framework/src/components/ui/tabs.tsx +0 -90
  210. package/.framework/src/components/ui/textarea.tsx +0 -18
  211. package/.framework/src/components/ui/toggle-group.tsx +0 -89
  212. package/.framework/src/components/ui/toggle.tsx +0 -45
  213. package/.framework/src/components/ui/tooltip.tsx +0 -57
  214. package/.framework/src/contexts/AppContext.tsx +0 -133
  215. package/.framework/src/contexts/AuthContext.tsx +0 -371
  216. package/.framework/src/hooks/use-mobile.ts +0 -19
  217. package/.framework/src/hooks/useApi.ts +0 -526
  218. package/.framework/src/hooks/useApps.ts +0 -114
  219. package/.framework/src/hooks/useEntityList.ts +0 -190
  220. package/.framework/src/hooks/useEntityRecord.ts +0 -308
  221. package/.framework/src/hooks/useForm.ts +0 -307
  222. package/.framework/src/hooks/useListSchema.ts +0 -264
  223. package/.framework/src/hooks/useSchemaRecord.ts +0 -223
  224. package/.framework/src/index.css +0 -128
  225. package/.framework/src/lib/api.ts +0 -156
  226. package/.framework/src/lib/supabase.ts +0 -94
  227. package/.framework/src/lib/utils.ts +0 -317
  228. package/.framework/src/main.tsx +0 -27
  229. package/.framework/src/pages/DashboardPage.tsx +0 -181
  230. package/.framework/src/pages/NotFoundPage.tsx +0 -39
  231. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +0 -161
  232. package/.framework/src/pages/admin/AIAgentsPage.tsx +0 -318
  233. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +0 -199
  234. package/.framework/src/pages/admin/APIKeysPage.tsx +0 -303
  235. package/.framework/src/pages/admin/AlertsConfigPage.tsx +0 -523
  236. package/.framework/src/pages/admin/AppDetailPage.tsx +0 -493
  237. package/.framework/src/pages/admin/AppsPage.tsx +0 -355
  238. package/.framework/src/pages/admin/DesignedPage.tsx +0 -491
  239. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +0 -534
  240. package/.framework/src/pages/admin/EmbeddingsPage.tsx +0 -424
  241. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +0 -176
  242. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +0 -109
  243. package/.framework/src/pages/admin/IntegratedDashboard.tsx +0 -402
  244. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +0 -187
  245. package/.framework/src/pages/admin/IntegrationsPage.tsx +0 -301
  246. package/.framework/src/pages/admin/LogsPage.tsx +0 -283
  247. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +0 -85
  248. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +0 -470
  249. package/.framework/src/pages/admin/PipelineDetailPage.tsx +0 -183
  250. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +0 -279
  251. package/.framework/src/pages/admin/PipelinesPage.tsx +0 -390
  252. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +0 -299
  253. package/.framework/src/pages/admin/PromptConfigsPage.tsx +0 -292
  254. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +0 -434
  255. package/.framework/src/pages/admin/RoleDetailPage.tsx +0 -273
  256. package/.framework/src/pages/admin/RolesPage.tsx +0 -292
  257. package/.framework/src/pages/admin/SelectTestPage.tsx +0 -61
  258. package/.framework/src/pages/admin/ShadcnTestPage.tsx +0 -588
  259. package/.framework/src/pages/admin/SimpleDashboard.tsx +0 -387
  260. package/.framework/src/pages/admin/TestRunDetailPage.tsx +0 -172
  261. package/.framework/src/pages/admin/TestingDashboard.tsx +0 -257
  262. package/.framework/src/pages/admin/TimerDetailPage.tsx +0 -151
  263. package/.framework/src/pages/admin/TimersPage.tsx +0 -376
  264. package/.framework/src/pages/admin/TriggerDetailPage.tsx +0 -149
  265. package/.framework/src/pages/admin/TriggersPage.tsx +0 -381
  266. package/.framework/src/pages/admin/TypeDetailPage.tsx +0 -694
  267. package/.framework/src/pages/admin/TypesPage.tsx +0 -295
  268. package/.framework/src/pages/auth/LoginPage.tsx +0 -187
  269. package/.framework/src/pages/auth/RegisterPage.tsx +0 -163
  270. package/.framework/src/pages/spine-framework/APIPage.tsx +0 -17
  271. package/.framework/src/pages/spine-framework/CLIPage.tsx +0 -25
  272. package/.framework/src/types/auth.ts +0 -125
  273. package/.framework/src/types/types.ts +0 -407
  274. package/STRUCTURE.md +0 -150
  275. package/bin/spine-framework.cjs +0 -62
  276. package/bin/welcome.cjs +0 -45
  277. package/bin/ws-shim.cjs +0 -8
  278. package/bin/ws-shim.ts +0 -10
  279. package/config/components.json +0 -25
  280. package/config/deno.lock +0 -108
  281. package/config/package-lock.json +0 -17183
  282. package/config/postcss.config.cjs +0 -10
  283. package/config/tailwind.config.cjs +0 -78
  284. package/config/tsconfig.build.json +0 -32
  285. package/config/tsconfig.cli.json +0 -18
  286. package/config/tsconfig.json +0 -41
  287. package/config/tsconfig.node.json +0 -17
  288. package/config/tsconfig.node.tsbuildinfo +0 -1
  289. package/config/tsconfig.tsbuildinfo +0 -1
  290. package/config/typedoc.json +0 -16
  291. package/config/vite.config.d.ts +0 -2
  292. package/config/vite.config.ts +0 -71
  293. package/dist/cli/commands/agents.d.ts +0 -39
  294. package/dist/cli/commands/agents.d.ts.map +0 -1
  295. package/dist/cli/commands/auth.d.ts +0 -36
  296. package/dist/cli/commands/auth.d.ts.map +0 -1
  297. package/dist/cli/commands/create-app.d.ts +0 -23
  298. package/dist/cli/commands/create-app.d.ts.map +0 -1
  299. package/dist/cli/commands/dev.d.ts +0 -24
  300. package/dist/cli/commands/dev.d.ts.map +0 -1
  301. package/dist/cli/commands/doctor.d.ts +0 -42
  302. package/dist/cli/commands/doctor.d.ts.map +0 -1
  303. package/dist/cli/commands/generate.d.ts +0 -36
  304. package/dist/cli/commands/generate.d.ts.map +0 -1
  305. package/dist/cli/commands/init.d.ts +0 -20
  306. package/dist/cli/commands/init.d.ts.map +0 -1
  307. package/dist/cli/commands/install-app.d.ts +0 -30
  308. package/dist/cli/commands/install-app.d.ts.map +0 -1
  309. package/dist/cli/commands/items.d.ts +0 -45
  310. package/dist/cli/commands/items.d.ts.map +0 -1
  311. package/dist/cli/commands/migrate.d.ts +0 -21
  312. package/dist/cli/commands/migrate.d.ts.map +0 -1
  313. package/dist/cli/commands/migrations.d.ts +0 -41
  314. package/dist/cli/commands/migrations.d.ts.map +0 -1
  315. package/dist/cli/commands/pipelines.d.ts +0 -40
  316. package/dist/cli/commands/pipelines.d.ts.map +0 -1
  317. package/dist/cli/commands/status.d.ts +0 -23
  318. package/dist/cli/commands/status.d.ts.map +0 -1
  319. package/dist/cli/commands/system.d.ts +0 -29
  320. package/dist/cli/commands/system.d.ts.map +0 -1
  321. package/dist/cli/commands/test.d.ts +0 -46
  322. package/dist/cli/commands/test.d.ts.map +0 -1
  323. package/dist/cli/commands/uninstall-app.d.ts +0 -23
  324. package/dist/cli/commands/uninstall-app.d.ts.map +0 -1
  325. package/dist/cli/context.d.ts +0 -88
  326. package/dist/cli/context.d.ts.map +0 -1
  327. package/dist/cli/env-loader.d.ts +0 -14
  328. package/dist/cli/env-loader.d.ts.map +0 -1
  329. package/dist/cli/index.d.ts +0 -41
  330. package/dist/cli/index.d.ts.map +0 -1
  331. package/dist/functions/_shared/agent-runner.d.ts +0 -156
  332. package/dist/functions/_shared/agent-runner.d.ts.map +0 -1
  333. package/dist/functions/_shared/app-manifest.d.ts +0 -68
  334. package/dist/functions/_shared/app-manifest.d.ts.map +0 -1
  335. package/dist/functions/_shared/audit.d.ts +0 -91
  336. package/dist/functions/_shared/audit.d.ts.map +0 -1
  337. package/dist/functions/_shared/db.d.ts +0 -125
  338. package/dist/functions/_shared/db.d.ts.map +0 -1
  339. package/dist/functions/_shared/index.d.ts +0 -299
  340. package/dist/functions/_shared/index.d.ts.map +0 -1
  341. package/dist/functions/_shared/middleware.d.ts +0 -315
  342. package/dist/functions/_shared/middleware.d.ts.map +0 -1
  343. package/dist/functions/_shared/permissions.d.ts +0 -626
  344. package/dist/functions/_shared/permissions.d.ts.map +0 -1
  345. package/dist/functions/_shared/pipeline-runner.d.ts +0 -124
  346. package/dist/functions/_shared/pipeline-runner.d.ts.map +0 -1
  347. package/dist/functions/_shared/principal.d.ts +0 -284
  348. package/dist/functions/_shared/principal.d.ts.map +0 -1
  349. package/dist/functions/_shared/resolve-ids.d.ts +0 -10
  350. package/dist/functions/_shared/resolve-ids.d.ts.map +0 -1
  351. package/dist/functions/_shared/schema-utils.d.ts +0 -181
  352. package/dist/functions/_shared/schema-utils.d.ts.map +0 -1
  353. package/dist/functions/_shared/testing.d.ts +0 -172
  354. package/dist/functions/_shared/testing.d.ts.map +0 -1
  355. package/dist/functions/_shared/trigger-engine.d.ts +0 -140
  356. package/dist/functions/_shared/trigger-engine.d.ts.map +0 -1
  357. package/dist/functions/_shared/webhook-registration.d.ts +0 -81
  358. package/dist/functions/_shared/webhook-registration.d.ts.map +0 -1
  359. package/dist/functions/_shared/webhook-registry.d.ts +0 -57
  360. package/dist/functions/_shared/webhook-registry.d.ts.map +0 -1
  361. package/dist/functions/account-nodes.d.ts +0 -48
  362. package/dist/functions/account-nodes.d.ts.map +0 -1
  363. package/dist/functions/admin-data.d.ts +0 -178
  364. package/dist/functions/admin-data.d.ts.map +0 -1
  365. package/dist/functions/ai-agents.d.ts +0 -125
  366. package/dist/functions/ai-agents.d.ts.map +0 -1
  367. package/dist/functions/api-keys.d.ts +0 -140
  368. package/dist/functions/api-keys.d.ts.map +0 -1
  369. package/dist/functions/apps.d.ts +0 -163
  370. package/dist/functions/apps.d.ts.map +0 -1
  371. package/dist/functions/auth.d.ts +0 -74
  372. package/dist/functions/auth.d.ts.map +0 -1
  373. package/dist/functions/debug-auth.d.ts +0 -33
  374. package/dist/functions/debug-auth.d.ts.map +0 -1
  375. package/dist/functions/embeddings.d.ts +0 -205
  376. package/dist/functions/embeddings.d.ts.map +0 -1
  377. package/dist/functions/integration-routes.d.ts +0 -45
  378. package/dist/functions/integration-routes.d.ts.map +0 -1
  379. package/dist/functions/integrations.d.ts +0 -124
  380. package/dist/functions/integrations.d.ts.map +0 -1
  381. package/dist/functions/item-progress.d.ts +0 -41
  382. package/dist/functions/item-progress.d.ts.map +0 -1
  383. package/dist/functions/logs.d.ts +0 -162
  384. package/dist/functions/logs.d.ts.map +0 -1
  385. package/dist/functions/observability.d.ts +0 -123
  386. package/dist/functions/observability.d.ts.map +0 -1
  387. package/dist/functions/pipeline-executions.d.ts +0 -190
  388. package/dist/functions/pipeline-executions.d.ts.map +0 -1
  389. package/dist/functions/pipelines.d.ts +0 -171
  390. package/dist/functions/pipelines.d.ts.map +0 -1
  391. package/dist/functions/prompt-configs.d.ts +0 -125
  392. package/dist/functions/prompt-configs.d.ts.map +0 -1
  393. package/dist/functions/roles.d.ts +0 -118
  394. package/dist/functions/roles.d.ts.map +0 -1
  395. package/dist/functions/system-cron.d.ts +0 -65
  396. package/dist/functions/system-cron.d.ts.map +0 -1
  397. package/dist/functions/system.d.ts +0 -29
  398. package/dist/functions/system.d.ts.map +0 -1
  399. package/dist/functions/tests.d.ts +0 -28
  400. package/dist/functions/tests.d.ts.map +0 -1
  401. package/dist/functions/timers.d.ts +0 -139
  402. package/dist/functions/timers.d.ts.map +0 -1
  403. package/dist/functions/triggers.d.ts +0 -203
  404. package/dist/functions/triggers.d.ts.map +0 -1
  405. package/dist/functions/types.d.ts +0 -151
  406. package/dist/functions/types.d.ts.map +0 -1
  407. package/dist/src/types/types.d.ts +0 -364
  408. package/dist/src/types/types.d.ts.map +0 -1
  409. package/index.html +0 -13
  410. package/netlify.toml +0 -36
  411. package/package-project.json +0 -71
  412. package/scripts/app-install-cli.ts +0 -286
  413. package/scripts/assemble-frontend.sh +0 -76
  414. package/scripts/assemble-functions.sh +0 -62
  415. package/scripts/assemble.sh +0 -41
  416. package/scripts/boundary-check.sh +0 -106
  417. package/scripts/build-manifest.sh +0 -80
  418. package/scripts/check-core-integrity.sh +0 -82
  419. package/scripts/ingest-chunks.cjs +0 -202
  420. package/scripts/kb-chunk-parser.cjs +0 -312
  421. package/scripts/kb-chunk-parser.ts +0 -330
  422. package/scripts/load-test-app-install.ts +0 -484
  423. package/scripts/netlify-dev-wrapper.sh +0 -22
  424. package/scripts/verify-integrity.sh +0 -69
  425. package/vitest.config.ts +0 -45
@@ -1,323 +0,0 @@
1
- /**
2
- * @module ai-agents
3
- * @audience core-contributor
4
- * @layer api-handler
5
- * @stability stable
6
- *
7
- * CRUD API for the `ai_agents` table. AI agent records define the configuration
8
- * for agentic inference workloads: model settings, system prompts, available
9
- * tools, capabilities, and constraints. The runtime execution is handled by
10
- * `_shared/agent-runner.ts`.
11
- *
12
- * **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/ai-agents`
13
- *
14
- * **Actions (standard CRUD only):**
15
- * | method | condition | handler |
16
- * |--------|-----------|---------|
17
- * | GET | ?id | get |
18
- * | GET | (default) | list |
19
- * | POST | — | create |
20
- * | PATCH | — | update |
21
- * | DELETE | — | remove |
22
- *
23
- * **Authorization:** All operations use `ctx.db` (RLS-scoped). Authenticated
24
- * principal required for writes.
25
- *
26
- * INVARIANT: `remove` is a hard delete.
27
- * INVARIANT: `update` only patches allowed fields: name, description,
28
- * model_config, system_prompt, tools, capabilities, constraints, metadata,
29
- * is_active.
30
- *
31
- * @seeAlso agent-runner.ts (runAgent — runtime execution using these configs)
32
- * @seeAlso prompt-configs.ts (prompt_configs referenced by agent configs)
33
- * @seeAlso audit.ts (emitLog for ai_agent.* events)
34
- */
35
-
36
- import { createHandler } from './_shared/middleware'
37
- import { joins } from './_shared/db'
38
- import { emitLog } from './_shared/audit'
39
- import { PermissionEngine, sanitizeRecordData } from './_shared/permissions'
40
-
41
- const permissions = PermissionEngine as any
42
-
43
- // ─── HANDLERS ─────────────────────────────────────────────────────────────────
44
-
45
- // ─── CHUNK_START: AI_AGENTS_LIST ──────────────────────────────────────────────
46
- /**
47
- * @chunk-id AI_AGENTS_LIST_1_0_0
48
- * @version 1.0.0
49
- * @hash 237972d65e86f5d432f55b602ac5e6f2dcfaefa83c662c10b7d3437ac906ff0d
50
- * @macro AI Agents List Handler
51
- * @micro Lists AI agents with filtering and pagination
52
- * @inputs ctx: CoreContext — Request context with principal and database
53
- * @inputs _body: any — Request body (unused for GET)
54
- * @outputs Array of sanitized AI agent records
55
- * @depends-on [createHandler, joins, sanitizeRecordData]
56
- * @depended-by [Netlify function routing]
57
- * @side-effects [DB queries, permission sanitization]
58
- * @tags ai-agents, list, crud, pagination
59
- */
60
- export const list = createHandler(async (ctx, _body) => {
61
- const { agent_type, is_active, limit = 100, offset = 0 } = ctx.query || {}
62
-
63
- if (!ctx.accountId) {
64
- throw new Error('Account context required')
65
- }
66
-
67
- // RLS automatically filters to accessible accounts
68
- let query = ctx.db
69
- .from('ai_agents')
70
- .select(`*, ${joins.app}, ${joins.createdBy}`)
71
- .order('name')
72
-
73
- if (agent_type) {
74
- query = query.eq('agent_type', agent_type)
75
- }
76
- if (is_active !== undefined) {
77
- query = query.eq('is_active', is_active === 'true')
78
- }
79
-
80
- const { data, error: err } = await query.range(
81
- parseInt(offset.toString()),
82
- parseInt(offset.toString()) + parseInt(limit.toString()) - 1
83
- )
84
-
85
- if (err) throw err
86
-
87
- const sanitized = []
88
- for (const agent of data || []) {
89
- sanitized.push(await sanitizeRecordData(ctx, agent, 'ai_agent'))
90
- }
91
-
92
- return sanitized
93
- })
94
- // ─── CHUNK_END: AI_AGENTS_LIST ────────────────────────────────────────────────
95
-
96
- // ─── CHUNK_START: AI_AGENTS_GET ──────────────────────────────────────────────
97
- /**
98
- * @chunk-id AI_AGENTS_GET_1_0_0
99
- * @version 1.0.0
100
- * @hash 62f283668d9a90ff81e2cbf8c437298206b355d2dd96fb559b2848fc4ffbc5cd
101
- * @macro AI Agent Get Handler
102
- * @micro Returns a single AI agent by UUID with joins
103
- * @inputs ctx: CoreContext — Request context with principal and database
104
- * @inputs _body: any — Request body (unused for GET)
105
- * @outputs Sanitized AI agent record with app and createdBy joins
106
- * @depends-on [createHandler, joins, sanitizeRecordData]
107
- * @depended-by [Netlify function routing]
108
- * @side-effects [DB single row query, permission sanitization]
109
- * @tags ai-agents, get, crud, single-record
110
- */
111
- export const get = createHandler(async (ctx, _body) => {
112
- const { id } = ctx.query || {}
113
-
114
- if (!id) {
115
- throw new Error('Agent ID is required')
116
- }
117
-
118
- const { data, error: err } = await ctx.db
119
- .from('ai_agents')
120
- .select(`*, ${joins.app}, ${joins.createdBy}`)
121
- .eq('id', id)
122
- .single()
123
-
124
- if (err) throw err
125
-
126
- return await sanitizeRecordData(ctx, data, 'ai_agent')
127
- })
128
- // ─── CHUNK_END: AI_AGENTS_GET ────────────────────────────────────────────────
129
-
130
- // ─── CHUNK_START: AI_AGENTS_CREATE ──────────────────────────────────────────────
131
- /**
132
- * @chunk-id AI_AGENTS_CREATE_1_0_0
133
- * @version 1.0.0
134
- * @hash 355c8ceb1f33e033616480827141a2f33cde8e18fa4e9f9d94f4866af6fe66f6
135
- * @macro AI Agent Create Handler
136
- * @micro Creates new AI agent configuration with validation and audit logging
137
- * @inputs ctx: CoreContext — Request context with principal and database
138
- * @inputs body: object — Agent configuration data
139
- * @outputs Inserted AI agent record
140
- * @depends-on [createHandler, emitLog]
141
- * @depended-by [Netlify function routing]
142
- * @side-effects [DB insert, audit logging]
143
- * @tags ai-agents, create, crud, audit
144
- */
145
- export const create = createHandler(async (ctx, body) => {
146
- const { app_id, name, description, agent_type, model_config, system_prompt, tools, capabilities, constraints, metadata } = body
147
-
148
- if (!name || !agent_type) {
149
- throw new Error('name and agent_type are required')
150
- }
151
-
152
- if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
153
- throw new Error('User context (person and account) required')
154
- }
155
-
156
- const { data, error: err } = await ctx.db
157
- .from('ai_agents')
158
- .insert({
159
- app_id: app_id || null,
160
- account_id: ctx.accountId,
161
- name,
162
- description: description || null,
163
- agent_type,
164
- model_config: model_config || {},
165
- system_prompt: system_prompt || null,
166
- tools: tools || [],
167
- capabilities: capabilities || [],
168
- constraints: constraints || {},
169
- metadata: metadata || {},
170
- created_by: ctx.principal.id
171
- })
172
- .select()
173
- .single()
174
-
175
- if (err) throw err
176
-
177
- await emitLog(ctx, 'ai_agent.created',
178
- { type: 'ai_agent', id: data.id },
179
- { after: { name, agent_type } }
180
- )
181
-
182
- return data
183
- })
184
- // ─── CHUNK_END: AI_AGENTS_CREATE ────────────────────────────────────────────────
185
-
186
- // ─── CHUNK_START: AI_AGENTS_UPDATE ──────────────────────────────────────────────
187
- /**
188
- * @chunk-id AI_AGENTS_UPDATE_1_0_0
189
- * @version 1.0.0
190
- * @hash 07e173626958a0ef032cc4c80719c49df5990756e08ecdb70a4168ab73544f10
191
- * @macro AI Agent Update Handler
192
- * @micro Updates AI agent with field validation and audit logging
193
- * @inputs ctx: CoreContext — Request context with principal and database
194
- * @inputs body: object — Agent updates including id
195
- * @outputs Updated AI agent record
196
- * @depends-on [createHandler, emitLog]
197
- * @depended-by [Netlify function routing]
198
- * @side-effects [DB update, audit logging]
199
- * @tags ai-agents, update, crud, audit
200
- */
201
- export const update = createHandler(async (ctx, body) => {
202
- const id = body?.id || ctx.query?.id
203
- const { id: _bodyId, ...updates } = body || {}
204
-
205
- if (!id) {
206
- throw new Error('Agent ID is required')
207
- }
208
-
209
- if (!ctx.principal || ctx.principal.id === 'anonymous' || !ctx.accountId) {
210
- throw new Error('User context (person and account) required')
211
- }
212
-
213
- const allowed = ['name', 'description', 'model_config', 'system_prompt', 'tools', 'capabilities', 'constraints', 'metadata', 'is_active']
214
- const updateData: Record<string, any> = { updated_at: new Date().toISOString() }
215
- for (const key of allowed) {
216
- if (updates[key] !== undefined) updateData[key] = updates[key]
217
- }
218
-
219
- const { data, error: err } = await ctx.db
220
- .from('ai_agents')
221
- .update(updateData)
222
- .eq('id', id)
223
- .select()
224
- .single()
225
-
226
- if (err) throw err
227
-
228
- await emitLog(ctx, 'ai_agent.updated',
229
- { type: 'ai_agent', id },
230
- { after: updateData }
231
- )
232
-
233
- return data
234
- })
235
- // ─── CHUNK_END: AI_AGENTS_UPDATE ────────────────────────────────────────────────
236
-
237
- // ─── CHUNK_START: AI_AGENTS_REMOVE ──────────────────────────────────────────────
238
- /**
239
- * @chunk-id AI_AGENTS_REMOVE_1_0_0
240
- * @version 1.0.0
241
- * @hash 7d990350b55b85945cc2148908618d6cd1dad27d1fc8343eab6966bedd9d84fa
242
- * @macro AI Agent Remove Handler
243
- * @micro Hard-deletes AI agent with validation and audit logging
244
- * @inputs ctx: CoreContext — Request context with principal and database
245
- * @inputs _body: any — Request body (unused for DELETE)
246
- * @outputs {success: true} — Success confirmation
247
- * @depends-on [createHandler, emitLog]
248
- * @depended-by [Netlify function routing]
249
- * @side-effects [DB delete, audit logging]
250
- * @tags ai-agents, remove, crud, audit
251
- */
252
- export const remove = createHandler(async (ctx, _body) => {
253
- const id = ctx.query?.id
254
-
255
- if (!id) {
256
- throw new Error('Agent ID is required')
257
- }
258
-
259
- const { data: current } = await ctx.db
260
- .from('ai_agents')
261
- .select('id, name')
262
- .eq('id', id)
263
- .single()
264
-
265
- if (!current) throw new Error('Agent not found')
266
-
267
- const { error: err } = await ctx.db
268
- .from('ai_agents')
269
- .delete()
270
- .eq('id', id)
271
-
272
- if (err) throw err
273
-
274
- await emitLog(ctx, 'ai_agent.deleted',
275
- { type: 'ai_agent', id },
276
- { before: current }
277
- )
278
-
279
- return { success: true }
280
- })
281
- // ─── CHUNK_END: AI_AGENTS_REMOVE ────────────────────────────────────────────────
282
-
283
- // ─── MAIN HANDLER ────────────────────────────────────────────────────────────
284
-
285
- // ─── CHUNK_START: AI_AGENTS_HANDLER ──────────────────────────────────────────────
286
- /**
287
- * @chunk-id AI_AGENTS_HANDLER_1_0_0
288
- * @version 1.0.0
289
- * @hash a49f4917dd07295e0ba9815bf929cccc5cffcbe4dcf6852aa4bd84d6cba1b690
290
- * @macro AI Agents Router
291
- * @micro Routes HTTP methods to appropriate CRUD handlers
292
- * @inputs ctx: CoreContext — Request context with principal and database
293
- * @inputs body: any — Request body for POST/PATCH operations
294
- * @outputs Varies — Depends on routed handler (list/get/create/update/remove)
295
- * @depends-on [createHandler, list, get, create, update, remove]
296
- * @depended-by [Netlify function routing]
297
- * @side-effects [Delegates to appropriate handler]
298
- * @tags ai-agents, router, crud, netlify-function
299
- */
300
- export const handler = createHandler(async (ctx, body) => {
301
- const { action } = ctx.query || {}
302
- const method = ctx.query?.method || 'GET'
303
-
304
- switch (action) {
305
- default:
306
- if (method === 'GET') {
307
- if (ctx.query?.id) {
308
- return await get(ctx, body)
309
- } else {
310
- return await list(ctx, body)
311
- }
312
- } else if (method === 'POST') {
313
- return await create(ctx, body)
314
- } else if (method === 'PATCH') {
315
- return await update(ctx, body)
316
- } else if (method === 'DELETE') {
317
- return await remove(ctx, body)
318
- }
319
- }
320
-
321
- throw new Error('Invalid action or method')
322
- })
323
- // ─── CHUNK_END: AI_AGENTS_HANDLER ────────────────────────────────────────────────
@@ -1,376 +0,0 @@
1
- /**
2
- * @module api-keys
3
- * @audience core-contributor
4
- * @layer api-handler
5
- * @stability stable
6
- *
7
- * Management and validation API for the `api_keys` table. API keys are
8
- * issued per-integration and optionally scoped to specific permissions.
9
- * Key material is generated and stored by the `create_api_key` Postgres
10
- * RPC, which handles hashing internally. Validation also delegates to the
11
- * `validate_api_key` RPC.
12
- *
13
- * **Routed by:** `GET/POST /.netlify/functions/api-keys`
14
- *
15
- * **Actions:**
16
- * | method | ?action | handler |
17
- * |--------|------------|---------------|
18
- * | POST | validate | validate |
19
- * | POST | revoke | revoke |
20
- * | GET | usage-logs | listUsageLogs |
21
- * | GET | ?id | get |
22
- * | GET | (default) | list |
23
- * | POST | — | create |
24
- *
25
- * **Authorization:** All operations use `ctx.db` (RLS-scoped). Account context
26
- * required for creates. No PATCH/DELETE — use `revoke` for deactivation.
27
- *
28
- * INVARIANT: Raw key material is never stored. Only the hash is persisted.
29
- * `create` returns the plaintext key once via RPC response.
30
- * INVARIANT: `revoke` soft-deactivates by setting `is_active = false`.
31
- *
32
- * @seeAlso integrations.ts (integration_id FK on api_keys)
33
- * @seeAlso audit.ts (emitLog for api_key.* events)
34
- */
35
-
36
- import { createHandler } from './_shared/middleware'
37
- import { emitLog } from './_shared/audit'
38
- import { sanitizeRecordData } from './_shared/permissions'
39
-
40
- // ─── HANDLERS ─────────────────────────────────────────────────────────────────
41
-
42
- // ─── CHUNK_START: API_KEYS_LIST ──────────────────────────────────────────────
43
- /**
44
- * @chunk-id API_KEYS_LIST_1_0_0
45
- * @version 1.0.0
46
- * @hash f825d8f4bbabe21071b61fe41e5e4e1b87482d501bf4078fab70906b7a5f5e78
47
- * @macro API Keys List Handler
48
- * @micro Lists API keys with filtering, pagination, and joins
49
- * @inputs ctx: CoreContext — Request context with principal and database
50
- * @inputs _body: any — Request body (unused for GET)
51
- * @outputs Array of sanitized API key records with integration joins
52
- * @depends-on [createHandler, sanitizeRecordData]
53
- * @depended-by [Netlify function routing]
54
- * @side-effects [DB queries, permission sanitization]
55
- * @tags api-keys, list, crud, pagination
56
- */
57
- export const list = createHandler(async (ctx, _body) => {
58
- const { integration_id, key_type, is_active, expires_before, expires_after, limit = 100, offset = 0 } = ctx.query || {}
59
-
60
- if (!ctx.accountId) {
61
- throw new Error('Account context required')
62
- }
63
-
64
- let query = ctx.db
65
- .from('api_keys')
66
- .select(`
67
- *,
68
- integration:integrations(id, name, provider, integration_type),
69
- created_by_person:people(id, full_name, email)
70
- `)
71
- .order('created_at', { ascending: false })
72
-
73
- if (integration_id) {
74
- query = query.eq('integration_id', integration_id)
75
- }
76
- if (key_type) {
77
- query = query.eq('key_type', key_type)
78
- }
79
- if (is_active !== undefined) {
80
- query = query.eq('is_active', is_active === 'true')
81
- }
82
- if (expires_before) {
83
- query = query.lte('expires_at', expires_before)
84
- }
85
- if (expires_after) {
86
- query = query.gte('expires_at', expires_after)
87
- }
88
-
89
- const { data, error: err } = await query.range(
90
- parseInt(offset.toString()),
91
- parseInt(offset.toString()) + parseInt(limit.toString()) - 1
92
- )
93
-
94
- if (err) throw err
95
-
96
- const sanitized = []
97
- for (const key of data || []) {
98
- sanitized.push(await sanitizeRecordData(ctx, key, 'api_key'))
99
- }
100
-
101
- return sanitized
102
- })
103
- // ─── CHUNK_END: API_KEYS_LIST ────────────────────────────────────────────────
104
-
105
- // ─── CHUNK_START: API_KEYS_GET ──────────────────────────────────────────────
106
- /**
107
- * @chunk-id API_KEYS_GET_1_0_0
108
- * @version 1.0.0
109
- * @hash 357f926aeb833ad0ca755e48350534771f491890645134a1b43d2f2a8e4be037
110
- * @macro API Key Get Handler
111
- * @micro Returns a single API key record with joins (no raw key material)
112
- * @inputs ctx: CoreContext — Request context with principal and database
113
- * @inputs _body: any — Request body (unused for GET)
114
- * @outputs Sanitized API key record with integration and createdBy joins
115
- * @depends-on [createHandler, sanitizeRecordData]
116
- * @depended-by [Netlify function routing]
117
- * @side-effects [DB single row query, permission sanitization]
118
- * @tags api-keys, get, crud, single-record
119
- */
120
- export const get = createHandler(async (ctx, _body) => {
121
- const { id } = ctx.query || {}
122
-
123
- if (!id) {
124
- throw new Error('API key ID is required')
125
- }
126
-
127
- const { data, error: err } = await ctx.db
128
- .from('api_keys')
129
- .select(`
130
- *,
131
- integration:integrations(id, name, provider, integration_type),
132
- created_by_person:people(id, full_name, email)
133
- `)
134
- .eq('id', id)
135
- .single()
136
-
137
- if (err) throw err
138
-
139
- return await sanitizeRecordData(ctx, data, 'api_key')
140
- })
141
- // ─── CHUNK_END: API_KEYS_GET ────────────────────────────────────────────────
142
-
143
- // ─── CHUNK_START: API_KEYS_CREATE ──────────────────────────────────────────────
144
- /**
145
- * @chunk-id API_KEYS_CREATE_1_0_0
146
- * @version 1.0.0
147
- * @hash 8d00c97111cddebc2b3821a1fee3e6cf4c6b7c55fc20cd19d70865d728c3387c
148
- * @macro API Key Create Handler
149
- * @micro Creates new API key via RPC with validation and audit logging
150
- * @inputs ctx: CoreContext — Request context with principal and database
151
- * @inputs body: object — API key configuration data
152
- * @outputs RPC result containing api_key_id and plaintext key_value
153
- * @depends-on [createHandler, emitLog]
154
- * @depended-by [Netlify function routing]
155
- * @side-effects [RPC call, audit logging]
156
- * @tags api-keys, create, crud, rpc, audit
157
- */
158
- export const create = createHandler(async (ctx, body) => {
159
- const { integration_id, name, key_type, key_prefix, permissions, rate_limit, expires_at, metadata } = body
160
-
161
- if (!name) {
162
- throw new Error('name is required')
163
- }
164
-
165
- if (!ctx.accountId) {
166
- throw new Error('Account context required')
167
- }
168
-
169
- const { data, error: err } = await ctx.db
170
- .rpc('create_api_key', {
171
- integration_id,
172
- name,
173
- key_type: key_type || 'private',
174
- key_prefix: key_prefix || 'sk_',
175
- permissions: permissions || {},
176
- rate_limit: rate_limit || 1000,
177
- expires_at,
178
- metadata: metadata || {},
179
- created_by: ctx.principal?.id,
180
- account_id: ctx.accountId
181
- })
182
-
183
- if (err) throw err
184
-
185
- await emitLog(ctx, 'api_key.created',
186
- { type: 'api_key', id: data[0]?.api_key_id },
187
- { after: { name, key_type, rate_limit } }
188
- )
189
-
190
- return data
191
- })
192
- // ─── CHUNK_END: API_KEYS_CREATE ────────────────────────────────────────────────
193
-
194
- // ─── CHUNK_START: API_KEYS_VALIDATE ──────────────────────────────────────────────
195
- /**
196
- * @chunk-id API_KEYS_VALIDATE_1_0_0
197
- * @version 1.0.0
198
- * @hash 05791f9b2c23bfebed01dffaa1430e896b89d311c5a51409704d731200eb621a
199
- * @macro API Key Validation Handler
200
- * @micro Validates API key and checks permissions via RPC
201
- * @inputs ctx: CoreContext — Request context with principal and database
202
- * @inputs body: object — key_value and optional required_permissions
203
- * @outputs RPC validation result with is_valid, account_id, permissions
204
- * @depends-on [createHandler]
205
- * @depended-by [Netlify function routing, middleware]
206
- * @side-effects [RPC validation call]
207
- * @tags api-keys, validate, rpc, authentication
208
- */
209
- export const validate = createHandler(async (ctx, body) => {
210
- const { key_value, required_permissions } = body
211
-
212
- if (!key_value) {
213
- throw new Error('key_value is required')
214
- }
215
-
216
- const { data, error: err } = await ctx.db
217
- .rpc('validate_api_key', {
218
- key_value,
219
- required_permissions: required_permissions || {}
220
- })
221
-
222
- if (err) throw err
223
-
224
- return data
225
- })
226
- // ─── CHUNK_END: API_KEYS_VALIDATE ────────────────────────────────────────────────
227
-
228
- // ─── CHUNK_START: API_KEYS_REVOKE ──────────────────────────────────────────────
229
- /**
230
- * @chunk-id API_KEYS_REVOKE_1_0_0
231
- * @version 1.0.0
232
- * @hash 3302286a12c1315616470fcfbd3cbdc8dcf63dd00211a71159f3325bab95607a
233
- * @macro API Key Revoke Handler
234
- * @micro Soft-deactivates API key with validation and audit logging
235
- * @inputs ctx: CoreContext — Request context with principal and database
236
- * @inputs body: object — API key ID to revoke
237
- * @outputs Updated API key record with is_active: false
238
- * @depends-on [createHandler, emitLog]
239
- * @depended-by [Netlify function routing]
240
- * @side-effects [DB update, audit logging]
241
- * @tags api-keys, revoke, crud, audit
242
- */
243
- export const revoke = createHandler(async (ctx, body) => {
244
- const { id } = body
245
-
246
- if (!id) {
247
- throw new Error('API key ID is required')
248
- }
249
-
250
- const { data, error: err } = await ctx.db
251
- .from('api_keys')
252
- .update({ is_active: false, updated_at: new Date().toISOString() })
253
- .eq('id', id)
254
- .select()
255
- .single()
256
-
257
- if (err) throw err
258
-
259
- await emitLog(ctx, 'api_key.revoked',
260
- { type: 'api_key', id },
261
- { after: { revoked_by: ctx.principal?.id } }
262
- )
263
-
264
- return data
265
- })
266
- // ─── CHUNK_END: API_KEYS_REVOKE ────────────────────────────────────────────────
267
-
268
- // ─── CHUNK_START: API_KEYS_LIST_USAGE_LOGS ──────────────────────────────────────────────
269
- /**
270
- * @chunk-id API_KEYS_LIST_USAGE_LOGS_1_0_0
271
- * @version 1.0.0
272
- * @hash f21e004490dd983c8f20dc1d1f4db33e158334d19e38a4ace5e99389a8a96ded
273
- * @macro API Key Usage Logs Handler
274
- * @micro Lists paginated API key usage logs with filtering and joins
275
- * @inputs ctx: CoreContext — Request context with principal and database
276
- * @inputs _body: any — Request body (unused for GET)
277
- * @outputs Array of usage log records with api_key joins
278
- * @depends-on [createHandler]
279
- * @depended-by [Netlify function routing]
280
- * @side-effects [DB queries with filtering]
281
- * @tags api-keys, usage-logs, pagination, monitoring
282
- */
283
- export const listUsageLogs = createHandler(async (ctx, _body) => {
284
- const { api_key_id, response_status, success, date_from, date_to, limit = 100, offset = 0 } = ctx.query || {}
285
-
286
- if (!ctx.accountId) {
287
- throw new Error('Account context required')
288
- }
289
-
290
- let query = ctx.db
291
- .from('api_key_usage_logs')
292
- .select(`
293
- *,
294
- api_key:api_keys(id, name, key_type)
295
- `)
296
- .order('created_at', { ascending: false })
297
-
298
- if (api_key_id) {
299
- query = query.eq('api_key_id', api_key_id)
300
- }
301
- if (response_status) {
302
- query = query.eq('response_status', parseInt(response_status.toString()))
303
- }
304
- if (success !== undefined) {
305
- query = query.eq('success', success === 'true')
306
- }
307
- if (date_from) {
308
- query = query.gte('created_at', date_from)
309
- }
310
- if (date_to) {
311
- query = query.lte('created_at', date_to)
312
- }
313
-
314
- const { data, error: err } = await query.range(
315
- parseInt(offset.toString()),
316
- parseInt(offset.toString()) + parseInt(limit.toString()) - 1
317
- )
318
-
319
- if (err) throw err
320
-
321
- return data
322
- })
323
- // ─── CHUNK_END: API_KEYS_LIST_USAGE_LOGS ────────────────────────────────────────────────
324
-
325
- // ─── MAIN HANDLER ────────────────────────────────────────────────────────────
326
-
327
- // ─── CHUNK_START: API_KEYS_HANDLER ──────────────────────────────────────────────
328
- /**
329
- * @chunk-id API_KEYS_HANDLER_1_0_0
330
- * @version 1.0.0
331
- * @hash 6c2da419bea6f12b0fe654e2aad6c5ebac3d5993c2547a47d239f44197d90a68
332
- * @macro API Keys Router
333
- * @micro Routes HTTP methods and actions to appropriate handlers
334
- * @inputs ctx: CoreContext — Request context with principal and database
335
- * @inputs body: any — Request body for POST operations
336
- * @outputs Varies — Depends on routed handler (list/get/create/validate/revoke/usage-logs)
337
- * @depends-on [createHandler, list, get, create, validate, revoke, listUsageLogs]
338
- * @depended-by [Netlify function routing]
339
- * @side-effects [Delegates to appropriate handler]
340
- * @tags api-keys, router, crud, netlify-function
341
- */
342
- export const handler = createHandler(async (ctx, body) => {
343
- const { action } = ctx.query || {}
344
- const method = ctx.query?.method || 'GET'
345
-
346
- switch (action) {
347
- case 'validate':
348
- if (method === 'POST') {
349
- return await validate(ctx, body)
350
- }
351
- break
352
- case 'revoke':
353
- if (method === 'POST') {
354
- return await revoke(ctx, body)
355
- }
356
- break
357
- case 'usage-logs':
358
- if (method === 'GET') {
359
- return await listUsageLogs(ctx, body)
360
- }
361
- break
362
- default:
363
- if (method === 'GET') {
364
- if (ctx.query?.id) {
365
- return await get(ctx, body)
366
- } else {
367
- return await list(ctx, body)
368
- }
369
- } else if (method === 'POST') {
370
- return await create(ctx, body)
371
- }
372
- }
373
-
374
- throw new Error('Invalid action or method')
375
- })
376
- // ─── CHUNK_END: API_KEYS_HANDLER ────────────────────────────────────────────────