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,3 +1,22 @@
1
+
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="index_module_header_1783931090" type="module_header" identity="imports" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import React and routing dependencies for admin app"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for admin interface"]
8
+ // CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
9
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and components" errors="Import failures" side_effects="Module loading"]
10
+ // CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, UI components, and layout" notable_decisions="[]"]
11
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
12
+ // CIL[DOC-STABILITY stability="stable"]
13
+ // CIL[DOC-AUDIENCE audience="developer"]
14
+ // CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
15
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
16
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
17
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
18
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
20
  import { lazy, Suspense } from 'react'
2
21
  import { Routes, Route, Navigate, useLocation } from 'react-router-dom'
3
22
  import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
@@ -6,8 +25,21 @@ import { useAuth } from '../../contexts/AuthContext'
6
25
  import { AppShell } from '../../components/layout/AppShell'
7
26
  import { AdminSidebar } from '../../components/admin/AdminSidebar'
8
27
  import { TooltipProvider } from '../../components/ui/tooltip'
9
-
10
- // Config list pages
28
+ // CIL[END chunk_id="index_module_header_1783931090"]
29
+ // CIL[BEGIN chunk_id="index_lazy_imports_1783931090" type="lazy_imports" identity="lazy_imports" parent="none"]
30
+ // CIL[DOC-MACRO purpose="Lazy load all admin pages and components for code splitting"]
31
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage lazy imports for admin interface pages and components"]
32
+ // CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
33
+ // CIL[DOC-CONTRACT inputs="none" outputs="Lazy-loaded page components" errors="Module loading failures" side_effects="Dynamic imports"]
34
+ // CIL[DOC-MICRO logic_summary="Creates lazy imports for all admin pages, runtime components, and test pages" notable_decisions="['extensive_lazy_loading', 'then_default_extraction']"]
35
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
36
+ // CIL[DOC-STABILITY stability="stable"]
37
+ // CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
38
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
39
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
40
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
41
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
42
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
11
43
  const TypesPage = lazy(() => import('../../pages/admin/TypesPage').then(m => ({ default: m.TypesPage })))
12
44
  const AppsPage = lazy(() => import('../../pages/admin/AppsPage').then(m => ({ default: m.AppsPage })))
13
45
  const TypeDetailPage = lazy(() => import('../../pages/admin/TypeDetailPage').then(m => ({ default: m.TypeDetailPage })))
