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,55 @@
1
- /**
2
- * @module integrations
3
- * @audience core-contributor
4
- * @layer api-handler
5
- * @stability stable
6
- *
7
- * CRUD API for the `integrations` table. Integration records describe
8
- * third-party service connections (API credentials, provider, version,
9
- * configuration). Each integration is scoped to an account and optionally
10
- * to an app. `is_configured` tracks whether credentials have been set.
11
- *
12
- * **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/integrations`
13
- *
14
- * **Standard CRUD — routes directly by HTTP method (no ?action switch):**
15
- * | method | condition | handler |
16
- * |--------|-----------|---------|
17
- * | GET | ?id | get |
18
- * | GET | (default) | list |
19
- * | POST | — | create |
20
- * | PATCH | — | update |
21
- * | DELETE | — | remove (soft) |
22
- *
23
- * **Authorization:** All operations use `ctx.db` (RLS-scoped). Authenticated
24
- * principal required for writes.
25
- *
26
- * INVARIANT: `remove` is a soft delete (sets `is_active = false`). Hard deletes
27
- * are not supported to preserve audit trails on integration-linked data.
28
- * INVARIANT: `update` only patches the explicit allowlist of fields.
29
- *
30
- * @seeAlso api-keys.ts (api_keys belong to integrations)
31
- * @seeAlso trigger-engine.ts (integration webhooks trigger pipelines)
32
- * @seeAlso audit.ts (emitLog for integration.* events)
33
- */
34
1
 
2
+
3
+
4
+
5
+
6
+
7
+ // CIL[BEGIN chunk_id="integrations_moduleheader_1783968140" type="module_header" identity="imports" parent="none"]
8
+ // CIL[DOC-MACRO purpose="Import dependencies for integration CRUD API"]
9
+ // CIL[DOC-RESPONSIBILITY responsibility="Import handler utilities and database access"]
10
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
11
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="Import failures" side_effects="none"]
12
+ // CIL[DOC-MICRO logic_summary="Imports createHandler, joins, emitLog, sanitizeRecordData" notable_decisions="[]"]
13
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
14
+ // CIL[DOC-STABILITY stability="stable"]
15
+ // CIL[DOC-AUDIENCE audience="developer"]
16
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
17
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
18
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
19
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
20
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
35
22
  import { createHandler } from './_shared/middleware'
36
23
  import { joins } from './_shared/db'
37
24
  import { emitLog } from './_shared/audit'
38
25
  import { sanitizeRecordData } from './_shared/permissions'
39
26
 
