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
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/observability.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="MCP tool registration module for observability logs and metrics"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Imports dependencies and exports the register function that wires observability MCP tools to an McpServer"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="McpServer instance via register" outputs="MCP tool handlers for volume, error rate, latency, pipeline, top actors, AI support, and logs" errors="Throws from adminDb RPC or query errors via throwDbError" side_effects="None at module load"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Sets up zod schemas and adminDb RPC calls for observability data" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework-maintainers"]
|
|
10
|
+
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
12
|
+
import { z } from 'zod'
|
|
13
|
+
import { adminDb } from '../shared/db.js'
|
|
14
|
+
import { resolveTypeId } from '../shared/db.js'
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MCP tool registration module for observability logs and metrics'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
16
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
17
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
18
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
19
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
21
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:module_header:module_header"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:mapLogRow:function" type="function" identity="mapLogRow" parent="~/.framework/mcp/tools/observability.ts"]
|
|
25
|
+
// CIL[DOC-MACRO purpose="Map a raw log database row to a normalized client-facing log object"]
|
|
26
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Transform database column names to the expected client log field names"]
|
|
27
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
28
|
+
// CIL[DOC-CONTRACT inputs="row: any database log row" outputs="normalized log object" errors="None" side_effects="None"]
|
|
29
|
+
// CIL[DOC-MICRO logic_summary="Returns an object mapping row columns to the names expected by consumers" notable_decisions="[]"]
|
|
30
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
31
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
+
function mapLogRow(row: any) {
|
|
33
|
+
return {
|
|
34
|
+
id: row.id,
|
|
35
|
+
event_type: row.level,
|
|
36
|
+
actor_id: row.person_id,
|
|
37
|
+
target_type: row.source_type,
|
|
38
|
+
target_id: row.source_id,
|
|
39
|
+
action: row.source,
|
|
40
|
+
span_name: row.span_name,
|
|
41
|
+
trace_id: row.trace_id,
|
|
42
|
+
span_id: row.span_id,
|
|
43
|
+
parent_span_id: row.parent_span_id,
|
|
44
|
+
duration_ms: row.duration_ms,
|
|
45
|
+
outcome: row.outcome,
|
|
46
|
+
event_category: row.event_category,
|
|
47
|
+
kind: row.kind,
|
|
48
|
+
message: row.message,
|
|
49
|
+
details: row.context,
|
|
50
|
+
metadata: row.metadata,
|
|
51
|
+
created_at: row.created_at,
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Map a raw log database row to a normalized client-facing log object'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
55
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
56
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
57
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
58
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
59
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
60
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:mapLogRow:function"]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:textResponse:function" type="function" identity="textResponse" parent="~/.framework/mcp/tools/observability.ts"]
|
|
64
|
+
// CIL[DOC-MACRO purpose="Wrap any value in an MCP text content response"]
|
|
65
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Format JSON-serialized payloads for MCP text tool responses"]
|
|
66
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
67
|
+
// CIL[DOC-CONTRACT inputs="obj: any" outputs="MCP content array with type text" errors="May throw if JSON.stringify receives circular input" side_effects="None"]
|
|
68
|
+
// CIL[DOC-MICRO logic_summary="Stringify object and return an MCP text content wrapper" notable_decisions="[]"]
|
|
69
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
70
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
71
|
+
function textResponse(obj: any) {
|
|
72
|
+
return {
|
|
73
|
+
content: [{
|
|
74
|
+
type: 'text' as const,
|
|
75
|
+
text: JSON.stringify(obj, null, 2),
|
|
76
|
+
}],
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Wrap any value in an MCP text content response'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
80
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
81
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
82
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
83
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
84
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
85
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:textResponse:function"]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:throwDbError:function" type="function" identity="throwDbError" parent="~/.framework/mcp/tools/observability.ts"]
|
|
89
|
+
// CIL[DOC-MACRO purpose="Convert an unknown error into a JavaScript Error with a readable message"]
|
|
90
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide uniform database error handling for tool handlers"]
|
|
91
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
92
|
+
// CIL[DOC-CONTRACT inputs="error: any" outputs="Throws Error" errors="Throws Error for any error input" side_effects="None"]
|
|
93
|
+
// CIL[DOC-MICRO logic_summary="Coerce error to string and throw" notable_decisions="[]"]
|
|
94
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
95
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
96
|
+
function throwDbError(error: any) {
|
|
97
|
+
const msg = error && typeof error === 'object'
|
|
98
|
+
? (error.message || JSON.stringify(error))
|
|
99
|
+
: String(error)
|
|
100
|
+
throw new Error(msg)
|
|
101
|
+
}
|
|
102
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Convert an unknown error into a JavaScript Error with a readable message'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
103
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
104
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
105
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
106
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
107
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
108
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:throwDbError:function"]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:defaultRange:function" type="function" identity="defaultRange" parent="~/.framework/mcp/tools/observability.ts"]
|
|
112
|
+
// CIL[DOC-MACRO purpose="Return a default 24-hour ISO date range ending at now"]
|
|
113
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide fallback from/to timestamps for time-bucketed metric queries"]
|
|
114
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
115
|
+
// CIL[DOC-CONTRACT inputs="None" outputs="{ from: ISO string, to: ISO string }" errors="None" side_effects="None"]
|
|
116
|
+
// CIL[DOC-MICRO logic_summary="Compute yesterday by subtracting 24 hours from now" notable_decisions="[]"]
|
|
117
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
118
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
119
|
+
function defaultRange() {
|
|
120
|
+
const now = new Date()
|
|
121
|
+
const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString()
|
|
122
|
+
return { from: yesterday, to: now.toISOString() }
|
|
123
|
+
}
|
|
124
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Return a default 24-hour ISO date range ending at now'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
125
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
126
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
127
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
128
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
129
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
130
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:defaultRange:function"]
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:bucketToGranularity:constant" type="constant" identity="bucketToGranularity" parent="~/.framework/mcp/tools/observability.ts"]
|
|
135
|
+
// CIL[DOC-MACRO purpose="Map friendly bucket names to SQL interval strings"]
|
|
136
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Translate hour/day/week inputs to PostgreSQL granularity literals"]
|
|
137
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
138
|
+
// CIL[DOC-CONTRACT inputs="bucket string key" outputs="PostgreSQL interval string" errors="None" side_effects="None"]
|
|
139
|
+
// CIL[DOC-MICRO logic_summary="Lookup Record<string,string> with default 1 hour" notable_decisions="[]"]
|
|
140
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
141
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
142
|
+
const bucketToGranularity: Record<string, string> = {
|
|
143
|
+
hour: '1 hour',
|
|
144
|
+
day: '1 day',
|
|
145
|
+
week: '1 week',
|
|
146
|
+
}
|
|
147
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Map friendly bucket names to SQL interval strings'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
148
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
149
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
150
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
151
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
152
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
153
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:bucketToGranularity:constant"]
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/observability.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/observability.ts"]
|
|
159
|
+
// CIL[DOC-MACRO purpose="Register all observability MCP tools on a server instance"]
|
|
160
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose metrics, logs, and AI support query tools to MCP clients"]
|
|
161
|
+
// CIL[DOC-CONTEXT module="observability" layer="mcp-tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/observability.ts"]
|
|
162
|
+
// CIL[DOC-CONTRACT inputs="server: McpServer" outputs="Registered tool handlers with zod input schemas" errors="Throws on database RPC or query errors" side_effects="Adds ten tool handlers to the McpServer"]
|
|
163
|
+
// CIL[DOC-MICRO logic_summary="Defines ten tools using zod and adminDb RPC or queries: event volume, error rate, latency percentiles, pipeline stats, top actors, AI support metrics, log search, log list, log for target, log stats" notable_decisions="['latency_percentiles returns avg_handler_duration because percentile RPCs are not yet available']"]
|
|
164
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
165
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
166
|
+
export function register(server: McpServer) {
|
|
167
|
+
server.registerTool(
|
|
168
|
+
'spine_observability_event_volume',
|
|
169
|
+
{
|
|
170
|
+
description: 'Get request count over time, bucketed by hour/day/week.',
|
|
171
|
+
inputSchema: z.object({
|
|
172
|
+
account_id: z.string().uuid(),
|
|
173
|
+
from: z.string().datetime().optional(),
|
|
174
|
+
to: z.string().datetime().optional(),
|
|
175
|
+
bucket: z.enum(['hour', 'day', 'week']).default('hour'),
|
|
176
|
+
}),
|
|
177
|
+
},
|
|
178
|
+
async ({ account_id, from, to, bucket }) => {
|
|
179
|
+
const range = defaultRange()
|
|
180
|
+
const { data, error } = await adminDb.rpc('get_metric_series', {
|
|
181
|
+
p_account_id: account_id,
|
|
182
|
+
p_metric_name: 'request_count',
|
|
183
|
+
p_granularity: bucketToGranularity[bucket] || '1 hour',
|
|
184
|
+
p_date_from: from || range.from,
|
|
185
|
+
p_date_to: to || range.to,
|
|
186
|
+
})
|
|
187
|
+
if (error) throwDbError(error)
|
|
188
|
+
return textResponse({ action: 'event_volume', data: data || [] })
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
server.registerTool(
|
|
193
|
+
'spine_observability_error_rate',
|
|
194
|
+
{
|
|
195
|
+
description: 'Get error rate over time for an account and date range.',
|
|
196
|
+
inputSchema: z.object({
|
|
197
|
+
account_id: z.string().uuid(),
|
|
198
|
+
from: z.string().datetime().optional(),
|
|
199
|
+
to: z.string().datetime().optional(),
|
|
200
|
+
bucket: z.enum(['hour', 'day', 'week']).default('hour'),
|
|
201
|
+
}),
|
|
202
|
+
},
|
|
203
|
+
async ({ account_id, from, to, bucket }) => {
|
|
204
|
+
const range = defaultRange()
|
|
205
|
+
const { data, error } = await adminDb.rpc('get_metric_series', {
|
|
206
|
+
p_account_id: account_id,
|
|
207
|
+
p_metric_name: 'error_rate',
|
|
208
|
+
p_granularity: bucketToGranularity[bucket] || '1 hour',
|
|
209
|
+
p_date_from: from || range.from,
|
|
210
|
+
p_date_to: to || range.to,
|
|
211
|
+
})
|
|
212
|
+
if (error) throwDbError(error)
|
|
213
|
+
return textResponse({ action: 'error_rate', data: data || [] })
|
|
214
|
+
}
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
server.registerTool(
|
|
218
|
+
'spine_observability_latency_percentiles',
|
|
219
|
+
{
|
|
220
|
+
description: 'Get handler latency (average duration_ms) over time. Percentile RPCs are not yet available; this returns the avg_handler_duration metric series.',
|
|
221
|
+
inputSchema: z.object({
|
|
222
|
+
account_id: z.string().uuid(),
|
|
223
|
+
from: z.string().datetime().optional(),
|
|
224
|
+
to: z.string().datetime().optional(),
|
|
225
|
+
bucket: z.enum(['hour', 'day', 'week']).default('hour'),
|
|
226
|
+
}),
|
|
227
|
+
},
|
|
228
|
+
async ({ account_id, from, to, bucket }) => {
|
|
229
|
+
const range = defaultRange()
|
|
230
|
+
const { data, error } = await adminDb.rpc('get_metric_series', {
|
|
231
|
+
p_account_id: account_id,
|
|
232
|
+
p_metric_name: 'avg_handler_duration',
|
|
233
|
+
p_granularity: bucketToGranularity[bucket] || '1 hour',
|
|
234
|
+
p_date_from: from || range.from,
|
|
235
|
+
p_date_to: to || range.to,
|
|
236
|
+
})
|
|
237
|
+
if (error) throwDbError(error)
|
|
238
|
+
return textResponse({ action: 'latency_percentiles', data: data || [] })
|
|
239
|
+
}
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
server.registerTool(
|
|
243
|
+
'spine_observability_pipeline_stats',
|
|
244
|
+
{
|
|
245
|
+
description: 'Get pipeline failure rate over time.',
|
|
246
|
+
inputSchema: z.object({
|
|
247
|
+
account_id: z.string().uuid(),
|
|
248
|
+
from: z.string().datetime().optional(),
|
|
249
|
+
to: z.string().datetime().optional(),
|
|
250
|
+
bucket: z.enum(['hour', 'day', 'week']).default('hour'),
|
|
251
|
+
}),
|
|
252
|
+
},
|
|
253
|
+
async ({ account_id, from, to, bucket }) => {
|
|
254
|
+
const range = defaultRange()
|
|
255
|
+
const { data, error } = await adminDb.rpc('get_metric_series', {
|
|
256
|
+
p_account_id: account_id,
|
|
257
|
+
p_metric_name: 'pipeline_failure_rate',
|
|
258
|
+
p_granularity: bucketToGranularity[bucket] || '1 hour',
|
|
259
|
+
p_date_from: from || range.from,
|
|
260
|
+
p_date_to: to || range.to,
|
|
261
|
+
})
|
|
262
|
+
if (error) throwDbError(error)
|
|
263
|
+
return textResponse({ action: 'pipeline_stats', data: data || [] })
|
|
264
|
+
}
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
server.registerTool(
|
|
268
|
+
'spine_observability_top_actors',
|
|
269
|
+
{
|
|
270
|
+
description: 'Get the top business outcomes by span_name/outcome count.',
|
|
271
|
+
inputSchema: z.object({
|
|
272
|
+
account_id: z.string().uuid(),
|
|
273
|
+
from: z.string().datetime().optional(),
|
|
274
|
+
to: z.string().datetime().optional(),
|
|
275
|
+
}),
|
|
276
|
+
},
|
|
277
|
+
async ({ account_id, from, to }) => {
|
|
278
|
+
const range = defaultRange()
|
|
279
|
+
const { data, error } = await adminDb.rpc('get_business_outcomes', {
|
|
280
|
+
p_account_id: account_id,
|
|
281
|
+
p_date_from: from || range.from,
|
|
282
|
+
p_date_to: to || range.to,
|
|
283
|
+
})
|
|
284
|
+
if (error) throwDbError(error)
|
|
285
|
+
return textResponse({ action: 'business_outcomes', data: data || [] })
|
|
286
|
+
}
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
server.registerTool(
|
|
290
|
+
'spine_observability_ai_support_metrics',
|
|
291
|
+
{
|
|
292
|
+
description: 'Get AI support metrics and knowledge gap analysis for an account.',
|
|
293
|
+
inputSchema: z.object({
|
|
294
|
+
account_id: z.string().uuid(),
|
|
295
|
+
from: z.string().datetime().optional(),
|
|
296
|
+
to: z.string().datetime().optional(),
|
|
297
|
+
}),
|
|
298
|
+
},
|
|
299
|
+
async ({ account_id, from, to }) => {
|
|
300
|
+
const now = new Date()
|
|
301
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString()
|
|
302
|
+
const fromDate = from || thirtyDaysAgo
|
|
303
|
+
const toDate = to || now.toISOString()
|
|
304
|
+
|
|
305
|
+
const feedbackTypeId = await resolveTypeId('item', 'ai_feedback_record')
|
|
306
|
+
|
|
307
|
+
const [feedbackResult, resolvedResult, escalatedResult] = await Promise.allSettled([
|
|
308
|
+
adminDb
|
|
309
|
+
.from('items')
|
|
310
|
+
.select('data')
|
|
311
|
+
.eq('account_id', account_id)
|
|
312
|
+
.eq('type_id', feedbackTypeId)
|
|
313
|
+
.gte('created_at', fromDate)
|
|
314
|
+
.lte('created_at', toDate)
|
|
315
|
+
.limit(5000),
|
|
316
|
+
adminDb
|
|
317
|
+
.from('items')
|
|
318
|
+
.select('id', { count: 'exact', head: true })
|
|
319
|
+
.eq('account_id', account_id)
|
|
320
|
+
.eq('status', 'resolved')
|
|
321
|
+
.eq('data->>aim_escalation_reason', 'none')
|
|
322
|
+
.gte('created_at', fromDate)
|
|
323
|
+
.lte('created_at', toDate),
|
|
324
|
+
adminDb
|
|
325
|
+
.from('items')
|
|
326
|
+
.select('id', { count: 'exact', head: true })
|
|
327
|
+
.eq('account_id', account_id)
|
|
328
|
+
.eq('status', 'human_assigned')
|
|
329
|
+
.gte('created_at', fromDate)
|
|
330
|
+
.lte('created_at', toDate),
|
|
331
|
+
])
|
|
332
|
+
|
|
333
|
+
const feedbackRows = feedbackResult.status === 'fulfilled' ? (feedbackResult.value.data || []) : []
|
|
334
|
+
const aiAttempted = feedbackRows.length
|
|
335
|
+
const notHelpful = feedbackRows.filter((r: any) => r.data?.customer_feedback === 'not_helpful').length
|
|
336
|
+
const kbCreated = feedbackRows.filter((r: any) => r.data?.kb_article_id).length
|
|
337
|
+
const kbReuseCount = feedbackRows.reduce((sum: number, r: any) => sum + (Number(r.data?.reuse_count) || 0), 0)
|
|
338
|
+
const knowledgeGaps = feedbackRows.filter(
|
|
339
|
+
(r: any) => r.data?.kb_candidate === false && r.data?.customer_feedback === 'not_helpful'
|
|
340
|
+
).length
|
|
341
|
+
const aiResolved = resolvedResult.status === 'fulfilled' ? (resolvedResult.value.count || 0) : 0
|
|
342
|
+
const escalated = escalatedResult.status === 'fulfilled' ? (escalatedResult.value.count || 0) : 0
|
|
343
|
+
const thumbsDownRate = aiAttempted > 0 ? notHelpful / aiAttempted : 0
|
|
344
|
+
|
|
345
|
+
return textResponse({
|
|
346
|
+
action: 'ai_support_metrics',
|
|
347
|
+
period: { from: fromDate, to: toDate },
|
|
348
|
+
ai_attempted: aiAttempted,
|
|
349
|
+
ai_resolved: aiResolved,
|
|
350
|
+
human_escalations: escalated,
|
|
351
|
+
thumbs_down_rate: Math.round(thumbsDownRate * 1000) / 1000,
|
|
352
|
+
kb_articles_created: kbCreated,
|
|
353
|
+
kb_reuse_count: kbReuseCount,
|
|
354
|
+
knowledge_gaps: knowledgeGaps,
|
|
355
|
+
})
|
|
356
|
+
}
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
server.registerTool(
|
|
360
|
+
'spine_logs_search',
|
|
361
|
+
{
|
|
362
|
+
description: 'Full-text search over log messages for an account.',
|
|
363
|
+
inputSchema: z.object({
|
|
364
|
+
account_id: z.string().uuid(),
|
|
365
|
+
query: z.string(),
|
|
366
|
+
event_type: z.string().optional(),
|
|
367
|
+
target_type: z.string().optional(),
|
|
368
|
+
limit: z.number().int().min(1).max(1000).default(50),
|
|
369
|
+
offset: z.number().int().min(0).default(0),
|
|
370
|
+
}),
|
|
371
|
+
},
|
|
372
|
+
async ({ account_id, query, event_type, target_type, limit, offset }) => {
|
|
373
|
+
let q = adminDb
|
|
374
|
+
.from('logs')
|
|
375
|
+
.select('*')
|
|
376
|
+
.eq('account_id', account_id)
|
|
377
|
+
.ilike('message', `%${query}%`)
|
|
378
|
+
.order('created_at', { ascending: false })
|
|
379
|
+
|
|
380
|
+
if (event_type) q = q.eq('level', event_type)
|
|
381
|
+
if (target_type) q = q.eq('source_type', target_type)
|
|
382
|
+
|
|
383
|
+
const { data, error } = await q.range(offset, offset + limit - 1)
|
|
384
|
+
if (error) throwDbError(error)
|
|
385
|
+
return textResponse({ action: 'search', data: (data || []).map(mapLogRow) })
|
|
386
|
+
}
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
server.registerTool(
|
|
390
|
+
'spine_logs_for_account',
|
|
391
|
+
{
|
|
392
|
+
description: 'List log entries for an account with optional filtering and pagination.',
|
|
393
|
+
inputSchema: z.object({
|
|
394
|
+
account_id: z.string().uuid(),
|
|
395
|
+
event_type: z.string().optional(),
|
|
396
|
+
target_type: z.string().optional(),
|
|
397
|
+
source: z.string().optional(),
|
|
398
|
+
source_id: z.string().optional(),
|
|
399
|
+
actor_id: z.string().uuid().optional(),
|
|
400
|
+
date_from: z.string().datetime().optional(),
|
|
401
|
+
date_to: z.string().datetime().optional(),
|
|
402
|
+
trace_id: z.string().optional(),
|
|
403
|
+
limit: z.number().int().min(1).max(1000).default(100),
|
|
404
|
+
offset: z.number().int().min(0).default(0),
|
|
405
|
+
}),
|
|
406
|
+
},
|
|
407
|
+
async ({ account_id, event_type, target_type, source, source_id, actor_id, date_from, date_to, trace_id, limit, offset }) => {
|
|
408
|
+
let q = adminDb
|
|
409
|
+
.from('logs')
|
|
410
|
+
.select('*', { count: 'exact' })
|
|
411
|
+
.eq('account_id', account_id)
|
|
412
|
+
.order('created_at', { ascending: false })
|
|
413
|
+
|
|
414
|
+
if (event_type) q = q.eq('level', event_type)
|
|
415
|
+
if (target_type) q = q.eq('source_type', target_type)
|
|
416
|
+
if (source) q = q.eq('source', source)
|
|
417
|
+
if (source_id) q = q.eq('source_id', source_id)
|
|
418
|
+
if (actor_id) q = q.eq('person_id', actor_id)
|
|
419
|
+
if (date_from) q = q.gte('created_at', date_from)
|
|
420
|
+
if (date_to) q = q.lte('created_at', date_to)
|
|
421
|
+
if (trace_id) q = q.eq('trace_id', trace_id)
|
|
422
|
+
|
|
423
|
+
const { data, error, count } = await q.range(offset, offset + limit - 1)
|
|
424
|
+
if (error) throwDbError(error)
|
|
425
|
+
return textResponse({
|
|
426
|
+
action: 'account',
|
|
427
|
+
data: (data || []).map(mapLogRow),
|
|
428
|
+
total: count || 0,
|
|
429
|
+
})
|
|
430
|
+
}
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
server.registerTool(
|
|
434
|
+
'spine_logs_for_target',
|
|
435
|
+
{
|
|
436
|
+
description: 'List log entries for a specific target entity.',
|
|
437
|
+
inputSchema: z.object({
|
|
438
|
+
account_id: z.string().uuid(),
|
|
439
|
+
target_type: z.string(),
|
|
440
|
+
target_id: z.string(),
|
|
441
|
+
event_type: z.string().optional(),
|
|
442
|
+
limit: z.number().int().min(1).max(1000).default(100),
|
|
443
|
+
offset: z.number().int().min(0).default(0),
|
|
444
|
+
}),
|
|
445
|
+
},
|
|
446
|
+
async ({ account_id, target_type, target_id, event_type, limit, offset }) => {
|
|
447
|
+
let q = adminDb
|
|
448
|
+
.from('logs')
|
|
449
|
+
.select('*')
|
|
450
|
+
.eq('account_id', account_id)
|
|
451
|
+
.eq('source_type', target_type)
|
|
452
|
+
.eq('source_id', target_id)
|
|
453
|
+
.order('created_at', { ascending: false })
|
|
454
|
+
|
|
455
|
+
if (event_type) q = q.eq('level', event_type)
|
|
456
|
+
|
|
457
|
+
const { data, error } = await q.range(offset, offset + limit - 1)
|
|
458
|
+
if (error) throwDbError(error)
|
|
459
|
+
return textResponse({ action: 'target', data: (data || []).map(mapLogRow) })
|
|
460
|
+
}
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
server.registerTool(
|
|
464
|
+
'spine_logs_stats',
|
|
465
|
+
{
|
|
466
|
+
description: 'Aggregate log counts by type and source for an account and optional filters.',
|
|
467
|
+
inputSchema: z.object({
|
|
468
|
+
account_id: z.string().uuid(),
|
|
469
|
+
event_type: z.string().optional(),
|
|
470
|
+
target_type: z.string().optional(),
|
|
471
|
+
source: z.string().optional(),
|
|
472
|
+
source_id: z.string().optional(),
|
|
473
|
+
actor_id: z.string().uuid().optional(),
|
|
474
|
+
query: z.string().optional(),
|
|
475
|
+
date_from: z.string().datetime().optional(),
|
|
476
|
+
date_to: z.string().datetime().optional(),
|
|
477
|
+
}),
|
|
478
|
+
},
|
|
479
|
+
async ({ account_id, event_type, target_type, source, source_id, actor_id, query, date_from, date_to }) => {
|
|
480
|
+
const { data, error } = await adminDb.rpc('get_log_stats', {
|
|
481
|
+
p_account_id: account_id,
|
|
482
|
+
p_level: event_type || null,
|
|
483
|
+
p_source: source || null,
|
|
484
|
+
p_source_type: target_type || null,
|
|
485
|
+
p_source_id: source_id || null,
|
|
486
|
+
p_person_id: actor_id || null,
|
|
487
|
+
p_query: query || null,
|
|
488
|
+
p_date_from: date_from || null,
|
|
489
|
+
p_date_to: date_to || null,
|
|
490
|
+
})
|
|
491
|
+
if (error) throwDbError(error)
|
|
492
|
+
return textResponse({ action: 'stats', data: data?.[0] || {
|
|
493
|
+
total: 0,
|
|
494
|
+
error_count: 0,
|
|
495
|
+
user_action_count: 0,
|
|
496
|
+
event_type_count: 0,
|
|
497
|
+
levels: [],
|
|
498
|
+
sources: [],
|
|
499
|
+
source_types: [],
|
|
500
|
+
}})
|
|
501
|
+
}
|
|
502
|
+
)
|
|
503
|
+
}
|
|
504
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register all observability MCP tools on a server instance'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
|
|
505
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
506
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
507
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
508
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
509
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
510
|
+
// CIL[END stable_id="~/.framework/mcp/tools/observability.ts:register:function"]
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
-- CIL[BEGIN stable_id="~/.framework/migrations/001_core_schema.sql:core_schema_migration:file" type="file" identity="core_schema_migration" parent="~/.framework/migrations/001_core_schema.sql"]
|
|
2
|
+
-- CIL[DOC-MACRO purpose="Spine v2 consolidated core schema migration"]
|
|
3
|
+
-- CIL[DOC-RESPONSIBILITY responsibility="Creates base tables, extensions, indexes, triggers, seed data, and enables RLS for the Spine v2 runtime"]
|
|
4
|
+
-- CIL[DOC-CONTEXT module="core_schema" layer="database" related_files=".framework/migrations/001_core_schema.sql"]
|
|
5
|
+
-- CIL[DOC-CONTRACT inputs="SQL execution context with public schema, uuid, pgvector, and gen_random_uuid support" outputs="Core tables, indexes, triggers, updated_at function, seed apps, and RLS enabled" errors="SQL errors if tables already exist with incompatible definitions or permissions are insufficient" side_effects="Creates or extends public schema objects and enables row level security on tenant tables"]
|
|
6
|
+
-- CIL[DOC-MICRO logic_summary="Defines runtime tables for accounts, people, types, apps, roles, items, threads, messages, links, attachments, watchers, link types, pipelines, executions, triggers, timers, configs, integrations, logs, observability, tests, embeddings, ai agents, invites, api keys, alerts, progress, account paths, and system settings. Adds indexes, updated_at triggers, seed app rows, and enables RLS." notable_decisions="[]"]
|
|
7
|
+
-- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
-- CIL[DOC-STABILITY stability="stable"]
|
|
1
9
|
-- Spine v2 consolidated core schema
|
|
2
10
|
-- Base tables, extensions, indexes, triggers, and RLS enablements.
|
|
3
11
|
|
|
@@ -670,3 +678,10 @@ ALTER TABLE public.alerts ENABLE ROW LEVEL SECURITY;
|
|
|
670
678
|
ALTER TABLE public.item_progress ENABLE ROW LEVEL SECURITY;
|
|
671
679
|
ALTER TABLE public.account_paths ENABLE ROW LEVEL SECURITY;
|
|
672
680
|
ALTER TABLE public.system_settings ENABLE ROW LEVEL SECURITY;
|
|
681
|
+
-- CIL[DOC-VECTOR type="context" content="purpose='Spine v2 consolidated core schema migration'; No verified external callers; imports: none"]
|
|
682
|
+
-- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
683
|
+
-- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
684
|
+
-- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
685
|
+
-- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
686
|
+
-- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
687
|
+
-- CIL[END stable_id="~/.framework/migrations/001_core_schema.sql:core_schema_migration:file"]
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
-- CIL[BEGIN stable_id="~/.framework/migrations/002_core_rls_and_functions.sql:core_rls_and_functions:file" type="file" identity="core_rls_and_functions" parent="~/.framework/migrations/002_core_rls_and_functions.sql"]
|
|
2
|
+
-- CIL[DOC-MACRO purpose="Consolidated Spine v2 RLS policies, auth helper functions, foreign key constraints, and updated_at triggers for tenant-isolated database access."]
|
|
3
|
+
-- CIL[DOC-RESPONSIBILITY responsibility="Defines the core database security and integrity layer: accessibility functions, automatic account-path maintenance, referential integrity, row-level security policies, and updated_at trigger wiring."]
|
|
4
|
+
-- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/002_core_rls_and_functions.sql"]
|
|
5
|
+
-- CIL[DOC-CONTRACT inputs="N/A (migration script)" outputs="Functions, triggers, foreign keys, and RLS policies in the public schema" errors="Migration execution errors; RLS or FK violations if schema/data invariants are broken" side_effects="Creates or replaces database objects, enables RLS on referenced tables, modifies the constraint set"]
|
|
6
|
+
-- CIL[DOC-MICRO logic_summary="Implements get_accessible_accounts recursively, current_actor_id resolution, person_is_system_admin check, update_account_paths trigger, set_updated_at trigger, foreign key constraints across core tables, and per-table RLS policies using the helper functions." notable_decisions="[]"]
|
|
7
|
+
-- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
-- CIL[DOC-STABILITY stability="stable"]
|
|
1
9
|
-- Spine v2 consolidated RLS and functions
|
|
2
10
|
-- Auth/RLS helper functions, foreign keys, and tenant-isolation policies.
|
|
3
11
|
|
|
@@ -633,3 +641,10 @@ CREATE POLICY api_keys_access ON public.api_keys FOR ALL
|
|
|
633
641
|
CREATE POLICY logs_access ON public.logs FOR ALL
|
|
634
642
|
USING (account_id IN (SELECT public.get_accessible_accounts(auth.uid()))
|
|
635
643
|
);
|
|
644
|
+
-- CIL[DOC-VECTOR type="context" content="purpose='Consolidated Spine v2 RLS policies, auth helper functions, foreign key constraints, and updated_at triggers for tenant-isolated database access.'; No verified external callers; imports: none"]
|
|
645
|
+
-- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
646
|
+
-- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
647
|
+
-- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
648
|
+
-- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
649
|
+
-- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
650
|
+
-- CIL[END stable_id="~/.framework/migrations/002_core_rls_and_functions.sql:core_rls_and_functions:file"]
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
-- CIL[BEGIN stable_id="~/.framework/migrations/003_core_system_data.sql:core_system_data:file" type="file" identity="core_system_data" parent="~/.framework/migrations/003_core_system_data.sql"]
|
|
2
|
+
-- CIL[DOC-MACRO purpose="Seed Spine v2 core system data including built-in roles, core apps, system types, the spine-system master account, and the get_account_apps helper."]
|
|
3
|
+
-- CIL[DOC-RESPONSIBILITY responsibility="Insert or upsert protected platform records required before runtime operation; establishes built-in system roles, core apps, generic types, the master account, and a query helper for account-scoped apps."]
|
|
4
|
+
-- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/003_core_system_data.sql"]
|
|
5
|
+
-- CIL[DOC-CONTRACT inputs="none" outputs="mutated public.roles, public.apps, public.types, public.accounts rows; created public.get_account_apps function" errors="none (ON CONFLICT DO NOTHING/UPDATE ensures idempotency)" side_effects="persists Spine v2 core system seed data and helper function to the database"]
|
|
6
|
+
-- CIL[DOC-MICRO logic_summary="Inserts the system_admin role, a set of built-in roles, the spine-core and admin apps, core runtime types (person, item, thread, message, link, attachment, watcher, account), the spine-system master account, and defines the get_account_apps PL/pgSQL function." notable_decisions="[]"]
|
|
7
|
+
-- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
-- CIL[DOC-STABILITY stability="stable"]
|
|
1
9
|
-- Spine v2 consolidated core system data
|
|
2
10
|
-- System roles and essential platform records.
|
|
3
11
|
|
|
@@ -533,4 +541,11 @@ BEGIN
|
|
|
533
541
|
a.app_type,
|
|
534
542
|
a.name;
|
|
535
543
|
END;
|
|
536
|
-
$function$;
|
|
544
|
+
$function$;
|
|
545
|
+
-- CIL[DOC-VECTOR type="context" content="purpose='Seed Spine v2 core system data including built-in roles, core apps, system types, the spine-system master account, and the get_account_apps helper.'; No verified external callers; imports: none"]
|
|
546
|
+
-- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
547
|
+
-- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
548
|
+
-- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
549
|
+
-- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
550
|
+
-- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
551
|
+
-- CIL[END stable_id="~/.framework/migrations/003_core_system_data.sql:core_system_data:file"]
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
-- CIL[BEGIN stable_id="~/.framework/migrations/004_core_rpc_and_broker.sql:core_rpc_and_broker:file" type="file" identity="core_rpc_and_broker" parent="~/.framework/migrations/004_core_rpc_and_broker.sql"]
|
|
2
|
+
-- CIL[DOC-MACRO purpose="Consolidated RPCs and integration broker migration: vector search functions, integrations, API keys, webhooks, RLS, triggers, and seed integrations"]
|
|
3
|
+
-- CIL[DOC-RESPONSIBILITY responsibility="Creates HNSW index, match_embeddings and search_similar_embeddings RPCs, alters integrations and api_keys tables, creates api_key_usage_logs, webhook_handlers, webhook_deliveries tables, enables RLS and policies, sets updated_at triggers, and seeds default integrations and webhook handlers"]
|
|
4
|
+
-- CIL[DOC-CONTEXT module="migrations" layer="database" related_files=".framework/migrations/004_core_rpc_and_broker.sql"]
|
|
5
|
+
-- CIL[DOC-CONTRACT inputs="none" outputs="schema changes, functions, tables, indexes, RLS policies, triggers, seed rows" errors="SQL execution errors, permission denied, constraint violations" side_effects="Modifies public.integrations, public.api_keys, public.api_key_usage_logs, public.webhook_handlers, public.webhook_deliveries, and public.types; grants execute on functions; enables row level security"]
|
|
6
|
+
-- CIL[DOC-MICRO logic_summary="Create HNSW index if missing; define match_embeddings and search_similar_embeddings RPCs; augment integrations and api_keys columns, constraints and indexes; create api_key_usage_logs, webhook_handlers, and webhook_deliveries tables with indexes and foreign keys; enable RLS with auth-based and service_role bypass policies; add updated_at triggers; seed webhook_event type and openai, generic-http integrations plus generic and portal webhook handlers" notable_decisions="[]"]
|
|
7
|
+
-- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
-- CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
|
|
1
10
|
-- Spine v2 consolidated RPCs and integration broker
|
|
2
11
|
-- Vector search RPC, integration broker schema, and broker RLS/policies.
|
|
3
12
|
|
|
@@ -420,4 +429,11 @@ VALUES (
|
|
|
420
429
|
'{"api_token":{"source":"value","value":""}}',
|
|
421
430
|
true, true, true, 'system'
|
|
422
431
|
)
|
|
423
|
-
ON CONFLICT (app_id, account_id, slug) DO NOTHING;
|
|
432
|
+
ON CONFLICT (app_id, account_id, slug) DO NOTHING;
|
|
433
|
+
-- CIL[DOC-VECTOR type="context" content="purpose='Consolidated RPCs and integration broker migration: vector search functions, integrations, API keys, webhooks, RLS, triggers, and seed integrations'; No verified external callers; imports: none"]
|
|
434
|
+
-- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
435
|
+
-- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
436
|
+
-- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
437
|
+
-- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
438
|
+
-- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
439
|
+
-- CIL[END stable_id="~/.framework/migrations/004_core_rpc_and_broker.sql:core_rpc_and_broker:file"]
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
-- CIL[BEGIN stable_id="~/.framework/migrations/005_core_observability.sql:core_observability:file" type="file" identity="core_observability" parent="~/.framework/migrations/005_core_observability.sql"]
|
|
2
|
+
-- CIL[DOC-MACRO purpose="Consolidated observability, trace context, and knowledge search SQL migration"]
|
|
3
|
+
-- CIL[DOC-RESPONSIBILITY responsibility="Define logs trace columns, observability metric functions, RLS policy, match_embeddings filters, and data retention"]
|
|
4
|
+
-- CIL[DOC-CONTEXT module="migrations" layer="data" related_files=".framework/migrations/005_core_observability.sql"]
|
|
5
|
+
-- CIL[DOC-CONTRACT inputs="SQL migration runner" outputs="Updated public.logs schema, SQL functions, policy, indexes" errors="SQL execution errors, constraint violations" side_effects="Alters public.logs, recreates functions and indexes, grants permissions"]
|
|
6
|
+
-- CIL[DOC-MICRO logic_summary="Adds W3C trace columns and constraints to public.logs, creates trace/metric/outcome/prune functions and grants, updates RLS and match_embeddings with filters, adds retention functions" notable_decisions="[]"]
|
|
7
|
+
-- CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
-- CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
|
|
1
10
|
-- Spine v2 consolidated observability and knowledge search
|
|
2
11
|
-- Logs trace columns, observability metric RPCs, KB item RLS, and updated match_embeddings.
|
|
3
12
|
|
|
@@ -595,4 +604,11 @@ $$;
|
|
|
595
604
|
GRANT EXECUTE ON FUNCTION public.prune_logs(uuid) TO authenticated;
|
|
596
605
|
GRANT EXECUTE ON FUNCTION public.prune_logs(uuid) TO service_role;
|
|
597
606
|
GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO authenticated;
|
|
598
|
-
GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO service_role;
|
|
607
|
+
GRANT EXECUTE ON FUNCTION public.prune_observability(uuid) TO service_role;
|
|
608
|
+
-- CIL[DOC-VECTOR type="context" content="purpose='Consolidated observability, trace context, and knowledge search SQL migration'; No verified external callers; imports: none"]
|
|
609
|
+
-- CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
610
|
+
-- CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
611
|
+
-- CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
612
|
+
-- CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
613
|
+
-- CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
614
|
+
-- CIL[END stable_id="~/.framework/migrations/005_core_observability.sql:core_observability:file"]
|