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,45 +1,61 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/components/layout/Header
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-component
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Sticky top bar rendered inside the main content area. Contains:
|
|
8
|
-
* - **Mobile hamburger** (`Bars3Icon`) — visible below `lg` breakpoint;
|
|
9
|
-
* calls `onMenuClick` to open the slide-over sidebar
|
|
10
|
-
* - **Search input** — hidden on small screens (placeholder only; not wired)
|
|
11
|
-
* - **Notification bell** — placeholder; not yet wired to a backend
|
|
12
|
-
* - **User avatar + name** — derived from `user.full_name` / `user.email`
|
|
13
|
-
*
|
|
14
|
-
* @seeAlso src/components/layout/Layout.tsx (mounts this component)
|
|
15
|
-
* @seeAlso src/types/auth.ts (User)
|
|
16
|
-
*/
|
|
17
1
|
|
|
18
|
-
import { Menu, Bell, Search, User } from 'lucide-react';
|
|
19
|
-
import { User } from '../../types/auth'
|
|
20
2
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="header_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import UI icons and User type for Header component"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide external dependencies for Header"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Menu, Bell, MagnifyingGlassIcon, User" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports Lucide icons, Heroicons, and auth User type" 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: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/layout/Sidebar.tsx, \."]
|
|
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"]
|
|
19
|
+
import { Menu, Bell } from 'lucide-react';
|
|
20
|
+
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
|
21
|
+
import { User } from '../../types/auth'
|
|
22
|
+
// CIL[END chunk_id="header_moduleheader_1783929861"]
|
|
23
|
+
// CIL[BEGIN chunk_id="header_headerprops_1783929861" type="interface" identity="HeaderProps" parent="none"]
|
|
24
|
+
// CIL[DOC-MACRO purpose="Define props interface for Header component"]
|
|
25
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify Header component contract"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="HeaderProps interface" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Interface with menu callback and optional user data" notable_decisions="[]"]
|
|
29
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
30
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
31
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
32
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
33
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
34
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
35
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
36
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
27
37
|
interface HeaderProps {
|
|
28
38
|
onMenuClick: () => void
|
|
29
39
|
user: User | null
|
|
30
40
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
// CIL[END chunk_id="header_headerprops_1783929861"]
|
|
42
|
+
// CIL[BEGIN chunk_id="header_header_1783929861" type="function" identity="Header" parent="none"]
|
|
43
|
+
// CIL[DOC-MACRO purpose="Render sticky header with menu, search, notifications, and user avatar"]
|
|
44
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display top navigation bar with user controls"]
|
|
45
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Header" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
46
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX header element" errors="none" side_effects="Calls onMenuClick when menu button clicked"]
|
|
47
|
+
// CIL[DOC-MICRO logic_summary="Responsive layout with mobile menu button, search input, notification bell, and user avatar" notable_decisions="[]"]
|
|
48
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
49
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
50
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
51
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
52
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
53
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
54
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
55
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
39
56
|
export function Header({ onMenuClick, user }: HeaderProps) {
|
|
40
57
|
return (
|
|
41
58
|
<header className="sticky top-0 z-20 flex h-14 shrink-0 items-center gap-4 border-b border-slate-200 bg-white/80 backdrop-blur-md px-4 sm:px-6 lg:pl-72 lg:pr-8">
|
|
42
|
-
{/* Logo + Mobile hamburger — only visible below lg */}
|
|
43
59
|
<div className="flex items-center gap-3">
|
|
44
60
|
<button
|
|
45
61
|
onClick={onMenuClick}
|
|
@@ -50,12 +66,9 @@ export function Header({ onMenuClick, user }: HeaderProps) {
|
|
|
50
66
|
</button>
|
|
51
67
|
</div>
|
|
52
68
|
|
|
53
|
-
{/* Spacer */}
|
|
54
69
|
<div className="flex-1" />
|
|
55
70
|
|
|
56
|
-
{/* Right actions */}
|
|
57
71
|
<div className="flex items-center gap-3">
|
|
58
|
-
{/* Search */}
|
|
59
72
|
<div className="relative hidden sm:block">
|
|
60
73
|
<MagnifyingGlassIcon className="pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-slate-400" />
|
|
61
74
|
<input
|
|
@@ -65,7 +78,6 @@ export function Header({ onMenuClick, user }: HeaderProps) {
|
|
|
65
78
|
/>
|
|
66
79
|
</div>
|
|
67
80
|
|
|
68
|
-
{/* Notifications */}
|
|
69
81
|
<button
|
|
70
82
|
className="relative rounded-lg p-2 text-slate-400 hover:bg-slate-100 hover:text-slate-600 transition-colors"
|
|
71
83
|
aria-label="Notifications"
|
|
@@ -73,7 +85,6 @@ export function Header({ onMenuClick, user }: HeaderProps) {
|
|
|
73
85
|
<Bell className="h-5 w-5" />
|
|
74
86
|
</button>
|
|
75
87
|
|
|
76
|
-
{/* User avatar */}
|
|
77
88
|
<div className="flex items-center gap-2 pl-2 border-l border-slate-200">
|
|
78
89
|
<div className="flex h-7 w-7 items-center justify-center rounded-full bg-navy text-xs font-medium text-white">
|
|
79
90
|
{user?.full_name?.charAt(0) || user?.email?.charAt(0) || '?'}
|
|
@@ -86,3 +97,4 @@ export function Header({ onMenuClick, user }: HeaderProps) {
|
|
|
86
97
|
</header>
|
|
87
98
|
)
|
|
88
99
|
}
|
|
100
|
+
// CIL[END chunk_id="header_header_1783929861"]
|
|
@@ -1,39 +1,58 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/components/layout/Layout
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-component
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Root app shell providing the two-pane admin layout:
|
|
8
|
-
* - **Desktop (`lg+`):** fixed 60-wide `<Sidebar>` on the left, scrollable
|
|
9
|
-
* main content area padded with `lg:pl-60`.
|
|
10
|
-
* - **Mobile (`< lg`):** top bar with hamburger button that opens a
|
|
11
|
-
* slide-over `<Sidebar>` with a backdrop overlay.
|
|
12
|
-
*
|
|
13
|
-
* `isActive` is computed from the current `location.pathname` and passed
|
|
14
|
-
* to `SidebarContent` for active-link highlighting.
|
|
15
|
-
*
|
|
16
|
-
* @seeAlso src/components/layout/Sidebar.tsx
|
|
17
|
-
* @seeAlso src/contexts/AuthContext.tsx (provides `user` and `logout`)
|
|
18
|
-
*/
|
|
19
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="layout_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React hooks and layout components for main app shell"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide dependencies for Layout component"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React, useState, Sidebar, SidebarContent, useAuth, useLocation" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, local Sidebar components, auth context, and router" 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: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/layout/Sidebar.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
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"]
|
|
20
19
|
import React, { useState } from 'react'
|
|
21
20
|
import { Sidebar, SidebarContent } from './Sidebar'
|
|
22
21
|
import { useAuth } from '../../contexts/AuthContext'
|
|
23
22
|
import { useLocation } from 'react-router-dom'
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
// CIL[END chunk_id="layout_moduleheader_1783929861"]
|
|
24
|
+
// CIL[BEGIN chunk_id="layout_layoutprops_1783929861" type="interface" identity="LayoutProps" parent="none"]
|
|
25
|
+
// CIL[DOC-MACRO purpose="Define props interface for Layout component"]
|
|
26
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify Layout component contract"]
|
|
27
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-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\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
28
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="LayoutProps interface" errors="none" side_effects="none"]
|
|
29
|
+
// CIL[DOC-MICRO logic_summary="Interface accepting React children for main content area" notable_decisions="[]"]
|
|
30
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
31
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-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, .framework/functions/_shared/principal.ts, \."]
|
|
33
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
34
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
35
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
36
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
37
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
26
38
|
interface LayoutProps {
|
|
27
39
|
children: React.ReactNode
|
|
28
40
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
// CIL[END chunk_id="layout_layoutprops_1783929861"]
|
|
42
|
+
// CIL[BEGIN chunk_id="layout_layout_1783929861" type="function" identity="Layout" parent="none"]
|
|
43
|
+
// CIL[DOC-MACRO purpose="Render responsive two-pane admin layout with sidebar and main content"]
|
|
44
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide root app shell with mobile/desktop sidebar behavior"]
|
|
45
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Layout" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
46
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX layout with sidebar" errors="none" side_effects="Manages sidebar open state and navigation highlighting"]
|
|
47
|
+
// CIL[DOC-MICRO logic_summary="Responsive layout with mobile overlay sidebar and fixed desktop sidebar" notable_decisions="[]"]
|
|
48
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
49
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
50
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/layout/Sidebar.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
51
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
52
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
53
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
54
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
55
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
37
56
|
export function Layout({ children }: LayoutProps) {
|
|
38
57
|
const [sidebarOpen, setSidebarOpen] = useState(false)
|
|
39
58
|
const { user, logout } = useAuth()
|
|
@@ -44,7 +63,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
44
63
|
|
|
45
64
|
return (
|
|
46
65
|
<div className="min-h-screen bg-[#F2F3F8] flex lg:top-0">
|
|
47
|
-
{/* Mobile overlay */}
|
|
48
66
|
{sidebarOpen && (
|
|
49
67
|
<>
|
|
50
68
|
<div
|
|
@@ -55,7 +73,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
55
73
|
</>
|
|
56
74
|
)}
|
|
57
75
|
|
|
58
|
-
{/* Desktop sidebar — visible at lg+ */}
|
|
59
76
|
<aside className="hidden lg:flex lg:fixed lg:inset-y-0 lg:left-0 lg:z-30 lg:w-60 lg:flex-col lg:shrink-0 bg-white border-r border-slate-200 lg:top-0">
|
|
60
77
|
<SidebarContent
|
|
61
78
|
isActive={isActive}
|
|
@@ -65,7 +82,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
65
82
|
/>
|
|
66
83
|
</aside>
|
|
67
84
|
|
|
68
|
-
{/* Mobile sidebar with menu button */}
|
|
69
85
|
<div className="lg:hidden flex items-center justify-between p-4 bg-white border-b border-slate-200">
|
|
70
86
|
<button
|
|
71
87
|
onClick={() => setSidebarOpen(true)}
|
|
@@ -82,7 +98,6 @@ export function Layout({ children }: LayoutProps) {
|
|
|
82
98
|
</div>
|
|
83
99
|
</div>
|
|
84
100
|
|
|
85
|
-
{/* Main content area */}
|
|
86
101
|
<div className="flex-1 flex flex-col min-w-0 lg:pl-60">
|
|
87
102
|
<main className="flex-1 py-6 px-4 sm:px-6 lg:px-8 xl:px-12">
|
|
88
103
|
<div className="max-w-6xl mx-auto">
|
|
@@ -93,3 +108,4 @@ export function Layout({ children }: LayoutProps) {
|
|
|
93
108
|
</div>
|
|
94
109
|
)
|
|
95
110
|
}
|
|
111
|
+
// CIL[END chunk_id="layout_layout_1783929861"]
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// CIL[BEGIN chunk_id="sidebar_moduleheader_1783929861" type="module_header" identity="imports" parent="none"]
|
|
9
|
+
// CIL[DOC-MACRO purpose="Import React hooks, router, auth, UI components and navigation icons"]
|
|
10
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide all dependencies for sidebar navigation system"]
|
|
11
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
12
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="React hooks, router, auth, UI components, icons" errors="none" side_effects="none"]
|
|
13
|
+
// CIL[DOC-MICRO logic_summary="Imports useState, Link, useLocation, useAuth, Popover components and 20+ Lucide icons" notable_decisions="[]"]
|
|
14
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
15
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
16
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
17
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
18
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
19
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
20
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
21
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
22
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
23
|
import { useState } from 'react'
|
|
2
24
|
import { Link, useLocation } from 'react-router-dom'
|
|
3
25
|
import { useAuth } from '../../contexts/AuthContext'
|
|
@@ -21,17 +43,48 @@ import {
|
|
|
21
43
|
User,
|
|
22
44
|
MoreVertical,
|
|
23
45
|
ShieldCheck,
|
|
24
|
-
Key,
|
|
46
|
+
Key,
|
|
47
|
+
Truck,
|
|
25
48
|
FlaskConical,
|
|
26
49
|
BarChart3,
|
|
27
|
-
Bell
|
|
50
|
+
Bell,
|
|
51
|
+
Cpu,
|
|
52
|
+
BookOpen
|
|
28
53
|
} from 'lucide-react'
|
|
29
|
-
|
|
54
|
+
// CIL[END chunk_id="sidebar_moduleheader_1783929861"]
|
|
55
|
+
// CIL[BEGIN chunk_id="sidebar_sidebarprops_1783929861" type="interface" identity="SidebarProps" parent="none"]
|
|
56
|
+
// CIL[DOC-MACRO purpose="Define props interface for mobile overlay Sidebar component"]
|
|
57
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify Sidebar component contract for mobile overlay"]
|
|
58
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
59
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="SidebarProps interface" errors="none" side_effects="none"]
|
|
60
|
+
// CIL[DOC-MICRO logic_summary="Interface with open state and close callback for mobile sidebar" notable_decisions="[]"]
|
|
61
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
62
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
63
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
64
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
65
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
66
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
67
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
68
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
30
69
|
interface SidebarProps {
|
|
31
70
|
open: boolean
|
|
32
71
|
onClose: () => void
|
|
33
72
|
}
|
|
34
|
-
|
|
73
|
+
// CIL[END chunk_id="sidebar_sidebarprops_1783929861"]
|
|
74
|
+
// CIL[BEGIN chunk_id="sidebar_constants_1783929861" type="constants" identity="navigation" parent="none"]
|
|
75
|
+
// CIL[DOC-MACRO purpose="Define navigation arrays for sidebar menu sections and links"]
|
|
76
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide navigation structure for admin interface"]
|
|
77
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
78
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="navigation constants arrays" errors="none" side_effects="none"]
|
|
79
|
+
// CIL[DOC-MICRO logic_summary="Main nav, configs, observability, and runtime entity navigation arrays with icons" notable_decisions="[]"]
|
|
80
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
81
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
82
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
83
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
84
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
85
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
86
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
87
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
35
88
|
const navigation = [
|
|
36
89
|
{ name: 'Dashboard', href: '/spine-framework/admin/configs/types', icon: Home },
|
|
37
90
|
]
|
|
@@ -44,7 +97,6 @@ const configsNavigation = [
|
|
|
44
97
|
{ divider: true },
|
|
45
98
|
{ name: 'AI Agents', href: '/spine-framework/admin/configs/ai-agents', icon: Sparkles },
|
|
46
99
|
{ name: 'Prompt Configs', href: '/spine-framework/admin/configs/prompts', icon: FileText },
|
|
47
|
-
{ name: 'Embeddings', href: '/spine-framework/admin/configs/embeddings', icon: FileText },
|
|
48
100
|
{ divider: true },
|
|
49
101
|
{ name: 'Pipelines', href: '/spine-framework/admin/configs/pipelines', icon: RefreshCw },
|
|
50
102
|
{ name: 'Triggers', href: '/spine-framework/admin/configs/triggers', icon: Zap },
|
|
@@ -52,6 +104,7 @@ const configsNavigation = [
|
|
|
52
104
|
{ divider: true },
|
|
53
105
|
{ name: 'Integrations', href: '/spine-framework/admin/configs/integrations', icon: LinkIcon },
|
|
54
106
|
{ name: 'API Keys', href: '/spine-framework/admin/configs/api-keys', icon: Key },
|
|
107
|
+
{ name: 'Deliveries', href: '/spine-framework/admin/configs/deliveries', icon: Truck },
|
|
55
108
|
] as const
|
|
56
109
|
|
|
57
110
|
const observabilityNavigation = [
|
|
@@ -61,7 +114,6 @@ const observabilityNavigation = [
|
|
|
61
114
|
{ name: 'Logs', href: '/spine-framework/admin/observability/logs', icon: FileText },
|
|
62
115
|
]
|
|
63
116
|
|
|
64
|
-
// Database entities that should be shown in runtime navigation
|
|
65
117
|
const runtimeEntities = [
|
|
66
118
|
{ name: 'Items', href: '/spine-framework/admin/runtime/items', icon: Box },
|
|
67
119
|
{ name: 'Accounts', href: '/spine-framework/admin/runtime/accounts', icon: Building2 },
|
|
@@ -69,14 +121,46 @@ const runtimeEntities = [
|
|
|
69
121
|
{ name: 'Person Types', href: '/spine-framework/admin/runtime/person-types', icon: Users },
|
|
70
122
|
]
|
|
71
123
|
|
|
124
|
+
const kbEngineNavigation = [
|
|
125
|
+
{ name: 'Knowledge Base', href: '/spine-framework/admin/kb/kb-spine-public', icon: BookOpen },
|
|
126
|
+
{ name: 'Embeddings', href: '/spine-framework/admin/kb/embeddings', icon: Cpu },
|
|
127
|
+
]
|
|
128
|
+
// CIL[END chunk_id="sidebar_constants_1783929861"]
|
|
129
|
+
// CIL[BEGIN chunk_id="sidebar_classnames_1783929861" type="function" identity="classNames" parent="none"]
|
|
130
|
+
// CIL[DOC-MACRO purpose="Utility function to combine CSS class names, filtering falsy values"]
|
|
131
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide CSS class name concatenation utility"]
|
|
132
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
133
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="concatenated class string" errors="none" side_effects="none"]
|
|
134
|
+
// CIL[DOC-MICRO logic_summary="Filters Boolean values and joins with spaces for Tailwind CSS" notable_decisions="[]"]
|
|
135
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
136
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
137
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 2. Direct calls: 0. Related files: custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/025_retype_threads_messages.sql, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
138
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
|
|
139
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
140
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
141
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
142
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
72
143
|
function classNames(...classes: (string | false | undefined)[]) {
|
|
73
144
|
return classes.filter(Boolean).join(' ')
|
|
74
145
|
}
|
|
75
|
-
|
|
146
|
+
// CIL[END chunk_id="sidebar_classnames_1783929861"]
|
|
147
|
+
// CIL[BEGIN chunk_id="sidebar_sidebar_1783929861" type="function" identity="Sidebar" parent="none"]
|
|
148
|
+
// CIL[DOC-MACRO purpose="Render mobile overlay sidebar with backdrop and close functionality"]
|
|
149
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide mobile sidebar overlay with backdrop and close button"]
|
|
150
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
151
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX overlay sidebar" errors="none" side_effects="Calls onClose when backdrop or close button clicked"]
|
|
152
|
+
// CIL[DOC-MICRO logic_summary="Conditional overlay with backdrop, close button, and SidebarContent" notable_decisions="[]"]
|
|
153
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
154
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
155
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
156
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
157
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
158
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
159
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
160
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
76
161
|
export function Sidebar({ open, onClose }: SidebarProps) {
|
|
77
162
|
return (
|
|
78
163
|
<>
|
|
79
|
-
{/* Mobile sidebar */}
|
|
80
164
|
<div className={classNames(open && 'fixed inset-0 z-40 flex')}>
|
|
81
165
|
{open && (
|
|
82
166
|
<div className="fixed inset-0 z-40 flex">
|
|
@@ -108,23 +192,53 @@ export function Sidebar({ open, onClose }: SidebarProps) {
|
|
|
108
192
|
</>
|
|
109
193
|
)
|
|
110
194
|
}
|
|
111
|
-
|
|
195
|
+
// CIL[END chunk_id="sidebar_sidebar_1783929861"]
|
|
196
|
+
// CIL[BEGIN chunk_id="sidebar_sidebarcontentprops_1783929861" type="interface" identity="SidebarContentProps" parent="none"]
|
|
197
|
+
// CIL[DOC-MACRO purpose="Define props interface for SidebarContent navigation component"]
|
|
198
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify SidebarContent component contract"]
|
|
199
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[]"]
|
|
200
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="SidebarContentProps interface" errors="none" side_effects="none"]
|
|
201
|
+
// CIL[DOC-MICRO logic_summary="Interface with optional navigation click callback" notable_decisions="[]"]
|
|
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: frontend-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"]
|
|
112
210
|
interface SidebarContentProps {
|
|
113
211
|
onNavClick?: () => void
|
|
114
212
|
}
|
|
115
|
-
|
|
213
|
+
// CIL[END chunk_id="sidebar_sidebarcontentprops_1783929861"]
|
|
214
|
+
// CIL[BEGIN chunk_id="sidebar_sidebarcontent_1783929861" type="function" identity="SidebarContent" parent="none"]
|
|
215
|
+
// CIL[DOC-MACRO purpose="Render main sidebar navigation with collapsible sections and user menu"]
|
|
216
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide complete sidebar navigation with admin sections and user controls"]
|
|
217
|
+
// CIL[DOC-CONTEXT module="src/components/layout/Sidebar" layer="frontend-component" related_files="[]"]
|
|
218
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX navigation with collapsible sections" errors="none" side_effects="Manages section state, calls logout, triggers navigation"]
|
|
219
|
+
// CIL[DOC-MICRO logic_summary="Collapsible admin sections (configs, data, observability) with role-based access and user popover" notable_decisions="[]"]
|
|
220
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
221
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
222
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
223
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
224
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
225
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
226
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
227
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
116
228
|
export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
117
229
|
const location = useLocation()
|
|
118
230
|
const { user, logout } = useAuth()
|
|
119
231
|
const isSystemAdmin = user?.roles?.includes('system_admin')
|
|
120
232
|
|
|
121
|
-
// Collapsible sections state
|
|
122
233
|
const [configsOpen, setConfigsOpen] = useState(() =>
|
|
123
234
|
location.pathname.includes('/admin/configs')
|
|
124
235
|
)
|
|
125
236
|
const [runtimeOpen, setRuntimeOpen] = useState(() =>
|
|
126
237
|
location.pathname.includes('/admin/runtime')
|
|
127
238
|
)
|
|
239
|
+
const [kbEngineOpen, setKbEngineOpen] = useState(() =>
|
|
240
|
+
location.pathname.includes('/admin/kb')
|
|
241
|
+
)
|
|
128
242
|
const [observabilityOpen, setObservabilityOpen] = useState(() =>
|
|
129
243
|
location.pathname.includes('/admin/observability')
|
|
130
244
|
)
|
|
@@ -135,7 +249,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
135
249
|
|
|
136
250
|
return (
|
|
137
251
|
<nav className="mt-5 flex flex-1 flex-col px-2">
|
|
138
|
-
{/* Main nav */}
|
|
139
252
|
<div className="space-y-1">
|
|
140
253
|
{navigation.map((item) => (
|
|
141
254
|
<Link
|
|
@@ -161,7 +274,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
161
274
|
))}
|
|
162
275
|
</div>
|
|
163
276
|
|
|
164
|
-
{/* Configs Section */}
|
|
165
277
|
{isSystemAdmin && (
|
|
166
278
|
<>
|
|
167
279
|
<div className="mt-6">
|
|
@@ -209,7 +321,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
209
321
|
)}
|
|
210
322
|
</div>
|
|
211
323
|
|
|
212
|
-
{/* Runtime Section */}
|
|
213
324
|
<div className="mt-4">
|
|
214
325
|
<button
|
|
215
326
|
onClick={() => setRuntimeOpen(!runtimeOpen)}
|
|
@@ -251,7 +362,47 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
251
362
|
)}
|
|
252
363
|
</div>
|
|
253
364
|
|
|
254
|
-
|
|
365
|
+
<div className="mt-4">
|
|
366
|
+
<button
|
|
367
|
+
onClick={() => setKbEngineOpen(!kbEngineOpen)}
|
|
368
|
+
className="flex w-full items-center justify-between px-2 py-2 text-sm font-medium text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground rounded-md"
|
|
369
|
+
>
|
|
370
|
+
<span>KB Engine</span>
|
|
371
|
+
{kbEngineOpen ? (
|
|
372
|
+
<ChevronDown className="h-4 w-4" />
|
|
373
|
+
) : (
|
|
374
|
+
<ChevronRight className="h-4 w-4" />
|
|
375
|
+
)}
|
|
376
|
+
</button>
|
|
377
|
+
|
|
378
|
+
{kbEngineOpen && (
|
|
379
|
+
<div className="mt-1 space-y-1">
|
|
380
|
+
{kbEngineNavigation.map((item) => (
|
|
381
|
+
<Link
|
|
382
|
+
key={item.name}
|
|
383
|
+
to={item.href}
|
|
384
|
+
onClick={onNavClick}
|
|
385
|
+
className={classNames(
|
|
386
|
+
isActive(item.href)
|
|
387
|
+
? 'bg-sidebar-accent text-sidebar-accent-foreground'
|
|
388
|
+
: 'text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
|
|
389
|
+
'group flex items-center rounded-md px-2 py-2 text-sm font-medium pl-4'
|
|
390
|
+
)}
|
|
391
|
+
>
|
|
392
|
+
<item.icon
|
|
393
|
+
className={classNames(
|
|
394
|
+
isActive(item.href) ? 'text-sidebar-accent-foreground' : 'text-sidebar-foreground',
|
|
395
|
+
'mr-3 h-4 w-4 flex-shrink-0'
|
|
396
|
+
)}
|
|
397
|
+
aria-hidden="true"
|
|
398
|
+
/>
|
|
399
|
+
{item.name}
|
|
400
|
+
</Link>
|
|
401
|
+
))}
|
|
402
|
+
</div>
|
|
403
|
+
)}
|
|
404
|
+
</div>
|
|
405
|
+
|
|
255
406
|
<div className="mt-4">
|
|
256
407
|
<button
|
|
257
408
|
onClick={() => setObservabilityOpen(!observabilityOpen)}
|
|
@@ -295,7 +446,6 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
295
446
|
</>
|
|
296
447
|
)}
|
|
297
448
|
|
|
298
|
-
{/* User section */}
|
|
299
449
|
<div className="mt-auto border-t border-sidebar-border pt-4">
|
|
300
450
|
<Popover>
|
|
301
451
|
<PopoverTrigger asChild>
|
|
@@ -327,3 +477,4 @@ export function SidebarContent({ onNavClick }: SidebarContentProps) {
|
|
|
327
477
|
</nav>
|
|
328
478
|
)
|
|
329
479
|
}
|
|
480
|
+
// CIL[END chunk_id="sidebar_sidebarcontent_1783929861"]
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="DataDetailHeader_module_header_1783929048" type="module_header" identity="imports_and_types" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Import dependencies and define detail header component types"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage imports and interface for detail header"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="runtime" layer="frontend-component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="types" errors="none" side_effects="none"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Imports React, UI components, defines DataDetailHeaderProps" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/table-primitives.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
18
|
import React from 'react'
|
|
2
19
|
import { Button } from '../ui/button'
|
|
3
20
|
import * as Icons from 'lucide-react'
|
|
@@ -15,7 +32,21 @@ interface DataDetailHeaderProps {
|
|
|
15
32
|
saving?: boolean
|
|
16
33
|
deleting?: boolean
|
|
17
34
|
}
|
|
18
|
-
|
|
35
|
+
// CIL[END chunk_id="DataDetailHeader_module_header_1783929048"]
|
|
36
|
+
// CIL[BEGIN chunk_id="DataDetailHeader_datadetailheader_1783929048" type="function" identity="DataDetailHeader" parent="none"]
|
|
37
|
+
// CIL[DOC-MACRO purpose="Render entity detail header with edit/save/delete buttons"]
|
|
38
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display header with title, icon, and action buttons"]
|
|
39
|
+
// CIL[DOC-CONTEXT module="runtime" layer="frontend-component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
40
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX header" errors="none" side_effects="calls callbacks"]
|
|
41
|
+
// CIL[DOC-MICRO logic_summary="Renders icon, title, and conditional edit/save/delete buttons" notable_decisions="[]"]
|
|
42
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
43
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
44
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/table-primitives.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
45
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
46
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
47
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
48
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
49
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
19
50
|
export function DataDetailHeader({
|
|
20
51
|
entity,
|
|
21
52
|
icon,
|
|
@@ -75,3 +106,4 @@ export function DataDetailHeader({
|
|
|
75
106
|
</div>
|
|
76
107
|
)
|
|
77
108
|
}
|
|
109
|
+
// CIL[END chunk_id="DataDetailHeader_datadetailheader_1783929048"]
|