spine-framework 0.3.124 → 0.3.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="index_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import React and routing dependencies for admin app"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for admin interface"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and components" errors="Import failures" side_effects="Module loading"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, UI components, and layout" notable_decisions="[]"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
20
|
import { lazy, Suspense } from 'react'
|
|
2
21
|
import { Routes, Route, Navigate, useLocation } from 'react-router-dom'
|
|
3
22
|
import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
|
|
@@ -6,8 +25,21 @@ import { useAuth } from '../../contexts/AuthContext'
|
|
|
6
25
|
import { AppShell } from '../../components/layout/AppShell'
|
|
7
26
|
import { AdminSidebar } from '../../components/admin/AdminSidebar'
|
|
8
27
|
import { TooltipProvider } from '../../components/ui/tooltip'
|
|
9
|
-
|
|
10
|
-
//
|
|
28
|
+
// CIL[END chunk_id="index_module_header_1783931090"]
|
|
29
|
+
// CIL[BEGIN chunk_id="index_lazy_imports_1783931090" type="lazy_imports" identity="lazy_imports" parent="none"]
|
|
30
|
+
// CIL[DOC-MACRO purpose="Lazy load all admin pages and components for code splitting"]
|
|
31
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage lazy imports for admin interface pages and components"]
|
|
32
|
+
// CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
33
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Lazy-loaded page components" errors="Module loading failures" side_effects="Dynamic imports"]
|
|
34
|
+
// CIL[DOC-MICRO logic_summary="Creates lazy imports for all admin pages, runtime components, and test pages" notable_decisions="['extensive_lazy_loading', 'then_default_extraction']"]
|
|
35
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
36
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
37
|
+
// CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
38
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
39
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
40
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
41
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
42
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
11
43
|
const TypesPage = lazy(() => import('../../pages/admin/TypesPage').then(m => ({ default: m.TypesPage })))
|
|
12
44
|
const AppsPage = lazy(() => import('../../pages/admin/AppsPage').then(m => ({ default: m.AppsPage })))
|
|
13
45
|
const TypeDetailPage = lazy(() => import('../../pages/admin/TypeDetailPage').then(m => ({ default: m.TypeDetailPage })))
|
|
@@ -17,8 +49,6 @@ const AIAgentsPage = lazy(() => import('../../pages/admin/AIAgentsPage').then(m
|
|
|
17
49
|
const EmbeddingsPage = lazy(() => import('../../pages/admin/EmbeddingsPage').then(m => ({ default: m.EmbeddingsPage })))
|
|
18
50
|
const TimersPage = lazy(() => import('../../pages/admin/TimersPage').then(m => ({ default: m.TimersPage })))
|
|
19
51
|
const IntegrationsPage = lazy(() => import('../../pages/admin/IntegrationsPage').then(m => ({ default: m.IntegrationsPage })))
|
|
20
|
-
|
|
21
|
-
// Config detail pages
|
|
22
52
|
const AppDetailPage = lazy(() => import('../../pages/admin/AppDetailPage').then(m => ({ default: m.AppDetailPage })))
|
|
23
53
|
const PipelineDetailPage = lazy(() => import('../../pages/admin/PipelineDetailPage').then(m => ({ default: m.PipelineDetailPage })))
|
|
24
54
|
const TriggerDetailPage = lazy(() => import('../../pages/admin/TriggerDetailPage').then(m => ({ default: m.TriggerDetailPage })))
|
|
@@ -32,21 +62,14 @@ const PromptConfigsPage = lazy(() => import('../../pages/admin/PromptConfigsPage
|
|
|
32
62
|
const PromptConfigDetailPage = lazy(() => import('../../pages/admin/PromptConfigDetailPage').then(m => ({ default: m.PromptConfigDetailPage })))
|
|
33
63
|
const APIKeysPage = lazy(() => import('../../pages/admin/APIKeysPage').then(m => ({ default: m.APIKeysPage })))
|
|
34
64
|
const APIKeyDetailPage = lazy(() => import('../../pages/admin/APIKeyDetailPage').then(m => ({ default: m.APIKeyDetailPage })))
|
|
35
|
-
|
|
36
|
-
// Access pages
|
|
65
|
+
const DeliveriesPage = lazy(() => import('../../pages/admin/DeliveriesPage').then(m => ({ default: m.DeliveriesPage })))
|
|
37
66
|
const InvitesPage = lazy(() => import('../../pages/admin/InvitesPage').then(m => ({ default: m.InvitesPage })))
|
|
38
|
-
|
|
39
|
-
// Observability pages
|
|
40
67
|
const ObservabilityDashboard = lazy(() => import('../../pages/admin/ObservabilityDashboard').then(m => ({ default: m.ObservabilityDashboard })))
|
|
41
68
|
const PipelineExecutionsPage = lazy(() => import('../../pages/admin/PipelineExecutionsPage').then(m => ({ default: m.PipelineExecutionsPage })))
|
|
42
69
|
const LogsPage = lazy(() => import('../../pages/admin/LogsPage').then(m => ({ default: m.LogsPage })))
|
|
43
70
|
const AlertsConfigPage = lazy(() => import('../../pages/admin/AlertsConfigPage').then(m => ({ default: m.AlertsConfigPage })))
|
|
44
|
-
|
|
45
|
-
// Runtime data pages (unified)
|
|
46
71
|
const DataListPage = lazy(() => import('../../components/runtime/DataListPage').then(m => ({ default: m.DataListPage })))
|
|
47
72
|
const DataDetailPage = lazy(() => import('../../components/runtime/DataDetailPage').then(m => ({ default: m.DataDetailPage })))
|
|
48
|
-
|
|
49
|
-
// Testing pages
|
|
50
73
|
const TestingDashboard = lazy(() => import('../../pages/admin/TestingDashboard'))
|
|
51
74
|
const TestRunDetailPage = lazy(() => import('../../pages/admin/TestRunDetailPage').then(m => ({ default: m.TestRunDetailPage })))
|
|
52
75
|
const ShadcnTestPage = lazy(() => import('../../pages/admin/ShadcnTestPage').then(m => ({ default: m.ShadcnTestPage })))
|
|
@@ -58,19 +81,40 @@ const DesignedPage = lazy(() => import('../../pages/admin/DesignedPage').then(m
|
|
|
58
81
|
const ProperlyDesignedPage = lazy(() => import('../../pages/admin/ProperlyDesignedPage').then(m => ({ default: m.ProperlyDesignedPage })))
|
|
59
82
|
const IntegratedDashboard = lazy(() => import('../../pages/admin/IntegratedDashboard').then(m => ({ default: m.IntegratedDashboard })))
|
|
60
83
|
const SimpleDashboard = lazy(() => import('../../pages/admin/SimpleDashboard').then(m => ({ default: m.SimpleDashboard })))
|
|
61
|
-
|
|
84
|
+
const CILProjectsPage = lazy(() => import('../../pages/admin/cil/CILProjectsPage'))
|
|
85
|
+
const KBAdminPage = lazy(() => import('../../pages/admin/kb/KBAdminPage').then(m => ({ default: m.KBAdminPage })))
|
|
86
|
+
const CILDashboardPage = lazy(() => import('../../pages/admin/cil/CILDashboardPage'))
|
|
87
|
+
const CILSearchPage = lazy(() => import('../../pages/admin/cil/CILSearchPage'))
|
|
88
|
+
const CILAgentPage = lazy(() => import('../../pages/admin/cil/CILAgentPage'))
|
|
89
|
+
const CILFileListPage = lazy(() => import('../../pages/admin/cil/CILFileListPage'))
|
|
90
|
+
const CILGraphPage = lazy(() => import('../../pages/admin/cil/CILGraphPage'))
|
|
91
|
+
const CILIngestionPage = lazy(() => import('../../pages/admin/cil/CILIngestionPage'))
|
|
92
|
+
const CILChunkDetailPage = lazy(() => import('../../pages/admin/cil/CILChunkDetailPage'))
|
|
93
|
+
const FlexiblePipelinePage = lazy(() => import('../../pages/admin/cil/FlexiblePipelinePage'))
|
|
94
|
+
// CIL[END chunk_id="index_lazy_imports_1783931090"]
|
|
95
|
+
// CIL[BEGIN chunk_id="index_adminroutes_1783931090" type="function" identity="AdminRoutes" parent="none"]
|
|
96
|
+
// CIL[DOC-MACRO purpose="Define all admin routes with breadcrumbs and navigation"]
|
|
97
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage admin routing, breadcrumbs, and page layout"]
|
|
98
|
+
// CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
99
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Admin routes with navigation" errors="Route failures" side_effects="Navigation, page rendering"]
|
|
100
|
+
// CIL[DOC-MICRO logic_summary="Builds breadcrumbs, defines extensive admin routes, handles legacy redirects" notable_decisions="['breadcrumb_generation', 'legacy_route_redirects']"]
|
|
101
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
102
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
103
|
+
// CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
104
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
105
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
106
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
107
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
108
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
62
109
|
function AdminRoutes() {
|
|
63
110
|
const location = useLocation()
|
|
64
111
|
|
|
65
|
-
// Build breadcrumbs from current path
|
|
66
112
|
const pathSegments = location.pathname.split('/').filter(Boolean)
|
|
67
113
|
const breadcrumbs: { title: string; url?: string }[] = [{ title: 'Spine', url: '/dashboard' }]
|
|
68
114
|
|
|
69
|
-
// Add admin section
|
|
70
115
|
if (pathSegments.includes('admin')) {
|
|
71
116
|
breadcrumbs.push({ title: 'Admin', url: '/spine-framework/admin' })
|
|
72
117
|
|
|
73
|
-
// Add subsection
|
|
74
118
|
const section = pathSegments[2]
|
|
75
119
|
if (section) {
|
|
76
120
|
breadcrumbs.push({ title: section.charAt(0).toUpperCase() + section.slice(1) })
|
|
@@ -84,11 +128,9 @@ function AdminRoutes() {
|
|
|
84
128
|
>
|
|
85
129
|
<Suspense fallback={<div className="min-h-[400px] flex items-center justify-center"><LoadingSpinner /></div>}>
|
|
86
130
|
<Routes>
|
|
87
|
-
{/* Default redirect → configs */}
|
|
88
131
|
<Route index element={<Navigate to="configs/types" replace />} />
|
|
89
132
|
<Route path="dashboard" element={<Navigate to="configs/types" replace />} />
|
|
90
133
|
|
|
91
|
-
{/* Configs section */}
|
|
92
134
|
<Route path="configs/types/new" element={<TypeDetailPage />} />
|
|
93
135
|
<Route path="configs/types/:id" element={<TypeDetailPage />} />
|
|
94
136
|
<Route path="configs/types" element={<TypesPage />} />
|
|
@@ -104,9 +146,6 @@ function AdminRoutes() {
|
|
|
104
146
|
<Route path="configs/ai-agents/new" element={<AIAgentDetailPage />} />
|
|
105
147
|
<Route path="configs/ai-agents/:id" element={<AIAgentDetailPage />} />
|
|
106
148
|
<Route path="configs/ai-agents" element={<AIAgentsPage />} />
|
|
107
|
-
<Route path="configs/embeddings/new" element={<EmbeddingDetailPage />} />
|
|
108
|
-
<Route path="configs/embeddings/:id" element={<EmbeddingDetailPage />} />
|
|
109
|
-
<Route path="configs/embeddings" element={<EmbeddingsPage />} />
|
|
110
149
|
<Route path="configs/timers/new" element={<TimerDetailPage />} />
|
|
111
150
|
<Route path="configs/timers/:id" element={<TimerDetailPage />} />
|
|
112
151
|
<Route path="configs/timers" element={<TimersPage />} />
|
|
@@ -122,11 +161,10 @@ function AdminRoutes() {
|
|
|
122
161
|
<Route path="configs/api-keys/new" element={<APIKeyDetailPage />} />
|
|
123
162
|
<Route path="configs/api-keys/:id" element={<APIKeyDetailPage />} />
|
|
124
163
|
<Route path="configs/api-keys" element={<APIKeysPage />} />
|
|
164
|
+
<Route path="configs/deliveries" element={<DeliveriesPage />} />
|
|
125
165
|
|
|
126
|
-
{/* Access section */}
|
|
127
166
|
<Route path="access/invites" element={<InvitesPage />} />
|
|
128
167
|
|
|
129
|
-
{/* Observability section */}
|
|
130
168
|
<Route path="observability" element={<ObservabilityDashboard />} />
|
|
131
169
|
<Route path="observability/dashboard" element={<ObservabilityDashboard />} />
|
|
132
170
|
<Route path="observability/alerts" element={<AlertsConfigPage />} />
|
|
@@ -134,7 +172,6 @@ function AdminRoutes() {
|
|
|
134
172
|
<Route path="observability/executions" element={<PipelineExecutionsPage />} />
|
|
135
173
|
<Route path="observability/logs" element={<LogsPage />} />
|
|
136
174
|
|
|
137
|
-
{/* Testing section */}
|
|
138
175
|
<Route path="testing/:run_id" element={<TestRunDetailPage />} />
|
|
139
176
|
<Route path="testing" element={<TestingDashboard />} />
|
|
140
177
|
<Route path="test/ui" element={<ShadcnTestPage />} />
|
|
@@ -147,12 +184,30 @@ function AdminRoutes() {
|
|
|
147
184
|
<Route path="test/integrated" element={<IntegratedDashboard />} />
|
|
148
185
|
<Route path="test/simple" element={<SimpleDashboard />} />
|
|
149
186
|
|
|
150
|
-
{/* Runtime Data - Unified entity management */}
|
|
151
187
|
<Route path="runtime/:entity" element={<DataListPage />} />
|
|
152
188
|
<Route path="runtime/:entity/new" element={<DataDetailPage />} />
|
|
153
189
|
<Route path="runtime/:entity/:id" element={<DataDetailPage />} />
|
|
154
190
|
|
|
155
|
-
|
|
191
|
+
<Route path="cil" element={<CILProjectsPage />} />
|
|
192
|
+
<Route path="cil/search" element={<CILSearchPage />} />
|
|
193
|
+
<Route path="cil/agent" element={<CILAgentPage />} />
|
|
194
|
+
<Route path="cil/:id" element={<CILDashboardPage />} />
|
|
195
|
+
<Route path="cil/:id/dashboard" element={<CILDashboardPage />} />
|
|
196
|
+
<Route path="cil/:id/files" element={<CILFileListPage />} />
|
|
197
|
+
<Route path="cil/:id/graph" element={<CILGraphPage />} />
|
|
198
|
+
<Route path="cil/:id/agent" element={<CILAgentPage />} />
|
|
199
|
+
<Route path="cil/:id/ingest" element={<CILIngestionPage />} />
|
|
200
|
+
<Route path="cil/:id/flexible" element={<FlexiblePipelinePage />} />
|
|
201
|
+
<Route path="cil/:id/chunks/:chunkId" element={<CILChunkDetailPage />} />
|
|
202
|
+
<Route path="cil/chunks/:chunkId" element={<CILChunkDetailPage />} />
|
|
203
|
+
|
|
204
|
+
<Route path="kb/embeddings/:id" element={<EmbeddingDetailPage />} />
|
|
205
|
+
<Route path="kb/embeddings" element={<EmbeddingsPage />} />
|
|
206
|
+
<Route path="kb/:typeSlug" element={<KBAdminPage />} />
|
|
207
|
+
<Route path="kb/:typeSlug/new" element={<KBAdminPage mode="new" />} />
|
|
208
|
+
<Route path="kb/:typeSlug/:id" element={<KBAdminPage mode="view" />} />
|
|
209
|
+
<Route path="kb/:typeSlug/:id/edit" element={<KBAdminPage mode="edit" />} />
|
|
210
|
+
|
|
156
211
|
<Route path="data/:entity" element={<Navigate to="../runtime/:entity" replace />} />
|
|
157
212
|
<Route path="data/:entity/create" element={<Navigate to="../runtime/:entity/new" replace />} />
|
|
158
213
|
<Route path="data/:entity/:id" element={<Navigate to="../runtime/:entity/:id" replace />} />
|
|
@@ -163,7 +218,21 @@ function AdminRoutes() {
|
|
|
163
218
|
</AppShell>
|
|
164
219
|
)
|
|
165
220
|
}
|
|
166
|
-
|
|
221
|
+
// CIL[END chunk_id="index_adminroutes_1783931090"]
|
|
222
|
+
// CIL[BEGIN chunk_id="index_adminapp_1783931090" type="function" identity="AdminApp" parent="none"]
|
|
223
|
+
// CIL[DOC-MACRO purpose="Admin app entry point with system admin access control"]
|
|
224
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Gate admin access and provide tooltip context"]
|
|
225
|
+
// CIL[DOC-CONTEXT module="admin-index" layer="admin-routing" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
|
|
226
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Protected admin interface" errors="Access denied" side_effects="Navigation, tooltip context"]
|
|
227
|
+
// CIL[DOC-MICRO logic_summary="Checks system admin role, redirects unauthorized users, wraps routes" notable_decisions="['role_based_access', 'tooltip_provider_wrapper']"]
|
|
228
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
229
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
230
|
+
// CIL[DOC-VECTOR type="context" content="Layer: admin-routing. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
231
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
232
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
233
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
234
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
235
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
167
236
|
export default function AdminApp() {
|
|
168
237
|
const { user } = useAuth()
|
|
169
238
|
|
|
@@ -177,3 +246,4 @@ export default function AdminApp() {
|
|
|
177
246
|
</TooltipProvider>
|
|
178
247
|
)
|
|
179
248
|
}
|
|
249
|
+
// CIL[END chunk_id="index_adminapp_1783931090"]
|
|
@@ -1,29 +1,68 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="AppWrapper_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and context dependencies for app wrapper"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for app wrapper component"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and types" errors="Import failures" side_effects="Module loading"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, routing, auth context, app context, and app types" notable_decisions="[]"]
|
|
10
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
11
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
12
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
13
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/CoursesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
14
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
15
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
16
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
17
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
19
|
import React from 'react'
|
|
2
20
|
import { Navigate } from 'react-router-dom'
|
|
3
21
|
import { useAuth } from '../contexts/AuthContext'
|
|
4
22
|
import { AppProvider } from '../contexts/AppContext'
|
|
5
23
|
import { AppRecord } from '../hooks/useApps'
|
|
6
|
-
|
|
24
|
+
// CIL[END chunk_id="AppWrapper_module_header_1783931090"]
|
|
25
|
+
// CIL[BEGIN chunk_id="AppWrapper_interface_1783931090" type="interface" identity="AppWrapperProps" parent="none"]
|
|
26
|
+
// CIL[DOC-MACRO purpose="Define props interface for AppWrapper component"]
|
|
27
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for app wrapper properties"]
|
|
28
|
+
// CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\"\\\"]"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="Defines app record and children props for wrapper component" notable_decisions="[]"]
|
|
31
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
32
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
33
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, \."]
|
|
34
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
35
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
36
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
37
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
38
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
7
39
|
interface AppWrapperProps {
|
|
8
40
|
app: AppRecord
|
|
9
41
|
children: React.ReactNode
|
|
10
42
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
43
|
+
// CIL[END chunk_id="AppWrapper_interface_1783931090"]
|
|
44
|
+
// CIL[BEGIN chunk_id="AppWrapper_appwrapper_1783931090" type="function" identity="AppWrapper" parent="none"]
|
|
45
|
+
// CIL[DOC-LEARNING topic="AppWrapper:role_gate" content="Access is denied unless user.roles includes system_admin or intersects app.required_roles. Missing roles in public.roles produce an Access Denied page even when the app is otherwise routable."]
|
|
46
|
+
// CIL[DOC-MACRO purpose="Wrapper component providing auth gates and app context"]
|
|
47
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle authentication, role checking, and app context provision"]
|
|
48
|
+
// CIL[DOC-CONTEXT module="AppWrapper" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/portal/pages/CoursesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"\\\"]"]
|
|
49
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Protected app content" errors="Access denied" side_effects="Navigation, context provision"]
|
|
50
|
+
// CIL[DOC-MICRO logic_summary="Auth gate, role validation, access denied UI, app context wrapper" notable_decisions="['role_based_access', 'fallback_to_min_role']"]
|
|
51
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
52
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
53
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/portal/pages/CoursesPage.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/layout/Sidebar.tsx, \."]
|
|
54
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
55
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
56
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
57
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
58
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
18
59
|
export function AppWrapper({ app, children }: AppWrapperProps) {
|
|
19
60
|
const { user } = useAuth()
|
|
20
61
|
|
|
21
|
-
// Auth gate
|
|
22
62
|
if (!user) {
|
|
23
63
|
return <Navigate to="/login" replace />
|
|
24
64
|
}
|
|
25
65
|
|
|
26
|
-
// Role gate — check required_roles array (preferred) or min_role (fallback)
|
|
27
66
|
const requiredRoles: string[] = app.required_roles?.length
|
|
28
67
|
? app.required_roles
|
|
29
68
|
: app.min_role ? [app.min_role] : []
|
|
@@ -52,10 +91,10 @@ export function AppWrapper({ app, children }: AppWrapperProps) {
|
|
|
52
91
|
}
|
|
53
92
|
}
|
|
54
93
|
|
|
55
|
-
// App context
|
|
56
94
|
return (
|
|
57
95
|
<AppProvider app={app}>
|
|
58
96
|
{children}
|
|
59
97
|
</AppProvider>
|
|
60
98
|
)
|
|
61
99
|
}
|
|
100
|
+
// CIL[END chunk_id="AppWrapper_appwrapper_1783931090"]
|
|
@@ -1,9 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
10
|
+
// CIL[DOC-MACRO purpose="Import React components and utilities for custom app loading"]
|
|
11
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for app loader"]
|
|
12
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
13
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and types" errors="Import failures" side_effects="Module loading"]
|
|
14
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, lazy loading, error boundary, and UI components" notable_decisions="[]"]
|
|
15
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
16
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
17
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
18
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/components/ui/dialog.tsx, \."]
|
|
19
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
20
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
21
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
22
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
23
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
24
|
import React, { lazy, Suspense, Component } from 'react'
|
|
2
25
|
import type { ReactNode } from 'react'
|
|
3
26
|
import { LoadingSpinner } from './ui/LoadingSpinner'
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
|
|
27
|
+
// CIL[END chunk_id="CustomAppLoader_module_header_1783931090"]
|
|
28
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_error_boundary_interfaces_1783931090" type="interfaces" identity="error_boundary_interfaces" parent="none"]
|
|
29
|
+
// CIL[DOC-MACRO purpose="Define interfaces for error boundary component"]
|
|
30
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definitions for error boundary props and state"]
|
|
31
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
32
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interfaces" errors="none" side_effects="none"]
|
|
33
|
+
// CIL[DOC-MICRO logic_summary="Defines props with slug and children, state with error tracking" notable_decisions="[]"]
|
|
34
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
35
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
36
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
37
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
38
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
39
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
40
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
41
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
7
42
|
interface ErrorBoundaryProps {
|
|
8
43
|
slug: string
|
|
9
44
|
children: ReactNode
|
|
@@ -12,7 +47,21 @@ interface ErrorBoundaryProps {
|
|
|
12
47
|
interface ErrorBoundaryState {
|
|
13
48
|
error: Error | null
|
|
14
49
|
}
|
|
15
|
-
|
|
50
|
+
// CIL[END chunk_id="CustomAppLoader_error_boundary_interfaces_1783931090"]
|
|
51
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_apperrorboundary_1783931090" type="class" identity="AppErrorBoundary" parent="none"]
|
|
52
|
+
// CIL[DOC-MACRO purpose="Error boundary component to catch and display app loading errors"]
|
|
53
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle app loading failures with user-friendly error display"]
|
|
54
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
55
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Error UI or children" errors="App loading failures" side_effects="Error state management"]
|
|
56
|
+
// CIL[DOC-MICRO logic_summary="Catches errors, displays error UI with app slug and error details" notable_decisions="['error_boundary_pattern', 'user_friendly_errors']"]
|
|
57
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
58
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
59
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/components/ui/dialog.tsx, \."]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
61
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
62
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
63
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
16
65
|
class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
17
66
|
constructor(props: ErrorBoundaryProps) {
|
|
18
67
|
super(props)
|
|
@@ -51,33 +100,68 @@ class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState>
|
|
|
51
100
|
return this.props.children
|
|
52
101
|
}
|
|
53
102
|
}
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
// module
|
|
59
|
-
//
|
|
103
|
+
// CIL[END chunk_id="CustomAppLoader_apperrorboundary_1783931090"]
|
|
104
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_loader_setup_1783931090" type="loader_setup" identity="loader_setup" parent="none"]
|
|
105
|
+
// CIL[DOC-MACRO purpose="Set up module glob patterns and cache for app loading"]
|
|
106
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure module discovery and caching for apps"]
|
|
107
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
108
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Module globs and cache map" errors="none" side_effects="Module resolution"]
|
|
109
|
+
// CIL[DOC-MICRO logic_summary="Defines custom and core app module patterns, creates component cache" notable_decisions="['glob_patterns', 'module_caching']"]
|
|
110
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
111
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
112
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, \."]
|
|
113
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
114
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
115
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
116
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
117
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
60
118
|
const customAppModules = import.meta.glob('../../../custom/apps/*/index.tsx')
|
|
61
119
|
const coreAppModules = import.meta.glob('../apps/*/index.tsx')
|
|
62
120
|
|
|
63
|
-
// Module-level cache for lazy components to avoid re-creating on each render
|
|
64
121
|
const appModuleCache = new Map<string, React.LazyExoticComponent<React.ComponentType>>()
|
|
65
|
-
|
|
66
|
-
//
|
|
122
|
+
// CIL[END chunk_id="CustomAppLoader_loader_setup_1783931090"]
|
|
123
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_resolveapploader_1783931090" type="function" identity="resolveAppLoader" parent="none"]
|
|
124
|
+
// CIL[DOC-LEARNING topic="CustomAppLoader:slug_folder_match" content="CustomAppLoader resolves custom/apps/{slug}/index.tsx from the DB apps.slug. The slug must match the filesystem folder name or the lazy import will reject with 'App not found'."]
|
|
125
|
+
// CIL[DOC-MACRO purpose="Resolve app slug to module loader function"]
|
|
126
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Map app slug to appropriate module loader"]
|
|
127
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
|
|
128
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="loader function or null" errors="none" side_effects="none"]
|
|
129
|
+
// CIL[DOC-MICRO logic_summary="Checks custom apps first, falls back to core apps, returns loader" notable_decisions="['custom_priority', 'fallback_pattern']"]
|
|
130
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
131
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
132
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
133
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
134
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
135
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
136
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
137
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
67
138
|
function resolveAppLoader(slug: string): (() => Promise<{ default: React.ComponentType }>) | null {
|
|
68
|
-
// Check custom first (custom/apps/{slug}/index.tsx)
|
|
69
139
|
const customKey = `../../../custom/apps/${slug}/index.tsx`
|
|
70
140
|
if (customAppModules[customKey]) {
|
|
71
141
|
return customAppModules[customKey] as () => Promise<{ default: React.ComponentType }>
|
|
72
142
|
}
|
|
73
|
-
// Fall back to core (../apps/{slug}/index.tsx relative to this file)
|
|
74
143
|
const coreKey = `../apps/${slug}/index.tsx`
|
|
75
144
|
if (coreAppModules[coreKey]) {
|
|
76
145
|
return coreAppModules[coreKey] as () => Promise<{ default: React.ComponentType }>
|
|
77
146
|
}
|
|
78
147
|
return null
|
|
79
148
|
}
|
|
80
|
-
|
|
149
|
+
// CIL[END chunk_id="CustomAppLoader_resolveapploader_1783931090"]
|
|
150
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_getappcomponent_1783931090" type="function" identity="getAppComponent" parent="none"]
|
|
151
|
+
// CIL[DOC-NOTE type="caution" content="import.meta.glob is resolved at Vite startup; adding or renaming a custom app folder requires running npm run assemble and restarting the dev server before CustomAppLoader can discover it."]
|
|
152
|
+
// CIL[DOC-MACRO purpose="Get or create cached lazy component for app slug"]
|
|
153
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage lazy component creation and caching"]
|
|
154
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
|
|
155
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Lazy component" errors="App not found" side_effects="Cache updates"]
|
|
156
|
+
// CIL[DOC-MICRO logic_summary="Checks cache, creates lazy component, caches result, handles missing apps" notable_decisions="['lazy_component_creation', 'error_rejection']"]
|
|
157
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
158
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
159
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
160
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
161
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
162
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
163
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
164
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
81
165
|
function getAppComponent(slug: string): React.LazyExoticComponent<React.ComponentType> {
|
|
82
166
|
if (!appModuleCache.has(slug)) {
|
|
83
167
|
const loader = resolveAppLoader(slug)
|
|
@@ -90,15 +174,39 @@ function getAppComponent(slug: string): React.LazyExoticComponent<React.Componen
|
|
|
90
174
|
}
|
|
91
175
|
return appModuleCache.get(slug)!
|
|
92
176
|
}
|
|
93
|
-
|
|
177
|
+
// CIL[END chunk_id="CustomAppLoader_getappcomponent_1783931090"]
|
|
178
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_interface_1783931090" type="interface" identity="CustomAppLoaderProps" parent="none"]
|
|
179
|
+
// CIL[DOC-MACRO purpose="Define props interface for CustomAppLoader component"]
|
|
180
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for custom app loader properties"]
|
|
181
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
|
|
182
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
183
|
+
// CIL[DOC-MICRO logic_summary="Defines slug prop for app identification" notable_decisions="[]"]
|
|
184
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
185
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
186
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
187
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
188
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
189
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
190
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
191
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
94
192
|
interface CustomAppLoaderProps {
|
|
95
193
|
slug: string
|
|
96
194
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
195
|
+
// CIL[END chunk_id="CustomAppLoader_interface_1783931090"]
|
|
196
|
+
// CIL[BEGIN chunk_id="CustomAppLoader_customapploader_1783931090" type="function" identity="CustomAppLoader" parent="none"]
|
|
197
|
+
// CIL[DOC-MACRO purpose="Main component for lazy-loading custom apps with error handling"]
|
|
198
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Wrap app component in error boundary and suspense for loading"]
|
|
199
|
+
// CIL[DOC-CONTEXT module="CustomAppLoader" layer="component" related_files="[]"]
|
|
200
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Loaded app component" errors="App loading failures" side_effects="Lazy loading, error handling"]
|
|
201
|
+
// CIL[DOC-MICRO logic_summary="Gets cached component, wraps in error boundary and suspense" notable_decisions="['error_boundary_wrapping', 'suspense_fallback']"]
|
|
202
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
203
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
204
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
205
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
206
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
207
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
208
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
209
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
102
210
|
export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
|
|
103
211
|
const AppComponent = getAppComponent(slug)
|
|
104
212
|
|
|
@@ -114,3 +222,4 @@ export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
|
|
|
114
222
|
</AppErrorBoundary>
|
|
115
223
|
)
|
|
116
224
|
}
|
|
225
|
+
// CIL[END chunk_id="CustomAppLoader_customapploader_1783931090"]
|