@skybridge/test 0.0.0-dev.0fa5252 → 0.0.0-dev.2cdace2
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 +46 -4
- package/dist/chat.d.ts +6 -25
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +34 -10
- package/dist/chat.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/session-registry.d.ts +8 -4
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +15 -15
- package/dist/session-registry.js.map +1 -1
- package/package.json +6 -13
- package/dist/config.d.ts +0 -13
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -2
- package/dist/config.js.map +0 -1
- package/dist/global-setup.d.ts +0 -3
- package/dist/global-setup.d.ts.map +0 -1
- package/dist/global-setup.js +0 -22
- package/dist/global-setup.js.map +0 -1
- package/dist/matchers.d.ts +0 -21
- package/dist/matchers.d.ts.map +0 -1
- package/dist/matchers.js +0 -66
- package/dist/matchers.js.map +0 -1
- package/dist/model.d.ts +0 -9
- package/dist/model.d.ts.map +0 -1
- package/dist/model.js +0 -28
- package/dist/model.js.map +0 -1
- package/dist/plugin.d.ts +0 -10
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -32
- package/dist/plugin.js.map +0 -1
- package/dist/server-harness.d.ts +0 -19
- package/dist/server-harness.d.ts.map +0 -1
- package/dist/server-harness.js +0 -78
- package/dist/server-harness.js.map +0 -1
- package/dist/setup.d.ts +0 -2
- package/dist/setup.d.ts.map +0 -1
- package/dist/setup.js +0 -7
- package/dist/setup.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,19 +4,17 @@ Evals for [Skybridge](https://skybridge.tech) MCP apps: they answer whether a
|
|
|
4
4
|
prompt reaches the right tool with the right arguments, which no unit test can
|
|
5
5
|
check.
|
|
6
6
|
|
|
7
|
-
**Beta.** The API is still settling, so it publishes under the `beta`
|
|
8
|
-
dist-tag and may change between releases.
|
|
9
|
-
|
|
10
7
|
Add the `evals` option to the Skybridge Vite plugin, then write scenarios with
|
|
11
8
|
vitest's own `it` and `expect`.
|
|
12
9
|
|
|
13
10
|
```ts
|
|
11
|
+
import { anthropic } from "@ai-sdk/anthropic";
|
|
14
12
|
import { expect, it } from "vitest";
|
|
15
13
|
import { start } from "@skybridge/test";
|
|
16
14
|
import type { AppType } from "../src/server.js";
|
|
17
15
|
|
|
18
16
|
it("finds products by category", async () => {
|
|
19
|
-
const chat = await start<AppType>();
|
|
17
|
+
const chat = await start<AppType>({ model: anthropic("claude-sonnet-4-5") });
|
|
20
18
|
await chat.send("I am looking for ski goggles");
|
|
21
19
|
|
|
22
20
|
expect.chat(chat).toHaveCalledToolWith("search-products", {
|
|
@@ -25,5 +23,49 @@ it("finds products by category", async () => {
|
|
|
25
23
|
});
|
|
26
24
|
```
|
|
27
25
|
|
|
26
|
+
## Choosing a model
|
|
27
|
+
|
|
28
|
+
`start` takes any AI SDK model instance, so the provider and its credentials
|
|
29
|
+
are the project's own. Install the provider package you want alongside `ai`.
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { anthropic } from "@ai-sdk/anthropic";
|
|
33
|
+
import { start } from "@skybridge/test";
|
|
34
|
+
|
|
35
|
+
const chat = await start<AppType>({ model: anthropic("claude-sonnet-4-5") });
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
A local runtime or a company gateway works the same way, through the AI SDK's
|
|
39
|
+
own `createOpenAICompatible` or `customProvider`.
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
43
|
+
|
|
44
|
+
const ollama = createOpenAICompatible({
|
|
45
|
+
name: "ollama",
|
|
46
|
+
baseURL: "http://localhost:11434/v1",
|
|
47
|
+
});
|
|
48
|
+
const chat = await start<AppType>({ model: ollama("llama3.1") });
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Booting the server
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
skybridge({
|
|
55
|
+
evals: { project: { cwd: ".", command: ["node", "dist/server.js"] } },
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`command` has to start the server process directly, since wrappers such as
|
|
60
|
+
`pnpm run` do not forward the channel the runner uses to learn the port.
|
|
61
|
+
|
|
62
|
+
Assertions on what the assistant said work the same way, though model prose
|
|
63
|
+
varies between runs, so keep them loose.
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
expect.chat(chat).toHaveSaid("in stock");
|
|
67
|
+
expect.chat(chat).not.toHaveSaid("refund");
|
|
68
|
+
```
|
|
69
|
+
|
|
28
70
|
See the [documentation](https://docs.skybridge.tech) for setup and the full
|
|
29
71
|
matcher list.
|
package/dist/chat.d.ts
CHANGED
|
@@ -1,32 +1,11 @@
|
|
|
1
|
+
import type { ToolCall } from "@skybridge/vite-plugin/evals";
|
|
1
2
|
import { type LanguageModel } from "ai";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* One recorded call, typed against the project's own registry: `name` is a
|
|
5
|
-
* union of the project's tool names and `arguments` is discriminated on it.
|
|
6
|
-
*/
|
|
7
|
-
export type ToolCall<App> = {
|
|
8
|
-
[Name in ToolNames<App>]: {
|
|
9
|
-
name: Name;
|
|
10
|
-
arguments: ToolInput<App, Name>;
|
|
11
|
-
invalid?: boolean;
|
|
12
|
-
};
|
|
13
|
-
}[ToolNames<App>];
|
|
14
|
-
/**
|
|
15
|
-
* How the host is configured. `model` is an AI SDK model instance, so the
|
|
16
|
-
* provider and its credentials are chosen by the project rather than by a
|
|
17
|
-
* base URL the runner has to know about.
|
|
18
|
-
*/
|
|
19
|
-
export interface HostConfig {
|
|
3
|
+
interface HostConfig {
|
|
20
4
|
model: LanguageModel;
|
|
21
5
|
temperature?: number;
|
|
22
6
|
systemPrompt?: string;
|
|
23
7
|
maxSteps?: number;
|
|
24
8
|
}
|
|
25
|
-
interface McpToolDefinition {
|
|
26
|
-
name: string;
|
|
27
|
-
description?: string;
|
|
28
|
-
inputSchema: Record<string, unknown>;
|
|
29
|
-
}
|
|
30
9
|
/**
|
|
31
10
|
* One conversation against one MCP session. A scenario asserts on
|
|
32
11
|
* {@link Chat.toolCalls}, the sequence of calls the model made.
|
|
@@ -34,18 +13,20 @@ interface McpToolDefinition {
|
|
|
34
13
|
export declare class Chat<App = unknown> {
|
|
35
14
|
/** Every call the model made, in order, as it crossed the wire. */
|
|
36
15
|
readonly toolCalls: ToolCall<App>[];
|
|
16
|
+
/** What the assistant said, one entry per turn, intermediate ones included. */
|
|
17
|
+
readonly assistantTurns: string[];
|
|
37
18
|
private readonly messages;
|
|
19
|
+
private readonly failures;
|
|
38
20
|
private readonly client;
|
|
39
21
|
private readonly transport;
|
|
40
22
|
private readonly host;
|
|
41
23
|
private tools;
|
|
42
24
|
private constructor();
|
|
43
25
|
static open<App>(serverUrl: string, host: HostConfig): Promise<Chat<App>>;
|
|
44
|
-
/** The tool definitions the model was looking at, for failure reports. */
|
|
45
|
-
get toolDefinitions(): McpToolDefinition[];
|
|
46
26
|
/** Takes a turn and returns the model's answer. */
|
|
47
27
|
send(prompt: string): Promise<string>;
|
|
48
28
|
close(): Promise<void>;
|
|
29
|
+
private failureFor;
|
|
49
30
|
private toolSet;
|
|
50
31
|
}
|
|
51
32
|
export {};
|
package/dist/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAIL,KAAK,aAAa,EAGnB,MAAM,IAAI,CAAC;AAEZ,UAAU,UAAU;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,qBAAa,IAAI,CAAC,GAAG,GAAG,OAAO;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAM;IAEzC,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAM;IAEvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,KAAK,CAAc;IAE3B,OAAO;WAUM,IAAI,CAAC,GAAG,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAerB,mDAAmD;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,OAAO;CAmChB"}
|
package/dist/chat.js
CHANGED
|
@@ -9,7 +9,10 @@ const DEFAULT_MAX_STEPS = 8;
|
|
|
9
9
|
export class Chat {
|
|
10
10
|
/** Every call the model made, in order, as it crossed the wire. */
|
|
11
11
|
toolCalls = [];
|
|
12
|
+
/** What the assistant said, one entry per turn, intermediate ones included. */
|
|
13
|
+
assistantTurns = [];
|
|
12
14
|
messages = [];
|
|
15
|
+
failures = new Map();
|
|
13
16
|
client;
|
|
14
17
|
transport;
|
|
15
18
|
host;
|
|
@@ -34,10 +37,6 @@ export class Chat {
|
|
|
34
37
|
}
|
|
35
38
|
return chat;
|
|
36
39
|
}
|
|
37
|
-
/** The tool definitions the model was looking at, for failure reports. */
|
|
38
|
-
get toolDefinitions() {
|
|
39
|
-
return this.tools;
|
|
40
|
-
}
|
|
41
40
|
/** Takes a turn and returns the model's answer. */
|
|
42
41
|
async send(prompt) {
|
|
43
42
|
this.messages.push({ role: "user", content: prompt });
|
|
@@ -56,16 +55,31 @@ export class Chat {
|
|
|
56
55
|
this.toolCalls.push({
|
|
57
56
|
name: call.toolName,
|
|
58
57
|
arguments: (call.input ?? {}),
|
|
59
|
-
...(call
|
|
58
|
+
...this.failureFor(call),
|
|
60
59
|
});
|
|
61
60
|
}
|
|
62
61
|
}
|
|
62
|
+
for (const step of result.steps) {
|
|
63
|
+
if (step.text !== "") {
|
|
64
|
+
this.assistantTurns.push(step.text);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
63
67
|
this.messages.push(...result.response.messages);
|
|
64
68
|
return result.text;
|
|
65
69
|
}
|
|
66
70
|
async close() {
|
|
67
71
|
await this.transport.close();
|
|
68
72
|
}
|
|
73
|
+
failureFor(call) {
|
|
74
|
+
const reported = this.failures.get(call.toolCallId);
|
|
75
|
+
if (reported !== undefined) {
|
|
76
|
+
return { failed: reported };
|
|
77
|
+
}
|
|
78
|
+
if (call.invalid === true) {
|
|
79
|
+
return { failed: "the model's arguments could not be parsed" };
|
|
80
|
+
}
|
|
81
|
+
return {};
|
|
82
|
+
}
|
|
69
83
|
toolSet() {
|
|
70
84
|
const entries = this.tools.map((definition) => {
|
|
71
85
|
const { $schema: _ignored, ...parameters } = definition.inputSchema;
|
|
@@ -74,11 +88,21 @@ export class Chat {
|
|
|
74
88
|
dynamicTool({
|
|
75
89
|
description: definition.description ?? "",
|
|
76
90
|
inputSchema: jsonSchema(parameters),
|
|
77
|
-
execute: async (input) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
execute: async (input, { toolCallId }) => {
|
|
92
|
+
let result;
|
|
93
|
+
try {
|
|
94
|
+
result = await this.client.callTool({
|
|
95
|
+
name: definition.name,
|
|
96
|
+
arguments: (input ?? {}),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.failures.set(toolCallId, `the call never reached the server: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
if (result.isError === true) {
|
|
104
|
+
this.failures.set(toolCallId, `the tool returned an error: ${JSON.stringify(result.content)}`);
|
|
105
|
+
}
|
|
82
106
|
return result.content ?? result;
|
|
83
107
|
},
|
|
84
108
|
}),
|
package/dist/chat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
+
export type { ChatAssertion, ChatMatchers, } from "@skybridge/vite-plugin/evals";
|
|
1
2
|
export type { Chat } from "./chat.js";
|
|
2
|
-
export type { EvalsOptions, ModelDescriptor } from "./config.js";
|
|
3
|
-
export type { ChatAssertion, ChatMatchers } from "./matchers.js";
|
|
4
|
-
export { defineEvalModel } from "./model.js";
|
|
5
3
|
export { start } from "./session-registry.js";
|
|
6
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
import type { LanguageModel } from "ai";
|
|
1
2
|
import { Chat } from "./chat.js";
|
|
2
3
|
/**
|
|
3
4
|
* Opens a fresh MCP session and conversation against the server the plugin
|
|
4
|
-
* started.
|
|
5
|
-
*
|
|
5
|
+
* started. The session is closed when the current test finishes, so scenarios
|
|
6
|
+
* never leak sessions and never write teardown, and tests that run
|
|
7
|
+
* concurrently cannot close each other's sessions.
|
|
6
8
|
*
|
|
7
9
|
* The type parameter pins the assertions to the project's registry:
|
|
8
10
|
* `start<AppType>()` returns a `Chat<AppType>`, and `expect.chat` infers the
|
|
9
11
|
* tool names and argument shapes from it.
|
|
10
12
|
*/
|
|
11
|
-
export declare function start<App>(
|
|
13
|
+
export declare function start<App>(options: {
|
|
14
|
+
/** Any AI SDK model instance, built by the project. */
|
|
15
|
+
model: LanguageModel;
|
|
12
16
|
systemPrompt?: string;
|
|
13
17
|
temperature?: number;
|
|
18
|
+
maxSteps?: number;
|
|
14
19
|
}): Promise<Chat<App>>;
|
|
15
|
-
export declare function closeOpenedSessions(): Promise<void>;
|
|
16
20
|
//# sourceMappingURL=session-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;IACxC,uDAAuD;IACvD,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAgBrB"}
|
package/dist/session-registry.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { inject } from "vitest";
|
|
1
|
+
import { inject, onTestFinished } from "vitest";
|
|
2
2
|
import { Chat } from "./chat.js";
|
|
3
|
-
import { resolveModel } from "./model.js";
|
|
4
|
-
const opened = [];
|
|
5
3
|
/**
|
|
6
4
|
* Opens a fresh MCP session and conversation against the server the plugin
|
|
7
|
-
* started.
|
|
8
|
-
*
|
|
5
|
+
* started. The session is closed when the current test finishes, so scenarios
|
|
6
|
+
* never leak sessions and never write teardown, and tests that run
|
|
7
|
+
* concurrently cannot close each other's sessions.
|
|
9
8
|
*
|
|
10
9
|
* The type parameter pins the assertions to the project's registry:
|
|
11
10
|
* `start<AppType>()` returns a `Chat<AppType>`, and `expect.chat` infers the
|
|
12
11
|
* tool names and argument shapes from it.
|
|
13
12
|
*/
|
|
14
|
-
export async function start(
|
|
13
|
+
export async function start(options) {
|
|
14
|
+
const url = inject("skybridgeEvalsUrl");
|
|
15
|
+
if (url === undefined) {
|
|
16
|
+
throw new Error("No eval server is running. Add `skybridge({ evals: {...} })` to the vitest config.");
|
|
17
|
+
}
|
|
15
18
|
const config = inject("skybridgeEvals");
|
|
16
|
-
const chat = await Chat.open(
|
|
17
|
-
model:
|
|
18
|
-
temperature:
|
|
19
|
-
systemPrompt:
|
|
20
|
-
maxSteps:
|
|
19
|
+
const chat = await Chat.open(url, {
|
|
20
|
+
model: options.model,
|
|
21
|
+
temperature: options.temperature ?? config?.temperature,
|
|
22
|
+
systemPrompt: options.systemPrompt ?? config?.systemPrompt,
|
|
23
|
+
maxSteps: options.maxSteps ?? config?.maxSteps,
|
|
21
24
|
});
|
|
22
|
-
|
|
25
|
+
onTestFinished(() => chat.close());
|
|
23
26
|
return chat;
|
|
24
27
|
}
|
|
25
|
-
export async function closeOpenedSessions() {
|
|
26
|
-
await Promise.all(opened.splice(0).map((chat) => chat.close()));
|
|
27
|
-
}
|
|
28
28
|
//# sourceMappingURL=session-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAM,OAMhC;IACC,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAM,GAAG,EAAE;QACrC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,MAAM,EAAE,WAAW;QACvD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,MAAM,EAAE,YAAY;QAC1D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,QAAQ;KAC/C,CAAC,CAAC;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skybridge/test",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.2cdace2",
|
|
4
4
|
"description": "Eval runner for Skybridge MCP apps: does a prompt reach the right tool with the right arguments",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"type": "module",
|
|
@@ -12,37 +12,30 @@
|
|
|
12
12
|
".": {
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
14
|
"default": "./dist/index.js"
|
|
15
|
-
},
|
|
16
|
-
"./plugin": {
|
|
17
|
-
"types": "./dist/plugin.d.ts",
|
|
18
|
-
"default": "./dist/plugin.js"
|
|
19
15
|
}
|
|
20
16
|
},
|
|
21
17
|
"files": [
|
|
22
18
|
"dist"
|
|
23
19
|
],
|
|
24
20
|
"dependencies": {
|
|
25
|
-
"@ai-sdk/anthropic": "^2.0.0",
|
|
26
21
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
27
|
-
"
|
|
28
|
-
"@skybridge/vite-plugin": "0.0.0-dev.0fa5252"
|
|
22
|
+
"@skybridge/vite-plugin": "0.0.0-dev.2cdace2"
|
|
29
23
|
},
|
|
30
24
|
"peerDependencies": {
|
|
31
|
-
"
|
|
25
|
+
"ai": "^5.0.0",
|
|
26
|
+
"skybridge": "^2.0.0",
|
|
32
27
|
"vitest": "^4.1.0"
|
|
33
28
|
},
|
|
34
29
|
"devDependencies": {
|
|
35
30
|
"@types/node": "^24.13.3",
|
|
31
|
+
"ai": "^5.0.0",
|
|
36
32
|
"typescript": "^5.9.3",
|
|
37
33
|
"vitest": "^4.1.10",
|
|
38
|
-
"skybridge": "0.0.0-dev.
|
|
34
|
+
"skybridge": "0.0.0-dev.2cdace2"
|
|
39
35
|
},
|
|
40
36
|
"engines": {
|
|
41
37
|
"node": ">=22.23.1"
|
|
42
38
|
},
|
|
43
|
-
"publishConfig": {
|
|
44
|
-
"tag": "beta"
|
|
45
|
-
},
|
|
46
39
|
"scripts": {
|
|
47
40
|
"build": "tsc -p tsconfig.json",
|
|
48
41
|
"format": "biome check --write --error-on-warnings",
|
package/dist/config.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { EvalsOptions, ModelDescriptor } from "@skybridge/vite-plugin";
|
|
2
|
-
export type { EvalsOptions, ModelDescriptor, ModelFile, } from "@skybridge/vite-plugin";
|
|
3
|
-
/** The serializable half, the only part that crosses into the workers. */
|
|
4
|
-
export type ProvidedEvalsOptions = Omit<EvalsOptions, "model"> & {
|
|
5
|
-
model?: ModelDescriptor;
|
|
6
|
-
};
|
|
7
|
-
declare module "vitest" {
|
|
8
|
-
interface ProvidedContext {
|
|
9
|
-
skybridgeEvals: ProvidedEvalsOptions;
|
|
10
|
-
skybridgeEvalsUrl: string;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE5E,YAAY,EACV,YAAY,EACZ,eAAe,EACf,SAAS,GACV,MAAM,wBAAwB,CAAC;AAEhC,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG;IAC/D,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,eAAe;QACvB,cAAc,EAAE,oBAAoB,CAAC;QACrC,iBAAiB,EAAE,MAAM,CAAC;KAC3B;CACF"}
|
package/dist/config.js
DELETED
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":""}
|
package/dist/global-setup.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAA8B,KAAK,CAAC,OAAO,EAAE,WAAW,8CAsBvD"}
|
package/dist/global-setup.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { startServer } from "./server-harness.js";
|
|
2
|
-
export default async function setup(project) {
|
|
3
|
-
const options = project.config.provide
|
|
4
|
-
?.skybridgeEvals;
|
|
5
|
-
if (options.server !== undefined) {
|
|
6
|
-
project.provide("skybridgeEvalsUrl", options.server);
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
if (options.project === undefined) {
|
|
10
|
-
throw new Error("The evals plugin needs either `server` or `project`");
|
|
11
|
-
}
|
|
12
|
-
const server = await startServer(options.project);
|
|
13
|
-
project.provide("skybridgeEvalsUrl", server.url);
|
|
14
|
-
return async () => {
|
|
15
|
-
const output = server.output().trim();
|
|
16
|
-
await server.stop();
|
|
17
|
-
if (output !== "") {
|
|
18
|
-
console.log(`\n--- server output ---\n${output}\n---`);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=global-setup.js.map
|
package/dist/global-setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.js","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,KAAK,CAAC,OAAoB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO;QACpC,EAAE,cAAsC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAEjD,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/matchers.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { ToolInput, ToolNames } from "skybridge/server";
|
|
2
|
-
import type { Chat } from "./chat.js";
|
|
3
|
-
/**
|
|
4
|
-
* Assertions about the tool calls a conversation produced. Kept off vitest's
|
|
5
|
-
* global `Matchers` so they never appear on unrelated `expect()` calls, and so
|
|
6
|
-
* this stays the one place later tool-call helpers are added.
|
|
7
|
-
*/
|
|
8
|
-
export interface ChatMatchers<App> {
|
|
9
|
-
toHaveCalledToolOnce<Name extends ToolNames<App>>(name: Name, args?: Partial<ToolInput<App, Name>>): void;
|
|
10
|
-
toHaveCalledToolWith<Name extends ToolNames<App>>(name: Name, args: Partial<ToolInput<App, Name>>): void;
|
|
11
|
-
toNeverHaveCalledTool<Name extends ToolNames<App>>(name: Name): void;
|
|
12
|
-
}
|
|
13
|
-
export interface ChatAssertion<App> extends ChatMatchers<App> {
|
|
14
|
-
not: ChatMatchers<App>;
|
|
15
|
-
}
|
|
16
|
-
declare module "vitest" {
|
|
17
|
-
interface ExpectStatic {
|
|
18
|
-
chat<App>(chat: Chat<App>): ChatAssertion<App>;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=matchers.d.ts.map
|
package/dist/matchers.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"matchers.d.ts","sourceRoot":"","sources":["../src/matchers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,WAAW,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,YAAY,CAAC,GAAG;IAC/B,oBAAoB,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9C,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GACnC,IAAI,CAAC;IACR,oBAAoB,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAClC,IAAI,CAAC;IACR,qBAAqB,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,aAAa,CAAC,GAAG,CAAE,SAAQ,YAAY,CAAC,GAAG,CAAC;IAC3D,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;CACxB;AAED,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,YAAY;QACpB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;KAChD;CACF"}
|
package/dist/matchers.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { expect } from "vitest";
|
|
2
|
-
function attemptedCalls(chat, name) {
|
|
3
|
-
return chat.toolCalls.filter((call) => String(call.name) === name);
|
|
4
|
-
}
|
|
5
|
-
function acceptedCalls(chat, name) {
|
|
6
|
-
return attemptedCalls(chat, name).filter((call) => call.invalid !== true);
|
|
7
|
-
}
|
|
8
|
-
function observed(chat) {
|
|
9
|
-
if (chat.toolCalls.length === 0) {
|
|
10
|
-
return " (no tool was called)";
|
|
11
|
-
}
|
|
12
|
-
return chat.toolCalls
|
|
13
|
-
.map((call, index) => ` ${index + 1}. ${String(call.name)} ${JSON.stringify(call.arguments)}${call.invalid === true ? " (arguments rejected by the tool schema)" : ""}`)
|
|
14
|
-
.join("\n");
|
|
15
|
-
}
|
|
16
|
-
function definitions(chat) {
|
|
17
|
-
return chat.toolDefinitions
|
|
18
|
-
.map((tool) => ` - ${tool.name}: ${tool.description ?? ""}\n arguments: ${JSON.stringify(tool.inputSchema)}`)
|
|
19
|
-
.join("\n");
|
|
20
|
-
}
|
|
21
|
-
function report(chat, summary) {
|
|
22
|
-
return `${summary}
|
|
23
|
-
|
|
24
|
-
Calls the model actually made:
|
|
25
|
-
${observed(chat)}
|
|
26
|
-
|
|
27
|
-
Tool definitions the model was looking at:
|
|
28
|
-
${definitions(chat)}`;
|
|
29
|
-
}
|
|
30
|
-
expect.extend({
|
|
31
|
-
toHaveCalledToolOnce(received, name, args) {
|
|
32
|
-
const matching = acceptedCalls(received, name);
|
|
33
|
-
const argsMatch = args === undefined ||
|
|
34
|
-
(matching.length === 1 &&
|
|
35
|
-
this.equals(matching[0]?.arguments, expect.objectContaining(args)));
|
|
36
|
-
const pass = matching.length === 1 && argsMatch;
|
|
37
|
-
return {
|
|
38
|
-
pass,
|
|
39
|
-
message: () => report(received, pass
|
|
40
|
-
? `Expected "${name}" not to be called exactly once.`
|
|
41
|
-
: matching.length === 1
|
|
42
|
-
? `Expected "${name}" to be called once with ${JSON.stringify(args)}, but it was called with ${JSON.stringify(matching[0]?.arguments)}.`
|
|
43
|
-
: `Expected "${name}" to be called exactly once by a call the tool schema accepted, but ${matching.length} such calls were made.`),
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
toHaveCalledToolWith(received, name, args) {
|
|
47
|
-
const pass = acceptedCalls(received, name).some((call) => this.equals(call.arguments, expect.objectContaining(args)));
|
|
48
|
-
return {
|
|
49
|
-
pass,
|
|
50
|
-
message: () => report(received, pass
|
|
51
|
-
? `Expected no call to "${name}" with ${JSON.stringify(args)}.`
|
|
52
|
-
: `Expected "${name}" to be called with ${JSON.stringify(args)}.`),
|
|
53
|
-
};
|
|
54
|
-
},
|
|
55
|
-
toNeverHaveCalledTool(received, name) {
|
|
56
|
-
const matching = attemptedCalls(received, name);
|
|
57
|
-
return {
|
|
58
|
-
pass: matching.length === 0,
|
|
59
|
-
message: () => report(received, matching.length === 0
|
|
60
|
-
? `Expected "${name}" to be called at least once.`
|
|
61
|
-
: `Expected "${name}" never to be called, but it was called ${matching.length} times.`),
|
|
62
|
-
};
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
expect.chat = ((chat) => expect(chat));
|
|
66
|
-
//# sourceMappingURL=matchers.js.map
|
package/dist/matchers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"matchers.js","sourceRoot":"","sources":["../src/matchers.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { LanguageModel } from "ai";
|
|
2
|
-
import type { ModelDescriptor } from "./config.js";
|
|
3
|
-
/**
|
|
4
|
-
* Registers a model instance from a setup file. The escape hatch for providers
|
|
5
|
-
* the descriptor cannot construct, such as a company LLM gateway.
|
|
6
|
-
*/
|
|
7
|
-
export declare function defineEvalModel(model: LanguageModel): void;
|
|
8
|
-
export declare function resolveModel(descriptor: ModelDescriptor | undefined): Promise<LanguageModel>;
|
|
9
|
-
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE1D;AAaD,wBAAsB,YAAY,CAChC,UAAU,EAAE,eAAe,GAAG,SAAS,GACtC,OAAO,CAAC,aAAa,CAAC,CAWxB"}
|
package/dist/model.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
let registered;
|
|
2
|
-
/**
|
|
3
|
-
* Registers a model instance from a setup file. The escape hatch for providers
|
|
4
|
-
* the descriptor cannot construct, such as a company LLM gateway.
|
|
5
|
-
*/
|
|
6
|
-
export function defineEvalModel(model) {
|
|
7
|
-
registered = model;
|
|
8
|
-
}
|
|
9
|
-
const DEFAULT_KEY_ENV = { anthropic: "ANTHROPIC_API_KEY" };
|
|
10
|
-
function requireKey(descriptor) {
|
|
11
|
-
const name = descriptor.apiKeyEnv ?? DEFAULT_KEY_ENV[descriptor.provider];
|
|
12
|
-
const key = process.env[name];
|
|
13
|
-
if (key === undefined || key === "") {
|
|
14
|
-
throw new Error(`${name} is not set`);
|
|
15
|
-
}
|
|
16
|
-
return key;
|
|
17
|
-
}
|
|
18
|
-
export async function resolveModel(descriptor) {
|
|
19
|
-
if (registered !== undefined) {
|
|
20
|
-
return registered;
|
|
21
|
-
}
|
|
22
|
-
if (descriptor === undefined) {
|
|
23
|
-
throw new Error("No model configured. Pass `model` to the evals plugin, or call defineEvalModel() from a setup file.");
|
|
24
|
-
}
|
|
25
|
-
const { createAnthropic } = await import("@ai-sdk/anthropic");
|
|
26
|
-
return createAnthropic({ apiKey: requireKey(descriptor) })(descriptor.name);
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=model.js.map
|
package/dist/model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAGA,IAAI,UAAqC,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,eAAe,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAW,CAAC;AAEpE,SAAS,UAAU,CAAC,UAA2B;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAuC;IAEvC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC9D,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC"}
|
package/dist/plugin.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Plugin } from "vitest/config";
|
|
2
|
-
import type { EvalsOptions } from "./config.js";
|
|
3
|
-
/**
|
|
4
|
-
* Wires the eval runner into vitest. Usually reached through the `evals`
|
|
5
|
-
* option of the `skybridge()` Vite plugin rather than registered directly.
|
|
6
|
-
* Everything the runner needs is configured here, so a scenario file imports
|
|
7
|
-
* nothing but `start` and its own `AppType`.
|
|
8
|
-
*/
|
|
9
|
-
export declare function evals(options: EvalsOptions): Plugin;
|
|
10
|
-
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AAMtE;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuBnD"}
|
package/dist/plugin.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath } from "node:url";
|
|
2
|
-
function here(file) {
|
|
3
|
-
return fileURLToPath(new URL(file, import.meta.url));
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Wires the eval runner into vitest. Usually reached through the `evals`
|
|
7
|
-
* option of the `skybridge()` Vite plugin rather than registered directly.
|
|
8
|
-
* Everything the runner needs is configured here, so a scenario file imports
|
|
9
|
-
* nothing but `start` and its own `AppType`.
|
|
10
|
-
*/
|
|
11
|
-
export function evals(options) {
|
|
12
|
-
const { model, ...rest } = options;
|
|
13
|
-
const provided = "file" in model ? rest : { ...rest, model };
|
|
14
|
-
const setupFiles = [here("./setup.js")];
|
|
15
|
-
if ("file" in model) {
|
|
16
|
-
setupFiles.push(model.file);
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
name: "skybridge-evals",
|
|
20
|
-
config() {
|
|
21
|
-
return {
|
|
22
|
-
test: {
|
|
23
|
-
testTimeout: 120_000,
|
|
24
|
-
setupFiles,
|
|
25
|
-
globalSetup: [here("./global-setup.js")],
|
|
26
|
-
provide: { skybridgeEvals: provided },
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=plugin.js.map
|
package/dist/plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,OAAqB;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,QAAQ,GACZ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACxC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM;YACJ,OAAO;gBACL,IAAI,EAAE;oBACJ,WAAW,EAAE,OAAO;oBACpB,UAAU;oBACV,WAAW,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBACxC,OAAO,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;iBACtC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/server-harness.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface RunningServer {
|
|
2
|
-
url: string;
|
|
3
|
-
/** Everything the server wrote to stdout/stderr, for failure reports. */
|
|
4
|
-
output: () => string;
|
|
5
|
-
stop: () => Promise<void>;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Spawns the project's server with `__PORT=0` and an IPC channel, and waits
|
|
9
|
-
* for the `skybridge:listening` message carrying the port the OS picked.
|
|
10
|
-
* Binding and reporting both happen in the child, so there is no window in
|
|
11
|
-
* which another process can steal the port.
|
|
12
|
-
*/
|
|
13
|
-
export declare function startServer({ cwd, command, env, timeoutMs, }: {
|
|
14
|
-
cwd: string;
|
|
15
|
-
command: string[];
|
|
16
|
-
env?: Record<string, string>;
|
|
17
|
-
timeoutMs?: number;
|
|
18
|
-
}): Promise<RunningServer>;
|
|
19
|
-
//# sourceMappingURL=server-harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-harness.d.ts","sourceRoot":"","sources":["../src/server-harness.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,MAAM,EAAE,MAAM,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAiBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,EAChC,GAAG,EACH,OAAO,EACP,GAAQ,EACR,SAAkB,GACnB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2EzB"}
|
package/dist/server-harness.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
function hasExited(child) {
|
|
4
|
-
return child.exitCode !== null || child.signalCode !== null;
|
|
5
|
-
}
|
|
6
|
-
function isListeningMessage(message) {
|
|
7
|
-
return (typeof message === "object" &&
|
|
8
|
-
message !== null &&
|
|
9
|
-
message.type === "skybridge:listening" &&
|
|
10
|
-
typeof message.port === "number");
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Spawns the project's server with `__PORT=0` and an IPC channel, and waits
|
|
14
|
-
* for the `skybridge:listening` message carrying the port the OS picked.
|
|
15
|
-
* Binding and reporting both happen in the child, so there is no window in
|
|
16
|
-
* which another process can steal the port.
|
|
17
|
-
*/
|
|
18
|
-
export async function startServer({ cwd, command, env = {}, timeoutMs = 60_000, }) {
|
|
19
|
-
const [bin, ...args] = command;
|
|
20
|
-
if (bin === undefined) {
|
|
21
|
-
throw new Error("Empty server command");
|
|
22
|
-
}
|
|
23
|
-
const executable = bin.startsWith(".") ? resolve(cwd, bin) : bin;
|
|
24
|
-
const child = spawn(executable, args, {
|
|
25
|
-
cwd,
|
|
26
|
-
env: {
|
|
27
|
-
...process.env,
|
|
28
|
-
NODE_ENV: "production",
|
|
29
|
-
...env,
|
|
30
|
-
__PORT: "0",
|
|
31
|
-
},
|
|
32
|
-
stdio: ["ignore", "pipe", "pipe", "ipc"],
|
|
33
|
-
});
|
|
34
|
-
let captured = "";
|
|
35
|
-
const output = () => captured;
|
|
36
|
-
child.stdout?.on("data", (chunk) => {
|
|
37
|
-
captured += chunk;
|
|
38
|
-
});
|
|
39
|
-
child.stderr?.on("data", (chunk) => {
|
|
40
|
-
captured += chunk;
|
|
41
|
-
});
|
|
42
|
-
const stop = async () => {
|
|
43
|
-
if (hasExited(child)) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const exited = new Promise((resolveExit) => {
|
|
47
|
-
child.once("exit", () => resolveExit());
|
|
48
|
-
});
|
|
49
|
-
child.kill("SIGTERM");
|
|
50
|
-
const forced = setTimeout(() => child.kill("SIGKILL"), 3_000);
|
|
51
|
-
await exited;
|
|
52
|
-
clearTimeout(forced);
|
|
53
|
-
};
|
|
54
|
-
const port = await new Promise((resolvePort, reject) => {
|
|
55
|
-
const timer = setTimeout(() => {
|
|
56
|
-
reject(new Error(`Server did not report its port in ${timeoutMs}ms. It must call \`server.run()\` on a skybridge version that sends the skybridge:listening readiness message.\n${output()}`));
|
|
57
|
-
}, timeoutMs);
|
|
58
|
-
child.on("message", (message) => {
|
|
59
|
-
if (isListeningMessage(message)) {
|
|
60
|
-
clearTimeout(timer);
|
|
61
|
-
resolvePort(message.port);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
child.on("error", (error) => {
|
|
65
|
-
clearTimeout(timer);
|
|
66
|
-
reject(new Error(`Failed to spawn ${command.join(" ")}: ${error.message}`));
|
|
67
|
-
});
|
|
68
|
-
child.on("exit", () => {
|
|
69
|
-
clearTimeout(timer);
|
|
70
|
-
reject(new Error(`Server exited with code ${child.exitCode} before reporting its port:\n${output()}`));
|
|
71
|
-
});
|
|
72
|
-
}).catch(async (error) => {
|
|
73
|
-
await stop();
|
|
74
|
-
throw error;
|
|
75
|
-
});
|
|
76
|
-
return { url: `http://127.0.0.1:${port}/mcp`, output, stop };
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=server-harness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-harness.js","sourceRoot":"","sources":["../src/server-harness.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
DELETED
package/dist/setup.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC"}
|
package/dist/setup.js
DELETED
package/dist/setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,mBAAmB,EAAE,CAAC;AAC9B,CAAC,CAAC,CAAC"}
|