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.
- package/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5067 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
|
@@ -1,61 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// CIL[
|
|
5
|
-
// CIL[DOC-
|
|
6
|
-
// CIL[DOC-
|
|
7
|
-
// CIL[DOC-
|
|
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="
|
|
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[
|
|
25
|
-
// CIL[
|
|
26
|
-
// CIL[DOC-
|
|
27
|
-
// CIL[DOC-
|
|
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[
|
|
44
|
-
// CIL[
|
|
45
|
-
// CIL[DOC-
|
|
46
|
-
// CIL[DOC-
|
|
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[
|
|
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[
|
|
28
|
-
// CIL[
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-
|
|
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[
|
|
51
|
-
// CIL[
|
|
52
|
-
// CIL[DOC-
|
|
53
|
-
// CIL[DOC-
|
|
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[
|
|
104
|
-
// CIL[
|
|
105
|
-
// CIL[DOC-
|
|
106
|
-
// CIL[DOC-
|
|
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
|
-
|
|
122
|
-
// CIL[
|
|
123
|
-
// CIL[
|
|
124
|
-
// CIL[DOC-
|
|
125
|
-
// CIL[DOC-
|
|
126
|
-
// CIL[DOC-
|
|
127
|
-
// CIL[DOC-
|
|
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
|
-
|
|
133
|
-
// CIL[DOC-VECTOR type="
|
|
134
|
-
// CIL[DOC-VECTOR type="
|
|
135
|
-
// CIL[DOC-VECTOR type="
|
|
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[
|
|
150
|
-
// CIL[
|
|
151
|
-
// CIL[DOC-
|
|
152
|
-
// CIL[DOC-
|
|
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[
|
|
178
|
-
// CIL[
|
|
179
|
-
// CIL[DOC-
|
|
180
|
-
// CIL[DOC-
|
|
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[
|
|
196
|
-
// CIL[
|
|
197
|
-
// CIL[DOC-
|
|
198
|
-
// CIL[DOC-
|
|
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[
|
|
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"]
|