spine-framework 0.3.145 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5067 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,61 +1,53 @@
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"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/AppWrapper.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/AppWrapper.tsx:file"]
2
+ // CIL[DOC-MACRO purpose="AppWrapper component module that guards child apps with authentication and role checks"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Import dependencies and set up the AppWrapper component that wraps an app with authentication and authorization checks"]
4
+ // CIL[DOC-CONTEXT module="components" layer="presentation" related_files=".framework/src/contexts/AppContext.tsx,.framework/src/contexts/AuthContext.tsx,.framework/src/hooks/useApps.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="React, useAuth, AppProvider, AppRecord, AppWrapperProps, and AppWrapper bindings available to the module" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports React router, authentication and app context dependencies, and the AppRecord type for use by AppWrapper" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.85" flags="none"]
11
8
  // 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"]
9
+ // CIL[DOC-AUDIENCE audience="frontend"]
19
10
  import React from 'react'
20
11
  import { Navigate } from 'react-router-dom'
21
12
  import { useAuth } from '../contexts/AuthContext'
22
13
  import { AppProvider } from '../contexts/AppContext'
23
14
  import { AppRecord } from '../hooks/useApps'
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."]
15
+ // CIL[DOC-VECTOR type="context" content="purpose='AppWrapper component module that guards child apps with authentication and role checks'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx,.framework/src/contexts/AppContext.tsx,.framework/src/hooks/useApps.ts"]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
17
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
18
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
37
19
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
38
20
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
21
+ // CIL[END stable_id="~/.framework/src/components/AppWrapper.tsx:module_header:module_header"]
22
+
23
+ // CIL[BEGIN stable_id="~/.framework/src/components/AppWrapper.tsx:appwrapperprops:interface" type="interface" identity="appwrapperprops" parent="~/.framework/src/components/AppWrapper.tsx:module_header:module_header"]
24
+ // CIL[DOC-MACRO purpose="Defines the props contract for the AppWrapper component"]
25
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare the app record and children accepted by AppWrapper"]
26
+ // CIL[DOC-CONTEXT module="components" layer="presentation" related_files=".framework/src/components/AppWrapper.tsx,.framework/src/contexts/AppContext.tsx,.framework/src/contexts/AuthContext.tsx,.framework/src/hooks/useApps.ts"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="AppWrapperProps interface type" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="TypeScript interface describing app and children props" notable_decisions="[]"]
29
+ // CIL[DOC-CONFIDENCE pass="second" score="0.85" flags="none"]
30
+ // CIL[DOC-STABILITY stability="stable"]
39
31
  interface AppWrapperProps {
40
32
  app: AppRecord
41
33
  children: React.ReactNode
42
34
  }
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."]
35
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the props contract for the AppWrapper component'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx,.framework/src/contexts/AppContext.tsx,.framework/src/hooks/useApps.ts"]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
37
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
38
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
57
39
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
40
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
41
+ // CIL[END stable_id="~/.framework/src/components/AppWrapper.tsx:appwrapperprops:interface"]
42
+
43
+ // CIL[BEGIN stable_id="~/.framework/src/components/AppWrapper.tsx:appwrapper:function" type="function" identity="appwrapper" parent="~/.framework/src/components/AppWrapper.tsx:module_header:module_header"]
44
+ // CIL[DOC-MACRO purpose="Renders an app wrapper that enforces authentication and role-based access before rendering children"]
45
+ // CIL[DOC-RESPONSIBILITY responsibility="Guard access to an app by verifying a user is authenticated and has a required role"]
46
+ // CIL[DOC-CONTEXT module="components" layer="presentation" related_files=".framework/src/components/AppWrapper.tsx,.framework/src/contexts/AppContext.tsx,.framework/src/contexts/AuthContext.tsx,.framework/src/hooks/useApps.ts"]
47
+ // CIL[DOC-CONTRACT inputs="{ app, children }: AppWrapperProps" outputs="JSX.Element" errors="none" side_effects="Navigates to /login when unauthenticated; renders an access-denied view when roles are missing"]
48
+ // CIL[DOC-MICRO logic_summary="Reads the current user from useAuth, redirects to login when missing, computes required roles from app metadata, and renders an access-denied screen or the wrapped children inside AppProvider" notable_decisions="[]"]
49
+ // CIL[DOC-CONFIDENCE pass="second" score="0.85" flags="none"]
50
+ // CIL[DOC-STABILITY stability="stable"]
59
51
  export function AppWrapper({ app, children }: AppWrapperProps) {
60
52
  const { user } = useAuth()
61
53
 
@@ -97,4 +89,10 @@ export function AppWrapper({ app, children }: AppWrapperProps) {
97
89
  </AppProvider>
98
90
  )
99
91
  }
