spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,55 +1,77 @@
1
- /**
2
- * @module apps
3
- * @audience core-contributor
4
- * @layer api-handler
5
- * @stability stable
6
- *
7
- * CRUD API for the `apps` table. Apps are the installable units of functionality
8
- * in Spine v2. They group types, roles, integrations, and nav configuration.
9
- *
10
- * **Routed by:** `GET/POST/PATCH/DELETE /.netlify/functions/apps`
11
- *
12
- * **Authorization model:**
13
- * - `list` / `get` / `getSchema` / `checkAvailability`: any authenticated principal
14
- * (RLS-scoped via `ctx.db`). Returns sanitized records.
15
- * - `create`: requires `isSystemAdmin` or first-surface `canCreate` permission.
16
- * - `update` / `remove`: requires authenticated principal + field-level permission
17
- * check via `validateUpdatePermissions`.
18
- * - `updateVersion`: authenticated principal via RPC.
19
- *
20
- * INVARIANT: app slugs are globally unique across the `apps` table.
21
- * INVARIANT: `is_system` apps can only be manipulated by system admins.
22
- *
23
- * @seeAlso middleware.ts (createHandler)
24
- * @seeAlso permissions.ts (PermissionEngine, sanitizeRecordData)
25
- * @seeAlso audit.ts (emitLog for app.created / app.updated / app.deleted)
26
- * @seeAlso types.ts (types reference apps via app_id)
27
- */
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+ // CIL[BEGIN chunk_id="apps_moduleheader_1783969696" type="module_header" identity="imports" parent="none"]
37
+ // CIL[DOC-MACRO purpose="Import dependencies for apps module"]
38
+ // CIL[DOC-RESPONSIBILITY responsibility="Import middleware, database, permissions, and logging utilities"]
39
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
40
+ // CIL[DOC-CONTRACT inputs="none" outputs="imported_modules" errors="none" side_effects="none"]
41
+ // CIL[DOC-MICRO logic_summary="Imports required dependencies for app management functions" notable_decisions="[]"]
42
+ // CIL[DOC-CONFIDENCE pass="second" score="0.96" flags="none"]
43
+ // CIL[DOC-STABILITY stability="stable"]
44
+ // CIL[DOC-AUDIENCE audience="developer"]
45
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
46
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
47
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
48
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
49
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
28
51
 
29
52
  import { createHandler } from './_shared/middleware'
30
- import { joins } from './_shared/db'
53
+ import { adminDb } from './_shared/db'
31
54
  import { emitLog } from './_shared/audit'
55
+ import { isSystemAdmin } from './_shared/principal'
32
56
  import { PermissionEngine, sanitizeRecordData } from './_shared/permissions'
33
57
 
34
58
  const permissions = PermissionEngine as any
