@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.
Files changed (130) hide show
  1. package/README.md +171 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +83 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/contracts/audit-contract.d.ts +3 -0
  7. package/dist/contracts/audit-contract.d.ts.map +1 -0
  8. package/dist/contracts/audit-contract.js +11 -0
  9. package/dist/contracts/audit-contract.js.map +1 -0
  10. package/dist/contracts/pipeline-contract.d.ts +3 -0
  11. package/dist/contracts/pipeline-contract.d.ts.map +1 -0
  12. package/dist/contracts/pipeline-contract.js +9 -0
  13. package/dist/contracts/pipeline-contract.js.map +1 -0
  14. package/dist/contracts/roundtrip-contract.d.ts +3 -0
  15. package/dist/contracts/roundtrip-contract.d.ts.map +1 -0
  16. package/dist/contracts/roundtrip-contract.js +9 -0
  17. package/dist/contracts/roundtrip-contract.js.map +1 -0
  18. package/dist/contracts/wire-contract.d.ts +3 -0
  19. package/dist/contracts/wire-contract.d.ts.map +1 -0
  20. package/dist/contracts/wire-contract.js +9 -0
  21. package/dist/contracts/wire-contract.js.map +1 -0
  22. package/dist/dsl/assertions.d.ts +6 -0
  23. package/dist/dsl/assertions.d.ts.map +1 -0
  24. package/dist/dsl/assertions.js +54 -0
  25. package/dist/dsl/assertions.js.map +1 -0
  26. package/dist/dsl/suite-builder.d.ts +25 -0
  27. package/dist/dsl/suite-builder.d.ts.map +1 -0
  28. package/dist/dsl/suite-builder.js +96 -0
  29. package/dist/dsl/suite-builder.js.map +1 -0
  30. package/dist/factories/worker-request-factory.d.ts +5 -0
  31. package/dist/factories/worker-request-factory.d.ts.map +1 -0
  32. package/dist/factories/worker-request-factory.js +19 -0
  33. package/dist/factories/worker-request-factory.js.map +1 -0
  34. package/dist/fixtures/fixture-loader.d.ts +6 -0
  35. package/dist/fixtures/fixture-loader.d.ts.map +1 -0
  36. package/dist/fixtures/fixture-loader.js +23 -0
  37. package/dist/fixtures/fixture-loader.js.map +1 -0
  38. package/dist/helpers/env.d.ts +7 -0
  39. package/dist/helpers/env.d.ts.map +1 -0
  40. package/dist/helpers/env.js +18 -0
  41. package/dist/helpers/env.js.map +1 -0
  42. package/dist/helpers/matrix.d.ts +37 -0
  43. package/dist/helpers/matrix.d.ts.map +1 -0
  44. package/dist/helpers/matrix.js +43 -0
  45. package/dist/helpers/matrix.js.map +1 -0
  46. package/dist/helpers/mock-fetch.d.ts +10 -0
  47. package/dist/helpers/mock-fetch.d.ts.map +1 -0
  48. package/dist/helpers/mock-fetch.js +34 -0
  49. package/dist/helpers/mock-fetch.js.map +1 -0
  50. package/dist/helpers/stream-helpers.d.ts +4 -0
  51. package/dist/helpers/stream-helpers.d.ts.map +1 -0
  52. package/dist/helpers/stream-helpers.js +17 -0
  53. package/dist/helpers/stream-helpers.js.map +1 -0
  54. package/dist/helpers/vitest-helpers.d.ts +3 -0
  55. package/dist/helpers/vitest-helpers.d.ts.map +1 -0
  56. package/dist/helpers/vitest-helpers.js +13 -0
  57. package/dist/helpers/vitest-helpers.js.map +1 -0
  58. package/dist/index.d.ts +26 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +23 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/live/assertions.d.ts +8 -0
  63. package/dist/live/assertions.d.ts.map +1 -0
  64. package/dist/live/assertions.js +55 -0
  65. package/dist/live/assertions.js.map +1 -0
  66. package/dist/live/env.d.ts +4 -0
  67. package/dist/live/env.d.ts.map +1 -0
  68. package/dist/live/env.js +19 -0
  69. package/dist/live/env.js.map +1 -0
  70. package/dist/live/index.d.ts +6 -0
  71. package/dist/live/index.d.ts.map +1 -0
  72. package/dist/live/index.js +5 -0
  73. package/dist/live/index.js.map +1 -0
  74. package/dist/live/live-tester.d.ts +3 -0
  75. package/dist/live/live-tester.d.ts.map +1 -0
  76. package/dist/live/live-tester.js +78 -0
  77. package/dist/live/live-tester.js.map +1 -0
  78. package/dist/live/payloads.d.ts +5 -0
  79. package/dist/live/payloads.d.ts.map +1 -0
  80. package/dist/live/payloads.js +38 -0
  81. package/dist/live/payloads.js.map +1 -0
  82. package/dist/live/types.d.ts +17 -0
  83. package/dist/live/types.d.ts.map +1 -0
  84. package/dist/live/types.js +2 -0
  85. package/dist/live/types.js.map +1 -0
  86. package/dist/runner/test-reporter.d.ts +3 -0
  87. package/dist/runner/test-reporter.d.ts.map +1 -0
  88. package/dist/runner/test-reporter.js +43 -0
  89. package/dist/runner/test-reporter.js.map +1 -0
  90. package/dist/runner/test-runner.d.ts +12 -0
  91. package/dist/runner/test-runner.d.ts.map +1 -0
  92. package/dist/runner/test-runner.js +37 -0
  93. package/dist/runner/test-runner.js.map +1 -0
  94. package/dist/services/http-fixture-server.d.ts +14 -0
  95. package/dist/services/http-fixture-server.d.ts.map +1 -0
  96. package/dist/services/http-fixture-server.js +93 -0
  97. package/dist/services/http-fixture-server.js.map +1 -0
  98. package/dist/services/ndjson-parser.d.ts +2 -0
  99. package/dist/services/ndjson-parser.d.ts.map +1 -0
  100. package/dist/services/ndjson-parser.js +7 -0
  101. package/dist/services/ndjson-parser.js.map +1 -0
  102. package/dist/services/plugin-loader.d.ts +7 -0
  103. package/dist/services/plugin-loader.d.ts.map +1 -0
  104. package/dist/services/plugin-loader.js +32 -0
  105. package/dist/services/plugin-loader.js.map +1 -0
  106. package/dist/services/sse-parser.d.ts +6 -0
  107. package/dist/services/sse-parser.d.ts.map +1 -0
  108. package/dist/services/sse-parser.js +22 -0
  109. package/dist/services/sse-parser.js.map +1 -0
  110. package/dist/testers/audit-tester.d.ts +4 -0
  111. package/dist/testers/audit-tester.d.ts.map +1 -0
  112. package/dist/testers/audit-tester.js +74 -0
  113. package/dist/testers/audit-tester.js.map +1 -0
  114. package/dist/testers/pipeline-tester.d.ts +4 -0
  115. package/dist/testers/pipeline-tester.d.ts.map +1 -0
  116. package/dist/testers/pipeline-tester.js +62 -0
  117. package/dist/testers/pipeline-tester.js.map +1 -0
  118. package/dist/testers/roundtrip-tester.d.ts +3 -0
  119. package/dist/testers/roundtrip-tester.d.ts.map +1 -0
  120. package/dist/testers/roundtrip-tester.js +77 -0
  121. package/dist/testers/roundtrip-tester.js.map +1 -0
  122. package/dist/testers/wire-tester.d.ts +4 -0
  123. package/dist/testers/wire-tester.d.ts.map +1 -0
  124. package/dist/testers/wire-tester.js +87 -0
  125. package/dist/testers/wire-tester.js.map +1 -0
  126. package/dist/types.d.ts +51 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +2 -0
  129. package/dist/types.js.map +1 -0
  130. 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,7 @@