100
- // CIL[END chunk_id="AppWrapper_appwrapper_1783931090"]
92
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders an app wrapper that enforces authentication and role-based access before rendering children'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx,.framework/src/contexts/AppContext.tsx,.framework/src/hooks/useApps.ts"]
93
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
94
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
95
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
96
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
97
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
98
+ // CIL[END stable_id="~/.framework/src/components/AppWrapper.tsx:appwrapper:function"]
@@ -1,67 +1,70 @@
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"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Defines the CustomAppLoader component module imports and public entry point for lazy-loading custom and core apps."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Import runtime dependencies and expose the lazy application loader."]
4
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/ui/LoadingSpinner.tsx"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="React, lazy, Suspense, Component, ReactNode, and LoadingSpinner imports are gathered at the top of the module." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
16
8
  // 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"]
9
+ // CIL[DOC-AUDIENCE audience="framework-developer"]
24
10
  import React, { lazy, Suspense, Component } from 'react'
25
11
  import type { ReactNode } from 'react'
26
12
  import { LoadingSpinner } from './ui/LoadingSpinner'
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."]
13
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the CustomAppLoader component module imports and public entry point for lazy-loading custom and core apps.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
14
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
15
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
16
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
40
17
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
18
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
19
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
20
+
21
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:errorboundaryprops:interface" type="interface" identity="errorboundaryprops" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
22
+ // CIL[DOC-MACRO purpose="Props contract for the AppErrorBoundary React class component."]
23
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare the error boundary's expected inputs: slug and children."]
24
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
25
+ // CIL[DOC-CONTRACT inputs="slug: string, children: ReactNode" outputs="none" errors="none" side_effects="none"]
26
+ // CIL[DOC-MICRO logic_summary="Interface describing the properties consumed by the error boundary." notable_decisions="[]"]
27
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
28
+ // CIL[DOC-STABILITY stability="stable"]
42
29
  interface ErrorBoundaryProps {
43
30
  slug: string
44
31
  children: ReactNode
45
32
  }
33
+ // CIL[DOC-VECTOR type="context" content="purpose='Props contract for the AppErrorBoundary React class component.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
34
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
35
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
36
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
37
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
38
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
39
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:errorboundaryprops:interface"]
46
40
 
41
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:errorboundarystate:interface" type="interface" identity="errorboundarystate" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
42
+ // CIL[DOC-MACRO purpose="State contract for the AppErrorBoundary component."]
43
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare the single error field maintained by the error boundary."]
44
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
45
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
46
+ // CIL[DOC-MICRO logic_summary="Defines the error state shape used by the class component." notable_decisions="[]"]
47
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
48
+ // CIL[DOC-STABILITY stability="stable"]
47
49
  interface ErrorBoundaryState {
48
50
  error: Error | null
49
51
  }
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."]
52
+ // CIL[DOC-VECTOR type="context" content="purpose='State contract for the AppErrorBoundary component.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
53
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
54
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
55
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
63
56
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
57
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:errorboundarystate:interface"]
59
+
60
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:apperrorboundary:class" type="class" identity="apperrorboundary" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
61
+ // CIL[DOC-MACRO purpose="React error boundary that renders a friendly error screen when a lazily loaded app fails."]
62
+ // CIL[DOC-RESPONSIBILITY responsibility="Catch runtime errors in child subtrees and display the app slug and error message."]
63
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
64
+ // CIL[DOC-CONTRACT inputs="slug: string, children: ReactNode (via props)" outputs="JSX.Element | ReactNode" errors="none" side_effects="Renders a fallback error UI."]
65
+ // CIL[DOC-MICRO logic_summary="Stores error in state, derives fallback JSX from error.message and slug, otherwise renders children." notable_decisions="[]"]
66
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
67
+ // CIL[DOC-STABILITY stability="stable"]
65
68
  class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
66
69
  constructor(props: ErrorBoundaryProps) {
67
70
  super(props)
@@ -100,68 +103,101 @@ class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState>
100
103
  return this.props.children
101
104
  }
