@malloy-publisher/server 0.0.235 → 0.0.236
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/dist/app/api-doc.yaml +47 -17
- package/dist/package_load_worker.mjs +8 -1
- package/dist/server.mjs +471 -54
- package/package.json +5 -2
- package/.eslintrc.json +0 -44
- package/.prettierignore +0 -1
- package/.prettierrc +0 -4
- package/build.ts +0 -97
- package/eslint.config.mjs +0 -76
- package/k6-tests/README.md +0 -144
- package/k6-tests/bun.lock +0 -797
- package/k6-tests/load-test/load-test-crud-connections.ts +0 -263
- package/k6-tests/load-test/load-test-crud-packages.ts +0 -461
- package/k6-tests/load-test/load-test-crud-projects.ts +0 -160
- package/k6-tests/load-test/load-test-crud.ts +0 -142
- package/k6-tests/load-test/load-test.ts +0 -784
- package/k6-tests/package.json +0 -27
- package/k6-tests/scripts/run-with-otel.sh +0 -50
- package/k6-tests/smoke-test/smoke-test.ts +0 -158
- package/k6-tests/tsconfig.json +0 -29
- package/k6-tests/utils/client_factory.ts +0 -128
- package/k6-tests/utils/common.ts +0 -489
- package/k6-tests/utils/logger.ts +0 -62
- package/k6-tests/utils/types.d.ts +0 -35
- package/malloy_mcp.dxt +0 -0
- package/publisher.config.example.bigquery.json +0 -33
- package/publisher.config.example.duckdb.json +0 -23
- package/publisher.config.json +0 -23
- package/scripts/bake-duckdb-extensions.js +0 -110
- package/src/config.spec.ts +0 -1535
- package/src/config.theme.spec.ts +0 -178
- package/src/config.ts +0 -1142
- package/src/constants.ts +0 -105
- package/src/controller/compile.controller.ts +0 -40
- package/src/controller/connection.controller.spec.ts +0 -849
- package/src/controller/connection.controller.ts +0 -901
- package/src/controller/database.controller.ts +0 -24
- package/src/controller/materialization.controller.spec.ts +0 -293
- package/src/controller/materialization.controller.ts +0 -319
- package/src/controller/model.controller.ts +0 -164
- package/src/controller/package.controller.spec.ts +0 -273
- package/src/controller/package.controller.ts +0 -306
- package/src/controller/query.controller.ts +0 -152
- package/src/controller/theme.controller.ts +0 -83
- package/src/controller/watch-mode.controller.ts +0 -243
- package/src/data_styles.ts +0 -71
- package/src/default-publisher.config.json +0 -23
- package/src/ducklake_version.spec.ts +0 -163
- package/src/ducklake_version.ts +0 -153
- package/src/errors.spec.ts +0 -119
- package/src/errors.ts +0 -237
- package/src/filter_deprecation.spec.ts +0 -64
- package/src/filter_deprecation.ts +0 -42
- package/src/health.spec.ts +0 -123
- package/src/health.ts +0 -233
- package/src/heap_check.spec.ts +0 -144
- package/src/heap_check.ts +0 -144
- package/src/instrumentation.ts +0 -214
- package/src/json_utils.spec.ts +0 -51
- package/src/json_utils.ts +0 -33
- package/src/logger.spec.ts +0 -210
- package/src/logger.ts +0 -251
- package/src/malloy_pin_prereqs.spec.ts +0 -25
- package/src/materialization_metrics.spec.ts +0 -169
- package/src/materialization_metrics.ts +0 -346
- package/src/mcp/error_messages.spec.ts +0 -35
- package/src/mcp/error_messages.ts +0 -183
- package/src/mcp/handler_utils.spec.ts +0 -108
- package/src/mcp/handler_utils.ts +0 -251
- package/src/mcp/mcp_constants.ts +0 -6
- package/src/mcp/query_envelope.spec.ts +0 -229
- package/src/mcp/query_envelope.ts +0 -240
- package/src/mcp/server.protocol.spec.ts +0 -250
- package/src/mcp/server.ts +0 -87
- package/src/mcp/skills/build_skills_bundle.spec.ts +0 -51
- package/src/mcp/skills/build_skills_bundle.ts +0 -176
- package/src/mcp/skills/skills_bundle.json +0 -1
- package/src/mcp/skills/skills_bundle.spec.ts +0 -171
- package/src/mcp/tool_response.spec.ts +0 -108
- package/src/mcp/tool_response.ts +0 -138
- package/src/mcp/tools/compile_tool.spec.ts +0 -315
- package/src/mcp/tools/compile_tool.ts +0 -208
- package/src/mcp/tools/docs_search/build_docs_index.ts +0 -132
- package/src/mcp/tools/docs_search/malloy_docs_index.json +0 -1
- package/src/mcp/tools/docs_search_tool.spec.ts +0 -32
- package/src/mcp/tools/docs_search_tool.ts +0 -128
- package/src/mcp/tools/embedding_index.spec.ts +0 -1236
- package/src/mcp/tools/embedding_index.ts +0 -808
- package/src/mcp/tools/execute_query_tool.spec.ts +0 -294
- package/src/mcp/tools/execute_query_tool.ts +0 -316
- package/src/mcp/tools/get_context_eval.ts +0 -275
- package/src/mcp/tools/get_context_tool.spec.ts +0 -592
- package/src/mcp/tools/get_context_tool.ts +0 -585
- package/src/mcp/tools/reload_package_tool.spec.ts +0 -232
- package/src/mcp/tools/reload_package_tool.ts +0 -132
- package/src/mcp_config.spec.ts +0 -919
- package/src/mcp_config.ts +0 -425
- package/src/oom_guards.integration.spec.ts +0 -269
- package/src/package_load/package_load_pool.spec.ts +0 -252
- package/src/package_load/package_load_pool.ts +0 -931
- package/src/package_load/package_load_worker.ts +0 -1034
- package/src/package_load/protocol.ts +0 -364
- package/src/package_load/rpc_wait_accountant.spec.ts +0 -109
- package/src/package_load/rpc_wait_accountant.ts +0 -76
- package/src/package_load_metrics.spec.ts +0 -114
- package/src/package_load_metrics.ts +0 -127
- package/src/path_safety.spec.ts +0 -158
- package/src/path_safety.ts +0 -146
- package/src/pg_helpers.spec.ts +0 -223
- package/src/pg_helpers.ts +0 -52
- package/src/query_cap_metrics.spec.ts +0 -89
- package/src/query_cap_metrics.ts +0 -116
- package/src/query_concurrency.spec.ts +0 -247
- package/src/query_concurrency.ts +0 -237
- package/src/query_metadata_metrics.ts +0 -49
- package/src/query_param_utils.ts +0 -29
- package/src/query_timeout.spec.ts +0 -224
- package/src/query_timeout.ts +0 -179
- package/src/runtime/publisher.js +0 -328
- package/src/server-old.ts +0 -988
- package/src/server.ts +0 -2059
- package/src/service/annotations.spec.ts +0 -118
- package/src/service/annotations.ts +0 -91
- package/src/service/authorize.spec.ts +0 -154
- package/src/service/authorize.ts +0 -498
- package/src/service/authorize_integration.spec.ts +0 -2041
- package/src/service/build_plan.spec.ts +0 -685
- package/src/service/build_plan.ts +0 -797
- package/src/service/compile_authorize.spec.ts +0 -85
- package/src/service/compile_fragment_techniques.spec.ts +0 -156
- package/src/service/connection.spec.ts +0 -2360
- package/src/service/connection.ts +0 -2187
- package/src/service/connection_config.spec.ts +0 -734
- package/src/service/connection_config.ts +0 -899
- package/src/service/connection_federation.spec.ts +0 -184
- package/src/service/connection_fingerprint.spec.ts +0 -102
- package/src/service/connection_service.spec.ts +0 -711
- package/src/service/connection_service.ts +0 -291
- package/src/service/cron_evaluator.spec.ts +0 -79
- package/src/service/cron_evaluator.ts +0 -105
- package/src/service/db_utils.spec.ts +0 -1085
- package/src/service/db_utils.ts +0 -1502
- package/src/service/duckdb_instance_isolation.spec.ts +0 -137
- package/src/service/ducklake_lazy_attach.spec.ts +0 -110
- package/src/service/embedding_provider.spec.ts +0 -329
- package/src/service/embedding_provider.ts +0 -236
- package/src/service/environment.ts +0 -2191
- package/src/service/environment_admission.spec.ts +0 -344
- package/src/service/environment_compile.spec.ts +0 -197
- package/src/service/environment_store.spec.ts +0 -2274
- package/src/service/environment_store.ts +0 -2434
- package/src/service/environment_store_anchoring.spec.ts +0 -107
- package/src/service/environment_store_clone.spec.ts +0 -350
- package/src/service/explore_visibility.spec.ts +0 -434
- package/src/service/exports_probe.spec.ts +0 -107
- package/src/service/extension_fetch_policy.spec.ts +0 -256
- package/src/service/filter.spec.ts +0 -458
- package/src/service/filter.ts +0 -341
- package/src/service/filter_bypass.spec.ts +0 -418
- package/src/service/filter_integration.spec.ts +0 -1004
- package/src/service/freshness.spec.ts +0 -183
- package/src/service/freshness.ts +0 -112
- package/src/service/gcs_s3_utils.ts +0 -427
- package/src/service/given.ts +0 -105
- package/src/service/givens_integration.spec.ts +0 -219
- package/src/service/manifest_loader.spec.ts +0 -189
- package/src/service/manifest_loader.ts +0 -156
- package/src/service/materialization_build_session.spec.ts +0 -435
- package/src/service/materialization_build_session.ts +0 -681
- package/src/service/materialization_config_validation.spec.ts +0 -99
- package/src/service/materialization_config_validation.ts +0 -120
- package/src/service/materialization_eligibility.spec.ts +0 -158
- package/src/service/materialization_eligibility.ts +0 -305
- package/src/service/materialization_schedule_surface.spec.ts +0 -256
- package/src/service/materialization_scheduler.spec.ts +0 -289
- package/src/service/materialization_scheduler.ts +0 -304
- package/src/service/materialization_serve_transform.spec.ts +0 -1003
- package/src/service/materialization_serve_transform.ts +0 -779
- package/src/service/materialization_service.spec.ts +0 -2373
- package/src/service/materialization_service.ts +0 -2342
- package/src/service/materialization_test_fixtures.ts +0 -249
- package/src/service/model.spec.ts +0 -1157
- package/src/service/model.ts +0 -3370
- package/src/service/model_limits.spec.ts +0 -209
- package/src/service/model_limits.ts +0 -131
- package/src/service/model_storage_serve.spec.ts +0 -193
- package/src/service/model_storage_serve_joins.spec.ts +0 -193
- package/src/service/package.spec.ts +0 -612
- package/src/service/package.ts +0 -1799
- package/src/service/package_manifest.spec.ts +0 -230
- package/src/service/package_manifest.ts +0 -241
- package/src/service/package_memory_governor.spec.ts +0 -173
- package/src/service/package_memory_governor.ts +0 -233
- package/src/service/package_quote_bound_tables.spec.ts +0 -171
- package/src/service/package_race.spec.ts +0 -208
- package/src/service/package_reload_safety.spec.ts +0 -193
- package/src/service/package_rollback.spec.ts +0 -190
- package/src/service/package_worker_path.spec.ts +0 -645
- package/src/service/path_injection.spec.ts +0 -39
- package/src/service/persist_annotation_validation.spec.ts +0 -89
- package/src/service/persist_annotation_validation.ts +0 -59
- package/src/service/persistence_policy.spec.ts +0 -374
- package/src/service/proxy.spec.ts +0 -414
- package/src/service/proxy.ts +0 -248
- package/src/service/query_boundary.spec.ts +0 -470
- package/src/service/query_metadata.spec.ts +0 -408
- package/src/service/query_metadata.ts +0 -492
- package/src/service/query_metadata_identity.spec.ts +0 -149
- package/src/service/query_text.spec.ts +0 -79
- package/src/service/query_text.ts +0 -43
- package/src/service/quoting.spec.ts +0 -135
- package/src/service/quoting.ts +0 -78
- package/src/service/resolve_environment.ts +0 -15
- package/src/service/restricted_mode.spec.ts +0 -299
- package/src/service/source_extraction.ts +0 -225
- package/src/service/theme_store.ts +0 -199
- package/src/storage/DatabaseInterface.ts +0 -198
- package/src/storage/StorageManager.ts +0 -113
- package/src/storage/duckdb/ConnectionRepository.ts +0 -143
- package/src/storage/duckdb/DuckDBConnection.ts +0 -123
- package/src/storage/duckdb/DuckDBRepository.ts +0 -208
- package/src/storage/duckdb/EnvironmentRepository.ts +0 -148
- package/src/storage/duckdb/MaterializationRepository.spec.ts +0 -191
- package/src/storage/duckdb/MaterializationRepository.ts +0 -336
- package/src/storage/duckdb/PackageRepository.ts +0 -135
- package/src/storage/duckdb/schema.ts +0 -229
- package/src/stream_helpers.spec.ts +0 -280
- package/src/stream_helpers.ts +0 -162
- package/src/telemetry.ts +0 -20
- package/src/test_helpers/metrics_harness.ts +0 -166
- package/src/theme_key_parity.spec.ts +0 -57
- package/src/utils.ts +0 -29
- package/tests/fixtures/authorize-compile/model.malloy +0 -9
- package/tests/fixtures/authorize-compile/publisher.json +0 -4
- package/tests/fixtures/html-pages-nopublic/model.malloy +0 -1
- package/tests/fixtures/html-pages-nopublic/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/data.csv +0 -3
- package/tests/fixtures/html-pages-test/public/assets/app.css +0 -3
- package/tests/fixtures/html-pages-test/public/barehtml.html +0 -4
- package/tests/fixtures/html-pages-test/public/bodymeta.html +0 -8
- package/tests/fixtures/html-pages-test/public/data.json +0 -1
- package/tests/fixtures/html-pages-test/public/fitcomment.html +0 -11
- package/tests/fixtures/html-pages-test/public/index.html +0 -9
- package/tests/fixtures/html-pages-test/public/nohead.html +0 -8
- package/tests/fixtures/html-pages-test/public/notfit.html +0 -13
- package/tests/fixtures/html-pages-test/public/slides.html +0 -12
- package/tests/fixtures/html-pages-test/public/sub/page2.html +0 -9
- package/tests/fixtures/html-pages-test/public/unterminated.html +0 -10
- package/tests/fixtures/html-pages-test/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/report.malloy +0 -1
- package/tests/fixtures/persist-multi-level/data/orders.csv +0 -5
- package/tests/fixtures/persist-multi-level/multi_level.malloy +0 -18
- package/tests/fixtures/persist-multi-level/publisher.json +0 -5
- package/tests/fixtures/persist-schedule-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-test/persist_schedule_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-test/publisher.json +0 -7
- package/tests/fixtures/persist-schedule-warn-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-warn-test/persist_warn_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-warn-test/publisher.json +0 -6
- package/tests/fixtures/persist-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-test/persist_test.malloy +0 -11
- package/tests/fixtures/persist-test/publisher.json +0 -5
- package/tests/fixtures/publisher.config.json +0 -15
- package/tests/fixtures/query-givens/data/orders.csv +0 -7
- package/tests/fixtures/query-givens/model.malloy +0 -34
- package/tests/fixtures/query-givens/publisher.json +0 -5
- package/tests/fixtures/xlsx/database.xlsx +0 -0
- package/tests/harness/mcp_test_setup.ts +0 -332
- package/tests/harness/rest_e2e.ts +0 -68
- package/tests/integration/authorize/compile_authorize_http.integration.spec.ts +0 -92
- package/tests/integration/concurrent_package/concurrent_package.integration.spec.ts +0 -280
- package/tests/integration/duckdb_storage/duckdb_storage.integration.spec.ts +0 -138
- package/tests/integration/first_boot/readiness_line.integration.spec.ts +0 -177
- package/tests/integration/html_pages/html_pages.integration.spec.ts +0 -440
- package/tests/integration/legacy_routes/legacy_routes.integration.spec.ts +0 -259
- package/tests/integration/materialization/environment_list.integration.spec.ts +0 -133
- package/tests/integration/materialization/freshness_gate.integration.spec.ts +0 -292
- package/tests/integration/materialization/manifest_binding.integration.spec.ts +0 -430
- package/tests/integration/materialization/materialization_lifecycle.integration.spec.ts +0 -441
- package/tests/integration/materialization/orchestrated_rebind.integration.spec.ts +0 -150
- package/tests/integration/materialization/reference_manifest.integration.spec.ts +0 -251
- package/tests/integration/materialization/schedule_edit.integration.spec.ts +0 -126
- package/tests/integration/materialization/scheduler.integration.spec.ts +0 -200
- package/tests/integration/materialization/scheduler_recovery.integration.spec.ts +0 -172
- package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +0 -256
- package/tests/integration/materialization/scheduler_wiring.integration.spec.ts +0 -143
- package/tests/integration/mcp/mcp_execute_query_tool.integration.spec.ts +0 -438
- package/tests/integration/mcp/mcp_get_context_semantic.integration.spec.ts +0 -235
- package/tests/integration/mcp/mcp_transport.integration.spec.ts +0 -98
- package/tests/integration/query_givens/query_givens.integration.spec.ts +0 -146
- package/tests/integration/query_givens/query_givens_authorize.integration.spec.ts +0 -121
- package/tests/integration/sdk_givens/sdk_givens.integration.spec.ts +0 -110
- package/tests/integration/watch-mode/watch_mode.integration.spec.ts +0 -421
- package/tests/unit/controller/theme.controller.spec.ts +0 -141
- package/tests/unit/duckdb/attached_databases.test.ts +0 -1243
- package/tests/unit/duckdb/duckdb_connection.test.ts +0 -181
- package/tests/unit/duckdb/legacy_schema_migration.test.ts +0 -197
- package/tests/unit/duckdb/repositories.test.ts +0 -208
- package/tests/unit/ducklake/ducklake.test.ts +0 -952
- package/tests/unit/service/theme_store.spec.ts +0 -139
- package/tsconfig.json +0 -32
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retrieval eval for malloy_getContext: lexical baseline vs the optional
|
|
3
|
-
* embedding-backed semantic mode.
|
|
4
|
-
*
|
|
5
|
-
* Runs a labeled set of plain-English queries against the live MCP endpoint
|
|
6
|
-
* and reports recall@K: whether the expected entity appears in the top-K
|
|
7
|
-
* results. Each case is labeled with the retrieval mode the server reported
|
|
8
|
-
* (`semantic` / `lexical`; servers without an embedding provider report no
|
|
9
|
-
* mode and run the lexical baseline).
|
|
10
|
-
*
|
|
11
|
-
* A/B: run once against a server started WITHOUT `EMBEDDING_API_KEY`
|
|
12
|
-
* (lexical baseline), then once against a server started with it, and
|
|
13
|
-
* compare the two summaries. The cases marked `gap` share no tokens with
|
|
14
|
-
* their target entity's name or docs, so the lexical run is expected to
|
|
15
|
-
* miss them and the semantic run to hit them.
|
|
16
|
-
*
|
|
17
|
-
* bun run packages/server/src/mcp/tools/get_context_eval.ts [K]
|
|
18
|
-
*
|
|
19
|
-
* Targets MCP_URL (default http://localhost:4040/mcp); start the server
|
|
20
|
-
* first. Cases cover the bundled `examples` environment (storefront), so
|
|
21
|
-
* the default config works out of the box, plus the classic ecommerce/faa
|
|
22
|
-
* cases for a malloy-samples config (`samples` environment); cases whose
|
|
23
|
-
* environment is not served are skipped, not counted as misses.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
interface EvalCase {
|
|
27
|
-
env: string;
|
|
28
|
-
pkg: string;
|
|
29
|
-
query: string;
|
|
30
|
-
expect: string; // substring expected in a top-K result name (case-insensitive)
|
|
31
|
-
gap?: boolean; // true = no token overlap; lexical is expected to miss
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
interface ResultEntity {
|
|
35
|
-
kind: string;
|
|
36
|
-
name: string;
|
|
37
|
-
source?: string | null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
interface GetContextPayload {
|
|
41
|
-
retrieval?: string;
|
|
42
|
-
results?: ResultEntity[];
|
|
43
|
-
error?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Ground truth verified against the bundled examples (storefront) and the
|
|
47
|
-
// malloy-samples demo packages (ecommerce, faa).
|
|
48
|
-
const CASES: EvalCase[] = [
|
|
49
|
-
// examples/storefront: served by the default config, works out of the box.
|
|
50
|
-
{
|
|
51
|
-
env: "examples",
|
|
52
|
-
pkg: "storefront",
|
|
53
|
-
query: "revenue by product category",
|
|
54
|
-
expect: "category",
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
env: "examples",
|
|
58
|
-
pkg: "storefront",
|
|
59
|
-
query: "top selling products",
|
|
60
|
-
expect: "top_products",
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
env: "examples",
|
|
64
|
-
pkg: "storefront",
|
|
65
|
-
query: "monthly sales trend",
|
|
66
|
-
expect: "sales_by_month",
|
|
67
|
-
},
|
|
68
|
-
// Token-gap cases: no word here appears in the entity's name or #(doc)
|
|
69
|
-
// text, so a token-based index misses them; embeddings should not.
|
|
70
|
-
{
|
|
71
|
-
env: "examples",
|
|
72
|
-
pkg: "storefront",
|
|
73
|
-
query: "how much money did we make",
|
|
74
|
-
expect: "total_sales",
|
|
75
|
-
gap: true,
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
env: "examples",
|
|
79
|
-
pkg: "storefront",
|
|
80
|
-
query: "refund percentage",
|
|
81
|
-
expect: "return_rate",
|
|
82
|
-
gap: true,
|
|
83
|
-
},
|
|
84
|
-
// malloy-samples (needs a config serving them as environment "samples").
|
|
85
|
-
{
|
|
86
|
-
env: "samples",
|
|
87
|
-
pkg: "ecommerce",
|
|
88
|
-
query: "revenue by product category",
|
|
89
|
-
expect: "category",
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
env: "samples",
|
|
93
|
-
pkg: "ecommerce",
|
|
94
|
-
query: "total sales revenue",
|
|
95
|
-
expect: "total_sales",
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
env: "samples",
|
|
99
|
-
pkg: "ecommerce",
|
|
100
|
-
query: "customer state location",
|
|
101
|
-
expect: "state",
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
env: "samples",
|
|
105
|
-
pkg: "ecommerce",
|
|
106
|
-
query: "order count",
|
|
107
|
-
expect: "order_count",
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
env: "samples",
|
|
111
|
-
pkg: "ecommerce",
|
|
112
|
-
query: "product brand",
|
|
113
|
-
expect: "brand",
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
env: "samples",
|
|
117
|
-
pkg: "faa",
|
|
118
|
-
query: "flights by carrier",
|
|
119
|
-
expect: "carrier",
|
|
120
|
-
},
|
|
121
|
-
{ env: "samples", pkg: "faa", query: "airport", expect: "airport" },
|
|
122
|
-
{ env: "samples", pkg: "faa", query: "aircraft model", expect: "aircraft" },
|
|
123
|
-
// The original lexical-gap case: the field is "dep_delay", which shares
|
|
124
|
-
// no tokens with "departure delay".
|
|
125
|
-
{
|
|
126
|
-
env: "samples",
|
|
127
|
-
pkg: "faa",
|
|
128
|
-
query: "departure delay",
|
|
129
|
-
expect: "delay",
|
|
130
|
-
gap: true,
|
|
131
|
-
},
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
const ENDPOINT = process.env.MCP_URL || "http://localhost:4040/mcp";
|
|
135
|
-
const K = Number(process.argv[2] || 5);
|
|
136
|
-
const WARMUP_ATTEMPTS = 15;
|
|
137
|
-
const WARMUP_DELAY_MS = 2_000;
|
|
138
|
-
|
|
139
|
-
async function callGetContext(
|
|
140
|
-
args: Record<string, unknown>,
|
|
141
|
-
): Promise<GetContextPayload> {
|
|
142
|
-
const res = await fetch(ENDPOINT, {
|
|
143
|
-
method: "POST",
|
|
144
|
-
headers: {
|
|
145
|
-
"Content-Type": "application/json",
|
|
146
|
-
Accept: "application/json, text/event-stream",
|
|
147
|
-
},
|
|
148
|
-
body: JSON.stringify({
|
|
149
|
-
jsonrpc: "2.0",
|
|
150
|
-
id: 1,
|
|
151
|
-
method: "tools/call",
|
|
152
|
-
params: { name: "malloy_getContext", arguments: args },
|
|
153
|
-
}),
|
|
154
|
-
});
|
|
155
|
-
const text = await res.text();
|
|
156
|
-
const dataLine = text.split("\n").find((l) => l.startsWith("data: "));
|
|
157
|
-
if (!dataLine) return { results: [] };
|
|
158
|
-
const msg = JSON.parse(dataLine.slice(6)) as {
|
|
159
|
-
result?: { content?: { resource?: { text?: string } }[] };
|
|
160
|
-
};
|
|
161
|
-
const payloadText = msg.result?.content?.[0]?.resource?.text;
|
|
162
|
-
if (!payloadText) return { results: [] };
|
|
163
|
-
return JSON.parse(payloadText) as GetContextPayload;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/** True when the environment exists on the server (tier-2 listing works). */
|
|
167
|
-
async function environmentServed(env: string): Promise<boolean> {
|
|
168
|
-
const payload = await callGetContext({ environmentName: env });
|
|
169
|
-
return payload.error === undefined;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* On a semantic-capable server the first query against a package kicks off
|
|
174
|
-
* the embedding sync and answers lexically; poll until the mode flips (or
|
|
175
|
-
* give up and report whatever mode the server settles on).
|
|
176
|
-
*/
|
|
177
|
-
async function warmUp(env: string, pkg: string): Promise<string | undefined> {
|
|
178
|
-
let mode: string | undefined;
|
|
179
|
-
for (let attempt = 0; attempt < WARMUP_ATTEMPTS; attempt++) {
|
|
180
|
-
const payload = await callGetContext({
|
|
181
|
-
environmentName: env,
|
|
182
|
-
packageName: pkg,
|
|
183
|
-
query: "warm up",
|
|
184
|
-
limit: 1,
|
|
185
|
-
});
|
|
186
|
-
mode = payload.retrieval;
|
|
187
|
-
// No marker: the server has no embedding provider configured, so
|
|
188
|
-
// there is nothing to warm up.
|
|
189
|
-
if (mode === undefined || mode === "semantic") return mode;
|
|
190
|
-
await new Promise((resolve) => setTimeout(resolve, WARMUP_DELAY_MS));
|
|
191
|
-
}
|
|
192
|
-
return mode;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async function main(): Promise<void> {
|
|
196
|
-
console.log(
|
|
197
|
-
`get_context retrieval eval, recall@${K} (endpoint ${ENDPOINT})\n`,
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
const servedEnvs = new Map<string, boolean>();
|
|
201
|
-
for (const env of new Set(CASES.map((c) => c.env))) {
|
|
202
|
-
servedEnvs.set(env, await environmentServed(env));
|
|
203
|
-
}
|
|
204
|
-
for (const [env, served] of servedEnvs) {
|
|
205
|
-
if (!served) {
|
|
206
|
-
console.log(
|
|
207
|
-
` [SKIP] environment "${env}" is not served; skipping its cases`,
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const warmed = new Set<string>();
|
|
213
|
-
let hits = 0;
|
|
214
|
-
let scored = 0;
|
|
215
|
-
const modesSeen = new Set<string>();
|
|
216
|
-
|
|
217
|
-
for (const c of CASES) {
|
|
218
|
-
if (!servedEnvs.get(c.env)) continue;
|
|
219
|
-
|
|
220
|
-
const pkgKey = `${c.env}/${c.pkg}`;
|
|
221
|
-
if (!warmed.has(pkgKey)) {
|
|
222
|
-
warmed.add(pkgKey);
|
|
223
|
-
await warmUp(c.env, c.pkg);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const payload = await callGetContext({
|
|
227
|
-
environmentName: c.env,
|
|
228
|
-
packageName: c.pkg,
|
|
229
|
-
query: c.query,
|
|
230
|
-
limit: K,
|
|
231
|
-
});
|
|
232
|
-
const results = payload.results ?? [];
|
|
233
|
-
const mode = payload.retrieval ?? "lexical (no provider)";
|
|
234
|
-
modesSeen.add(mode);
|
|
235
|
-
|
|
236
|
-
scored++;
|
|
237
|
-
const rank = results.findIndex((r) =>
|
|
238
|
-
r.name.toLowerCase().includes(c.expect.toLowerCase()),
|
|
239
|
-
);
|
|
240
|
-
const hit = rank >= 0;
|
|
241
|
-
if (hit) hits++;
|
|
242
|
-
const top =
|
|
243
|
-
results
|
|
244
|
-
.slice(0, 3)
|
|
245
|
-
.map((r) => `${r.kind}:${r.name}`)
|
|
246
|
-
.join(", ") || "(none)";
|
|
247
|
-
const tag = hit ? `HIT@${rank + 1}` : "MISS ";
|
|
248
|
-
const gap = c.gap ? " [gap]" : "";
|
|
249
|
-
console.log(
|
|
250
|
-
` [${tag}] [${mode}] ${c.env}/${c.pkg} / "${c.query}" (want ~${c.expect})${gap}`,
|
|
251
|
-
);
|
|
252
|
-
console.log(` top: ${top}`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
if (scored === 0) {
|
|
256
|
-
console.log("\nNo cases ran: no listed environment is served.");
|
|
257
|
-
process.exit(1);
|
|
258
|
-
}
|
|
259
|
-
const pct = ((hits / scored) * 100).toFixed(0);
|
|
260
|
-
console.log(
|
|
261
|
-
`\nrecall@${K}: ${hits}/${scored} (${pct}%) mode(s): ${[...modesSeen].join(", ")}`,
|
|
262
|
-
);
|
|
263
|
-
console.log(
|
|
264
|
-
"The [gap] cases share no tokens with their target entity, so a lexical",
|
|
265
|
-
);
|
|
266
|
-
console.log(
|
|
267
|
-
"run misses them by construction; a semantic run (EMBEDDING_API_KEY set)",
|
|
268
|
-
);
|
|
269
|
-
console.log("is expected to close them. Compare the two summaries.");
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
main().catch((err) => {
|
|
273
|
-
console.error(err);
|
|
274
|
-
process.exit(1);
|
|
275
|
-
});
|