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
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/registration.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Client helpers for resumable registration completion"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Persist non-secret pending registration intent in sessionStorage and finalize registration through the authenticated invites API"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/pages/auth/RegisterPage.tsx,.framework/src/pages/auth/AuthConfirmPage.tsx"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="module imports" outputs="pending-intent storage helpers, RegistrationError, finalizeRegistration" errors="none" side_effects="reads/writes sessionStorage"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Exports spine.pending_registration sessionStorage helpers plus finalizeRegistration, which POSTs {app, path, account_name} to invites?action=complete-registration via apiFetch (Bearer session) and returns the server-truth {status, account_slug, role_slug}" notable_decisions="Never stores password or invite token; invite claim happens in the auth.users trigger at signUp, so invite intent only needs {invite:true}"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework developers"]
|
|
10
|
+
// CIL[DOC-NOTE type="contract" content="complete-registration is authenticated server-side (createHandler rejects anonymous). Email/role/account target are resolved from ctx.principal + installed app config — the client sends only app, path, account_name."]
|
|
11
|
+
|
|
12
|
+
import { apiFetch } from './api'
|
|
13
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:module_header:module_header"]
|
|
14
|
+
|
|
15
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:pendingregistrationintent:interface" type="interface" identity="PendingRegistrationIntent" parent="~/.framework/src/lib/registration.ts"]
|
|
16
|
+
// CIL[DOC-MACRO purpose="Describe the resumable registration intent persisted across email confirmation"]
|
|
17
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type for the non-secret pending registration payload stored in sessionStorage"]
|
|
18
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
19
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="PendingRegistrationIntent object" errors="none" side_effects="none"]
|
|
20
|
+
// CIL[DOC-MICRO logic_summary="{app, path, account_name, invite} — no password, email, or invite token" notable_decisions="path is optional because invite intents ({invite:true}) need no server call"]
|
|
21
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
22
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
23
|
+
export interface PendingRegistrationIntent {
|
|
24
|
+
app?: string
|
|
25
|
+
path?: 'new_account' | 'existing_account' | 'join_request'
|
|
26
|
+
account_name?: string
|
|
27
|
+
invite?: boolean
|
|
28
|
+
}
|
|
29
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:pendingregistrationintent:interface"]
|
|
30
|
+
|
|
31
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:pending_registration_key:constant" type="constant" identity="PENDING_REGISTRATION_KEY" parent="~/.framework/src/lib/registration.ts"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="sessionStorage key for the pending registration intent"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Single source for the 'spine.pending_registration' storage key"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string constant" errors="none" side_effects="none"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Constant string 'spine.pending_registration'" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
39
|
+
export const PENDING_REGISTRATION_KEY = 'spine.pending_registration'
|
|
40
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:pending_registration_key:constant"]
|
|
41
|
+
|
|
42
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:registrationerror:class" type="class" identity="RegistrationError" parent="~/.framework/src/lib/registration.ts"]
|
|
43
|
+
// CIL[DOC-MACRO purpose="Error type distinguishing definitive server rejections from transient network failures"]
|
|
44
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Carry a serverResponded flag so callers know whether a stored intent should be cleared (definitive) or kept for retry (transient)"]
|
|
45
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
46
|
+
// CIL[DOC-CONTRACT inputs="message, serverResponded" outputs="Error subclass" errors="none" side_effects="none"]
|
|
47
|
+
// CIL[DOC-MICRO logic_summary="Extends Error with a serverResponded boolean" notable_decisions="serverResponded=true whenever the invites API returned a response (error body or non-OK status); false only for fetch-level/network failures"]
|
|
48
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
49
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
50
|
+
export class RegistrationError extends Error {
|
|
51
|
+
serverResponded: boolean
|
|
52
|
+
constructor(message: string, serverResponded: boolean) {
|
|
53
|
+
super(message)
|
|
54
|
+
this.name = 'RegistrationError'
|
|
55
|
+
this.serverResponded = serverResponded
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:registrationerror:class"]
|
|
59
|
+
|
|
60
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:savependingregistration:function" type="function" identity="savePendingRegistration" parent="~/.framework/src/lib/registration.ts"]
|
|
61
|
+
// CIL[DOC-MACRO purpose="Persist the pending registration intent so a confirmation round-trip can resume it"]
|
|
62
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Write the intent JSON to sessionStorage under spine.pending_registration"]
|
|
63
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
64
|
+
// CIL[DOC-CONTRACT inputs="intent: PendingRegistrationIntent" outputs="void" errors="storage exceptions swallowed" side_effects="sessionStorage write"]
|
|
65
|
+
// CIL[DOC-MICRO logic_summary="JSON.stringify intent into sessionStorage, swallowing storage errors" notable_decisions="Must be called BEFORE complete-registration so a lost response can still resume"]
|
|
66
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
67
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
68
|
+
export function savePendingRegistration(intent: PendingRegistrationIntent): void {
|
|
69
|
+
try {
|
|
70
|
+
sessionStorage.setItem(PENDING_REGISTRATION_KEY, JSON.stringify(intent))
|
|
71
|
+
} catch {
|
|
72
|
+
// sessionStorage may be unavailable (private mode, SSR); resume simply won't fire
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:savependingregistration:function"]
|
|
76
|
+
|
|
77
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:readpendingregistration:function" type="function" identity="readPendingRegistration" parent="~/.framework/src/lib/registration.ts"]
|
|
78
|
+
// CIL[DOC-MACRO purpose="Read the persisted pending registration intent"]
|
|
79
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Parse and return the sessionStorage intent, or null when absent/corrupt"]
|
|
80
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
81
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="PendingRegistrationIntent | null" errors="parse/storage errors return null" side_effects="sessionStorage read"]
|
|
82
|
+
// CIL[DOC-MICRO logic_summary="JSON.parse the stored value; validates it is a plain object" notable_decisions="[]"]
|
|
83
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
84
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
85
|
+
export function readPendingRegistration(): PendingRegistrationIntent | null {
|
|
86
|
+
try {
|
|
87
|
+
const raw = sessionStorage.getItem(PENDING_REGISTRATION_KEY)
|
|
88
|
+
if (!raw) return null
|
|
89
|
+
const parsed = JSON.parse(raw)
|
|
90
|
+
if (!parsed || typeof parsed !== 'object') return null
|
|
91
|
+
return parsed as PendingRegistrationIntent
|
|
92
|
+
} catch {
|
|
93
|
+
return null
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:readpendingregistration:function"]
|
|
97
|
+
|
|
98
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:clearpendingregistration:function" type="function" identity="clearPendingRegistration" parent="~/.framework/src/lib/registration.ts"]
|
|
99
|
+
// CIL[DOC-MACRO purpose="Remove the persisted pending registration intent"]
|
|
100
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Delete spine.pending_registration from sessionStorage on success or definitive failure"]
|
|
101
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
102
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="void" errors="storage exceptions swallowed" side_effects="sessionStorage removeItem"]
|
|
103
|
+
// CIL[DOC-MICRO logic_summary="removeItem wrapped in try/catch" notable_decisions="[]"]
|
|
104
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
105
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
106
|
+
export function clearPendingRegistration(): void {
|
|
107
|
+
try {
|
|
108
|
+
sessionStorage.removeItem(PENDING_REGISTRATION_KEY)
|
|
109
|
+
} catch {
|
|
110
|
+
// ignore
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:clearpendingregistration:function"]
|
|
114
|
+
|
|
115
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:completeregistrationresult:interface" type="interface" identity="CompleteRegistrationResult" parent="~/.framework/src/lib/registration.ts"]
|
|
116
|
+
// CIL[DOC-MACRO purpose="Normalized result returned by the authenticated complete-registration endpoint"]
|
|
117
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type for {status, account_slug, role_slug} — server-truth placement and role"]
|
|
118
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/registration.ts"]
|
|
119
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="CompleteRegistrationResult object" errors="none" side_effects="none"]
|
|
120
|
+
// CIL[DOC-MICRO logic_summary="status 'active'|'pending'; role_slug is the server-assigned role (never trust the client guess)" notable_decisions="[]"]
|
|
121
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
122
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
123
|
+
export interface CompleteRegistrationResult {
|
|
124
|
+
status: 'active' | 'pending'
|
|
125
|
+
account_slug?: string
|
|
126
|
+
role_slug?: string
|
|
127
|
+
}
|
|
128
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:completeregistrationresult:interface"]
|
|
129
|
+
|
|
130
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/registration.ts:finalizeregistration:function" type="function" identity="finalizeRegistration" parent="~/.framework/src/lib/registration.ts"]
|
|
131
|
+
// CIL[DOC-MACRO purpose="Complete registration through the authenticated invites endpoint"]
|
|
132
|
+
// CIL[DOC-RESPONSIBILITY responsibility="POST {app, path, account_name} to invites?action=complete-registration via apiFetch and normalize the response"]
|
|
133
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/registration.ts"]
|
|
134
|
+
// CIL[DOC-CONTRACT inputs="intent: PendingRegistrationIntent (path required; invite intents rejected)" outputs="Promise<CompleteRegistrationResult>" errors="RegistrationError — serverResponded=true for {error} bodies and non-OK responses, false for network failures" side_effects="authenticated HTTP POST to /.netlify/functions/invites"]
|
|
135
|
+
// CIL[DOC-MICRO logic_summary="Sends only {app, path, account_name}; the server binds email/role/account from ctx.principal and installed app config" notable_decisions="Never forwards role_slug, email, target_account, or target_account_id — placement is server-resolved"]
|
|
136
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
137
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
138
|
+
export async function finalizeRegistration(
|
|
139
|
+
intent: PendingRegistrationIntent
|
|
140
|
+
): Promise<CompleteRegistrationResult> {
|
|
141
|
+
if (intent.invite || !intent.path) {
|
|
142
|
+
// Invite claims happen in the auth.users trigger at signUp time — there is
|
|
143
|
+
// nothing for complete-registration to do.
|
|
144
|
+
throw new RegistrationError('No registration action to complete for this intent', true)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let res: Response
|
|
148
|
+
try {
|
|
149
|
+
res = await apiFetch('/.netlify/functions/invites?action=complete-registration', {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: { 'Content-Type': 'application/json' },
|
|
152
|
+
body: JSON.stringify({
|
|
153
|
+
app: intent.app,
|
|
154
|
+
path: intent.path,
|
|
155
|
+
account_name: intent.account_name,
|
|
156
|
+
}),
|
|
157
|
+
})
|
|
158
|
+
} catch (err: any) {
|
|
159
|
+
throw new RegistrationError(err?.message || 'Network error completing registration', false)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const json = await res.json().catch(() => null)
|
|
163
|
+
|
|
164
|
+
if (json?.error) {
|
|
165
|
+
throw new RegistrationError(String(json.error), true)
|
|
166
|
+
}
|
|
167
|
+
if (!res.ok) {
|
|
168
|
+
throw new RegistrationError(
|
|
169
|
+
json?.message || `Registration failed (HTTP ${res.status})`,
|
|
170
|
+
true
|
|
171
|
+
)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const data = json?.data ?? json ?? {}
|
|
175
|
+
return {
|
|
176
|
+
status: data.status === 'pending' ? 'pending' : 'active',
|
|
177
|
+
account_slug: data.account_slug,
|
|
178
|
+
role_slug: data.role_slug,
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// CIL[END stable_id="~/.framework/src/lib/registration.ts:finalizeregistration:function"]
|
|
@@ -1,62 +1,88 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/supabase.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Module setup and imports for supabase.ts"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Establish the public surface and dependencies of supabase.ts"]
|
|
4
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports required modules for supabase.ts" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-AUDIENCE audience="framework"]
|
|
9
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
1
10
|
|
|
2
11
|
|
|
3
12
|
|
|
4
13
|
|
|
5
14
|
|
|
6
15
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// CIL[DOC-
|
|
10
|
-
// CIL[DOC-
|
|
11
|
-
// CIL[DOC-
|
|
12
|
-
// CIL[DOC-
|
|
13
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
14
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
15
|
-
// CIL[DOC-AUDIENCE audience="developer"]
|
|
16
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
17
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
18
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
19
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
|
|
17
|
+
import { createClient } from '@supabase/supabase-js'
|
|
18
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Module setup and imports for supabase.ts'; No verified external callers; imports: none"]
|
|
19
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
20
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
21
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
20
22
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
21
23
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
22
|
-
|
|
23
|
-
// CIL[
|
|
24
|
-
// CIL[
|
|
25
|
-
// CIL[DOC-
|
|
26
|
-
// CIL[DOC-
|
|
27
|
-
// CIL[DOC-
|
|
28
|
-
// CIL[DOC-
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
24
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:module_header:module_header"]
|
|
25
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabaseUrl:constant" type="constant" identity="supabaseUrl" parent="~/.framework/src/lib/supabase.ts"]
|
|
26
|
+
// CIL[DOC-MACRO purpose="Define the supabaseUrl constant"]
|
|
27
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose the supabaseUrl value to consumers"]
|
|
28
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string value from import.meta.env" errors="none" side_effects="none"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="Binds the expression to the supabaseUrl identifier" notable_decisions="[]"]
|
|
31
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
31
32
|
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
-
|
|
33
|
-
// CIL[DOC-VECTOR type="
|
|
34
|
-
// CIL[DOC-VECTOR type="
|
|
35
|
-
// CIL[DOC-VECTOR type="
|
|
33
|
+
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
|
|
34
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the supabaseUrl constant'; No verified external callers; imports: none"]
|
|
35
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
36
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
37
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
36
38
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
37
39
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
38
|
-
|
|
40
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabaseUrl:constant"]
|
|
41
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabaseAnonKey:constant" type="constant" identity="supabaseAnonKey" parent="~/.framework/src/lib/supabase.ts"]
|
|
42
|
+
// CIL[DOC-MACRO purpose="Define the supabaseAnonKey constant"]
|
|
43
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose the supabaseAnonKey value to consumers"]
|
|
44
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
45
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string value from import.meta.env" errors="none" side_effects="none"]
|
|
46
|
+
// CIL[DOC-MICRO logic_summary="Binds the expression to the supabaseAnonKey identifier" notable_decisions="[]"]
|
|
47
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
48
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
49
|
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY
|
|
50
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the supabaseAnonKey constant'; No verified external callers; imports: none"]
|
|
51
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
52
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
53
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
54
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
55
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
56
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabaseAnonKey:constant"]
|
|
40
57
|
|
|
58
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabase_env_check:variable" type="variable" identity="supabase_env_check" parent="~/.framework/src/lib/supabase.ts"]
|
|
59
|
+
// CIL[DOC-MACRO purpose="Runtime guard for supabase_env_check"]
|
|
60
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Ensure required conditions are met before execution"]
|
|
61
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
62
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="none" errors="throws Error if validation fails" side_effects="none"]
|
|
63
|
+
// CIL[DOC-MICRO logic_summary="Validates environment and throws if the guard fails" notable_decisions="[]"]
|
|
64
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
65
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
41
66
|
if (!supabaseUrl || !supabaseAnonKey) {
|
|
42
67
|
throw new Error('Missing Supabase environment variables')
|
|
43
68
|
}
|
|
44
|
-
// CIL[
|
|
45
|
-
// CIL[
|
|
46
|
-
// CIL[DOC-
|
|
47
|
-
// CIL[DOC-
|
|
48
|
-
// CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
49
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Supabase client instance" errors="none" side_effects="Reads localStorage"]
|
|
50
|
-
// CIL[DOC-MICRO logic_summary="Configures session persistence, auto-refresh, and a no-op auth lock to bypass navigator.locks" notable_decisions="[]"]
|
|
51
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
52
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
53
|
-
// CIL[DOC-NOTE type="caution" content="No-op lock bypasses navigator.locks to avoid NavigatorLockAcquireTimeoutError during login"]
|
|
54
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.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."]
|
|
69
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Runtime guard for supabase_env_check'; No verified external callers; imports: none"]
|
|
70
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
71
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
72
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
58
73
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
59
74
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
75
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabase_env_check:variable"]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:supabase:constant" type="constant" identity="supabase" parent="~/.framework/src/lib/supabase.ts"]
|
|
79
|
+
// CIL[DOC-MACRO purpose="Define the supabase constant"]
|
|
80
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose the supabase value to consumers"]
|
|
81
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
82
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="SupabaseClient instance" errors="none" side_effects="none"]
|
|
83
|
+
// CIL[DOC-MICRO logic_summary="Binds the expression to the supabase identifier" notable_decisions="[]"]
|
|
84
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
85
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
60
86
|
export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
|
|
61
87
|
auth: {
|
|
62
88
|
persistSession: true,
|
|
@@ -65,64 +91,75 @@ export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
|
|
|
65
91
|
lock: async <T>(_name: string, _acquireTimeout: number, fn: () => Promise<T>): Promise<T> => await fn(),
|
|
66
92
|
},
|
|
67
93
|
})
|
|
68
|
-
// CIL[
|
|
69
|
-
// CIL[
|
|
70
|
-
// CIL[DOC-
|
|
71
|
-
// CIL[DOC-
|
|
72
|
-
// CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
73
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Session object or null" errors="Supabase AuthError" side_effects="Reads localStorage"]
|
|
74
|
-
// CIL[DOC-MICRO logic_summary="Calls Supabase getSession and handles errors" notable_decisions="[]"]
|
|
75
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
76
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
77
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
78
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
79
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
80
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
94
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the supabase constant'; No verified external callers; imports: none"]
|
|
95
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
96
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
97
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
81
98
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
82
99
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
100
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:supabase:constant"]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:getCurrentSession:function" type="function" identity="getCurrentSession" parent="~/.framework/src/lib/supabase.ts"]
|
|
104
|
+
// CIL[DOC-MACRO purpose="Implement getCurrentSession"]
|
|
105
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for getCurrentSession"]
|
|
106
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
107
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
|
|
108
|
+
// CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for getCurrentSession" notable_decisions="[]"]
|
|
109
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
110
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
83
111
|
export const getCurrentSession = async () => {
|
|
84
112
|
const { data: { session }, error } = await supabase.auth.getSession()
|
|
85
113
|
if (error) throw error
|
|
86
114
|
return session
|
|
87
115
|
}
|
|
88
|
-
// CIL[
|
|
89
|
-
// CIL[
|
|
90
|
-
// CIL[DOC-
|
|
91
|
-
// CIL[DOC-
|
|
92
|
-
// CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
93
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="User object or null" errors="Supabase AuthError" side_effects="Reads localStorage"]
|
|
94
|
-
// CIL[DOC-MICRO logic_summary="Calls Supabase getUser and handles errors" notable_decisions="[]"]
|
|
95
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
96
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
97
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
98
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
99
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
100
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
116
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Implement getCurrentSession'; No verified external callers; imports: none"]
|
|
117
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
118
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
119
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
101
120
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
102
121
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
122
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:getCurrentSession:function"]
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:getCurrentUser:function" type="function" identity="getCurrentUser" parent="~/.framework/src/lib/supabase.ts"]
|
|
126
|
+
// CIL[DOC-MACRO purpose="Implement getCurrentUser"]
|
|
127
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for getCurrentUser"]
|
|
128
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
129
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
|
|
130
|
+
// CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for getCurrentUser" notable_decisions="[]"]
|
|
131
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
132
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
103
133
|
export const getCurrentUser = async () => {
|
|
104
134
|
const { data: { user }, error } = await supabase.auth.getUser()
|
|
105
135
|
if (error) throw error
|
|
106
136
|
return user
|
|
107
137
|
}
|
|
108
|
-
// CIL[
|
|
109
|
-
// CIL[
|
|
110
|
-
// CIL[DOC-
|
|
111
|
-
// CIL[DOC-
|
|
112
|
-
// CIL[DOC-CONTEXT module="supabase" layer="frontend-hook" related_files="[]"]
|
|
113
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Session data" errors="Supabase AuthError" side_effects="Updates localStorage"]
|
|
114
|
-
// CIL[DOC-MICRO logic_summary="Calls Supabase refreshSession and handles errors" notable_decisions="[]"]
|
|
115
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
116
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
117
|
-
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
118
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
119
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
120
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
138
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Implement getCurrentUser'; No verified external callers; imports: none"]
|
|
139
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
140
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
141
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
121
142
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
122
143
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
144
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:getCurrentUser:function"]
|
|
145
|
+
|
|
146
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/supabase.ts:refreshSession:function" type="function" identity="refreshSession" parent="~/.framework/src/lib/supabase.ts"]
|
|
147
|
+
// CIL[DOC-MACRO purpose="Implement refreshSession"]
|
|
148
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Execute the core logic for refreshSession"]
|
|
149
|
+
// CIL[DOC-CONTEXT module=".framework/src/lib/supabase.ts" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
150
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="result of the operation" errors="propagates dependency errors" side_effects="none"]
|
|
151
|
+
// CIL[DOC-MICRO logic_summary="Processes inputs, performs work, and returns output for refreshSession" notable_decisions="[]"]
|
|
152
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
153
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
123
154
|
export const refreshSession = async () => {
|
|
124
155
|
const { data, error } = await supabase.auth.refreshSession()
|
|
125
156
|
if (error) throw error
|
|
126
157
|
return data
|
|
127
158
|
}
|
|
128
|
-
// CIL[
|
|
159
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Implement refreshSession'; No verified external callers; imports: none"]
|
|
160
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
161
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
162
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
163
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
164
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
165
|
+
// CIL[END stable_id="~/.framework/src/lib/supabase.ts:refreshSession:function"]
|