spine-framework 0.3.124 → 0.3.126

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 (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,59 +1,69 @@
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
- */
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ // CIL[BEGIN chunk_id="api-keys_moduleheader_1783969696" type="module_header" identity="imports" parent="none"]
31
+ // CIL[DOC-MACRO purpose="Import dependencies for API keys module"]
32
+ // CIL[DOC-RESPONSIBILITY responsibility="Import middleware, audit, and permissions utilities"]
33
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
34
+ // CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
35
+ // CIL[DOC-MICRO logic_summary="Imports required dependencies for API key management functions" notable_decisions="[]"]
36
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
37
+ // CIL[DOC-STABILITY stability="stable"]
38
+ // CIL[DOC-AUDIENCE audience="developer"]
39
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
40
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
41
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
42
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
43
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
44
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
35
45
 
36
46
  import { createHandler } from './_shared/middleware'
47
+ import { adminDb } from './_shared/db'
37
48
  import { emitLog } from './_shared/audit'
49
+ import { isSystemAdmin } from './_shared/principal'
38
50
  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
- */
51
+ import { hashApiKey } from './_shared/hash-api-key'
52
+ // CIL[END chunk_id="api-keys_moduleheader_1783969696"]
53
+ // CIL[BEGIN chunk_id="api-keys_list_1783969696" type="function" identity="list" parent="none"]
54
+ // CIL[DOC-MACRO purpose="List API keys with filtering"]
55
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve and filter API keys by various criteria"]
56
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
57
+ // CIL[DOC-CONTRACT inputs="none" outputs="sanitized_api_keys" errors="auth_errors,db_errors" side_effects="none"]
58
+ // CIL[DOC-MICRO logic_summary="Query API keys with filters, sanitize data, return paginated results" notable_decisions="[]"]
59
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
60
+ // CIL[DOC-STABILITY stability="stable"]
61
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 3. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
62
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 3. Total affected: 3."]
63
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
64
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
65
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
66
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
57
67
  export const list = createHandler(async (ctx, _body) => {
58
68
  const { integration_id, key_type, is_active, expires_before, expires_after, limit = 100, offset = 0 } = ctx.query || {}
59
69
 
@@ -61,13 +71,11 @@ export const list = createHandler(async (ctx, _body) => {
61
71
  throw new Error('Account context required')
62
72
  }
63
73
 
64
- let query = ctx.db
74
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
75
+
76
+ let query = db
65
77
  .from('api_keys')
66
- .select(`
67
- *,
68
- integration:integrations(id, name, provider, integration_type),
69
- created_by_person:people(id, full_name, email)
70
- `)
78
+ .select('*')
71
79
  .order('created_at', { ascending: false })
72
80
 
73
81
  if (integration_id) {
@@ -100,23 +108,21 @@ export const list = createHandler(async (ctx, _body) => {
100
108
 
101
109
  return sanitized
102
110
  })
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
- */
111
+ // CIL[END chunk_id="api-keys_list_1783969696"]
112
+ // CIL[BEGIN chunk_id="api-keys_get_1783969696" type="function" identity="get" parent="none"]
113
+ // CIL[DOC-MACRO purpose="Get single API key by ID"]
114
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve individual API key record with related data"]
115
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
116
+ // CIL[DOC-CONTRACT inputs="none" outputs="sanitized_api_key" errors="not_found,db_errors" side_effects="none"]
117
+ // CIL[DOC-MICRO logic_summary="Query API key by ID with integration and creator details, sanitize" notable_decisions="[]"]
118
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
119
+ // CIL[DOC-STABILITY stability="stable"]
120
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
121
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
122
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
123
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
124
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
125
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
120
126
  export const get = createHandler(async (ctx, _body) => {
121
127
  const { id } = ctx.query || {}
122
128
 
@@ -124,13 +130,11 @@ export const get = createHandler(async (ctx, _body) => {
124
130
  throw new Error('API key ID is required')
125
131
  }
126
132
 
127
- const { data, error: err } = await ctx.db
133
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
134
+
135
+ const { data, error: err } = await db
128
136
  .from('api_keys')
129
- .select(`
130
- *,
131
- integration:integrations(id, name, provider, integration_type),
132
- created_by_person:people(id, full_name, email)
133
- `)
137
+ .select('*')
134
138
  .eq('id', id)
135
139
  .single()
136
140
 
@@ -138,25 +142,35 @@ export const get = createHandler(async (ctx, _body) => {
138
142
 
139
143
  return await sanitizeRecordData(ctx, data, 'api_key')
140
144
  })
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
- */
145
+ // CIL[END chunk_id="api-keys_get_1783969696"]
146
+ // CIL[BEGIN chunk_id="api-keys_create_1783969696" type="function" identity="create" parent="none"]
147
+ // CIL[DOC-MACRO purpose="Create new API key with validation"]
148
+ // CIL[DOC-RESPONSIBILITY responsibility="Generate API key with permissions and audit logging"]
149
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
150
+ // CIL[DOC-CONTRACT inputs="none" outputs="created_api_key" errors="validation_errors,db_errors" side_effects="db_write,audit_log"]
151
+ // CIL[DOC-MICRO logic_summary="Call stored procedure to create key, log creation event" notable_decisions="[]"]
152
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
153
+ // CIL[DOC-STABILITY stability="stable"]
154
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 4. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
155
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 4. Total affected: 5."]
156
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
157
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
158
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
159
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
158
160
  export const create = createHandler(async (ctx, body) => {
159
- const { integration_id, name, key_type, key_prefix, permissions, rate_limit, expires_at, metadata } = body
161
+ const {
162
+ integration_id,
163
+ app_id,
164
+ name,
165
+ key_type,
166
+ permissions,
167
+ scopes,
168
+ rate_limit,
169
+ expires_at,
170
+ metadata,
171
+ machine_type,
172
+ is_internal
173
+ } = body
160
174
 
161
175
  if (!name) {
162
176
  throw new Error('name is required')
@@ -166,46 +180,65 @@ export const create = createHandler(async (ctx, body) => {
166
180
  throw new Error('Account context required')
167
181
  }
168
182
 
183
+ const slug = body.slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
184
+
185
+ const rawKey = `sk_${crypto.randomUUID().replace(/-/g, '')}`
186
+ const { key_prefix, key_hash } = hashApiKey(rawKey)
187
+
188
+ const insertData = {
189
+ integration_id: integration_id || null,
190
+ app_id: app_id || ctx.appId || null,
191
+ account_id: ctx.accountId,
192
+ slug,
193
+ name,
194
+ key_prefix,
195
+ key_hash,
196
+ key_type: key_type || 'inbound',
197
+ permissions: permissions || [],
198
+ scopes: scopes || [],
199
+ rate_limit: rate_limit || 100,
200
+ expires_at: expires_at || null,
201
+ metadata: metadata || {},
202
+ machine_type: machine_type || 'integration',
203
+ is_internal: is_internal || false,
204
+ is_active: true,
205
+ created_by: ctx.principal?.id || null
206
+ }
207
+
169
208
  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
- })
209
+ .from('api_keys')
210
+ .insert(insertData)
211
+ .select('id, name, key_type, rate_limit, expires_at, is_active, created_at')
212
+ .single()
182
213
 
183
214
  if (err) throw err
184
215
 
185
- await emitLog(ctx, 'api_key.created',
186
- { type: 'api_key', id: data[0]?.api_key_id },
187
- { after: { name, key_type, rate_limit } }
216
+ await emitLog(ctx, 'api_key.created',
217
+ { type: 'api_key', id: data.id },
218
+ { after: { name, key_type, rate_limit, integration_id } }
188
219
  )
189
220
 
190
- return data
221
+ return {
222
+ ...data,
223
+ raw_key: rawKey,
224
+ warning: 'Store this key now. It will not be shown again.'
225
+ }
191
226
  })
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
- */
227
+ // CIL[END chunk_id="api-keys_create_1783969696"]
228
+ // CIL[BEGIN chunk_id="api-keys_validate_1783969696" type="function" identity="validate" parent="none"]
229
+ // CIL[DOC-MACRO purpose="Validate API key and permissions"]
230
+ // CIL[DOC-RESPONSIBILITY responsibility="Check API key validity and required permissions"]
231
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
232
+ // CIL[DOC-CONTRACT inputs="none" outputs="validation_result" errors="validation_errors,db_errors" side_effects="none"]
233
+ // CIL[DOC-MICRO logic_summary="Call stored procedure to validate key against permissions" notable_decisions="[]"]
234
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
235
+ // CIL[DOC-STABILITY stability="stable"]
236
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/principal.ts, .framework/src/components/ui/dialog.tsx, \."]
237
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
238
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
239
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
240
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
241
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
209
242
  export const validate = createHandler(async (ctx, body) => {
210
243
  const { key_value, required_permissions } = body
211
244
 
@@ -213,33 +246,64 @@ export const validate = createHandler(async (ctx, body) => {
213
246
  throw new Error('key_value is required')
214
247
  }
215
248
 
216
- const { data, error: err } = await ctx.db
217
- .rpc('validate_api_key', {
218
- key_value,
219
- required_permissions: required_permissions || {}
220
- })
249
+ const keyPrefix = key_value.slice(0, 8)
250
+
251
+ const { data: rows, error: err } = await ctx.db
252
+ .from('api_keys')
253
+ .select('*')
254
+ .eq('key_prefix', keyPrefix)
255
+ .eq('is_active', true)
256
+ .or('expires_at.is.null,expires_at.gte.now()')
221
257
 
222
258
  if (err) throw err
259
+ if (!rows || rows.length === 0) {
260
+ return { is_valid: false, error: 'Invalid or inactive API key' }
261
+ }
223
262
 
224
- return data
263
+ const { verifyApiKey } = await import('./_shared/hash-api-key')
264
+
265
+ for (const key of rows) {
266
+ if (verifyApiKey(key_value, key.key_hash)) {
267
+ const hasPermissions = !required_permissions || required_permissions.length === 0 ||
268
+ (key.permissions || []).some((p: string) => required_permissions.includes(p))
269
+
270
+ if (!hasPermissions) {
271
+ return {
272
+ is_valid: false,
273
+ error: 'Insufficient permissions',
274
+ api_key_id: key.id
275
+ }
276
+ }
277
+
278
+ return {
279
+ is_valid: true,
280
+ api_key_id: key.id,
281
+ integration_id: key.integration_id,
282
+ app_id: key.app_id,
283
+ account_id: key.account_id,
284
+ scopes: key.scopes,
285
+ permissions: key.permissions
286
+ }
287
+ }
288
+ }
289
+
290
+ return { is_valid: false, error: 'Invalid or inactive API key' }
225
291
  })
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
- */
292
+ // CIL[END chunk_id="api-keys_validate_1783969696"]
293
+ // CIL[BEGIN chunk_id="api-keys_revoke_1783969696" type="function" identity="revoke" parent="none"]
294
+ // CIL[DOC-MACRO purpose="Revoke API key by deactivating"]
295
+ // CIL[DOC-RESPONSIBILITY responsibility="Deactivate API key with audit logging"]
296
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
297
+ // CIL[DOC-CONTRACT inputs="none" outputs="revoked_api_key" errors="not_found,db_errors" side_effects="db_write,audit_log"]
298
+ // CIL[DOC-MICRO logic_summary="Set is_active=false, log revocation event" notable_decisions="[]"]
299
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
300
+ // CIL[DOC-STABILITY stability="stable"]
301
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
302
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
303
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
304
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
305
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
306
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
243
307
  export const revoke = createHandler(async (ctx, body) => {
244
308
  const { id } = body
245
309
 
@@ -263,23 +327,21 @@ export const revoke = createHandler(async (ctx, body) => {
263
327
 
264
328
  return data
265
329
  })
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
- */
330
+ // CIL[END chunk_id="api-keys_revoke_1783969696"]
331
+ // CIL[BEGIN chunk_id="api-keys_listusagelogs_1783969696" type="function" identity="listUsageLogs" parent="none"]
332
+ // CIL[DOC-MACRO purpose="List API key usage logs"]
333
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve API key usage history with filtering"]
334
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
335
+ // CIL[DOC-CONTRACT inputs="none" outputs="usage_logs" errors="auth_errors,db_errors" side_effects="none"]
336
+ // CIL[DOC-MICRO logic_summary="Query usage logs with filters, return paginated results" notable_decisions="[]"]
337
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
338
+ // CIL[DOC-STABILITY stability="stable"]
339
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
340
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
341
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
342
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
343
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
344
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
283
345
  export const listUsageLogs = createHandler(async (ctx, _body) => {
284
346
  const { api_key_id, response_status, success, date_from, date_to, limit = 100, offset = 0 } = ctx.query || {}
285
347
 
@@ -320,25 +382,21 @@ export const listUsageLogs = createHandler(async (ctx, _body) => {
320
382
 
321
383
  return data
322
384
  })
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
- */
385
+ // CIL[END chunk_id="api-keys_listusagelogs_1783969696"]
386
+ // CIL[BEGIN chunk_id="api-keys_handler_1783969696" type="function" identity="handler" parent="none"]
387
+ // CIL[DOC-MACRO purpose="Route API key HTTP methods"]
388
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch requests to API key operations"]
389
+ // CIL[DOC-CONTEXT module="api-keys" layer="backend_functions" related_files="[]"]
390
+ // CIL[DOC-CONTRACT inputs="none" outputs="function_responses" errors="method_errors" side_effects="none"]
391
+ // CIL[DOC-MICRO logic_summary="Route based on action and method to specific API key functions" notable_decisions="[]"]
392
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
393
+ // CIL[DOC-STABILITY stability="stable"]
394
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
395
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
396
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
397
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
398
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
399
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
342
400
  export const handler = createHandler(async (ctx, body) => {
343
401
  const { action } = ctx.query || {}
344
402
  const method = ctx.query?.method || 'GET'
@@ -373,4 +431,4 @@ export const handler = createHandler(async (ctx, body) => {
373
431
 
374
432
  throw new Error('Invalid action or method')
375
433
  })
376
- // ─── CHUNK_END: API_KEYS_HANDLER ────────────────────────────────────────────────
434
+ // CIL[END chunk_id="api-keys_handler_1783969696"]