@honua/mcp-server 0.0.20-alpha.0 → 0.1.1-beta.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/README.md +141 -15
- package/certification/geospatial-mcp-schemas/PROVENANCE.md +15 -7
- package/certification/geospatial-mcp-schemas/conformance/manifest.schema.json +6 -0
- package/certification/geospatial-mcp-schemas/index.json +88 -9
- package/certification/geospatial-mcp-schemas/tools/apply_style_preset.schema.json +13 -9
- package/certification/geospatial-mcp-schemas/tools/buffer_features.schema.json +60 -0
- package/certification/geospatial-mcp-schemas/tools/edit_features.schema.json +74 -0
- package/certification/geospatial-mcp-schemas/tools/export_dataset.schema.json +60 -0
- package/certification/geospatial-mcp-schemas/tools/geocode_addresses.schema.json +34 -0
- package/certification/geospatial-mcp-schemas/tools/get_style.schema.json +13 -3
- package/certification/geospatial-mcp-schemas/tools/ingest_dataset.schema.json +45 -0
- package/certification/geospatial-mcp-schemas/tools/join_features.schema.json +73 -0
- package/certification/geospatial-mcp-schemas/tools/overlay_features.schema.json +53 -0
- package/certification/geospatial-mcp-schemas/tools/query_features.schema.json +20 -0
- package/certification/geospatial-mcp-schemas/tools/render_map.schema.json +5 -0
- package/certification/geospatial-mcp-schemas/tools/reproject_features.schema.json +49 -0
- package/certification/geospatial-mcp-schemas/tools/summarize_statistics.schema.json +71 -0
- package/dist/src/agent-execution.d.ts +16 -0
- package/dist/src/agent-execution.d.ts.map +1 -0
- package/dist/src/agent-execution.js +46 -0
- package/dist/src/capability.d.ts +48 -0
- package/dist/src/capability.d.ts.map +1 -0
- package/dist/src/capability.js +44 -0
- package/dist/src/certification/census-data.d.ts +33 -0
- package/dist/src/certification/census-data.d.ts.map +1 -0
- package/dist/src/certification/census-data.js +506 -0
- package/dist/src/certification/census-fixture-client.d.ts +7 -0
- package/dist/src/certification/census-fixture-client.d.ts.map +1 -0
- package/dist/src/certification/census-fixture-client.js +226 -0
- package/dist/src/certification/certifier.d.ts +7 -1
- package/dist/src/certification/certifier.d.ts.map +1 -1
- package/dist/src/certification/certifier.js +52 -7
- package/dist/src/certification/cli.js +19 -4
- package/dist/src/certification/contracts.d.ts +41 -0
- package/dist/src/certification/contracts.d.ts.map +1 -1
- package/dist/src/certification/contracts.js +71 -0
- package/dist/src/certification/fixture-client.d.ts.map +1 -1
- package/dist/src/certification/fixtures.d.ts +13 -0
- package/dist/src/certification/fixtures.d.ts.map +1 -1
- package/dist/src/certification/fixtures.js +28 -0
- package/dist/src/certification/json-schema.d.ts +23 -1
- package/dist/src/certification/json-schema.d.ts.map +1 -1
- package/dist/src/certification/json-schema.js +10 -2
- package/dist/src/certification/lifecycle.d.ts +14 -0
- package/dist/src/certification/lifecycle.d.ts.map +1 -0
- package/dist/src/certification/lifecycle.js +326 -0
- package/dist/src/certification/operator-catalog.d.ts +8 -0
- package/dist/src/certification/operator-catalog.d.ts.map +1 -1
- package/dist/src/certification/operator-catalog.js +189 -5
- package/dist/src/certification/report.d.ts.map +1 -1
- package/dist/src/certification/report.js +13 -0
- package/dist/src/certification/run.d.ts.map +1 -1
- package/dist/src/certification/run.js +1 -0
- package/dist/src/certification/schema-index.d.ts +25 -0
- package/dist/src/certification/schema-index.d.ts.map +1 -1
- package/dist/src/certification/schema-index.js +27 -0
- package/dist/src/certification/target.d.ts +9 -1
- package/dist/src/certification/target.d.ts.map +1 -1
- package/dist/src/certification/target.js +54 -2
- package/dist/src/eval/cli.js +4 -2
- package/dist/src/eval/corpus.d.ts +7 -0
- package/dist/src/eval/corpus.d.ts.map +1 -1
- package/dist/src/eval/corpus.js +16 -0
- package/dist/src/eval/drivers/deterministic.d.ts.map +1 -1
- package/dist/src/eval/drivers/deterministic.js +13 -0
- package/dist/src/eval/grade.d.ts.map +1 -1
- package/dist/src/eval/grade.js +20 -1
- package/dist/src/eval/report.d.ts +5 -0
- package/dist/src/eval/report.d.ts.map +1 -1
- package/dist/src/eval/report.js +3 -0
- package/dist/src/eval/runner.d.ts +6 -0
- package/dist/src/eval/runner.d.ts.map +1 -1
- package/dist/src/eval/runner.js +21 -7
- package/dist/src/eval/standalone-corpus.d.ts +3 -0
- package/dist/src/eval/standalone-corpus.d.ts.map +1 -0
- package/dist/src/eval/standalone-corpus.js +699 -0
- package/dist/src/eval/types.d.ts +25 -0
- package/dist/src/eval/types.d.ts.map +1 -1
- package/dist/src/helpers.d.ts +1 -1
- package/dist/src/helpers.d.ts.map +1 -1
- package/dist/src/index.d.ts +37 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +47 -22
- package/dist/src/nl-map-control.d.ts +70 -0
- package/dist/src/nl-map-control.d.ts.map +1 -0
- package/dist/src/nl-map-control.js +470 -0
- package/dist/src/provenance.d.ts +44 -0
- package/dist/src/provenance.d.ts.map +1 -0
- package/dist/src/provenance.js +37 -0
- package/dist/src/resources/styles.d.ts.map +1 -1
- package/dist/src/resources/styles.js +36 -3
- package/dist/src/stable-json.d.ts +14 -0
- package/dist/src/stable-json.d.ts.map +1 -0
- package/dist/src/stable-json.js +126 -0
- package/dist/src/styles.d.ts +2 -0
- package/dist/src/styles.d.ts.map +1 -1
- package/dist/src/styles.js +29 -3
- package/dist/src/tools/apply-style-preset.d.ts.map +1 -1
- package/dist/src/tools/apply-style-preset.js +14 -2
- package/dist/src/tools/explain-capability-gap.d.ts +3 -3
- package/dist/src/tools/explain-capability-gap.d.ts.map +1 -1
- package/dist/src/tools/explain-capability-gap.js +1 -1
- package/dist/src/tools/get-style.d.ts.map +1 -1
- package/dist/src/tools/get-style.js +24 -13
- package/dist/src/tools/list-services.d.ts.map +1 -1
- package/dist/src/tools/list-services.js +16 -1
- package/package.json +27 -2
package/dist/src/eval/grade.js
CHANGED
|
@@ -23,16 +23,24 @@ export function grade(scenario, transcript) {
|
|
|
23
23
|
modelId: transcript.modelId,
|
|
24
24
|
errorCount: transcript.errorCount,
|
|
25
25
|
};
|
|
26
|
+
const { criteria } = scenario;
|
|
26
27
|
if (transcript.driverError) {
|
|
27
28
|
return { ...base, outcome: "error", violations: [transcript.driverError] };
|
|
28
29
|
}
|
|
29
30
|
if (transcript.clarificationRequested) {
|
|
31
|
+
// For an ambiguity/refusal scenario, clarifying IS the correct behavior.
|
|
32
|
+
if (criteria.expectClarification) {
|
|
33
|
+
return { ...base, outcome: "pass", violations: [] };
|
|
34
|
+
}
|
|
30
35
|
return { ...base, outcome: "clarified", violations: ["driver requested clarification"] };
|
|
31
36
|
}
|
|
37
|
+
if (criteria.expectClarification) {
|
|
38
|
+
// The prompt was ambiguous/unsupported but the driver answered anyway.
|
|
39
|
+
return { ...base, outcome: "fail", violations: ["expected a clarifying question but the driver completed"] };
|
|
40
|
+
}
|
|
32
41
|
const violations = [];
|
|
33
42
|
const calledTools = transcript.steps.map((s) => s.tool);
|
|
34
43
|
const calledSet = new Set(calledTools);
|
|
35
|
-
const { criteria } = scenario;
|
|
36
44
|
for (const required of criteria.requiredTools) {
|
|
37
45
|
if (!calledSet.has(required)) {
|
|
38
46
|
violations.push(`required tool not called: ${required}`);
|
|
@@ -52,5 +60,16 @@ export function grade(scenario, transcript) {
|
|
|
52
60
|
violations.push(`answer missing expected content: "${fragment}"`);
|
|
53
61
|
}
|
|
54
62
|
}
|
|
63
|
+
// Semantic assertions (issue #369): meaning, not just trajectory.
|
|
64
|
+
for (const fragment of criteria.answerMustNotInclude ?? []) {
|
|
65
|
+
if (answer.includes(fragment.toLowerCase())) {
|
|
66
|
+
violations.push(`answer contains forbidden content: "${fragment}"`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const pattern of criteria.answerMustMatch ?? []) {
|
|
70
|
+
if (!new RegExp(pattern, "i").test(transcript.finalAnswer)) {
|
|
71
|
+
violations.push(`answer did not match required pattern: /${pattern}/i`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
55
74
|
return { ...base, outcome: violations.length === 0 ? "pass" : "fail", violations };
|
|
56
75
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SuiteProvenance } from "../provenance.js";
|
|
1
2
|
import type { ModelDriver, Scenario, ScenarioGrade, WorkflowTranscript } from "./types.js";
|
|
2
3
|
/** One graded (model, scenario) result plus a compact transcript view. */
|
|
3
4
|
export interface EvalResult {
|
|
@@ -52,6 +53,8 @@ export interface ModelScorecard {
|
|
|
52
53
|
export interface EvalReport {
|
|
53
54
|
schemaVersion: 4;
|
|
54
55
|
generatedAt: string;
|
|
56
|
+
/** Self-proving provenance: target, protocol, tool count, auth, suite git SHA. */
|
|
57
|
+
provenance: SuiteProvenance;
|
|
55
58
|
surface: {
|
|
56
59
|
backend: "fixture" | "live";
|
|
57
60
|
mcpTransport: string;
|
|
@@ -89,6 +92,8 @@ export interface AssembleInput {
|
|
|
89
92
|
mcpTransport: string;
|
|
90
93
|
remoteUrl?: string | undefined;
|
|
91
94
|
auth: AuthMode;
|
|
95
|
+
/** Reproducibility fingerprint attached to the artifact (A5 provability). */
|
|
96
|
+
provenance: SuiteProvenance;
|
|
92
97
|
/** Tool names advertised by the live `tools/list` (for the catalog audit). */
|
|
93
98
|
advertisedTools: string[];
|
|
94
99
|
corpus: Scenario[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/eval/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3F,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnE,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,6EAA6E;QAC7E,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7C;;;;;OAKG;IACH,OAAO,EAAE;QACP,mBAAmB,EAAE,MAAM,CAAC;QAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,uBAAuB,EAAE,MAAM,EAAE,CAAC;KACnC,CAAC;IACF,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,8EAA8E;QAC9E,IAAI,EAAE,OAAO,CAAC;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAE,EAAE,CAAC;CACpE;AAaD,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/eval/report.ts"],"names":[],"mappings":"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"}
|
package/dist/src/eval/report.js
CHANGED
|
@@ -58,6 +58,7 @@ export function assembleReport(input) {
|
|
|
58
58
|
return {
|
|
59
59
|
schemaVersion: 4,
|
|
60
60
|
generatedAt: new Date().toISOString(),
|
|
61
|
+
provenance: input.provenance,
|
|
61
62
|
surface: {
|
|
62
63
|
backend: input.backend,
|
|
63
64
|
mcpTransport: input.mcpTransport,
|
|
@@ -91,6 +92,8 @@ export function renderMarkdown(report) {
|
|
|
91
92
|
lines.push(`- Generated: \`${report.generatedAt}\``);
|
|
92
93
|
lines.push(`- MCP surface: \`${report.surface.backend}\` (transport: \`${report.surface.mcpTransport}\`${report.surface.remoteUrl ? `, remote: \`${report.surface.remoteUrl}\`` : ""})`);
|
|
93
94
|
lines.push(`- Auth mode: \`${report.surface.auth}\``);
|
|
95
|
+
lines.push(`- Negotiated protocol: \`${report.provenance.protocolVersion ?? "n/a"}\``);
|
|
96
|
+
lines.push(`- Suite git SHA: \`${report.provenance.suiteGitSha}\` (${report.provenance.suiteGitShaSource})`);
|
|
94
97
|
lines.push(`- Corpus: ${report.corpus.scenarios} GIS workflows`);
|
|
95
98
|
lines.push(`- Live models evaluated: ${report.summary.liveModelsEvaluated}`);
|
|
96
99
|
const unresolved = report.catalog.unresolvedRequiredTools;
|
|
@@ -17,6 +17,12 @@ export interface RunEvalOptions {
|
|
|
17
17
|
corpus?: Scenario[];
|
|
18
18
|
/** Force the in-memory fixture surface even if HONUA_MCP_REMOTE_URL is set. */
|
|
19
19
|
forceOffline?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Use the PLATFORM-FREE standalone fixture surface (a plain public FeatureServer,
|
|
22
|
+
* recorded census layer) instead of the Honua operator fixture. Implies offline.
|
|
23
|
+
* Defaults to true when `HONUA_EVAL_CORPUS=standalone`.
|
|
24
|
+
*/
|
|
25
|
+
forceStandaloneSurface?: boolean;
|
|
20
26
|
}
|
|
21
27
|
export declare function runEval(options?: RunEvalOptions): Promise<EvalReport>;
|
|
22
28
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/eval/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/eval/runner.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAmC,MAAM,YAAY,CAAC;AAEzF;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AA+FD,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiD/E"}
|
package/dist/src/eval/runner.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
2
|
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
3
|
+
import { createStandaloneFixtureClient } from "../certification/census-fixture-client.js";
|
|
3
4
|
import { createFixtureClient } from "../certification/fixture-client.js";
|
|
4
5
|
import { createServer } from "../index.js";
|
|
6
|
+
import { readNegotiatedProtocolVersion, resolveSuiteGitSha } from "../provenance.js";
|
|
5
7
|
import { connectUpstream, resolveProxyOptions } from "../proxy.js";
|
|
6
|
-
import { resolveCorpus } from "./corpus.js";
|
|
8
|
+
import { isStandaloneCorpus, resolveCorpus } from "./corpus.js";
|
|
7
9
|
import { resolveDrivers } from "./drivers/index.js";
|
|
8
10
|
import { grade } from "./grade.js";
|
|
9
11
|
import { assembleReport } from "./report.js";
|
|
@@ -15,8 +17,8 @@ function isTruthy(value) {
|
|
|
15
17
|
const v = value.trim().toLowerCase();
|
|
16
18
|
return v.length > 0 && v !== "0" && v !== "false" && v !== "no" && v !== "off";
|
|
17
19
|
}
|
|
18
|
-
async function connectSurface(env, forceOffline) {
|
|
19
|
-
const live = !forceOffline && typeof env.HONUA_MCP_REMOTE_URL === "string" && env.HONUA_MCP_REMOTE_URL.length > 0;
|
|
20
|
+
async function connectSurface(env, forceOffline, standalone) {
|
|
21
|
+
const live = !forceOffline && !standalone && typeof env.HONUA_MCP_REMOTE_URL === "string" && env.HONUA_MCP_REMOTE_URL.length > 0;
|
|
20
22
|
if (live) {
|
|
21
23
|
const options = resolveProxyOptions(env);
|
|
22
24
|
// The live lane authenticates via the proxy's real credential headers — no
|
|
@@ -39,7 +41,8 @@ async function connectSurface(env, forceOffline) {
|
|
|
39
41
|
},
|
|
40
42
|
};
|
|
41
43
|
}
|
|
42
|
-
const
|
|
44
|
+
const fixtureClient = standalone ? createStandaloneFixtureClient() : createFixtureClient();
|
|
45
|
+
const server = createServer(fixtureClient);
|
|
43
46
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
44
47
|
const client = new Client({ name: "honua-mcp-eval", version: "1.0.0" });
|
|
45
48
|
await server.connect(serverTransport);
|
|
@@ -47,7 +50,7 @@ async function connectSurface(env, forceOffline) {
|
|
|
47
50
|
return {
|
|
48
51
|
client,
|
|
49
52
|
backend: "fixture",
|
|
50
|
-
mcpTransport: "in-memory",
|
|
53
|
+
mcpTransport: standalone ? "in-memory (standalone FeatureServer fixture)" : "in-memory",
|
|
51
54
|
auth: "none",
|
|
52
55
|
close: async () => {
|
|
53
56
|
await client.close().catch(() => { });
|
|
@@ -82,8 +85,9 @@ export async function runEval(options = {}) {
|
|
|
82
85
|
const env = options.env ?? process.env;
|
|
83
86
|
const corpus = options.corpus ?? resolveCorpus(env);
|
|
84
87
|
const drivers = options.drivers ?? resolveDrivers({ env });
|
|
85
|
-
const
|
|
86
|
-
const
|
|
88
|
+
const standalone = options.forceStandaloneSurface ?? isStandaloneCorpus(env);
|
|
89
|
+
const forceOffline = options.forceOffline ?? standalone;
|
|
90
|
+
const surface = await connectSurface(env, forceOffline, standalone);
|
|
87
91
|
try {
|
|
88
92
|
const listed = await surface.client.listTools();
|
|
89
93
|
const tools = listed.tools.map((t) => ({
|
|
@@ -99,11 +103,21 @@ export async function runEval(options = {}) {
|
|
|
99
103
|
graded.push({ grade: grade(scenario, transcript), transcript });
|
|
100
104
|
}
|
|
101
105
|
}
|
|
106
|
+
const gitSha = resolveSuiteGitSha(env);
|
|
107
|
+
const provenance = {
|
|
108
|
+
suiteGitSha: gitSha.sha,
|
|
109
|
+
suiteGitShaSource: gitSha.source,
|
|
110
|
+
targetUrl: surface.remoteUrl ?? `${surface.backend} (${surface.mcpTransport})`,
|
|
111
|
+
protocolVersion: readNegotiatedProtocolVersion(surface.client),
|
|
112
|
+
toolCount: tools.length,
|
|
113
|
+
authMode: surface.auth,
|
|
114
|
+
};
|
|
102
115
|
return assembleReport({
|
|
103
116
|
backend: surface.backend,
|
|
104
117
|
mcpTransport: surface.mcpTransport,
|
|
105
118
|
remoteUrl: surface.remoteUrl,
|
|
106
119
|
auth: surface.auth,
|
|
120
|
+
provenance,
|
|
107
121
|
advertisedTools: tools.map((t) => t.name),
|
|
108
122
|
corpus,
|
|
109
123
|
drivers,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-corpus.d.ts","sourceRoot":"","sources":["../../../src/eval/standalone-corpus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgC3C,eAAO,MAAM,iBAAiB,EAAE,QAAQ,EA2qBvC,CAAC"}
|