spine-framework 0.3.145 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5051 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module retrieval
|
|
3
|
+
* @audience internal
|
|
4
|
+
* @layer app-specific
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* This module handles retrieval operations for the MCP framework, facilitating various search functionalities such as content, semantic, and title searches. It integrates with the admin database to fetch and normalize identifiers, ensuring consistent search results. INVARIANT: The module expects valid search queries to function correctly.
|
|
8
|
+
*
|
|
9
|
+
* @seeAlso search-core.js (provides core search functionalities).
|
|
10
|
+
* @seeAlso ../../shared/db.js (accesses the admin database).
|
|
11
|
+
*
|
|
12
|
+
* @cil-generated
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
|
|
16
|
+
// CIL[DOC-MACRO purpose="MCP retrieval tools and test registration for chunk search and example lookup"]
|
|
17
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose MCP tools that run retrieval tests and find code examples by querying search-core"]
|
|
18
|
+
// CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/search-core.ts"]
|
|
19
|
+
// CIL[DOC-CONTRACT inputs="McpServer instance; search query and optional project_id" outputs="Registered MCP tools and JSON result summaries" errors="Invalid query parameters or database failures propagate as tool errors" side_effects="Registers tools on the provided McpServer; performs database reads"]
|
|
20
|
+
// CIL[DOC-MICRO logic_summary="Implements mergeResults, matchesExpectations, and register to wire up retrieval and example tools" notable_decisions="[]"]
|
|
21
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
22
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
23
|
+
// CIL[DOC-AUDIENCE audience="internal"]
|
|
24
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
25
|
+
import { z } from 'zod'
|
|
26
|
+
import {
|
|
27
|
+
contentSearch,
|
|
28
|
+
semanticSearch,
|
|
29
|
+
titleSearch,
|
|
30
|
+
normalizeIdentifier,
|
|
31
|
+
buildSearchResult,
|
|
32
|
+
SearchResult,
|
|
33
|
+
} from './search-core.js'
|
|
34
|
+
import { adminDb } from '../../shared/db.js'
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="purpose='MCP retrieval tools and test registration for chunk search and example lookup'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
41
|
+
// CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:module_header:module_header"]
|
|
42
|
+
|
|
43
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:mergeResults:function" type="function" identity="mergeResults" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
|
|
44
|
+
// CIL[DOC-MACRO purpose="Merge two search result arrays, keeping the highest similarity per id and sorting descending"]
|
|
45
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Combine results from multiple search strategies without duplicates"]
|
|
46
|
+
// CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
|
|
47
|
+
// CIL[DOC-CONTRACT inputs="a: SearchResult[], b: SearchResult[]" outputs="SearchResult[] sorted by similarity descending" errors="none" side_effects="none"]
|
|
48
|
+
// CIL[DOC-MICRO logic_summary="Index results by id, keep the highest similarity score, then return sorted values" notable_decisions="[]"]
|
|
49
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
50
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
51
|
+
/**
|
|
52
|
+
* Merges two arrays of search results, prioritizing results with higher similarity scores. This function ensures that the most relevant results are retained from both input arrays.
|
|
53
|
+
*
|
|
54
|
+
* @inputSpec
|
|
55
|
+
* - a: SearchResult[] (required) — the first array of search results.
|
|
56
|
+
* - b: SearchResult[] (required) — the second array of search results.
|
|
57
|
+
* @outputSpec SearchResult[] — an array of merged search results sorted by similarity score.
|
|
58
|
+
* @sideEffects none
|
|
59
|
+
* @stability stable
|
|
60
|
+
* @cil-generated
|
|
61
|
+
*/
|
|
62
|
+
function mergeResults(a: SearchResult[], b: SearchResult[]): SearchResult[] {
|
|
63
|
+
const byId = new Map<string, SearchResult>()
|
|
64
|
+
for (const r of a) byId.set(r.id, r)
|
|
65
|
+
for (const r of b) {
|
|
66
|
+
const existing = byId.get(r.id)
|
|
67
|
+
if (!existing || (r.similarity ?? 0) > (existing.similarity ?? 0)) {
|
|
68
|
+
byId.set(r.id, r)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Array.from(byId.values()).sort(
|
|
72
|
+
(x, y) => (y.similarity ?? 0) - (x.similarity ?? 0),
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Merge two search result arrays, keeping the highest similarity per id and sorting descending'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
|
|
76
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
77
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
78
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
79
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
80
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
81
|
+
// CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:mergeResults:function"]
|
|
82
|
+
|
|
83
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:matchesExpectations:function" type="function" identity="matchesExpectations" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
|
|
84
|
+
// CIL[DOC-MACRO purpose="Check whether a search result matches expected chunk names and/or file path substrings"]
|
|
85
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Filter search results against caller-provided expected values"]
|
|
86
|
+
// CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
|
|
87
|
+
// CIL[DOC-CONTRACT inputs="result: SearchResult, expectedChunkNames?: string[], expectedFiles?: string[]" outputs="boolean" errors="none" side_effects="none"]
|
|
88
|
+
// CIL[DOC-MICRO logic_summary="Case-insensitive substring match against chunk_name, macro, and file_path; missing or empty expectations pass" notable_decisions="[]"]
|
|
89
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
90
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
91
|
+
/**
|
|
92
|
+
* Determines if a search result matches expected chunk names and file paths. This function is used to validate the relevance of search results against predefined criteria.
|
|
93
|
+
*
|
|
94
|
+
* @inputSpec
|
|
95
|
+
* - result: SearchResult (required) — the search result object to evaluate.
|
|
96
|
+
* - expectedChunkNames: string[] (optional) — an array of expected chunk names to match against.
|
|
97
|
+
* - expectedFiles: string[] (optional) — an array of expected file paths to match against.
|
|
98
|
+
* @outputSpec boolean — true if the search result matches the expectations, false otherwise.
|
|
99
|
+
* @sideEffects none
|
|
100
|
+
* @stability stable
|
|
101
|
+
* @cil-generated
|
|
102
|
+
*/
|
|
103
|
+
function matchesExpectations(
|
|
104
|
+
result: SearchResult,
|
|
105
|
+
expectedChunkNames?: string[],
|
|
106
|
+
expectedFiles?: string[],
|
|
107
|
+
): boolean {
|
|
108
|
+
const nameMatch =
|
|
109
|
+
!expectedChunkNames ||
|
|
110
|
+
expectedChunkNames.length === 0 ||
|
|
111
|
+
expectedChunkNames.some(
|
|
112
|
+
(name) =>
|
|
113
|
+
result.chunk_name.toLowerCase().includes(name.toLowerCase()) ||
|
|
114
|
+
result.macro.toLowerCase().includes(name.toLowerCase()),
|
|
115
|
+
)
|
|
116
|
+
const fileMatch =
|
|
117
|
+
!expectedFiles ||
|
|
118
|
+
expectedFiles.length === 0 ||
|
|
119
|
+
expectedFiles.some((f) =>
|
|
120
|
+
result.file_path.toLowerCase().includes(f.toLowerCase()),
|
|
121
|
+
)
|
|
122
|
+
return nameMatch && fileMatch
|
|
123
|
+
}
|
|
124
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Check whether a search result matches expected chunk names and/or file path substrings'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.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/cil/retrieval.ts:matchesExpectations:function"]
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Registers tools for running retrieval tests against CIL chunks and finding code examples. This function facilitates the evaluation of search results based on specified queries and expected outcomes.
|
|
134
|
+
*
|
|
135
|
+
* @macro Tool registration function for search retrieval and example finding.
|
|
136
|
+
* @micro Utilizes various search strategies (text, semantic, hybrid) to evaluate and return results based on test cases.
|
|
137
|
+
* @inputSpec
|
|
138
|
+
* server: McpServer (required) — the server instance to register tools with.
|
|
139
|
+
* @outputSpec Promise<{ content: Array<{ type: 'text', text: string }> }> — returns a structured summary of test results.
|
|
140
|
+
* @sideEffects registers tools with the server instance.
|
|
141
|
+
* @stability stable
|
|
142
|
+
* @calls titleSearch, semanticSearch, contentSearch, mergeResults, matchesExpectations
|
|
143
|
+
* @cil-generated
|
|
144
|
+
*/
|
|
145
|
+
// CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
|
|
146
|
+
// CIL[DOC-MACRO purpose="Register MCP tools for retrieval testing and code example lookup"]
|
|
147
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Bind spine_cil_test_retrieval, spine_cil_find_examples, and spine_cil_find_pattern tools to the McpServer"]
|
|
148
|
+
// CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
|
|
149
|
+
// CIL[DOC-CONTRACT inputs="server: McpServer" outputs="Promise<{ content: Array<{ type: 'text', text: string }> }> from tool handlers" errors="Invalid inputs from zod schema or database errors" side_effects="Registers three tools on the McpServer; reads from adminDb and search-core"]
|
|
150
|
+
// CIL[DOC-MICRO logic_summary="Defines three tool handlers: test retrieval, find examples, and find pattern; each queries search-core or adminDb and returns structured JSON" notable_decisions="[]"]
|
|
151
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
152
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
153
|
+
export function register(server: McpServer) {
|
|
154
|
+
server.registerTool(
|
|
155
|
+
'spine_cil_test_retrieval',
|
|
156
|
+
{
|
|
157
|
+
description: 'Run a retrieval test suite against CIL chunks. Each test runs the same search pipeline as spine_cil_search_chunks and checks whether expected chunk names/files appear in the top results.',
|
|
158
|
+
inputSchema: z.object({
|
|
159
|
+
project_id: z.string().optional().describe('Limit to a project UUID'),
|
|
160
|
+
limit: z.number().int().min(1).max(50).default(10).optional().describe('Max results to evaluate per query'),
|
|
161
|
+
tests: z.array(
|
|
162
|
+
z.object({
|
|
163
|
+
q: z.string().describe('Search query'),
|
|
164
|
+
expected_chunk_names: z.array(z.string()).optional().describe('One or more chunk_name/macro substrings that should appear in results'),
|
|
165
|
+
expected_files: z.array(z.string()).optional().describe('One or more file_path substrings that should appear in results'),
|
|
166
|
+
mode: z.enum(['hybrid', 'semantic', 'text']).default('hybrid').optional(),
|
|
167
|
+
}),
|
|
168
|
+
).describe('List of retrieval test cases'),
|
|
169
|
+
}),
|
|
170
|
+
},
|
|
171
|
+
async ({ project_id, limit, tests }) => {
|
|
172
|
+
const results: any[] = []
|
|
173
|
+
let passed = 0
|
|
174
|
+
let failed = 0
|
|
175
|
+
|
|
176
|
+
for (const test of tests) {
|
|
177
|
+
let searchResults: SearchResult[] = []
|
|
178
|
+
if (test.mode === 'text') {
|
|
179
|
+
searchResults = await titleSearch({ q: test.q, project_id, limit })
|
|
180
|
+
} else if (test.mode === 'semantic') {
|
|
181
|
+
searchResults = await semanticSearch({ q: test.q, project_id, limit })
|
|
182
|
+
} else {
|
|
183
|
+
const [content, semantic] = await Promise.all([
|
|
184
|
+
contentSearch({ q: test.q, project_id, limit }),
|
|
185
|
+
semanticSearch({ q: test.q, project_id, limit }),
|
|
186
|
+
])
|
|
187
|
+
searchResults = mergeResults(content, semantic).slice(0, limit ?? 10)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const top = searchResults.slice(0, 3)
|
|
191
|
+
const ok = searchResults.some((r) =>
|
|
192
|
+
matchesExpectations(r, test.expected_chunk_names, test.expected_files),
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
if (ok) passed++
|
|
196
|
+
else failed++
|
|
197
|
+
|
|
198
|
+
results.push({
|
|
199
|
+
q: test.q,
|
|
200
|
+
mode: test.mode ?? 'hybrid',
|
|
201
|
+
ok,
|
|
202
|
+
top_results: top.map((r) => ({
|
|
203
|
+
chunk_name: r.chunk_name,
|
|
204
|
+
file_path: r.file_path,
|
|
205
|
+
macro: r.macro,
|
|
206
|
+
match_type: r.match_type,
|
|
207
|
+
similarity: r.similarity,
|
|
208
|
+
})),
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
content: [{
|
|
214
|
+
type: 'text',
|
|
215
|
+
text: JSON.stringify({
|
|
216
|
+
project_id: project_id || null,
|
|
217
|
+
limit: limit ?? 10,
|
|
218
|
+
summary: { total: tests.length, passed, failed },
|
|
219
|
+
results,
|
|
220
|
+
}, null, 2),
|
|
221
|
+
}],
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
server.registerTool(
|
|
227
|
+
'spine_cil_find_examples',
|
|
228
|
+
{
|
|
229
|
+
description: 'Find code examples matching a query. Searches chunk code_content and returns the most relevant full code snippets.',
|
|
230
|
+
inputSchema: z.object({
|
|
231
|
+
q: z.string().describe('Describe the API, function, or pattern you want examples of'),
|
|
232
|
+
project_id: z.string().optional().describe('Limit to a project UUID'),
|
|
233
|
+
limit: z.number().int().min(1).max(20).default(5).optional().describe('Max examples to return'),
|
|
234
|
+
}),
|
|
235
|
+
},
|
|
236
|
+
async ({ q, project_id, limit }) => {
|
|
237
|
+
const results = await contentSearch({ q, project_id, limit })
|
|
238
|
+
const examples = results
|
|
239
|
+
.filter((r) => r.code_content.trim().length > 0)
|
|
240
|
+
.map((r) => ({
|
|
241
|
+
chunk_name: r.chunk_name,
|
|
242
|
+
file_path: r.file_path,
|
|
243
|
+
chunk_type: r.chunk_type,
|
|
244
|
+
macro: r.macro,
|
|
245
|
+
code_content: r.code_content,
|
|
246
|
+
match_type: r.match_type,
|
|
247
|
+
similarity: r.similarity,
|
|
248
|
+
}))
|
|
249
|
+
return {
|
|
250
|
+
content: [{
|
|
251
|
+
type: 'text',
|
|
252
|
+
text: JSON.stringify({ query: q, count: examples.length, examples }, null, 2),
|
|
253
|
+
}],
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
server.registerTool(
|
|
259
|
+
'spine_cil_find_pattern',
|
|
260
|
+
{
|
|
261
|
+
description: 'Find chunks that reference a pattern, convention, or topic. Searches chunk tags, macro, micro, and code_content for the term.',
|
|
262
|
+
inputSchema: z.object({
|
|
263
|
+
q: z.string().describe('Pattern or topic, e.g. "design_schema", "error handling", "zod schema"'),
|
|
264
|
+
project_id: z.string().optional().describe('Limit to a project UUID'),
|
|
265
|
+
limit: z.number().int().min(1).max(50).default(10).optional().describe('Max results to return'),
|
|
266
|
+
}),
|
|
267
|
+
},
|
|
268
|
+
async ({ q, project_id, limit }) => {
|
|
269
|
+
const pageLimit = 5000
|
|
270
|
+
let qb = adminDb
|
|
271
|
+
.from('items')
|
|
272
|
+
.select('id, title, data')
|
|
273
|
+
.filter('data->>kb_type', 'eq', 'cil_chunk')
|
|
274
|
+
.eq('is_active', true)
|
|
275
|
+
.order('updated_at', { ascending: false })
|
|
276
|
+
.limit(pageLimit)
|
|
277
|
+
if (project_id) qb = (qb as any).filter('data->>project_id', 'eq', project_id)
|
|
278
|
+
|
|
279
|
+
const { data: allChunks } = await qb
|
|
280
|
+
const phrase = q.toLowerCase()
|
|
281
|
+
const normPhrase = normalizeIdentifier(phrase)
|
|
282
|
+
|
|
283
|
+
const scored = (allChunks || [])
|
|
284
|
+
.map((c: any) => {
|
|
285
|
+
const d = c.data || {}
|
|
286
|
+
const haystacks = [
|
|
287
|
+
{ text: (c.title || '').toLowerCase(), weight: 3 },
|
|
288
|
+
{ text: (d.macro || '').toLowerCase(), weight: 3 },
|
|
289
|
+
{ text: (d.micro || '').toLowerCase(), weight: 2 },
|
|
290
|
+
{ text: (d.tags || '').toLowerCase(), weight: 2 },
|
|
291
|
+
{ text: (d.vector_content ? JSON.stringify(d.vector_content) : '').toLowerCase(), weight: 1 },
|
|
292
|
+
{ text: (d.code_content || '').toLowerCase(), weight: 1 },
|
|
293
|
+
]
|
|
294
|
+
let score = 0
|
|
295
|
+
for (const { text, weight } of haystacks) {
|
|
296
|
+
if (text.includes(phrase)) score += weight * 2
|
|
297
|
+
if (normalizeIdentifier(text).includes(normPhrase)) score += weight
|
|
298
|
+
}
|
|
299
|
+
return { chunk: c, score }
|
|
300
|
+
})
|
|
301
|
+
.filter(({ score }) => score > 0)
|
|
302
|
+
.sort((a, b) => b.score - a.score)
|
|
303
|
+
.slice(0, limit ?? 10)
|
|
304
|
+
|
|
305
|
+
const maxScore = scored[0]?.score || 1
|
|
306
|
+
const results = scored.map(({ chunk, score }) => {
|
|
307
|
+
const r = buildSearchResult(chunk, 'content', score / maxScore)
|
|
308
|
+
return {
|
|
309
|
+
id: r.id,
|
|
310
|
+
chunk_name: r.chunk_name,
|
|
311
|
+
file_path: r.file_path,
|
|
312
|
+
chunk_type: r.chunk_type,
|
|
313
|
+
macro: r.macro,
|
|
314
|
+
micro: r.micro,
|
|
315
|
+
tags: r.tags,
|
|
316
|
+
code_content: r.code_content,
|
|
317
|
+
similarity: r.similarity,
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
content: [{
|
|
323
|
+
type: 'text',
|
|
324
|
+
text: JSON.stringify({ query: q, count: results.length, results }, null, 2),
|
|
325
|
+
}],
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
)
|
|
329
|
+
}
|
|
330
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Register MCP tools for retrieval testing and code example lookup'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
|
|
331
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
332
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
333
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
334
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
335
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
336
|
+
// CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:register:function"]
|