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,85 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/revoke.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/kb/revoke.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="MCP tool module that registers the spine_kb_revoke KB item revocation capability"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose spine_kb_revoke to the MCP server for marking all embeddings of a KB item as revoked"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="mcp-tools-kb" layer="tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="McpServer instance" outputs="registered tool binding" errors="registration failures" side_effects="spine_kb_revoke becomes available on the MCP server"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports the MCP server SDK, zod, shared admin DB, and the kbRevoke helper" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="ai-agents"]
|
|
10
|
+
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
12
|
+
import { z } from 'zod'
|
|
13
|
+
import { adminDb } from '../../shared/db.js'
|
|
14
|
+
import { kbRevoke } from '../../shared/kb.js'
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MCP tool module that registers the spine_kb_revoke KB item revocation capability'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.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/kb/revoke.ts:module_header:module_header"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/revoke.ts:buildCtx:function" type="function" identity="buildCtx" parent="~/.framework/mcp/tools/kb/revoke.ts"]
|
|
25
|
+
// CIL[DOC-MACRO purpose="Construct a machine request context for a KB revoke operation"]
|
|
26
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create a valid request context object using the shared admin DB and a system-admin machine principal"]
|
|
27
|
+
// CIL[DOC-CONTEXT module="mcp-tools-kb" layer="tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/revoke.ts"]
|
|
28
|
+
// CIL[DOC-CONTRACT inputs="accountId: string" outputs="RequestContext-like object { requestId, accountId, principal, db, trace }" errors="none" side_effects="none"]
|
|
29
|
+
// CIL[DOC-MICRO logic_summary="Builds a unique requestId, sets a machine principal with the system_admin role, and returns the adminDb context" notable_decisions="[]"]
|
|
30
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
31
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
+
function buildCtx(accountId: string) {
|
|
33
|
+
return {
|
|
34
|
+
requestId: `kb-mcp-${Date.now()}`,
|
|
35
|
+
accountId,
|
|
36
|
+
principal: {
|
|
37
|
+
id: 'kb-mcp',
|
|
38
|
+
type: 'machine' as const,
|
|
39
|
+
roles: [{ slug: 'system_admin', is_system: true }]
|
|
40
|
+
},
|
|
41
|
+
db: adminDb,
|
|
42
|
+
trace: undefined,
|
|
43
|
+
} as any
|
|
44
|
+
}
|
|
45
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Construct a machine request context for a KB revoke operation'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
46
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
47
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
48
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
49
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
50
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
51
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/revoke.ts:buildCtx:function"]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/revoke.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/kb/revoke.ts"]
|
|
55
|
+
// CIL[DOC-MACRO purpose="Register the spine_kb_revoke MCP tool on a server"]
|
|
56
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Bind the revoke tool handler and input schema to the given McpServer"]
|
|
57
|
+
// CIL[DOC-CONTEXT module="mcp-tools-kb" layer="tools" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/revoke.ts"]
|
|
58
|
+
// CIL[DOC-CONTRACT inputs="server: McpServer" outputs="void" errors="throws on registration or handler failure" side_effects="spine_kb_revoke tool is available and invokes kbRevoke"]
|
|
59
|
+
// CIL[DOC-MICRO logic_summary="Defines the tool description and zod input schema, then registers an async handler that builds context and calls kbRevoke" notable_decisions="[]"]
|
|
60
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
61
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
62
|
+
export function register(server: McpServer) {
|
|
63
|
+
server.registerTool(
|
|
64
|
+
'spine_kb_revoke',
|
|
65
|
+
{
|
|
66
|
+
description: 'Mark all embeddings for a KB item as revoked.',
|
|
67
|
+
inputSchema: z.object({
|
|
68
|
+
id: z.string().uuid().describe('Item UUID'),
|
|
69
|
+
account_id: z.string().uuid().describe('Account UUID for audit scope'),
|
|
70
|
+
}),
|
|
71
|
+
},
|
|
72
|
+
async ({ id, account_id }) => {
|
|
73
|
+
const ctx = buildCtx(account_id)
|
|
74
|
+
const result = await kbRevoke(ctx, { id })
|
|
75
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }] }
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register the spine_kb_revoke MCP tool on a server'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.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/kb/revoke.ts:register:function"]
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/search.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/kb/search.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="MCP tool module that registers the spine_kb_search tool for querying the knowledge base"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose a Model Context Protocol tool to perform vector similarity searches over published knowledge base articles"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="interface" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="McpServer instance" outputs="registered 'spine_kb_search' tool" errors="throws if server registration fails" side_effects="adds a tool to the MCP server"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports dependencies and re-exports register for the kb search MCP tool" notable_decisions="Uses adminDb and a fixed machine principal for context"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="mcp consumers, ai agents"]
|
|
10
|
+
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
12
|
+
import { z } from 'zod'
|
|
13
|
+
import { adminDb } from '../../shared/db.js'
|
|
14
|
+
import { kbSearch } from '../../shared/kb.js'
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MCP tool module that registers the spine_kb_search tool for querying the knowledge base'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.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/kb/search.ts:module_header:module_header"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/search.ts:buildCtx:function" type="function" identity="buildCtx" parent="~/.framework/mcp/tools/kb/search.ts"]
|
|
25
|
+
// CIL[DOC-MACRO purpose="Build an admin request context for knowledge base search"]
|
|
26
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Construct a RequestContext-like object with a fixed machine principal and adminDb connection"]
|
|
27
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="utility" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/search.ts"]
|
|
28
|
+
// CIL[DOC-CONTRACT inputs="accountId: string" outputs="request context object" errors="none" side_effects="none"]
|
|
29
|
+
// CIL[DOC-MICRO logic_summary="Returns an object containing requestId, accountId, principal, db, and trace" notable_decisions="Principal uses the system_admin role; trace is undefined; cast to any"]
|
|
30
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
31
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
+
function buildCtx(accountId: string) {
|
|
33
|
+
return {
|
|
34
|
+
requestId: `kb-mcp-${Date.now()}`,
|
|
35
|
+
accountId,
|
|
36
|
+
principal: {
|
|
37
|
+
id: 'kb-mcp',
|
|
38
|
+
type: 'machine' as const,
|
|
39
|
+
roles: [{ slug: 'system_admin', is_system: true }]
|
|
40
|
+
},
|
|
41
|
+
db: adminDb,
|
|
42
|
+
trace: undefined,
|
|
43
|
+
} as any
|
|
44
|
+
}
|
|
45
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Build an admin request context for knowledge base search'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
46
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
47
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
48
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
49
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
50
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
51
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/search.ts:buildCtx:function"]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/search.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/kb/search.ts"]
|
|
55
|
+
// CIL[DOC-MACRO purpose="Register the spine_kb_search tool on the provided MCP server"]
|
|
56
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define input schema and handler for vector similarity knowledge base search"]
|
|
57
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="interface" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/search.ts"]
|
|
58
|
+
// CIL[DOC-CONTRACT inputs="server: McpServer" outputs="none (registers tool by side effect)" errors="Propagates errors from kbSearch" side_effects="Registers the 'spine_kb_search' tool and calls kbSearch on each invocation"]
|
|
59
|
+
// CIL[DOC-MICRO logic_summary="Registers a tool with zod input schema and an async handler that builds a context and calls kbSearch" notable_decisions="Defaults type_slugs to a public/internal/admin list and passes optional filters/limits through unchanged"]
|
|
60
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
61
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
62
|
+
export function register(server: McpServer) {
|
|
63
|
+
server.registerTool(
|
|
64
|
+
'spine_kb_search',
|
|
65
|
+
{
|
|
66
|
+
description: 'Search the knowledge base using vector similarity. Returns published articles ranked by similarity.',
|
|
67
|
+
inputSchema: z.object({
|
|
68
|
+
query: z.string().describe('Search query'),
|
|
69
|
+
account_id: z.string().uuid().describe('Account UUID to scope results'),
|
|
70
|
+
type_slugs: z.array(z.string()).optional().describe('Limit to these kb type slugs'),
|
|
71
|
+
sources: z.array(z.enum(['kb', 'code'])).optional().describe('Sources to search'),
|
|
72
|
+
app_id: z.string().uuid().optional().describe('Filter by app_id'),
|
|
73
|
+
filters: z.record(z.any()).optional().describe('Post-match filters on record data, e.g. { product: ["example-app"], category: ["how-to"] }'),
|
|
74
|
+
vector_fields: z.array(z.string()).optional().describe('Specific vector fields to search'),
|
|
75
|
+
limit: z.number().int().min(1).max(50).optional().describe('Max results'),
|
|
76
|
+
offset: z.number().int().min(0).optional().describe('Result offset'),
|
|
77
|
+
}),
|
|
78
|
+
},
|
|
79
|
+
async ({ query, account_id, type_slugs, sources, app_id, filters, vector_fields, limit, offset }) => {
|
|
80
|
+
const ctx = buildCtx(account_id)
|
|
81
|
+
const result = await kbSearch(ctx, {
|
|
82
|
+
query,
|
|
83
|
+
type_slugs: type_slugs || ['kb-spine-admin', 'kb-spine-internal', 'kb-spine-public'],
|
|
84
|
+
sources,
|
|
85
|
+
app_id,
|
|
86
|
+
filters,
|
|
87
|
+
vector_fields,
|
|
88
|
+
limit,
|
|
89
|
+
offset,
|
|
90
|
+
})
|
|
91
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }] }
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register the spine_kb_search tool on the provided MCP server'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
96
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
97
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
98
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
99
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
100
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
101
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/search.ts:register:function"]
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/upsert.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/kb/upsert.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="MCP tool module that registers the spine_kb_upsert tool for creating or updating KB articles."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Imports dependencies and exposes the register function to wire the KB upsert MCP tool into a server."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="tools" related_files=".framework/functions/admin-data.ts,.framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="McpServer instance supplied at runtime through register" outputs="Registered spine_kb_upsert tool" errors="Import-time errors if dependencies are missing or malformed" side_effects="No side effects at module load"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports McpServer SDK, zod, adminDb, admin-data helpers, and KB ingest/revoke helpers; exports a register function for server wiring." notable_decisions="Defers persistence and embedding side effects to the tool handler; uses shared adminDb and admin-data modules."]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="system-admin"]
|
|
10
|
+
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
12
|
+
import { z } from 'zod'
|
|
13
|
+
import { adminDb } from '../../shared/db.js'
|
|
14
|
+
import { create as adminCreate, update as adminUpdate } from '../../../functions/admin-data.js'
|
|
15
|
+
import { kbIngest, kbRevoke } from '../../shared/kb.js'
|
|
16
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MCP tool module that registers the spine_kb_upsert tool for creating or updating KB articles.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/admin-data.ts,.framework/mcp/shared/kb.ts"]
|
|
17
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
18
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
19
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
20
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
21
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
22
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/upsert.ts:module_header:module_header"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/upsert.ts:buildCtx:function" type="function" identity="buildCtx" parent="~/.framework/mcp/tools/kb/upsert.ts"]
|
|
26
|
+
// CIL[DOC-MACRO purpose="Construct a minimal admin request context for KB operations."]
|
|
27
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Builds a context object with a machine principal, request id, account, db, and query for admin-data or kbIngest/kbRevoke calls."]
|
|
28
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="tools" related_files=".framework/functions/admin-data.ts,.framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/upsert.ts"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="accountId: string, query: any" outputs="Admin-like request context object" errors="None" side_effects="None"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="Returns a hard-coded machine principal with system_admin role, adminDb, a generated requestId, and the supplied query." notable_decisions="No trace field is set; the principal is fixed to the kb-mcp machine role."]
|
|
31
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
32
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
33
|
+
function buildCtx(accountId: string, query: any) {
|
|
34
|
+
return {
|
|
35
|
+
requestId: `kb-mcp-${Date.now()}`,
|
|
36
|
+
accountId,
|
|
37
|
+
principal: {
|
|
38
|
+
id: 'kb-mcp',
|
|
39
|
+
type: 'machine' as const,
|
|
40
|
+
roles: [{ slug: 'system_admin', is_system: true }]
|
|
41
|
+
},
|
|
42
|
+
db: adminDb,
|
|
43
|
+
trace: undefined,
|
|
44
|
+
query,
|
|
45
|
+
} as any
|
|
46
|
+
}
|
|
47
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Construct a minimal admin request context for KB operations.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/admin-data.ts,.framework/mcp/shared/kb.ts"]
|
|
48
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
49
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
50
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
51
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
52
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
53
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/upsert.ts:buildCtx:function"]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/kb/upsert.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/kb/upsert.ts"]
|
|
57
|
+
// CIL[DOC-MACRO purpose="Register the spine_kb_upsert MCP tool on an McpServer."]
|
|
58
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Define the tool input schema and implement creation or update of KB items, publishing or revoking embeddings based on status."]
|
|
59
|
+
// CIL[DOC-CONTEXT module="mcp/tools/kb" layer="tools" related_files=".framework/functions/admin-data.ts,.framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts,.framework/mcp/tools/kb/upsert.ts"]
|
|
60
|
+
// CIL[DOC-CONTRACT inputs="server: McpServer" outputs="Tool registered with name spine_kb_upsert" errors="Validation errors from zod or admin-data; ingest or revoke errors" side_effects="Creates or updates a KB item; publishes embeddings for published status or revokes them otherwise"]
|
|
61
|
+
// CIL[DOC-MICRO logic_summary="Parses zod input, builds record data, calls adminCreate or adminUpdate, then conditionally calls kbIngest or kbRevoke." notable_decisions="Status defaults to draft; published status triggers kbIngest, all other statuses trigger kbRevoke; app_id and description are optional."]
|
|
62
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
63
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
64
|
+
export function register(server: McpServer) {
|
|
65
|
+
server.registerTool(
|
|
66
|
+
'spine_kb_upsert',
|
|
67
|
+
{
|
|
68
|
+
description: 'Create or update a KB article through admin-data. Publishes and generates embeddings when status is published.',
|
|
69
|
+
inputSchema: z.object({
|
|
70
|
+
account_id: z.string().uuid().describe('Account UUID (ignored for platform-scoped types)'),
|
|
71
|
+
type_slug: z.string().describe('KB type slug'),
|
|
72
|
+
id: z.string().uuid().optional().describe('Item UUID; omit to create'),
|
|
73
|
+
title: z.string().describe('Article title'),
|
|
74
|
+
description: z.string().optional().describe('Short description'),
|
|
75
|
+
content: z.string().describe('Article content'),
|
|
76
|
+
tags: z.array(z.string()).optional().describe('Tags'),
|
|
77
|
+
status: z.enum(['draft', 'published', 'archived']).optional().describe('Article status'),
|
|
78
|
+
app_id: z.string().uuid().optional().describe('App UUID'),
|
|
79
|
+
data: z.record(z.any()).optional().describe('Additional record data fields (product, category, work_ticket_id, source_file, source_function, etc.)'),
|
|
80
|
+
}),
|
|
81
|
+
},
|
|
82
|
+
async ({ account_id, type_slug, id, title, description, content, tags, status, app_id, data: extraData }) => {
|
|
83
|
+
const recordStatus = status || 'draft'
|
|
84
|
+
|
|
85
|
+
const recordData: any = {
|
|
86
|
+
entity: 'items',
|
|
87
|
+
title,
|
|
88
|
+
status: recordStatus,
|
|
89
|
+
data: {
|
|
90
|
+
...(extraData || {}),
|
|
91
|
+
content,
|
|
92
|
+
tags: tags || [],
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (description !== undefined) recordData.description = description
|
|
97
|
+
if (app_id !== undefined) recordData.app_id = app_id
|
|
98
|
+
|
|
99
|
+
let record: any
|
|
100
|
+
|
|
101
|
+
if (id) {
|
|
102
|
+
const ctx = buildCtx(account_id, { entity: 'items', id, method: 'PATCH' })
|
|
103
|
+
record = await adminUpdate(ctx, recordData)
|
|
104
|
+
} else {
|
|
105
|
+
recordData.type_slug = type_slug
|
|
106
|
+
const ctx = buildCtx(account_id, { entity: 'items', method: 'POST' })
|
|
107
|
+
record = await adminCreate(ctx, recordData)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const ingestCtx = buildCtx(account_id, {})
|
|
111
|
+
const ingestResult = record.status === 'published'
|
|
112
|
+
? await kbIngest(ingestCtx, { id: record.id })
|
|
113
|
+
: await kbRevoke(ingestCtx, { id: record.id })
|
|
114
|
+
|
|
115
|
+
return { content: [{ type: 'text', text: JSON.stringify({ record, ingest: ingestResult }) }] }
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register the spine_kb_upsert MCP tool on an McpServer.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/admin-data.ts,.framework/mcp/shared/kb.ts"]
|
|
120
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
121
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
122
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
123
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
124
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
125
|
+
// CIL[END stable_id="~/.framework/mcp/tools/kb/upsert.ts:register:function"]
|