spine-framework 0.4.3 → 0.5.0-rc.4

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 (320) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/agent-runner.ts +1000 -81
  15. package/.framework/functions/_shared/cil.ts +2 -1
  16. package/.framework/functions/_shared/db.ts +3 -6
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/kb.ts +61 -7
  19. package/.framework/functions/_shared/logging.ts +562 -224
  20. package/.framework/functions/_shared/message-sequence.ts +53 -0
  21. package/.framework/functions/_shared/middleware.ts +47 -44
  22. package/.framework/functions/_shared/pipeline-runner.ts +150 -37
  23. package/.framework/functions/_shared/principal.ts +9 -6
  24. package/.framework/functions/_shared/trigger-engine.ts +149 -40
  25. package/.framework/functions/admin-data.ts +48 -31
  26. package/.framework/functions/ai-agents.ts +103 -33
  27. package/.framework/functions/api-keys.ts +301 -122
  28. package/.framework/functions/apps.ts +43 -26
  29. package/.framework/functions/cil-ingest.ts +48 -15
  30. package/.framework/functions/debug-auth.ts +14 -8
  31. package/.framework/functions/deliveries.ts +39 -12
  32. package/.framework/functions/embeddings.ts +145 -76
  33. package/.framework/functions/integration-outbound.ts +67 -27
  34. package/.framework/functions/integrations.ts +254 -127
  35. package/.framework/functions/logs.ts +273 -133
  36. package/.framework/functions/observability.ts +277 -147
  37. package/.framework/functions/pipeline-executions.ts +1 -1
  38. package/.framework/functions/pipeline-runner-background.ts +120 -0
  39. package/.framework/functions/pipelines.ts +14 -9
  40. package/.framework/functions/prompt-configs.ts +7 -4
  41. package/.framework/functions/roles.ts +8 -5
  42. package/.framework/functions/security.ts +30 -17
  43. package/.framework/functions/system-cron.ts +250 -128
  44. package/.framework/functions/tests.ts +7 -6
  45. package/.framework/functions/timers.ts +310 -107
  46. package/.framework/functions/trigger-scheduler.ts +65 -5
  47. package/.framework/functions/triggers.ts +28 -13
  48. package/.framework/functions/types.ts +13 -10
  49. package/.framework/migrations/064_episode_leases.sql +196 -0
  50. package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
  51. package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
  52. package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
  53. package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
  54. package/.framework/migrations/069_log_stats_window.sql +54 -0
  55. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  56. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  57. package/.framework/migrations/072_slug_autofill.sql +77 -0
  58. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  59. package/.framework/schemas/spine.config.schema.json +62 -0
  60. package/.framework/src/App.tsx +3 -1
  61. package/.framework/src/apps/admin/index.tsx +1141 -775
  62. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  63. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  64. package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
  65. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  66. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  67. package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
  68. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  69. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  70. package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
  71. package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
  72. package/.framework/src/components/layout/Layout.tsx +4 -2
  73. package/.framework/src/components/layout/Sidebar.tsx +304 -179
  74. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  75. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  76. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  77. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  78. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  79. package/.framework/src/components/ui/sheet.tsx +24 -26
  80. package/.framework/src/components/ui/textarea.tsx +74 -48
  81. package/.framework/src/hooks/useBranding.ts +47 -0
  82. package/.framework/src/hooks/useEntityList.ts +12 -9
  83. package/.framework/src/hooks/useListSchema.ts +108 -58
  84. package/.framework/src/instructions/README.md +57 -0
  85. package/.framework/src/instructions/ai-agents.md +69 -0
  86. package/.framework/src/instructions/alerts.md +80 -0
  87. package/.framework/src/instructions/api-keys.md +87 -0
  88. package/.framework/src/instructions/apps.md +77 -0
  89. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  90. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  91. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  92. package/.framework/src/instructions/concepts/automation.md +186 -0
  93. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  94. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  95. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  96. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  97. package/.framework/src/instructions/concepts/observability.md +116 -0
  98. package/.framework/src/instructions/concepts/permissions.md +150 -0
  99. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  100. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  101. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  102. package/.framework/src/instructions/deliveries.md +59 -0
  103. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  104. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  105. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  106. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  107. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  108. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  109. package/.framework/src/instructions/integrations.md +96 -0
  110. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  111. package/.framework/src/instructions/invites.md +60 -0
  112. package/.framework/src/instructions/kb.md +80 -0
  113. package/.framework/src/instructions/logs.md +77 -0
  114. package/.framework/src/instructions/observability.md +61 -0
  115. package/.framework/src/instructions/operations/deployment.md +115 -0
  116. package/.framework/src/instructions/operations/migrations.md +125 -0
  117. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  118. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  119. package/.framework/src/instructions/operations/upgrade.md +116 -0
  120. package/.framework/src/instructions/pipeline-executions.md +62 -0
  121. package/.framework/src/instructions/pipelines.md +78 -0
  122. package/.framework/src/instructions/prompts.md +95 -0
  123. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  124. package/.framework/src/instructions/reference/api/auth.md +113 -0
  125. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  126. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  127. package/.framework/src/instructions/reference/cli.md +124 -0
  128. package/.framework/src/instructions/reference/database.md +132 -0
  129. package/.framework/src/instructions/reference/design-schema.md +280 -0
  130. package/.framework/src/instructions/reference/env-vars.md +133 -0
  131. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  132. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  133. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  134. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  135. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  136. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  137. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  138. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  139. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  140. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  141. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  142. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  143. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  144. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  145. package/.framework/src/instructions/reference/functions/index.md +103 -0
  146. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  147. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  148. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  149. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  150. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  151. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  152. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  153. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  154. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  155. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  156. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  157. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  158. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  159. package/.framework/src/instructions/reference/functions/security.md +140 -0
  160. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  161. package/.framework/src/instructions/reference/functions/system.md +106 -0
  162. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  163. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  164. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  165. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  166. package/.framework/src/instructions/reference/functions/types.md +146 -0
  167. package/.framework/src/instructions/reference/seeds.md +126 -0
  168. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  169. package/.framework/src/instructions/reference/spine-config.md +114 -0
  170. package/.framework/src/instructions/roles.md +80 -0
  171. package/.framework/src/instructions/runtime-detail.md +70 -0
  172. package/.framework/src/instructions/runtime-list.md +77 -0
  173. package/.framework/src/instructions/security.md +67 -0
  174. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  175. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  176. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  177. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  178. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  179. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  180. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  181. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  182. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  183. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  184. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  185. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  186. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  187. package/.framework/src/instructions/testing.md +59 -0
  188. package/.framework/src/instructions/timers.md +82 -0
  189. package/.framework/src/instructions/triggers.md +69 -0
  190. package/.framework/src/instructions/types.md +93 -0
  191. package/.framework/src/lib/branding.ts +128 -0
  192. package/.framework/src/pages/NoAppPage.tsx +3 -1
  193. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  194. package/.framework/src/pages/SetupPage.tsx +5 -2
  195. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  196. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  197. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  198. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  199. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  200. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  201. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  202. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  203. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  204. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  205. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  206. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  207. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  208. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  209. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  210. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  211. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  212. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  213. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  214. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  215. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  216. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  217. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  218. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  219. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  220. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  221. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  222. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  223. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  224. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  225. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  226. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  227. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  228. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  229. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  230. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  231. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  232. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  233. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  234. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  235. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  236. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  237. package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
  238. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
  239. package/.framework/src/pages/auth/LoginPage.tsx +4 -2
  240. package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
  241. package/.framework/templates/agent/AGENTS.md +150 -0
  242. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  243. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  244. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  245. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  246. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  247. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  248. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  249. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  250. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  251. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  252. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  253. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  254. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  255. package/.framework/templates/project.json +5 -1
  256. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  257. package/.framework/tests/unit/agent-files.test.ts +355 -0
  258. package/.framework/tests/unit/agent-runner.test.ts +496 -47
  259. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  260. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  261. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  262. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  263. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  264. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  265. package/.framework/tests/unit/episode-lease.test.ts +695 -0
  266. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  267. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  268. package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
  269. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  270. package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
  271. package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
  272. package/.framework/tests/unit/principal-cache.test.ts +15 -0
  273. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  274. package/.framework/tests/unit/system-cron.test.ts +240 -0
  275. package/.framework/tests/unit/timers.test.ts +159 -0
  276. package/.framework/tests/unit/trigger-engine.test.ts +278 -91
  277. package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
  278. package/README.md +125 -166
  279. package/config/tsconfig.cli.json +2 -2
  280. package/netlify.toml +5 -0
  281. package/package.json +15 -4
  282. package/templates/project/package-lock.json +2 -2
  283. package/.framework/docs/admin-routes.md +0 -76
  284. package/.framework/docs/api-docs-progress.md +0 -38
  285. package/.framework/docs/api-governance.md +0 -146
  286. package/.framework/docs/api-testing-results.md +0 -212
  287. package/.framework/docs/assembly-launch-guide.md +0 -138
  288. package/.framework/docs/audit-results.md +0 -590
  289. package/.framework/docs/db-api-inventory.md +0 -95
  290. package/.framework/docs/gap-remediation-backlog.md +0 -103
  291. package/.framework/docs/ui-adoption-verification.md +0 -111
  292. package/.framework/docs/ui-api-coverage.md +0 -84
  293. package/.framework/docs/v2-compatibility-audit.md +0 -228
  294. package/.framework/mcp/index.ts +0 -133
  295. package/.framework/mcp/load-env.ts +0 -60
  296. package/.framework/mcp/shared/app-manifest.ts +0 -275
  297. package/.framework/mcp/shared/db.ts +0 -477
  298. package/.framework/mcp/shared/kb.ts +0 -118
  299. package/.framework/mcp/tools/architect.ts +0 -431
  300. package/.framework/mcp/tools/cil/context.ts +0 -345
  301. package/.framework/mcp/tools/cil/graph.ts +0 -242
  302. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  303. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  304. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  305. package/.framework/mcp/tools/cil/project.ts +0 -791
  306. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  307. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  308. package/.framework/mcp/tools/cil/search.ts +0 -97
  309. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  310. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  311. package/.framework/mcp/tools/kb/delete.ts +0 -139
  312. package/.framework/mcp/tools/kb/index.ts +0 -52
  313. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  314. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  315. package/.framework/mcp/tools/kb/publish.ts +0 -100
  316. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  317. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  318. package/.framework/mcp/tools/kb/search.ts +0 -101
  319. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  320. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,52 +1,94 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/integrations.ts"]
