spine-framework 0.3.145 → 0.4.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/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5051 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- 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/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// CIL[
|
|
6
|
-
// CIL[DOC-
|
|
7
|
-
// CIL[DOC-
|
|
8
|
-
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
9
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
-
// CIL[DOC-MICRO logic_summary="Imports schema hook, entity list hook, and runtime UI components" notable_decisions="[]"]
|
|
11
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Imports and module setup for the generic list page"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide dependencies for GenericListPage rendering"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports hooks and UI subcomponents used by the list page" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
12
8
|
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
-
// CIL[DOC-AUDIENCE audience="
|
|
14
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
15
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework"]
|
|
20
10
|
import { useListSchema } from '../../hooks/useListSchema'
|
|
21
11
|
import { useEntityList } from '../../hooks/useEntityList'
|
|
22
12
|
import { DataHeader } from '../runtime/DataHeader'
|
|
@@ -24,54 +14,54 @@ import { DataStats } from '../runtime/DataStats'
|
|
|
24
14
|
import { DataFilters } from '../runtime/DataFilters'
|
|
25
15
|
import { DataTable } from '../runtime/DataTable'
|
|
26
16
|
import { PageInstructions } from '../admin/PageInstructions'
|
|
27
|
-
// CIL[
|
|
28
|
-
// CIL[
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-
|
|
31
|
-
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
32
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
33
|
-
// CIL[DOC-MICRO logic_summary="Interface with type slug, view configuration, and routing paths" notable_decisions="[]"]
|
|
34
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
35
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
36
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
37
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
38
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
39
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
17
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Imports and module setup for the generic list page'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
|
|
18
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
19
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
20
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
40
21
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
41
22
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
23
|
+
// CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:module_header:module_header"]
|
|
24
|
+
|
|
25
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpageprops:interface" type="interface" identity="genericlistpageprops" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
|
|
26
|
+
// CIL[DOC-MACRO purpose="Props interface for GenericListPage"]
|
|
27
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define the expected props for the list page"]
|
|
28
|
+
// CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/app-shell/GenericListPage.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="TypeScript interface describing typeSlug, viewSlug, appPrefix, and detailPath" notable_decisions="[]"]
|
|
31
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
32
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
42
33
|
interface GenericListPageProps {
|
|
43
34
|
typeSlug: string
|
|
44
35
|
viewSlug?: string
|
|
45
36
|
appPrefix: string
|
|
46
37
|
detailPath: string
|
|
47
38
|
}
|
|
48
|
-
// CIL[
|
|
49
|
-
// CIL[
|
|
50
|
-
// CIL[DOC-
|
|
51
|
-
// CIL[DOC-
|
|
52
|
-
// CIL[DOC-MACRO purpose="Schema-driven list page with data table and filters"]
|
|
53
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Render list view based on type schema and view configuration"]
|
|
54
|
-
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
55
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="JSX list page with data table" errors="Schema loading errors" side_effects="Data fetching, renders UI components"]
|
|
56
|
-
// CIL[DOC-MICRO logic_summary="Resolves schema and view, builds config, fetches data, renders runtime components" notable_decisions="[]"]
|
|
57
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
58
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
59
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
60
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
61
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
62
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Props interface for GenericListPage'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
|
|
40
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
41
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
42
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
63
43
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
44
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
45
|
+
// CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpageprops:interface"]
|
|
46
|
+
|
|
47
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpage:function" type="function" identity="genericlistpage" parent="~/.framework/src/components/app-shell/GenericListPage.tsx"]
|
|
48
|
+
// CIL[DOC-MACRO purpose="Render the generic list page for an app type"]
|
|
49
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Display a sortable, filterable data table with schema-driven headers, stats, filters, and instructions"]
|
|
50
|
+
// CIL[DOC-CONTEXT module="app-shell" layer="framework" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/app-shell/GenericListPage.tsx,.framework/src/components/runtime/DataFilters.tsx,.framework/src/components/runtime/DataHeader.tsx,.framework/src/components/runtime/DataStats.tsx,.framework/src/components/runtime/DataTable.tsx,.framework/src/hooks/useEntityList.ts,.framework/src/hooks/useListSchema.ts"]
|
|
51
|
+
// CIL[DOC-CONTRACT inputs="typeSlug: string, viewSlug?: string, appPrefix: string, detailPath: string" outputs="JSX.Element" errors="none" side_effects="none"]
|
|
52
|
+
// CIL[DOC-MICRO logic_summary="Resolve the list schema, build a config, load entity data, and render the list page with header, instructions, stats, filters, and table" notable_decisions="[]"]
|
|
53
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
54
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
65
55
|
export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: GenericListPageProps) {
|
|
66
56
|
const resolvedViewSlug = viewSlug || 'default_list'
|
|
67
57
|
|
|
68
|
-
|
|
58
|
+
|
|
69
59
|
const { schema, view, loading: schemaLoading, error: schemaError } = useListSchema({
|
|
70
60
|
entity: 'items',
|
|
71
61
|
viewSlug: resolvedViewSlug
|
|
72
62
|
})
|
|
73
63
|
|
|
74
|
-
|
|
64
|
+
|
|
75
65
|
const config = view && schema ? {
|
|
76
66
|
entity: 'items',
|
|
77
67
|
typeSlug,
|
|
@@ -180,4 +170,10 @@ export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: G
|
|
|
180
170
|
</div>
|
|
181
171
|
)
|
|
182
172
|
}
|
|
183
|
-
// CIL[
|
|
173
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Render the generic list page for an app type'; No verified external callers; imports: .framework/src/hooks/useListSchema.ts,.framework/src/hooks/useEntityList.ts,.framework/src/components/runtime/DataHeader.tsx"]
|
|
174
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
175
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
176
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
177
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
178
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
179
|
+
// CIL[END stable_id="~/.framework/src/components/app-shell/GenericListPage.tsx:genericlistpage:function"]
|
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// CIL[
|
|
6
|
-
// CIL[DOC-
|
|
7
|
-
// CIL[DOC-
|
|
8
|
-
// CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
9
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
-
// CIL[DOC-MICRO logic_summary="Imports React, UI components, and icons needed for sidebar" notable_decisions="[]"]
|
|
11
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/app-sidebar.tsx:file"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Provides a documentation navigation sidebar with collapsible sections and search integration"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Imports React, local sidebar primitives, the search form, and Lucide icons used by AppSidebar"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="local bindings for React, Sidebar primitives, SearchForm, and Lucide icons" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports React, sidebar UI components, search-form, and icons for the documentation sidebar." notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
12
8
|
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
-
// CIL[DOC-AUDIENCE audience="
|
|
14
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
15
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="UI component consumers, React developers, design system maintainers"]
|
|
20
10
|
import * as React from "react"
|
|
21
11
|
|
|
22
12
|
import { SearchForm } from "./search-form"
|
|
@@ -39,21 +29,21 @@ import {
|
|
|
39
29
|
SidebarRail,
|
|
40
30
|
} from "./ui/sidebar"
|
|
41
31
|
import { GalleryVerticalEndIcon, PlusIcon, MinusIcon } from "lucide-react"
|
|
42
|
-
// CIL[
|
|
43
|
-
// CIL[
|
|
44
|
-
// CIL[DOC-
|
|
45
|
-
// CIL[DOC-
|
|
46
|
-
// CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
47
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Navigation data object" errors="none" side_effects="none"]
|
|
48
|
-
// CIL[DOC-MICRO logic_summary="Static navigation tree with Getting Started, Build Your Application, API Reference, Architecture, and Community sections" notable_decisions="[]"]
|
|
49
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
50
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
51
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
52
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
53
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
54
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
32
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provides a documentation navigation sidebar with collapsible sections and search integration'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
33
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
34
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
35
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
55
36
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
56
37
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
38
|
+
// CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
|
|
39
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:data:constant" type="constant" identity="data" parent="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
|
|
40
|
+
// CIL[DOC-MACRO purpose="Defines the static navigation data for the documentation sidebar sections"]
|
|
41
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Holds the navMain array of documentation topics, URLs, and nested items"]
|
|
42
|
+
// CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/app-sidebar.tsx,.framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
43
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="data object with navMain navigation tree" errors="none" side_effects="none"]
|
|
44
|
+
// CIL[DOC-MICRO logic_summary="Constant object defining documentation navigation sections with titles, URLs, and nested items." notable_decisions="[]"]
|
|
45
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
46
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
57
47
|
const data = {
|
|
58
48
|
navMain: [
|
|
59
49
|
{
|
|
@@ -193,21 +183,22 @@ const data = {
|
|
|
193
183
|
},
|
|
194
184
|
],
|
|
195
185
|
}
|
|
196
|
-
|
|
197
|
-
// CIL[
|
|
198
|
-
// CIL[DOC-
|
|
199
|
-
// CIL[DOC-
|
|
200
|
-
// CIL[DOC-
|
|
201
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="JSX sidebar component" errors="none" side_effects="Renders navigation UI"]
|
|
202
|
-
// CIL[DOC-MICRO logic_summary="Maps navigation data to collapsible sidebar sections with icons and active states" notable_decisions="[]"]
|
|
203
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
204
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
205
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
206
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
207
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
208
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
186
|
+
|
|
187
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Defines the static navigation data for the documentation sidebar sections'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
188
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
189
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
190
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
209
191
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
210
192
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
193
|
+
// CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:data:constant"]
|
|
194
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/app-sidebar.tsx:appsidebar:function" type="function" identity="AppSidebar" parent="~/.framework/src/components/app-sidebar.tsx:module_header:module_header"]
|
|
195
|
+
// CIL[DOC-MACRO purpose="Renders the application sidebar with a header, search, and collapsible navigation menu"]
|
|
196
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Displays the documentation navigation sidebar using the data constant and UI primitives"]
|
|
197
|
+
// CIL[DOC-CONTEXT module="app-sidebar.tsx" layer="components" related_files=".framework/src/components/app-sidebar.tsx,.framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
198
|
+
// CIL[DOC-CONTRACT inputs="props (React.ComponentProps<typeof Sidebar>)" outputs="JSX.Element" errors="none" side_effects="Renders sidebar DOM elements"]
|
|
199
|
+
// CIL[DOC-MICRO logic_summary="Renders a Sidebar with header, SearchForm, and collapsible nav groups driven by data.navMain." notable_decisions="[]"]
|
|
200
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
201
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
211
202
|
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
212
203
|
return (
|
|
213
204
|
<Sidebar {...props}>
|
|
@@ -272,4 +263,10 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
|
272
263
|
</Sidebar>
|
|
273
264
|
)
|
|
274
265
|
}
|
|
275
|
-
// CIL[
|
|
266
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Renders the application sidebar with a header, search, and collapsible navigation menu'; No verified external callers; imports: .framework/src/components/search-form.tsx,.framework/src/components/ui/collapsible.tsx,.framework/src/components/ui/sidebar.tsx"]
|
|
267
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
268
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
269
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
270
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
271
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
272
|
+
// CIL[END stable_id="~/.framework/src/components/app-sidebar.tsx:appsidebar:function"]
|
|
@@ -5,58 +5,59 @@
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// CIL[
|
|
11
|
-
// CIL[DOC-
|
|
12
|
-
// CIL[DOC-
|
|
13
|
-
// CIL[DOC-
|
|
14
|
-
// CIL[DOC-
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:module_header:module_header" type="module_header" identity="module_header" parent=""]
|
|
11
|
+
// CIL[DOC-MACRO purpose="Provide the module-level imports for the ProtectedRoute component"]
|
|
12
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import the React runtime, Navigate router utility, and the Auth context hook"]
|
|
13
|
+
// CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/contexts/AuthContext.tsx"]
|
|
14
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
15
|
+
// CIL[DOC-MICRO logic_summary="Imports React, Navigate from react-router-dom, and useAuth from the AuthContext for use by the ProtectedRoute function" notable_decisions="[]"]
|
|
16
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
15
17
|
// CIL[DOC-STABILITY stability="stable"]
|
|
16
|
-
// CIL[DOC-AUDIENCE audience="
|
|
17
|
-
|
|
18
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
19
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
20
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
21
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
22
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-AUDIENCE audience="developers"]
|
|
19
|
+
|
|
23
20
|
import React from 'react'
|
|
24
21
|
import { Navigate } from 'react-router-dom'
|
|
25
22
|
import { useAuth } from '../../contexts/AuthContext'
|
|
26
|
-
// CIL[
|
|
27
|
-
// CIL[
|
|
28
|
-
// CIL[DOC-
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
31
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
32
|
-
// CIL[DOC-MICRO logic_summary="Interface with optional system admin requirement flag" notable_decisions="[]"]
|
|
33
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
36
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
23
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the module-level imports for the ProtectedRoute component'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
|
|
24
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
25
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
26
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
39
27
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
28
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
29
|
+
// CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:module_header:module_header"]
|
|
30
|
+
|
|
31
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedrouteprops:interface" type="interface" identity="ProtectedRouteProps" parent="module_header"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="Define the props contract for the ProtectedRoute component"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Declare the typed shape of props accepted by the ProtectedRoute function"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/components/auth/ProtectedRoute.tsx,.framework/src/contexts/AuthContext.tsx"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="children React.ReactNode, requireSystemAdmin boolean" outputs="none" errors="none" side_effects="none"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Defines an interface with children of type React.ReactNode and an optional requireSystemAdmin boolean" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
|
+
|
|
41
40
|
interface ProtectedRouteProps {
|
|
42
41
|
children: React.ReactNode
|
|
43
42
|
requireSystemAdmin?: boolean
|
|
44
43
|
}
|
|
45
|
-
// CIL[
|
|
46
|
-
// CIL[
|
|
47
|
-
// CIL[DOC-
|
|
48
|
-
// CIL[DOC-
|
|
49
|
-
// CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
50
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Protected content or redirect/denial UI" errors="none" side_effects="Navigation redirects, renders access denied UI"]
|
|
51
|
-
// CIL[DOC-MICRO logic_summary="Checks user auth state and optional system_admin role, redirects to login or shows access denied" notable_decisions="[]"]
|
|
52
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
53
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
54
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
55
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
56
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
57
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
44
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the props contract for the ProtectedRoute component'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
|
|
45
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
46
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
47
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
58
48
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
59
49
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
50
|
+
// CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedrouteprops:interface"]
|
|
51
|
+
|
|
52
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedroute:function" type="function" identity="ProtectedRoute" parent="module_header"]
|
|
53
|
+
// CIL[DOC-MACRO purpose="Guard a React route by authentication and optional system-admin role"]
|
|
54
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render children when the user is authenticated and authorized, redirect anonymous users to login, and deny non-admin users when required"]
|
|
55
|
+
// CIL[DOC-CONTEXT module="components/auth" layer="presentation" related_files=".framework/src/components/auth/ProtectedRoute.tsx,.framework/src/contexts/AuthContext.tsx"]
|
|
56
|
+
// CIL[DOC-CONTRACT inputs="children React.ReactNode, requireSystemAdmin boolean" outputs="ReactElement | null" errors="none" side_effects="Navigates to /login via Navigate, and to /dashboard via window.location when denied"]
|
|
57
|
+
// CIL[DOC-MICRO logic_summary="Obtains user from useAuth; if user is missing redirects to /login; if requireSystemAdmin is true and user does not hold system_admin role renders an Access Denied view with a dashboard button; otherwise renders children" notable_decisions="[]"]
|
|
58
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
59
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
60
|
+
|
|
60
61
|
export function ProtectedRoute({ children, requireSystemAdmin = false }: ProtectedRouteProps) {
|
|
61
62
|
const { user } = useAuth()
|
|
62
63
|
|
|
@@ -93,4 +94,10 @@ export function ProtectedRoute({ children, requireSystemAdmin = false }: Protect
|
|
|
93
94
|
|
|
94
95
|
return <>{children}</>
|
|
95
96
|
}
|
|
96
|
-
// CIL[
|
|
97
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Guard a React route by authentication and optional system-admin role'; No verified external callers; imports: .framework/src/contexts/AuthContext.tsx"]
|
|
98
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
99
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
100
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
101
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
102
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
103
|
+
// CIL[END stable_id="~/.framework/src/components/auth/ProtectedRoute.tsx:protectedroute:function"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/components/auth/TurnstileWidget.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/components/auth/TurnstileWidget.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Optional Cloudflare Turnstile bot-protection widget for auth surfaces"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render a Turnstile challenge when VITE_TURNSTILE_SITE_KEY is configured; render nothing and stay inert otherwise"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="auth" layer="presentation" related_files=".framework/src/pages/auth/RegisterPage.tsx,.framework/src/pages/auth/LoginPage.tsx,.framework/src/pages/auth/ForgotPasswordPage.tsx,.framework/src/contexts/AuthContext.tsx"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="onToken: (token|null)=>void" outputs="JSX | null; token via callback" errors="onError/onExpire clear the token" side_effects="loads challenges.cloudflare.com script when rendered"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Site key comes from import.meta.env at build time; absent key returns null so packaged installs and local dev keep existing behavior" notable_decisions="One Turnstile site should cover both the prod domain and localhost so the same key works everywhere"]
|
|
7
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
8
|
+
// CIL[DOC-AUDIENCE audience="internal"]
|
|
9
|
+
|
|
10
|
+
import { Turnstile } from '@marsidev/react-turnstile'
|
|
11
|
+
|
|
12
|
+
const SITE_KEY = (import.meta.env.VITE_TURNSTILE_SITE_KEY as string | undefined) || ''
|
|
13
|
+
|
|
14
|
+
export const turnstileEnabled = !!SITE_KEY
|
|
15
|
+
|
|
16
|
+
export function TurnstileWidget({ onToken }: { onToken: (token: string | null) => void }) {
|
|
17
|
+
if (!SITE_KEY) return null
|
|
18
|
+
return (
|
|
19
|
+
<Turnstile
|
|
20
|
+
siteKey={SITE_KEY}
|
|
21
|
+
onSuccess={onToken}
|
|
22
|
+
onExpire={() => onToken(null)}
|
|
23
|
+
onError={() => onToken(null)}
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
// CIL[END stable_id="~/.framework/src/components/auth/TurnstileWidget.tsx:module_header:module_header"]
|