@skybridge/test 0.0.0-dev.7aada9d → 0.0.0-dev.df0cfdd
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 +29 -0
- package/dist/chat.d.ts +4 -2
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +27 -6
- package/dist/chat.js.map +1 -1
- package/dist/config.d.ts +2 -29
- package/dist/config.d.ts.map +1 -1
- package/dist/global-setup.d.ts +1 -1
- package/dist/global-setup.d.ts.map +1 -1
- package/dist/global-setup.js +6 -21
- package/dist/global-setup.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/matchers.js +8 -18
- package/dist/matchers.js.map +1 -1
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +8 -12
- package/dist/model.js.map +1 -1
- package/dist/server-harness.d.ts +1 -2
- package/dist/server-harness.d.ts.map +1 -1
- package/dist/server-harness.js +3 -2
- package/dist/server-harness.js.map +1 -1
- package/dist/session-registry.d.ts +3 -3
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +6 -9
- package/dist/session-registry.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +0 -5
- package/dist/setup.js.map +1 -1
- package/package.json +8 -6
- package/dist/telemetry.d.ts +0 -10
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -77
- package/dist/telemetry.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @skybridge/test
|
|
2
|
+
|
|
3
|
+
Evals for [Skybridge](https://skybridge.tech) MCP apps: they answer whether a
|
|
4
|
+
prompt reaches the right tool with the right arguments, which no unit test can
|
|
5
|
+
check.
|
|
6
|
+
|
|
7
|
+
**Beta.** The API is still settling, so it publishes under the `beta`
|
|
8
|
+
dist-tag and may change between releases.
|
|
9
|
+
|
|
10
|
+
Add the `evals` option to the Skybridge Vite plugin, then write scenarios with
|
|
11
|
+
vitest's own `it` and `expect`.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { expect, it } from "vitest";
|
|
15
|
+
import { start } from "@skybridge/test";
|
|
16
|
+
import type { AppType } from "../src/server.js";
|
|
17
|
+
|
|
18
|
+
it("finds products by category", async () => {
|
|
19
|
+
const chat = await start<AppType>();
|
|
20
|
+
await chat.send("I am looking for ski goggles");
|
|
21
|
+
|
|
22
|
+
expect.chat(chat).toHaveCalledToolWith("search-products", {
|
|
23
|
+
category: "goggles",
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
See the [documentation](https://docs.skybridge.tech) for setup and the full
|
|
29
|
+
matcher list.
|
package/dist/chat.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export type ToolCall<App> = {
|
|
|
8
8
|
[Name in ToolNames<App>]: {
|
|
9
9
|
name: Name;
|
|
10
10
|
arguments: ToolInput<App, Name>;
|
|
11
|
-
|
|
11
|
+
failed?: string;
|
|
12
12
|
};
|
|
13
13
|
}[ToolNames<App>];
|
|
14
14
|
/**
|
|
@@ -16,7 +16,7 @@ export type ToolCall<App> = {
|
|
|
16
16
|
* provider and its credentials are chosen by the project rather than by a
|
|
17
17
|
* base URL the runner has to know about.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
interface HostConfig {
|
|
20
20
|
model: LanguageModel;
|
|
21
21
|
temperature?: number;
|
|
22
22
|
systemPrompt?: string;
|
|
@@ -35,6 +35,7 @@ export declare class Chat<App = unknown> {
|
|
|
35
35
|
/** Every call the model made, in order, as it crossed the wire. */
|
|
36
36
|
readonly toolCalls: ToolCall<App>[];
|
|
37
37
|
private readonly messages;
|
|
38
|
+
private readonly failures;
|
|
38
39
|
private readonly client;
|
|
39
40
|
private readonly transport;
|
|
40
41
|
private readonly host;
|
|
@@ -46,6 +47,7 @@ export declare class Chat<App = unknown> {
|
|
|
46
47
|
/** Takes a turn and returns the model's answer. */
|
|
47
48
|
send(prompt: string): Promise<string>;
|
|
48
49
|
close(): Promise<void>;
|
|
50
|
+
private failureFor;
|
|
49
51
|
private toolSet;
|
|
50
52
|
}
|
|
51
53
|
export {};
|
package/dist/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAGnB,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,GAAG,IAAI;KACzB,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG;QACxB,IAAI,EAAE,IAAI,CAAC;QACX,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAGnB,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,GAAG,IAAI;KACzB,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG;QACxB,IAAI,EAAE,IAAI,CAAC;QACX,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;CACF,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAElB;;;;GAIG;AACH,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;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAID;;;GAGG;AACH,qBAAa,IAAI,CAAC,GAAG,GAAG,OAAO;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAM;IAEzC,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,CAA2B;IAExC,OAAO;WAUM,IAAI,CAAC,GAAG,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAerB,0EAA0E;IAC1E,IAAI,eAAe,IAAI,iBAAiB,EAAE,CAEzC;IAED,mDAAmD;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,OAAO;CAmChB"}
|
package/dist/chat.js
CHANGED
|
@@ -10,6 +10,7 @@ export class Chat {
|
|
|
10
10
|
/** Every call the model made, in order, as it crossed the wire. */
|
|
11
11
|
toolCalls = [];
|
|
12
12
|
messages = [];
|
|
13
|
+
failures = new Map();
|
|
13
14
|
client;
|
|
14
15
|
transport;
|
|
15
16
|
host;
|
|
@@ -56,7 +57,7 @@ export class Chat {
|
|
|
56
57
|
this.toolCalls.push({
|
|
57
58
|
name: call.toolName,
|
|
58
59
|
arguments: (call.input ?? {}),
|
|
59
|
-
...(call
|
|
60
|
+
...this.failureFor(call),
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
63
|
}
|
|
@@ -66,6 +67,16 @@ export class Chat {
|
|
|
66
67
|
async close() {
|
|
67
68
|
await this.transport.close();
|
|
68
69
|
}
|
|
70
|
+
failureFor(call) {
|
|
71
|
+
const reported = this.failures.get(call.toolCallId);
|
|
72
|
+
if (reported !== undefined) {
|
|
73
|
+
return { failed: reported };
|
|
74
|
+
}
|
|
75
|
+
if (call.invalid === true) {
|
|
76
|
+
return { failed: "the model's arguments could not be parsed" };
|
|
77
|
+
}
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
69
80
|
toolSet() {
|
|
70
81
|
const entries = this.tools.map((definition) => {
|
|
71
82
|
const { $schema: _ignored, ...parameters } = definition.inputSchema;
|
|
@@ -74,11 +85,21 @@ export class Chat {
|
|
|
74
85
|
dynamicTool({
|
|
75
86
|
description: definition.description ?? "",
|
|
76
87
|
inputSchema: jsonSchema(parameters),
|
|
77
|
-
execute: async (input) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
execute: async (input, { toolCallId }) => {
|
|
89
|
+
let result;
|
|
90
|
+
try {
|
|
91
|
+
result = await this.client.callTool({
|
|
92
|
+
name: definition.name,
|
|
93
|
+
arguments: (input ?? {}),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
this.failures.set(toolCallId, `the call never reached the server: ${error instanceof Error ? error.message : String(error)}`);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
if (result.isError === true) {
|
|
101
|
+
this.failures.set(toolCallId, `the tool returned an error: ${JSON.stringify(result.content)}`);
|
|
102
|
+
}
|
|
82
103
|
return result.content ?? result;
|
|
83
104
|
},
|
|
84
105
|
}),
|
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;AACnG,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EAGV,WAAW,GACZ,MAAM,IAAI,CAAC;AAiCZ,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B;;;GAGG;AACH,MAAM,OAAO,IAAI;IACf,mEAAmE;IAC1D,SAAS,GAAoB,EAAE,CAAC;IAExB,QAAQ,GAAmB,EAAE,CAAC;IAC9B,MAAM,CAAS;IACf,SAAS,CAAgC;IACzC,IAAI,CAAa;IAC1B,KAAK,GAAwB,EAAE,CAAC;IAExC,YACE,MAAc,EACd,SAAwC,EACxC,IAAgB;QAEhB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,SAAiB,EACjB,IAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAM,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,KAAuC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS;gBACtC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE;YACrB,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;SAC/D,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClB,IAAI,EAAE,IAAI,CAAC,QAAQ;oBACnB,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA4B;oBACxD,GAAG,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,32 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
provider: "anthropic";
|
|
4
|
-
name: string;
|
|
5
|
-
/** Env var holding the key. Never the key itself. */
|
|
6
|
-
apiKeyEnv?: string;
|
|
7
|
-
}
|
|
8
|
-
/** Escape hatch: a module that calls `defineEvalModel` with its own instance. */
|
|
9
|
-
export interface ModelFile {
|
|
10
|
-
file: string;
|
|
11
|
-
}
|
|
12
|
-
export interface EvalsOptions {
|
|
13
|
-
model: ModelDescriptor | ModelFile;
|
|
14
|
-
temperature?: number;
|
|
15
|
-
systemPrompt?: string;
|
|
16
|
-
maxSteps?: number;
|
|
17
|
-
server?: string;
|
|
18
|
-
/**
|
|
19
|
-
* How the runner starts the project's server. `command` must start the
|
|
20
|
-
* server process directly (`node`, `tsx`), not through a wrapper such as
|
|
21
|
-
* `pnpm run`: readiness and the bound port arrive over the spawned
|
|
22
|
-
* process's IPC channel, which wrappers do not forward.
|
|
23
|
-
*/
|
|
24
|
-
project?: {
|
|
25
|
-
cwd: string;
|
|
26
|
-
command: string[];
|
|
27
|
-
env?: Record<string, string>;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
1
|
+
import type { EvalsOptions, ModelDescriptor } from "@skybridge/vite-plugin";
|
|
2
|
+
export type { EvalsOptions, ModelDescriptor, ModelFile, } from "@skybridge/vite-plugin";
|
|
30
3
|
/** The serializable half, the only part that crosses into the workers. */
|
|
31
4
|
export type ProvidedEvalsOptions = Omit<EvalsOptions, "model"> & {
|
|
32
5
|
model?: ModelDescriptor;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,
|
|
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/global-setup.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { TestProject } from "vitest/node";
|
|
2
|
-
export default function setup(project: TestProject): Promise<() => Promise<void
|
|
2
|
+
export default function setup(project: TestProject): Promise<(() => Promise<void>) | undefined>;
|
|
3
3
|
//# sourceMappingURL=global-setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,8CA4BvD"}
|
package/dist/global-setup.js
CHANGED
|
@@ -1,28 +1,17 @@
|
|
|
1
1
|
import { startServer } from "./server-harness.js";
|
|
2
|
-
import { captureEvalRun } from "./telemetry.js";
|
|
3
2
|
export default async function setup(project) {
|
|
4
|
-
const options = project.config.provide
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
const options = project.config.provide?.skybridgeEvals;
|
|
4
|
+
if (options === undefined) {
|
|
5
|
+
throw new Error("The evals plugin is not registered. Add `skybridge({ evals: {...} })` to the vitest config.");
|
|
6
|
+
}
|
|
7
7
|
if (options.server !== undefined) {
|
|
8
8
|
project.provide("skybridgeEvalsUrl", options.server);
|
|
9
|
-
return
|
|
10
|
-
await captureEvalRun({
|
|
11
|
-
durationMs: Date.now() - startedAt,
|
|
12
|
-
serverStarted: true,
|
|
13
|
-
});
|
|
14
|
-
};
|
|
9
|
+
return;
|
|
15
10
|
}
|
|
16
11
|
if (options.project === undefined) {
|
|
17
12
|
throw new Error("The evals plugin needs either `server` or `project`");
|
|
18
13
|
}
|
|
19
|
-
const server = await startServer(options.project)
|
|
20
|
-
await captureEvalRun({
|
|
21
|
-
durationMs: Date.now() - startedAt,
|
|
22
|
-
serverStarted: false,
|
|
23
|
-
});
|
|
24
|
-
throw error;
|
|
25
|
-
});
|
|
14
|
+
const server = await startServer(options.project);
|
|
26
15
|
project.provide("skybridgeEvalsUrl", server.url);
|
|
27
16
|
return async () => {
|
|
28
17
|
const output = server.output().trim();
|
|
@@ -30,10 +19,6 @@ export default async function setup(project) {
|
|
|
30
19
|
if (output !== "") {
|
|
31
20
|
console.log(`\n--- server output ---\n${output}\n---`);
|
|
32
21
|
}
|
|
33
|
-
await captureEvalRun({
|
|
34
|
-
durationMs: Date.now() - startedAt,
|
|
35
|
-
serverStarted: true,
|
|
36
|
-
});
|
|
37
22
|
};
|
|
38
23
|
}
|
|
39
24
|
//# sourceMappingURL=global-setup.js.map
|
package/dist/global-setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.js","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
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,EAAE,cAE3B,CAAC;IACd,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,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/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export type { Chat
|
|
2
|
-
export type { EvalsOptions, ModelDescriptor, ModelFile, ProvidedEvalsOptions, } from "./config.js";
|
|
1
|
+
export type { Chat } from "./chat.js";
|
|
3
2
|
export type { ChatAssertion, ChatMatchers } from "./matchers.js";
|
|
4
3
|
export { defineEvalModel } from "./model.js";
|
|
5
4
|
export { start } from "./session-registry.js";
|
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,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC"}
|
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":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/matchers.js
CHANGED
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
import { expect } from "vitest";
|
|
2
|
-
|
|
3
|
-
* Every attempt at a tool, including calls the tool's schema rejected. Used by
|
|
4
|
-
* the negative matcher: an attempt the model should not have made is a failure
|
|
5
|
-
* whether or not its arguments parsed.
|
|
6
|
-
*/
|
|
7
|
-
function attemptsAt(chat, name) {
|
|
2
|
+
function attemptedCalls(chat, name) {
|
|
8
3
|
return chat.toolCalls.filter((call) => String(call.name) === name);
|
|
9
4
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* so a rejected call never satisfies an assertion that the tool ran; the
|
|
13
|
-
* rejected attempt still shows up in the failure report.
|
|
14
|
-
*/
|
|
15
|
-
function callsTo(chat, name) {
|
|
16
|
-
return attemptsAt(chat, name).filter((call) => call.invalid !== true);
|
|
5
|
+
function acceptedCalls(chat, name) {
|
|
6
|
+
return attemptedCalls(chat, name).filter((call) => call.failed === undefined);
|
|
17
7
|
}
|
|
18
8
|
function observed(chat) {
|
|
19
9
|
if (chat.toolCalls.length === 0) {
|
|
20
10
|
return " (no tool was called)";
|
|
21
11
|
}
|
|
22
12
|
return chat.toolCalls
|
|
23
|
-
.map((call, index) => ` ${index + 1}. ${
|
|
13
|
+
.map((call, index) => ` ${index + 1}. ${call.name} ${JSON.stringify(call.arguments)}${call.failed === undefined ? "" : ` (failed: ${call.failed})`}`)
|
|
24
14
|
.join("\n");
|
|
25
15
|
}
|
|
26
16
|
function definitions(chat) {
|
|
@@ -39,7 +29,7 @@ ${definitions(chat)}`;
|
|
|
39
29
|
}
|
|
40
30
|
expect.extend({
|
|
41
31
|
toHaveCalledToolOnce(received, name, args) {
|
|
42
|
-
const matching =
|
|
32
|
+
const matching = acceptedCalls(received, name);
|
|
43
33
|
const argsMatch = args === undefined ||
|
|
44
34
|
(matching.length === 1 &&
|
|
45
35
|
this.equals(matching[0]?.arguments, expect.objectContaining(args)));
|
|
@@ -50,11 +40,11 @@ expect.extend({
|
|
|
50
40
|
? `Expected "${name}" not to be called exactly once.`
|
|
51
41
|
: matching.length === 1
|
|
52
42
|
? `Expected "${name}" to be called once with ${JSON.stringify(args)}, but it was called with ${JSON.stringify(matching[0]?.arguments)}.`
|
|
53
|
-
: `Expected "${name}" to be called exactly once by a call
|
|
43
|
+
: `Expected "${name}" to be called exactly once by a call that succeeded, but ${matching.length} such calls were made.`),
|
|
54
44
|
};
|
|
55
45
|
},
|
|
56
46
|
toHaveCalledToolWith(received, name, args) {
|
|
57
|
-
const pass =
|
|
47
|
+
const pass = acceptedCalls(received, name).some((call) => this.equals(call.arguments, expect.objectContaining(args)));
|
|
58
48
|
return {
|
|
59
49
|
pass,
|
|
60
50
|
message: () => report(received, pass
|
|
@@ -63,7 +53,7 @@ expect.extend({
|
|
|
63
53
|
};
|
|
64
54
|
},
|
|
65
55
|
toNeverHaveCalledTool(received, name) {
|
|
66
|
-
const matching =
|
|
56
|
+
const matching = attemptedCalls(received, name);
|
|
67
57
|
return {
|
|
68
58
|
pass: matching.length === 0,
|
|
69
59
|
message: () => report(received, matching.length === 0
|
package/dist/matchers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchers.js","sourceRoot":"","sources":["../src/matchers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA8BhC
|
|
1
|
+
{"version":3,"file":"matchers.js","sourceRoot":"","sources":["../src/matchers.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ import type { ModelDescriptor } from "./config.js";
|
|
|
5
5
|
* the descriptor cannot construct, such as a company LLM gateway.
|
|
6
6
|
*/
|
|
7
7
|
export declare function defineEvalModel(model: LanguageModel): void;
|
|
8
|
-
export declare function resolveModel(descriptor: ModelDescriptor | undefined):
|
|
8
|
+
export declare function resolveModel(descriptor: ModelDescriptor | undefined): LanguageModel;
|
|
9
9
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,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;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,eAAe,GAAG,SAAS,GACtC,aAAa,CAef"}
|
package/dist/model.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
1
2
|
let registered;
|
|
2
3
|
/**
|
|
3
4
|
* Registers a model instance from a setup file. The escape hatch for providers
|
|
@@ -6,23 +7,18 @@ let registered;
|
|
|
6
7
|
export function defineEvalModel(model) {
|
|
7
8
|
registered = model;
|
|
8
9
|
}
|
|
9
|
-
|
|
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) {
|
|
10
|
+
export function resolveModel(descriptor) {
|
|
19
11
|
if (registered !== undefined) {
|
|
20
12
|
return registered;
|
|
21
13
|
}
|
|
22
14
|
if (descriptor === undefined) {
|
|
23
15
|
throw new Error("No model configured. Pass `model` to the evals plugin, or call defineEvalModel() from a setup file.");
|
|
24
16
|
}
|
|
25
|
-
const
|
|
26
|
-
|
|
17
|
+
const name = descriptor.apiKeyEnv ?? "ANTHROPIC_API_KEY";
|
|
18
|
+
const apiKey = process.env[name];
|
|
19
|
+
if (apiKey === undefined || apiKey === "") {
|
|
20
|
+
throw new Error(`${name} is not set`);
|
|
21
|
+
}
|
|
22
|
+
return createAnthropic({ apiKey })(descriptor.name);
|
|
27
23
|
}
|
|
28
24
|
//# sourceMappingURL=model.js.map
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,IAAI,UAAqC,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,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,IAAI,GAAG,UAAU,CAAC,SAAS,IAAI,mBAAmB,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/server-harness.d.ts
CHANGED
|
@@ -10,10 +10,9 @@ export interface RunningServer {
|
|
|
10
10
|
* Binding and reporting both happen in the child, so there is no window in
|
|
11
11
|
* which another process can steal the port.
|
|
12
12
|
*/
|
|
13
|
-
export declare function startServer({ cwd, command, env,
|
|
13
|
+
export declare function startServer({ cwd, command, env, }: {
|
|
14
14
|
cwd: string;
|
|
15
15
|
command: string[];
|
|
16
16
|
env?: Record<string, string>;
|
|
17
|
-
timeoutMs?: number;
|
|
18
17
|
}): Promise<RunningServer>;
|
|
19
18
|
//# sourceMappingURL=server-harness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,GACT,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,GAAG,OAAO,CAAC,aAAa,CAAC,CA4EzB"}
|
package/dist/server-harness.js
CHANGED
|
@@ -15,7 +15,8 @@ function isListeningMessage(message) {
|
|
|
15
15
|
* Binding and reporting both happen in the child, so there is no window in
|
|
16
16
|
* which another process can steal the port.
|
|
17
17
|
*/
|
|
18
|
-
export async function startServer({ cwd, command, env = {},
|
|
18
|
+
export async function startServer({ cwd, command, env = {}, }) {
|
|
19
|
+
const timeoutMs = 60_000;
|
|
19
20
|
const [bin, ...args] = command;
|
|
20
21
|
if (bin === undefined) {
|
|
21
22
|
throw new Error("Empty server command");
|
|
@@ -53,7 +54,7 @@ export async function startServer({ cwd, command, env = {}, timeoutMs = 60_000,
|
|
|
53
54
|
};
|
|
54
55
|
const port = await new Promise((resolvePort, reject) => {
|
|
55
56
|
const timer = setTimeout(() => {
|
|
56
|
-
reject(new Error(`Server did not report
|
|
57
|
+
reject(new Error(`Server did not report a port in ${timeoutMs}ms. \`command\` must start the server process directly (node, tsx): wrappers such as \`pnpm run\` do not forward the IPC channel the readiness signal uses. It must also run a skybridge version that sends skybridge:listening.\n${output()}`));
|
|
57
58
|
}, timeoutMs);
|
|
58
59
|
child.on("message", (message) => {
|
|
59
60
|
if (isListeningMessage(message)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-harness.js","sourceRoot":"","sources":["../src/server-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,SAAS,SAAS,CAAC,KAAmB;IACpC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAgB;IAEhB,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QACf,OAA8B,CAAC,IAAI,KAAK,qBAAqB;QAC9D,OAAQ,OAA8B,CAAC,IAAI,KAAK,QAAQ,CACzD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,GAAG,EACH,OAAO,EACP,GAAG,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"server-harness.js","sourceRoot":"","sources":["../src/server-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Chat } from "./chat.js";
|
|
2
2
|
/**
|
|
3
3
|
* Opens a fresh MCP session and conversation against the server the plugin
|
|
4
|
-
* started.
|
|
5
|
-
*
|
|
4
|
+
* started. The session is closed when the current test finishes, so scenarios
|
|
5
|
+
* never leak sessions and never write teardown, and tests that run
|
|
6
|
+
* concurrently cannot close each other's sessions.
|
|
6
7
|
*
|
|
7
8
|
* The type parameter pins the assertions to the project's registry:
|
|
8
9
|
* `start<AppType>()` returns a `Chat<AppType>`, and `expect.chat` infers the
|
|
@@ -12,5 +13,4 @@ export declare function start<App>(overrides?: {
|
|
|
12
13
|
systemPrompt?: string;
|
|
13
14
|
temperature?: number;
|
|
14
15
|
}): Promise<Chat<App>>;
|
|
15
|
-
export declare function closeOpenedSessions(): Promise<void>;
|
|
16
16
|
//# sourceMappingURL=session-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAUrB"}
|
package/dist/session-registry.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { inject } from "vitest";
|
|
1
|
+
import { inject, onTestFinished } from "vitest";
|
|
2
2
|
import { Chat } from "./chat.js";
|
|
3
3
|
import { resolveModel } from "./model.js";
|
|
4
|
-
const opened = [];
|
|
5
4
|
/**
|
|
6
5
|
* Opens a fresh MCP session and conversation against the server the plugin
|
|
7
|
-
* started.
|
|
8
|
-
*
|
|
6
|
+
* started. The session is closed when the current test finishes, so scenarios
|
|
7
|
+
* never leak sessions and never write teardown, and tests that run
|
|
8
|
+
* concurrently cannot close each other's sessions.
|
|
9
9
|
*
|
|
10
10
|
* The type parameter pins the assertions to the project's registry:
|
|
11
11
|
* `start<AppType>()` returns a `Chat<AppType>`, and `expect.chat` infers the
|
|
@@ -14,15 +14,12 @@ const opened = [];
|
|
|
14
14
|
export async function start(overrides) {
|
|
15
15
|
const config = inject("skybridgeEvals");
|
|
16
16
|
const chat = await Chat.open(inject("skybridgeEvalsUrl"), {
|
|
17
|
-
model:
|
|
17
|
+
model: resolveModel(config.model),
|
|
18
18
|
temperature: overrides?.temperature ?? config.temperature,
|
|
19
19
|
systemPrompt: overrides?.systemPrompt ?? config.systemPrompt,
|
|
20
20
|
maxSteps: config.maxSteps,
|
|
21
21
|
});
|
|
22
|
-
|
|
22
|
+
onTestFinished(() => chat.close());
|
|
23
23
|
return chat;
|
|
24
24
|
}
|
|
25
|
-
export async function closeOpenedSessions() {
|
|
26
|
-
await Promise.all(opened.splice(0).map((chat) => chat.close()));
|
|
27
|
-
}
|
|
28
25
|
//# sourceMappingURL=session-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAM,SAGhC;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE;QAC7D,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;QACjC,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW;QACzD,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,MAAM,CAAC,YAAY;QAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
|
package/dist/setup.js
CHANGED
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,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.df0cfdd",
|
|
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",
|
|
@@ -25,22 +25,24 @@
|
|
|
25
25
|
"@ai-sdk/anthropic": "^2.0.0",
|
|
26
26
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
27
27
|
"ai": "^5.0.0",
|
|
28
|
-
"
|
|
29
|
-
"posthog-node": "^5.45.2"
|
|
28
|
+
"@skybridge/vite-plugin": "0.0.0-dev.df0cfdd"
|
|
30
29
|
},
|
|
31
30
|
"peerDependencies": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
31
|
+
"skybridge": "^2.0.0",
|
|
32
|
+
"vitest": "^4.1.0"
|
|
34
33
|
},
|
|
35
34
|
"devDependencies": {
|
|
36
35
|
"@types/node": "^24.13.3",
|
|
37
36
|
"typescript": "^5.9.3",
|
|
38
37
|
"vitest": "^4.1.10",
|
|
39
|
-
"skybridge": "0.0.0-dev.
|
|
38
|
+
"skybridge": "0.0.0-dev.df0cfdd"
|
|
40
39
|
},
|
|
41
40
|
"engines": {
|
|
42
41
|
"node": ">=22.23.1"
|
|
43
42
|
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"tag": "beta"
|
|
45
|
+
},
|
|
44
46
|
"scripts": {
|
|
45
47
|
"build": "tsc -p tsconfig.json",
|
|
46
48
|
"format": "biome check --write --error-on-warnings",
|
package/dist/telemetry.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One event per eval run, honoring the same opt-outs, machine id file, and
|
|
3
|
-
* env-var semantics as the skybridge CLI. Silently a no-op when telemetry is
|
|
4
|
-
* disabled.
|
|
5
|
-
*/
|
|
6
|
-
export declare function captureEvalRun(properties: {
|
|
7
|
-
durationMs: number;
|
|
8
|
-
serverStarted: boolean;
|
|
9
|
-
}): Promise<void>;
|
|
10
|
-
//# sourceMappingURL=telemetry.d.ts.map
|
package/dist/telemetry.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAyDA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
|
package/dist/telemetry.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import ci from "ci-info";
|
|
6
|
-
import { PostHog } from "posthog-node";
|
|
7
|
-
const POSTHOG_API_KEY = "phc_rQdkCYr0DO4NcZBQXZnUwsHAbau9zuNwKIpil9FQP6v";
|
|
8
|
-
const POSTHOG_HOST = "https://us.i.posthog.com";
|
|
9
|
-
const GLOBAL_CONFIG_DIR = join(homedir(), ".skybridge");
|
|
10
|
-
const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, "config.json");
|
|
11
|
-
function isFlagSet(value) {
|
|
12
|
-
return value === "1" || value === "true";
|
|
13
|
-
}
|
|
14
|
-
function readGlobalConfig() {
|
|
15
|
-
try {
|
|
16
|
-
if (existsSync(GLOBAL_CONFIG_FILE)) {
|
|
17
|
-
return JSON.parse(readFileSync(GLOBAL_CONFIG_FILE, "utf-8"));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
function getMachineId() {
|
|
26
|
-
const config = readGlobalConfig();
|
|
27
|
-
if (config?.telemetry?.enabled === false) {
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
if (config?.machineId !== undefined) {
|
|
31
|
-
return config.machineId;
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
const machineId = randomUUID();
|
|
35
|
-
mkdirSync(GLOBAL_CONFIG_DIR, { recursive: true });
|
|
36
|
-
writeFileSync(GLOBAL_CONFIG_FILE, JSON.stringify({ ...config, machineId, telemetry: { enabled: true } }, null, 2));
|
|
37
|
-
return machineId;
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* One event per eval run, honoring the same opt-outs, machine id file, and
|
|
45
|
-
* env-var semantics as the skybridge CLI. Silently a no-op when telemetry is
|
|
46
|
-
* disabled.
|
|
47
|
-
*/
|
|
48
|
-
export async function captureEvalRun(properties) {
|
|
49
|
-
if (isFlagSet(process.env.SKYBRIDGE_TELEMETRY_DISABLED) ||
|
|
50
|
-
isFlagSet(process.env.DO_NOT_TRACK)) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const machineId = getMachineId();
|
|
54
|
-
if (machineId === undefined) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
try {
|
|
58
|
-
const client = new PostHog(POSTHOG_API_KEY, {
|
|
59
|
-
host: POSTHOG_HOST,
|
|
60
|
-
flushAt: 1,
|
|
61
|
-
flushInterval: 0,
|
|
62
|
-
});
|
|
63
|
-
client.capture({
|
|
64
|
-
distinctId: machineId,
|
|
65
|
-
event: "evals run",
|
|
66
|
-
properties: { ...properties, isCI: ci.isCI },
|
|
67
|
-
});
|
|
68
|
-
await Promise.race([
|
|
69
|
-
client.shutdown(),
|
|
70
|
-
new Promise((resolve) => setTimeout(resolve, 2_000)),
|
|
71
|
-
]);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=telemetry.js.map
|
package/dist/telemetry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|