2
- // CIL[DOC-MACRO purpose="Integration handler module that exports CRUD handlers and helpers for the integrations table"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Provide create, read, update, and delete handlers plus slug derivation and credential validation helpers for integration records"]
4
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts"]
5
- // CIL[DOC-CONTRACT inputs="HTTP request context and method" outputs="Routed integration data responses" errors="Throws on missing context, invalid input, or database errors" side_effects="Reads and writes integrations table and emits audit logs"]
6
- // CIL[DOC-MICRO logic_summary="Imports shared middleware, database joins, audit, and permissions helpers then defines slug derivation, credential configuration check, list, get, create, update, remove, and a top-level method router" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="engineers maintaining integration handlers and related admin-data endpoints"]
2
+ /**
3
+ * @module integrations
4
+ * @audience both
5
+ * @layer shared-core
6
+ * @stability stable
7
+ *
8
+ * This module provides integration functions for handling various operations within the application. It serves as a middleware layer that processes requests, ensuring proper authentication and data sanitization before interacting with the database. INVARIANT: All requests must be authenticated as a system admin to access sensitive operations.
9
+ *
10
+ * @seeAlso middleware.ts (provides request handling capabilities).
11
+ * @seeAlso db.ts (contains database interaction functions).
12
+ * @seeAlso audits.ts (handles logging of operations).
13
+ * @seeAlso permissions.ts (ensures data access control).
14
+ *
15
+ * @cil-generated
16
+ */
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
10
26
 