@@ -17,8 +49,6 @@ const AIAgentsPage = lazy(() => import('../../pages/admin/AIAgentsPage').then(m
17
49
  const EmbeddingsPage = lazy(() => import('../../pages/admin/EmbeddingsPage').then(m => ({ default: m.EmbeddingsPage })))
18
50
  const TimersPage = lazy(() => import('../../pages/admin/TimersPage').then(m => ({ default: m.TimersPage })))
19
51
  const IntegrationsPage = lazy(() => import('../../pages/admin/IntegrationsPage').then(m => ({ default: m.IntegrationsPage })))
20
-
21
- // Config detail pages
22
52
  const AppDetailPage = lazy(() => import('../../pages/admin/AppDetailPage').then(m => ({ default: m.AppDetailPage })))
23
53
  const PipelineDetailPage = lazy(() => import('../../pages/admin/PipelineDetailPage').then(m => ({ default: m.PipelineDetailPage })))
24
54
  const TriggerDetailPage = lazy(() => import('../../pages/admin/TriggerDetailPage').then(m => ({ default: m.TriggerDetailPage })))
@@ -32,21 +62,14 @@ const PromptConfigsPage = lazy(() => import('../../pages/admin/PromptConfigsPage
32
62
  const PromptConfigDetailPage = lazy(() => import('../../pages/admin/PromptConfigDetailPage').then(m => ({ default: m.PromptConfigDetailPage })))
33
63
  const APIKeysPage = lazy(() => import('../../pages/admin/APIKeysPage').then(m => ({ default: m.APIKeysPage })))
34
64
  const APIKeyDetailPage = lazy(() => import('../../pages/admin/APIKeyDetailPage').then(m => ({ default: m.APIKeyDetailPage })))
35
-
36
- // Access pages
65
+ const DeliveriesPage = lazy(() => import('../../pages/admin/DeliveriesPage').then(m => ({ default: m.DeliveriesPage })))
37
66
  const InvitesPage = lazy(() => import('../../pages/admin/InvitesPage').then(m => ({ default: m.InvitesPage })))
38
-
39
- // Observability pages
40
67
  const ObservabilityDashboard = lazy(() => import('../../pages/admin/ObservabilityDashboard').then(m => ({ default: m.ObservabilityDashboard })))
41
68
  const PipelineExecutionsPage = lazy(() => import('../../pages/admin/PipelineExecutionsPage').then(m => ({ default: m.PipelineExecutionsPage })))
42
69
  const LogsPage = lazy(() => import('../../pages/admin/LogsPage').then(m => ({ default: m.LogsPage })))
43
70
  const AlertsConfigPage = lazy(() => import('../../pages/admin/AlertsConfigPage').then(m => ({ default: m.AlertsConfigPage })))
44
-
45
- // Runtime data pages (unified)
46
71
  const DataListPage = lazy(() => import('../../components/runtime/DataListPage').then(m => ({ default: m.DataListPage })))
47
72
  const DataDetailPage = lazy(() => import('../../components/runtime/DataDetailPage').then(m => ({ default: m.DataDetailPage })))
48
-
49
- // Testing pages
50
73
  const TestingDashboard = lazy(() => import('../../pages/admin/TestingDashboard'))
51
74
  const TestRunDetailPage = lazy(() => import('../../pages/admin/TestRunDetailPage').then(m => ({ default: m.TestRunDetailPage })))
52
75
  const ShadcnTestPage = lazy(() => import('../../pages/admin/ShadcnTestPage').then(m => ({ default: m.ShadcnTestPage })))
@@ -58,19 +81,40 @@ const DesignedPage = lazy(() => import('../../pages/admin/DesignedPage').then(m
58
81
  const ProperlyDesignedPage = lazy(() => import('../../pages/admin/ProperlyDesignedPage').then(m => ({ default: m.ProperlyDesignedPage })))
59
82
  const IntegratedDashboard = lazy(() => import('../../pages/admin/IntegratedDashboard').then(m => ({ default: m.IntegratedDashboard })))
60
83
  const SimpleDashboard = lazy(() => import('../../pages/admin/SimpleDashboard').then(m => ({ default: m.SimpleDashboard })))
61
-
84
+ const CILProjectsPage = lazy(() => import('../../pages/admin/cil/CILProjectsPage'))
85
+ const KBAdminPage = lazy(() => import('../../pages/admin/kb/KBAdminPage').then(m => ({ default: m.KBAdminPage })))
86
+ const CILDashboardPage = lazy(() => import('../../pages/admin/cil/CILDashboardPage'))
87
+ const CILSearchPage = lazy(() => import('../../pages/admin/cil/CILSearchPage'))
88
+ const CILAgentPage = lazy(() => import('../../pages/admin/cil/CILAgentPage'))
89
+ const CILFileListPage = lazy(() => import('../../pages/admin/cil/CILFileListPage'))
90
+ const CILGraphPage = lazy(() => import('../../pages/admin/cil/CILGraphPage'))
91
+ const CILIngestionPage = lazy(() => import('../../pages/admin/cil/CILIngestionPage'))
92
+ const CILChunkDetailPage = lazy(() => import('../../pages/admin/cil/CILChunkDetailPage'))
93
+ const FlexiblePipelinePage = lazy(() => import('../../pages/admin/cil/FlexiblePipelinePage'))
94
+ // CIL[END chunk_id="index_lazy_imports_1783931090"]
95
+ // CIL[BEGIN chunk_id="index_adminroutes_1783931090" type="function" identity="AdminRoutes" parent="none"]
96
+ // CIL[DOC-MACRO purpose="Define all admin routes with breadcrumbs and navigation"]
97
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage admin routing, breadcrumbs, and page layout"]
98
+ // CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
99
+ // CIL[DOC-CONTRACT inputs="none" outputs="Admin routes with navigation" errors="Route failures" side_effects="Navigation, page rendering"]
100
+ // CIL[DOC-MICRO logic_summary="Builds breadcrumbs, defines extensive admin routes, handles legacy redirects" notable_decisions="['breadcrumb_generation', 'legacy_route_redirects']"]
101
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
102
+ // CIL[DOC-STABILITY stability="stable"]
103
+ // CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
104
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
105
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
106
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
107
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
108
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
62
109
  function AdminRoutes() {
63
110
  const location = useLocation()
64
111
 
65
- // Build breadcrumbs from current path
66
112
  const pathSegments = location.pathname.split('/').filter(Boolean)
67
113
  const breadcrumbs: { title: string; url?: string }[] = [{ title: 'Spine', url: '/dashboard' }]
68
114
 
69
- // Add admin section
70
115
  if (pathSegments.includes('admin')) {
71
116
  breadcrumbs.push({ title: 'Admin', url: '/spine-framework/admin' })
72
117
 
73
- // Add subsection
74
118
  const section = pathSegments[2]
75
119
  if (section) {
76
120
  breadcrumbs.push({ title: section.charAt(0).toUpperCase() + section.slice(1) })
@@ -84,11 +128,9 @@ function AdminRoutes() {
84
128
  >
85
129
  <Suspense fallback={<div className="min-h-[400px] flex items-center justify-center"><LoadingSpinner /></div>}>
86
130
  <Routes>
87
- {/* Default redirect → configs */}
88
131
  <Route index element={<Navigate to="configs/types" replace />} />
89
132
  <Route path="dashboard" element={<Navigate to="configs/types" replace />} />
90
133
 
91
- {/* Configs section */}
92
134
  <Route path="configs/types/new" element={<TypeDetailPage />} />
93
135
  <Route path="configs/types/:id" element={<TypeDetailPage />} />
94
136
  <Route path="configs/types" element={<TypesPage />} />
@@ -104,9 +146,6 @@ function AdminRoutes() {
104
146
  <Route path="configs/ai-agents/new" element={<AIAgentDetailPage />} />
105
147
  <Route path="configs/ai-agents/:id" element={<AIAgentDetailPage />} />
106
148
  <Route path="configs/ai-agents" element={<AIAgentsPage />} />
107
- <Route path="configs/embeddings/new" element={<EmbeddingDetailPage />} />
108
- <Route path="configs/embeddings/:id" element={<EmbeddingDetailPage />} />
109
- <Route path="configs/embeddings" element={<EmbeddingsPage />} />
110
149
  <Route path="configs/timers/new" element={<TimerDetailPage />} />
111
150
  <Route path="configs/timers/:id" element={<TimerDetailPage />} />
112
151
  <Route path="configs/timers" element={<TimersPage />} />
@@ -122,11 +161,10 @@ function AdminRoutes() {
122
161
  <Route path="configs/api-keys/new" element={<APIKeyDetailPage />} />
123
162
  <Route path="configs/api-keys/:id" element={<APIKeyDetailPage />} />
124
163
  <Route path="configs/api-keys" element={<APIKeysPage />} />
164
+ <Route path="configs/deliveries" element={<DeliveriesPage />} />
125
165
 
126
- {/* Access section */}
127
166
  <Route path="access/invites" element={<InvitesPage />} />
128
167
 
129
- {/* Observability section */}
130
168
  <Route path="observability" element={<ObservabilityDashboard />} />
131
169
  <Route path="observability/dashboard" element={<ObservabilityDashboard />} />
132
170
  <Route path="observability/alerts" element={<AlertsConfigPage />} />
@@ -134,7 +172,6 @@ function AdminRoutes() {
134
172
  <Route path="observability/executions" element={<PipelineExecutionsPage />} />
135
173
  <Route path="observability/logs" element={<LogsPage />} />
136
174
 
137
- {/* Testing section */}
138
175
  <Route path="testing/:run_id" element={<TestRunDetailPage />} />
139
176
  <Route path="testing" element={<TestingDashboard />} />
140
177
  <Route path="test/ui" element={<ShadcnTestPage />} />
@@ -147,12 +184,30 @@ function AdminRoutes() {
147
184
  <Route path="test/integrated" element={<IntegratedDashboard />} />
148
185
  <Route path="test/simple" element={<SimpleDashboard />} />
149
186
 
150
- {/* Runtime Data - Unified entity management */}
151
187
  <Route path="runtime/:entity" element={<DataListPage />} />
152
188
  <Route path="runtime/:entity/new" element={<DataDetailPage />} />
153
189
  <Route path="runtime/:entity/:id" element={<DataDetailPage />} />
154
190
 
155
- {/* Legacy data routes - redirect to runtime routes */}
191
+ <Route path="cil" element={<CILProjectsPage />} />
192
+ <Route path="cil/search" element={<CILSearchPage />} />
193
+ <Route path="cil/agent" element={<CILAgentPage />} />
194
+ <Route path="cil/:id" element={<CILDashboardPage />} />
195
+ <Route path="cil/:id/dashboard" element={<CILDashboardPage />} />
196
+ <Route path="cil/:id/files" element={<CILFileListPage />} />
197
+ <Route path="cil/:id/graph" element={<CILGraphPage />} />
198
+ <Route path="cil/:id/agent" element={<CILAgentPage />} />
199
+ <Route path="cil/:id/ingest" element={<CILIngestionPage />} />
200
+ <Route path="cil/:id/flexible" element={<FlexiblePipelinePage />} />
201
+ <Route path="cil/:id/chunks/:chunkId" element={<CILChunkDetailPage />} />
202
+ <Route path="cil/chunks/:chunkId" element={<CILChunkDetailPage />} />
203
+
204
+ <Route path="kb/embeddings/:id" element={<EmbeddingDetailPage />} />
205
+ <Route path="kb/embeddings" element={<EmbeddingsPage />} />
206
+ <Route path="kb/:typeSlug" element={<KBAdminPage />} />
207
+ <Route path="kb/:typeSlug/new" element={<KBAdminPage mode="new" />} />
208
+ <Route path="kb/:typeSlug/:id" element={<KBAdminPage mode="view" />} />
209
+ <Route path="kb/:typeSlug/:id/edit" element={<KBAdminPage mode="edit" />} />
210
+
156
211
  <Route path="data/:entity" element={<Navigate to="../runtime/:entity" replace />} />
157
212
  <Route path="data/:entity/create" element={<Navigate to="../runtime/:entity/new" replace />} />
158
213
  <Route path="data/:entity/:id" element={<Navigate to="../runtime/:entity/:id" replace />} />
@@ -163,7 +218,21 @@ function AdminRoutes() {
163
218
  </AppShell>
164
219
  )
165
220
  }
166
-
221
+ // CIL[END chunk_id="index_adminroutes_1783931090"]
222
+ // CIL[BEGIN chunk_id="index_adminapp_1783931090" type="function" identity="AdminApp" parent="none"]
223
+ // CIL[DOC-MACRO purpose="Admin app entry point with system admin access control"]
224
+ // CIL[DOC-RESPONSIBILITY responsibility="Gate admin access and provide tooltip context"]
225
+ // CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
226
+ // CIL[DOC-CONTRACT inputs="none" outputs="Protected admin interface" errors="Access denied" side_effects="Navigation, tooltip context"]
227
+ // CIL[DOC-MICRO logic_summary="Checks system admin role, redirects unauthorized users, wraps routes" notable_decisions="['role_based_access', 'tooltip_provider_wrapper']"]
228
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
229
+ // CIL[DOC-STABILITY stability="stable"]
230
+ // CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
231
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
232
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
233
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
234
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
235
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
167
236
  export default function AdminApp() {
168
237
  const { user } = useAuth()
169
238
 
@@ -177,3 +246,4 @@ export default function AdminApp() {
177
246
  </TooltipProvider>
178
247
  )
179
248
  }
249
+ // CIL[END chunk_id="index_adminapp_1783931090"]
@@ -1,29 +1,68 @@
1
+
2
+
3
+
4
+ // CIL[BEGIN chunk_id="AppWrapper_module_header_1783931090" type="module_header" identity="imports" parent="none"]
5
+ // CIL[DOC-MACRO purpose="Import React and context dependencies for app wrapper"]
6
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for app wrapper component"]
7
+ // CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
8
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and types" errors="Import failures" side_effects="Module loading"]
9
+ // CIL[DOC-MICRO logic_summary="Imports React, routing, auth context, app context, and app types" notable_decisions="[]"]
10
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
11
+ // CIL[DOC-STABILITY stability="stable"]
12
+ // CIL[DOC-AUDIENCE audience="developer"]
13
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/CoursesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
15
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
16
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
17
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
18
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
19
  import React from 'react'
2
20
  import { Navigate } from 'react-router-dom'
3
21
  import { useAuth } from '../contexts/AuthContext'
4
22
  import { AppProvider } from '../contexts/AppContext'
5
23
  import { AppRecord } from '../hooks/useApps'
6
-
24
+ // CIL[END chunk_id="AppWrapper_module_header_1783931090"]
25
+ // CIL[BEGIN chunk_id="AppWrapper_interface_1783931090" type="interface" identity="AppWrapperProps" parent="none"]
26
+ // CIL[DOC-MACRO purpose="Define props interface for AppWrapper component"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for app wrapper properties"]
28
+ // CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
29
+ // CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
30
+ // CIL[DOC-MICRO logic_summary="Defines app record and children props for wrapper component" notable_decisions="[]"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
32
+ // CIL[DOC-STABILITY stability="stable"]
33
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
34
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
35
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
36
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
37
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
38
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
7
39
  interface AppWrapperProps {
8
40
  app: AppRecord
9
41
  children: React.ReactNode
10
42
  }
11
-
12
- /**
13
- * Shared wrapper for all apps. Provides:
14
- * - Auth gate: redirects to /login if unauthenticated
15
- * - Role gate: shows 403 if user lacks app's min_role
16
- * - App context: makes app record available via useCurrentApp()
17
- */
43
+ // CIL[END chunk_id="AppWrapper_interface_1783931090"]
44
+ // CIL[BEGIN chunk_id="AppWrapper_appwrapper_1783931090" type="function" identity="AppWrapper" parent="none"]
45
+ // CIL[DOC-LEARNING topic="AppWrapper:role_gate" content="Access is denied unless user.roles includes system_admin or intersects app.required_roles. Missing roles in public.roles produce an Access Denied page even when the app is otherwise routable."]
46
+ // CIL[DOC-MACRO purpose="Wrapper component providing auth gates and app context"]
47
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle authentication, role checking, and app context provision"]
48
+ // CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"\\\"]"]
49
+ // CIL[DOC-CONTRACT inputs="none" outputs="Protected app content" errors="Access denied" side_effects="Navigation, context provision"]
50
+ // CIL[DOC-MICRO logic_summary="Auth gate, role validation, access denied UI, app context wrapper" notable_decisions="['role_based_access', 'fallback_to_min_role']"]
51
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
52
+ // CIL[DOC-STABILITY stability="stable"]
53
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/layout/Sidebar.tsx, \."]
54
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
55
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
56
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
57
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
59
  export function AppWrapper({ app, children }: AppWrapperProps) {
19
60
  const { user } = useAuth()
20
61
 
21
- // Auth gate
22
62
  if (!user) {
23
63
  return <Navigate to="/login" replace />
24
64
  }
25
65
 
26
- // Role gate — check required_roles array (preferred) or min_role (fallback)
27
66
  const requiredRoles: string[] = app.required_roles?.length
28
67
  ? app.required_roles
29
68
  : app.min_role ? [app.min_role] : []
@@ -52,10 +91,10 @@ export function AppWrapper({ app, children }: AppWrapperProps) {
52
91
  }
53
92
  }
54
93
 
55
- // App context
56
94
  return (
57
95
  <AppProvider app={app}>
58
96
  {children}
59
97
  </AppProvider>
60
98
  )
61
99
  }
100
+ // CIL[END chunk_id="AppWrapper_appwrapper_1783931090"]
@@ -1,9 +1,44 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ // CIL[BEGIN chunk_id="CustomAppLoader_module_header_1783931090" type="module_header" identity="imports" parent="none"]
10
+ // CIL[DOC-MACRO purpose="Import React components and utilities for custom app loading"]
11
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for app loader"]
12
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
13
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and types" errors="Import failures" side_effects="Module loading"]
14
+ // CIL[DOC-MICRO logic_summary="Imports React hooks, lazy loading, error boundary, and UI components" notable_decisions="[]"]
15
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
16
+ // CIL[DOC-STABILITY stability="stable"]
17
+ // CIL[DOC-AUDIENCE audience="developer"]
18
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/components/ui/dialog.tsx, \."]
19
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
20
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
21
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
22
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
23
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
24
  import React, { lazy, Suspense, Component } from 'react'
2
25
  import type { ReactNode } from 'react'
3
26
  import { LoadingSpinner } from './ui/LoadingSpinner'
4
-
5
- // ─── ERROR BOUNDARY ───────────────────────────────────────────────────────────
6
-
27
+ // CIL[END chunk_id="CustomAppLoader_module_header_1783931090"]
28
+ // CIL[BEGIN chunk_id="CustomAppLoader_error_boundary_interfaces_1783931090" type="interfaces" identity="error_boundary_interfaces" parent="none"]
29
+ // CIL[DOC-MACRO purpose="Define interfaces for error boundary component"]
30
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definitions for error boundary props and state"]
31
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
32
+ // CIL[DOC-CONTRACT inputs="none" outputs="Type interfaces" errors="none" side_effects="none"]
33
+ // CIL[DOC-MICRO logic_summary="Defines props with slug and children, state with error tracking" notable_decisions="[]"]
34
+ // CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
35
+ // CIL[DOC-STABILITY stability="stable"]
36
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
37
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
38
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
39
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
40
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
7
42
  interface ErrorBoundaryProps {
8
43
  slug: string
9
44
  children: ReactNode
@@ -12,7 +47,21 @@ interface ErrorBoundaryProps {
12
47
  interface ErrorBoundaryState {
13
48
  error: Error | null
14
49
  }
15
-
50
+ // CIL[END chunk_id="CustomAppLoader_error_boundary_interfaces_1783931090"]
51
+ // CIL[BEGIN chunk_id="CustomAppLoader_apperrorboundary_1783931090" type="class" identity="AppErrorBoundary" parent="none"]
52
+ // CIL[DOC-MACRO purpose="Error boundary component to catch and display app loading errors"]
53
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle app loading failures with user-friendly error display"]
54
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
55
+ // CIL[DOC-CONTRACT inputs="none" outputs="Error UI or children" errors="App loading failures" side_effects="Error state management"]
56
+ // CIL[DOC-MICRO logic_summary="Catches errors, displays error UI with app slug and error details" notable_decisions="['error_boundary_pattern', 'user_friendly_errors']"]
57
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
58
+ // CIL[DOC-STABILITY stability="stable"]
59
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/components/ui/dialog.tsx, \."]
60
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
61
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
62
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
63
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
16
65
  class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
17
66
  constructor(props: ErrorBoundaryProps) {
18
67
  super(props)
@@ -51,33 +100,68 @@ class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState>
51
100
  return this.props.children
52
101
  }
53
102
  }
54
-
55
- // ─── LOADER ───────────────────────────────────────────────────────────────────
56
-
57
- // Static glob maps — Vite analyzes these at build time and builds a complete
58
- // module map. Runtime lookup is just a map key lookup, no dynamic string eval.
59
- // Custom apps take precedence over core apps with the same slug.
103
+ // CIL[END chunk_id="CustomAppLoader_apperrorboundary_1783931090"]
104
+ // CIL[BEGIN chunk_id="CustomAppLoader_loader_setup_1783931090" type="loader_setup" identity="loader_setup" parent="none"]
105
+ // CIL[DOC-MACRO purpose="Set up module glob patterns and cache for app loading"]
106
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure module discovery and caching for apps"]
107
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
108
+ // CIL[DOC-CONTRACT inputs="none" outputs="Module globs and cache map" errors="none" side_effects="Module resolution"]
109
+ // CIL[DOC-MICRO logic_summary="Defines custom and core app module patterns, creates component cache" notable_decisions="['glob_patterns', 'module_caching']"]
110
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
111
+ // CIL[DOC-STABILITY stability="stable"]
112
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, \."]
113
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
114
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
115
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
116
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
117
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
60
118
  const customAppModules = import.meta.glob('../../../custom/apps/*/index.tsx')
61
119
  const coreAppModules = import.meta.glob('../apps/*/index.tsx')
62
120
 
63
- // Module-level cache for lazy components to avoid re-creating on each render
64
121
  const appModuleCache = new Map<string, React.LazyExoticComponent<React.ComponentType>>()
65
-
66
- // Resolve the glob key for a given slug from the custom or core map.
122
+ // CIL[END chunk_id="CustomAppLoader_loader_setup_1783931090"]
123
+ // CIL[BEGIN chunk_id="CustomAppLoader_resolveapploader_1783931090" type="function" identity="resolveAppLoader" parent="none"]
124
+ // CIL[DOC-LEARNING topic="CustomAppLoader:slug_folder_match" content="CustomAppLoader resolves custom/apps/{slug}/index.tsx from the DB apps.slug. The slug must match the filesystem folder name or the lazy import will reject with 'App not found'."]
125
+ // CIL[DOC-MACRO purpose="Resolve app slug to module loader function"]
126
+ // CIL[DOC-RESPONSIBILITY responsibility="Map app slug to appropriate module loader"]
127
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
128
+ // CIL[DOC-CONTRACT inputs="none" outputs="loader function or null" errors="none" side_effects="none"]
129
+ // CIL[DOC-MICRO logic_summary="Checks custom apps first, falls back to core apps, returns loader" notable_decisions="['custom_priority', 'fallback_pattern']"]
130
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
131
+ // CIL[DOC-STABILITY stability="stable"]
132
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
133
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
134
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
135
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
136
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
137
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
67
138
  function resolveAppLoader(slug: string): (() => Promise<{ default: React.ComponentType }>) | null {
68
- // Check custom first (custom/apps/{slug}/index.tsx)
69
139
  const customKey = `../../../custom/apps/${slug}/index.tsx`
70
140
  if (customAppModules[customKey]) {
71
141
  return customAppModules[customKey] as () => Promise<{ default: React.ComponentType }>
72
142
  }
73
- // Fall back to core (../apps/{slug}/index.tsx relative to this file)
74
143
  const coreKey = `../apps/${slug}/index.tsx`
75
144
  if (coreAppModules[coreKey]) {
76
145
  return coreAppModules[coreKey] as () => Promise<{ default: React.ComponentType }>
77
146
  }
78
147
  return null
79
148
  }
80
-
149
+ // CIL[END chunk_id="CustomAppLoader_resolveapploader_1783931090"]
150
+ // CIL[BEGIN chunk_id="CustomAppLoader_getappcomponent_1783931090" type="function" identity="getAppComponent" parent="none"]
151
+ // CIL[DOC-NOTE type="caution" content="import.meta.glob is resolved at Vite startup; adding or renaming a custom app folder requires running npm run assemble and restarting the dev server before CustomAppLoader can discover it."]
152
+ // CIL[DOC-MACRO purpose="Get or create cached lazy component for app slug"]
153
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage lazy component creation and caching"]
154
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
155
+ // CIL[DOC-CONTRACT inputs="none" outputs="Lazy component" errors="App not found" side_effects="Cache updates"]
156
+ // CIL[DOC-MICRO logic_summary="Checks cache, creates lazy component, caches result, handles missing apps" notable_decisions="['lazy_component_creation', 'error_rejection']"]
157
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
158
+ // CIL[DOC-STABILITY stability="stable"]
159
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
160
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
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"]
81
165
  function getAppComponent(slug: string): React.LazyExoticComponent<React.ComponentType> {
82
166
  if (!appModuleCache.has(slug)) {
83
167
  const loader = resolveAppLoader(slug)
@@ -90,15 +174,39 @@ function getAppComponent(slug: string): React.LazyExoticComponent<React.Componen
90
174
  }
91
175
  return appModuleCache.get(slug)!
92
176
  }
93
-
177
+ // CIL[END chunk_id="CustomAppLoader_getappcomponent_1783931090"]
178
+ // CIL[BEGIN chunk_id="CustomAppLoader_interface_1783931090" type="interface" identity="CustomAppLoaderProps" parent="none"]
179
+ // CIL[DOC-MACRO purpose="Define props interface for CustomAppLoader component"]
180
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for custom app loader properties"]
181
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
182
+ // CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
183
+ // CIL[DOC-MICRO logic_summary="Defines slug prop for app identification" notable_decisions="[]"]
184
+ // CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
185
+ // CIL[DOC-STABILITY stability="stable"]
186
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
187
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
188
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
189
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
190
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
191
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
94
192
  interface CustomAppLoaderProps {
95
193
  slug: string
96
194
  }
97
-
98
- /**
99
- * Lazy-loads a custom app component from apps/{slug}/index.tsx.
100
- * Wraps in an error boundary so a broken app doesn't crash the entire site.
101
- */
195
+ // CIL[END chunk_id="CustomAppLoader_interface_1783931090"]
196
+ // CIL[BEGIN chunk_id="CustomAppLoader_customapploader_1783931090" type="function" identity="CustomAppLoader" parent="none"]
197
+ // CIL[DOC-MACRO purpose="Main component for lazy-loading custom apps with error handling"]
198
+ // CIL[DOC-RESPONSIBILITY responsibility="Wrap app component in error boundary and suspense for loading"]
199
+ // CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
200
+ // CIL[DOC-CONTRACT inputs="none" outputs="Loaded app component" errors="App loading failures" side_effects="Lazy loading, error handling"]
201
+ // CIL[DOC-MICRO logic_summary="Gets cached component, wraps in error boundary and suspense" notable_decisions="['error_boundary_wrapping', 'suspense_fallback']"]
202
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
203
+ // CIL[DOC-STABILITY stability="stable"]
204
+ // CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
205
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
206
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
207
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
208
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
209
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
102
210
  export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
103
211
  const AppComponent = getAppComponent(slug)
104
212
 
@@ -114,3 +222,4 @@ export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
114
222
  </AppErrorBoundary>
115
223
  )
116
224
  }
225
+ // CIL[END chunk_id="CustomAppLoader_customapploader_1783931090"]