1
+ export declare const hasGateway: boolean;
2
+ export declare function gatewayUrl(): string;
3
+ export declare function getTestConfig(): {
4
+ gatewayUrl: string;
5
+ token: string;
6
+ };
7
+ //# sourceMappingURL=env.d.ts.map
@@ -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,3 @@
1
+ import type { TestResult } from '../types.js';
2
+ export declare function assertTestResult(result: TestResult): void;
3
+ //# sourceMappingURL=vitest-helpers.d.ts.map
@@ -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"}
@@ -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,4 @@
1
+ export declare function getApiKey(family: string): string | undefined;
2
+ export declare function getModel(family: string): string;
3
+ export declare function isProviderAvailable(family: string): boolean;
4
+ //# sourceMappingURL=env.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ import type { LiveTestResult } from './types';
2
+ export declare function runLiveTest(family: string, streaming: boolean): Promise<LiveTestResult>;
3
+ //# sourceMappingURL=live-tester.d.ts.map
@@ -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":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAC,EAAE,IAAI,MAAM,EAAC,MAAM,MAAM,CAAC;AAGlC,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AACxC,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAErH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,SAAkB;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAuB,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEzF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAC,CAAC,EAAC,CAAC;QAC/J,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAqB,KAAK,CAAC,QAAQ,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAC,CAAC,CAAC;QAC3G,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAChC,QAAQ,EAAE,EAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAQ;YAC7C,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,MAAM,EAAE;YAClB,WAAW,EAAE,SAAS;SACzB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAExD,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;YACpE,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAC,CAAC;QACpH,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElC,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACzE,IAAI,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAmB;YAC3B,MAAM;YACN,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC3B,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;YACnC,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,MAAM;SACT,CAAC;QACF,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QAC7B,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAC,CAAC,CAAC;QAChG,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAC,CAAC;IAChH,CAAC;AACL,CAAC"}
@@ -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"}