102
105
  }
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."]
106
+ // CIL[DOC-VECTOR type="context" content="purpose='React error boundary that renders a friendly error screen when a lazily loaded app fails.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
107
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
108
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
109
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
116
110
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
117
111
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
112
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:apperrorboundary:class"]
113
+
114
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:customappmodules:constant" type="constant" identity="customappmodules" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
115
+ // CIL[DOC-MACRO purpose="Glob mapping for custom application entry points."]
116
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose Vite import.meta.glob imports for custom apps."]
117
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
118
+ // CIL[DOC-CONTRACT inputs="none" outputs="Record<string, () => Promise<{ default: React.ComponentType }>>" errors="none" side_effects="none"]
119
+ // CIL[DOC-MICRO logic_summary="Defines a Vite glob pattern that resolves to available custom app modules." notable_decisions="[]"]
120
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
121
+ // CIL[DOC-STABILITY stability="stable"]
118
122
  const customAppModules = import.meta.glob('../../../custom/apps/*/index.tsx')
123
+ // CIL[DOC-VECTOR type="context" content="purpose='Glob mapping for custom application entry points.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
124
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
125
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
126
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
127
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
128
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
129
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:customappmodules:constant"]
130
+
131
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:coreappmodules:constant" type="constant" identity="coreappmodules" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
132
+ // CIL[DOC-MACRO purpose="Glob mapping for core framework application entry points."]
133
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose Vite import.meta.glob imports for core apps."]
134
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
135
+ // CIL[DOC-CONTRACT inputs="none" outputs="Record<string, () => Promise<{ default: React.ComponentType }>>" errors="none" side_effects="none"]
136
+ // CIL[DOC-MICRO logic_summary="Defines a Vite glob pattern that resolves to available core app modules." notable_decisions="[]"]
137
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
138
+ // CIL[DOC-STABILITY stability="stable"]
119
139
  const coreAppModules = import.meta.glob('../apps/*/index.tsx')
140
+ // CIL[DOC-VECTOR type="context" content="purpose='Glob mapping for core framework application entry points.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
141
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
142
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
143
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
144
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
145
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
146
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:coreappmodules:constant"]
120
147
 
121
- const appModuleCache = new Map<string, React.LazyExoticComponent<React.ComponentType>>()
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"]
148
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:appmodulecache:constant" type="constant" identity="appmodulecache" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
149
+ // CIL[DOC-MACRO purpose="Memoization cache for lazy-loaded app components keyed by slug."]
150
+ // CIL[DOC-RESPONSIBILITY responsibility="Avoid recreating lazy components for the same slug."]
151
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
152
+ // CIL[DOC-CONTRACT inputs="slug string key" outputs="React.LazyExoticComponent<React.ComponentType>" errors="none" side_effects="Mutates the Map to cache lazy components."]
153
+ // CIL[DOC-MICRO logic_summary="Holds previously constructed lazy components in a module-scoped Map." notable_decisions="[]"]
154
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
131
155
  // 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."]
