spine-framework 0.3.125 → 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 +169 -97
- package/.framework/cli/commands/generate.ts +82 -160
- 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} +147 -54
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +222 -347
- 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 +162 -14
- 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 +687 -533
- 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 +173 -145
- 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 +192 -115
- 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 +3 -3
- 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,21 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="AdminListPage_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and UI components for admin list page"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for admin list page"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="AdminListPage" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and components" errors="Import failures" side_effects="Module loading"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, UI components, icons, and utility functions" 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, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.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"]
|
|
1
19
|
import React, { ReactNode } from 'react'
|
|
2
20
|
import { Button } from '../ui/button'
|
|
3
21
|
import { Card, CardContent } from '../ui/card'
|
|
@@ -7,11 +25,27 @@ import { Skeleton } from '../ui/skeleton'
|
|
|
7
25
|
import { Search } from 'lucide-react'
|
|
8
26
|
import { LucideIcon } from 'lucide-react'
|
|
9
27
|
import { AdminStatsCard } from './AdminStatsCard'
|
|
28
|
+
import { PageInstructions } from './PageInstructions'
|
|
10
29
|
import { cn } from '../../lib/utils'
|
|
11
|
-
|
|
30
|
+
// CIL[END chunk_id="AdminListPage_module_header_1783931090"]
|
|
31
|
+
// CIL[BEGIN chunk_id="AdminListPage_interface_1783931090" type="interface" identity="AdminListPageProps" parent="none"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="Define props interface for AdminListPage component"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for admin list page properties"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="AdminListPage" layer="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\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Defines props for title, stats, search, filters, content, and loading states" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
|
+
// CIL[DOC-VECTOR type="context" content="Layer: 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, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
40
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
41
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
42
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
43
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
44
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
12
45
|
interface AdminListPageProps {
|
|
13
46
|
title: string
|
|
14
47
|
description: string
|
|
48
|
+
noPageInstructions?: boolean
|
|
15
49
|
newButtonText?: string
|
|
16
50
|
newButtonHref?: string
|
|
17
51
|
onNewClick?: () => void
|
|
@@ -37,10 +71,25 @@ interface AdminListPageProps {
|
|
|
37
71
|
emptyMessage?: string
|
|
38
72
|
emptyIcon?: LucideIcon
|
|
39
73
|
}
|
|
40
|
-
|
|
74
|
+
// CIL[END chunk_id="AdminListPage_interface_1783931090"]
|
|
75
|
+
// CIL[BEGIN chunk_id="AdminListPage_adminlistpage_1783931090" type="function" identity="AdminListPage" parent="none"]
|
|
76
|
+
// CIL[DOC-MACRO purpose="Admin list page component with stats, search, filters, and content"]
|
|
77
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render comprehensive admin list interface with all features"]
|
|
78
|
+
// CIL[DOC-CONTEXT module="AdminListPage" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
79
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Admin list page JSX" errors="Rendering errors" side_effects="UI rendering"]
|
|
80
|
+
// CIL[DOC-MICRO logic_summary="Renders header, stats cards, search/filters, content with loading/error states" notable_decisions="['comprehensive_layout', 'loading_states']"]
|
|
81
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
82
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
83
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
84
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
85
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
86
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
87
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
88
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
41
89
|
export function AdminListPage({
|
|
42
90
|
title,
|
|
43
91
|
description,
|
|
92
|
+
noPageInstructions,
|
|
44
93
|
newButtonText,
|
|
45
94
|
newButtonHref = '#',
|
|
46
95
|
onNewClick,
|
|
@@ -56,7 +105,6 @@ export function AdminListPage({
|
|
|
56
105
|
}: AdminListPageProps) {
|
|
57
106
|
return (
|
|
58
107
|
<div className="space-y-6">
|
|
59
|
-
{/* Header */}
|
|
60
108
|
<div className="flex justify-between items-center">
|
|
61
109
|
<div>
|
|
62
110
|
<h1 className="text-xl font-semibold">{title}</h1>
|
|
@@ -70,7 +118,29 @@ export function AdminListPage({
|
|
|
70
118
|
)}
|
|
71
119
|
</div>
|
|
72
120
|
|
|
73
|
-
{
|
|
121
|
+
{!noPageInstructions && (
|
|
122
|
+
<PageInstructions
|
|
123
|
+
sections={[
|
|
124
|
+
{
|
|
125
|
+
title: 'What this page is for',
|
|
126
|
+
content: `This page is the administrative list for ${title.toLowerCase()}. It shows all records in the system, their current state, and provides tools to search, filter, and create new records.`,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
title: 'How to find records',
|
|
130
|
+
content: `Use the search field at the top of the list to look for records by name or keyword. Use the filter dropdowns to narrow the list by status, type, or other categories. Click any column header to sort ascending or descending.`,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
title: 'How to create, view, and edit records',
|
|
134
|
+
content: `${newButtonText ? `Click the ${newButtonText} button in the top-right to create a new record. ` : ''}Click any row in the table to open its detail page. From the detail page you can review all fields, edit the record, and, if allowed, delete it. Deleting a record usually cannot be undone.`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
title: 'Understanding the stats',
|
|
138
|
+
content: `The summary cards above the table show the most important counts for this record type. Use them as a quick health check or to spot trends before drilling into the list.`,
|
|
139
|
+
},
|
|
140
|
+
]}
|
|
141
|
+
/>
|
|
142
|
+
)}
|
|
143
|
+
|
|
74
144
|
<div className="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
|
75
145
|
{statsCards.map((stat, index) => (
|
|
76
146
|
<AdminStatsCard
|
|
@@ -83,11 +153,9 @@ export function AdminListPage({
|
|
|
83
153
|
))}
|
|
84
154
|
</div>
|
|
85
155
|
|
|
86
|
-
{/* Search and Filters */}
|
|
87
156
|
<Card>
|
|
88
157
|
<CardContent className="p-4">
|
|
89
158
|
<div className="flex flex-col sm:flex-row gap-4">
|
|
90
|
-
{/* Search */}
|
|
91
159
|
{onSearchChange && (
|
|
92
160
|
<div className="flex-1">
|
|
93
161
|
<div className="relative">
|
|
@@ -102,7 +170,6 @@ export function AdminListPage({
|
|
|
102
170
|
</div>
|
|
103
171
|
)}
|
|
104
172
|
|
|
105
|
-
{/* Filters */}
|
|
106
173
|
{filters.map((filter, index) => (
|
|
107
174
|
<div key={index} className="sm:w-48">
|
|
108
175
|
<Select value={filter.value} onValueChange={filter.onChange}>
|
|
@@ -123,7 +190,6 @@ export function AdminListPage({
|
|
|
123
190
|
</CardContent>
|
|
124
191
|
</Card>
|
|
125
192
|
|
|
126
|
-
{/* Content */}
|
|
127
193
|
<Card>
|
|
128
194
|
{loading ? (
|
|
129
195
|
<div className="p-8 space-y-4">
|
|
@@ -149,3 +215,4 @@ export function AdminListPage({
|
|
|
149
215
|
</div>
|
|
150
216
|
)
|
|
151
217
|
}
|
|
218
|
+
// CIL[END chunk_id="AdminListPage_adminlistpage_1783931090"]
|
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/components/admin/AdminSidebar
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-component
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Admin sidebar with proper sections, React Router navigation, and active link highlighting.
|
|
8
|
-
*/
|
|
9
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="AdminSidebar_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React, routing, and UI components for admin sidebar"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for admin sidebar"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="AdminSidebar" layer="component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and icons" errors="Import failures" side_effects="Module loading"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, routing, Lucide icons, and sidebar UI components" 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/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.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"]
|
|
10
19
|
import * as React from "react"
|
|
11
20
|
import { Link, useLocation } from "react-router-dom"
|
|
12
21
|
import {
|
|
@@ -29,8 +38,12 @@ import {
|
|
|
29
38
|
Shield,
|
|
30
39
|
MessageSquare,
|
|
31
40
|
Key,
|
|
41
|
+
Truck,
|
|
32
42
|
TestTube,
|
|
33
|
-
UserPlus
|
|
43
|
+
UserPlus,
|
|
44
|
+
BookOpen,
|
|
45
|
+
ChevronRight,
|
|
46
|
+
ChevronDown
|
|
34
47
|
} from "lucide-react"
|
|
35
48
|
import {
|
|
36
49
|
Sidebar,
|
|
@@ -43,11 +56,28 @@ import {
|
|
|
43
56
|
SidebarMenu,
|
|
44
57
|
SidebarMenuButton,
|
|
45
58
|
SidebarMenuItem,
|
|
59
|
+
SidebarMenuSub,
|
|
60
|
+
SidebarMenuSubButton,
|
|
61
|
+
SidebarMenuSubItem,
|
|
46
62
|
SidebarRail,
|
|
47
63
|
} from "../ui/sidebar"
|
|
48
64
|
import { Button } from "../ui/button"
|
|
49
|
-
|
|
50
|
-
//
|
|
65
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../ui/collapsible"
|
|
66
|
+
// CIL[END chunk_id="AdminSidebar_module_header_1783931090"]
|
|
67
|
+
// CIL[BEGIN chunk_id="AdminSidebar_navigation_sections_1783931090" type="navigation_data" identity="navigation_sections" parent="none"]
|
|
68
|
+
// CIL[DOC-MACRO purpose="Define navigation structure for admin interface"]
|
|
69
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure sidebar navigation sections and items"]
|
|
70
|
+
// CIL[DOC-CONTEXT module="AdminSidebar" layer="component" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
71
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Navigation data structure" errors="none" side_effects="none"]
|
|
72
|
+
// CIL[DOC-MICRO logic_summary="Organizes admin sections: configs, access, runtime, observability, testing" notable_decisions="['section_organization', 'icon_mapping']"]
|
|
73
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
74
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
75
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
76
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
77
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
78
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
79
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
80
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
51
81
|
const navigationSections = [
|
|
52
82
|
{
|
|
53
83
|
title: "Configs",
|
|
@@ -57,12 +87,18 @@ const navigationSections = [
|
|
|
57
87
|
{ title: "Pipelines", url: "/spine-framework/admin/configs/pipelines", icon: Activity },
|
|
58
88
|
{ title: "Triggers", url: "/spine-framework/admin/configs/triggers", icon: AlertTriangle },
|
|
59
89
|
{ title: "AI Agents", url: "/spine-framework/admin/configs/ai-agents", icon: Brain },
|
|
60
|
-
{ title: "Embeddings", url: "/spine-framework/admin/configs/embeddings", icon: Cpu },
|
|
61
90
|
{ title: "Timers", url: "/spine-framework/admin/configs/timers", icon: Timer },
|
|
62
|
-
{
|
|
91
|
+
{
|
|
92
|
+
title: "Integration Broker",
|
|
93
|
+
icon: Puzzle,
|
|
94
|
+
children: [
|
|
95
|
+
{ title: "Integrations", url: "/spine-framework/admin/configs/integrations", icon: Puzzle },
|
|
96
|
+
{ title: "API Keys", url: "/spine-framework/admin/configs/api-keys", icon: Key },
|
|
97
|
+
{ title: "Deliveries", url: "/spine-framework/admin/configs/deliveries", icon: Truck },
|
|
98
|
+
]
|
|
99
|
+
},
|
|
63
100
|
{ title: "Roles", url: "/spine-framework/admin/configs/roles", icon: Shield },
|
|
64
101
|
{ title: "Prompts", url: "/spine-framework/admin/configs/prompts", icon: MessageSquare },
|
|
65
|
-
{ title: "API Keys", url: "/spine-framework/admin/configs/api-keys", icon: Key },
|
|
66
102
|
]
|
|
67
103
|
},
|
|
68
104
|
{
|
|
@@ -99,13 +135,41 @@ const navigationSections = [
|
|
|
99
135
|
items: [
|
|
100
136
|
{ title: "Test Runs", url: "/spine-framework/admin/testing", icon: TestTube },
|
|
101
137
|
]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
title: "KB Engine",
|
|
141
|
+
items: [
|
|
142
|
+
{ title: "Knowledge Base", url: "/spine-framework/admin/kb/kb-spine-public", icon: BookOpen },
|
|
143
|
+
{ title: "Embeddings", url: "/spine-framework/admin/kb/embeddings", icon: Cpu },
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: "CIL",
|
|
148
|
+
items: [
|
|
149
|
+
{ title: "Projects", url: "/spine-framework/admin/cil", icon: Brain },
|
|
150
|
+
{ title: "Search", url: "/spine-framework/admin/cil/search", icon: FileSearch },
|
|
151
|
+
{ title: "Agent", url: "/spine-framework/admin/cil/agent", icon: MessageSquare },
|
|
152
|
+
]
|
|
102
153
|
}
|
|
103
154
|
]
|
|
104
|
-
|
|
155
|
+
// CIL[END chunk_id="AdminSidebar_navigation_sections_1783931090"]
|
|
156
|
+
// CIL[BEGIN chunk_id="AdminSidebar_adminsidebar_1783931090" type="function" identity="AdminSidebar" parent="none"]
|
|
157
|
+
// CIL[DOC-MACRO purpose="Admin sidebar component with navigation and active state"]
|
|
158
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render sidebar navigation with active link highlighting"]
|
|
159
|
+
// CIL[DOC-CONTEXT module="AdminSidebar" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
160
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Admin sidebar JSX" errors="none" side_effects="Navigation rendering"]
|
|
161
|
+
// CIL[DOC-MICRO logic_summary="Handles active state, renders brand header, navigation sections, footer" notable_decisions="['active_link_detection', 'brand_header']"]
|
|
162
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
163
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
164
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
165
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
166
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
167
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
168
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
169
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
105
170
|
export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
106
171
|
const location = useLocation()
|
|
107
172
|
|
|
108
|
-
// Check if a URL is active (exact match or starts with path)
|
|
109
173
|
const isActive = (url: string) => {
|
|
110
174
|
return location.pathname === url || location.pathname.startsWith(url + '/')
|
|
111
175
|
}
|
|
@@ -113,7 +177,6 @@ export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>)
|
|
|
113
177
|
return (
|
|
114
178
|
<Sidebar {...props}>
|
|
115
179
|
<SidebarHeader>
|
|
116
|
-
{/* Brand Header */}
|
|
117
180
|
<SidebarMenu>
|
|
118
181
|
<SidebarMenuItem>
|
|
119
182
|
<SidebarMenuButton size="lg" asChild>
|
|
@@ -130,7 +193,6 @@ export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>)
|
|
|
130
193
|
</SidebarMenuItem>
|
|
131
194
|
</SidebarMenu>
|
|
132
195
|
|
|
133
|
-
{/* Quick Create Button */}
|
|
134
196
|
<SidebarGroup className="py-2">
|
|
135
197
|
<Button className="w-full" size="sm">
|
|
136
198
|
<PlusIcon className="mr-2 h-4 w-4" />
|
|
@@ -140,25 +202,74 @@ export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>)
|
|
|
140
202
|
</SidebarHeader>
|
|
141
203
|
|
|
142
204
|
<SidebarContent>
|
|
143
|
-
{navigationSections.map((section) =>
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
205
|
+
{navigationSections.map((section) => {
|
|
206
|
+
const sectionActive = section.items.some((item: any) =>
|
|
207
|
+
isActive(item.url) || (item.children && item.children.some((child: any) => isActive(child.url)))
|
|
208
|
+
)
|
|
209
|
+
return (
|
|
210
|
+
<SidebarGroup key={section.title} className="py-0">
|
|
211
|
+
<Collapsible defaultOpen={sectionActive} className="group/collapsible w-full">
|
|
212
|
+
<SidebarMenu>
|
|
213
|
+
<SidebarMenuItem>
|
|
214
|
+
<CollapsibleTrigger asChild>
|
|
215
|
+
<SidebarMenuButton className="font-semibold text-sm">
|
|
216
|
+
<span>{section.title}</span>
|
|
217
|
+
<ChevronRight className="ml-auto h-4 w-4 transition-transform group-data-[state=open]/collapsible:rotate-90" />
|
|
218
|
+
</SidebarMenuButton>
|
|
219
|
+
</CollapsibleTrigger>
|
|
156
220
|
</SidebarMenuItem>
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
221
|
+
</SidebarMenu>
|
|
222
|
+
<CollapsibleContent>
|
|
223
|
+
<SidebarGroupContent>
|
|
224
|
+
<SidebarMenu>
|
|
225
|
+
{section.items.map((item: any) => (
|
|
226
|
+
item.children ? (
|
|
227
|
+
<SidebarMenuItem key={item.title}>
|
|
228
|
+
<Collapsible
|
|
229
|
+
defaultOpen={item.children.some((child: any) => isActive(child.url))}
|
|
230
|
+
className="group/collapsible w-full"
|
|
231
|
+
>
|
|
232
|
+
<CollapsibleTrigger asChild>
|
|
233
|
+
<SidebarMenuButton>
|
|
234
|
+
<item.icon className="h-4 w-4" />
|
|
235
|
+
<span>{item.title}</span>
|
|
236
|
+
<ChevronRight className="ml-auto h-4 w-4 transition-transform group-data-[state=open]/collapsible:rotate-90" />
|
|
237
|
+
</SidebarMenuButton>
|
|
238
|
+
</CollapsibleTrigger>
|
|
239
|
+
<CollapsibleContent>
|
|
240
|
+
<SidebarMenuSub>
|
|
241
|
+
{item.children.map((child: any) => (
|
|
242
|
+
<SidebarMenuSubItem key={child.title}>
|
|
243
|
+
<SidebarMenuSubButton asChild isActive={isActive(child.url)}>
|
|
244
|
+
<Link to={child.url}>
|
|
245
|
+
<child.icon className="h-4 w-4" />
|
|
246
|
+
<span>{child.title}</span>
|
|
247
|
+
</Link>
|
|
248
|
+
</SidebarMenuSubButton>
|
|
249
|
+
</SidebarMenuSubItem>
|
|
250
|
+
))}
|
|
251
|
+
</SidebarMenuSub>
|
|
252
|
+
</CollapsibleContent>
|
|
253
|
+
</Collapsible>
|
|
254
|
+
</SidebarMenuItem>
|
|
255
|
+
) : (
|
|
256
|
+
<SidebarMenuItem key={item.title}>
|
|
257
|
+
<SidebarMenuButton asChild isActive={isActive(item.url)}>
|
|
258
|
+
<Link to={item.url}>
|
|
259
|
+
<item.icon className="h-4 w-4" />
|
|
260
|
+
<span>{item.title}</span>
|
|
261
|
+
</Link>
|
|
262
|
+
</SidebarMenuButton>
|
|
263
|
+
</SidebarMenuItem>
|
|
264
|
+
)
|
|
265
|
+
))}
|
|
266
|
+
</SidebarMenu>
|
|
267
|
+
</SidebarGroupContent>
|
|
268
|
+
</CollapsibleContent>
|
|
269
|
+
</Collapsible>
|
|
270
|
+
</SidebarGroup>
|
|
271
|
+
)
|
|
272
|
+
})}
|
|
162
273
|
</SidebarContent>
|
|
163
274
|
|
|
164
275
|
<SidebarFooter className="p-4">
|
|
@@ -171,3 +282,4 @@ export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>)
|
|
|
171
282
|
</Sidebar>
|
|
172
283
|
)
|
|
173
284
|
}
|
|
285
|
+
// CIL[END chunk_id="AdminSidebar_adminsidebar_1783931090"]
|
|
@@ -1,42 +1,60 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/components/admin/AdminStatsCard
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-component
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Single stat card used in admin list page headers. Renders an icon,
|
|
8
|
-
* a title, and a numeric or string value inside a white rounded panel.
|
|
9
|
-
* Icon colour defaults to `'text-blue-500'` but can be overridden per card.
|
|
10
|
-
*
|
|
11
|
-
* @seeAlso src/components/admin/AdminListPage.tsx (mounts this component)
|
|
12
|
-
*/
|
|
13
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="AdminStatsCard_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and UI components for stats card"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for stats card"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="AdminStatsCard" layer="component" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
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, Lucide icon type, and card UI components" 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/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.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"]
|
|
14
19
|
import React from 'react'
|
|
15
20
|
import { LucideIcon } from 'lucide-react'
|
|
16
21
|
import { Card, CardContent } from '../ui/card'
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
// CIL[END chunk_id="AdminStatsCard_module_header_1783931090"]
|
|
23
|
+
// CIL[BEGIN chunk_id="AdminStatsCard_interface_1783931090" type="interface" identity="AdminStatsCardProps" parent="none"]
|
|
24
|
+
// CIL[DOC-MACRO purpose="Define props interface for AdminStatsCard component"]
|
|
25
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for stats card properties"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="AdminStatsCard" layer="component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Defines title, value, icon, and optional icon color props" notable_decisions="[]"]
|
|
29
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
30
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
31
|
+
// CIL[DOC-VECTOR type="context" content="Layer: 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/src/components/ui/table-primitives.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"]
|
|
26
37
|
interface AdminStatsCardProps {
|
|
27
38
|
title: string
|
|
28
39
|
value: string | number
|
|
29
40
|
icon: LucideIcon
|
|
30
41
|
iconColor?: string
|
|
31
42
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
// CIL[END chunk_id="AdminStatsCard_interface_1783931090"]
|
|
44
|
+
// CIL[BEGIN chunk_id="AdminStatsCard_adminstatscard_1783931090" type="function" identity="AdminStatsCard" parent="none"]
|
|
45
|
+
// CIL[DOC-MACRO purpose="Single stat card component with icon and value display"]
|
|
46
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render individual statistics card with icon and formatted value"]
|
|
47
|
+
// CIL[DOC-CONTEXT module="AdminStatsCard" layer="component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
48
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Stat card JSX" errors="none" side_effects="UI rendering"]
|
|
49
|
+
// CIL[DOC-MICRO logic_summary="Renders card with icon, title, and value in horizontal layout" notable_decisions="['default_icon_color', 'horizontal_layout']"]
|
|
50
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
51
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
52
|
+
// CIL[DOC-VECTOR type="context" content="Layer: component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
53
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
54
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
55
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
56
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
57
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
40
58
|
export function AdminStatsCard({ title, value, icon: Icon, iconColor = "text-primary" }: AdminStatsCardProps) {
|
|
41
59
|
return (
|
|
42
60
|
<Card>
|
|
@@ -60,3 +78,4 @@ export function AdminStatsCard({ title, value, icon: Icon, iconColor = "text-pri
|
|
|
60
78
|
</Card>
|
|
61
79
|
)
|
|
62
80
|
}
|
|
81
|
+
// CIL[END chunk_id="AdminStatsCard_adminstatscard_1783931090"]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { ChevronDown } from 'lucide-react'
|
|
3
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible'
|
|
4
|
+
import { Card, CardContent } from '../ui/card'
|
|
5
|
+
|
|
6
|
+
export interface PageInstructionsSection {
|
|
7
|
+
title: string
|
|
8
|
+
content: React.ReactNode
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface PageInstructionsProps {
|
|
12
|
+
title?: string
|
|
13
|
+
description?: React.ReactNode
|
|
14
|
+
sections?: PageInstructionsSection[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function PageInstructions({
|
|
18
|
+
title = 'Page instructions',
|
|
19
|
+
description,
|
|
20
|
+
sections,
|
|
21
|
+
}: PageInstructionsProps) {
|
|
22
|
+
if (!description && (!sections || sections.length === 0)) return null
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Card>
|
|
26
|
+
<CardContent className="p-4">
|
|
27
|
+
<Collapsible>
|
|
28
|
+
<CollapsibleTrigger className="group flex w-full items-center justify-between text-sm font-medium text-slate-700">
|
|
29
|
+
<span>{title}</span>
|
|
30
|
+
<ChevronDown className="h-4 w-4 transition-transform group-data-[state=open]:rotate-180" />
|
|
31
|
+
</CollapsibleTrigger>
|
|
32
|
+
<CollapsibleContent className="space-y-4 pt-4">
|
|
33
|
+
{description && <div className="text-sm text-slate-600">{description}</div>}
|
|
34
|
+
{sections && sections.length > 0 && (
|
|
35
|
+
<div className="space-y-3">
|
|
36
|
+
{sections.map((section, i) => (
|
|
37
|
+
<div key={i}>
|
|
38
|
+
<div className="text-sm font-semibold text-slate-700">{section.title}</div>
|
|
39
|
+
<div className="mt-1 text-sm text-slate-600">{section.content}</div>
|
|
40
|
+
</div>
|
|
41
|
+
))}
|
|
42
|
+
</div>
|
|
43
|
+
)}
|
|
44
|
+
</CollapsibleContent>
|
|
45
|
+
</Collapsible>
|
|
46
|
+
</CardContent>
|
|
47
|
+
</Card>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -1,7 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="SortableTableHeader_module_header_1783931090" type="module_header" identity="imports" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Import React and UI components for sortable table header"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for sortable header"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="SortableTableHeader" layer="component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and icons" errors="Import failures" side_effects="Module loading"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports React, chevron icons, and table head component" 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: .framework/src/components/ui/table-primitives.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.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"]
|
|
1
19
|
import React from 'react'
|
|
2
20
|
import { ChevronUp, ChevronDown } from 'lucide-react'
|
|
3
21
|
import { TableHead } from '../ui/table'
|
|
4
|
-
|
|
22
|
+
// CIL[END chunk_id="SortableTableHeader_module_header_1783931090"]
|
|
23
|
+
// CIL[BEGIN chunk_id="SortableTableHeader_interface_1783931090" type="interface" identity="SortableTableHeaderProps" parent="none"]
|
|
24
|
+
// CIL[DOC-MACRO purpose="Define props interface for SortableTableHeader component"]
|
|
25
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definition for sortable header properties"]
|
|
26
|
+
// CIL[DOC-CONTEXT module="SortableTableHeader" layer="component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
27
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type interface" errors="none" side_effects="none"]
|
|
28
|
+
// CIL[DOC-MICRO logic_summary="Defines title, sort key, current sort state, and sort callback props" notable_decisions="[]"]
|
|
29
|
+
// CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
|
|
30
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
31
|
+
// CIL[DOC-VECTOR type="context" content="Layer: 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/src/components/ui/table-primitives.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"]
|
|
5
37
|
interface SortableTableHeaderProps {
|
|
6
38
|
title: string
|
|
7
39
|
sortKey: string
|
|
@@ -9,7 +41,21 @@ interface SortableTableHeaderProps {
|
|
|
9
41
|
currentSortDirection?: 'asc' | 'desc'
|
|
10
42
|
onSort: (key: string) => void
|
|
11
43
|
}
|
|
12
|
-
|
|
44
|
+
// CIL[END chunk_id="SortableTableHeader_interface_1783931090"]
|
|
45
|
+
// CIL[BEGIN chunk_id="SortableTableHeader_sortabletableheader_1783931090" type="function" identity="SortableTableHeader" parent="none"]
|
|
46
|
+
// CIL[DOC-MACRO purpose="Sortable table header component with click-to-sort functionality"]
|
|
47
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render header with sorting indicators and click handlers"]
|
|
48
|
+
// CIL[DOC-CONTEXT module="SortableTableHeader" layer="component" related_files="[\".framework/src/components/ui/table-primitives.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
49
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Sortable header JSX" errors="none" side_effects="Sort callback execution"]
|
|
50
|
+
// CIL[DOC-MICRO logic_summary="Handles sort state, displays chevron indicators, manages click events" notable_decisions="['conditional_sort_indicators', 'click_to_sort']"]
|
|
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: .framework/src/components/ui/table-primitives.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.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"]
|
|
13
59
|
export function SortableTableHeader({
|
|
14
60
|
title,
|
|
15
61
|
sortKey,
|
|
@@ -40,3 +86,4 @@ export function SortableTableHeader({
|
|
|
40
86
|
</TableHead>
|
|
41
87
|
)
|
|
42
88
|
}
|
|
89
|
+
// CIL[END chunk_id="SortableTableHeader_sortabletableheader_1783931090"]
|