spine-framework 0.3.144 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,25 +1,34 @@
1
- // CIL[BEGIN chunk_id="integration_routes_module_header_1784200006" type="module_header" identity="imports" parent="none"]
2
- // CIL[DOC-MACRO purpose="Single inbound webhook gateway for all integrations"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Authenticate, route, dispatch, and persist inbound webhooks through admin-data"]
4
- // CIL[DOC-CONTEXT module="integration-routes" layer="backend_functions" related_files="[".framework/functions/_shared/principal.ts",".framework/functions/_shared/webhook-registry.ts",".framework/functions/admin-data.ts",".framework/functions/_shared/hash-api-key.ts",".framework/functions/_shared/resolve-credentials.ts",".framework/migrations/051_integration_broker.sql"]"]
5
- // CIL[DOC-CONTRACT inputs="x-api-key header and ?slug= query param" outputs="created record" errors="auth, routing, adapter, admin-data errors" side_effects="API key usage log, webhook delivery ledger, admin-data record creation"]
6
- // CIL[DOC-MICRO logic_summary="Resolves API key by x-api-key, loads integration by slug, finds a registered webhook handler, runs the adapter, and creates the resulting record through admin-data." notable_decisions="["Uses createPublicHandler because the caller is not a human JWT.","Created_by is null for machine writes; account_id is inherited from the integration.","Never passes adminDb or ctx.db to adapters."]"]
7
- // CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
8
- // CIL[DOC-STABILITY stability="experimental"]
9
- // CIL[DOC-AUDIENCE audience="developer"]
10
- // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, .framework/functions/_shared/webhook-registry.ts, .framework/functions/admin-data.ts, .framework/functions/_shared/hash-api-key.ts, .framework/functions/_shared/resolve-credentials.ts, .framework/migrations/051_integration_broker.sql."]
11
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
- // CIL[DOC-VECTOR type="constraint" content="Requires x-api-key header and ?slug= query parameter."]
14
- // CIL[DOC-VECTOR type="implementation_pattern" content="Called by external services as POST /.netlify/functions/integration-routes?slug=<integration>."]
15
- // CIL[DOC-VECTOR type="user_journey" content="External service pushes data into Spine."]
1
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/integration-routes.ts"]
2
+ // CIL[DOC-MACRO purpose="Netlify function entry point for inbound integration webhooks"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Import shared modules and export the public execute/default handlers"]
4
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports dependencies and wires the default public handler" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="system-ai"]
16
10
 
17
11
  import { createPublicHandler, CoreContext } from './_shared/middleware'
18
12
  import { adminDb } from './_shared/db'
19
13
  import { emitLog } from './_shared/audit'
20
14
  import { resolveHandler } from './_shared/webhook-registry'
21
15
  import { create as adminDataCreate } from './admin-data'
