@assemblyline-agents/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/add.d.ts +23 -0
  4. package/dist/add.d.ts.map +1 -0
  5. package/dist/add.js +352 -0
  6. package/dist/add.js.map +1 -0
  7. package/dist/args.d.ts +14 -0
  8. package/dist/args.d.ts.map +1 -0
  9. package/dist/args.js +95 -0
  10. package/dist/args.js.map +1 -0
  11. package/dist/auth.d.ts +8 -0
  12. package/dist/auth.d.ts.map +1 -0
  13. package/dist/auth.js +74 -0
  14. package/dist/auth.js.map +1 -0
  15. package/dist/channels.d.ts +25 -0
  16. package/dist/channels.d.ts.map +1 -0
  17. package/dist/channels.js +76 -0
  18. package/dist/channels.js.map +1 -0
  19. package/dist/checkpoints.d.ts +3 -0
  20. package/dist/checkpoints.d.ts.map +1 -0
  21. package/dist/checkpoints.js +60 -0
  22. package/dist/checkpoints.js.map +1 -0
  23. package/dist/deploy-definition.d.ts +14 -0
  24. package/dist/deploy-definition.d.ts.map +1 -0
  25. package/dist/deploy-definition.js +92 -0
  26. package/dist/deploy-definition.js.map +1 -0
  27. package/dist/deploy-lifecycle.d.ts +17 -0
  28. package/dist/deploy-lifecycle.d.ts.map +1 -0
  29. package/dist/deploy-lifecycle.js +25 -0
  30. package/dist/deploy-lifecycle.js.map +1 -0
  31. package/dist/deploy.d.ts +20 -0
  32. package/dist/deploy.d.ts.map +1 -0
  33. package/dist/deploy.js +462 -0
  34. package/dist/deploy.js.map +1 -0
  35. package/dist/dev.d.ts +13 -0
  36. package/dist/dev.d.ts.map +1 -0
  37. package/dist/dev.js +157 -0
  38. package/dist/dev.js.map +1 -0
  39. package/dist/eval-assertions.d.ts +5 -0
  40. package/dist/eval-assertions.d.ts.map +1 -0
  41. package/dist/eval-assertions.js +99 -0
  42. package/dist/eval-assertions.js.map +1 -0
  43. package/dist/eval-case-runner.d.ts +38 -0
  44. package/dist/eval-case-runner.d.ts.map +1 -0
  45. package/dist/eval-case-runner.js +247 -0
  46. package/dist/eval-case-runner.js.map +1 -0
  47. package/dist/eval-cases.d.ts +6 -0
  48. package/dist/eval-cases.d.ts.map +1 -0
  49. package/dist/eval-cases.js +151 -0
  50. package/dist/eval-cases.js.map +1 -0
  51. package/dist/eval-comparison.d.ts +8 -0
  52. package/dist/eval-comparison.d.ts.map +1 -0
  53. package/dist/eval-comparison.js +90 -0
  54. package/dist/eval-comparison.js.map +1 -0
  55. package/dist/eval-custom.d.ts +15 -0
  56. package/dist/eval-custom.d.ts.map +1 -0
  57. package/dist/eval-custom.js +118 -0
  58. package/dist/eval-custom.js.map +1 -0
  59. package/dist/eval-experiment.d.ts +19 -0
  60. package/dist/eval-experiment.d.ts.map +1 -0
  61. package/dist/eval-experiment.js +122 -0
  62. package/dist/eval-experiment.js.map +1 -0
  63. package/dist/eval-fixtures.d.ts +17 -0
  64. package/dist/eval-fixtures.d.ts.map +1 -0
  65. package/dist/eval-fixtures.js +59 -0
  66. package/dist/eval-fixtures.js.map +1 -0
  67. package/dist/eval-gateway-host.d.ts +34 -0
  68. package/dist/eval-gateway-host.d.ts.map +1 -0
  69. package/dist/eval-gateway-host.js +127 -0
  70. package/dist/eval-gateway-host.js.map +1 -0
  71. package/dist/eval-judge.d.ts +35 -0
  72. package/dist/eval-judge.d.ts.map +1 -0
  73. package/dist/eval-judge.js +105 -0
  74. package/dist/eval-judge.js.map +1 -0
  75. package/dist/eval-mocks.d.ts +10 -0
  76. package/dist/eval-mocks.d.ts.map +1 -0
  77. package/dist/eval-mocks.js +57 -0
  78. package/dist/eval-mocks.js.map +1 -0
  79. package/dist/eval-report.d.ts +7 -0
  80. package/dist/eval-report.d.ts.map +1 -0
  81. package/dist/eval-report.js +89 -0
  82. package/dist/eval-report.js.map +1 -0
  83. package/dist/eval-retry.d.ts +10 -0
  84. package/dist/eval-retry.d.ts.map +1 -0
  85. package/dist/eval-retry.js +37 -0
  86. package/dist/eval-retry.js.map +1 -0
  87. package/dist/eval-trajectory.d.ts +7 -0
  88. package/dist/eval-trajectory.d.ts.map +1 -0
  89. package/dist/eval-trajectory.js +92 -0
  90. package/dist/eval-trajectory.js.map +1 -0
  91. package/dist/eval-turns.d.ts +66 -0
  92. package/dist/eval-turns.d.ts.map +1 -0
  93. package/dist/eval-turns.js +187 -0
  94. package/dist/eval-turns.js.map +1 -0
  95. package/dist/eval-types.d.ts +271 -0
  96. package/dist/eval-types.d.ts.map +1 -0
  97. package/dist/eval-types.js +4 -0
  98. package/dist/eval-types.js.map +1 -0
  99. package/dist/eval.d.ts +26 -0
  100. package/dist/eval.d.ts.map +1 -0
  101. package/dist/eval.js +218 -0
  102. package/dist/eval.js.map +1 -0
  103. package/dist/help.d.ts +12 -0
  104. package/dist/help.d.ts.map +1 -0
  105. package/dist/help.js +323 -0
  106. package/dist/help.js.map +1 -0
  107. package/dist/hosts.d.ts +3 -0
  108. package/dist/hosts.d.ts.map +1 -0
  109. package/dist/hosts.js +51 -0
  110. package/dist/hosts.js.map +1 -0
  111. package/dist/index.d.ts +3 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +318 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/init.d.ts +13 -0
  116. package/dist/init.d.ts.map +1 -0
  117. package/dist/init.js +79 -0
  118. package/dist/init.js.map +1 -0
  119. package/dist/legacy-bin.d.ts +3 -0
  120. package/dist/legacy-bin.d.ts.map +1 -0
  121. package/dist/legacy-bin.js +8 -0
  122. package/dist/legacy-bin.js.map +1 -0
  123. package/dist/models.d.ts +5 -0
  124. package/dist/models.d.ts.map +1 -0
  125. package/dist/models.js +20 -0
  126. package/dist/models.js.map +1 -0
  127. package/dist/operator-client.d.ts +7 -0
  128. package/dist/operator-client.d.ts.map +1 -0
  129. package/dist/operator-client.js +62 -0
  130. package/dist/operator-client.js.map +1 -0
  131. package/dist/pm.d.ts +20 -0
  132. package/dist/pm.d.ts.map +1 -0
  133. package/dist/pm.js +70 -0
  134. package/dist/pm.js.map +1 -0
  135. package/dist/project-env.d.ts +8 -0
  136. package/dist/project-env.d.ts.map +1 -0
  137. package/dist/project-env.js +51 -0
  138. package/dist/project-env.js.map +1 -0
  139. package/dist/secrets.d.ts +3 -0
  140. package/dist/secrets.d.ts.map +1 -0
  141. package/dist/secrets.js +48 -0
  142. package/dist/secrets.js.map +1 -0
  143. package/dist/state.d.ts +3 -0
  144. package/dist/state.d.ts.map +1 -0
  145. package/dist/state.js +85 -0
  146. package/dist/state.js.map +1 -0
  147. package/package.json +67 -0