156
+ const appModuleCache = new Map<string, React.LazyExoticComponent<React.ComponentType>>()
157
+ // CIL[DOC-VECTOR type="context" content="purpose='Memoization cache for lazy-loaded app components keyed by slug.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
158
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
159
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
160
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
136
161
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
137
162
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
163
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:appmodulecache:constant"]
164
+
165
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:resolveapploader:function" type="function" identity="resolveapploader" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
166
+ // CIL[DOC-MACRO purpose="Resolve the dynamic import loader for a given app slug."]
167
+ // CIL[DOC-RESPONSIBILITY responsibility="Select the custom or core app glob entry for a slug and return its loader."]
168
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
169
+ // CIL[DOC-CONTRACT inputs="slug: string" outputs="(() => Promise<{ default: React.ComponentType }>) | null" errors="none" side_effects="none"]
170
+ // CIL[DOC-MICRO logic_summary="Checks the custom app glob, then the core app glob, and returns the matching loader or null." notable_decisions="[]"]
171
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
172
+ // CIL[DOC-STABILITY stability="stable"]
138
173
  function resolveAppLoader(slug: string): (() => Promise<{ default: React.ComponentType }>) | null {
139
174
  const customKey = `../../../custom/apps/${slug}/index.tsx`
140
175
  if (customAppModules[customKey]) {
141
176
  return customAppModules[customKey] as () => Promise<{ default: React.ComponentType }>
142
177
  }
178
+
143
179
  const coreKey = `../apps/${slug}/index.tsx`
144
180
  if (coreAppModules[coreKey]) {
145
181
  return coreAppModules[coreKey] as () => Promise<{ default: React.ComponentType }>
146
182
  }
147
183
  return null
148
184
  }
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."]
185
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolve the dynamic import loader for a given app slug.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
186
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
187
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
188
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
163
189
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
164
190
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
191
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:resolveapploader:function"]
192
+
193
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:getappcomponent:function" type="function" identity="getappcomponent" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
194
+ // CIL[DOC-MACRO purpose="Return (or create) a cached lazy component for a given app slug."]
195
+ // CIL[DOC-RESPONSIBILITY responsibility="Look up the loader, build a React.lazy component, cache it, and return it."]
196
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
197
+ // CIL[DOC-CONTRACT inputs="slug: string" outputs="React.LazyExoticComponent<React.ComponentType>" errors="Throws if no loader found (via lazy rejection)" side_effects="Reads and writes appModuleCache."]
198
+ // CIL[DOC-MICRO logic_summary="Uses resolveAppLoader; creates a lazy component with a reject fallback when the app is not found; caches by slug." notable_decisions="[]"]
199
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
200
+ // CIL[DOC-STABILITY stability="stable"]
165
201
  function getAppComponent(slug: string): React.LazyExoticComponent<React.ComponentType> {
166
202
  if (!appModuleCache.has(slug)) {
167
203
  const loader = resolveAppLoader(slug)
@@ -174,39 +210,41 @@ function getAppComponent(slug: string): React.LazyExoticComponent<React.Componen
174
210
  }
175
211
  return appModuleCache.get(slug)!
176
212
  }
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."]
213
+ // CIL[DOC-VECTOR type="context" content="purpose='Return (or create) a cached lazy component for a given app slug.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
214
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
215
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
216
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
190
217
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
191
218
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
219
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:getappcomponent:function"]
220
+
221
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:customapploaderprops:interface" type="interface" identity="customapploaderprops" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
222
+ // CIL[DOC-MACRO purpose="Props contract for the CustomAppLoader component."]
223
+ // CIL[DOC-RESPONSIBILITY responsibility="Declare the slug input used to select which app to render."]
224
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
225
+ // CIL[DOC-CONTRACT inputs="slug: string" outputs="none" errors="none" side_effects="none"]
226
+ // CIL[DOC-MICRO logic_summary="Defines the single prop consumed by the CustomAppLoader component." notable_decisions="[]"]
227
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
228
+ // CIL[DOC-STABILITY stability="stable"]
192
229
  interface CustomAppLoaderProps {
193
230
  slug: string
194
231
  }
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."]
232
+ // CIL[DOC-VECTOR type="context" content="purpose='Props contract for the CustomAppLoader component.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
233
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
234
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
235
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
208
236
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
209
237
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
238
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:customapploaderprops:interface"]
239
+
240
+ // CIL[BEGIN stable_id="~/.framework/src/components/CustomAppLoader.tsx:customapploader:function" type="function" identity="customapploader" parent="~/.framework/src/components/CustomAppLoader.tsx:module_header:module_header"]
241
+ // CIL[DOC-MACRO purpose="Public component that lazily renders the app identified by slug with error and loading boundaries."]
242
+ // CIL[DOC-RESPONSIBILITY responsibility="Wrap a lazy app component in an error boundary and a loading spinner."]
243
+ // CIL[DOC-CONTEXT module=".framework/src/components/CustomAppLoader" layer="component" related_files=".framework/src/components/CustomAppLoader.tsx,.framework/src/components/ui/LoadingSpinner.tsx"]
244
+ // CIL[DOC-CONTRACT inputs="slug: string (destructured from props)" outputs="JSX.Element" errors="none" side_effects="none"]
245
+ // CIL[DOC-MICRO logic_summary="Retrieves the lazy component for the slug and renders it inside AppErrorBoundary and Suspense with a loading fallback." notable_decisions="[]"]
246
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
247
+ // CIL[DOC-STABILITY stability="stable"]
210
248
  export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
211
249
  const AppComponent = getAppComponent(slug)
212
250
 
@@ -222,4 +260,10 @@ export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
222
260
  </AppErrorBoundary>
223
261
  )
224
262
  }
225
- // CIL[END chunk_id="CustomAppLoader_customapploader_1783931090"]
263
+ // CIL[DOC-VECTOR type="context" content="purpose='Public component that lazily renders the app identified by slug with error and loading boundaries.'; No verified external callers; imports: .framework/src/components/ui/LoadingSpinner.tsx"]
264
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
265
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
266
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
267
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
268
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
269
+ // CIL[END stable_id="~/.framework/src/components/CustomAppLoader.tsx:customapploader:function"]