spine-framework 0.3.145 → 0.4.1
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 +5067 -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,3 +1,12 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/api.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="API client for Spine: auth, account, and request tracing helpers."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide authenticated fetch utilities and session tracing for the framework."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/supabase.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="module imports" outputs="auth headers, account ID, trace IDs, wrapped fetch" errors="none" side_effects="registers unauthorized callback"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Exports helpers for Supabase auth, account scoping, and W3C trace context propagation." notable_decisions="Uses crypto.randomUUID for hex IDs; propagates traceparent on every request."]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework consumers and app developers"]
|
|
1
10
|
|
|
2
11
|
|
|
3
12
|
|
|
@@ -8,140 +17,141 @@
|
|
|
8
17
|
|
|
9
18
|
|
|
10
19
|
|
|
11
|
-
// CIL[BEGIN chunk_id="api_imports_1783716639" type="module_header" identity="imports" parent="none"]
|
|
12
|
-
// CIL[DOC-MACRO purpose="Import Supabase client for authentication"]
|
|
13
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Provide Supabase client dependency"]
|
|
14
|
-
// CIL[DOC-CONTEXT module="api" layer="utility" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
15
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="supabase client" errors="none" side_effects="none"]
|
|
16
|
-
// CIL[DOC-MICRO logic_summary="Import statement for external dependency" notable_decisions="[]"]
|
|
17
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
18
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
19
|
-
// CIL[DOC-AUDIENCE audience="developer"]
|
|
20
|
-
// CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
21
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
22
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
23
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
24
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
25
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
26
20
|
import { supabase } from './supabase'
|
|
27
|
-
// CIL[
|
|
28
|
-
// CIL[
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-
|
|
31
|
-
// CIL[DOC-CONTEXT module="api" layer="state" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
32
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="account ID storage" errors="none" side_effects="state_modification"]
|
|
33
|
-
// CIL[DOC-MICRO logic_summary="Module-level variable for account context" 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: state. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.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."]
|
|
21
|
+
// CIL[DOC-VECTOR type="context" content="purpose='API client for Spine: auth, account, and request tracing helpers.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
22
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
23
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
24
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
40
25
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
41
26
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// CIL[BEGIN
|
|
45
|
-
// CIL[DOC-MACRO purpose="
|
|
46
|
-
// CIL[DOC-RESPONSIBILITY responsibility="
|
|
47
|
-
// CIL[DOC-CONTEXT module="api" layer="
|
|
48
|
-
// CIL[DOC-CONTRACT inputs="
|
|
49
|
-
// CIL[DOC-MICRO logic_summary="
|
|
50
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.
|
|
27
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:module_header:module_header"]
|
|
28
|
+
|
|
29
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_accountid:constant" type="constant" identity="_accountid" parent="~/.framework/src/lib/api.ts"]
|
|
30
|
+
// CIL[DOC-MACRO purpose="Holds the currently selected account ID in memory."]
|
|
31
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Store mutable account ID state for authenticated requests."]
|
|
32
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
33
|
+
// CIL[DOC-CONTRACT inputs="set by setAccountId" outputs="read by getAuthHeaders and getAccountId" errors="none" side_effects="module-scoped mutable state"]
|
|
34
|
+
// CIL[DOC-MICRO logic_summary="Module-level nullable string storing the active account ID." notable_decisions="Null default; no persistence."]
|
|
35
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
51
36
|
// CIL[DOC-STABILITY stability="stable"]
|
|
52
|
-
|
|
53
|
-
// CIL[DOC-VECTOR type="
|
|
54
|
-
// CIL[DOC-VECTOR type="
|
|
55
|
-
// CIL[DOC-VECTOR type="
|
|
37
|
+
let _accountId: string | null = null
|
|
38
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Holds the currently selected account ID in memory.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
39
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
40
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
41
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
56
42
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
57
43
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
44
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:_accountid:constant"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:setAccountId:function" type="function" identity="setAccountId" parent="~/.framework/src/lib/api.ts"]
|
|
48
|
+
// CIL[DOC-MACRO purpose="Set the active account ID for subsequent API calls."]
|
|
49
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Update the in-memory account ID variable."]
|
|
50
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
51
|
+
// CIL[DOC-CONTRACT inputs="id: string | null" outputs="void" errors="none" side_effects="mutates _accountId"]
|
|
52
|
+
// CIL[DOC-MICRO logic_summary="Assigns the provided id to the _accountId module variable." notable_decisions="Accepts null to clear selection."]
|
|
53
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
54
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
58
55
|
export function setAccountId(id: string | null) {
|
|
59
56
|
_accountId = id
|
|
60
57
|
}
|
|
61
|
-
// CIL[
|
|
62
|
-
// CIL[
|
|
63
|
-
// CIL[DOC-
|
|
64
|
-
// CIL[DOC-
|
|
65
|
-
// CIL[DOC-CONTEXT module="api" layer="state" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
66
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="account_id: string|null" errors="none" side_effects="none"]
|
|
67
|
-
// CIL[DOC-MICRO logic_summary="Return account ID from module variable" notable_decisions="[]"]
|
|
68
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
69
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
70
|
-
// CIL[DOC-VECTOR type="context" content="Layer: state. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
71
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
72
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
73
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
58
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Set the active account ID for subsequent API calls.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
59
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
60
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
61
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
74
62
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
75
63
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:setAccountId:function"]
|
|
65
|
+
|
|
66
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getAccountId:function" type="function" identity="getAccountId" parent="~/.framework/src/lib/api.ts"]
|
|
67
|
+
// CIL[DOC-MACRO purpose="Return the currently selected account ID."]
|
|
68
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose the in-memory account ID value."]
|
|
69
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
70
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string | null" errors="none" side_effects="none"]
|
|
71
|
+
// CIL[DOC-MICRO logic_summary="Returns the current _accountId value." notable_decisions="Simple getter."]
|
|
72
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
73
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
76
74
|
export function getAccountId(): string | null {
|
|
77
75
|
return _accountId
|
|
78
76
|
}
|
|
79
|
-
// CIL[
|
|
80
|
-
// CIL[
|
|
81
|
-
// CIL[DOC-
|
|
82
|
-
// CIL[DOC-
|
|
83
|
-
// CIL[DOC-CONTEXT module="api" layer="config" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
84
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="auth paths array" errors="none" side_effects="none"]
|
|
85
|
-
// CIL[DOC-MICRO logic_summary="Constant array of auth endpoint paths" notable_decisions="[]"]
|
|
86
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
87
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
88
|
-
// CIL[DOC-VECTOR type="context" content="Layer: config. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
89
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
90
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
91
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
77
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Return the currently selected account ID.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
78
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
79
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
80
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
92
81
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
93
82
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// CIL[
|
|
98
|
-
// CIL[DOC-
|
|
99
|
-
// CIL[DOC-
|
|
100
|
-
// CIL[DOC-
|
|
101
|
-
// CIL[DOC-
|
|
102
|
-
// CIL[DOC-
|
|
83
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:getAccountId:function"]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:AUTH_PATHS:constant" type="constant" identity="AUTH_PATHS" parent="~/.framework/src/lib/api.ts"]
|
|
87
|
+
// CIL[DOC-MACRO purpose="List of auth-related API paths used to suppress unauthorized callbacks."]
|
|
88
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define paths that should not trigger the unauthorized callback on 401."]
|
|
89
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
90
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="readonly string array" errors="none" side_effects="none"]
|
|
91
|
+
// CIL[DOC-MICRO logic_summary="Constant array of auth/admin API path prefixes." notable_decisions="Frozen at module scope."]
|
|
92
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
103
93
|
// CIL[DOC-STABILITY stability="stable"]
|
|
104
|
-
|
|
105
|
-
// CIL[DOC-VECTOR type="
|
|
106
|
-
// CIL[DOC-VECTOR type="
|
|
107
|
-
// CIL[DOC-VECTOR type="
|
|
94
|
+
const AUTH_PATHS = ['/api/auth', '/api/admin-data']
|
|
95
|
+
// CIL[DOC-VECTOR type="context" content="purpose='List of auth-related API paths used to suppress unauthorized callbacks.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
96
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
97
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
98
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
108
99
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
109
100
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// CIL[
|
|
116
|
-
// CIL[DOC-
|
|
117
|
-
// CIL[DOC-
|
|
118
|
-
// CIL[DOC-
|
|
101
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:AUTH_PATHS:constant"]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_onunauthorizedcallback:constant" type="constant" identity="_onunauthorizedcallback" parent="~/.framework/src/lib/api.ts"]
|
|
107
|
+
// CIL[DOC-MACRO purpose="Holds the registered 401 callback for the app."]
|
|
108
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Store the callback invoked when a request returns 401."]
|
|
109
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
110
|
+
// CIL[DOC-CONTRACT inputs="set by onUnauthorized" outputs="invoked by apiFetch" errors="none" side_effects="module-scoped mutable state"]
|
|
111
|
+
// CIL[DOC-MICRO logic_summary="Module-level nullable callback for unauthorized request handling." notable_decisions="Single callback only."]
|
|
112
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
119
113
|
// CIL[DOC-STABILITY stability="stable"]
|
|
120
|
-
|
|
121
|
-
// CIL[DOC-VECTOR type="
|
|
122
|
-
// CIL[DOC-VECTOR type="
|
|
123
|
-
// CIL[DOC-VECTOR type="
|
|
114
|
+
let _onUnauthorizedCallback: (() => void) | null = null
|
|
115
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Holds the registered 401 callback for the app.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
116
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
117
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
118
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
124
119
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
125
120
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
121
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:_onunauthorizedcallback:constant"]
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:onUnauthorized:function" type="function" identity="onUnauthorized" parent="~/.framework/src/lib/api.ts"]
|
|
126
|
+
// CIL[DOC-MACRO purpose="Register a callback to run when a 401 response is received."]
|
|
127
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Manage the unauthorized callback subscription and cleanup."]
|
|
128
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
129
|
+
// CIL[DOC-CONTRACT inputs="cb: () => void" outputs="unsubscribe function" errors="none" side_effects="sets _onUnauthorizedCallback"]
|
|
130
|
+
// CIL[DOC-MICRO logic_summary="Assigns the provided callback and returns a cleanup function that clears it." notable_decisions="Only one callback can be registered at a time; cleanup returns callback to null."]
|
|
131
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
132
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
126
133
|
export function onUnauthorized(cb: () => void): () => void {
|
|
127
134
|
_onUnauthorizedCallback = cb
|
|
128
135
|
return () => { _onUnauthorizedCallback = null }
|
|
129
136
|
}
|
|
130
|
-
// CIL[
|
|
131
|
-
// CIL[
|
|
132
|
-
// CIL[DOC-
|
|
133
|
-
// CIL[DOC-
|
|
134
|
-
// CIL[DOC-CONTEXT module="api" layer="utility" related_files="[]"]
|
|
135
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Record<string,string>" errors="none" side_effects="none"]
|
|
136
|
-
// CIL[DOC-MICRO logic_summary="Handle Headers, array, and object formats" notable_decisions="[]"]
|
|
137
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
138
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
139
|
-
// CIL[DOC-VECTOR type="context" content="Layer: utility. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
140
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
141
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
142
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
137
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register a callback to run when a 401 response is received.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
138
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
139
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
140
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
143
141
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
144
142
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
143
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:onUnauthorized:function"]
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:normalizeHeaders:function" type="function" identity="normalizeHeaders" parent="~/.framework/src/lib/api.ts"]
|
|
148
|
+
// CIL[DOC-MACRO purpose="Normalize HeadersInit into a flat Record<string, string>."]
|
|
149
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Convert various header input forms into a consistent object."]
|
|
150
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
151
|
+
// CIL[DOC-CONTRACT inputs="headers?: HeadersInit" outputs="Record<string, string>" errors="none" side_effects="none"]
|
|
152
|
+
// CIL[DOC-MICRO logic_summary="Handles undefined, Headers object, array of pairs, and plain object by coercing all values to strings." notable_decisions="Lowercases keys are preserved as-is; values are String(value)-coerced."]
|
|
153
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
154
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
145
155
|
function normalizeHeaders(headers?: HeadersInit): Record<string, string> {
|
|
146
156
|
if (!headers) return {}
|
|
147
157
|
|
|
@@ -157,21 +167,22 @@ function normalizeHeaders(headers?: HeadersInit): Record<string, string> {
|
|
|
157
167
|
Object.entries(headers).map(([key, value]) => [key, String(value)])
|
|
158
168
|
)
|
|
159
169
|
}
|
|
160
|
-
// CIL[
|
|
161
|
-
// CIL[
|
|
162
|
-
// CIL[DOC-
|
|
163
|
-
// CIL[DOC-
|
|
164
|
-
// CIL[DOC-CONTEXT module="api" layer="auth" related_files="[]"]
|
|
165
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Record<string,string>" errors="supabase_errors" side_effects="none"]
|
|
166
|
-
// CIL[DOC-MICRO logic_summary="Get session token and add account ID to headers" notable_decisions="[]"]
|
|
167
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
168
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
169
|
-
// CIL[DOC-VECTOR type="context" content="Layer: auth. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
170
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
171
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
172
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
170
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Normalize HeadersInit into a flat Record<string, string>.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
171
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
172
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
173
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
173
174
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
174
175
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
176
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:normalizeHeaders:function"]
|
|
177
|
+
|
|
178
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getAuthHeaders:function" type="function" identity="getAuthHeaders" parent="~/.framework/src/lib/api.ts"]
|
|
179
|
+
// CIL[DOC-MACRO purpose="Build authorization headers from the current Supabase session and account."]
|
|
180
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Produce headers including bearer token and account ID when available."]
|
|
181
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
182
|
+
// CIL[DOC-CONTRACT inputs="none (uses supabase global and _accountId)" outputs="Promise<Record<string, string>>" errors="none" side_effects="calls supabase.auth.getSession()"]
|
|
183
|
+
// CIL[DOC-MICRO logic_summary="Retrieves the Supabase session, adds Authorization bearer token if present, and adds X-Account-Id if _accountId is set." notable_decisions="Returns empty headers when no session or account."]
|
|
184
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
185
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
175
186
|
export async function getAuthHeaders(): Promise<Record<string, string>> {
|
|
176
187
|
const headers: Record<string, string> = {}
|
|
177
188
|
|
|
@@ -188,43 +199,134 @@ export async function getAuthHeaders(): Promise<Record<string, string>> {
|
|
|
188
199
|
|
|
189
200
|
return headers
|
|
190
201
|
}
|
|
191
|
-
// CIL[
|
|
192
|
-
// CIL[
|
|
193
|
-
// CIL[DOC-
|
|
194
|
-
// CIL[DOC-
|
|
195
|
-
// CIL[DOC-CONTEXT module="api" layer="client" related_files="[]"]
|
|
196
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="Response" errors="network_errors" side_effects="callback_execution"]
|
|
197
|
-
// CIL[DOC-MICRO logic_summary="Add auth headers, clean invalid tokens, handle 401s" notable_decisions="[]"]
|
|
198
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
199
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
200
|
-
// CIL[DOC-VECTOR type="context" content="Layer: client. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
201
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
202
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
203
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
202
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Build authorization headers from the current Supabase session and account.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
203
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
204
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
205
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
204
206
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
205
207
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
208
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:getAuthHeaders:function"]
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_sessionTraceId:constant" type="constant" identity="_sessionTraceId" parent="~/.framework/src/lib/api.ts"]
|
|
213
|
+
// CIL[DOC-MACRO purpose="Caches the generated session trace ID for reuse."]
|
|
214
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the lazy-initialized session-level trace identifier."]
|
|
215
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
216
|
+
// CIL[DOC-CONTRACT inputs="initialized by getSessionTraceId" outputs="read by getSessionTraceId" errors="none" side_effects="module-scoped mutable state"]
|
|
217
|
+
// CIL[DOC-MICRO logic_summary="Nullable string caching the 32-character session trace ID." notable_decisions="Lazily initialized on first access."]
|
|
218
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
219
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
206
220
|
let _sessionTraceId: string | null = null
|
|
221
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Caches the generated session trace ID for reuse.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
222
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
223
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
224
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
225
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
226
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
227
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:_sessionTraceId:constant"]
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:_sessionTraceState:constant" type="constant" identity="_sessionTraceState" parent="~/.framework/src/lib/api.ts"]
|
|
234
|
+
// CIL[DOC-MACRO purpose="Stores the last tracestate header received from a response."]
|
|
235
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the latest server-provided tracestate value."]
|
|
236
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
237
|
+
// CIL[DOC-CONTRACT inputs="set by apiFetch on response" outputs="read by future apiFetch headers (not yet)" errors="none" side_effects="module-scoped mutable state"]
|
|
238
|
+
// CIL[DOC-MICRO logic_summary="String cache for the most recent response tracestate header." notable_decisions="Currently written but not read back into outgoing headers."]
|
|
239
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
240
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
207
241
|
let _sessionTraceState: string = ''
|
|
242
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Stores the last tracestate header received from a response.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
243
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
244
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
245
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
246
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
247
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
248
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:_sessionTraceState:constant"]
|
|
249
|
+
|
|
208
250
|
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:generateHexId:function" type="function" identity="generateHexId" parent="~/.framework/src/lib/api.ts"]
|
|
254
|
+
// CIL[DOC-MACRO purpose="Generate a random lowercase hex string of the requested length."]
|
|
255
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Produce cryptographic random hex IDs for trace context."]
|
|
256
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
257
|
+
// CIL[DOC-CONTRACT inputs="length: number" outputs="string" errors="none" side_effects="none (but uses crypto)"]
|
|
258
|
+
// CIL[DOC-MICRO logic_summary="Uses crypto.randomUUID, strips dashes, and concatenates or slices to the desired length." notable_decisions="Falls back to a second UUID if requested length exceeds 32."]
|
|
259
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
260
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
209
261
|
function generateHexId(length: number): string {
|
|
210
262
|
const uuid = crypto.randomUUID().replace(/-/g, '')
|
|
211
263
|
if (length > uuid.length) {
|
|
212
264
|
return (uuid + crypto.randomUUID().replace(/-/g, '')).slice(0, length).toLowerCase()
|
|
213
265
|
}
|
|
266
|
+
|
|
267
|
+
|
|
214
268
|
return uuid.slice(0, length).toLowerCase()
|
|
215
269
|
}
|
|
270
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Generate a random lowercase hex string of the requested length.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
271
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
272
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
273
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
274
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
275
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
276
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:generateHexId:function"]
|
|
216
277
|
|
|
278
|
+
|
|
279
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:getSessionTraceId:function" type="function" identity="getSessionTraceId" parent="~/.framework/src/lib/api.ts"]
|
|
280
|
+
// CIL[DOC-MACRO purpose="Return the cached session trace ID, generating it on first call."]
|
|
281
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Lazy-initialize and reuse the 32-character session trace ID."]
|
|
282
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
283
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="may set _sessionTraceId"]
|
|
284
|
+
// CIL[DOC-MICRO logic_summary="Checks _sessionTraceId and, if null, generates a 32-char hex ID and caches it." notable_decisions="Generates once per module session."]
|
|
285
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
286
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
217
287
|
function getSessionTraceId(): string {
|
|
218
288
|
if (!_sessionTraceId) {
|
|
219
289
|
_sessionTraceId = generateHexId(32)
|
|
220
290
|
}
|
|
221
291
|
return _sessionTraceId
|
|
222
292
|
}
|
|
293
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Return the cached session trace ID, generating it on first call.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
294
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
295
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
296
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
297
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
298
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
299
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:getSessionTraceId:function"]
|
|
223
300
|
|
|
301
|
+
|
|
302
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:buildTraceParent:function" type="function" identity="buildTraceParent" parent="~/.framework/src/lib/api.ts"]
|
|
303
|
+
// CIL[DOC-MACRO purpose="Build a W3C traceparent header value."]
|
|
304
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Compose a traceparent string from session and span IDs."]
|
|
305
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
306
|
+
// CIL[DOC-CONTRACT inputs="none (uses getSessionTraceId and generateHexId)" outputs="string" errors="none" side_effects="none"]
|
|
307
|
+
// CIL[DOC-MICRO logic_summary="Returns `00-{sessionTraceId}-{16-char span id}-01` in W3C traceparent format." notable_decisions="Fixed version 00 and sampled flag 01."]
|
|
308
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
309
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
224
310
|
function buildTraceParent(): string {
|
|
225
311
|
return `00-${getSessionTraceId()}-${generateHexId(16)}-01`
|
|
226
312
|
}
|
|
313
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Build a W3C traceparent header value.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
314
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
315
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
316
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
317
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
318
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
319
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:buildTraceParent:function"]
|
|
320
|
+
|
|
227
321
|
|
|
322
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/api.ts:apiFetch:function" type="function" identity="apiFetch" parent="~/.framework/src/lib/api.ts"]
|
|
323
|
+
// CIL[DOC-MACRO purpose="Make an authenticated HTTP request with traceparent and 401 handling."]
|
|
324
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Wrap fetch with auth headers, trace context, and unauthorized callback dispatch."]
|
|
325
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/lib/api.ts,.framework/src/lib/supabase.ts"]
|
|
326
|
+
// CIL[DOC-CONTRACT inputs="path: string, options: RequestInit = {}" outputs="Promise<Response>" errors="none explicit" side_effects="may invoke _onUnauthorizedCallback, mutates _sessionTraceState, logs request ID"]
|
|
327
|
+
// CIL[DOC-MICRO logic_summary="Builds auth and trace headers, merges user headers, calls fetch, logs request/trace IDs, updates tracestate, and triggers the unauthorized callback for non-auth 401s." notable_decisions="Cleans up Bearer null/undefined/empty from user headers; suppresses callback for AUTH_PATHS."]
|
|
328
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
329
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
228
330
|
export async function apiFetch(path: string, options: RequestInit = {}): Promise<Response> {
|
|
229
331
|
const authHeaders = await getAuthHeaders()
|
|
230
332
|
const optionHeaders = normalizeHeaders(options.headers)
|
|
@@ -240,12 +342,21 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
|
|
|
240
342
|
|
|
241
343
|
const traceparent = buildTraceParent()
|
|
242
344
|
|
|
345
|
+
// Best-effort app hint for server-side app-scoped behavior (knowledge
|
|
346
|
+
// envelope, logging). Derived from the route prefix; the server validates
|
|
347
|
+
// the slug against installed apps and the principal's required_roles.
|
|
348
|
+
const appSegment = typeof window !== 'undefined'
|
|
349
|
+
? (window.location.pathname.split('/')[1] || '')
|
|
350
|
+
: ''
|
|
351
|
+
const appHint = /^[a-z][a-z0-9-]*$/.test(appSegment) ? appSegment : null
|
|
352
|
+
|
|
243
353
|
const fetchOptions = {
|
|
244
354
|
...options,
|
|
245
355
|
headers: {
|
|
246
356
|
...authHeaders,
|
|
247
357
|
...optionHeaders,
|
|
248
358
|
traceparent,
|
|
359
|
+
...(appHint && !optionHeaders['x-app-id'] ? { 'x-app-id': appHint } : {}),
|
|
249
360
|
},
|
|
250
361
|
}
|
|
251
362
|
|
|
@@ -253,7 +364,14 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
|
|
|
253
364
|
|
|
254
365
|
const requestId = response.headers.get('X-Request-ID') || response.headers.get('x-request-id')
|
|
255
366
|
const responseTraceparent = response.headers.get('traceparent') || response.headers.get('Traceparent')
|
|
256
|
-
|
|
367
|
+
// Debug-only: per-request tracing noise is opt-in — every apiFetch call
|
|
368
|
+
// logs otherwise, which floods the console during polling-heavy views.
|
|
369
|
+
// Enable with localStorage.spine_debug_api = '1'.
|
|
370
|
+
if (
|
|
371
|
+
requestId &&
|
|
372
|
+
typeof localStorage !== 'undefined' &&
|
|
373
|
+
localStorage.getItem('spine_debug_api') === '1'
|
|
374
|
+
) {
|
|
257
375
|
console.log('[Spine] requestId:', requestId, 'traceparent:', responseTraceparent || traceparent)
|
|
258
376
|
}
|
|
259
377
|
|
|
@@ -269,4 +387,10 @@ export async function apiFetch(path: string, options: RequestInit = {}): Promise
|
|
|
269
387
|
|
|
270
388
|
return response
|
|
271
389
|
}
|
|
272
|
-
// CIL[
|
|
390
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Make an authenticated HTTP request with traceparent and 401 handling.'; No verified external callers; imports: .framework/src/lib/supabase.ts"]
|
|
391
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
392
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
393
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
394
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
395
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
396
|
+
// CIL[END stable_id="~/.framework/src/lib/api.ts:apiFetch:function"]
|