11
27
  import { createHandler } from './_shared/middleware'
12
- import { joins } from './_shared/db'
28
+ import { joins, adminDb } from './_shared/db'
13
29
  import { emitLog } from './_shared/audit'
14
30
  import { sanitizeRecordData } from './_shared/permissions'
15
- // CIL[DOC-VECTOR type="context" content="purpose='Integration handler module that exports CRUD handlers and helpers for the integrations table'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
16
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
17
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
18
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
19
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
31
+ import { isSystemAdmin } from './_shared/principal'
21
32
  // CIL[END stable_id="~/.framework/functions/integrations.ts:module_header:module_header"]
22
33
 
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
23
49
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:deriveSlug:function" type="function" identity="deriveSlug" parent="~/.framework/functions/integrations.ts"]
24
- // CIL[DOC-MACRO purpose="Derive a URL-safe slug from a name and optional override"]
25
- // CIL[DOC-RESPONSIBILITY responsibility="Normalize integration names to kebab-case slugs"]
26
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
27
- // CIL[DOC-CONTRACT inputs="name: string, slug?: string" outputs="string" errors="none" side_effects="none"]
28
- // CIL[DOC-STABILITY stability="internal"]
29
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
30
- // CIL[DOC-MICRO logic_summary="Returns provided slug or lowercases the name, collapses whitespace to hyphens, and strips characters that are not alphanumeric or hyphens" notable_decisions="[]"]
50
+ /**
51
+ * Derives a URL-friendly slug from a given name, ensuring it is lowercase and replaces spaces with hyphens while removing invalid characters. This function can also use a provided slug if available.
52
+ *
53
+ * @inputSpec
54
+ * - name: string (required) — the name to derive the slug from.
55
+ * - slug: string (optional) — an optional slug to use instead of deriving from the name.
56
+ * @outputSpec string — a URL-friendly slug derived from the name or the provided slug.
57
+ * @sideEffects none
58
+ * @stability internal
59
+ * @cil-generated
60
+ */
31
61
  function deriveSlug(name: string, slug?: string): string {
32
62
  return slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
33
63
  }