@@ -0,0 +1,59 @@
1
+ import { sandboxSessionKeyForRun } from "@assemblyline-agents/runtime";
2
+ /**
3
+ * Case-declared starting state: sandbox files and memory documents seeded
4
+ * before the first turn. Sandbox seeding requires the case's runs to share a
5
+ * conversation-scoped sandbox session, so the runner assigns a conversationId
6
+ * to any case with sandbox fixtures.
7
+ */
8
+ export function validateFixtures(value) {
9
+ if (value === undefined)
10
+ return;
11
+ if (!isRecord(value))
12
+ throw new Error("fixtures must be an object");
13
+ for (const key of ["sandbox", "memory"]) {
14
+ const entries = value[key];
15
+ if (entries === undefined)
16
+ continue;
17
+ if (!isRecord(entries))
18
+ throw new Error(`fixtures.${key} must map paths to string contents`);
19
+ for (const [path, content] of Object.entries(entries)) {
20
+ if (typeof content !== "string")
21
+ throw new Error(`fixtures.${key} entry ${path} must be a string`);
22
+ if (key === "memory" && !path.startsWith("/memory/")) {
23
+ throw new Error(`fixtures.memory paths must start with /memory/ (got ${path})`);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ export async function seedEvalFixtures(input) {
29
+ const sandboxFiles = Object.entries(input.fixtures.sandbox ?? {});
30
+ if (sandboxFiles.length > 0) {
31
+ if (!input.conversationId)
32
+ throw new Error("sandbox fixtures require a conversation-scoped session");
33
+ if (!input.sandbox.create)
34
+ throw new Error("the configured sandbox adapter does not support pre-created sessions");
35
+ const sessionKey = sandboxSessionKeyForRun(input.agentScope, {
36
+ id: "eval-fixture-seed",
37
+ input: { conversationId: input.conversationId }
38
+ });
39
+ const session = await input.sandbox.create({ id: "eval-fixture-seed", input: {} }, { sessionKey });
40
+ for (const [path, content] of sandboxFiles) {
41
+ await session.writeFile(path.startsWith("/") ? path : `/workspace/${path}`, content);
42
+ }
43
+ await session.dispose?.();
44
+ }
45
+ // Point reads key on the exact scope, so seed with the same scope the
46
+ // case's runs will resolve (conversation-scoped when a conversation id is
47
+ // assigned, agent-scoped otherwise).
48
+ const memoryScope = {
49
+ agentScope: input.agentScope,
50
+ ...(input.conversationId ? { conversationId: input.conversationId } : {})
51
+ };
52
+ for (const [path, content] of Object.entries(input.fixtures.memory ?? {})) {
53
+ await input.memoryStore.write(memoryScope, { path, content, mode: "replace" });
54
+ }
55
+ }
56
+ function isRecord(value) {
57
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
58
+ }
59
+ //# sourceMappingURL=eval-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-fixtures.js","sourceRoot":"","sources":["../src/eval-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { EvalCase } from "./eval-types.js";
2
+ import type { EvalRuntimeHost } from "./eval-turns.js";
3
+ /**
4
+ * HTTP-backed {@link EvalRuntimeHost}: runs eval cases against a deployed
5
+ * gateway instead of an in-process runtime. Backed by the node host's
6
+ * `POST /runs` (requires ASSEMBLY_LINE_ENABLE_API_RUNS=true and the admin token),
7
+ * `POST /runs/:id/cancel`, and `GET /runs/:id/timeline`.
8
+ *
9
+ * Only cases that need no local adapters can run remotely — see
10
+ * {@link remoteEvalIncompatibilities}. Case metadata tagging is not
11
+ * transmitted; `POST /runs` does not accept a metadata field.
12
+ */
13
+ export interface GatewayEvalHostOptions {
14
+ url: string;
15
+ token: string;
16
+ fetch?: typeof globalThis.fetch;
17
+ /** Poll interval while a created run is still `running`. */
18
+ pollIntervalMs?: number;
19
+ }
20
+ /**
21
+ * Reasons a case cannot run against a remote gateway. Fixtures are seeded
22
+ * into local adapters the remote runtime never sees; multi-turn and seeded
23
+ * history need `run()` inputs `POST /runs` does not accept. Tool mocks are
24
+ * compatible when the target advertises the `eval-runs` capability on
25
+ * /healthz (ASSEMBLY_LINE_ENABLE_EVAL_RUNS); older servers refuse them upfront so
26
+ * a silently-ignored stub can never cause real side effects.
27
+ */
28
+ export declare function remoteEvalIncompatibilities(evalCase: EvalCase, capabilities?: string[]): string[];
29
+ export interface GatewayEvalHost extends EvalRuntimeHost {
30
+ /** Capabilities advertised by the target's /healthz; fetched once and cached. */
31
+ capabilities(): Promise<string[]>;
32
+ }
33
+ export declare function createGatewayEvalHost(options: GatewayEvalHostOptions): GatewayEvalHost;
34
+ //# sourceMappingURL=eval-gateway-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-gateway-host.d.ts","sourceRoot":"","sources":["../src/eval-gateway-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;GASG;AAEH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAcrG;AAQD,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,iFAAiF;IACjF,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAwGtF"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Reasons a case cannot run against a remote gateway. Fixtures are seeded
3
+ * into local adapters the remote runtime never sees; multi-turn and seeded
4
+ * history need `run()` inputs `POST /runs` does not accept. Tool mocks are
5
+ * compatible when the target advertises the `eval-runs` capability on
6
+ * /healthz (ASSEMBLY_LINE_ENABLE_EVAL_RUNS); older servers refuse them upfront so
7
+ * a silently-ignored stub can never cause real side effects.
8
+ */
9
+ export function remoteEvalIncompatibilities(evalCase, capabilities = []) {
10
+ const reasons = [];
11
+ if ((evalCase.input.turns?.length ?? 0) > 1)
12
+ reasons.push("multi-turn conversation");
13
+ if (evalCase.input.recentHistory?.length)
14
+ reasons.push("seeded recent history");
15
+ if (evalCase.fixtures && (Object.keys(evalCase.fixtures.sandbox ?? {}).length > 0 || Object.keys(evalCase.fixtures.memory ?? {}).length > 0)) {
16
+ reasons.push("fixtures");
17
+ }
18
+ if (evalCase.mocks && Object.keys(evalCase.mocks.tools ?? {}).length > 0
19
+ && !capabilities.includes("eval-runs")) {
20
+ reasons.push("tool mocks");
21
+ }
22
+ return reasons;
23
+ }
24
+ export function createGatewayEvalHost(options) {
25
+ const baseUrl = options.url.replace(/\/+$/u, "");
26
+ const fetcher = options.fetch ?? globalThis.fetch;
27
+ const pollIntervalMs = options.pollIntervalMs ?? 500;
28
+ async function request(path, init = {}) {
29
+ const response = await fetcher(`${baseUrl}${path}`, {
30
+ method: init.method ?? "GET",
31
+ headers: {
32
+ accept: "application/json",
33
+ authorization: `Bearer ${options.token}`,
34
+ ...(init.body !== undefined ? { "content-type": "application/json" } : {})
35
+ },
36
+ ...(init.body !== undefined ? { body: init.body } : {})
37
+ });
38
+ const text = await response.text();
39
+ let body = null;
40
+ try {
41
+ body = text ? JSON.parse(text) : null;
42
+ }
43
+ catch {
44
+ body = text;
45
+ }
46
+ if (!response.ok) {
47
+ const message = body && typeof body === "object" && typeof body.error === "string"
48
+ ? body.error
49
+ : `gateway returned ${response.status} for ${path}`;
50
+ throw new Error(message);
51
+ }
52
+ return body;
53
+ }
54
+ function summarize(body) {
55
+ const record = (body ?? {});
56
+ const id = typeof record.runId === "string" && record.runId ? record.runId : record.run?.id;
57
+ const status = typeof record.status === "string" && record.status ? record.status : record.run?.status;
58
+ if (typeof id !== "string" || !id)
59
+ throw new Error("The gateway response did not include a run id.");
60
+ return {
61
+ id,
62
+ status: (typeof status === "string" && status ? status : "unknown"),
63
+ ...(typeof record.response === "string" ? { response: record.response } : {})
64
+ };
65
+ }
66
+ let capabilitiesPromise;
67
+ function capabilities() {
68
+ capabilitiesPromise ??= (async () => {
69
+ const body = await request("/healthz");
70
+ return Array.isArray(body?.capabilities)
71
+ ? body.capabilities.filter((item) => typeof item === "string")
72
+ : [];
73
+ })();
74
+ return capabilitiesPromise;
75
+ }
76
+ return {
77
+ capabilities,
78
+ async run(runOptions) {
79
+ if (runOptions.turn || runOptions.conversationId || runOptions.recentHistory?.length) {
80
+ throw new Error("Remote eval gateways do not support multi-turn conversations or seeded history yet. Run this case without --url.");
81
+ }
82
+ let evalBlock = runOptions.eval;
83
+ if (evalBlock !== undefined) {
84
+ const caps = await capabilities().catch(() => []);
85
+ if (!caps.includes("eval-runs")) {
86
+ if (evalBlock.toolStubs !== undefined || evalBlock.autoApproveTools) {
87
+ // Never let an old server silently drop stubs or auto-approval —
88
+ // that would execute real tools / really deliver.
89
+ throw new Error("The target gateway lacks the eval-runs capability. Set ASSEMBLY_LINE_ENABLE_EVAL_RUNS=true on the server or run without --url.");
90
+ }
91
+ // Bare record-only delivery degrades to the historical behavior.
92
+ evalBlock = undefined;
93
+ }
94
+ }
95
+ const created = summarize(await request("/runs", {
96
+ method: "POST",
97
+ body: JSON.stringify({
98
+ message: runOptions.message,
99
+ approve: runOptions.approve ?? false,
100
+ ...(runOptions.channel ? { channel: runOptions.channel } : {}),
101
+ ...(runOptions.toolName ? { toolName: runOptions.toolName } : {}),
102
+ ...(runOptions.input !== undefined ? { input: runOptions.input } : {}),
103
+ ...(evalBlock !== undefined ? { eval: evalBlock } : {})
104
+ })
105
+ }));
106
+ runOptions.onRunCreated?.({ id: created.id, status: created.status });
107
+ let latest = created;
108
+ while (latest.status === "running") {
109
+ await new Promise((resolveSleep) => setTimeout(resolveSleep, pollIntervalMs));
110
+ latest = summarize(await request(`/runs/${encodeURIComponent(created.id)}`));
111
+ }
112
+ return {
113
+ run: { id: latest.id, status: latest.status },
114
+ ...(latest.response !== undefined ? { response: latest.response } : {})
115
+ };
116
+ },
117
+ async cancelRun(runId) {
118
+ return request(`/runs/${encodeURIComponent(runId)}/cancel`, { method: "POST", body: JSON.stringify({}) });
119
+ },
120
+ async replay(runId) {
121
+ // The timeline endpoint serializes the runtime's RunTimeline; the eval
122
+ // loop only reads events/toolCalls/usage fields, which survive JSON.
123
+ return await request(`/runs/${encodeURIComponent(runId)}/timeline`);
124
+ }
125
+ };
126
+ }
127
+ //# sourceMappingURL=eval-gateway-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-gateway-host.js","sourceRoot":"","sources":["../src/eval-gateway-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { EvalActual, EvalCase, EvalJudgeResult } from "./eval-types.js";
2
+ interface JudgePayload {
3
+ score: number;
4
+ pass: boolean;
5
+ reasoning: string;
6
+ }
7
+ export type EvalJudgeCompleter = (input: {
8
+ model: string;
9
+ systemPrompt: string;
10
+ prompt: string;
11
+ }) => Promise<{
12
+ text: string;
13
+ costUsd?: number;
14
+ }>;
15
+ export declare class EvalJudgeResponseError extends Error {
16
+ readonly costUsd: number;
17
+ constructor(message: string, costUsd: number);
18
+ }
19
+ /** Lazily create one provider catalog and reuse it for every judge in a suite. */
20
+ export declare function createDefaultJudgeCompleter(env?: Record<string, string | undefined>): EvalJudgeCompleter;
21
+ export declare function robustParseJudge(text: string): JudgePayload;
22
+ export declare function judgeCase(evalCase: EvalCase, actual: EvalActual, options: {
23
+ model: string;
24
+ env?: Record<string, string | undefined>;
25
+ complete?: (input: {
26
+ model: string;
27
+ systemPrompt: string;
28
+ prompt: string;
29
+ }) => Promise<{
30
+ text: string;
31
+ costUsd?: number;
32
+ }>;
33
+ }): Promise<EvalJudgeResult>;
34
+ export {};
35
+ //# sourceMappingURL=eval-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-judge.d.ts","sourceRoot":"","sources":["../src/eval-judge.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7E,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,KAAK,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElD,qBAAa,sBAAuB,SAAQ,KAAK;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAAzC,OAAO,EAAE,MAAM,EAAW,OAAO,EAAE,MAAM;CAItD;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CACzC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,kBAAkB,CAepB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAuB3D;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5H,GACA,OAAO,CAAC,eAAe,CAAC,CA2C1B"}
@@ -0,0 +1,105 @@
1
+ import { assistantText, createDefaultPiModels, piUsageToRuntime, resolvePiModel } from "@assemblyline-agents/pi";
2
+ export class EvalJudgeResponseError extends Error {
3
+ costUsd;
4
+ constructor(message, costUsd) {
5
+ super(message);
6
+ this.costUsd = costUsd;
7
+ this.name = "EvalJudgeResponseError";
8
+ }
9
+ }
10
+ /** Lazily create one provider catalog and reuse it for every judge in a suite. */
11
+ export function createDefaultJudgeCompleter(env = process.env) {
12
+ let modelsPromise;
13
+ return async ({ model: modelSpec, systemPrompt, prompt }) => {
14
+ modelsPromise ??= createDefaultPiModels(env);
15
+ const models = await modelsPromise;
16
+ const model = resolvePiModel(models, modelSpec);
17
+ const response = await models.completeSimple(model, {
18
+ systemPrompt,
19
+ messages: [{ role: "user", content: [{ type: "text", text: prompt }], timestamp: Date.now() }]
20
+ }, { env: compactEnv(env) });
21
+ return {
22
+ text: assistantText(response),
23
+ costUsd: piUsageToRuntime(response.usage).costUsd ?? 0
24
+ };
25
+ };
26
+ }
27
+ export function robustParseJudge(text) {
28
+ const stripped = text.trim().replace(/^```(?:json)?\s*/iu, "").replace(/\s*```$/u, "").trim();
29
+ const candidates = [stripped];
30
+ const start = stripped.indexOf("{");
31
+ const end = stripped.lastIndexOf("}");
32
+ if (start >= 0 && end > start)
33
+ candidates.push(stripped.slice(start, end + 1));
34
+ let lastError = "response did not contain a JSON object";
35
+ for (const candidate of candidates) {
36
+ try {
37
+ const value = JSON.parse(candidate);
38
+ if (!value || typeof value !== "object" || Array.isArray(value))
39
+ throw new Error("judge result must be an object");
40
+ const record = value;
41
+ if (typeof record.score !== "number" || !Number.isFinite(record.score) || record.score < 0 || record.score > 1) {
42
+ throw new Error("judge score must be a number from 0 to 1");
43
+ }
44
+ if (typeof record.pass !== "boolean")
45
+ throw new Error("judge pass must be boolean");
46
+ if (typeof record.reasoning !== "string")
47
+ throw new Error("judge reasoning must be a string");
48
+ return { score: record.score, pass: record.pass, reasoning: record.reasoning };
49
+ }
50
+ catch (error) {
51
+ lastError = error instanceof Error ? error.message : String(error);
52
+ }
53
+ }
54
+ throw new Error(`Could not parse judge response: ${lastError}`);
55
+ }
56
+ export async function judgeCase(evalCase, actual, options) {
57
+ const judge = evalCase.expect.judge;
58
+ if (!judge)
59
+ throw new Error(`Eval case ${evalCase.name} does not declare a judge.`);
60
+ const systemPrompt = [
61
+ "You are an impartial evaluator of an AI agent result.",
62
+ "Evaluate only the supplied criteria and evidence.",
63
+ "When the evidence includes a turns array, judge the conversation as a whole.",
64
+ "Return JSON only: {\"score\": number from 0 to 1, \"pass\": boolean, \"reasoning\": string}."
65
+ ].join("\n");
66
+ const prompt = JSON.stringify({
67
+ criteria: judge.criteria,
68
+ input: evalCase.input,
69
+ actual: {
70
+ status: actual.status,
71
+ response: actual.response,
72
+ output: actual.output ?? null,
73
+ toolsCalled: actual.toolsCalled,
74
+ costUsd: actual.costUsd,
75
+ ...(actual.turns
76
+ ? {
77
+ turns: actual.turns.map((turn) => ({
78
+ message: turn.message,
79
+ status: turn.status,
80
+ response: turn.response,
81
+ toolsCalled: turn.toolsCalled
82
+ }))
83
+ }
84
+ : {})
85
+ }
86
+ }, null, 2);
87
+ const complete = options.complete ?? createDefaultJudgeCompleter(options.env ?? process.env);
88
+ const completion = await complete({ model: options.model, systemPrompt, prompt });
89
+ let parsed;
90
+ try {
91
+ parsed = robustParseJudge(completion.text);
92
+ }
93
+ catch (error) {
94
+ throw new EvalJudgeResponseError(error instanceof Error ? error.message : String(error), completion.costUsd ?? 0);
95
+ }
96
+ return {
97
+ ...parsed,
98
+ costUsd: completion.costUsd ?? 0,
99
+ model: options.model
100
+ };
101
+ }
102
+ function compactEnv(env) {
103
+ return Object.fromEntries(Object.entries(env).filter((entry) => typeof entry[1] === "string"));
104
+ }
105
+ //# sourceMappingURL=eval-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-judge.js","sourceRoot":"","sources":["../src/eval-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { EvalMocks } from "./eval-types.js";
2
+ /**
3
+ * Case-declared tool mocks: validation of the JSON shape and conversion into
4
+ * the runtime's `toolStubs` seam. Each attempt gets fresh stubs so `results`
5
+ * sequences replay deterministically across retries and repetitions.
6
+ */
7
+ export declare function validateMocks(value: unknown): void;
8
+ /** Build runtime tool stubs for one case attempt. */
9
+ export declare function createToolStubs(mocks: EvalMocks | undefined): Record<string, (input: unknown) => unknown> | undefined;
10
+ //# sourceMappingURL=eval-mocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-mocks.d.ts","sourceRoot":"","sources":["../src/eval-mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAE/D;;;;GAIG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAkBlD;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,CAOrH"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Case-declared tool mocks: validation of the JSON shape and conversion into
3
+ * the runtime's `toolStubs` seam. Each attempt gets fresh stubs so `results`
4
+ * sequences replay deterministically across retries and repetitions.
5
+ */
6
+ export function validateMocks(value) {
7
+ if (value === undefined)
8
+ return;
9
+ if (!isRecord(value) || !isRecord(value.tools)) {
10
+ throw new Error("mocks must be an object with a tools record");
11
+ }
12
+ for (const [name, mock] of Object.entries(value.tools)) {
13
+ if (!isRecord(mock))
14
+ throw new Error(`mocks.tools.${name} must be an object`);
15
+ const modes = ["result", "results", "error"].filter((key) => mock[key] !== undefined);
16
+ if (modes.length !== 1) {
17
+ throw new Error(`mocks.tools.${name} must declare exactly one of result, results, or error`);
18
+ }
19
+ if (mock.results !== undefined && (!Array.isArray(mock.results) || mock.results.length === 0)) {
20
+ throw new Error(`mocks.tools.${name}.results must be a non-empty array`);
21
+ }
22
+ if (mock.error !== undefined && (typeof mock.error !== "string" || mock.error.trim() === "")) {
23
+ throw new Error(`mocks.tools.${name}.error must be a non-empty string`);
24
+ }
25
+ }
26
+ }
27
+ /** Build runtime tool stubs for one case attempt. */
28
+ export function createToolStubs(mocks) {
29
+ if (!mocks)
30
+ return undefined;
31
+ const stubs = {};
32
+ for (const [name, mock] of Object.entries(mocks.tools)) {
33
+ stubs[name] = createStub(mock);
34
+ }
35
+ return stubs;
36
+ }
37
+ function createStub(mock) {
38
+ if (mock.error !== undefined) {
39
+ return () => {
40
+ throw new Error(mock.error);
41
+ };
42
+ }
43
+ if (mock.results !== undefined) {
44
+ const sequence = [...mock.results];
45
+ let index = 0;
46
+ return () => {
47
+ const result = sequence[Math.min(index, sequence.length - 1)];
48
+ index += 1;
49
+ return result;
50
+ };
51
+ }
52
+ return () => mock.result;
53
+ }
54
+ function isRecord(value) {
55
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
56
+ }
57
+ //# sourceMappingURL=eval-mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-mocks.js","sourceRoot":"","sources":["../src/eval-mocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EvalCaseResult, EvalComparison, EvalExperimentManifest, EvalReport } from "./eval-types.js";
2
+ export declare function createEvalReport(experiment: EvalExperimentManifest, durationMs: number, results: EvalCaseResult[], options?: {
3
+ artifacts?: EvalReport["artifacts"];
4
+ comparison?: EvalComparison;
5
+ }): EvalReport;
6
+ export declare function formatEvalReport(report: EvalReport): string;
7
+ //# sourceMappingURL=eval-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-report.d.ts","sourceRoot":"","sources":["../src/eval-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EAAE,EACzB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,cAAc,CAAC;CACxB,GACL,UAAU,CAsCZ;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA6B3D"}
@@ -0,0 +1,89 @@
1
+ export function createEvalReport(experiment, durationMs, results, options = {}) {
2
+ const passed = results.filter((result) => result.outcome === "passed").length;
3
+ const failed = results.filter((result) => result.outcome === "failed").length;
4
+ const errored = results.filter((result) => result.outcome === "errored").length;
5
+ const runCostUsd = results.reduce((sum, result) => sum + result.runCostUsd, 0);
6
+ const judgeCostUsd = results.reduce((sum, result) => sum + result.judgeCostUsd, 0);
7
+ const byTag = {};
8
+ for (const result of results) {
9
+ for (const tag of result.tags) {
10
+ const summary = byTag[tag] ?? { total: 0, passed: 0, failed: 0, errored: 0 };
11
+ summary.total += 1;
12
+ summary[result.outcome] += 1;
13
+ byTag[tag] = summary;
14
+ }
15
+ }
16
+ return {
17
+ schemaVersion: 1,
18
+ experiment,
19
+ startedAt: experiment.startedAt,
20
+ durationMs,
21
+ agentRevision: experiment.agentRevision,
22
+ results,
23
+ ...(options.comparison ? { comparison: options.comparison } : {}),
24
+ ...(options.artifacts ? { artifacts: options.artifacts } : {}),
25
+ summary: {
26
+ total: results.length,
27
+ uniqueCases: new Set(results.map((result) => result.caseId)).size,
28
+ repetitions: experiment.config.repetitions,
29
+ passed,
30
+ failed,
31
+ errored,
32
+ passRate: results.length === 0 ? 0 : passed / results.length,
33
+ runCostUsd,
34
+ judgeCostUsd,
35
+ totalCostUsd: runCostUsd + judgeCostUsd,
36
+ byTag
37
+ }
38
+ };
39
+ }
40
+ export function formatEvalReport(report) {
41
+ const lines = [];
42
+ for (const result of report.results) {
43
+ const marker = result.outcome === "passed" ? "✓" : result.outcome === "failed" ? "✗" : "⚠";
44
+ const cost = result.runCostUsd + result.judgeCostUsd;
45
+ const planned = result.repetitionsPlanned ?? report.summary.repetitions;
46
+ const repetition = planned > 1 ? ` [rep ${result.repetition}/${planned}]` : "";
47
+ const attempts = result.attempts > 1 ? ` [${result.attempts} attempts]` : "";
48
+ lines.push(`${marker} ${result.name}${repetition}${attempts} ${result.durationMs}ms $${cost.toFixed(6)}`);
49
+ for (const failure of result.failures)
50
+ lines.push(` ${failure}`);
51
+ if (result.error)
52
+ lines.push(` ${result.error}`);
53
+ for (const metric of result.metrics ?? []) {
54
+ const value = metric.score ?? metric.value ?? metric.pass;
55
+ lines.push(` metric ${metric.evaluator}.${metric.key}: ${JSON.stringify(value)}`);
56
+ }
57
+ }
58
+ const summary = report.summary;
59
+ lines.push("");
60
+ lines.push(`${summary.passed}/${summary.total} executions passed (${(summary.passRate * 100).toFixed(1)}%); ${summary.failed} failed; ${summary.errored} errored`);
61
+ lines.push(`${summary.uniqueCases} unique cases; ${summary.repetitions} repetition${summary.repetitions === 1 ? "" : "s"} requested`);
62
+ lines.push(`Cost: runs $${summary.runCostUsd.toFixed(6)} + judges $${summary.judgeCostUsd.toFixed(6)} = $${summary.totalCostUsd.toFixed(6)}`);
63
+ const tags = Object.entries(summary.byTag).sort(([a], [b]) => a.localeCompare(b));
64
+ if (tags.length > 0) {
65
+ lines.push("Tags:");
66
+ for (const [tag, value] of tags)
67
+ lines.push(` ${tag.padEnd(16)} ${value.passed}/${value.total} passed, ${value.failed} failed, ${value.errored} errored`);
68
+ }
69
+ if (report.comparison)
70
+ formatComparison(lines, report.comparison);
71
+ if (report.artifacts)
72
+ lines.push(`Artifacts: ${report.artifacts.root}`);
73
+ return lines.join("\n");
74
+ }
75
+ function formatComparison(lines, comparison) {
76
+ lines.push("");
77
+ lines.push(`Baseline ${comparison.baselineExperimentId}: ${comparison.passed ? "gates passed" : "gates failed"}`);
78
+ lines.push(`Pass-rate delta: ${(comparison.passRateDelta * 100).toFixed(1)} points; cost delta: $${comparison.costDeltaUsd.toFixed(6)}`);
79
+ for (const regression of comparison.regressions) {
80
+ lines.push(` regression ${regression.name}: ${(regression.baselinePassRate * 100).toFixed(1)}% → ${(regression.currentPassRate * 100).toFixed(1)}%`);
81
+ }
82
+ for (const gate of comparison.gates) {
83
+ lines.push(` ${gate.passed ? "✓" : "✗"} ${gate.name}: ${formatGateNumber(gate.actual)} (limit ${formatGateNumber(gate.limit)})`);
84
+ }
85
+ }
86
+ function formatGateNumber(value) {
87
+ return value === null ? "unbounded" : String(Number(value.toFixed(3)));
88
+ }
89
+ //# sourceMappingURL=eval-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-report.js","sourceRoot":"","sources":["../src/eval-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function isTransientProviderError(error: unknown): boolean;
2
+ export declare function retryTransient<T>(operation: (attempt: number) => Promise<T>, options: {
3
+ retryAttempts: number;
4
+ retryBackoffMs: number;
5
+ sleep?: (ms: number) => Promise<void>;
6
+ }): Promise<{
7
+ value: T;
8
+ attempts: number;
9
+ }>;
10
+ //# sourceMappingURL=eval-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-retry.d.ts","sourceRoot":"","sources":["../src/eval-retry.ts"],"names":[],"mappings":"AAKA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAShE;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAChG,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAYzC"}