spine-framework 0.1.61 → 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 +223 -0
- package/README.md +327 -0
- package/package.json +107 -216
- 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 -126
- 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 -72
- 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 -64
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/assemble-frontend.sh +0 -79
- 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,163 +0,0 @@
|
|
|
1
|
-
-- =============================================================================
|
|
2
|
-
-- 001_seed.sql
|
|
3
|
-
-- Spine Framework — Bare minimum bootstrap data for a fresh install
|
|
4
|
-
-- Generated from live production DB audit: May 28, 2026
|
|
5
|
-
-- =============================================================================
|
|
6
|
-
-- Run AFTER 000_foundation.sql.
|
|
7
|
-
--
|
|
8
|
-
-- This file contains ONLY what is required for Spine to boot and for a
|
|
9
|
-
-- system_admin to log in and interact with the framework. Nothing more.
|
|
10
|
-
--
|
|
11
|
-
-- What requires seeding before the app can function:
|
|
12
|
-
-- 1. system_admin role — people.role_id FK target
|
|
13
|
-
-- 2. spine-core app — required by runtime; people/accounts ref app_id
|
|
14
|
-
-- 3. account type — accounts.type_id is NOT NULL
|
|
15
|
-
-- 4. person type — people.type_id is NOT NULL
|
|
16
|
-
-- 5. root system account — people.account_id is NOT NULL; the bootstrap
|
|
17
|
-
-- system_admin must belong to an account
|
|
18
|
-
--
|
|
19
|
-
-- Everything else (additional roles, app-specific types, tenant accounts,
|
|
20
|
-
-- app-owned link types) belongs in app seed files or is created via the admin UI.
|
|
21
|
-
-- =============================================================================
|
|
22
|
-
|
|
23
|
-
-- ---------------------------------------------------------------------------
|
|
24
|
-
-- 1. System Role
|
|
25
|
-
-- ---------------------------------------------------------------------------
|
|
26
|
-
INSERT INTO public.roles (slug, name, description, permissions, is_system, is_active, is_protected)
|
|
27
|
-
VALUES (
|
|
28
|
-
'system_admin',
|
|
29
|
-
'System Admin',
|
|
30
|
-
'Full system access — can manage all accounts, types, and system configuration',
|
|
31
|
-
'["*"]'::jsonb,
|
|
32
|
-
true,
|
|
33
|
-
true,
|
|
34
|
-
true
|
|
35
|
-
)
|
|
36
|
-
ON CONFLICT DO NOTHING;
|
|
37
|
-
|
|
38
|
-
-- ---------------------------------------------------------------------------
|
|
39
|
-
-- 1b. Core Roles
|
|
40
|
-
-- These are common roles used by apps but defined at core level
|
|
41
|
-
-- ---------------------------------------------------------------------------
|
|
42
|
-
INSERT INTO public.roles (slug, name, description, permissions, is_system, is_active, is_protected)
|
|
43
|
-
VALUES (
|
|
44
|
-
'member',
|
|
45
|
-
'Member',
|
|
46
|
-
'Standard member with read access to platform features',
|
|
47
|
-
'["*"]'::jsonb,
|
|
48
|
-
false,
|
|
49
|
-
true,
|
|
50
|
-
false
|
|
51
|
-
), (
|
|
52
|
-
'support',
|
|
53
|
-
'Support',
|
|
54
|
-
'Support agent with access to CRM, tickets, and customer data',
|
|
55
|
-
'["*"]'::jsonb,
|
|
56
|
-
false,
|
|
57
|
-
true,
|
|
58
|
-
false
|
|
59
|
-
)
|
|
60
|
-
ON CONFLICT DO NOTHING;
|
|
61
|
-
|
|
62
|
-
-- ---------------------------------------------------------------------------
|
|
63
|
-
-- 2. Spine Core App
|
|
64
|
-
-- ---------------------------------------------------------------------------
|
|
65
|
-
INSERT INTO public.apps (slug, name, description, version, app_type, source, is_active, is_system, min_role, config, nav_items, route_prefix, renderer, integration_deps, metadata)
|
|
66
|
-
VALUES (
|
|
67
|
-
'spine-core',
|
|
68
|
-
'Spine Core',
|
|
69
|
-
'Core Spine runtime — provides accounts, people, items, threads, messages, links, attachments, watchers',
|
|
70
|
-
'1.0.0',
|
|
71
|
-
'system',
|
|
72
|
-
'builtin',
|
|
73
|
-
true,
|
|
74
|
-
true,
|
|
75
|
-
NULL,
|
|
76
|
-
'{}'::jsonb,
|
|
77
|
-
'[]'::jsonb,
|
|
78
|
-
NULL,
|
|
79
|
-
'none',
|
|
80
|
-
'[]'::jsonb,
|
|
81
|
-
'{}'::jsonb
|
|
82
|
-
)
|
|
83
|
-
ON CONFLICT (slug) DO NOTHING;
|
|
84
|
-
|
|
85
|
-
-- ---------------------------------------------------------------------------
|
|
86
|
-
-- 3. Core Types
|
|
87
|
-
-- accounts.type_id and people.type_id are both NOT NULL, so these must exist
|
|
88
|
-
-- before any account or person can be created.
|
|
89
|
-
-- ---------------------------------------------------------------------------
|
|
90
|
-
INSERT INTO public.types (app_id, kind, slug, name, description, ownership, is_active, design_schema, validation_schema)
|
|
91
|
-
VALUES
|
|
92
|
-
((SELECT id FROM public.apps WHERE slug = 'spine-core'), 'account', 'account', 'Account', 'Organization or tenant account', 'pack', true,
|
|
93
|
-
'{"views":{"default_list":{"type":"list","label":"Accounts","fields":{"slug":{"sortable":true,"display_type":"text"},"is_active":{"sortable":true,"display_type":"badge"},"display_name":{"sortable":true,"display_type":"text"}},"display":"table"},"default_detail":{"type":"detail","label":"Account","sections":[{"title":"Overview","fields":["slug","display_name","description","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"slug":{"label":"Slug","system":true,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"description":{"label":"Description","system":true,"required":false,"data_type":"textarea"},"display_name":{"label":"Display Name","system":true,"required":true,"data_type":"text"}},"record_permissions":{"member":["create","read","update"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb,
|
|
94
|
-
'{"fields":{"slug":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false},"description":{"data_type":"textarea","required":false},"display_name":{"data_type":"text","required":true}}}'::jsonb),
|
|
95
|
-
((SELECT id FROM public.apps WHERE slug = 'spine-core'), 'person', 'person', 'Person', 'User or contact person', 'pack', true,
|
|
96
|
-
'{"views":{"default_list":{"type":"list","label":"People","fields":{"email":{"sortable":true,"display_type":"text"},"status":{"sortable":true,"display_type":"badge"},"full_name":{"sortable":true,"display_type":"text"},"is_active":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Person","sections":[{"title":"Profile","fields":["full_name","email","phone","avatar_url"]},{"title":"Status","fields":["status","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"email":{"label":"Email","system":true,"required":true,"data_type":"email"},"phone":{"label":"Phone","system":true,"required":false,"data_type":"phone"},"status":{"label":"Status","system":true,"required":true,"data_type":"text"},"full_name":{"label":"Full Name","system":true,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"avatar_url":{"label":"Avatar URL","system":true,"required":false,"data_type":"url"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"}},"record_permissions":{"member":["create","read","update"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb,
|
|
97
|
-
'{"fields":{"email":{"data_type":"email","required":true},"phone":{"data_type":"phone","required":false},"status":{"data_type":"text","required":true},"full_name":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"avatar_url":{"data_type":"url","required":false},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false}}}'::jsonb)
|
|
98
|
-
ON CONFLICT (app_id, kind, slug) DO UPDATE
|
|
99
|
-
SET design_schema = EXCLUDED.design_schema,
|
|
100
|
-
validation_schema = EXCLUDED.validation_schema,
|
|
101
|
-
name = EXCLUDED.name,
|
|
102
|
-
description = EXCLUDED.description;
|
|
103
|
-
|
|
104
|
-
-- ---------------------------------------------------------------------------
|
|
105
|
-
-- 4. Root System Account
|
|
106
|
-
-- The first system_admin person must belong to an account. This is the
|
|
107
|
-
-- bootstrap account for the Spine system itself.
|
|
108
|
-
-- NOTE: The system_admin person record is NOT seeded here — it is created
|
|
109
|
-
-- via Supabase Auth invite + the onboarding flow, which stamps type_id and
|
|
110
|
-
-- role_id onto the resulting people row.
|
|
111
|
-
-- ---------------------------------------------------------------------------
|
|
112
|
-
INSERT INTO public.accounts (type_id, slug, display_name, description, is_active, design_schema, validation_schema)
|
|
113
|
-
VALUES (
|
|
114
|
-
(SELECT id FROM public.types WHERE kind = 'account' AND slug = 'account'),
|
|
115
|
-
'spine-system',
|
|
116
|
-
'Spine System',
|
|
117
|
-
'Root system account for the Spine framework',
|
|
118
|
-
true,
|
|
119
|
-
(SELECT design_schema FROM public.types WHERE kind = 'account' AND slug = 'account'),
|
|
120
|
-
'{}'::jsonb
|
|
121
|
-
)
|
|
122
|
-
ON CONFLICT (slug) DO UPDATE
|
|
123
|
-
SET design_schema = EXCLUDED.design_schema,
|
|
124
|
-
validation_schema = EXCLUDED.validation_schema;
|
|
125
|
-
|
|
126
|
-
-- ---------------------------------------------------------------------------
|
|
127
|
-
-- 5. Core Spine Types
|
|
128
|
-
-- These types are owned by spine-core and provide design_schema for all
|
|
129
|
-
-- built-in framework entities. Apps build on top of these.
|
|
130
|
-
-- ---------------------------------------------------------------------------
|
|
131
|
-
INSERT INTO public.types (app_id, kind, slug, name, description, ownership, is_active, design_schema, validation_schema)
|
|
132
|
-
SELECT
|
|
133
|
-
a.id,
|
|
134
|
-
t.kind,
|
|
135
|
-
t.slug,
|
|
136
|
-
t.name,
|
|
137
|
-
t.description,
|
|
138
|
-
t.ownership,
|
|
139
|
-
true,
|
|
140
|
-
t.design_schema,
|
|
141
|
-
t.validation_schema
|
|
142
|
-
FROM (VALUES
|
|
143
|
-
('alert', 'threshold_alert', 'Threshold Alert', 'System threshold alert configuration for observability', 'tenant', '{"scope":"account","views":{"default_list":{"type":"list","label":"Threshold Alerts","fields":{"title":{"sortable":true,"display_type":"text"},"metric":{"sortable":true,"display_type":"badge"},"status":{"sortable":true,"display_type":"badge"},"is_active":{"sortable":true,"display_type":"badge"}},"display":"table","default_sort":{"field":"created_at","direction":"desc"}},"default_detail":{"type":"detail","label":"Threshold Alert","sections":[{"title":"Alert Config","fields":["title","description","metric","operator","value","window_minutes","pipeline_id"]},{"title":"Status","fields":["status","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"title":{"label":"Title","system":true,"required":true,"data_type":"text"},"value":{"label":"Value","system":false,"required":true,"data_type":"number"},"metric":{"label":"Metric","system":false,"required":true,"data_type":"text"},"status":{"label":"Status","system":true,"required":false,"data_type":"text"},"operator":{"label":"Operator","system":false,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"description":{"label":"Description","system":true,"required":false,"data_type":"textarea"},"pipeline_id":{"label":"Pipeline","system":false,"required":false,"data_type":"text"},"window_minutes":{"label":"Window (minutes)","system":false,"required":true,"data_type":"number"}},"record_permissions":{"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"title":{"data_type":"text","required":true},"value":{"data_type":"number","required":true},"metric":{"data_type":"text","required":true},"status":{"data_type":"text","required":false},"operator":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false},"description":{"data_type":"textarea","required":false},"pipeline_id":{"data_type":"text","required":false},"window_minutes":{"data_type":"number","required":true}}}'::jsonb),
|
|
144
|
-
('attachment', 'attachment', 'Attachment', 'File attachment or document', 'pack', '{"scope":"account","views":{"default_list":{"type":"list","label":"Attachments","fields":{"filename":{"sortable":true,"display_type":"text"},"file_size":{"sortable":true,"display_type":"number"},"mime_type":{"sortable":true,"display_type":"badge"},"storage_provider":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Attachment","sections":[{"title":"File Info","fields":["filename","file_size","mime_type","storage_path","storage_provider"]},{"title":"Metadata","fields":["is_active","created_at"]}]}},"fields":{"filename":{"label":"Filename","system":true,"required":true,"data_type":"text"},"file_size":{"label":"File Size","system":true,"required":false,"data_type":"number"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"mime_type":{"label":"MIME Type","system":true,"required":false,"data_type":"text"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"storage_path":{"label":"Storage Path","system":true,"required":false,"data_type":"text"},"storage_provider":{"label":"Storage Provider","system":true,"required":false,"data_type":"text"}},"record_permissions":{"member":["read"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"filename":{"data_type":"text","required":true},"file_size":{"data_type":"number","required":false},"is_active":{"data_type":"boolean","required":true},"mime_type":{"data_type":"text","required":false},"created_at":{"data_type":"datetime","required":false},"storage_path":{"data_type":"text","required":false},"storage_provider":{"data_type":"text","required":false}}}'::jsonb),
|
|
145
|
-
('item', 'item', 'Item', 'Generic work item or record', 'pack', '{"scope":"account","views":{"default_list":{"type":"list","label":"Items","fields":{"title":{"sortable":true,"display_type":"text"},"status":{"sortable":true,"display_type":"badge"},"is_active":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Item","sections":[{"title":"Details","fields":["title","description","status","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"title":{"label":"Title","system":true,"required":true,"data_type":"text"},"status":{"label":"Status","system":true,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"description":{"label":"Description","system":true,"required":false,"data_type":"textarea"}},"record_permissions":{"member":["create","read","update"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"title":{"data_type":"text","required":true},"status":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false},"description":{"data_type":"textarea","required":false}}}'::jsonb),
|
|
146
|
-
('item', 'activity_log', 'Activity Log', 'Audit log for funnel intelligence activities', 'tenant', '{"scope":"platform","views":{"default_list":{"type":"list","label":"Activity Logs","fields":{"action":{"sortable":true,"display_type":"badge"},"account_id":{"sortable":true,"display_type":"text"},"created_at":{"sortable":true,"display_type":"timestamp"}},"display":"table","default_sort":{"field":"created_at","direction":"desc"}}},"fields":{"action":{"label":"Action","options":["lead_score_updated","lifecycle_stage_changed","signal_processed","task_created"],"required":true,"data_type":"text"},"new_score":{"label":"New Score","required":false,"data_type":"integer"},"new_stage":{"label":"New Stage","required":false,"data_type":"text"},"person_id":{"label":"Person ID","required":false,"data_type":"uuid"},"account_id":{"label":"Account ID","required":false,"data_type":"uuid"},"score_delta":{"label":"Score Delta","required":false,"data_type":"integer"},"signal_type":{"label":"Signal Type","required":false,"data_type":"text"}},"record_permissions":{"member":["read"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"action":{"data_type":"text","required":true,"options":["lead_score_updated","lifecycle_stage_changed","signal_processed","task_created"]},"new_score":{"data_type":"integer","required":false},"new_stage":{"data_type":"text","required":false},"person_id":{"data_type":"uuid","required":false},"account_id":{"data_type":"uuid","required":false},"score_delta":{"data_type":"integer","required":false},"signal_type":{"data_type":"text","required":false}}}'::jsonb),
|
|
147
|
-
('item', 'task', 'Task', 'Task or action item for follow-up and tracking', 'tenant', '{"scope":"platform","views":{"default_list":{"type":"list","label":"Tasks","fields":{"status":{"sortable":true,"display_type":"badge"},"due_date":{"sortable":true,"display_type":"timestamp"},"priority":{"sortable":true,"display_type":"badge"},"task_type":{"sortable":true,"display_type":"badge"}},"display":"table","default_sort":{"field":"created_at","direction":"desc"}},"default_detail":{"type":"detail","label":"Task","sections":[{"title":"Task Details","fields":["task_type","priority","description","due_date"]},{"title":"Assignment","fields":["account_id","person_id"]},{"title":"Metadata","fields":["status","created_at","updated_at"]}]}},"fields":{"due_date":{"label":"Due Date","required":false,"data_type":"datetime"},"priority":{"label":"Priority","default":"medium","options":["low","medium","high","urgent"],"required":true,"data_type":"text"},"person_id":{"label":"Person ID","required":false,"data_type":"uuid"},"task_type":{"label":"Task Type","options":["lead_review","customer_followup","support_escalation","health_check"],"required":true,"data_type":"text"},"account_id":{"label":"Account ID","required":false,"data_type":"uuid"},"description":{"label":"Description","required":true,"data_type":"textarea"}},"record_permissions":{"member":["read"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"due_date":{"data_type":"datetime","required":false},"priority":{"data_type":"text","required":true,"options":["low","medium","high","urgent"]},"person_id":{"data_type":"uuid","required":false},"task_type":{"data_type":"text","required":true,"options":["lead_review","customer_followup","support_escalation","health_check"]},"account_id":{"data_type":"uuid","required":false},"description":{"data_type":"textarea","required":true}}}'::jsonb),
|
|
148
|
-
('link', 'link', 'Link', 'Relationship between entities', 'pack', '{"scope":"account","views":{"default_list":{"type":"list","label":"Links","fields":{"link_type":{"sortable":true,"display_type":"badge"},"source_type":{"sortable":true,"display_type":"text"},"target_type":{"sortable":true,"display_type":"text"}},"display":"table"},"default_detail":{"type":"detail","label":"Link","sections":[{"title":"Relationship","fields":["source_type","target_type","link_type","is_active"]},{"title":"Metadata","fields":["created_at"]}]}},"fields":{"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"link_type":{"label":"Link Type","system":true,"required":false,"data_type":"text"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"source_type":{"label":"Source Type","system":true,"required":true,"data_type":"text"},"target_type":{"label":"Target Type","system":true,"required":true,"data_type":"text"}},"record_permissions":{"member":["create","read"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"is_active":{"data_type":"boolean","required":true},"link_type":{"data_type":"text","required":false},"created_at":{"data_type":"datetime","required":false},"source_type":{"data_type":"text","required":true},"target_type":{"data_type":"text","required":true}}}'::jsonb),
|
|
149
|
-
('message', 'message', 'Message', 'Individual message in a thread', 'pack', '{"scope":"platform","views":{"default_list":{"type":"list","label":"Messages","fields":{"content":{"sortable":false,"display_type":"text"},"sequence":{"sortable":true,"display_type":"number"},"direction":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Message","sections":[{"title":"Content","fields":["content","direction","sequence","visibility"]},{"title":"Metadata","fields":["created_at"]}]}},"fields":{"content":{"label":"Content","system":true,"required":true,"data_type":"textarea"},"sequence":{"label":"Sequence","system":true,"required":true,"data_type":"number"},"direction":{"label":"Direction","system":true,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"visibility":{"label":"Visibility","system":true,"required":false,"data_type":"text"},"message_type":{"label":"Message Type","system":true,"required":false,"data_type":"text"}},"record_permissions":{"member":["read","create"],"support":["read","create","update","delete"],"system_admin":["read","create","update","delete"]}}'::jsonb, '{"fields":{"content":{"data_type":"textarea","required":true},"sequence":{"data_type":"number","required":true},"direction":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"visibility":{"data_type":"text","required":false},"message_type":{"data_type":"text","required":false}}}'::jsonb),
|
|
150
|
-
('progress', 'course_lesson_progress', 'Course Lesson Progress', 'Tracks per-student progress through a course lesson', 'pack', '{"scope":"account","views":{"default_list":{"type":"list","label":"Progress Records","fields":{"score":{"sortable":true,"display_type":"number"},"title":{"sortable":true,"display_type":"text"},"status":{"sortable":true,"display_type":"badge"},"updated_at":{"sortable":true,"display_type":"timestamp"}},"display":"table"},"default_detail":{"type":"detail","label":"Progress Record","sections":[{"title":"Overview","fields":["title","description","status","score"]},{"title":"Activity","fields":["attempts","time_spent","last_position","started_at","completed_at"]},{"title":"Metadata","fields":["is_active","created_at","updated_at"]}]}},"fields":{"score":{"label":"Score","system":true,"required":false,"data_type":"number","validation":{"max":100,"min":0,"integer":true}},"title":{"label":"Title","system":true,"readonly":true,"required":false,"data_type":"text"},"status":{"label":"Status","system":true,"options":["not_started","in_progress","completed"],"required":true,"data_type":"select"},"attempts":{"label":"Attempts","required":false,"data_type":"number","validation":{"min":0,"integer":true}},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"started_at":{"label":"Started At","readonly":true,"required":false,"data_type":"datetime"},"time_spent":{"label":"Time Spent (s)","required":false,"data_type":"number","validation":{"min":0,"integer":true}},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"description":{"label":"Description","system":true,"readonly":true,"required":false,"data_type":"textarea"},"completed_at":{"label":"Completed At","readonly":true,"required":false,"data_type":"datetime"},"last_position":{"label":"Last Position (s)","required":false,"data_type":"number","validation":{"min":0,"integer":true}}},"pipeline":["not_started","in_progress","completed"],"record_permissions":{"member":["create","read","update"],"support":["create","read","update"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"score":{"data_type":"number","required":false,"max":100,"min":0,"integer":true},"title":{"data_type":"text","required":false},"status":{"data_type":"select","required":true,"options":["not_started","in_progress","completed"]},"attempts":{"data_type":"number","required":false,"min":0,"integer":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"started_at":{"data_type":"datetime","required":false},"time_spent":{"data_type":"number","required":false,"min":0,"integer":true},"updated_at":{"data_type":"datetime","required":false},"description":{"data_type":"textarea","required":false},"completed_at":{"data_type":"datetime","required":false},"last_position":{"data_type":"number","required":false,"min":0,"integer":true}}}'::jsonb),
|
|
151
|
-
('thread', 'thread', 'Thread', 'Conversation thread for items or entities', 'pack', '{"scope":"platform","views":{"default_list":{"type":"list","label":"Threads","fields":{"title":{"sortable":true,"display_type":"text"},"status":{"sortable":true,"display_type":"badge"},"visibility":{"sortable":true,"display_type":"badge"},"target_type":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Thread","sections":[{"title":"Overview","fields":["title","target_type","visibility","status","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"title":{"label":"Title","system":true,"required":false,"data_type":"text"},"status":{"label":"Status","system":true,"required":true,"data_type":"text"},"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"visibility":{"label":"Visibility","system":true,"required":true,"data_type":"text"},"target_type":{"label":"Target Type","system":true,"required":true,"data_type":"text"}},"ai_routing":{"agent_id":{"type":"string","label":"Agent ID"},"prompt_config_id":{"type":"string","label":"Prompt Config ID"}},"record_permissions":{"member":["read","create"],"support":["read","create","update","delete"],"system_admin":["read","create","update","delete"]}}'::jsonb, '{"fields":{"title":{"data_type":"text","required":false},"status":{"data_type":"text","required":true},"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false},"visibility":{"data_type":"text","required":true},"target_type":{"data_type":"text","required":true}}}'::jsonb),
|
|
152
|
-
('watcher', 'watcher', 'Watcher', 'Entity watcher subscription', 'pack', '{"scope":"account","views":{"default_list":{"type":"list","label":"Watchers","fields":{"is_active":{"sortable":true,"display_type":"badge"},"watch_type":{"sortable":true,"display_type":"badge"},"target_type":{"sortable":true,"display_type":"text"},"notification_level":{"sortable":true,"display_type":"badge"}},"display":"table"},"default_detail":{"type":"detail","label":"Watcher","sections":[{"title":"Watch Settings","fields":["target_type","watch_type","notification_level","is_active"]},{"title":"Metadata","fields":["created_at","updated_at"]}]}},"fields":{"is_active":{"label":"Active","system":true,"required":true,"data_type":"boolean"},"created_at":{"label":"Created","system":true,"readonly":true,"required":false,"data_type":"datetime"},"updated_at":{"label":"Updated","system":true,"readonly":true,"required":false,"data_type":"datetime"},"watch_type":{"label":"Watch Type","system":true,"required":false,"data_type":"text"},"target_type":{"label":"Target Type","system":true,"required":true,"data_type":"text"},"notification_level":{"label":"Notification Level","system":true,"required":true,"data_type":"text"}},"record_permissions":{"member":["create","read","delete"],"support":["create","read","delete"],"system_admin":["create","read","update","delete"]}}'::jsonb, '{"fields":{"is_active":{"data_type":"boolean","required":true},"created_at":{"data_type":"datetime","required":false},"updated_at":{"data_type":"datetime","required":false},"watch_type":{"data_type":"text","required":false},"target_type":{"data_type":"text","required":true},"notification_level":{"data_type":"text","required":true}}}'::jsonb)
|
|
153
|
-
) AS t(kind, slug, name, description, ownership, design_schema, validation_schema)
|
|
154
|
-
CROSS JOIN (SELECT id FROM public.apps WHERE slug = 'spine-core') AS a
|
|
155
|
-
ON CONFLICT (app_id, kind, slug) DO UPDATE
|
|
156
|
-
SET design_schema = EXCLUDED.design_schema,
|
|
157
|
-
validation_schema = EXCLUDED.validation_schema,
|
|
158
|
-
name = EXCLUDED.name,
|
|
159
|
-
description = EXCLUDED.description;
|
|
160
|
-
|
|
161
|
-
-- NOTE: No link types are seeded here. All link types are app-owned.
|
|
162
|
-
-- Cortex seeds: account_signals, account_opportunities, analyzed_by, tagged_with
|
|
163
|
-
-- See custom/apps/cortex/seed/link-types.json
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
-- =============================================================================
|
|
2
|
-
-- 002_seed_constraints.sql
|
|
3
|
-
-- Adds unique constraints required for idempotent seed upserts
|
|
4
|
-
-- =============================================================================
|
|
5
|
-
|
|
6
|
-
-- link_types needs unique on (app_id, slug) for seed upserts
|
|
7
|
-
DO $$ BEGIN
|
|
8
|
-
ALTER TABLE public.link_types ADD CONSTRAINT link_types_app_id_slug_key UNIQUE (app_id, slug);
|
|
9
|
-
EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|
|
10
|
-
|
|
11
|
-
-- triggers needs unique on (app_id, name) for seed upserts
|
|
12
|
-
DO $$ BEGIN
|
|
13
|
-
ALTER TABLE public.triggers ADD CONSTRAINT triggers_app_id_name_key UNIQUE (app_id, name);
|
|
14
|
-
EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|
|
15
|
-
|
|
16
|
-
-- pipelines needs unique on (app_id, name) for seed upserts
|
|
17
|
-
DO $$ BEGIN
|
|
18
|
-
ALTER TABLE public.pipelines ADD CONSTRAINT pipelines_app_id_name_key UNIQUE (app_id, name);
|
|
19
|
-
EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
-- =============================================================================
|
|
2
|
-
-- 003_auth_user_trigger.sql
|
|
3
|
-
-- Creates a people record whenever a new Supabase auth user signs up.
|
|
4
|
-
-- Run AFTER 001_seed.sql (requires spine-system account and person type).
|
|
5
|
-
--
|
|
6
|
-
-- First user ever → system_admin role (bootstrap)
|
|
7
|
-
-- Subsequent users → no role (assigned later via admin invite flow)
|
|
8
|
-
-- =============================================================================
|
|
9
|
-
|
|
10
|
-
CREATE OR REPLACE FUNCTION public.handle_new_auth_user()
|
|
11
|
-
RETURNS TRIGGER LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
|
|
12
|
-
DECLARE
|
|
13
|
-
v_account_id uuid;
|
|
14
|
-
v_type_id uuid;
|
|
15
|
-
v_role_id uuid;
|
|
16
|
-
v_is_first boolean;
|
|
17
|
-
v_design_schema jsonb;
|
|
18
|
-
v_validation_schema jsonb;
|
|
19
|
-
BEGIN
|
|
20
|
-
SELECT id INTO v_account_id FROM public.accounts WHERE slug = 'spine-system' LIMIT 1;
|
|
21
|
-
SELECT id, design_schema, validation_schema
|
|
22
|
-
INTO v_type_id, v_design_schema, v_validation_schema
|
|
23
|
-
FROM public.types WHERE kind = 'person' AND slug = 'person' LIMIT 1;
|
|
24
|
-
|
|
25
|
-
IF v_account_id IS NULL OR v_type_id IS NULL THEN
|
|
26
|
-
RAISE WARNING 'handle_new_auth_user: spine-system account or person type not found — skipping people insert';
|
|
27
|
-
RETURN NEW;
|
|
28
|
-
END IF;
|
|
29
|
-
|
|
30
|
-
-- First person ever gets system_admin; subsequent users get no role
|
|
31
|
-
SELECT NOT EXISTS (SELECT 1 FROM public.people LIMIT 1) INTO v_is_first;
|
|
32
|
-
IF v_is_first THEN
|
|
33
|
-
SELECT id INTO v_role_id FROM public.roles WHERE slug = 'system_admin' LIMIT 1;
|
|
34
|
-
END IF;
|
|
35
|
-
|
|
36
|
-
INSERT INTO public.people (
|
|
37
|
-
id,
|
|
38
|
-
auth_uid,
|
|
39
|
-
email,
|
|
40
|
-
full_name,
|
|
41
|
-
account_id,
|
|
42
|
-
type_id,
|
|
43
|
-
role_id,
|
|
44
|
-
is_active,
|
|
45
|
-
design_schema,
|
|
46
|
-
validation_schema
|
|
47
|
-
) VALUES (
|
|
48
|
-
NEW.id,
|
|
49
|
-
NEW.id,
|
|
50
|
-
NEW.email,
|
|
51
|
-
COALESCE(NEW.raw_user_meta_data->>'full_name', split_part(NEW.email, '@', 1)),
|
|
52
|
-
v_account_id,
|
|
53
|
-
v_type_id,
|
|
54
|
-
v_role_id,
|
|
55
|
-
true,
|
|
56
|
-
v_design_schema,
|
|
57
|
-
COALESCE(v_validation_schema, '{}'::jsonb)
|
|
58
|
-
)
|
|
59
|
-
ON CONFLICT (id) DO NOTHING;
|
|
60
|
-
|
|
61
|
-
RETURN NEW;
|
|
62
|
-
END;
|
|
63
|
-
$$;
|
|
64
|
-
|
|
65
|
-
CREATE OR REPLACE TRIGGER on_auth_user_created
|
|
66
|
-
AFTER INSERT ON auth.users
|
|
67
|
-
FOR EACH ROW EXECUTE FUNCTION public.handle_new_auth_user();
|
package/.framework/src/App.tsx
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { Suspense, lazy } from 'react'
|
|
2
|
-
import { Routes, Route, Navigate } from 'react-router-dom'
|
|
3
|
-
import { useAuth } from './contexts/AuthContext'
|
|
4
|
-
import { LoadingSpinner } from './components/ui/LoadingSpinner'
|
|
5
|
-
import { LoginPage } from './pages/auth/LoginPage'
|
|
6
|
-
import { RegisterPage } from './pages/auth/RegisterPage'
|
|
7
|
-
import { NotFoundPage } from './pages/NotFoundPage'
|
|
8
|
-
import { DashboardPage } from './pages/DashboardPage'
|
|
9
|
-
import { AppWrapper } from './components/AppWrapper'
|
|
10
|
-
import { AppsRegistryProvider, useAppsRegistry } from './contexts/AppContext'
|
|
11
|
-
import { CustomAppLoader } from './components/CustomAppLoader'
|
|
12
|
-
import { GenericAppShell } from './components/app-shell/GenericAppShell'
|
|
13
|
-
import { APIPage } from './pages/spine-framework/APIPage'
|
|
14
|
-
import { CLIPage } from './pages/spine-framework/CLIPage'
|
|
15
|
-
|
|
16
|
-
const AdminApp = lazy(() => import('./apps/admin/index'))
|
|
17
|
-
|
|
18
|
-
function App() {
|
|
19
|
-
const { user, isLoading } = useAuth()
|
|
20
|
-
|
|
21
|
-
if (isLoading) {
|
|
22
|
-
return (
|
|
23
|
-
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
24
|
-
<div className="text-center">
|
|
25
|
-
<LoadingSpinner className="w-8 h-8 mx-auto mb-4" />
|
|
26
|
-
<p className="text-slate-600">Loading Spine...</p>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<AppsRegistryProvider>
|
|
34
|
-
{!user ? (
|
|
35
|
-
<Routes>
|
|
36
|
-
<Route path="/login" element={<LoginPage />} />
|
|
37
|
-
<Route path="/register" element={<RegisterPage />} />
|
|
38
|
-
<Route path="*" element={<Navigate to="/login" replace />} />
|
|
39
|
-
</Routes>
|
|
40
|
-
) : (
|
|
41
|
-
<AuthenticatedRouter />
|
|
42
|
-
)}
|
|
43
|
-
</AppsRegistryProvider>
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function AuthenticatedRouter() {
|
|
48
|
-
const { routableApps: apps, loading } = useAppsRegistry()
|
|
49
|
-
|
|
50
|
-
if (loading) {
|
|
51
|
-
return (
|
|
52
|
-
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
53
|
-
<div className="text-center">
|
|
54
|
-
<LoadingSpinner className="w-8 h-8 mx-auto mb-4" />
|
|
55
|
-
<p className="text-slate-600">Loading apps...</p>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Sort: explicit prefixes first, root (/) last
|
|
62
|
-
const sorted = [...apps]
|
|
63
|
-
.filter(app => app.slug !== 'spine-framework' && !app.route_prefix?.startsWith('/spine-framework'))
|
|
64
|
-
.sort((a, b) => {
|
|
65
|
-
if (a.route_prefix === '/') return 1
|
|
66
|
-
if (b.route_prefix === '/') return -1
|
|
67
|
-
return (b.route_prefix?.length || 0) - (a.route_prefix?.length || 0)
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
return (
|
|
71
|
-
<Suspense fallback={<div className="min-h-screen flex items-center justify-center"><LoadingSpinner /></div>}>
|
|
72
|
-
<Routes>
|
|
73
|
-
{/* Default redirect */}
|
|
74
|
-
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
75
|
-
<Route path="/dashboard" element={<DashboardPage />} />
|
|
76
|
-
|
|
77
|
-
{/* Login route for authenticated users (redirects to qualified app) */}
|
|
78
|
-
<Route path="/login" element={<LoginPage />} />
|
|
79
|
-
|
|
80
|
-
{/* ── Spine Framework namespace (reserved — no custom app may use this path) ── */}
|
|
81
|
-
<Route path="/spine-framework/admin/*" element={<AdminApp />} />
|
|
82
|
-
<Route path="/spine-framework/api" element={<APIPage />} />
|
|
83
|
-
<Route path="/spine-framework/cli" element={<CLIPage />} />
|
|
84
|
-
|
|
85
|
-
{/* Dynamic app routes */}
|
|
86
|
-
{sorted.map(app => {
|
|
87
|
-
const prefix = app.route_prefix!
|
|
88
|
-
|
|
89
|
-
if (app.renderer === 'custom') {
|
|
90
|
-
return (
|
|
91
|
-
<Route
|
|
92
|
-
key={app.slug}
|
|
93
|
-
path={`${prefix}/*`}
|
|
94
|
-
element={
|
|
95
|
-
<AppWrapper app={app}>
|
|
96
|
-
<CustomAppLoader slug={app.slug} />
|
|
97
|
-
</AppWrapper>
|
|
98
|
-
}
|
|
99
|
-
/>
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (app.renderer === 'generic') {
|
|
104
|
-
return (
|
|
105
|
-
<Route
|
|
106
|
-
key={app.slug}
|
|
107
|
-
path={`${prefix}/*`}
|
|
108
|
-
element={
|
|
109
|
-
<AppWrapper app={app}>
|
|
110
|
-
<GenericAppShell app={app} />
|
|
111
|
-
</AppWrapper>
|
|
112
|
-
}
|
|
113
|
-
/>
|
|
114
|
-
)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return null
|
|
118
|
-
})}
|
|
119
|
-
|
|
120
|
-
<Route path="*" element={<NotFoundPage />} />
|
|
121
|
-
</Routes>
|
|
122
|
-
</Suspense>
|
|
123
|
-
)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export default App
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { lazy, Suspense } from 'react'
|
|
2
|
-
import { Routes, Route, Navigate, useLocation } from 'react-router-dom'
|
|
3
|
-
import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
|
|
4
|
-
import { NotFoundPage } from '../../pages/NotFoundPage'
|
|
5
|
-
import { useAuth } from '../../contexts/AuthContext'
|
|
6
|
-
import { AppShell } from '../../components/layout/AppShell'
|
|
7
|
-
import { AdminSidebar } from '../../components/admin/AdminSidebar'
|
|
8
|
-
import { TooltipProvider } from '../../components/ui/tooltip'
|
|
9
|
-
|
|
10
|
-
// Config list pages
|
|
11
|
-
const TypesPage = lazy(() => import('../../pages/admin/TypesPage').then(m => ({ default: m.TypesPage })))
|
|
12
|
-
const AppsPage = lazy(() => import('../../pages/admin/AppsPage').then(m => ({ default: m.AppsPage })))
|
|
13
|
-
const TypeDetailPage = lazy(() => import('../../pages/admin/TypeDetailPage').then(m => ({ default: m.TypeDetailPage })))
|
|
14
|
-
const PipelinesPage = lazy(() => import('../../pages/admin/PipelinesPage').then(m => ({ default: m.PipelinesPage })))
|
|
15
|
-
const TriggersPage = lazy(() => import('../../pages/admin/TriggersPage').then(m => ({ default: m.TriggersPage })))
|
|
16
|
-
const AIAgentsPage = lazy(() => import('../../pages/admin/AIAgentsPage').then(m => ({ default: m.AIAgentsPage })))
|
|
17
|
-
const EmbeddingsPage = lazy(() => import('../../pages/admin/EmbeddingsPage').then(m => ({ default: m.EmbeddingsPage })))
|
|
18
|
-
const TimersPage = lazy(() => import('../../pages/admin/TimersPage').then(m => ({ default: m.TimersPage })))
|
|
19
|
-
const IntegrationsPage = lazy(() => import('../../pages/admin/IntegrationsPage').then(m => ({ default: m.IntegrationsPage })))
|
|
20
|
-
|
|
21
|
-
// Config detail pages
|
|
22
|
-
const AppDetailPage = lazy(() => import('../../pages/admin/AppDetailPage').then(m => ({ default: m.AppDetailPage })))
|
|
23
|
-
const PipelineDetailPage = lazy(() => import('../../pages/admin/PipelineDetailPage').then(m => ({ default: m.PipelineDetailPage })))
|
|
24
|
-
const TriggerDetailPage = lazy(() => import('../../pages/admin/TriggerDetailPage').then(m => ({ default: m.TriggerDetailPage })))
|
|
25
|
-
const AIAgentDetailPage = lazy(() => import('../../pages/admin/AIAgentDetailPage').then(m => ({ default: m.AIAgentDetailPage })))
|
|
26
|
-
const EmbeddingDetailPage = lazy(() => import('../../pages/admin/EmbeddingDetailPage').then(m => ({ default: m.EmbeddingDetailPage })))
|
|
27
|
-
const TimerDetailPage = lazy(() => import('../../pages/admin/TimerDetailPage').then(m => ({ default: m.TimerDetailPage })))
|
|
28
|
-
const IntegrationDetailPage = lazy(() => import('../../pages/admin/IntegrationDetailPage').then(m => ({ default: m.IntegrationDetailPage })))
|
|
29
|
-
const RolesPage = lazy(() => import('../../pages/admin/RolesPage').then(m => ({ default: m.RolesPage })))
|
|
30
|
-
const RoleDetailPage = lazy(() => import('../../pages/admin/RoleDetailPage').then(m => ({ default: m.RoleDetailPage })))
|
|
31
|
-
const PromptConfigsPage = lazy(() => import('../../pages/admin/PromptConfigsPage').then(m => ({ default: m.PromptConfigsPage })))
|
|
32
|
-
const PromptConfigDetailPage = lazy(() => import('../../pages/admin/PromptConfigDetailPage').then(m => ({ default: m.PromptConfigDetailPage })))
|
|
33
|
-
const APIKeysPage = lazy(() => import('../../pages/admin/APIKeysPage').then(m => ({ default: m.APIKeysPage })))
|
|
34
|
-
const APIKeyDetailPage = lazy(() => import('../../pages/admin/APIKeyDetailPage').then(m => ({ default: m.APIKeyDetailPage })))
|
|
35
|
-
|
|
36
|
-
// Observability pages
|
|
37
|
-
const ObservabilityDashboard = lazy(() => import('../../pages/admin/ObservabilityDashboard').then(m => ({ default: m.ObservabilityDashboard })))
|
|
38
|
-
const PipelineExecutionsPage = lazy(() => import('../../pages/admin/PipelineExecutionsPage').then(m => ({ default: m.PipelineExecutionsPage })))
|
|
39
|
-
const LogsPage = lazy(() => import('../../pages/admin/LogsPage').then(m => ({ default: m.LogsPage })))
|
|
40
|
-
const AlertsConfigPage = lazy(() => import('../../pages/admin/AlertsConfigPage').then(m => ({ default: m.AlertsConfigPage })))
|
|
41
|
-
|
|
42
|
-
// Runtime data pages (unified)
|
|
43
|
-
const DataListPage = lazy(() => import('../../components/runtime/DataListPage').then(m => ({ default: m.DataListPage })))
|
|
44
|
-
const DataDetailPage = lazy(() => import('../../components/runtime/DataDetailPage').then(m => ({ default: m.DataDetailPage })))
|
|
45
|
-
|
|
46
|
-
// Testing pages
|
|
47
|
-
const TestingDashboard = lazy(() => import('../../pages/admin/TestingDashboard'))
|
|
48
|
-
const TestRunDetailPage = lazy(() => import('../../pages/admin/TestRunDetailPage').then(m => ({ default: m.TestRunDetailPage })))
|
|
49
|
-
const ShadcnTestPage = lazy(() => import('../../pages/admin/ShadcnTestPage').then(m => ({ default: m.ShadcnTestPage })))
|
|
50
|
-
const MinimalShadcnTestPage = lazy(() => import('../../pages/admin/MinimalShadcnTestPage').then(m => ({ default: m.MinimalShadcnTestPage })))
|
|
51
|
-
const IncrementalShadcnTestPage = lazy(() => import('../../pages/admin/IncrementalShadcnTestPage').then(m => ({ default: m.IncrementalShadcnTestPage })))
|
|
52
|
-
const ExtendedShadcnTestPage = lazy(() => import('../../pages/admin/ExtendedShadcnTestPage').then(m => ({ default: m.ExtendedShadcnTestPage })))
|
|
53
|
-
const SelectTestPage = lazy(() => import('../../pages/admin/SelectTestPage').then(m => ({ default: m.SelectTestPage })))
|
|
54
|
-
const DesignedPage = lazy(() => import('../../pages/admin/DesignedPage').then(m => ({ default: m.DesignedPage })))
|
|
55
|
-
const ProperlyDesignedPage = lazy(() => import('../../pages/admin/ProperlyDesignedPage').then(m => ({ default: m.ProperlyDesignedPage })))
|
|
56
|
-
const IntegratedDashboard = lazy(() => import('../../pages/admin/IntegratedDashboard').then(m => ({ default: m.IntegratedDashboard })))
|
|
57
|
-
const SimpleDashboard = lazy(() => import('../../pages/admin/SimpleDashboard').then(m => ({ default: m.SimpleDashboard })))
|
|
58
|
-
|
|
59
|
-
function AdminRoutes() {
|
|
60
|
-
const location = useLocation()
|
|
61
|
-
|
|
62
|
-
// Build breadcrumbs from current path
|
|
63
|
-
const pathSegments = location.pathname.split('/').filter(Boolean)
|
|
64
|
-
const breadcrumbs: { title: string; url?: string }[] = [{ title: 'Spine', url: '/dashboard' }]
|
|
65
|
-
|
|
66
|
-
// Add admin section
|
|
67
|
-
if (pathSegments.includes('admin')) {
|
|
68
|
-
breadcrumbs.push({ title: 'Admin', url: '/spine-framework/admin' })
|
|
69
|
-
|
|
70
|
-
// Add subsection
|
|
71
|
-
const section = pathSegments[2]
|
|
72
|
-
if (section) {
|
|
73
|
-
breadcrumbs.push({ title: section.charAt(0).toUpperCase() + section.slice(1) })
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
<AppShell
|
|
79
|
-
sidebar={<AdminSidebar />}
|
|
80
|
-
breadcrumbs={breadcrumbs}
|
|
81
|
-
>
|
|
82
|
-
<Suspense fallback={<div className="min-h-[400px] flex items-center justify-center"><LoadingSpinner /></div>}>
|
|
83
|
-
<Routes>
|
|
84
|
-
{/* Default redirect → configs */}
|
|
85
|
-
<Route index element={<Navigate to="configs/types" replace />} />
|
|
86
|
-
<Route path="dashboard" element={<Navigate to="configs/types" replace />} />
|
|
87
|
-
|
|
88
|
-
{/* Configs section */}
|
|
89
|
-
<Route path="configs/types/new" element={<TypeDetailPage />} />
|
|
90
|
-
<Route path="configs/types/:id" element={<TypeDetailPage />} />
|
|
91
|
-
<Route path="configs/types" element={<TypesPage />} />
|
|
92
|
-
<Route path="configs/apps/new" element={<AppDetailPage />} />
|
|
93
|
-
<Route path="configs/apps/:id" element={<AppDetailPage />} />
|
|
94
|
-
<Route path="configs/apps" element={<AppsPage />} />
|
|
95
|
-
<Route path="configs/pipelines/new" element={<PipelineDetailPage />} />
|
|
96
|
-
<Route path="configs/pipelines/:id" element={<PipelineDetailPage />} />
|
|
97
|
-
<Route path="configs/pipelines" element={<PipelinesPage />} />
|
|
98
|
-
<Route path="configs/triggers/new" element={<TriggerDetailPage />} />
|
|
99
|
-
<Route path="configs/triggers/:id" element={<TriggerDetailPage />} />
|
|
100
|
-
<Route path="configs/triggers" element={<TriggersPage />} />
|
|
101
|
-
<Route path="configs/ai-agents/new" element={<AIAgentDetailPage />} />
|
|
102
|
-
<Route path="configs/ai-agents/:id" element={<AIAgentDetailPage />} />
|
|
103
|
-
<Route path="configs/ai-agents" element={<AIAgentsPage />} />
|
|
104
|
-
<Route path="configs/embeddings/new" element={<EmbeddingDetailPage />} />
|
|
105
|
-
<Route path="configs/embeddings/:id" element={<EmbeddingDetailPage />} />
|
|
106
|
-
<Route path="configs/embeddings" element={<EmbeddingsPage />} />
|
|
107
|
-
<Route path="configs/timers/new" element={<TimerDetailPage />} />
|
|
108
|
-
<Route path="configs/timers/:id" element={<TimerDetailPage />} />
|
|
109
|
-
<Route path="configs/timers" element={<TimersPage />} />
|
|
110
|
-
<Route path="configs/integrations/new" element={<IntegrationDetailPage />} />
|
|
111
|
-
<Route path="configs/integrations/:id" element={<IntegrationDetailPage />} />
|
|
112
|
-
<Route path="configs/integrations" element={<IntegrationsPage />} />
|
|
113
|
-
<Route path="configs/roles/new" element={<RoleDetailPage />} />
|
|
114
|
-
<Route path="configs/roles/:id" element={<RoleDetailPage />} />
|
|
115
|
-
<Route path="configs/roles" element={<RolesPage />} />
|
|
116
|
-
<Route path="configs/prompts/new" element={<PromptConfigDetailPage />} />
|
|
117
|
-
<Route path="configs/prompts/:id" element={<PromptConfigDetailPage />} />
|
|
118
|
-
<Route path="configs/prompts" element={<PromptConfigsPage />} />
|
|
119
|
-
<Route path="configs/api-keys/new" element={<APIKeyDetailPage />} />
|
|
120
|
-
<Route path="configs/api-keys/:id" element={<APIKeyDetailPage />} />
|
|
121
|
-
<Route path="configs/api-keys" element={<APIKeysPage />} />
|
|
122
|
-
|
|
123
|
-
{/* Observability section */}
|
|
124
|
-
<Route path="observability" element={<ObservabilityDashboard />} />
|
|
125
|
-
<Route path="observability/dashboard" element={<ObservabilityDashboard />} />
|
|
126
|
-
<Route path="observability/alerts" element={<AlertsConfigPage />} />
|
|
127
|
-
<Route path="observability/executions/:id" element={<PipelineExecutionsPage />} />
|
|
128
|
-
<Route path="observability/executions" element={<PipelineExecutionsPage />} />
|
|
129
|
-
<Route path="observability/logs" element={<LogsPage />} />
|
|
130
|
-
|
|
131
|
-
{/* Testing section */}
|
|
132
|
-
<Route path="testing/:run_id" element={<TestRunDetailPage />} />
|
|
133
|
-
<Route path="testing" element={<TestingDashboard />} />
|
|
134
|
-
<Route path="test/ui" element={<ShadcnTestPage />} />
|
|
135
|
-
<Route path="test/minimal" element={<MinimalShadcnTestPage />} />
|
|
136
|
-
<Route path="test/incremental" element={<IncrementalShadcnTestPage />} />
|
|
137
|
-
<Route path="test/extended" element={<ExtendedShadcnTestPage />} />
|
|
138
|
-
<Route path="test/select" element={<SelectTestPage />} />
|
|
139
|
-
<Route path="test/designed" element={<DesignedPage />} />
|
|
140
|
-
<Route path="test/properly-designed" element={<ProperlyDesignedPage />} />
|
|
141
|
-
<Route path="test/integrated" element={<IntegratedDashboard />} />
|
|
142
|
-
<Route path="test/simple" element={<SimpleDashboard />} />
|
|
143
|
-
|
|
144
|
-
{/* Runtime Data - Unified entity management */}
|
|
145
|
-
<Route path="runtime/:entity" element={<DataListPage />} />
|
|
146
|
-
<Route path="runtime/:entity/new" element={<DataDetailPage />} />
|
|
147
|
-
<Route path="runtime/:entity/:id" element={<DataDetailPage />} />
|
|
148
|
-
|
|
149
|
-
{/* Legacy data routes - redirect to runtime routes */}
|
|
150
|
-
<Route path="data/:entity" element={<Navigate to="../runtime/:entity" replace />} />
|
|
151
|
-
<Route path="data/:entity/create" element={<Navigate to="../runtime/:entity/new" replace />} />
|
|
152
|
-
<Route path="data/:entity/:id" element={<Navigate to="../runtime/:entity/:id" replace />} />
|
|
153
|
-
|
|
154
|
-
<Route path="*" element={<NotFoundPage />} />
|
|
155
|
-
</Routes>
|
|
156
|
-
</Suspense>
|
|
157
|
-
</AppShell>
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export default function AdminApp() {
|
|
162
|
-
const { user } = useAuth()
|
|
163
|
-
|
|
164
|
-
if (!user?.is_system_admin) {
|
|
165
|
-
return <Navigate to="/dashboard" replace />
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return (
|
|
169
|
-
<TooltipProvider>
|
|
170
|
-
<AdminRoutes />
|
|
171
|
-
</TooltipProvider>
|
|
172
|
-
)
|
|
173
|
-
}
|