40
- // ─── HANDLERS ─────────────────────────────────────────────────────────────────
41
-
42
- // ─── CHUNK_START: INTEGRATIONS_LIST ──────────────────────────────────────────────
43
- /**
44
- * @chunk-id INTEGRATIONS_LIST_1_0_0
45
- * @version 1.0.0
46
- * @hash 5faf0b7052d9aac5f764d1fc30ddde1485a0296ad2b209cd2e3a73c09061a1fc
47
- * @macro Integrations List Handler
48
- * @micro Lists integrations 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 integration records with app/createdBy joins
52
- * @depends-on [createHandler, joins, sanitizeRecordData]
53
- * @depended-by [Netlify function routing]
54
- * @side-effects [DB queries, permission sanitization]
55
- * @tags integrations, list, crud, pagination
56
- */
27
+ function deriveSlug(name: string, slug?: string): string {
28
+ return slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
29
+ }
30
+
31
+ function computeIsConfigured(credentials: Record<string, any> | undefined): boolean {
32
+ if (!credentials || Object.keys(credentials).length === 0) return false
33
+ return Object.values(credentials).every((entry: any) => {
34
+ if (!entry || !entry.source) return false
35
+ return typeof entry.value === 'string' && entry.value.length > 0
36
+ })
37
+ }
38
+ // CIL[END chunk_id="integrations_moduleheader_1783968140"]
39
+ // CIL[BEGIN chunk_id="integrations_list_1783968140" type="function" identity="list" parent="none"]
40
+ // CIL[DOC-MACRO purpose="List integrations with filtering and permission sanitization"]
41
+ // CIL[DOC-RESPONSIBILITY responsibility="Query and return sanitized integration records"]
42
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
43
+ // CIL[DOC-CONTRACT inputs="none" outputs="Array of sanitized integration records" errors="Account context required, DB errors" side_effects="DB read operations"]
44
+ // CIL[DOC-MICRO logic_summary="Builds filtered query with joins, sanitizes each result before returning" notable_decisions="[]"]
45
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
46
+ // CIL[DOC-STABILITY stability="stable"]
47
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
48
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
49
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
50
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
51
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
52
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
57
53
  export const list = createHandler(async (ctx, _body) => {
58
54
  const { integration_type, provider, is_active, is_configured, limit = 100, offset = 0 } = ctx.query || {}
59
55
 
@@ -93,23 +89,21 @@ export const list = createHandler(async (ctx, _body) => {
93
89
 
94
90
  return sanitized
95
91
  })
96
- // ─── CHUNK_END: INTEGRATIONS_LIST ────────────────────────────────────────────────
97
-
98
- // ─── CHUNK_START: INTEGRATIONS_GET ──────────────────────────────────────────────
99
- /**
100
- * @chunk-id INTEGRATIONS_GET_1_0_0
101
- * @version 1.0.0
102
- * @hash 975126629cff24c75d2b74328d1ae08dd033ed451d3820d828c62b1f7a27413e
103
- * @macro Integration Get Handler
104
- * @micro Returns single integration record with joins and sanitization
105
- * @inputs ctx: CoreContext — Request context with principal and database
106
- * @inputs _body: any — Request body (unused for GET)
107
- * @outputs Sanitized integration record with app/createdBy joins
108
- * @depends-on [createHandler, joins, sanitizeRecordData]
109
- * @depended-by [Netlify function routing]
110
- * @side-effects [DB single row query, permission sanitization]
111
- * @tags integrations, get, crud, single-record
112
- */
92
+ // CIL[END chunk_id="integrations_list_1783968140"]
93
+ // CIL[BEGIN chunk_id="integrations_get_1783968140" type="function" identity="get" parent="none"]
94
+ // CIL[DOC-MACRO purpose="Get single integration record with joins and sanitization"]
95
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve and sanitize individual integration"]
96
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
97
+ // CIL[DOC-CONTRACT inputs="none" outputs="Sanitized integration record" errors="Integration ID required, not found, DB errors" side_effects="DB read operation"]
98
+ // CIL[DOC-MICRO logic_summary="Queries by ID with joins, sanitizes result before returning" notable_decisions="[]"]
99
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
100
+ // CIL[DOC-STABILITY stability="stable"]
101
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
102
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
103
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
104
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
105
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
106
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
113
107
  export const get = createHandler(async (ctx, _body) => {
114
108
  const { id } = ctx.query || {}
115
109
 
@@ -127,23 +121,21 @@ export const get = createHandler(async (ctx, _body) => {
127
121
 
128
122
  return await sanitizeRecordData(ctx, data, 'integration')
129
123
  })
130
- // ─── CHUNK_END: INTEGRATIONS_GET ────────────────────────────────────────────────
131
-
132
- // ─── CHUNK_START: INTEGRATIONS_CREATE ──────────────────────────────────────────────
133
- /**
134
- * @chunk-id INTEGRATIONS_CREATE_1_0_0
135
- * @version 1.0.0
136
- * @hash 27d2242703930d7eeb33b49bbce4c22681ab891750c4c7a298c1c717a39870d7
137
- * @macro Integration Create Handler
138
- * @micro Creates integration record with validation and audit logging
139
- * @inputs ctx: CoreContext — Request context with principal and database
140
- * @inputs body: object — Integration data including name, integration_type, provider
141
- * @outputs Inserted integration record
142
- * @depends-on [createHandler, emitLog]
143
- * @depended-by [Netlify function routing]
144
- * @side-effects [DB insert, audit logging]
145
- * @tags integrations, create, crud, audit
146
- */
124
+ // CIL[END chunk_id="integrations_get_1783968140"]
125
+ // CIL[BEGIN chunk_id="integrations_create_1783968140" type="function" identity="create" parent="none"]
126
+ // CIL[DOC-MACRO purpose="Create new integration record with validation and audit logging"]
127
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert new integration with proper metadata"]
128
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
129
+ // CIL[DOC-CONTRACT inputs="none" outputs="Created integration record" errors="Required fields missing, auth required, DB errors" side_effects="DB insert, audit logging"]
130
+ // CIL[DOC-MICRO logic_summary="Validates required fields, creates integration record, logs creation" notable_decisions="[]"]
131
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
132
+ // CIL[DOC-STABILITY stability="stable"]
133
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
134
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
135
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
136
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
137
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
138
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
147
139
  export const create = createHandler(async (ctx, body) => {
148
140
  const { app_id, name, description, integration_type, provider, version, config, credentials, metadata } = body
149
141
 
@@ -155,19 +147,23 @@ export const create = createHandler(async (ctx, body) => {
155
147
  throw new Error('User context (person and account) required')
156
148
  }
157
149
 
150
+ const safeCredentials = credentials || {}
151
+
158
152
  const { data, error: err } = await ctx.db
159
153
  .from('integrations')
160
154
  .insert({
161
155
  app_id: app_id || null,
162
156
  account_id: ctx.accountId,
157
+ slug: deriveSlug(name, body.slug),
163
158
  name,
164
159
  description: description || null,
165
160
  integration_type,
166
161
  provider,
167
162
  version: version || '1.0.0',
168
163
  config: config || {},
169
- credentials: credentials || {},
164
+ credentials: safeCredentials,
170
165
  metadata: metadata || {},
166
+ is_configured: computeIsConfigured(safeCredentials),
171
167
  created_by: ctx.principal.id
172
168
  })
173
169
  .select()
@@ -182,23 +178,21 @@ export const create = createHandler(async (ctx, body) => {
182
178
 
183
179
  return data
184
180
  })
185
- // ─── CHUNK_END: INTEGRATIONS_CREATE ────────────────────────────────────────────────
186
-
187
- // ─── CHUNK_START: INTEGRATIONS_UPDATE ──────────────────────────────────────────────
188
- /**
189
- * @chunk-id INTEGRATIONS_UPDATE_1_0_0
190
- * @version 1.0.0
191
- * @hash ab5c8404ddec24ff912c55e7e52cd0ecdd220646b0e07f56a49a02ef3288f3e9
192
- * @macro Integration Update Handler
193
- * @micro Updates integration with field allowlist and audit logging
194
- * @inputs ctx: CoreContext — Request context with principal and database
195
- * @inputs body: object — Integration updates including id
196
- * @outputs Updated integration record
197
- * @depends-on [createHandler, emitLog]
198
- * @depended-by [Netlify function routing]
199
- * @side-effects [DB update, audit logging]
200
- * @tags integrations, update, crud, audit
201
- */
181
+ // CIL[END chunk_id="integrations_create_1783968140"]
182
+ // CIL[BEGIN chunk_id="integrations_update_1783968140" type="function" identity="update" parent="none"]
183
+ // CIL[DOC-MACRO purpose="Update integration with field allowlist and audit logging"]
184
+ // CIL[DOC-RESPONSIBILITY responsibility="Modify integration records safely"]
185
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/db.ts\"]"]
186
+ // CIL[DOC-CONTRACT inputs="none" outputs="Updated integration record" errors="Integration ID required, DB errors" side_effects="DB update, audit logging"]
187
+ // CIL[DOC-MICRO logic_summary="Updates only allowed fields, logs changes, returns updated record" notable_decisions="[]"]
188
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
189
+ // CIL[DOC-STABILITY stability="stable"]
190
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/db.ts."]
191
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
192
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
193
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
194
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
195
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
202
196
  export const update = createHandler(async (ctx, body) => {
203
197
  const id = body?.id || ctx.query?.id
204
198
  const { id: _bodyId, ...updates } = body || {}
@@ -207,12 +201,16 @@ export const update = createHandler(async (ctx, body) => {
207
201
  throw new Error('Integration ID is required')
208
202
  }
209
203
 
210
- const allowed = ['name', 'description', 'integration_type', 'provider', 'version', 'config', 'credentials', 'metadata', 'is_active', 'is_configured']
204
+ const allowed = ['name', 'slug', 'description', 'integration_type', 'provider', 'version', 'config', 'credentials', 'metadata', 'is_active']
211
205
  const updateData: Record<string, any> = { updated_at: new Date().toISOString() }
212
206
  for (const key of allowed) {
213
207
  if (updates[key] !== undefined) updateData[key] = updates[key]
214
208
  }
215
209
 
210
+ if (updateData.credentials !== undefined) {
211
+ updateData.is_configured = computeIsConfigured(updateData.credentials)
212
+ }
213
+
216
214
  const { data, error: err } = await ctx.db
217
215
  .from('integrations')
218
216
  .update(updateData)
@@ -229,23 +227,21 @@ export const update = createHandler(async (ctx, body) => {
229
227
 
230
228
  return data
231
229
  })
232
- // ─── CHUNK_END: INTEGRATIONS_UPDATE ────────────────────────────────────────────────
233
-
234
- // ─── CHUNK_START: INTEGRATIONS_REMOVE ──────────────────────────────────────────────
235
- /**
236
- * @chunk-id INTEGRATIONS_REMOVE_1_0_0
237
- * @version 1.0.0
238
- * @hash a8b5f084d745d2ce69a1e29d74903832ed39647ccb779d0f651a99157777a08a
239
- * @macro Integration Remove Handler
240
- * @micro Soft-deletes integration with validation and audit logging
241
- * @inputs ctx: CoreContext — Request context with principal and database
242
- * @inputs _body: any — Request body (unused for DELETE)
243
- * @outputs Updated integration record with is_active: false
244
- * @depends-on [createHandler, emitLog]
245
- * @depended-by [Netlify function routing]
246
- * @side-effects [DB soft delete, audit logging]
247
- * @tags integrations, remove, crud, audit
248
- */
230
+ // CIL[END chunk_id="integrations_update_1783968140"]
231
+ // CIL[BEGIN chunk_id="integrations_remove_1783968140" type="function" identity="remove" parent="none"]
232
+ // CIL[DOC-MACRO purpose="Soft-delete integration by setting is_active to false"]
233
+ // CIL[DOC-RESPONSIBILITY responsibility="Deactivate integration records while preserving audit trail"]
234
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[]"]
235
+ // CIL[DOC-CONTRACT inputs="none" outputs="Updated integration record" errors="Integration ID required, not found, DB errors" side_effects="DB soft delete, audit logging"]
236
+ // CIL[DOC-MICRO logic_summary="Sets is_active false, logs deletion, preserves record for audit" notable_decisions="[]"]
237
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
238
+ // CIL[DOC-STABILITY stability="stable"]
239
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
240
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
241
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
242
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
243
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
244
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
249
245
  export const remove = createHandler(async (ctx, _body) => {
250
246
  const id = ctx.query?.id
251
247
 
@@ -277,25 +273,21 @@ export const remove = createHandler(async (ctx, _body) => {
277
273
 
278
274
  return data
279
275
  })
280
- // ─── CHUNK_END: INTEGRATIONS_REMOVE ────────────────────────────────────────────────
281
-
282
- // ─── MAIN HANDLER ────────────────────────────────────────────────────────────
283
-
284
- // ─── CHUNK_START: INTEGRATIONS_HANDLER ──────────────────────────────────────────────
285
- /**
286
- * @chunk-id INTEGRATIONS_HANDLER_1_0_0
287
- * @version 1.0.0
288
- * @hash 14c00f276a22287ed65c019efe327cbb513f860a408191e299864b05c641833c
289
- * @macro Integrations Router
290
- * @micro Routes HTTP methods to appropriate handlers (no action switch)
291
- * @inputs ctx: CoreContext — Request context with principal and database
292
- * @inputs body: any — Request body for POST/PATCH operations
293
- * @outputs Varies — Depends on routed handler (list/get/create/update/remove)
294
- * @depends-on [createHandler, list, get, create, update, remove]
295
- * @depended-by [Netlify function routing]
296
- * @side-effects [Delegates to appropriate handler]
297
- * @tags integrations, router, crud, netlify-function
298
- */
276
+ // CIL[END chunk_id="integrations_remove_1783968140"]
277
+ // CIL[BEGIN chunk_id="integrations_handler_1783968140" type="function" identity="handler" parent="none"]
278
+ // CIL[DOC-MACRO purpose="Route HTTP methods to appropriate integration handlers"]
279
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch CRUD requests to correct handler functions"]
280
+ // CIL[DOC-CONTEXT module="integrations" layer="api-handler" related_files="[]"]
281
+ // CIL[DOC-CONTRACT inputs="none" outputs="Varies by method" errors="Unsupported method" side_effects="Delegates to handlers"]
282
+ // CIL[DOC-MICRO logic_summary="Switch statement routes GET/POST/PATCH/DELETE to appropriate handlers" notable_decisions="[]"]
283
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
284
+ // CIL[DOC-STABILITY stability="stable"]
285
+ // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
286
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
287
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
288
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
289
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
290
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
299
291
  export const handler = createHandler(async (ctx, body) => {
300
292
  const method = ctx.query?.method || 'GET'
301
293
 
@@ -316,4 +308,4 @@ export const handler = createHandler(async (ctx, body) => {
316
308
  throw new Error(`Unsupported method: ${method}`)
317
309
  }
318
310
  })
319
- // ─── CHUNK_END: INTEGRATIONS_HANDLER ────────────────────────────────────────────────
311
+ // CIL[END chunk_id="integrations_handler_1783968140"]