@holokai/holo-test 1.4.2
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 +171 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +83 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts/audit-contract.d.ts +3 -0
- package/dist/contracts/audit-contract.d.ts.map +1 -0
- package/dist/contracts/audit-contract.js +11 -0
- package/dist/contracts/audit-contract.js.map +1 -0
- package/dist/contracts/pipeline-contract.d.ts +3 -0
- package/dist/contracts/pipeline-contract.d.ts.map +1 -0
- package/dist/contracts/pipeline-contract.js +9 -0
- package/dist/contracts/pipeline-contract.js.map +1 -0
- package/dist/contracts/roundtrip-contract.d.ts +3 -0
- package/dist/contracts/roundtrip-contract.d.ts.map +1 -0
- package/dist/contracts/roundtrip-contract.js +9 -0
- package/dist/contracts/roundtrip-contract.js.map +1 -0
- package/dist/contracts/wire-contract.d.ts +3 -0
- package/dist/contracts/wire-contract.d.ts.map +1 -0
- package/dist/contracts/wire-contract.js +9 -0
- package/dist/contracts/wire-contract.js.map +1 -0
- package/dist/dsl/assertions.d.ts +6 -0
- package/dist/dsl/assertions.d.ts.map +1 -0
- package/dist/dsl/assertions.js +54 -0
- package/dist/dsl/assertions.js.map +1 -0
- package/dist/dsl/suite-builder.d.ts +25 -0
- package/dist/dsl/suite-builder.d.ts.map +1 -0
- package/dist/dsl/suite-builder.js +96 -0
- package/dist/dsl/suite-builder.js.map +1 -0
- package/dist/factories/worker-request-factory.d.ts +5 -0
- package/dist/factories/worker-request-factory.d.ts.map +1 -0
- package/dist/factories/worker-request-factory.js +19 -0
- package/dist/factories/worker-request-factory.js.map +1 -0
- package/dist/fixtures/fixture-loader.d.ts +6 -0
- package/dist/fixtures/fixture-loader.d.ts.map +1 -0
- package/dist/fixtures/fixture-loader.js +23 -0
- package/dist/fixtures/fixture-loader.js.map +1 -0
- package/dist/helpers/env.d.ts +7 -0
- package/dist/helpers/env.d.ts.map +1 -0
- package/dist/helpers/env.js +18 -0
- package/dist/helpers/env.js.map +1 -0
- package/dist/helpers/matrix.d.ts +37 -0
- package/dist/helpers/matrix.d.ts.map +1 -0
- package/dist/helpers/matrix.js +43 -0
- package/dist/helpers/matrix.js.map +1 -0
- package/dist/helpers/mock-fetch.d.ts +10 -0
- package/dist/helpers/mock-fetch.d.ts.map +1 -0
- package/dist/helpers/mock-fetch.js +34 -0
- package/dist/helpers/mock-fetch.js.map +1 -0
- package/dist/helpers/stream-helpers.d.ts +4 -0
- package/dist/helpers/stream-helpers.d.ts.map +1 -0
- package/dist/helpers/stream-helpers.js +17 -0
- package/dist/helpers/stream-helpers.js.map +1 -0
- package/dist/helpers/vitest-helpers.d.ts +3 -0
- package/dist/helpers/vitest-helpers.d.ts.map +1 -0
- package/dist/helpers/vitest-helpers.js +13 -0
- package/dist/helpers/vitest-helpers.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/live/assertions.d.ts +8 -0
- package/dist/live/assertions.d.ts.map +1 -0
- package/dist/live/assertions.js +55 -0
- package/dist/live/assertions.js.map +1 -0
- package/dist/live/env.d.ts +4 -0
- package/dist/live/env.d.ts.map +1 -0
- package/dist/live/env.js +19 -0
- package/dist/live/env.js.map +1 -0
- package/dist/live/index.d.ts +6 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +5 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/live-tester.d.ts +3 -0
- package/dist/live/live-tester.d.ts.map +1 -0
- package/dist/live/live-tester.js +78 -0
- package/dist/live/live-tester.js.map +1 -0
- package/dist/live/payloads.d.ts +5 -0
- package/dist/live/payloads.d.ts.map +1 -0
- package/dist/live/payloads.js +38 -0
- package/dist/live/payloads.js.map +1 -0
- package/dist/live/types.d.ts +17 -0
- package/dist/live/types.d.ts.map +1 -0
- package/dist/live/types.js +2 -0
- package/dist/live/types.js.map +1 -0
- package/dist/runner/test-reporter.d.ts +3 -0
- package/dist/runner/test-reporter.d.ts.map +1 -0
- package/dist/runner/test-reporter.js +43 -0
- package/dist/runner/test-reporter.js.map +1 -0
- package/dist/runner/test-runner.d.ts +12 -0
- package/dist/runner/test-runner.d.ts.map +1 -0
- package/dist/runner/test-runner.js +37 -0
- package/dist/runner/test-runner.js.map +1 -0
- package/dist/services/http-fixture-server.d.ts +14 -0
- package/dist/services/http-fixture-server.d.ts.map +1 -0
- package/dist/services/http-fixture-server.js +93 -0
- package/dist/services/http-fixture-server.js.map +1 -0
- package/dist/services/ndjson-parser.d.ts +2 -0
- package/dist/services/ndjson-parser.d.ts.map +1 -0
- package/dist/services/ndjson-parser.js +7 -0
- package/dist/services/ndjson-parser.js.map +1 -0
- package/dist/services/plugin-loader.d.ts +7 -0
- package/dist/services/plugin-loader.d.ts.map +1 -0
- package/dist/services/plugin-loader.js +32 -0
- package/dist/services/plugin-loader.js.map +1 -0
- package/dist/services/sse-parser.d.ts +6 -0
- package/dist/services/sse-parser.d.ts.map +1 -0
- package/dist/services/sse-parser.js +22 -0
- package/dist/services/sse-parser.js.map +1 -0
- package/dist/testers/audit-tester.d.ts +4 -0
- package/dist/testers/audit-tester.d.ts.map +1 -0
- package/dist/testers/audit-tester.js +74 -0
- package/dist/testers/audit-tester.js.map +1 -0
- package/dist/testers/pipeline-tester.d.ts +4 -0
- package/dist/testers/pipeline-tester.d.ts.map +1 -0
- package/dist/testers/pipeline-tester.js +62 -0
- package/dist/testers/pipeline-tester.js.map +1 -0
- package/dist/testers/roundtrip-tester.d.ts +3 -0
- package/dist/testers/roundtrip-tester.d.ts.map +1 -0
- package/dist/testers/roundtrip-tester.js +77 -0
- package/dist/testers/roundtrip-tester.js.map +1 -0
- package/dist/testers/wire-tester.d.ts +4 -0
- package/dist/testers/wire-tester.d.ts.map +1 -0
- package/dist/testers/wire-tester.js +87 -0
- package/dist/testers/wire-tester.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-loader.js","sourceRoot":"","sources":["../../src/fixtures/fixture-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AAGvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAGnD;IACG,MAAM,OAAO,GAAG,GAAG,OAAO,uBAAuB,CAAC;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAoB,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;QAC7D,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,IAAI,MAAM,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,SAAS;QAClE,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,SAAS;QAElE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/helpers/env.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,SAA4B,CAAC;AAEpD,wBAAgB,UAAU,IAAI,MAAM,CAQnC;AAED,wBAAgB,aAAa,IAAI;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKrE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const hasGateway = !!process.env['HOLO_URL'];
|
|
2
|
+
export function gatewayUrl() {
|
|
3
|
+
let url = process.env['HOLO_URL'];
|
|
4
|
+
if (!url)
|
|
5
|
+
throw new Error('HOLO_URL not set');
|
|
6
|
+
url = url.replace(/\/+$/, '');
|
|
7
|
+
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
|
8
|
+
url = `http://${url}`;
|
|
9
|
+
}
|
|
10
|
+
return url;
|
|
11
|
+
}
|
|
12
|
+
export function getTestConfig() {
|
|
13
|
+
return {
|
|
14
|
+
gatewayUrl: gatewayUrl(),
|
|
15
|
+
token: process.env['HOLO_TEST_TOKEN'] ?? '',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/helpers/env.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAEpD,MAAM,UAAU,UAAU;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,GAAG,GAAG,UAAU,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO;QACH,UAAU,EAAE,UAAU,EAAE;QACxB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE;KAC9C,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface DiscoveredModel {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
capabilities: string[];
|
|
5
|
+
input_modalities?: string[];
|
|
6
|
+
output_modalities?: string[];
|
|
7
|
+
supported_parameters?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface DiscoveredProvider {
|
|
10
|
+
family: string;
|
|
11
|
+
model: string;
|
|
12
|
+
models: DiscoveredModel[];
|
|
13
|
+
}
|
|
14
|
+
export interface ProviderDiscoveryClient {
|
|
15
|
+
applications: {
|
|
16
|
+
list(): Promise<Array<{
|
|
17
|
+
slug: string;
|
|
18
|
+
name: string;
|
|
19
|
+
provider_family: string;
|
|
20
|
+
default_model?: string;
|
|
21
|
+
}>>;
|
|
22
|
+
};
|
|
23
|
+
models: {
|
|
24
|
+
list(): Promise<Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
provider_family: string;
|
|
28
|
+
capabilities: string[];
|
|
29
|
+
input_modalities?: string[];
|
|
30
|
+
output_modalities?: string[];
|
|
31
|
+
supported_parameters?: string[];
|
|
32
|
+
}>>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare const providerMatrix: DiscoveredProvider[];
|
|
36
|
+
export declare function discoverProviders(client: ProviderDiscoveryClient): Promise<DiscoveredProvider[]>;
|
|
37
|
+
//# sourceMappingURL=matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../../src/helpers/matrix.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACpC,YAAY,EAAE;QACV,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;KAC3G,CAAC;IACF,MAAM,EAAE;QACJ,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC,CAAC;KACrM,CAAC;CACL;AAED,eAAO,MAAM,cAAc,EAAE,kBAAkB,EAAO,CAAC;AAEvD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAoCtG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const providerMatrix = [];
|
|
2
|
+
export async function discoverProviders(client) {
|
|
3
|
+
const [apps, allModels] = await Promise.all([
|
|
4
|
+
client.applications.list(),
|
|
5
|
+
client.models.list(),
|
|
6
|
+
]);
|
|
7
|
+
const modelsByFamily = new Map();
|
|
8
|
+
for (const m of allModels) {
|
|
9
|
+
const family = m.provider_family.toLowerCase();
|
|
10
|
+
if (!family)
|
|
11
|
+
continue;
|
|
12
|
+
const list = modelsByFamily.get(family) ?? [];
|
|
13
|
+
const discovered = { id: m.id, name: m.name, capabilities: m.capabilities };
|
|
14
|
+
if (m.input_modalities)
|
|
15
|
+
discovered.input_modalities = m.input_modalities;
|
|
16
|
+
if (m.output_modalities)
|
|
17
|
+
discovered.output_modalities = m.output_modalities;
|
|
18
|
+
if (m.supported_parameters)
|
|
19
|
+
discovered.supported_parameters = m.supported_parameters;
|
|
20
|
+
list.push(discovered);
|
|
21
|
+
modelsByFamily.set(family, list);
|
|
22
|
+
}
|
|
23
|
+
const families = new Map();
|
|
24
|
+
for (const app of apps) {
|
|
25
|
+
const family = app.provider_family.toLowerCase();
|
|
26
|
+
if (families.has(family))
|
|
27
|
+
continue;
|
|
28
|
+
const models = modelsByFamily.get(family) ?? [];
|
|
29
|
+
const chatModel = models.find(m => m.input_modalities?.includes('text')) || models.find(m => m.capabilities.includes('chat'));
|
|
30
|
+
if (!chatModel)
|
|
31
|
+
continue;
|
|
32
|
+
families.set(family, {
|
|
33
|
+
family,
|
|
34
|
+
model: chatModel.id,
|
|
35
|
+
models,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const result = [...families.values()];
|
|
39
|
+
providerMatrix.length = 0;
|
|
40
|
+
providerMatrix.push(...result);
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../src/helpers/matrix.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,cAAc,GAAyB,EAAE,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA+B;IACnE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;KACvB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAoB,EAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAC,CAAC;QAC3F,IAAI,CAAC,CAAC,gBAAgB;YAAE,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAAC;QACzE,IAAI,CAAC,CAAC,iBAAiB;YAAE,UAAU,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC;QAC5E,IAAI,CAAC,CAAC,oBAAoB;YAAE,UAAU,CAAC,oBAAoB,GAAG,CAAC,CAAC,oBAAoB,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtB,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QACnC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9H,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;YACjB,MAAM;YACN,KAAK,EAAE,SAAS,CAAC,EAAE;YACnB,MAAM;SACT,CAAC,CAAC;IACP,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface MockResponse {
|
|
2
|
+
status?: number;
|
|
3
|
+
statusText?: string;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare function createMockFetch(responses: MockResponse[]): typeof globalThis.fetch;
|
|
8
|
+
export declare function createSseMockFetch(chunks: string[]): typeof globalThis.fetch;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=mock-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-fetch.d.ts","sourceRoot":"","sources":["../../src/helpers/mock-fetch.ts"],"names":[],"mappings":"AAAA,UAAU,YAAY;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,UAAU,CAAC,KAAK,CAmBlF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,UAAU,CAAC,KAAK,CAiB5E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function createMockFetch(responses) {
|
|
2
|
+
let callIndex = 0;
|
|
3
|
+
return async (_url, _init) => {
|
|
4
|
+
const mock = responses[callIndex++];
|
|
5
|
+
if (!mock)
|
|
6
|
+
throw new Error(`No mock response for call ${callIndex - 1}`);
|
|
7
|
+
const status = mock.status ?? 200;
|
|
8
|
+
const statusText = mock.statusText ?? 'OK';
|
|
9
|
+
const headers = new Headers(mock.headers);
|
|
10
|
+
if (!headers.has('Content-Type')) {
|
|
11
|
+
headers.set('Content-Type', 'application/json');
|
|
12
|
+
}
|
|
13
|
+
const body = typeof mock.body === 'string' ? mock.body : JSON.stringify(mock.body);
|
|
14
|
+
return new Response(body, { status, statusText, headers });
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createSseMockFetch(chunks) {
|
|
18
|
+
return async (_url, _init) => {
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
const stream = new ReadableStream({
|
|
21
|
+
start(controller) {
|
|
22
|
+
for (const chunk of chunks) {
|
|
23
|
+
controller.enqueue(encoder.encode(chunk));
|
|
24
|
+
}
|
|
25
|
+
controller.close();
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return new Response(stream, {
|
|
29
|
+
status: 200,
|
|
30
|
+
headers: { 'Content-Type': 'text/event-stream' },
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mock-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-fetch.js","sourceRoot":"","sources":["../../src/helpers/mock-fetch.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,eAAe,CAAC,SAAyB;IACrD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,KAAK,EAAE,IAA4B,EAAE,KAAmB,EAAqB,EAAE;QAClF,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAgB;IAC/C,OAAO,KAAK,EAAE,IAA4B,EAAE,KAAmB,EAAqB,EAAE;QAClF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAa;YAC1C,KAAK,CAAC,UAAU;gBACZ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBACzB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;SACJ,CAAC,CAAC;QAEH,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAC,cAAc,EAAE,mBAAmB,EAAC;SACjD,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HoloStreamEvent } from '@holokai/holo-types/holo';
|
|
2
|
+
export declare function collectStreamText(stream: AsyncIterable<HoloStreamEvent>): Promise<string>;
|
|
3
|
+
export declare function collectStreamEvents(stream: AsyncIterable<HoloStreamEvent>): Promise<HoloStreamEvent[]>;
|
|
4
|
+
//# sourceMappingURL=stream-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-helpers.d.ts","sourceRoot":"","sources":["../../src/helpers/stream-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAE9D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/F;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5G"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function collectStreamText(stream) {
|
|
2
|
+
const parts = [];
|
|
3
|
+
for await (const event of stream) {
|
|
4
|
+
if (event.type === 'response.output_text.delta' && event.delta) {
|
|
5
|
+
parts.push(event.delta);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return parts.join('');
|
|
9
|
+
}
|
|
10
|
+
export async function collectStreamEvents(stream) {
|
|
11
|
+
const events = [];
|
|
12
|
+
for await (const event of stream) {
|
|
13
|
+
events.push(event);
|
|
14
|
+
}
|
|
15
|
+
return events;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stream-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-helpers.js","sourceRoot":"","sources":["../../src/helpers/stream-helpers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAsC;IAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAsC;IAC5E,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-helpers.d.ts","sourceRoot":"","sources":["../../src/helpers/vitest-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAUzD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
export function assertTestResult(result) {
|
|
3
|
+
if (result.passed)
|
|
4
|
+
return;
|
|
5
|
+
const messages = result.errors.map((e) => {
|
|
6
|
+
let msg = `${e.field}: expected ${JSON.stringify(e.expected)}, got ${JSON.stringify(e.actual)}`;
|
|
7
|
+
if (e.diff)
|
|
8
|
+
msg += `\n${e.diff}`;
|
|
9
|
+
return msg;
|
|
10
|
+
});
|
|
11
|
+
expect.fail(`${result.category} conformance failed for "${result.name}":\n${messages.join('\n')}`);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=vitest-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-helpers.js","sourceRoot":"","sources":["../../src/helpers/vitest-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAG9B,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IAC/C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO;IAE1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAChG,IAAI,CAAC,CAAC,IAAI;YAAE,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,4BAA4B,MAAM,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvG,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { testWire } from './testers/wire-tester.js';
|
|
2
|
+
export { testAudit } from './testers/audit-tester.js';
|
|
3
|
+
export { testPipeline } from './testers/pipeline-tester.js';
|
|
4
|
+
export { testRoundTrip } from './testers/roundtrip-tester.js';
|
|
5
|
+
export type { FixtureScenario, SdkAdapter, TestResult, AssertionError } from './types.js';
|
|
6
|
+
export { createTestWorkerRequest, createTestEnvelope } from './factories/worker-request-factory.js';
|
|
7
|
+
export { suite } from './dsl/suite-builder.js';
|
|
8
|
+
export { runTests, type RunOptions } from './runner/test-runner.js';
|
|
9
|
+
export { loadFixtures } from './fixtures/fixture-loader.js';
|
|
10
|
+
export { loadPlugin, loadAllPlugins, discoverPlugins, getLoadedPlugins } from './services/plugin-loader.js';
|
|
11
|
+
export { HttpFixtureServer } from './services/http-fixture-server.js';
|
|
12
|
+
export { parseSseBody, type SseFrame } from './services/sse-parser.js';
|
|
13
|
+
export { parseNdjsonBody } from './services/ndjson-parser.js';
|
|
14
|
+
export { runWireContract } from './contracts/wire-contract.js';
|
|
15
|
+
export { runAuditContract } from './contracts/audit-contract.js';
|
|
16
|
+
export { runPipelineContract } from './contracts/pipeline-contract.js';
|
|
17
|
+
export { runRoundTripContract } from './contracts/roundtrip-contract.js';
|
|
18
|
+
export { hasGateway, gatewayUrl, getTestConfig } from './helpers/env.js';
|
|
19
|
+
export { collectStreamText, collectStreamEvents } from './helpers/stream-helpers.js';
|
|
20
|
+
export { createMockFetch, createSseMockFetch } from './helpers/mock-fetch.js';
|
|
21
|
+
export { discoverProviders, providerMatrix } from './helpers/matrix.js';
|
|
22
|
+
export type { DiscoveredProvider, DiscoveredModel, ProviderDiscoveryClient } from './helpers/matrix.js';
|
|
23
|
+
export { assertTestResult } from './helpers/vitest-helpers.js';
|
|
24
|
+
export { runLiveTest, isProviderAvailable, buildPayload, registerPayloadBuilder } from './live';
|
|
25
|
+
export type { LiveTestConfig, LiveTestResult } from './live';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAC5D,YAAY,EAAC,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAC,MAAM,YAAY,CAAC;AACxF,OAAO,EAAC,uBAAuB,EAAE,kBAAkB,EAAC,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAC,KAAK,EAAC,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAC,QAAQ,EAAE,KAAK,UAAU,EAAC,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAC,YAAY,EAAE,KAAK,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACtE,YAAY,EAAC,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,sBAAsB,EAAC,MAAM,QAAQ,CAAC;AAC9F,YAAY,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { testWire } from './testers/wire-tester.js';
|
|
2
|
+
export { testAudit } from './testers/audit-tester.js';
|
|
3
|
+
export { testPipeline } from './testers/pipeline-tester.js';
|
|
4
|
+
export { testRoundTrip } from './testers/roundtrip-tester.js';
|
|
5
|
+
export { createTestWorkerRequest, createTestEnvelope } from './factories/worker-request-factory.js';
|
|
6
|
+
export { suite } from './dsl/suite-builder.js';
|
|
7
|
+
export { runTests } from './runner/test-runner.js';
|
|
8
|
+
export { loadFixtures } from './fixtures/fixture-loader.js';
|
|
9
|
+
export { loadPlugin, loadAllPlugins, discoverPlugins, getLoadedPlugins } from './services/plugin-loader.js';
|
|
10
|
+
export { HttpFixtureServer } from './services/http-fixture-server.js';
|
|
11
|
+
export { parseSseBody } from './services/sse-parser.js';
|
|
12
|
+
export { parseNdjsonBody } from './services/ndjson-parser.js';
|
|
13
|
+
export { runWireContract } from './contracts/wire-contract.js';
|
|
14
|
+
export { runAuditContract } from './contracts/audit-contract.js';
|
|
15
|
+
export { runPipelineContract } from './contracts/pipeline-contract.js';
|
|
16
|
+
export { runRoundTripContract } from './contracts/roundtrip-contract.js';
|
|
17
|
+
export { hasGateway, gatewayUrl, getTestConfig } from './helpers/env.js';
|
|
18
|
+
export { collectStreamText, collectStreamEvents } from './helpers/stream-helpers.js';
|
|
19
|
+
export { createMockFetch, createSseMockFetch } from './helpers/mock-fetch.js';
|
|
20
|
+
export { discoverProviders, providerMatrix } from './helpers/matrix.js';
|
|
21
|
+
export { assertTestResult } from './helpers/vitest-helpers.js';
|
|
22
|
+
export { runLiveTest, isProviderAvailable, buildPayload, registerPayloadBuilder } from './live';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAC,SAAS,EAAC,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAE5D,OAAO,EAAC,uBAAuB,EAAE,kBAAkB,EAAC,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAC,KAAK,EAAC,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAC,QAAQ,EAAkB,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAC,YAAY,EAAgB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEtE,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,sBAAsB,EAAC,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProviderEvent, StreamEventSequence } from '@holokai/holo-types/provider';
|
|
2
|
+
import type { AssertionError } from '../types';
|
|
3
|
+
export declare function assertHasDoneEvent(events: ProviderEvent[]): AssertionError | null;
|
|
4
|
+
export declare function assertTextNotEmpty(text: string | undefined): AssertionError | null;
|
|
5
|
+
export declare function assertHasFinishReason(doneEvent: ProviderEvent): AssertionError | null;
|
|
6
|
+
export declare function assertMultipleStreamEvents(events: ProviderEvent[]): AssertionError | null;
|
|
7
|
+
export declare function assertEventSequence(events: ProviderEvent[], sequence: StreamEventSequence): AssertionError | null;
|
|
8
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/live/assertions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,mBAAmB,EAAC,MAAM,8BAA8B,CAAC;AACrF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,UAAU,CAAC;AAE7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc,GAAG,IAAI,CAIjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAGlF;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAIrF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc,GAAG,IAAI,CAIzF;AAED,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,aAAa,EAAE,EACvB,QAAQ,EAAE,mBAAmB,GAC9B,cAAc,GAAG,IAAI,CAiCvB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function assertHasDoneEvent(events) {
|
|
2
|
+
const done = events.find(e => e.type === 'done');
|
|
3
|
+
if (!done)
|
|
4
|
+
return { field: 'done_event', expected: 'present', actual: 'missing' };
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
export function assertTextNotEmpty(text) {
|
|
8
|
+
if (!text || text.trim().length === 0)
|
|
9
|
+
return { field: 'text', expected: 'non-empty string', actual: text ?? '' };
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
export function assertHasFinishReason(doneEvent) {
|
|
13
|
+
if (doneEvent.type !== 'done')
|
|
14
|
+
return { field: 'finish_reason', expected: 'done event', actual: doneEvent.type };
|
|
15
|
+
if (!doneEvent.message)
|
|
16
|
+
return { field: 'finish_reason', expected: 'present in message', actual: 'missing' };
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
export function assertMultipleStreamEvents(events) {
|
|
20
|
+
const streamEvents = events.filter(e => e.type === 'stream_event' || e.type === 'text_delta');
|
|
21
|
+
if (streamEvents.length < 2)
|
|
22
|
+
return { field: 'stream_events', expected: '>= 2', actual: String(streamEvents.length) };
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
export function assertEventSequence(events, sequence) {
|
|
26
|
+
const streamEvents = events
|
|
27
|
+
.filter(e => e.type === 'stream_event')
|
|
28
|
+
.map(e => e.event?.type ?? 'unknown');
|
|
29
|
+
if (streamEvents.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const repeatableSet = new Set(sequence.repeatable);
|
|
32
|
+
let orderIdx = 0;
|
|
33
|
+
for (const eventType of streamEvents) {
|
|
34
|
+
if (repeatableSet.has(eventType)) {
|
|
35
|
+
const idx = sequence.ordered.indexOf(eventType);
|
|
36
|
+
if (idx >= 0 && idx >= orderIdx) {
|
|
37
|
+
orderIdx = idx;
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
while (orderIdx < sequence.ordered.length && sequence.ordered[orderIdx] !== eventType) {
|
|
42
|
+
if (repeatableSet.has(sequence.ordered[orderIdx])) {
|
|
43
|
+
orderIdx++;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (orderIdx < sequence.ordered.length && sequence.ordered[orderIdx] === eventType) {
|
|
50
|
+
orderIdx++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../src/live/assertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/live/env.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI5D;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG3D"}
|
package/dist/live/env.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const API_KEY_ALIASES = {
|
|
2
|
+
claude: 'ANTHROPIC_API_KEY',
|
|
3
|
+
gemini: 'GOOGLE_API_KEY',
|
|
4
|
+
};
|
|
5
|
+
export function getApiKey(family) {
|
|
6
|
+
const alias = API_KEY_ALIASES[family];
|
|
7
|
+
if (alias && process.env[alias])
|
|
8
|
+
return process.env[alias];
|
|
9
|
+
return process.env[`${family.toUpperCase()}_API_KEY`];
|
|
10
|
+
}
|
|
11
|
+
export function getModel(family) {
|
|
12
|
+
return process.env[`${family.toUpperCase()}_TEST_MODEL`] ?? 'auto';
|
|
13
|
+
}
|
|
14
|
+
export function isProviderAvailable(family) {
|
|
15
|
+
if (family === 'ollama')
|
|
16
|
+
return !!process.env.OLLAMA_HOST;
|
|
17
|
+
return !!getApiKey(family);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/live/env.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAA2B;IAC5C,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,gBAAgB;CAC3B,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,MAAc;IACpC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAC9C,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1D,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { LiveTestConfig, LiveTestResult } from './types';
|
|
2
|
+
export { getApiKey, getModel, isProviderAvailable } from './env';
|
|
3
|
+
export { buildPayload, registerPayloadBuilder } from './payloads';
|
|
4
|
+
export { assertHasDoneEvent, assertTextNotEmpty, assertHasFinishReason, assertMultipleStreamEvents, assertEventSequence } from './assertions';
|
|
5
|
+
export { runLiveTest } from './live-tester';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAC,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAE,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAChE,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getApiKey, getModel, isProviderAvailable } from './env';
|
|
2
|
+
export { buildPayload, registerPayloadBuilder } from './payloads';
|
|
3
|
+
export { assertHasDoneEvent, assertTextNotEmpty, assertHasFinishReason, assertMultipleStreamEvents, assertEventSequence } from './assertions';
|
|
4
|
+
export { runLiveTest } from './live-tester';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAC,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAE,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAChE,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-tester.d.ts","sourceRoot":"","sources":["../../src/live/live-tester.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAK5C,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CA6E7F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { loadPlugin } from '@holokai/holo-sdk/plugin';
|
|
2
|
+
import { createWorkerRequest } from '@holokai/holo-sdk/provider';
|
|
3
|
+
import { ProtocolCapability } from '@holokai/holo-types/entities';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import { getApiKey, getModel } from './env';
|
|
6
|
+
import { buildPayload } from './payloads';
|
|
7
|
+
import { assertHasDoneEvent, assertTextNotEmpty, assertMultipleStreamEvents, assertEventSequence } from './assertions';
|
|
8
|
+
export async function runLiveTest(family, streaming) {
|
|
9
|
+
const start = performance.now();
|
|
10
|
+
const errors = [];
|
|
11
|
+
try {
|
|
12
|
+
const plugin = await loadPlugin(family);
|
|
13
|
+
const routes = plugin.getRoutes();
|
|
14
|
+
const chatRoutes = routes.filter(r => r.protocol.capability === ProtocolCapability.CHAT);
|
|
15
|
+
if (chatRoutes.length === 0) {
|
|
16
|
+
return { family, protocol: 'none', streaming, passed: false, duration: 0, errors: [{ field: 'routes', expected: 'at least one CHAT route', actual: 'none' }] };
|
|
17
|
+
}
|
|
18
|
+
const route = chatRoutes[0];
|
|
19
|
+
const protocol = route.protocol;
|
|
20
|
+
const apiKey = getApiKey(family);
|
|
21
|
+
const model = getModel(family);
|
|
22
|
+
const provider = await plugin.createProvider(uuidv4(), family, { apiKey, baseUrl: process.env.OLLAMA_HOST });
|
|
23
|
+
const payload = buildPayload(protocol.name, model, streaming);
|
|
24
|
+
const request = createWorkerRequest({
|
|
25
|
+
provider: { id: uuidv4(), name: family },
|
|
26
|
+
protocol,
|
|
27
|
+
payload,
|
|
28
|
+
sourceId: uuidv4(),
|
|
29
|
+
isStreaming: streaming,
|
|
30
|
+
});
|
|
31
|
+
const queue = await provider.processWorkerRequest(request);
|
|
32
|
+
const events = [];
|
|
33
|
+
for await (const event of queue) {
|
|
34
|
+
events.push(event);
|
|
35
|
+
}
|
|
36
|
+
const doneEvent = events.find(e => e.type === 'done');
|
|
37
|
+
const errorEvent = events.find(e => e.type === 'error');
|
|
38
|
+
if (errorEvent && errorEvent.type === 'error') {
|
|
39
|
+
const errMsg = errorEvent.error?.message ?? JSON.stringify(errorEvent.error);
|
|
40
|
+
errors.push({ field: 'error', expected: 'no error', actual: errMsg });
|
|
41
|
+
return { family, protocol: protocol.name, streaming, passed: false, duration: performance.now() - start, errors };
|
|
42
|
+
}
|
|
43
|
+
const doneErr = assertHasDoneEvent(events);
|
|
44
|
+
if (doneErr)
|
|
45
|
+
errors.push(doneErr);
|
|
46
|
+
const text = doneEvent?.type === 'done' ? doneEvent.text : undefined;
|
|
47
|
+
const textErr = assertTextNotEmpty(text);
|
|
48
|
+
if (textErr)
|
|
49
|
+
errors.push(textErr);
|
|
50
|
+
if (streaming) {
|
|
51
|
+
const streamErr = assertMultipleStreamEvents(events);
|
|
52
|
+
if (streamErr)
|
|
53
|
+
errors.push(streamErr);
|
|
54
|
+
if (protocol.streamEventSequence) {
|
|
55
|
+
const seqErr = assertEventSequence(events, protocol.streamEventSequence);
|
|
56
|
+
if (seqErr)
|
|
57
|
+
errors.push(seqErr);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const result = {
|
|
61
|
+
family,
|
|
62
|
+
protocol: protocol.name,
|
|
63
|
+
streaming,
|
|
64
|
+
passed: errors.length === 0,
|
|
65
|
+
duration: performance.now() - start,
|
|
66
|
+
eventCount: events.length,
|
|
67
|
+
errors,
|
|
68
|
+
};
|
|
69
|
+
if (text)
|
|
70
|
+
result.text = text;
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
errors.push({ field: 'exception', expected: 'no exception', actual: err.message ?? String(err) });
|
|
75
|
+
return { family, protocol: 'unknown', streaming, passed: false, duration: performance.now() - start, errors };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=live-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-tester.js","sourceRoot":"","sources":["../../src/live/live-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type PayloadBuilder = (model: string, streaming: boolean) => any;
|
|
2
|
+
export declare function registerPayloadBuilder(protocol: string, builder: PayloadBuilder): void;
|
|
3
|
+
export declare function buildPayload(protocol: string, model: string, streaming: boolean): any;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=payloads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloads.d.ts","sourceRoot":"","sources":["../../src/live/payloads.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,GAAG,CAAC;AAIjE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEtF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,GAAG,CAIrF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const builders = new Map();
|
|
2
|
+
export function registerPayloadBuilder(protocol, builder) {
|
|
3
|
+
builders.set(protocol, builder);
|
|
4
|
+
}
|
|
5
|
+
export function buildPayload(protocol, model, streaming) {
|
|
6
|
+
const builder = builders.get(protocol);
|
|
7
|
+
if (!builder)
|
|
8
|
+
throw new Error(`No payload builder for protocol: ${protocol}. Register one via registerPayloadBuilder().`);
|
|
9
|
+
return builder(model, streaming);
|
|
10
|
+
}
|
|
11
|
+
registerPayloadBuilder('claude.messages', (model, stream) => ({
|
|
12
|
+
model, max_tokens: 50, stream,
|
|
13
|
+
messages: [{ role: 'user', content: 'Say hello in one sentence.' }],
|
|
14
|
+
}));
|
|
15
|
+
registerPayloadBuilder('openai.chatCompletions', (model, stream) => ({
|
|
16
|
+
model, max_completion_tokens: 50, stream,
|
|
17
|
+
messages: [{ role: 'user', content: 'Say hello in one sentence.' }],
|
|
18
|
+
}));
|
|
19
|
+
registerPayloadBuilder('openai.responses', (model, stream) => ({
|
|
20
|
+
model, max_output_tokens: 50, stream,
|
|
21
|
+
input: 'Say hello in one sentence.',
|
|
22
|
+
}));
|
|
23
|
+
registerPayloadBuilder('gemini.generateContent', (model, _stream) => ({
|
|
24
|
+
model, contents: [{ parts: [{ text: 'Say hello in one sentence.' }] }],
|
|
25
|
+
generationConfig: { maxOutputTokens: 50 },
|
|
26
|
+
}));
|
|
27
|
+
registerPayloadBuilder('gemini.streamGenerateContent', (model, _stream) => ({
|
|
28
|
+
model, contents: [{ parts: [{ text: 'Say hello in one sentence.' }] }],
|
|
29
|
+
generationConfig: { maxOutputTokens: 50 },
|
|
30
|
+
}));
|
|
31
|
+
registerPayloadBuilder('ollama.chat', (model, stream) => ({
|
|
32
|
+
model, stream,
|
|
33
|
+
messages: [{ role: 'user', content: 'Say hello in one sentence.' }],
|
|
34
|
+
}));
|
|
35
|
+
registerPayloadBuilder('ollama.generate', (model, stream) => ({
|
|
36
|
+
model, stream, prompt: 'Say hello in one sentence.',
|
|
37
|
+
}));
|
|
38
|
+
//# sourceMappingURL=payloads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloads.js","sourceRoot":"","sources":["../../src/live/payloads.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,OAAuB;IAC5E,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAE,SAAkB;IAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,8CAA8C,CAAC,CAAC;IAC1H,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,sBAAsB,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM;IAC7B,QAAQ,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAC,CAAC;CACpE,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM;IACxC,QAAQ,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAC,CAAC;CACpE,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM;IACpC,KAAK,EAAE,4BAA4B;CACtC,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,EAAC,IAAI,EAAE,4BAA4B,EAAC,CAAC,EAAC,CAAC;IAClE,gBAAgB,EAAE,EAAC,eAAe,EAAE,EAAE,EAAC;CAC1C,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,8BAA8B,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACxE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,EAAC,IAAI,EAAE,4BAA4B,EAAC,CAAC,EAAC,CAAC;IAClE,gBAAgB,EAAE,EAAC,eAAe,EAAE,EAAE,EAAC;CAC1C,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAC,CAAC;CACpE,CAAC,CAAC,CAAC;AAEJ,sBAAsB,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B;CACtD,CAAC,CAAC,CAAC"}
|