22
-
16
+ // CIL[DOC-VECTOR type="context" content="purpose='Netlify function entry point for inbound integration webhooks'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
17
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
18
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
19
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
20
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:module_header:module_header"]
23
+
24
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:InboundAdapterContext:interface" type="interface" identity="InboundAdapterContext" parent="~/.framework/functions/integration-routes.ts"]
25
+ // CIL[DOC-MACRO purpose="Defines the context passed to inbound webhook adapters"]
26
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide typed fields for adapter input, integration, API key, event, headers and logging"]
27
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
28
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface" errors="none" side_effects="none"]
29
+ // CIL[DOC-MICRO logic_summary="TypeScript interface describing the shape of the inbound adapter context" notable_decisions="[]"]
30
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
31
+ // CIL[DOC-STABILITY stability="stable"]
23
32
  interface InboundAdapterContext {
24
33
  payload: any
25
34
  integration: any
@@ -30,7 +39,22 @@ interface InboundAdapterContext {
30
39
  headers: Record<string, string>
31
40
  logger: { info: (msg: string, meta?: any) => void; warn: (msg: string, meta?: any) => void; error: (msg: string, meta?: any) => void }
32
41
  }
33
-
42
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the context passed to inbound webhook adapters'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
43
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
44
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
45
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
46
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
47
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
48
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:InboundAdapterContext:interface"]
49
+
50
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:AdapterResult:interface" type="interface" identity="AdapterResult" parent="~/.framework/functions/integration-routes.ts"]
51
+ // CIL[DOC-MACRO purpose="Describes the normalized result returned by inbound webhook adapters"]
52
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide a typed contract for adapter transformation output"]
53
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
54
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface" errors="none" side_effects="none"]
55
+ // CIL[DOC-MICRO logic_summary="TypeScript interface describing the normalized adapter result shape" notable_decisions="[]"]
56
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
57
+ // CIL[DOC-STABILITY stability="stable"]
34
58
  interface AdapterResult {
35
59
  type_slug: string
36
60
  data: Record<string, any>
@@ -42,17 +66,62 @@ interface AdapterResult {
42
66
  error?: string
43
67
  retryable?: boolean
44
68
  }
45
-
69
+ // CIL[DOC-VECTOR type="context" content="purpose='Describes the normalized result returned by inbound webhook adapters'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
70
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
71
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
72
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
73
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
74
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
75
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:AdapterResult:interface"]
76
+
77
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:getClientIp:function" type="function" identity="getClientIp" parent="~/.framework/functions/integration-routes.ts"]
78
+ // CIL[DOC-MACRO purpose="Extract the client IP from a request event"]
79
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolve the X-Forwarded-For header from the incoming event"]
80
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
81
+ // CIL[DOC-CONTRACT inputs="event" outputs="string" errors="none" side_effects="none"]
82
+ // CIL[DOC-MICRO logic_summary="Fallback across lowercase and uppercase header forms, defaulting to 'unknown'" notable_decisions="[]"]
83
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
84
+ // CIL[DOC-STABILITY stability="stable"]
46
85
  function getClientIp(event: any): string {
47
86
  return event.headers?.['x-forwarded-for'] || event.headers?.['X-Forwarded-For'] || 'unknown'
48
87
  }
49
-
88
+ // CIL[DOC-VECTOR type="context" content="purpose='Extract the client IP from a request event'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
89
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
90
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
91
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
92
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
93
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
94
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:getClientIp:function"]
95
+
96
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:computeNextAttempt:function" type="function" identity="computeNextAttempt" parent="~/.framework/functions/integration-routes.ts"]
97
+ // CIL[DOC-MACRO purpose="Calculate the next retry timestamp for a failed webhook delivery"]
98
+ // CIL[DOC-RESPONSIBILITY responsibility="Compute an exponential backoff delay with jitter, capped at a maximum"]
99
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
100
+ // CIL[DOC-CONTRACT inputs="attemptCount, baseMs, maxDelayMs" outputs="Date" errors="none" side_effects="uses Math.random"]
101
+ // CIL[DOC-MICRO logic_summary="Doubles the base delay per attempt, adds up to 20% jitter, and clamps to the configured max" notable_decisions="[]"]
102
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
103
+ // CIL[DOC-STABILITY stability="stable"]
50
104
  function computeNextAttempt(attemptCount: number, baseMs = 30000, maxDelayMs = 3600000): Date {
51
105
  const delay = Math.min(baseMs * Math.pow(2, attemptCount), maxDelayMs)
52
106
  const jitter = Math.floor(Math.random() * delay * 0.2)
53
107
  return new Date(Date.now() + delay + jitter)
54
108
  }
55
-
109
+ // CIL[DOC-VECTOR type="context" content="purpose='Calculate the next retry timestamp for a failed webhook delivery'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
110
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
111
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
112
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
113
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
114
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
115
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:computeNextAttempt:function"]
116
+
117
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:extractEvent:function" type="function" identity="extractEvent" parent="~/.framework/functions/integration-routes.ts"]
118
+ // CIL[DOC-MACRO purpose="Determine the event name from an inbound webhook payload"]
119
+ // CIL[DOC-RESPONSIBILITY responsibility="Extract the event from a header or a dotted path in the payload"]
120
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
121
+ // CIL[DOC-CONTRACT inputs="payload, eventHeader, eventPath" outputs="string | null" errors="none" side_effects="none"]
122
+ // CIL[DOC-MICRO logic_summary="Returns the header value directly when provided; otherwise navigates the payload object by the dotted path and coerces to null if missing or empty" notable_decisions="[]"]
123
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
124
+ // CIL[DOC-STABILITY stability="stable"]
56
125
  function extractEvent(payload: any, eventHeader?: string | null, eventPath?: string | null): string | null {
57
126
  if (eventHeader) {
58
127
  const h = eventHeader.toLowerCase()
@@ -69,7 +138,22 @@ function extractEvent(payload: any, eventHeader?: string | null, eventPath?: str
69
138
  }
70
139
  return null
71
140
  }
72
-
141
+ // CIL[DOC-VECTOR type="context" content="purpose='Determine the event name from an inbound webhook payload'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
142
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
143
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
144
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
145
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
146
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
147
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:extractEvent:function"]
148
+
149
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:execute:function" type="function" identity="execute" parent="~/.framework/functions/integration-routes.ts"]
150
+ // CIL[DOC-MACRO purpose="Main inbound webhook execution handler"]
151
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate the request, resolve the integration and adapter, persist delivery records, and create the resulting item"]
152
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
153
+ // CIL[DOC-CONTRACT inputs="ctx, body" outputs="record" errors="400, 401, 403, 404, adapter error" side_effects="Inserts and updates webhook_deliveries, emits audit logs, calls admin-data create"]
154
+ // CIL[DOC-MICRO logic_summary="Performs API key and integration authorization, extracts event, resolves the adapter, persists a delivery record, invokes the adapter, updates delivery status, and creates an admin-data record from the adapter result" notable_decisions="[]"]
155
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
156
+ // CIL[DOC-STABILITY stability="stable"]
73
157
  export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
74
158
  const slug = ctx.query?.slug || body?.slug
75
159
 
@@ -291,7 +375,28 @@ export async function execute(ctx: CoreContext, body: any = {}): Promise<any> {
291
375
  throw err
292
376
  }
293
377
  }
294
-
378
+ // CIL[DOC-VECTOR type="context" content="purpose='Main inbound webhook execution handler'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
379
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
380
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
381
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
382
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
383
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
384
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:execute:function"]
385
+
386
+ // CIL[BEGIN stable_id="~/.framework/functions/integration-routes.ts:default:function" type="function" identity="default" parent="~/.framework/functions/integration-routes.ts"]
387
+ // CIL[DOC-MACRO purpose="Exports the default Netlify handler wrapping execute in public middleware"]
388
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose execute as the public Netlify function entry point"]
389
+ // CIL[DOC-CONTEXT module="integration-routes" layer="functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/webhook-registry.ts,.framework/functions/admin-data.ts,.framework/functions/integration-routes.ts"]
390
+ // CIL[DOC-CONTRACT inputs="none (createPublicHandler wraps execute)" outputs="public handler" errors="none" side_effects="none"]
391
+ // CIL[DOC-MICRO logic_summary="Wraps the execute function with createPublicHandler for public invocation" notable_decisions="[]"]
392
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
393
+ // CIL[DOC-STABILITY stability="stable"]
295
394
  export default createPublicHandler(execute)
395
+ // CIL[DOC-VECTOR type="context" content="purpose='Exports the default Netlify handler wrapping execute in public middleware'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
396
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
397
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
398
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
399
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
400
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
401
+ // CIL[END stable_id="~/.framework/functions/integration-routes.ts:default:function"]
296
402
 
297
- // CIL[END chunk_id="integration_routes_module_header_1784200006"]
@@ -1,33 +1,52 @@
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"]
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"]
14
8
  // 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"]
9
+ // CIL[DOC-AUDIENCE audience="engineers maintaining integration handlers and related admin-data endpoints"]
10
+
22
11
  import { createHandler } from './_shared/middleware'
23
12
  import { joins } from './_shared/db'
24
13
  import { emitLog } from './_shared/audit'
25
14
  import { sanitizeRecordData } from './_shared/permissions'
26
-
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"]
21
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:module_header:module_header"]
22
+
23
+ // 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="[]"]
27
31
  function deriveSlug(name: string, slug?: string): string {
28
32
  return slug || name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')
29
33
  }
34
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:deriveSlug:function"]
30
35
 
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"]
42
+ // 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"]
31
50
  function computeIsConfigured(credentials: Record<string, any> | undefined): boolean {
32
51
  if (!credentials || Object.keys(credentials).length === 0) return false
33
52
  return Object.values(credentials).every((entry: any) => {
@@ -35,21 +54,21 @@ function computeIsConfigured(credentials: Record<string, any> | undefined): bool
35
54
  return typeof entry.value === 'string' && entry.value.length > 0
36
55
  })
37
56
  }
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."]
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"]
51
61
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
52
62
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
63
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:computeIsConfigured:function"]
64
+ // 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"]
53
72
  export const list = createHandler(async (ctx, _body) => {
54
73
  const { integration_type, provider, is_active, is_configured, limit = 100, offset = 0 } = ctx.query || {}
55
74
 
@@ -89,21 +108,21 @@ export const list = createHandler(async (ctx, _body) => {
89
108
 
90
109
  return sanitized
91
110
  })
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."]
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"]
105
115
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
106
116
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
117
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:list:constant"]
118
+ // 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"]
107
126
  export const get = createHandler(async (ctx, _body) => {
108
127
  const { id } = ctx.query || {}
109
128
 
@@ -121,21 +140,21 @@ export const get = createHandler(async (ctx, _body) => {
121
140
 
122
141
  return await sanitizeRecordData(ctx, data, 'integration')
123
142
  })
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."]
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"]
137
147
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
138
148
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
149
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:get:constant"]
150
+ // 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"]
139
158
  export const create = createHandler(async (ctx, body) => {
140
159
  const { app_id, name, description, integration_type, provider, version, config, credentials, metadata } = body
141
160
 
@@ -178,21 +197,21 @@ export const create = createHandler(async (ctx, body) => {
178
197
 
179
198
  return data
180
199
  })
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."]
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"]
194
204
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
195
205
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
206
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:create:constant"]
207
+ // 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"]
196
215
  export const update = createHandler(async (ctx, body) => {
197
216
  const id = body?.id || ctx.query?.id
198
217
  const { id: _bodyId, ...updates } = body || {}
@@ -227,21 +246,21 @@ export const update = createHandler(async (ctx, body) => {
227
246
 
228
247
  return data
229
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."]
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"]
243
253
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
244
254
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
255
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:update:constant"]
256
+ // 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"]
245
264
  export const remove = createHandler(async (ctx, _body) => {
246
265
  const id = ctx.query?.id
247
266
 
@@ -273,21 +292,21 @@ export const remove = createHandler(async (ctx, _body) => {
273
292
 
274
293
  return data
275
294
  })
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."]
295
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:remove:constant"]
296
+ // 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"]
289
302
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
290
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"]
291
310
  export const handler = createHandler(async (ctx, body) => {
292
311
  const method = ctx.query?.method || 'GET'
293
312
 
@@ -308,4 +327,10 @@ export const handler = createHandler(async (ctx, body) => {
308
327
  throw new Error(`Unsupported method: ${method}`)
309
328
  }
310
329
  })
311
- // CIL[END chunk_id="integrations_handler_1783968140"]
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
+ // CIL[END stable_id="~/.framework/functions/integrations.ts:handler:constant"]