spine-framework 0.2.1 → 1.0.0
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/LICENSE.md +213 -8
- package/README.md +327 -0
- package/package.json +107 -217
- package/src/cli/commands/init.ts +192 -0
- package/src/cli/commands/install.ts +25 -0
- package/src/cli/commands/list.ts +33 -0
- package/src/cli/commands/migrate.ts +24 -0
- package/src/cli/index.ts +46 -0
- package/src/components/AppLayout.tsx +21 -0
- package/src/components/AuthGuard.tsx +21 -0
- package/src/components/RoleGuard.tsx +23 -0
- package/src/components/index.ts +3 -0
- package/src/contexts/AppContext.tsx +122 -0
- package/src/contexts/AuthContext.tsx +87 -0
- package/src/contexts/SpineContext.tsx +46 -0
- package/src/contexts/index.ts +3 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useItems.ts +78 -0
- package/src/hooks/useThreads.ts +73 -0
- package/src/hooks/useWebSocket.ts +97 -0
- package/src/index.ts +22 -0
- package/src/types/index.ts +163 -0
- package/src/utils/api.ts +88 -0
- package/src/utils/client.ts +146 -0
- package/src/utils/config.ts +20 -0
- package/src/utils/index.ts +3 -0
- package/.framework/README.md +0 -129
- package/.framework/cli/bin.cjs +0 -14
- package/.framework/cli/commands/agents.ts +0 -153
- package/.framework/cli/commands/auth.ts +0 -94
- package/.framework/cli/commands/create-app.ts +0 -185
- package/.framework/cli/commands/dev.ts +0 -113
- package/.framework/cli/commands/doctor.ts +0 -442
- package/.framework/cli/commands/generate.ts +0 -332
- package/.framework/cli/commands/init.ts +0 -186
- package/.framework/cli/commands/install-app.ts +0 -565
- package/.framework/cli/commands/items.ts +0 -253
- package/.framework/cli/commands/migrate.ts +0 -139
- package/.framework/cli/commands/migrations.ts +0 -141
- package/.framework/cli/commands/pipelines.ts +0 -166
- package/.framework/cli/commands/status.ts +0 -197
- package/.framework/cli/commands/system.ts +0 -184
- package/.framework/cli/commands/test.ts +0 -227
- package/.framework/cli/commands/uninstall-app.ts +0 -166
- package/.framework/cli/context.ts +0 -268
- package/.framework/cli/env-loader.ts +0 -36
- package/.framework/cli/index.ts +0 -116
- package/.framework/cli/welcome.cjs +0 -45
- package/.framework/docs/API.md +0 -384
- package/.framework/docs/STABILITY.md +0 -52
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/apis/admin-configs.md +0 -567
- package/.framework/docs/apis/admin-data.md +0 -272
- package/.framework/docs/apis/index.md +0 -231
- package/.framework/docs/apis/internal.md +0 -295
- package/.framework/docs/apis/runtime.md +0 -537
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/authorization-model.md +0 -170
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/examples/custom-app/README.md +0 -77
- package/.framework/docs/examples/custom-function/README.md +0 -27
- package/.framework/docs/examples/custom-function/handler.ts +0 -48
- package/.framework/docs/examples/custom-webhook/README.md +0 -68
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/guides/cli-guide.md +0 -224
- package/.framework/docs/guides/getting-started.md +0 -103
- package/.framework/docs/guides/import-guide.md +0 -193
- package/.framework/docs/guides/testing-guide.md +0 -229
- package/.framework/docs/permission-examples.md +0 -326
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/functions/.gitkeep +0 -1
- package/.framework/functions/_shared/agent-runner.ts +0 -1097
- package/.framework/functions/_shared/app-manifest.ts +0 -184
- package/.framework/functions/_shared/audit.ts +0 -150
- package/.framework/functions/_shared/db.ts +0 -178
- package/.framework/functions/_shared/index.ts +0 -391
- package/.framework/functions/_shared/middleware.ts +0 -490
- package/.framework/functions/_shared/permissions.ts +0 -1325
- package/.framework/functions/_shared/pipeline-runner.ts +0 -731
- package/.framework/functions/_shared/principal.ts +0 -818
- package/.framework/functions/_shared/resolve-ids.ts +0 -106
- package/.framework/functions/_shared/schema-utils.ts +0 -967
- package/.framework/functions/_shared/testing.ts +0 -258
- package/.framework/functions/_shared/trigger-engine.ts +0 -425
- package/.framework/functions/_shared/webhook-registration.ts +0 -168
- package/.framework/functions/_shared/webhook-registry.ts +0 -129
- package/.framework/functions/account-nodes.ts +0 -111
- package/.framework/functions/admin-data.ts +0 -606
- package/.framework/functions/ai-agents.ts +0 -323
- package/.framework/functions/api-keys.ts +0 -376
- package/.framework/functions/apps.ts +0 -483
- package/.framework/functions/auth.ts +0 -196
- package/.framework/functions/debug-auth.ts +0 -107
- package/.framework/functions/embeddings.ts +0 -556
- package/.framework/functions/integration-routes.ts +0 -523
- package/.framework/functions/integrations.ts +0 -319
- package/.framework/functions/item-progress.ts +0 -272
- package/.framework/functions/logs.ts +0 -438
- package/.framework/functions/observability.ts +0 -275
- package/.framework/functions/pipeline-executions.ts +0 -494
- package/.framework/functions/pipelines.ts +0 -485
- package/.framework/functions/prompt-configs.ts +0 -339
- package/.framework/functions/roles.ts +0 -387
- package/.framework/functions/system-cron.ts +0 -742
- package/.framework/functions/system.ts +0 -323
- package/.framework/functions/tests.ts +0 -119
- package/.framework/functions/timers.ts +0 -357
- package/.framework/functions/triggers.ts +0 -563
- package/.framework/functions/types.ts +0 -604
- package/.framework/index.html +0 -16
- package/.framework/migrations/000_foundation.sql +0 -1266
- package/.framework/migrations/001_seed.sql +0 -163
- package/.framework/migrations/002_seed_constraints.sql +0 -19
- package/.framework/migrations/003_auth_user_trigger.sql +0 -67
- package/.framework/src/App.tsx +0 -133
- package/.framework/src/apps/admin/index.tsx +0 -173
- package/.framework/src/components/AppWrapper.tsx +0 -56
- package/.framework/src/components/CustomAppLoader.tsx +0 -116
- package/.framework/src/components/admin/AdminListPage.tsx +0 -151
- package/.framework/src/components/admin/AdminSidebar.tsx +0 -166
- package/.framework/src/components/admin/AdminStatsCard.tsx +0 -62
- package/.framework/src/components/admin/SortableTableHeader.tsx +0 -42
- package/.framework/src/components/app-shell/GenericAppShell.tsx +0 -181
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +0 -200
- package/.framework/src/components/app-shell/GenericListPage.tsx +0 -116
- package/.framework/src/components/app-sidebar.tsx +0 -228
- package/.framework/src/components/auth/ProtectedRoute.tsx +0 -88
- package/.framework/src/components/layout/AppShell.tsx +0 -91
- package/.framework/src/components/layout/Header.tsx +0 -88
- package/.framework/src/components/layout/Layout.tsx +0 -95
- package/.framework/src/components/layout/Sidebar.tsx +0 -329
- package/.framework/src/components/runtime/DataDetailHeader.tsx +0 -77
- package/.framework/src/components/runtime/DataDetailPage.tsx +0 -171
- package/.framework/src/components/runtime/DataFilters.tsx +0 -91
- package/.framework/src/components/runtime/DataHeader.tsx +0 -68
- package/.framework/src/components/runtime/DataListPage.tsx +0 -124
- package/.framework/src/components/runtime/DataStats.tsx +0 -70
- package/.framework/src/components/runtime/DataTable.tsx +0 -174
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +0 -134
- package/.framework/src/components/runtime/index.ts +0 -18
- package/.framework/src/components/search-form.tsx +0 -29
- package/.framework/src/components/shared/AgentView.tsx +0 -213
- package/.framework/src/components/shared/FieldRenderer.tsx +0 -478
- package/.framework/src/components/shared/SchemaFields.tsx +0 -226
- package/.framework/src/components/ui/DataTable.tsx +0 -343
- package/.framework/src/components/ui/Form.tsx +0 -281
- package/.framework/src/components/ui/ItemCard.tsx +0 -296
- package/.framework/src/components/ui/ItemListView.tsx +0 -308
- package/.framework/src/components/ui/LoadingSpinner.tsx +0 -52
- package/.framework/src/components/ui/Modal.tsx +0 -61
- package/.framework/src/components/ui/RichTextEditor.tsx +0 -210
- package/.framework/src/components/ui/accordion.tsx +0 -82
- package/.framework/src/components/ui/alert-dialog.tsx +0 -197
- package/.framework/src/components/ui/alert.tsx +0 -76
- package/.framework/src/components/ui/aspect-ratio.tsx +0 -11
- package/.framework/src/components/ui/avatar.tsx +0 -110
- package/.framework/src/components/ui/badge.tsx +0 -49
- package/.framework/src/components/ui/breadcrumb.tsx +0 -122
- package/.framework/src/components/ui/button-group.tsx +0 -83
- package/.framework/src/components/ui/button.tsx +0 -65
- package/.framework/src/components/ui/calendar.tsx +0 -222
- package/.framework/src/components/ui/card.tsx +0 -100
- package/.framework/src/components/ui/carousel.tsx +0 -240
- package/.framework/src/components/ui/chart.tsx +0 -368
- package/.framework/src/components/ui/checkbox.tsx +0 -31
- package/.framework/src/components/ui/collapsible.tsx +0 -33
- package/.framework/src/components/ui/combobox.tsx +0 -299
- package/.framework/src/components/ui/command.tsx +0 -193
- package/.framework/src/components/ui/context-menu.tsx +0 -261
- package/.framework/src/components/ui/dialog.tsx +0 -165
- package/.framework/src/components/ui/direction.tsx +0 -6
- package/.framework/src/components/ui/drawer.tsx +0 -132
- package/.framework/src/components/ui/dropdown-menu.tsx +0 -269
- package/.framework/src/components/ui/empty.tsx +0 -104
- package/.framework/src/components/ui/field.tsx +0 -238
- package/.framework/src/components/ui/hover-card.tsx +0 -42
- package/.framework/src/components/ui/input-group.tsx +0 -153
- package/.framework/src/components/ui/input-otp.tsx +0 -87
- package/.framework/src/components/ui/input.tsx +0 -19
- package/.framework/src/components/ui/item.tsx +0 -196
- package/.framework/src/components/ui/kbd.tsx +0 -26
- package/.framework/src/components/ui/label.tsx +0 -22
- package/.framework/src/components/ui/menubar.tsx +0 -277
- package/.framework/src/components/ui/native-select.tsx +0 -61
- package/.framework/src/components/ui/navigation-menu.tsx +0 -164
- package/.framework/src/components/ui/pagination.tsx +0 -129
- package/.framework/src/components/ui/popover.tsx +0 -87
- package/.framework/src/components/ui/progress.tsx +0 -31
- package/.framework/src/components/ui/radio-group.tsx +0 -42
- package/.framework/src/components/ui/resizable.tsx +0 -50
- package/.framework/src/components/ui/scroll-area.tsx +0 -53
- package/.framework/src/components/ui/select.tsx +0 -195
- package/.framework/src/components/ui/separator.tsx +0 -26
- package/.framework/src/components/ui/sheet.tsx +0 -145
- package/.framework/src/components/ui/sidebar.tsx +0 -706
- package/.framework/src/components/ui/skeleton.tsx +0 -13
- package/.framework/src/components/ui/slider.tsx +0 -59
- package/.framework/src/components/ui/sonner.tsx +0 -47
- package/.framework/src/components/ui/spinner.tsx +0 -10
- package/.framework/src/components/ui/switch.tsx +0 -33
- package/.framework/src/components/ui/table-primitives.tsx +0 -141
- package/.framework/src/components/ui/table.tsx +0 -114
- package/.framework/src/components/ui/tabs.tsx +0 -90
- package/.framework/src/components/ui/textarea.tsx +0 -18
- package/.framework/src/components/ui/toggle-group.tsx +0 -89
- package/.framework/src/components/ui/toggle.tsx +0 -45
- package/.framework/src/components/ui/tooltip.tsx +0 -57
- package/.framework/src/contexts/AppContext.tsx +0 -133
- package/.framework/src/contexts/AuthContext.tsx +0 -371
- package/.framework/src/hooks/use-mobile.ts +0 -19
- package/.framework/src/hooks/useApi.ts +0 -526
- package/.framework/src/hooks/useApps.ts +0 -114
- package/.framework/src/hooks/useEntityList.ts +0 -190
- package/.framework/src/hooks/useEntityRecord.ts +0 -308
- package/.framework/src/hooks/useForm.ts +0 -307
- package/.framework/src/hooks/useListSchema.ts +0 -264
- package/.framework/src/hooks/useSchemaRecord.ts +0 -223
- package/.framework/src/index.css +0 -128
- package/.framework/src/lib/api.ts +0 -156
- package/.framework/src/lib/supabase.ts +0 -94
- package/.framework/src/lib/utils.ts +0 -317
- package/.framework/src/main.tsx +0 -27
- package/.framework/src/pages/DashboardPage.tsx +0 -181
- package/.framework/src/pages/NotFoundPage.tsx +0 -39
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +0 -161
- package/.framework/src/pages/admin/AIAgentsPage.tsx +0 -318
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +0 -199
- package/.framework/src/pages/admin/APIKeysPage.tsx +0 -303
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +0 -523
- package/.framework/src/pages/admin/AppDetailPage.tsx +0 -493
- package/.framework/src/pages/admin/AppsPage.tsx +0 -355
- package/.framework/src/pages/admin/DesignedPage.tsx +0 -491
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +0 -534
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +0 -424
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +0 -176
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +0 -109
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +0 -402
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +0 -187
- package/.framework/src/pages/admin/IntegrationsPage.tsx +0 -301
- package/.framework/src/pages/admin/LogsPage.tsx +0 -283
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +0 -85
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +0 -470
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +0 -183
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +0 -279
- package/.framework/src/pages/admin/PipelinesPage.tsx +0 -390
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +0 -299
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +0 -292
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +0 -434
- package/.framework/src/pages/admin/RoleDetailPage.tsx +0 -273
- package/.framework/src/pages/admin/RolesPage.tsx +0 -292
- package/.framework/src/pages/admin/SelectTestPage.tsx +0 -61
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +0 -588
- package/.framework/src/pages/admin/SimpleDashboard.tsx +0 -387
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +0 -172
- package/.framework/src/pages/admin/TestingDashboard.tsx +0 -257
- package/.framework/src/pages/admin/TimerDetailPage.tsx +0 -151
- package/.framework/src/pages/admin/TimersPage.tsx +0 -376
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +0 -149
- package/.framework/src/pages/admin/TriggersPage.tsx +0 -381
- package/.framework/src/pages/admin/TypeDetailPage.tsx +0 -694
- package/.framework/src/pages/admin/TypesPage.tsx +0 -295
- package/.framework/src/pages/auth/LoginPage.tsx +0 -187
- package/.framework/src/pages/auth/RegisterPage.tsx +0 -163
- package/.framework/src/pages/spine-framework/APIPage.tsx +0 -17
- package/.framework/src/pages/spine-framework/CLIPage.tsx +0 -25
- package/.framework/src/types/auth.ts +0 -125
- package/.framework/src/types/types.ts +0 -407
- package/STRUCTURE.md +0 -150
- package/bin/spine-framework.cjs +0 -62
- package/bin/welcome.cjs +0 -45
- package/bin/ws-shim.cjs +0 -8
- package/bin/ws-shim.ts +0 -10
- package/config/components.json +0 -25
- package/config/deno.lock +0 -108
- package/config/package-lock.json +0 -17183
- package/config/postcss.config.cjs +0 -10
- package/config/tailwind.config.cjs +0 -78
- package/config/tsconfig.build.json +0 -32
- package/config/tsconfig.cli.json +0 -18
- package/config/tsconfig.json +0 -41
- package/config/tsconfig.node.json +0 -17
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/typedoc.json +0 -16
- package/config/vite.config.d.ts +0 -2
- package/config/vite.config.ts +0 -71
- package/dist/cli/commands/agents.d.ts +0 -39
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -36
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/create-app.d.ts +0 -23
- package/dist/cli/commands/create-app.d.ts.map +0 -1
- package/dist/cli/commands/dev.d.ts +0 -24
- package/dist/cli/commands/dev.d.ts.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -42
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/generate.d.ts +0 -36
- package/dist/cli/commands/generate.d.ts.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -20
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/install-app.d.ts +0 -30
- package/dist/cli/commands/install-app.d.ts.map +0 -1
- package/dist/cli/commands/items.d.ts +0 -45
- package/dist/cli/commands/items.d.ts.map +0 -1
- package/dist/cli/commands/migrate.d.ts +0 -21
- package/dist/cli/commands/migrate.d.ts.map +0 -1
- package/dist/cli/commands/migrations.d.ts +0 -41
- package/dist/cli/commands/migrations.d.ts.map +0 -1
- package/dist/cli/commands/pipelines.d.ts +0 -40
- package/dist/cli/commands/pipelines.d.ts.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -23
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/system.d.ts +0 -29
- package/dist/cli/commands/system.d.ts.map +0 -1
- package/dist/cli/commands/test.d.ts +0 -46
- package/dist/cli/commands/test.d.ts.map +0 -1
- package/dist/cli/commands/uninstall-app.d.ts +0 -23
- package/dist/cli/commands/uninstall-app.d.ts.map +0 -1
- package/dist/cli/context.d.ts +0 -88
- package/dist/cli/context.d.ts.map +0 -1
- package/dist/cli/env-loader.d.ts +0 -14
- package/dist/cli/env-loader.d.ts.map +0 -1
- package/dist/cli/index.d.ts +0 -41
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/functions/_shared/agent-runner.d.ts +0 -156
- package/dist/functions/_shared/agent-runner.d.ts.map +0 -1
- package/dist/functions/_shared/app-manifest.d.ts +0 -68
- package/dist/functions/_shared/app-manifest.d.ts.map +0 -1
- package/dist/functions/_shared/audit.d.ts +0 -91
- package/dist/functions/_shared/audit.d.ts.map +0 -1
- package/dist/functions/_shared/db.d.ts +0 -125
- package/dist/functions/_shared/db.d.ts.map +0 -1
- package/dist/functions/_shared/index.d.ts +0 -299
- package/dist/functions/_shared/index.d.ts.map +0 -1
- package/dist/functions/_shared/middleware.d.ts +0 -315
- package/dist/functions/_shared/middleware.d.ts.map +0 -1
- package/dist/functions/_shared/permissions.d.ts +0 -626
- package/dist/functions/_shared/permissions.d.ts.map +0 -1
- package/dist/functions/_shared/pipeline-runner.d.ts +0 -124
- package/dist/functions/_shared/pipeline-runner.d.ts.map +0 -1
- package/dist/functions/_shared/principal.d.ts +0 -284
- package/dist/functions/_shared/principal.d.ts.map +0 -1
- package/dist/functions/_shared/resolve-ids.d.ts +0 -10
- package/dist/functions/_shared/resolve-ids.d.ts.map +0 -1
- package/dist/functions/_shared/schema-utils.d.ts +0 -181
- package/dist/functions/_shared/schema-utils.d.ts.map +0 -1
- package/dist/functions/_shared/testing.d.ts +0 -172
- package/dist/functions/_shared/testing.d.ts.map +0 -1
- package/dist/functions/_shared/trigger-engine.d.ts +0 -140
- package/dist/functions/_shared/trigger-engine.d.ts.map +0 -1
- package/dist/functions/_shared/webhook-registration.d.ts +0 -81
- package/dist/functions/_shared/webhook-registration.d.ts.map +0 -1
- package/dist/functions/_shared/webhook-registry.d.ts +0 -57
- package/dist/functions/_shared/webhook-registry.d.ts.map +0 -1
- package/dist/functions/account-nodes.d.ts +0 -48
- package/dist/functions/account-nodes.d.ts.map +0 -1
- package/dist/functions/admin-data.d.ts +0 -178
- package/dist/functions/admin-data.d.ts.map +0 -1
- package/dist/functions/ai-agents.d.ts +0 -125
- package/dist/functions/ai-agents.d.ts.map +0 -1
- package/dist/functions/api-keys.d.ts +0 -140
- package/dist/functions/api-keys.d.ts.map +0 -1
- package/dist/functions/apps.d.ts +0 -163
- package/dist/functions/apps.d.ts.map +0 -1
- package/dist/functions/auth.d.ts +0 -74
- package/dist/functions/auth.d.ts.map +0 -1
- package/dist/functions/debug-auth.d.ts +0 -33
- package/dist/functions/debug-auth.d.ts.map +0 -1
- package/dist/functions/embeddings.d.ts +0 -205
- package/dist/functions/embeddings.d.ts.map +0 -1
- package/dist/functions/integration-routes.d.ts +0 -45
- package/dist/functions/integration-routes.d.ts.map +0 -1
- package/dist/functions/integrations.d.ts +0 -124
- package/dist/functions/integrations.d.ts.map +0 -1
- package/dist/functions/item-progress.d.ts +0 -41
- package/dist/functions/item-progress.d.ts.map +0 -1
- package/dist/functions/logs.d.ts +0 -162
- package/dist/functions/logs.d.ts.map +0 -1
- package/dist/functions/observability.d.ts +0 -123
- package/dist/functions/observability.d.ts.map +0 -1
- package/dist/functions/pipeline-executions.d.ts +0 -190
- package/dist/functions/pipeline-executions.d.ts.map +0 -1
- package/dist/functions/pipelines.d.ts +0 -171
- package/dist/functions/pipelines.d.ts.map +0 -1
- package/dist/functions/prompt-configs.d.ts +0 -125
- package/dist/functions/prompt-configs.d.ts.map +0 -1
- package/dist/functions/roles.d.ts +0 -118
- package/dist/functions/roles.d.ts.map +0 -1
- package/dist/functions/system-cron.d.ts +0 -65
- package/dist/functions/system-cron.d.ts.map +0 -1
- package/dist/functions/system.d.ts +0 -29
- package/dist/functions/system.d.ts.map +0 -1
- package/dist/functions/tests.d.ts +0 -28
- package/dist/functions/tests.d.ts.map +0 -1
- package/dist/functions/timers.d.ts +0 -139
- package/dist/functions/timers.d.ts.map +0 -1
- package/dist/functions/triggers.d.ts +0 -203
- package/dist/functions/triggers.d.ts.map +0 -1
- package/dist/functions/types.d.ts +0 -151
- package/dist/functions/types.d.ts.map +0 -1
- package/dist/src/types/types.d.ts +0 -364
- package/dist/src/types/types.d.ts.map +0 -1
- package/index.html +0 -13
- package/netlify.toml +0 -36
- package/package-project.json +0 -71
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/assemble-frontend.sh +0 -76
- package/scripts/assemble-functions.sh +0 -62
- package/scripts/assemble.sh +0 -41
- package/scripts/boundary-check.sh +0 -106
- package/scripts/build-manifest.sh +0 -80
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/netlify-dev-wrapper.sh +0 -22
- package/scripts/verify-integrity.sh +0 -69
- package/vitest.config.ts +0 -45
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Navigate } from 'react-router-dom'
|
|
3
|
-
import { useAuth } from '../contexts/AuthContext'
|
|
4
|
-
import { AppProvider } from '../contexts/AppContext'
|
|
5
|
-
import { AppRecord } from '../hooks/useApps'
|
|
6
|
-
|
|
7
|
-
interface AppWrapperProps {
|
|
8
|
-
app: AppRecord
|
|
9
|
-
children: React.ReactNode
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Shared wrapper for all apps. Provides:
|
|
14
|
-
* - Auth gate: redirects to /login if unauthenticated
|
|
15
|
-
* - Role gate: shows 403 if user lacks app's min_role
|
|
16
|
-
* - App context: makes app record available via useCurrentApp()
|
|
17
|
-
*/
|
|
18
|
-
export function AppWrapper({ app, children }: AppWrapperProps) {
|
|
19
|
-
const { user } = useAuth()
|
|
20
|
-
|
|
21
|
-
// Auth gate
|
|
22
|
-
if (!user) {
|
|
23
|
-
return <Navigate to="/login" replace />
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Role gate
|
|
27
|
-
if (app.min_role) {
|
|
28
|
-
const hasRole = user.roles?.includes('system_admin') || user.roles?.includes(app.min_role)
|
|
29
|
-
if (!hasRole) {
|
|
30
|
-
return (
|
|
31
|
-
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
32
|
-
<div className="text-center p-8">
|
|
33
|
-
<div className="w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
34
|
-
<svg className="w-8 h-8 text-red-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
35
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" />
|
|
36
|
-
</svg>
|
|
37
|
-
</div>
|
|
38
|
-
<h1 className="text-2xl font-bold text-slate-900 mb-2">Access Denied</h1>
|
|
39
|
-
<p className="text-slate-600 mb-6">You don't have permission to access {app.name}.</p>
|
|
40
|
-
<div className="bg-slate-100 rounded-lg p-4 text-left">
|
|
41
|
-
<p className="text-sm text-slate-600 mb-2"><strong>Your roles:</strong> {user.roles?.join(', ') || 'None'}</p>
|
|
42
|
-
<p className="text-sm text-slate-600"><strong>Required:</strong> {app.min_role}</p>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// App context
|
|
51
|
-
return (
|
|
52
|
-
<AppProvider app={app}>
|
|
53
|
-
{children}
|
|
54
|
-
</AppProvider>
|
|
55
|
-
)
|
|
56
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import React, { lazy, Suspense, Component } from 'react'
|
|
2
|
-
import type { ReactNode } from 'react'
|
|
3
|
-
import { LoadingSpinner } from './ui/LoadingSpinner'
|
|
4
|
-
|
|
5
|
-
// ─── ERROR BOUNDARY ───────────────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
interface ErrorBoundaryProps {
|
|
8
|
-
slug: string
|
|
9
|
-
children: ReactNode
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface ErrorBoundaryState {
|
|
13
|
-
error: Error | null
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
class AppErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
17
|
-
constructor(props: ErrorBoundaryProps) {
|
|
18
|
-
super(props)
|
|
19
|
-
this.state = { error: null }
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
static getDerivedStateFromError(error: Error): ErrorBoundaryState {
|
|
23
|
-
return { error }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
render() {
|
|
27
|
-
if (this.state.error) {
|
|
28
|
-
return (
|
|
29
|
-
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
30
|
-
<div className="text-center p-8 max-w-lg">
|
|
31
|
-
<div className="w-16 h-16 bg-amber-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
32
|
-
<svg className="w-8 h-8 text-amber-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
33
|
-
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z" />
|
|
34
|
-
</svg>
|
|
35
|
-
</div>
|
|
36
|
-
<h1 className="text-2xl font-bold text-slate-900 mb-2">App Load Error</h1>
|
|
37
|
-
<p className="text-slate-600 mb-4">
|
|
38
|
-
Failed to load the <strong>{this.props.slug}</strong> app.
|
|
39
|
-
</p>
|
|
40
|
-
<pre className="bg-slate-100 rounded-lg p-4 text-left text-sm text-red-600 overflow-auto mb-4">
|
|
41
|
-
{this.state.error.message}
|
|
42
|
-
</pre>
|
|
43
|
-
<p className="text-sm text-slate-500">
|
|
44
|
-
Check that <code>apps/{this.props.slug}/index.tsx</code> exists and exports a default component.
|
|
45
|
-
</p>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return this.props.children
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// ─── LOADER ───────────────────────────────────────────────────────────────────
|
|
56
|
-
|
|
57
|
-
// Static glob maps — Vite analyzes these at build time and builds a complete
|
|
58
|
-
// module map. Runtime lookup is just a map key lookup, no dynamic string eval.
|
|
59
|
-
// Custom apps take precedence over core apps with the same slug.
|
|
60
|
-
const customAppModules = import.meta.glob('../../custom/apps/*/index.tsx')
|
|
61
|
-
const coreAppModules = import.meta.glob('../apps/*/index.tsx')
|
|
62
|
-
|
|
63
|
-
// Module-level cache for lazy components to avoid re-creating on each render
|
|
64
|
-
const appModuleCache = new Map<string, React.LazyExoticComponent<React.ComponentType>>()
|
|
65
|
-
|
|
66
|
-
// Resolve the glob key for a given slug from the custom or core map.
|
|
67
|
-
function resolveAppLoader(slug: string): (() => Promise<{ default: React.ComponentType }>) | null {
|
|
68
|
-
// Check custom first (custom/apps/{slug}/index.tsx)
|
|
69
|
-
const customKey = `../../custom/apps/${slug}/index.tsx`
|
|
70
|
-
if (customAppModules[customKey]) {
|
|
71
|
-
return customAppModules[customKey] as () => Promise<{ default: React.ComponentType }>
|
|
72
|
-
}
|
|
73
|
-
// Fall back to core (../apps/{slug}/index.tsx relative to this file)
|
|
74
|
-
const coreKey = `../apps/${slug}/index.tsx`
|
|
75
|
-
if (coreAppModules[coreKey]) {
|
|
76
|
-
return coreAppModules[coreKey] as () => Promise<{ default: React.ComponentType }>
|
|
77
|
-
}
|
|
78
|
-
return null
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function getAppComponent(slug: string): React.LazyExoticComponent<React.ComponentType> {
|
|
82
|
-
if (!appModuleCache.has(slug)) {
|
|
83
|
-
const loader = resolveAppLoader(slug)
|
|
84
|
-
const LazyComponent = lazy(
|
|
85
|
-
loader
|
|
86
|
-
? loader
|
|
87
|
-
: () => Promise.reject(new Error(`App "${slug}" not found. Expected apps/${slug}/index.tsx in custom/apps or .framework/src/apps.`))
|
|
88
|
-
)
|
|
89
|
-
appModuleCache.set(slug, LazyComponent)
|
|
90
|
-
}
|
|
91
|
-
return appModuleCache.get(slug)!
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
interface CustomAppLoaderProps {
|
|
95
|
-
slug: string
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Lazy-loads a custom app component from apps/{slug}/index.tsx.
|
|
100
|
-
* Wraps in an error boundary so a broken app doesn't crash the entire site.
|
|
101
|
-
*/
|
|
102
|
-
export function CustomAppLoader({ slug }: CustomAppLoaderProps) {
|
|
103
|
-
const AppComponent = getAppComponent(slug)
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<AppErrorBoundary slug={slug}>
|
|
107
|
-
<Suspense fallback={
|
|
108
|
-
<div className="min-h-screen flex items-center justify-center">
|
|
109
|
-
<LoadingSpinner />
|
|
110
|
-
</div>
|
|
111
|
-
}>
|
|
112
|
-
<AppComponent />
|
|
113
|
-
</Suspense>
|
|
114
|
-
</AppErrorBoundary>
|
|
115
|
-
)
|
|
116
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import React, { ReactNode } from 'react'
|
|
2
|
-
import { Button } from '../ui/button'
|
|
3
|
-
import { Card, CardContent } from '../ui/card'
|
|
4
|
-
import { Input } from '../ui/input'
|
|
5
|
-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'
|
|
6
|
-
import { Skeleton } from '../ui/skeleton'
|
|
7
|
-
import { Search } from 'lucide-react'
|
|
8
|
-
import { LucideIcon } from 'lucide-react'
|
|
9
|
-
import { AdminStatsCard } from './AdminStatsCard'
|
|
10
|
-
import { cn } from '../../lib/utils'
|
|
11
|
-
|
|
12
|
-
interface AdminListPageProps {
|
|
13
|
-
title: string
|
|
14
|
-
description: string
|
|
15
|
-
newButtonText?: string
|
|
16
|
-
newButtonHref?: string
|
|
17
|
-
onNewClick?: () => void
|
|
18
|
-
statsCards: Array<{
|
|
19
|
-
title: string
|
|
20
|
-
value: string | number
|
|
21
|
-
icon: LucideIcon
|
|
22
|
-
iconColor?: string
|
|
23
|
-
}>
|
|
24
|
-
searchPlaceholder?: string
|
|
25
|
-
searchValue?: string
|
|
26
|
-
onSearchChange?: (value: string) => void
|
|
27
|
-
filters?: Array<{
|
|
28
|
-
label: string
|
|
29
|
-
value: string
|
|
30
|
-
options: Array<{ value: string; label: string }>
|
|
31
|
-
onChange: (value: string) => void
|
|
32
|
-
}>
|
|
33
|
-
children: ReactNode
|
|
34
|
-
loading?: boolean
|
|
35
|
-
error?: string | null
|
|
36
|
-
onRetry?: () => void
|
|
37
|
-
emptyMessage?: string
|
|
38
|
-
emptyIcon?: LucideIcon
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function AdminListPage({
|
|
42
|
-
title,
|
|
43
|
-
description,
|
|
44
|
-
newButtonText,
|
|
45
|
-
newButtonHref = '#',
|
|
46
|
-
onNewClick,
|
|
47
|
-
statsCards,
|
|
48
|
-
searchPlaceholder = "Search...",
|
|
49
|
-
searchValue = "",
|
|
50
|
-
onSearchChange,
|
|
51
|
-
filters = [],
|
|
52
|
-
children,
|
|
53
|
-
loading = false,
|
|
54
|
-
error = null,
|
|
55
|
-
onRetry,
|
|
56
|
-
}: AdminListPageProps) {
|
|
57
|
-
return (
|
|
58
|
-
<div className="space-y-6">
|
|
59
|
-
{/* Header */}
|
|
60
|
-
<div className="flex justify-between items-center">
|
|
61
|
-
<div>
|
|
62
|
-
<h1 className="text-xl font-semibold">{title}</h1>
|
|
63
|
-
<p className="mt-1 text-sm text-muted-foreground">{description}</p>
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
{newButtonText && (
|
|
67
|
-
<Button onClick={() => onNewClick ? onNewClick() : (window.location.href = newButtonHref!)}>
|
|
68
|
-
{newButtonText}
|
|
69
|
-
</Button>
|
|
70
|
-
)}
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
{/* Stats Cards */}
|
|
74
|
-
<div className="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
|
75
|
-
{statsCards.map((stat, index) => (
|
|
76
|
-
<AdminStatsCard
|
|
77
|
-
key={index}
|
|
78
|
-
title={stat.title}
|
|
79
|
-
value={stat.value}
|
|
80
|
-
icon={stat.icon}
|
|
81
|
-
iconColor={stat.iconColor}
|
|
82
|
-
/>
|
|
83
|
-
))}
|
|
84
|
-
</div>
|
|
85
|
-
|
|
86
|
-
{/* Search and Filters */}
|
|
87
|
-
<Card>
|
|
88
|
-
<CardContent className="p-4">
|
|
89
|
-
<div className="flex flex-col sm:flex-row gap-4">
|
|
90
|
-
{/* Search */}
|
|
91
|
-
{onSearchChange && (
|
|
92
|
-
<div className="flex-1">
|
|
93
|
-
<div className="relative">
|
|
94
|
-
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
|
95
|
-
<Input
|
|
96
|
-
placeholder={searchPlaceholder}
|
|
97
|
-
value={searchValue}
|
|
98
|
-
onChange={(e) => onSearchChange(e.target.value)}
|
|
99
|
-
className="pl-9"
|
|
100
|
-
/>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
)}
|
|
104
|
-
|
|
105
|
-
{/* Filters */}
|
|
106
|
-
{filters.map((filter, index) => (
|
|
107
|
-
<div key={index} className="sm:w-48">
|
|
108
|
-
<Select value={filter.value} onValueChange={filter.onChange}>
|
|
109
|
-
<SelectTrigger>
|
|
110
|
-
<SelectValue placeholder={filter.label} />
|
|
111
|
-
</SelectTrigger>
|
|
112
|
-
<SelectContent>
|
|
113
|
-
{filter.options.map(option => (
|
|
114
|
-
<SelectItem key={option.value} value={option.value}>
|
|
115
|
-
{option.label}
|
|
116
|
-
</SelectItem>
|
|
117
|
-
))}
|
|
118
|
-
</SelectContent>
|
|
119
|
-
</Select>
|
|
120
|
-
</div>
|
|
121
|
-
))}
|
|
122
|
-
</div>
|
|
123
|
-
</CardContent>
|
|
124
|
-
</Card>
|
|
125
|
-
|
|
126
|
-
{/* Content */}
|
|
127
|
-
<Card>
|
|
128
|
-
{loading ? (
|
|
129
|
-
<div className="p-8 space-y-4">
|
|
130
|
-
<Skeleton className="h-8 w-full" />
|
|
131
|
-
<Skeleton className="h-8 w-full" />
|
|
132
|
-
<Skeleton className="h-8 w-3/4" />
|
|
133
|
-
</div>
|
|
134
|
-
) : error ? (
|
|
135
|
-
<div className="p-8 text-center">
|
|
136
|
-
<p className="text-destructive">Error: {error}</p>
|
|
137
|
-
{onRetry && (
|
|
138
|
-
<Button onClick={onRetry} className="mt-4">
|
|
139
|
-
Retry
|
|
140
|
-
</Button>
|
|
141
|
-
)}
|
|
142
|
-
</div>
|
|
143
|
-
) : (
|
|
144
|
-
<CardContent className="p-0">
|
|
145
|
-
{children}
|
|
146
|
-
</CardContent>
|
|
147
|
-
)}
|
|
148
|
-
</Card>
|
|
149
|
-
</div>
|
|
150
|
-
)
|
|
151
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
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
|
-
|
|
10
|
-
import * as React from "react"
|
|
11
|
-
import { Link, useLocation } from "react-router-dom"
|
|
12
|
-
import {
|
|
13
|
-
PlusIcon,
|
|
14
|
-
Database,
|
|
15
|
-
Settings,
|
|
16
|
-
Type,
|
|
17
|
-
Users,
|
|
18
|
-
Layout,
|
|
19
|
-
FileText,
|
|
20
|
-
BarChart3,
|
|
21
|
-
AlertTriangle,
|
|
22
|
-
Activity,
|
|
23
|
-
FileSearch,
|
|
24
|
-
FlaskConical,
|
|
25
|
-
Brain,
|
|
26
|
-
Cpu,
|
|
27
|
-
Timer,
|
|
28
|
-
Puzzle,
|
|
29
|
-
Shield,
|
|
30
|
-
MessageSquare,
|
|
31
|
-
Key,
|
|
32
|
-
TestTube
|
|
33
|
-
} from "lucide-react"
|
|
34
|
-
import {
|
|
35
|
-
Sidebar,
|
|
36
|
-
SidebarContent,
|
|
37
|
-
SidebarFooter,
|
|
38
|
-
SidebarGroup,
|
|
39
|
-
SidebarGroupContent,
|
|
40
|
-
SidebarGroupLabel,
|
|
41
|
-
SidebarHeader,
|
|
42
|
-
SidebarMenu,
|
|
43
|
-
SidebarMenuButton,
|
|
44
|
-
SidebarMenuItem,
|
|
45
|
-
SidebarRail,
|
|
46
|
-
} from "../ui/sidebar"
|
|
47
|
-
import { Button } from "../ui/button"
|
|
48
|
-
|
|
49
|
-
// Navigation sections with correct admin URLs
|
|
50
|
-
const navigationSections = [
|
|
51
|
-
{
|
|
52
|
-
title: "Configs",
|
|
53
|
-
items: [
|
|
54
|
-
{ title: "Types", url: "/spine-framework/admin/configs/types", icon: Type },
|
|
55
|
-
{ title: "Apps", url: "/spine-framework/admin/configs/apps", icon: Layout },
|
|
56
|
-
{ title: "Pipelines", url: "/spine-framework/admin/configs/pipelines", icon: Activity },
|
|
57
|
-
{ title: "Triggers", url: "/spine-framework/admin/configs/triggers", icon: AlertTriangle },
|
|
58
|
-
{ title: "AI Agents", url: "/spine-framework/admin/configs/ai-agents", icon: Brain },
|
|
59
|
-
{ title: "Embeddings", url: "/spine-framework/admin/configs/embeddings", icon: Cpu },
|
|
60
|
-
{ title: "Timers", url: "/spine-framework/admin/configs/timers", icon: Timer },
|
|
61
|
-
{ title: "Integrations", url: "/spine-framework/admin/configs/integrations", icon: Puzzle },
|
|
62
|
-
{ title: "Roles", url: "/spine-framework/admin/configs/roles", icon: Shield },
|
|
63
|
-
{ title: "Prompts", url: "/spine-framework/admin/configs/prompts", icon: MessageSquare },
|
|
64
|
-
{ title: "API Keys", url: "/spine-framework/admin/configs/api-keys", icon: Key },
|
|
65
|
-
]
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
title: "Runtime",
|
|
69
|
-
items: [
|
|
70
|
-
{ title: "Items", url: "/spine-framework/admin/runtime/items", icon: Database },
|
|
71
|
-
{ title: "Accounts", url: "/spine-framework/admin/runtime/accounts", icon: Users },
|
|
72
|
-
{ title: "People", url: "/spine-framework/admin/runtime/people", icon: Users },
|
|
73
|
-
{ title: "Threads", url: "/spine-framework/admin/runtime/threads", icon: MessageSquare },
|
|
74
|
-
{ title: "Messages", url: "/spine-framework/admin/runtime/messages", icon: FileText },
|
|
75
|
-
{ title: "Attachments", url: "/spine-framework/admin/runtime/attachments", icon: FileSearch },
|
|
76
|
-
{ title: "Watchers", url: "/spine-framework/admin/runtime/watchers", icon: Activity },
|
|
77
|
-
{ title: "Links", url: "/spine-framework/admin/runtime/links", icon: Puzzle },
|
|
78
|
-
{ title: "Progress", url: "/spine-framework/admin/runtime/item_progress", icon: BarChart3 },
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
title: "Observability",
|
|
83
|
-
items: [
|
|
84
|
-
{ title: "Dashboard", url: "/spine-framework/admin/observability", icon: BarChart3 },
|
|
85
|
-
{ title: "Alerts", url: "/spine-framework/admin/observability/alerts", icon: AlertTriangle },
|
|
86
|
-
{ title: "Executions", url: "/spine-framework/admin/observability/executions", icon: Activity },
|
|
87
|
-
{ title: "Logs", url: "/spine-framework/admin/observability/logs", icon: FileSearch },
|
|
88
|
-
]
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
title: "Testing",
|
|
92
|
-
items: [
|
|
93
|
-
{ title: "Test Runs", url: "/spine-framework/admin/testing", icon: TestTube },
|
|
94
|
-
]
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
export function AdminSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
99
|
-
const location = useLocation()
|
|
100
|
-
|
|
101
|
-
// Check if a URL is active (exact match or starts with path)
|
|
102
|
-
const isActive = (url: string) => {
|
|
103
|
-
return location.pathname === url || location.pathname.startsWith(url + '/')
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return (
|
|
107
|
-
<Sidebar {...props}>
|
|
108
|
-
<SidebarHeader>
|
|
109
|
-
{/* Brand Header */}
|
|
110
|
-
<SidebarMenu>
|
|
111
|
-
<SidebarMenuItem>
|
|
112
|
-
<SidebarMenuButton size="lg" asChild>
|
|
113
|
-
<Link to="/spine-framework/admin/configs/types">
|
|
114
|
-
<div className="flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground">
|
|
115
|
-
<span className="text-sm font-bold">S</span>
|
|
116
|
-
</div>
|
|
117
|
-
<div className="flex flex-col gap-0.5 leading-none">
|
|
118
|
-
<span className="font-semibold">Spine</span>
|
|
119
|
-
<span className="text-xs text-muted-foreground">Framework</span>
|
|
120
|
-
</div>
|
|
121
|
-
</Link>
|
|
122
|
-
</SidebarMenuButton>
|
|
123
|
-
</SidebarMenuItem>
|
|
124
|
-
</SidebarMenu>
|
|
125
|
-
|
|
126
|
-
{/* Quick Create Button */}
|
|
127
|
-
<SidebarGroup className="py-2">
|
|
128
|
-
<Button className="w-full" size="sm">
|
|
129
|
-
<PlusIcon className="mr-2 h-4 w-4" />
|
|
130
|
-
Quick Create
|
|
131
|
-
</Button>
|
|
132
|
-
</SidebarGroup>
|
|
133
|
-
</SidebarHeader>
|
|
134
|
-
|
|
135
|
-
<SidebarContent>
|
|
136
|
-
{navigationSections.map((section) => (
|
|
137
|
-
<SidebarGroup key={section.title}>
|
|
138
|
-
<SidebarGroupLabel>{section.title}</SidebarGroupLabel>
|
|
139
|
-
<SidebarGroupContent>
|
|
140
|
-
<SidebarMenu>
|
|
141
|
-
{section.items.map((item) => (
|
|
142
|
-
<SidebarMenuItem key={item.title}>
|
|
143
|
-
<SidebarMenuButton asChild isActive={isActive(item.url)}>
|
|
144
|
-
<Link to={item.url}>
|
|
145
|
-
<item.icon className="h-4 w-4" />
|
|
146
|
-
<span>{item.title}</span>
|
|
147
|
-
</Link>
|
|
148
|
-
</SidebarMenuButton>
|
|
149
|
-
</SidebarMenuItem>
|
|
150
|
-
))}
|
|
151
|
-
</SidebarMenu>
|
|
152
|
-
</SidebarGroupContent>
|
|
153
|
-
</SidebarGroup>
|
|
154
|
-
))}
|
|
155
|
-
</SidebarContent>
|
|
156
|
-
|
|
157
|
-
<SidebarFooter className="p-4">
|
|
158
|
-
<div className="text-xs text-muted-foreground">
|
|
159
|
-
Spine v2.0
|
|
160
|
-
</div>
|
|
161
|
-
</SidebarFooter>
|
|
162
|
-
|
|
163
|
-
<SidebarRail />
|
|
164
|
-
</Sidebar>
|
|
165
|
-
)
|
|
166
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
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
|
-
|
|
14
|
-
import React from 'react'
|
|
15
|
-
import { LucideIcon } from 'lucide-react'
|
|
16
|
-
import { Card, CardContent } from '../ui/card'
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Props for `AdminStatsCard`.
|
|
20
|
-
*
|
|
21
|
-
* @prop title - Stat label
|
|
22
|
-
* @prop value - Numeric or formatted string value to display
|
|
23
|
-
* @prop icon - Lucide icon component
|
|
24
|
-
* @prop iconColor - Tailwind text-colour class (default: `'text-blue-500'`)
|
|
25
|
-
*/
|
|
26
|
-
interface AdminStatsCardProps {
|
|
27
|
-
title: string
|
|
28
|
-
value: string | number
|
|
29
|
-
icon: LucideIcon
|
|
30
|
-
iconColor?: string
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Single stat card.
|
|
35
|
-
*
|
|
36
|
-
* @param props - `AdminStatsCardProps`
|
|
37
|
-
* @returns White rounded card with icon and stat value
|
|
38
|
-
* @sideEffects none (pure rendering)
|
|
39
|
-
*/
|
|
40
|
-
export function AdminStatsCard({ title, value, icon: Icon, iconColor = "text-primary" }: AdminStatsCardProps) {
|
|
41
|
-
return (
|
|
42
|
-
<Card>
|
|
43
|
-
<CardContent className="p-5">
|
|
44
|
-
<div className="flex items-center">
|
|
45
|
-
<div className="flex-shrink-0">
|
|
46
|
-
<Icon className={`h-6 w-6 ${iconColor}`} />
|
|
47
|
-
</div>
|
|
48
|
-
<div className="ml-5 w-0 flex-1">
|
|
49
|
-
<dl>
|
|
50
|
-
<dt className="text-sm font-medium text-muted-foreground truncate">
|
|
51
|
-
{title}
|
|
52
|
-
</dt>
|
|
53
|
-
<dd className="text-lg font-semibold text-foreground">
|
|
54
|
-
{value}
|
|
55
|
-
</dd>
|
|
56
|
-
</dl>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
</CardContent>
|
|
60
|
-
</Card>
|
|
61
|
-
)
|
|
62
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { ChevronUp, ChevronDown } from 'lucide-react'
|
|
3
|
-
import { TableHead } from '../ui/table'
|
|
4
|
-
|
|
5
|
-
interface SortableTableHeaderProps {
|
|
6
|
-
title: string
|
|
7
|
-
sortKey: string
|
|
8
|
-
currentSortKey?: string
|
|
9
|
-
currentSortDirection?: 'asc' | 'desc'
|
|
10
|
-
onSort: (key: string) => void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function SortableTableHeader({
|
|
14
|
-
title,
|
|
15
|
-
sortKey,
|
|
16
|
-
currentSortKey,
|
|
17
|
-
currentSortDirection,
|
|
18
|
-
onSort,
|
|
19
|
-
}: SortableTableHeaderProps) {
|
|
20
|
-
const isSorted = currentSortKey === sortKey
|
|
21
|
-
const isAscending = currentSortDirection === 'asc'
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<TableHead
|
|
25
|
-
className="cursor-pointer"
|
|
26
|
-
onClick={() => onSort(sortKey)}
|
|
27
|
-
>
|
|
28
|
-
<div className="flex items-center gap-1">
|
|
29
|
-
<span>{title}</span>
|
|
30
|
-
{isSorted && (
|
|
31
|
-
<span className="inline-flex">
|
|
32
|
-
{isAscending ? (
|
|
33
|
-
<ChevronUp className="h-4 w-4 text-foreground" />
|
|
34
|
-
) : (
|
|
35
|
-
<ChevronDown className="h-4 w-4 text-foreground" />
|
|
36
|
-
)}
|
|
37
|
-
</span>
|
|
38
|
-
)}
|
|
39
|
-
</div>
|
|
40
|
-
</TableHead>
|
|
41
|
-
)
|
|
42
|
-
}
|