34
64
  // CIL[END stable_id="~/.framework/functions/integrations.ts:deriveSlug:function"]
35
65
 
36
- // CIL[DOC-VECTOR type="context" content="purpose='Derive a URL-safe slug from a name and optional override'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
37
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
38
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
39
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
40
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
42
81
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:computeIsConfigured:function" type="function" identity="computeIsConfigured" parent="~/.framework/functions/integrations.ts"]
43
- // CIL[DOC-MACRO purpose="Determine whether all credential entries are populated strings"]
44
- // CIL[DOC-RESPONSIBILITY responsibility="Evaluate integration configured status from a credentials map"]
45
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
46
- // CIL[DOC-CONTRACT inputs="credentials: Record<string, any> | undefined" outputs="boolean" errors="none" side_effects="none"]
47
- // CIL[DOC-MICRO logic_summary="Returns false if credentials is undefined or empty; otherwise requires every entry to have a source and a non-empty string value" notable_decisions="[]"]
48
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
49
- // CIL[DOC-STABILITY stability="stable"]
82
+ /**
83
+ * Determines if the provided credentials are configured correctly by checking for valid entries in the credentials object. This function ensures that all necessary credential values are present and valid.
84
+ *
85
+ * @inputSpec
86
+ * credentials: Record<string, any> | undefined (optional) — an object containing credential entries or undefined.
87
+ * @outputSpec boolean — returns true if all entries are valid, otherwise false.
88
+ * @sideEffects none
89
+ * @stability internal
90
+ * @cil-generated
91
+ */
50
92
  function computeIsConfigured(credentials: Record<string, any> | undefined): boolean {
51
93
  if (!credentials || Object.keys(credentials).length === 0) return false
52
94
  return Object.values(credentials).every((entry: any) => {
@@ -54,21 +96,33 @@ function computeIsConfigured(credentials: Record<string, any> | undefined): bool
54
96
  return typeof entry.value === 'string' && entry.value.length > 0
55
97
  })
56
98
  }