35
-
36
- // ─── HANDLERS ─────────────────────────────────────────────────────────────────
37
-
38
- // ─── CHUNK_START: APPS_LIST ──────────────────────────────────────────────
39
- /**
40
- * @chunk-id APPS_LIST_1_0_0
41
- * @version 1.0.0
42
- * @hash 8eaac3c01786fadeb3c4acb34c9725378f2055766213493859835cadf2bb3963
43
- * @macro Apps List Handler
44
- * @micro Lists accessible apps via RPC with filtering and sanitization
45
- * @inputs ctx: CoreContext — Request context with principal and database
46
- * @inputs body: any — Request body (unused for GET)
47
- * @outputs Array of sanitized app records
48
- * @depends-on [createHandler, sanitizeRecordData]
49
- * @depended-by [Netlify function routing]
50
- * @side-effects [RPC call, permission sanitization]
51
- * @tags apps, list, crud, rpc
52
- */
59
+ // CIL[END chunk_id="apps_moduleheader_1783969696"]
60
+ // CIL[BEGIN chunk_id="apps_list_1783969696" type="function" identity="list" parent="none"]
61
+ // CIL[DOC-LEARNING topic="apps_list:get_account_apps_filter" content="/api/apps?action=list calls get_account_apps, which filters by account ownership, is_active, and the requesting user's roles. An app missing from this list will never be rendered by AuthenticatedRouter."]
62
+ // CIL[DOC-MACRO purpose="List apps with filtering and permissions"]
63
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve and filter apps by account and user roles"]
64
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
65
+ // CIL[DOC-CONTRACT inputs="none" outputs="sanitized_app_list" errors="auth_errors,db_errors" side_effects="none"]
66
+ // CIL[DOC-MICRO logic_summary="Query apps by account with role-based filtering and data sanitization" notable_decisions="[]"]
67
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
68
+ // CIL[DOC-STABILITY stability="stable"]
69
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx, \."]
70
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
71
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
72
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
73
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
74
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
53
75
  export const list = createHandler(async (ctx, body) => {
54
76
  const { include_system, include_inactive, account_id } = ctx.query || {}
55
77
 
@@ -59,12 +81,12 @@ export const list = createHandler(async (ctx, body) => {
59
81
  throw new Error('Account context required')
60
82
  }
61
83
 
62
- // Pass user roles to the RPC so filtering happens server-side.
63
- // system_admin bypasses all role checks in the RPC.
84
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
85
+
64
86
  const userRoles = ctx.principal?.roles || []
65
87
  const isSysAdmin = userRoles.includes('system_admin')
66
88
 
67
- const { data, error: err } = await ctx.db
89
+ const { data, error: err } = await db
68
90
  .rpc('get_account_apps', {
69
91
  account_id: targetAccountId,
70
92
  include_system: include_system !== 'false',
@@ -75,7 +97,7 @@ export const list = createHandler(async (ctx, body) => {
75
97
 
76
98
  if (err) throw err
77
99
 
78
- // Sanitize each record based on role permissions
100
+
79
101
  const sanitized = []
80
102
  for (const app of data || []) {
81
103
  sanitized.push(await sanitizeRecordData(ctx, app, 'app'))
@@ -83,23 +105,21 @@ export const list = createHandler(async (ctx, body) => {
83
105
 
84
106
  return sanitized
85
107
  })
86
- // ─── CHUNK_END: APPS_LIST ────────────────────────────────────────────────
87
-
88
- // ─── CHUNK_START: APPS_GET ──────────────────────────────────────────────
89
- /**
90
- * @chunk-id APPS_GET_1_0_0
91
- * @version 1.0.0
92
- * @hash 5449bb3ac8726775412df541e1f2abf2400fb18751e3c9aad5f0aafb09cc7f60
93
- * @macro App Get Handler
94
- * @micro Returns single app by ID or slug with owner account join
95
- * @inputs ctx: CoreContext — Request context with principal and database
96
- * @inputs body: any — Request body (unused for GET)
97
- * @outputs Sanitized app record with ownerAccount join
98
- * @depends-on [createHandler, joins, sanitizeRecordData]
99
- * @depended-by [Netlify function routing]
100
- * @side-effects [DB single row query, permission sanitization]
101
- * @tags apps, get, crud, single-record
102
- */
108
+ // CIL[END chunk_id="apps_list_1783969696"]
109
+ // CIL[BEGIN chunk_id="apps_get_1783969696" type="function" identity="get" parent="none"]
110
+ // CIL[DOC-MACRO purpose="Get single app by ID or slug"]
111
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve individual app record with owner details"]
112
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
113
+ // CIL[DOC-CONTRACT inputs="none" outputs="sanitized_app" errors="not_found,db_errors" side_effects="none"]
114
+ // CIL[DOC-MICRO logic_summary="Query app by ID or slug and sanitize data for response" notable_decisions="[]"]
115
+ // CIL[DOC-CONFIDENCE pass="second" score="0.96" flags="none"]
116
+ // CIL[DOC-STABILITY stability="stable"]
117
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
118
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
119
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
120
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
121
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
122
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
103
123
  export const get = createHandler(async (ctx, body) => {
104
124
  const { id, slug } = ctx.query || {}
105
125
 
@@ -107,9 +127,11 @@ export const get = createHandler(async (ctx, body) => {
107
127
  throw new Error('App ID or slug is required')
108
128
  }
109
129
 
110
- let query = ctx.db
130
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
131
+
132
+ let query = db
111
133
  .from('apps')
112
- .select(`*, ${joins.ownerAccount}`)
134
+ .select('*')
113
135
  .eq('is_active', true)
114
136
 
115
137
  if (id) {
@@ -122,26 +144,24 @@ export const get = createHandler(async (ctx, body) => {
122
144
 
123
145
  if (err) throw err
124
146
 
125
- // Sanitize based on role permissions
147
+
126
148
  return await sanitizeRecordData(ctx, data, 'app')
127
149
  })
128
- // ─── CHUNK_END: APPS_GET ────────────────────────────────────────────────
129
-
130
- // ─── CHUNK_START: APPS_GET_SCHEMA ──────────────────────────────────────────────
131
- /**
132
- * @chunk-id APPS_GET_SCHEMA_1_0_0
133
- * @version 1.0.0
134
- * @hash 8b6b7bb419114cbb699ad841dc4ba760ff36a626e8a9513de24715229e5a064b
135
- * @macro App Schema Handler
136
- * @micro Returns full app schema via RPC with types, roles, views, integrations
137
- * @inputs ctx: CoreContext — Request context with principal and database
138
- * @inputs body: any — Request body (unused for GET)
139
- * @outputs App schema object with complete configuration
140
- * @depends-on [createHandler]
141
- * @depended-by [Netlify function routing]
142
- * @side-effects [RPC call for schema retrieval]
143
- * @tags apps, schema, rpc, configuration
144
- */
150
+ // CIL[END chunk_id="apps_get_1783969696"]
151
+ // CIL[BEGIN chunk_id="apps_getschema_1783969696" type="function" identity="getSchema" parent="none"]
152
+ // CIL[DOC-MACRO purpose="Get app schema configuration"]
153
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve schema definition for specific app"]
154
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
155
+ // CIL[DOC-CONTRACT inputs="none" outputs="app_schema" errors="not_found,db_errors" side_effects="none"]
156
+ // CIL[DOC-MICRO logic_summary="Call stored procedure to get app schema by slug" notable_decisions="[]"]
157
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="rpc_behavior_not_mapped"]
158
+ // CIL[DOC-STABILITY stability="stable"]
159
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 1. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
160
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
161
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
162
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
163
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
164
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
145
165
  export const getSchema = createHandler(async (ctx, body) => {
146
166
  const { slug } = ctx.query || {}
147
167
 
@@ -156,23 +176,21 @@ export const getSchema = createHandler(async (ctx, body) => {
156
176
 
157
177
  return data
158
178
  })
159
- // ─── CHUNK_END: APPS_GET_SCHEMA ────────────────────────────────────────────────
160
-
161
- // ─── CHUNK_START: APPS_CREATE ──────────────────────────────────────────────
162
- /**
163
- * @chunk-id APPS_CREATE_1_0_0
164
- * @version 1.0.0
165
- * @hash f440efbf4a020b2d0d21ed7d90c5995538dd76d631f1b16fc53c1f2e9a1e4f91
166
- * @macro App Create Handler
167
- * @micro Creates new app with permission validation and audit logging
168
- * @inputs ctx: CoreContext — Request context with principal and database
169
- * @inputs body: object — App configuration data including slug and name
170
- * @outputs Inserted app record
171
- * @depends-on [createHandler, permissions, emitLog]
172
- * @depended-by [Netlify function routing]
173
- * @side-effects [DB insert, permission checks, audit logging]
174
- * @tags apps, create, crud, permissions, audit
175
- */
179
+ // CIL[END chunk_id="apps_getschema_1783969696"]
180
+ // CIL[BEGIN chunk_id="apps_create_1783969696" type="function" identity="create" parent="none"]
181
+ // CIL[DOC-MACRO purpose="Create new app with validation"]
182
+ // CIL[DOC-RESPONSIBILITY responsibility="Create app record with permissions and audit logging"]
183
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
184
+ // CIL[DOC-CONTRACT inputs="none" outputs="created_app" errors="validation_errors,permission_errors" side_effects="db_write,audit_log"]
185
+ // CIL[DOC-MICRO logic_summary="Validate permissions, check slug uniqueness, create app, log event" notable_decisions="[]"]
186
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
187
+ // CIL[DOC-STABILITY stability="stable"]
188
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
189
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
190
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
191
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
192
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
193
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
176
194
  export const create = createHandler(async (ctx, body) => {
177
195
  const { slug, name, description, icon, color, version, app_type, source, owner_account_id, config, nav_items, min_role, integration_deps, metadata, route_prefix, renderer } = body
178
196
 
@@ -184,7 +202,7 @@ export const create = createHandler(async (ctx, body) => {
184
202
  throw new Error('User context (person and account) required')
185
203
  }
186
204
 
187
- // Check create permissions
205
+
188
206
  if (!permissions.isSystemAdmin(ctx)) {
189
207
  const perms = await permissions.resolveFirstSurfacePermissions(
190
208
  ctx.principal.id,
@@ -198,7 +216,7 @@ export const create = createHandler(async (ctx, body) => {
198
216
  }
199
217
  }
200
218
 
201
- // Check if slug is unique
219
+
202
220
  const { data: existing } = await ctx.db
203
221
  .from('apps')
204
222
  .select('id')
@@ -240,23 +258,21 @@ export const create = createHandler(async (ctx, body) => {
240
258
 
241
259
  return data
242
260
  })
243
- // ─── CHUNK_END: APPS_CREATE ────────────────────────────────────────────────
244
-
245
- // ─── CHUNK_START: APPS_UPDATE ──────────────────────────────────────────────
246
- /**
247
- * @chunk-id APPS_UPDATE_1_0_0
248
- * @version 1.0.0
249
- * @hash 77029f18737fee801ff5ebdde199d6b52454fd9fe3842694b072181fc713b937
250
- * @macro App Update Handler
251
- * @micro Updates app with field-level permission validation and audit logging
252
- * @inputs ctx: CoreContext — Request context with principal and database
253
- * @inputs body: object — App updates including id
254
- * @outputs Updated app record
255
- * @depends-on [createHandler, permissions, emitLog]
256
- * @depended-by [Netlify function routing]
257
- * @side-effects [DB update, permission validation, audit logging]
258
- * @tags apps, update, crud, permissions, audit
259
- */
261
+ // CIL[END chunk_id="apps_create_1783969696"]
262
+ // CIL[BEGIN chunk_id="apps_update_1783969696" type="function" identity="update" parent="none"]
263
+ // CIL[DOC-MACRO purpose="Update existing app with permissions"]
264
+ // CIL[DOC-RESPONSIBILITY responsibility="Update app record with field-level permission validation"]
265
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
266
+ // CIL[DOC-CONTRACT inputs="none" outputs="updated_app" errors="not_found,permission_errors" side_effects="db_write,audit_log"]
267
+ // CIL[DOC-MICRO logic_summary="Validate update permissions, apply changes, log modification" notable_decisions="[]"]
268
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
269
+ // CIL[DOC-STABILITY stability="stable"]
270
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
271
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
272
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
273
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
274
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
275
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
260
276
  export const update = createHandler(async (ctx, body) => {
261
277
  const id = body?.id || ctx.query?.id
262
278
  const { id: _bodyId, ...updates } = body || {}
@@ -269,7 +285,7 @@ export const update = createHandler(async (ctx, body) => {
269
285
  throw new Error('User context (person and account) required')
270
286
  }
271
287
 
272
- // Get current state for audit - RLS will filter to accessible apps
288
+
273
289
  const { data: current } = await ctx.db
274
290
  .from('apps')
275
291
  .select('*')
@@ -280,7 +296,7 @@ export const update = createHandler(async (ctx, body) => {
280
296
  throw new Error('App not found')
281
297
  }
282
298
 
283
- // Validate field-level permissions
299
+
284
300
  const fieldValidation = await permissions.validateUpdatePermissions(
285
301
  ctx,
286
302
  updates,
@@ -308,23 +324,21 @@ export const update = createHandler(async (ctx, body) => {
308
324
 
309
325
  return data
310
326
  })
311
- // ─── CHUNK_END: APPS_UPDATE ────────────────────────────────────────────────
312
-
313
- // ─── CHUNK_START: APPS_REMOVE ──────────────────────────────────────────────
314
- /**
315
- * @chunk-id APPS_REMOVE_1_0_0
316
- * @version 1.0.0
317
- * @hash b2c79779820861406f1adabc2279e332727b936abab4c6f5e5762a62d1373169
318
- * @macro App Remove Handler
319
- * @micro Soft-deletes app with validation and audit logging
320
- * @inputs ctx: CoreContext — Request context with principal and database
321
- * @inputs body: any — Request body with app ID
322
- * @outputs Updated app record with is_active: false
323
- * @depends-on [createHandler, emitLog]
324
- * @depended-by [Netlify function routing]
325
- * @side-effects [DB soft delete, audit logging]
326
- * @tags apps, remove, crud, audit
327
- */
327
+ // CIL[END chunk_id="apps_update_1783969696"]
328
+ // CIL[BEGIN chunk_id="apps_remove_1783969696" type="function" identity="remove" parent="none"]
329
+ // CIL[DOC-MACRO purpose="Soft delete app by deactivating"]
330
+ // CIL[DOC-RESPONSIBILITY responsibility="Deactivate app record with audit logging"]
331
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
332
+ // CIL[DOC-CONTRACT inputs="none" outputs="deactivated_app" errors="not_found,auth_errors" side_effects="db_write,audit_log"]
333
+ // CIL[DOC-MICRO logic_summary="Set is_active=false instead of hard delete, log removal" notable_decisions="[]"]
334
+ // CIL[DOC-CONFIDENCE pass="second" score="0.96" flags="none"]
335
+ // CIL[DOC-STABILITY stability="stable"]
336
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
337
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
338
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
339
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
340
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
341
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
328
342
  export const remove = createHandler(async (ctx, body) => {
329
343
  const id = body?.id || ctx.query?.id
330
344
 
@@ -336,7 +350,7 @@ export const remove = createHandler(async (ctx, body) => {
336
350
  throw new Error('User context (person and account) required')
337
351
  }
338
352
 
339
- // Get current state for audit - RLS will filter to accessible apps
353
+
340
354
  const { data: current } = await ctx.db
341
355
  .from('apps')
342
356
  .select('*')
@@ -363,23 +377,21 @@ export const remove = createHandler(async (ctx, body) => {
363
377
 
364
378
  return data
365
379
  })
366
- // ─── CHUNK_END: APPS_REMOVE ────────────────────────────────────────────────
367
-
368
- // ─── CHUNK_START: APPS_CHECK_AVAILABILITY ──────────────────────────────────────────────
369
- /**
370
- * @chunk-id APPS_CHECK_AVAILABILITY_1_0_0
371
- * @version 1.0.0
372
- * @hash db7d52bcb1002d923dac039a99e6f6fb0eb9889e9b4a44994bf7bb75477ac9a4
373
- * @macro App Availability Checker
374
- * @micro Checks if app is available for account via RPC
375
- * @inputs ctx: CoreContext — Request context with principal and database
376
- * @inputs body: any — Request body (unused for GET)
377
- * @outputs {available: boolean} — Availability status
378
- * @depends-on [createHandler]
379
- * @depended-by [Netlify function routing]
380
- * @side-effects [RPC call for availability check]
381
- * @tags apps, availability, rpc, check
382
- */
380
+ // CIL[END chunk_id="apps_remove_1783969696"]
381
+ // CIL[BEGIN chunk_id="apps_checkavailability_1783969696" type="function" identity="checkAvailability" parent="none"]
382
+ // CIL[DOC-MACRO purpose="Check if app slug is available"]
383
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate app slug uniqueness for account"]
384
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
385
+ // CIL[DOC-CONTRACT inputs="none" outputs="availability_boolean" errors="validation_errors,db_errors" side_effects="none"]
386
+ // CIL[DOC-MICRO logic_summary="Call stored procedure to check slug availability in account" notable_decisions="[]"]
387
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="rpc_behavior_not_mapped"]
388
+ // CIL[DOC-STABILITY stability="stable"]
389
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
390
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
391
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
392
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
393
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
394
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
383
395
  export const checkAvailability = createHandler(async (ctx, body) => {
384
396
  const { slug } = ctx.query || {}
385
397
 
@@ -401,23 +413,21 @@ export const checkAvailability = createHandler(async (ctx, body) => {
401
413
 
402
414
  return { available: data }
403
415
  })
404
- // ─── CHUNK_END: APPS_CHECK_AVAILABILITY ────────────────────────────────────────────────
405
-
406
- // ─── CHUNK_START: APPS_UPDATE_VERSION ──────────────────────────────────────────────
407
- /**
408
- * @chunk-id APPS_UPDATE_VERSION_1_0_0
409
- * @version 1.0.0
410
- * @hash 04a1a3367e4b8ca0f58e0719e73b0ccda378e84b4b874f3f7e07ee0faa423bfd
411
- * @macro App Version Update Handler
412
- * @micro Updates app version string via RPC with audit logging
413
- * @inputs ctx: CoreContext — Request context with principal and database
414
- * @inputs body: object — App ID and new version string
415
- * @outputs {success: true} — Success confirmation
416
- * @depends-on [createHandler, emitLog]
417
- * @depended-by [Netlify function routing]
418
- * @side-effects [RPC call, audit logging]
419
- * @tags apps, version, update, rpc, audit
420
- */
416
+ // CIL[END chunk_id="apps_checkavailability_1783969696"]
417
+ // CIL[BEGIN chunk_id="apps_updateversion_1783969696" type="function" identity="updateVersion" parent="none"]
418
+ // CIL[DOC-MACRO purpose="Update app version number"]
419
+ // CIL[DOC-RESPONSIBILITY responsibility="Change app version with audit logging"]
420
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
421
+ // CIL[DOC-CONTRACT inputs="none" outputs="success_status" errors="validation_errors,db_errors" side_effects="db_write,audit_log"]
422
+ // CIL[DOC-MICRO logic_summary="Call stored procedure to update version, log change" notable_decisions="[]"]
423
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="rpc_behavior_not_mapped"]
424
+ // CIL[DOC-STABILITY stability="stable"]
425
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
426
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
427
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
428
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
429
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
430
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
421
431
  export const updateVersion = createHandler(async (ctx, body) => {
422
432
  const { id, version } = body
423
433
 
@@ -437,25 +447,21 @@ export const updateVersion = createHandler(async (ctx, body) => {
437
447
 
438
448
  return { success: true }
439
449
  })
440
- // ─── CHUNK_END: APPS_UPDATE_VERSION ────────────────────────────────────────────────
441
-
442
- // ─── MAIN HANDLER ────────────────────────────────────────────────────────────
443
-
444
- // ─── CHUNK_START: APPS_HANDLER ──────────────────────────────────────────────
445
- /**
446
- * @chunk-id APPS_HANDLER_1_0_0
447
- * @version 1.0.0
448
- * @hash 361e1ba86b38a4611f3170526e4ff7f456d58b929c1d39bf847135afdebf3867
449
- * @macro Apps Router
450
- * @micro Routes HTTP methods and actions to appropriate handlers
451
- * @inputs ctx: CoreContext — Request context with principal and database
452
- * @inputs body: any — Request body for POST/PATCH operations
453
- * @outputs Varies — Depends on routed handler (list/get/create/update/remove/schema/available/version)
454
- * @depends-on [createHandler, list, get, getSchema, checkAvailability, create, update, remove, updateVersion]
455
- * @depended-by [Netlify function routing]
456
- * @side-effects [Delegates to appropriate handler]
457
- * @tags apps, router, crud, netlify-function
458
- */
450
+ // CIL[END chunk_id="apps_updateversion_1783969696"]
451
+ // CIL[BEGIN chunk_id="apps_handler_1783969696" type="function" identity="handler" parent="none"]
452
+ // CIL[DOC-MACRO purpose="Route HTTP methods to app functions"]
453
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch requests to appropriate app operations"]
454
+ // CIL[DOC-CONTEXT module="apps" layer="backend_functions" related_files="[]"]
455
+ // CIL[DOC-CONTRACT inputs="none" outputs="function_responses" errors="method_errors" side_effects="none"]
456
+ // CIL[DOC-MICRO logic_summary="Route based on HTTP method and query parameters to specific functions" notable_decisions="[]"]
457
+ // CIL[DOC-CONFIDENCE pass="second" score="0.97" flags="none"]
458
+ // CIL[DOC-STABILITY stability="stable"]
459
+ // CIL[DOC-VECTOR type="context" content="Layer: backend_functions. Direct callers: 0. Direct calls: 0. Related files: none."]
460
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
461
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
462
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
463
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
464
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
459
465
  export const handler = createHandler(async (ctx, body) => {
460
466
  const method = ctx.query?.method || 'GET'
461
467
 
@@ -486,4 +492,4 @@ export const handler = createHandler(async (ctx, body) => {
486
492
  throw new Error(`Unsupported method: ${method}`)
487
493
  }
488
494
  })
489
- // ─── CHUNK_END: APPS_HANDLER ────────────────────────────────────────────────
495
+ // CIL[END chunk_id="apps_handler_1783969696"]