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,310 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:module_header:module_header" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Provide imports, mocks, and test helpers for the admin-data logger unit test"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Load dependencies, mock shared modules, and expose functions used by the test suite"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="admin-data-logger" layer="unit" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/logging.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported modules and vi mocks" errors="none" side_effects="mocks db and principal helpers"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports vitest utilities, mocks the shared db and principal modules, and pulls in the logging functions under test" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developers"]
|
|
10
|
+
|
|
11
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
12
|
+
|
|
13
|
+
vi.mock('../../functions/_shared/db.ts', () => ({
|
|
14
|
+
adminDb: {
|
|
15
|
+
from: vi.fn()
|
|
16
|
+
},
|
|
17
|
+
getUserDb: vi.fn()
|
|
18
|
+
}))
|
|
19
|
+
|
|
20
|
+
vi.mock('../../functions/_shared/principal.ts', () => ({
|
|
21
|
+
formatPrincipalForAudit: vi.fn((principal: any) => ({
|
|
22
|
+
id: principal?.id,
|
|
23
|
+
type: principal?.type
|
|
24
|
+
}))
|
|
25
|
+
}))
|
|
26
|
+
|
|
27
|
+
import { resolveLogLevels, withAdminLogging, logAdminDataOperation, __resetLoggingSettingsCache } from '../../functions/_shared/logging'
|
|
28
|
+
import { adminDb } from '../../functions/_shared/db'
|
|
29
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide imports, mocks, and test helpers for the admin-data logger unit test'; No verified external callers; imports: .framework/functions/_shared/logging.ts,.framework/functions/_shared/db.ts"]
|
|
30
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
31
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
32
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
33
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
34
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
35
|
+
// CIL[END stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:module_header:module_header"]
|
|
36
|
+
|
|
37
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:makeprincipal:function" type="function" identity="makePrincipal" parent="none"]
|
|
38
|
+
// CIL[DOC-MACRO purpose="Create a test principal object with sensible defaults and optional overrides"]
|
|
39
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide a reusable principal fixture for unit tests"]
|
|
40
|
+
// CIL[DOC-CONTEXT module="admin-data-logger" layer="unit" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/logging.ts,.framework/tests/unit/admin-data-logger.test.ts"]
|
|
41
|
+
// CIL[DOC-CONTRACT inputs="overrides: any" outputs="Principal object" errors="none" side_effects="none"]
|
|
42
|
+
// CIL[DOC-MICRO logic_summary="Returns a default principal and spreads any overrides" notable_decisions="[]"]
|
|
43
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
44
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
45
|
+
|
|
46
|
+
function makePrincipal(overrides: any = {}) {
|
|
47
|
+
return {
|
|
48
|
+
id: 'user-123',
|
|
49
|
+
type: 'human',
|
|
50
|
+
accountId: 'account-123',
|
|
51
|
+
provenance: {
|
|
52
|
+
sourceType: 'jwt',
|
|
53
|
+
createdBy: 'user-123',
|
|
54
|
+
invokedAt: new Date().toISOString()
|
|
55
|
+
},
|
|
56
|
+
...overrides
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Create a test principal object with sensible defaults and optional overrides'; No verified external callers; imports: .framework/functions/_shared/logging.ts,.framework/functions/_shared/db.ts"]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
61
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
62
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
63
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
65
|
+
// CIL[END stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:makeprincipal:function"]
|
|
66
|
+
|
|
67
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:makectx:function" type="function" identity="makeCtx" parent="none"]
|
|
68
|
+
// CIL[DOC-MACRO purpose="Build a test request context using a default principal and optional overrides"]
|
|
69
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Supply a standard RequestContext fixture for unit tests"]
|
|
70
|
+
// CIL[DOC-CONTEXT module="admin-data-logger" layer="unit" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/logging.ts,.framework/tests/unit/admin-data-logger.test.ts"]
|
|
71
|
+
// CIL[DOC-CONTRACT inputs="overrides: any" outputs="RequestContext object" errors="none" side_effects="none"]
|
|
72
|
+
// CIL[DOC-MICRO logic_summary="Constructs a context with request id, principal, account, db, and app id then applies overrides" notable_decisions="[]"]
|
|
73
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
74
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
75
|
+
|
|
76
|
+
function makeCtx(overrides: any = {}) {
|
|
77
|
+
return {
|
|
78
|
+
requestId: 'req-123',
|
|
79
|
+
principal: makePrincipal(),
|
|
80
|
+
accountId: 'account-123',
|
|
81
|
+
db: adminDb,
|
|
82
|
+
appId: 'app-123',
|
|
83
|
+
...overrides
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Build a test request context using a default principal and optional overrides'; No verified external callers; imports: .framework/functions/_shared/logging.ts,.framework/functions/_shared/db.ts"]
|
|
87
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
88
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
89
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
90
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
91
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
92
|
+
// CIL[END stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:makectx:function"]
|
|
93
|
+
|
|
94
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:mockdb:function" type="function" identity="mockDb" parent="none"]
|
|
95
|
+
// CIL[DOC-MACRO purpose="Mock Supabase client methods to simulate logging settings and log inserts"]
|
|
96
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Configure vi.fn mocks for adminDb.from so tests can control select and insert behavior"]
|
|
97
|
+
// CIL[DOC-CONTEXT module="admin-data-logger" layer="unit" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/logging.ts,.framework/tests/unit/admin-data-logger.test.ts"]
|
|
98
|
+
// CIL[DOC-CONTRACT inputs="settings: any[]" outputs="insertMock spy" errors="none" side_effects="mutates adminDb.from implementation"]
|
|
99
|
+
// CIL[DOC-MICRO logic_summary="Sets up mock implementations for system_settings and logs tables and returns the insert spy" notable_decisions="[]"]
|
|
100
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
101
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
102
|
+
|
|
103
|
+
function mockDb(settings: any[] = []) {
|
|
104
|
+
const insertMock = vi.fn(() => Promise.resolve({ data: { id: 'log-1' }, error: null }))
|
|
105
|
+
|
|
106
|
+
;(adminDb.from as any).mockImplementation((table: string) => {
|
|
107
|
+
if (table === 'system_settings') {
|
|
108
|
+
return {
|
|
109
|
+
select: vi.fn(() => ({
|
|
110
|
+
eq: vi.fn(() => Promise.resolve({ data: settings, error: null }))
|
|
111
|
+
}))
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (table === 'logs') {
|
|
116
|
+
return {
|
|
117
|
+
insert: insertMock
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
select: vi.fn(() => ({
|
|
123
|
+
eq: vi.fn(() => Promise.resolve({ data: null, error: null }))
|
|
124
|
+
}))
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
return { insertMock }
|
|
129
|
+
}
|
|
130
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Mock Supabase client methods to simulate logging settings and log inserts'; No verified external callers; imports: .framework/functions/_shared/logging.ts,.framework/functions/_shared/db.ts"]
|
|
131
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
132
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
133
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
134
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
135
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
136
|
+
// CIL[END stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:mockdb:function"]
|
|
137
|
+
|
|
138
|
+
// CIL[BEGIN stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:admin_data_logger_tests:function" type="function" identity="admin_data_logger_tests" parent="none"]
|
|
139
|
+
// CIL[DOC-MACRO purpose="Unit test suite for admin-data logging utilities"]
|
|
140
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify resolveLogLevels, logAdminDataOperation, and withAdminLogging under mocked database conditions"]
|
|
141
|
+
// CIL[DOC-CONTEXT module="admin-data-logger" layer="unit" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/logging.ts,.framework/tests/unit/admin-data-logger.test.ts"]
|
|
142
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="vitest assertions and mock expectations" errors="assertion failures" side_effects="reads and writes to mocked adminDb"]
|
|
143
|
+
// CIL[DOC-MICRO logic_summary="Groups tests for log level resolution, conditional inserts, timing and error logging, and wrapper behavior" notable_decisions="[]"]
|
|
144
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
145
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
146
|
+
|
|
147
|
+
describe('admin-data logger', () => {
|
|
148
|
+
beforeEach(() => {
|
|
149
|
+
vi.clearAllMocks()
|
|
150
|
+
__resetLoggingSettingsCache()
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
describe('resolveLogLevels', () => {
|
|
154
|
+
it('returns default timing and errors when no settings exist', async () => {
|
|
155
|
+
mockDb([])
|
|
156
|
+
const ctx = makeCtx()
|
|
157
|
+
const levels = await resolveLogLevels(ctx, { entity: 'items', action: 'list' })
|
|
158
|
+
expect(levels).toEqual(['timing', 'errors'])
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('uses global levels from system_settings', async () => {
|
|
162
|
+
mockDb([{ scope: 'global', scope_id: null, value: { levels: ['all'] } }])
|
|
163
|
+
const ctx = makeCtx()
|
|
164
|
+
const levels = await resolveLogLevels(ctx, { entity: 'items', action: 'list' })
|
|
165
|
+
expect(levels).toEqual(['all'])
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
it('header x-log-level wins over global config', async () => {
|
|
169
|
+
mockDb([{ scope: 'global', scope_id: null, value: { levels: ['timing'] } }])
|
|
170
|
+
const ctx = makeCtx({ logLevel: 'errors' })
|
|
171
|
+
const levels = await resolveLogLevels(ctx, { entity: 'items', action: 'list' })
|
|
172
|
+
expect(levels).toEqual(['errors'])
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
it('source override wins over global', async () => {
|
|
176
|
+
mockDb([
|
|
177
|
+
{ scope: 'global', scope_id: null, value: { levels: ['timing'] } },
|
|
178
|
+
{ scope: 'source', scope_id: 'synthetic-test', value: { levels: ['all'] } }
|
|
179
|
+
])
|
|
180
|
+
const ctx = makeCtx({ source: 'synthetic-test' })
|
|
181
|
+
const levels = await resolveLogLevels(ctx, { entity: 'items', action: 'list' })
|
|
182
|
+
expect(levels).toEqual(['all'])
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
it('entity tool override wins over global', async () => {
|
|
186
|
+
mockDb([
|
|
187
|
+
{ scope: 'global', scope_id: null, value: { levels: ['timing'] } },
|
|
188
|
+
{ scope: 'tool', scope_id: 'items', value: { levels: ['errors'] } }
|
|
189
|
+
])
|
|
190
|
+
const ctx = makeCtx()
|
|
191
|
+
const levels = await resolveLogLevels(ctx, { entity: 'items', action: 'list' })
|
|
192
|
+
expect(levels).toEqual(['errors'])
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
describe('logAdminDataOperation', () => {
|
|
197
|
+
it('skips logging for logs entity to avoid recursion', async () => {
|
|
198
|
+
const { insertMock } = mockDb()
|
|
199
|
+
const ctx = makeCtx()
|
|
200
|
+
await logAdminDataOperation(ctx, { entity: 'logs', action: 'create' })
|
|
201
|
+
expect(insertMock).not.toHaveBeenCalled()
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('writes a timing log for default levels', async () => {
|
|
205
|
+
const { insertMock } = mockDb([
|
|
206
|
+
{ scope: 'global', scope_id: null, value: { levels: ['timing', 'errors'] } }
|
|
207
|
+
])
|
|
208
|
+
const ctx = makeCtx()
|
|
209
|
+
await logAdminDataOperation(ctx, {
|
|
210
|
+
entity: 'items',
|
|
211
|
+
action: 'list',
|
|
212
|
+
durationMs: 12,
|
|
213
|
+
rowCount: 5
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
expect(insertMock).toHaveBeenCalledOnce()
|
|
217
|
+
const inserted = insertMock.mock.calls[0][0]
|
|
218
|
+
expect(inserted.source).toBe('admin-data')
|
|
219
|
+
expect(inserted.source_type).toBe('items')
|
|
220
|
+
expect(inserted.context.duration_ms).toBe(12)
|
|
221
|
+
expect(inserted.context.row_count).toBe(5)
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
it('writes an error log when an error is provided', async () => {
|
|
225
|
+
const { insertMock } = mockDb([
|
|
226
|
+
{ scope: 'global', scope_id: null, value: { levels: ['errors'] } }
|
|
227
|
+
])
|
|
228
|
+
const ctx = makeCtx()
|
|
229
|
+
await logAdminDataOperation(ctx, {
|
|
230
|
+
entity: 'items',
|
|
231
|
+
action: 'create',
|
|
232
|
+
error: new Error('db failed')
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
expect(insertMock).toHaveBeenCalledOnce()
|
|
236
|
+
const inserted = insertMock.mock.calls[0][0]
|
|
237
|
+
expect(inserted.level).toBe('error')
|
|
238
|
+
expect(inserted.message).toContain('failed')
|
|
239
|
+
expect(inserted.context.error_message).toBe('db failed')
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
it('does not write timing logs when only errors are enabled', async () => {
|
|
243
|
+
const { insertMock } = mockDb([
|
|
244
|
+
{ scope: 'global', scope_id: null, value: { levels: ['errors'] } }
|
|
245
|
+
])
|
|
246
|
+
const ctx = makeCtx()
|
|
247
|
+
await logAdminDataOperation(ctx, {
|
|
248
|
+
entity: 'items',
|
|
249
|
+
action: 'list',
|
|
250
|
+
durationMs: 12
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
expect(insertMock).not.toHaveBeenCalled()
|
|
254
|
+
})
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
describe('withAdminLogging', () => {
|
|
258
|
+
it('returns operation result and logs timing', async () => {
|
|
259
|
+
const { insertMock } = mockDb([
|
|
260
|
+
{ scope: 'global', scope_id: null, value: { levels: ['timing', 'errors'] } }
|
|
261
|
+
])
|
|
262
|
+
const ctx = makeCtx()
|
|
263
|
+
|
|
264
|
+
const result = await withAdminLogging(
|
|
265
|
+
ctx,
|
|
266
|
+
{ entity: 'items', action: 'create' },
|
|
267
|
+
async () => ({ id: 'item-1', title: 'Test' })
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
await new Promise(resolve => setTimeout(resolve, 0))
|
|
271
|
+
|
|
272
|
+
expect(result).toEqual({ id: 'item-1', title: 'Test' })
|
|
273
|
+
expect(insertMock).toHaveBeenCalledOnce()
|
|
274
|
+
const inserted = insertMock.mock.calls[0][0]
|
|
275
|
+
expect(inserted.source_id).toBe('item-1')
|
|
276
|
+
expect(inserted.metadata.record_id).toBe('item-1')
|
|
277
|
+
expect(inserted.message).toContain('admin-data create items')
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
it('logs errors and rethrows', async () => {
|
|
281
|
+
const { insertMock } = mockDb([
|
|
282
|
+
{ scope: 'global', scope_id: null, value: { levels: ['errors'] } }
|
|
283
|
+
])
|
|
284
|
+
const ctx = makeCtx()
|
|
285
|
+
|
|
286
|
+
await expect(
|
|
287
|
+
withAdminLogging(
|
|
288
|
+
ctx,
|
|
289
|
+
{ entity: 'items', action: 'create' },
|
|
290
|
+
async () => {
|
|
291
|
+
throw new Error('boom')
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
).rejects.toThrow('boom')
|
|
295
|
+
|
|
296
|
+
await new Promise(resolve => setTimeout(resolve, 0))
|
|
297
|
+
|
|
298
|
+
expect(insertMock).toHaveBeenCalledOnce()
|
|
299
|
+
const inserted = insertMock.mock.calls[0][0]
|
|
300
|
+
expect(inserted.level).toBe('error')
|
|
301
|
+
})
|
|
302
|
+
})
|
|
303
|
+
})
|
|
304
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Unit test suite for admin-data logging utilities'; No verified external callers; imports: .framework/functions/_shared/logging.ts,.framework/functions/_shared/db.ts"]
|
|
305
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
306
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
307
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
308
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
309
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
310
|
+
// CIL[END stable_id="~/.framework/tests/unit/admin-data-logger.test.ts:admin_data_logger_tests:function"]
|