57
- // CIL[DOC-VECTOR type="context" content="purpose='Determine whether all credential entries are populated strings'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
58
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
59
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
60
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
61
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
62
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
63
99
  // CIL[END stable_id="~/.framework/functions/integrations.ts:computeIsConfigured:function"]
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
64
115
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/integrations.ts"]
65
- // CIL[DOC-MACRO purpose="List integration records with optional filters and pagination"]
66
- // CIL[DOC-RESPONSIBILITY responsibility="Handle GET /integrations list requests"]
67
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
68
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, _body: any" outputs="Sanitized integration records" errors="Throws on missing account or database error" side_effects="Reads integrations table with optional filters"]
69
- // CIL[DOC-MICRO logic_summary="Builds a query from query parameters, applies pagination, and sanitizes each returned record" notable_decisions="[]"]
70
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
71
- // CIL[DOC-STABILITY stability="stable"]
116
+ /**
117
+ * The 'list' constant defines an asynchronous handler that retrieves a list of integrations based on various query parameters, ensuring that the request context includes an account ID. It applies filters based on the provided query parameters.
118
+ *
119
+ * @throws Error — Account context required if ctx.accountId is missing.
120
+ * @sideEffects none
121
+ * @stability internal
122
+ * @calls adminDb.from('integrations'), ctx.db.from('integrations'), sanitizeRecordData
123
+ * @errorHandling none
124
+ * @cil-generated
125
+ */
72
126
  export const list = createHandler(async (ctx, _body) => {
73
127
  const { integration_type, provider, is_active, is_configured, limit = 100, offset = 0 } = ctx.query || {}
74
128
 
@@ -76,7 +130,9 @@ export const list = createHandler(async (ctx, _body) => {
76
130
  throw new Error('Account context required')
77
131
  }
78
132
 
79
- let query = ctx.db
133
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
134
+
135
+ let query = db
80
136
  .from('integrations')
81
137
  .select(`*, ${joins.app}, ${joins.createdBy}`)
82
138
  .order('name')
@@ -108,21 +164,32 @@ export const list = createHandler(async (ctx, _body) => {
108
164
 
109
165
  return sanitized
110
166
  })
111
- // CIL[DOC-VECTOR type="context" content="purpose='List integration records with optional filters and pagination'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
112
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
113
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
114
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
115
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
116
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
117
167
  // CIL[END stable_id="~/.framework/functions/integrations.ts:list:constant"]
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
118
183
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/integrations.ts"]
119
- // CIL[DOC-MACRO purpose="Retrieve a single integration by id"]
120
- // CIL[DOC-RESPONSIBILITY responsibility="Handle GET /integrations?id=... requests"]
121
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
122
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, _body: any" outputs="Sanitized integration record" errors="Throws when id missing or record not found" side_effects="Reads integrations table"]
123
- // CIL[DOC-MICRO logic_summary="Fetches one integration by id and sanitizes the result for the caller" notable_decisions="[]"]
124
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
125
- // CIL[DOC-STABILITY stability="stable"]
184
+ /**
185
+ * Retrieves a specific integration record from the database based on the provided integration ID. This function ensures that the caller has the necessary permissions and handles potential errors during the database query.
186
+ *
187
+ * @throws Error — Integration ID is required, Error — database query error
188
+ * @sideEffects none
189
+ * @stability internal
190
+ * @calls adminDb.from('integrations'), ctx.db.from('integrations'), sanitizeRecordData
191
+ * @cil-generated
192
+ */
126
193
  export const get = createHandler(async (ctx, _body) => {
127
194
  const { id } = ctx.query || {}
128
195
 
@@ -130,7 +197,9 @@ export const get = createHandler(async (ctx, _body) => {
130
197
  throw new Error('Integration ID is required')
131
198
  }
132
199
 
133
- const { data, error: err } = await ctx.db
200
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
201
+
202
+ const { data, error: err } = await db
134
203
  .from('integrations')
135
204
  .select(`*, ${joins.app}, ${joins.createdBy}`)
136
205
  .eq('id', id)
@@ -140,21 +209,32 @@ export const get = createHandler(async (ctx, _body) => {
140
209
 
141
210
  return await sanitizeRecordData(ctx, data, 'integration')
142
211
  })
143
- // CIL[DOC-VECTOR type="context" content="purpose='Retrieve a single integration by id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
144
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
145
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
146
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
147
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
148
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
149
212
  // CIL[END stable_id="~/.framework/functions/integrations.ts:get:constant"]
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
150
228
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/integrations.ts"]
151
- // CIL[DOC-MACRO purpose="Create a new integration record"]
152
- // CIL[DOC-RESPONSIBILITY responsibility="Handle POST /integrations requests"]
153
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
154
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, body with integration fields" outputs="New integration record" errors="Throws on validation, permission, or database error" side_effects="Inserts into integrations table and emits audit log"]
155
- // CIL[DOC-MICRO logic_summary="Validates required fields and context, derives a slug, computes configured state, inserts the record, and emits an audit log" notable_decisions="[]"]
156
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
157
- // CIL[DOC-STABILITY stability="stable"]
229
+ /**
230
+ * Creates a new integration record in the database based on the provided parameters while ensuring required fields are present and validating user context. This function is essential for managing integrations within the application.
231
+ *
232
+ * @throws Error — name, integration_type, and provider are required; Error — User context (person and account) required; Error — database insert error.
233
+ * @sideEffects Writes a new record to the 'integrations' table and emits a log event.
234
+ * @stability internal
235
+ * @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
236
+ * @cil-generated
237
+ */
158
238
  export const create = createHandler(async (ctx, body) => {
159
239
  const { app_id, name, description, integration_type, provider, version, config, credentials, metadata } = body
160
240
 
@@ -168,7 +248,9 @@ export const create = createHandler(async (ctx, body) => {
168
248
 
169
249
  const safeCredentials = credentials || {}
170
250
 
171
- const { data, error: err } = await ctx.db
251
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
252
+
253
+ const { data, error: err } = await db
172
254
  .from('integrations')
173
255
  .insert({
174
256
  app_id: app_id || null,
@@ -183,7 +265,7 @@ export const create = createHandler(async (ctx, body) => {
183
265
  credentials: safeCredentials,
184
266
  metadata: metadata || {},
185
267
  is_configured: computeIsConfigured(safeCredentials),
186
- created_by: ctx.principal.id
268
+ created_by: ctx.principal.type === 'human' ? ctx.principal.id : null
187
269
  })
188
270
  .select()
189
271
  .single()
@@ -197,21 +279,32 @@ export const create = createHandler(async (ctx, body) => {
197
279
 
198
280
  return data
199
281
  })
200
- // CIL[DOC-VECTOR type="context" content="purpose='Create a new integration record'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
201
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
202
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
203
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
204
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
205
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
206
282
  // CIL[END stable_id="~/.framework/functions/integrations.ts:create:constant"]
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
207
298
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/integrations.ts"]
208
- // CIL[DOC-MACRO purpose="Update an existing integration record"]
209
- // CIL[DOC-RESPONSIBILITY responsibility="Handle PATCH /integrations requests"]
210
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
211
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, body with id and allowed fields" outputs="Updated integration record" errors="Throws on missing id or database error" side_effects="Updates integrations table and emits audit log"]
212
- // CIL[DOC-MICRO logic_summary="Collects allowed fields, recomputes configured state when credentials change, updates by id, and emits an audit log" notable_decisions="[]"]
213
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
214
- // CIL[DOC-STABILITY stability="stable"]
299
+ /**
300
+ * The update constant defines a handler for updating integration records in the database. It ensures that required fields are present and only allowed fields are updated.
301
+ *
302
+ * @throws Error — Integration ID is required, Error — database update error
303
+ * @sideEffects DB writes to the 'integrations' table, emits a log event for the update.
304
+ * @stability internal
305
+ * @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
306
+ * @cil-generated
307
+ */
215
308
  export const update = createHandler(async (ctx, body) => {
216
309
  const id = body?.id || ctx.query?.id
217
310
  const { id: _bodyId, ...updates } = body || {}
@@ -230,7 +323,9 @@ export const update = createHandler(async (ctx, body) => {
230
323
  updateData.is_configured = computeIsConfigured(updateData.credentials)
231
324
  }
232
325
 
233
- const { data, error: err } = await ctx.db
326
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
327
+
328
+ const { data, error: err } = await db
234
329
  .from('integrations')
235
330
  .update(updateData)
236
331
  .eq('id', id)
@@ -239,28 +334,46 @@ export const update = createHandler(async (ctx, body) => {
239
334
 
240
335
  if (err) throw err
241
336
 
337
+ // S-005: redact credentials from the audit payload — the DB write above is
338
+ // untouched, but `after` lands in public.logs and must never carry secrets.
339
+ const auditAfter = { ...updateData }
340
+ if (auditAfter.credentials !== undefined) {
341
+ auditAfter.credentials = { __redacted: true }
342
+ }
343
+
242
344
  await emitLog(ctx, 'integration.updated',
243
345
  { type: 'integration', id },
244
- { after: updateData }
346
+ { after: auditAfter }
245
347
  )
246
348
 
247
349
  return data
248
350
  })
249
- // CIL[DOC-VECTOR type="context" content="purpose='Update an existing integration record'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
250
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
251
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
252
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
253
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
254
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
255
351
  // CIL[END stable_id="~/.framework/functions/integrations.ts:update:constant"]
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
256
367
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/integrations.ts"]
257
- // CIL[DOC-MACRO purpose="Soft-delete an integration by marking it inactive"]
258
- // CIL[DOC-RESPONSIBILITY responsibility="Handle DELETE /integrations requests"]
259
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
260
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, _body: any" outputs="Record marked inactive" errors="Throws when id missing or record not found" side_effects="Sets is_active to false and emits audit log"]
261
- // CIL[DOC-MICRO logic_summary="Verifies the integration exists, marks it inactive with an updated timestamp, and emits an audit log" notable_decisions="[]"]
262
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
263
- // CIL[DOC-STABILITY stability="stable"]
368
+ /**
369
+ * The 'remove' constant defines a handler for deleting an integration by its ID, marking it as inactive in the database. It ensures that the integration ID is provided and logs the deletion event.
370
+ *
371
+ * @throws Error — Integration ID is required, Error — Integration not found, Error — database error
372
+ * @sideEffects Updates the 'integrations' table in the database and emits a log event.
373
+ * @stability internal
374
+ * @calls adminDb.from('integrations'), ctx.db.from('integrations'), emitLog
375
+ * @cil-generated
376
+ */
264
377
  export const remove = createHandler(async (ctx, _body) => {
265
378
  const id = ctx.query?.id
266
379
 
@@ -268,7 +381,9 @@ export const remove = createHandler(async (ctx, _body) => {
268
381
  throw new Error('Integration ID is required')
269
382
  }
270
383
 
271
- const { data: current } = await ctx.db
384
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
385
+
386
+ const { data: current } = await db
272
387
  .from('integrations')
273
388
  .select('id, name, provider')
274
389
  .eq('id', id)
@@ -276,7 +391,7 @@ export const remove = createHandler(async (ctx, _body) => {
276
391
 
277
392
  if (!current) throw new Error('Integration not found')
278
393
 
279
- const { data, error: err } = await ctx.db
394
+ const { data, error: err } = await db
280
395
  .from('integrations')
281
396
  .update({ is_active: false, updated_at: new Date().toISOString() })
282
397
  .eq('id', id)
@@ -293,20 +408,31 @@ export const remove = createHandler(async (ctx, _body) => {
293
408
  return data
294
409
  })
295
410
  // CIL[END stable_id="~/.framework/functions/integrations.ts:remove:constant"]
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
296
426
  // CIL[BEGIN stable_id="~/.framework/functions/integrations.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/integrations.ts"]
297
- // CIL[DOC-MACRO purpose="Route integration HTTP requests by method"]
298
- // CIL[DOC-VECTOR type="context" content="purpose='Soft-delete an integration by marking it inactive'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
299
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
300
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
301
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
302
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
303
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
304
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch GET, POST, PATCH, DELETE to the appropriate handler"]
305
- // CIL[DOC-CONTEXT module="integrations" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/integrations.ts"]
306
- // CIL[DOC-CONTRACT inputs="ctx: RequestContext, body: any" outputs="Result from chosen handler" errors="Throws for unsupported method or delegate errors" side_effects="Delegates to CRUD handlers and helpers"]
307
- // CIL[DOC-MICRO logic_summary="Selects a handler based on the request method and optional id in query" notable_decisions="[]"]
308
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
309
- // CIL[DOC-STABILITY stability="stable"]
427
+ /**
428
+ * The handler processes incoming requests based on the HTTP method specified in the query parameters. It routes the request to the appropriate function for handling GET, POST, PATCH, or DELETE operations.
429
+ *
430
+ * @throws Error — Unsupported method: {method}
431
+ * @sideEffects none
432
+ * @stability internal
433
+ * @calls get, list, create, update, remove
434
+ * @cil-generated
435
+ */
310
436
  export const handler = createHandler(async (ctx, body) => {
311
437
  const method = ctx.query?.method || 'GET'
312
438
 
@@ -327,10 +453,11 @@ export const handler = createHandler(async (ctx, body) => {
327
453
  throw new Error(`Unsupported method: ${method}`)
328
454
  }
329
455
  })
330
- // CIL[DOC-VECTOR type="context" content="purpose='Route integration HTTP requests by method'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
331
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
332
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
333
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
334
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
335
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
336
456
  // CIL[END stable_id="~/.framework/functions/integrations.ts:handler:constant"]
457
+
458
+
459
+
460
+
461
+
462
+
463
+