@cursor/july 0.1.12 → 0.1.14
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/dist/bin/agent-serve.js +32 -9
- package/dist/channels/github/api.d.ts.map +1 -1
- package/dist/channels/github/api.js +11 -4
- package/dist/channels/github/cursor-account.d.ts +21 -1
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +29 -1
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1 -1
- package/dist/channels/github/instrument.d.ts +20 -0
- package/dist/channels/github/instrument.d.ts.map +1 -0
- package/dist/channels/slack/api.d.ts +9 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +40 -7
- package/dist/channels/slack/eval-directive.d.ts +3 -0
- package/dist/channels/slack/eval-directive.d.ts.map +1 -1
- package/dist/channels/slack/eval-directive.js +20 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.Dh_JkJjI.js → app.CKFFLL4Z.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DGWkvXJc.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CptQNLkR.js → VPLocalSearchBox.BXk19JBN.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DWflH-LQ.js → theme.BXSPBMyn.js} +2 -2
- package/dist/docs/assets/{evals.md.DAgEc_hL.js → evals.md.DYOjkRCX.js} +10 -4
- package/dist/docs/assets/{evals.md.DAgEc_hL.lean.js → evals.md.DYOjkRCX.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.B74NrVzb.js → reference_cli.md.DnYfr5V2.js} +4 -1
- package/dist/docs/assets/{reference_http-api.md.Dx_nmDG6.js → reference_http-api.md.BncLd3PZ.js} +2 -2
- package/dist/docs/assets/{reference_http-api.md.Dx_nmDG6.lean.js → reference_http-api.md.BncLd3PZ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +3 -3
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +13 -7
- package/dist/docs/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +3 -3
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +3 -3
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/mcp-oauth.html +3 -3
- package/dist/docs/guides/slack.html +3 -3
- package/dist/docs/guides/webhooks.html +3 -3
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +3 -3
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +8 -5
- package/dist/docs/reference/connections.html +3 -3
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +5 -5
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/prompt.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +3 -3
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +3 -3
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/troubleshooting.html +3 -3
- package/dist/evals.d.ts +41 -2
- package/dist/evals.d.ts.map +1 -1
- package/dist/evals.js +53 -16
- package/dist/internal/cli-ax.d.ts +4 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +163 -33
- package/dist/internal/cli-deploy.d.ts +8 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +92 -12
- package/dist/internal/cli-mcp-oauth.d.ts +14 -2
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +95 -2
- package/dist/internal/cursor/backend-client.d.ts +34 -0
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +73 -9
- package/dist/internal/cursor/credentials.d.ts +7 -1
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +9 -3
- package/dist/internal/cursor-account-mcp-auth.d.ts +55 -0
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -0
- package/dist/internal/cursor-account-mcp-auth.js +175 -0
- package/dist/internal/deploy-client.d.ts +6 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +13 -0
- package/dist/internal/eval-run-store.d.ts +15 -0
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +87 -8
- package/dist/internal/eval-runner.d.ts +12 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +97 -22
- package/dist/internal/evals-client.d.ts +9 -1
- package/dist/internal/evals-client.d.ts.map +1 -1
- package/dist/internal/evals-client.js +43 -0
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +74 -7
- package/dist/internal/map-pool.d.ts +6 -1
- package/dist/internal/map-pool.d.ts.map +1 -1
- package/dist/internal/map-pool.js +8 -1
- package/dist/internal/mcp-host.d.ts +13 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +68 -13
- package/dist/internal/run-client.d.ts +5 -1
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +26 -5
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +57 -4
- package/dist/internal/session-engine.d.ts +13 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +49 -0
- package/dist/internal/storage-coordinator.d.ts +7 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +29 -4
- package/dist/playground/assets/index-CuXb4j4V.css +1 -0
- package/dist/playground/assets/{index-1dzluIcW.js → index-DeyYpOit.js} +46 -46
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/evals.md +46 -11
- package/docs/reference/cli.md +3 -0
- package/docs/reference/http-api.md +2 -1
- package/package.json +1 -1
- package/src/bin/agent-serve.ts +38 -8
- package/src/channels/github/api.ts +12 -1
- package/src/channels/github/cursor-account.ts +51 -1
- package/src/channels/github/github-channel.ts +4 -1
- package/src/channels/slack/api.ts +57 -8
- package/src/channels/slack/eval-directive.ts +24 -1
- package/src/evals.ts +104 -25
- package/src/internal/cli-ax.ts +192 -16
- package/src/internal/cli-deploy.ts +140 -13
- package/src/internal/cli-mcp-oauth.ts +122 -3
- package/src/internal/cursor/backend-client.ts +104 -1
- package/src/internal/cursor/credentials.ts +10 -2
- package/src/internal/cursor-account-mcp-auth.ts +241 -0
- package/src/internal/deploy-client.ts +16 -0
- package/src/internal/eval-run-store.ts +89 -6
- package/src/internal/eval-runner.ts +113 -18
- package/src/internal/evals-client.ts +81 -0
- package/src/internal/http-channel.ts +87 -6
- package/src/internal/map-pool.ts +8 -1
- package/src/internal/mcp-host.ts +74 -16
- package/src/internal/run-client.ts +32 -1
- package/src/internal/server.ts +69 -2
- package/src/internal/session-engine.ts +58 -0
- package/src/internal/storage-coordinator.ts +32 -6
- package/src/types.ts +10 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.Er_R50vY.js +0 -1
- package/dist/playground/assets/index-kZjeJs1v.css +0 -1
- /package/dist/docs/assets/{reference_cli.md.B74NrVzb.lean.js → reference_cli.md.DnYfr5V2.lean.js} +0 -0
package/dist/evals.d.ts
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* });
|
|
46
46
|
* ```
|
|
47
47
|
*/
|
|
48
|
-
import type { SessionEvent } from "./types.js";
|
|
48
|
+
import type { AgentCloudOptions, SessionEvent } from "./types.js";
|
|
49
49
|
export type Expectation = {
|
|
50
50
|
kind: "includes";
|
|
51
51
|
value: string | RegExp;
|
|
@@ -77,6 +77,12 @@ export interface EvalSendOptions {
|
|
|
77
77
|
workspaceDir?: string;
|
|
78
78
|
/** Files seeded into the session workspace before the first turn. */
|
|
79
79
|
workspaceFiles?: Record<string, string>;
|
|
80
|
+
/**
|
|
81
|
+
* Per-session cloud options merged over the agent's static `cloud` config
|
|
82
|
+
* (create only). Use this to attach a pinned fixture repo for cloud evals
|
|
83
|
+
* without putting it on the agent's default `cloud.repos`.
|
|
84
|
+
*/
|
|
85
|
+
cloud?: AgentCloudOptions;
|
|
80
86
|
}
|
|
81
87
|
export interface EvalTestContext {
|
|
82
88
|
/** Send a turn and wait until the session parks (or fails). */
|
|
@@ -86,6 +92,14 @@ export interface EvalTestContext {
|
|
|
86
92
|
readonly sessionId: string | undefined;
|
|
87
93
|
/** All events captured so far across turns. */
|
|
88
94
|
readonly events: SessionEvent[];
|
|
95
|
+
/**
|
|
96
|
+
* 1-based index of this run when {@link EvalConfig.iterations} /
|
|
97
|
+
* {@link EvalDatapoint.iterations} expands a datapoint. Always `1` when
|
|
98
|
+
* iterations is unset or `1`.
|
|
99
|
+
*/
|
|
100
|
+
readonly iteration: number;
|
|
101
|
+
/** Total iterations for this datapoint (default `1`). */
|
|
102
|
+
readonly iterations: number;
|
|
89
103
|
/** Gate: run did not fail. */
|
|
90
104
|
succeeded(): void;
|
|
91
105
|
/** Gate: at least one completed call to `name`. */
|
|
@@ -99,6 +113,8 @@ export interface EvalTestContext {
|
|
|
99
113
|
/** Debug line (surfaced under `agent-serve eval --verbose`). */
|
|
100
114
|
log(message: string): void;
|
|
101
115
|
}
|
|
116
|
+
/** Hard ceiling for {@link EvalConfig.iterations} / case `iterations`. */
|
|
117
|
+
export declare const EVAL_MAX_ITERATIONS = 100;
|
|
102
118
|
/** One runnable datapoint inside a multi-case {@link defineEval} file. */
|
|
103
119
|
export interface EvalDatapoint {
|
|
104
120
|
/**
|
|
@@ -110,6 +126,13 @@ export interface EvalDatapoint {
|
|
|
110
126
|
description?: string;
|
|
111
127
|
tags?: string[];
|
|
112
128
|
timeoutMs?: number;
|
|
129
|
+
/**
|
|
130
|
+
* How many times to run this datapoint (default `1`, or the file-level
|
|
131
|
+
* {@link EvalConfig.iterations}). When greater than 1, discovery expands
|
|
132
|
+
* to `<fileId>/<id>/1` … `<fileId>/<id>/<n>` so each iteration is its own
|
|
133
|
+
* concurrent case.
|
|
134
|
+
*/
|
|
135
|
+
iterations?: number;
|
|
113
136
|
test: (t: EvalTestContext) => Promise<void>;
|
|
114
137
|
}
|
|
115
138
|
/**
|
|
@@ -120,6 +143,11 @@ export interface EvalConfig {
|
|
|
120
143
|
description?: string;
|
|
121
144
|
tags?: string[];
|
|
122
145
|
timeoutMs?: number;
|
|
146
|
+
/**
|
|
147
|
+
* Default iterations for every datapoint in this file (default `1`).
|
|
148
|
+
* Case-level {@link EvalDatapoint.iterations} overrides this.
|
|
149
|
+
*/
|
|
150
|
+
iterations?: number;
|
|
123
151
|
/** Single-datapoint shorthand. Case id = file path under `evals/`. */
|
|
124
152
|
test?: (t: EvalTestContext) => Promise<void>;
|
|
125
153
|
/** Multiple datapoints in this file. Each id = `<fileId>/<case.id>`. */
|
|
@@ -130,6 +158,10 @@ export interface EvalCaseDefinition {
|
|
|
130
158
|
description?: string;
|
|
131
159
|
tags?: string[];
|
|
132
160
|
timeoutMs?: number;
|
|
161
|
+
/** Total iterations configured for the authored datapoint. */
|
|
162
|
+
iterations?: number;
|
|
163
|
+
/** 1-based iteration index for this expanded runnable case. */
|
|
164
|
+
iteration?: number;
|
|
133
165
|
test: (t: EvalTestContext) => Promise<void>;
|
|
134
166
|
readonly __agentServe: "eval";
|
|
135
167
|
}
|
|
@@ -141,10 +173,15 @@ export type EvalDefinition = EvalConfig & {
|
|
|
141
173
|
* `evals/weather.eval.ts` → `weather`. With a single `test`, that is also
|
|
142
174
|
* the case id. With `cases`, each datapoint is `<fileId>/<case.id>`.
|
|
143
175
|
*/
|
|
176
|
+
export declare function normalizeEvalIterations(value: unknown): number;
|
|
144
177
|
export declare function defineEval(config: EvalConfig): EvalDefinition;
|
|
145
178
|
/**
|
|
146
179
|
* Expand a file-level definition into runnable datapoints.
|
|
147
180
|
* Exported for tests and tooling.
|
|
181
|
+
*
|
|
182
|
+
* When `iterations` > 1, each authored datapoint expands to
|
|
183
|
+
* `<fileId>/<case.id>/1` … `<fileId>/<case.id>/<n>` (single-test files
|
|
184
|
+
* expand to `<fileId>/1` … `<fileId>/<n>`).
|
|
148
185
|
*/
|
|
149
186
|
export declare function expandEvalDefinition(fileId: string, definition: EvalDefinition): Array<{
|
|
150
187
|
id: string;
|
|
@@ -169,7 +206,7 @@ export declare const EVAL_DEFAULT_MAX_PLAYGROUND_RUNS = 20;
|
|
|
169
206
|
/** Hard ceiling for {@link EvalConfigFile.maxPlaygroundRuns}. */
|
|
170
207
|
export declare const EVAL_MAX_PLAYGROUND_RUNS = 500;
|
|
171
208
|
export type EvalCaseRunStatus = "pending" | "running" | "done";
|
|
172
|
-
export type EvalBatchStatus = "running" | "completed" | "failed";
|
|
209
|
+
export type EvalBatchStatus = "running" | "completed" | "failed" | "cancelled";
|
|
173
210
|
/** One case inside a playground / HTTP eval batch snapshot. */
|
|
174
211
|
export interface EvalCaseSnapshot {
|
|
175
212
|
id: string;
|
|
@@ -252,6 +289,8 @@ export interface HostEvalsApi {
|
|
|
252
289
|
activeRunId?: string;
|
|
253
290
|
}>;
|
|
254
291
|
start(input?: HostStartEvalRunInput): Promise<EvalRunSnapshot>;
|
|
292
|
+
/** Cancel a running batch by Eval ID (`runId`). */
|
|
293
|
+
cancel(runId: string): Promise<EvalRunSnapshot>;
|
|
255
294
|
}
|
|
256
295
|
export interface EvalConfigFile {
|
|
257
296
|
timeoutMs?: number;
|
package/dist/evals.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evals.d.ts","sourceRoot":"","sources":["../src/evals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"evals.d.ts","sourceRoot":"","sources":["../src/evals.ts"],"names":[],"mappings":"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"}
|
package/dist/evals.js
CHANGED
|
@@ -56,11 +56,19 @@ export function equals(value) {
|
|
|
56
56
|
export function satisfies(predicate, label) {
|
|
57
57
|
return { kind: "satisfies", predicate, label };
|
|
58
58
|
}
|
|
59
|
+
/** Hard ceiling for {@link EvalConfig.iterations} / case `iterations`. */
|
|
60
|
+
export const EVAL_MAX_ITERATIONS = 100;
|
|
59
61
|
/**
|
|
60
62
|
* Author an eval file. The path under `evals/` is the file id:
|
|
61
63
|
* `evals/weather.eval.ts` → `weather`. With a single `test`, that is also
|
|
62
64
|
* the case id. With `cases`, each datapoint is `<fileId>/<case.id>`.
|
|
63
65
|
*/
|
|
66
|
+
export function normalizeEvalIterations(value) {
|
|
67
|
+
return normalizePositiveInt(value, {
|
|
68
|
+
label: "defineEval: iterations",
|
|
69
|
+
max: EVAL_MAX_ITERATIONS,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
64
72
|
export function defineEval(config) {
|
|
65
73
|
const hasTest = typeof config.test === "function";
|
|
66
74
|
const hasCases = config.cases !== undefined;
|
|
@@ -70,6 +78,9 @@ export function defineEval(config) {
|
|
|
70
78
|
if (!hasTest && !hasCases) {
|
|
71
79
|
throw new Error("defineEval requires test(t) or a non-empty cases array");
|
|
72
80
|
}
|
|
81
|
+
if (config.iterations !== undefined) {
|
|
82
|
+
normalizeEvalIterations(config.iterations);
|
|
83
|
+
}
|
|
73
84
|
if (hasCases) {
|
|
74
85
|
if (!Array.isArray(config.cases) || config.cases.length === 0) {
|
|
75
86
|
throw new Error("defineEval: cases must be a non-empty array");
|
|
@@ -84,6 +95,9 @@ export function defineEval(config) {
|
|
|
84
95
|
if (typeof datapoint.test !== "function") {
|
|
85
96
|
throw new Error(`defineEval: cases[${JSON.stringify(datapoint.id)}] requires test(t)`);
|
|
86
97
|
}
|
|
98
|
+
if (datapoint.iterations !== undefined) {
|
|
99
|
+
normalizeEvalIterations(datapoint.iterations);
|
|
100
|
+
}
|
|
87
101
|
}
|
|
88
102
|
}
|
|
89
103
|
return brandDefinition("eval", config);
|
|
@@ -99,32 +113,55 @@ function validateDatapointId(id) {
|
|
|
99
113
|
/**
|
|
100
114
|
* Expand a file-level definition into runnable datapoints.
|
|
101
115
|
* Exported for tests and tooling.
|
|
116
|
+
*
|
|
117
|
+
* When `iterations` > 1, each authored datapoint expands to
|
|
118
|
+
* `<fileId>/<case.id>/1` … `<fileId>/<case.id>/<n>` (single-test files
|
|
119
|
+
* expand to `<fileId>/1` … `<fileId>/<n>`).
|
|
102
120
|
*/
|
|
103
121
|
export function expandEvalDefinition(fileId, definition) {
|
|
122
|
+
var _a;
|
|
104
123
|
if (definition.cases !== undefined) {
|
|
105
|
-
return definition.cases.
|
|
106
|
-
var _a, _b, _c;
|
|
124
|
+
return definition.cases.flatMap((datapoint) => {
|
|
125
|
+
var _a, _b, _c, _d, _e;
|
|
107
126
|
const description = (_a = datapoint.description) !== null && _a !== void 0 ? _a : definition.description;
|
|
108
127
|
const timeoutMs = (_b = datapoint.timeoutMs) !== null && _b !== void 0 ? _b : definition.timeoutMs;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
128
|
+
const iterations = normalizeEvalIterations((_d = (_c = datapoint.iterations) !== null && _c !== void 0 ? _c : definition.iterations) !== null && _d !== void 0 ? _d : 1);
|
|
129
|
+
return expandIterations({
|
|
130
|
+
baseId: `${fileId}/${datapoint.id}`,
|
|
131
|
+
description,
|
|
132
|
+
tags: (_e = datapoint.tags) !== null && _e !== void 0 ? _e : definition.tags,
|
|
133
|
+
timeoutMs,
|
|
134
|
+
iterations,
|
|
135
|
+
test: datapoint.test,
|
|
136
|
+
});
|
|
113
137
|
});
|
|
114
138
|
}
|
|
115
139
|
if (typeof definition.test !== "function") {
|
|
116
140
|
throw new Error(`defineEval(${fileId}): missing test(t)`);
|
|
117
141
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
142
|
+
const iterations = normalizeEvalIterations((_a = definition.iterations) !== null && _a !== void 0 ? _a : 1);
|
|
143
|
+
return expandIterations({
|
|
144
|
+
baseId: fileId,
|
|
145
|
+
description: definition.description,
|
|
146
|
+
tags: definition.tags,
|
|
147
|
+
timeoutMs: definition.timeoutMs,
|
|
148
|
+
iterations,
|
|
149
|
+
test: definition.test,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function expandIterations(args) {
|
|
153
|
+
const out = [];
|
|
154
|
+
for (let iteration = 1; iteration <= args.iterations; iteration++) {
|
|
155
|
+
const id = args.iterations === 1 ? args.baseId : `${args.baseId}/${iteration}`;
|
|
156
|
+
const description = args.iterations === 1 || args.description === undefined
|
|
157
|
+
? args.description
|
|
158
|
+
: `${args.description} (iteration ${iteration}/${args.iterations})`;
|
|
159
|
+
out.push({
|
|
160
|
+
id,
|
|
161
|
+
definition: brandDefinition("eval", Object.assign(Object.assign(Object.assign(Object.assign({}, (description !== undefined ? { description } : {})), (args.tags !== undefined ? { tags: args.tags } : {})), (args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {})), { iterations: args.iterations, iteration, test: args.test })),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
128
165
|
}
|
|
129
166
|
/**
|
|
130
167
|
* Whether a discovered case id matches a CLI filter.
|
|
@@ -134,6 +134,10 @@ export declare function cmdEval(options: AxCliOptions): Promise<number>;
|
|
|
134
134
|
* Exported for tests.
|
|
135
135
|
*/
|
|
136
136
|
export declare function formatEvalStatusFlags(options: Pick<AxCliOptions, "prod" | "url" | "slug" | "team">): string;
|
|
137
|
+
/**
|
|
138
|
+
* `eval cancel <runId>` — cancel a running remote batch by Eval ID.
|
|
139
|
+
*/
|
|
140
|
+
export declare function cmdEvalCancel(runId: string | undefined, options: AxCliOptions): Promise<number>;
|
|
137
141
|
/**
|
|
138
142
|
* `eval status [runId]` — fetch one batch (or list recent) on the deployment /
|
|
139
143
|
* `--url` target. Exit `0` when the batch is completed with all cases passing,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-ax.d.ts","sourceRoot":"","sources":["../../src/internal/cli-ax.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"cli-ax.d.ts","sourceRoot":"","sources":["../../src/internal/cli-ax.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/cli-ax.js
CHANGED
|
@@ -25,7 +25,7 @@ import { resolveDeployAuth } from "./cli-deploy.js";
|
|
|
25
25
|
import { resolveApiKey } from "./cursor/credentials.js";
|
|
26
26
|
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
27
27
|
import { discoverEvals, filterDiscoveredEvals, runDiscoveredEvals, } from "./eval-runner.js";
|
|
28
|
-
import { getRemoteEvalRun, listRemoteEvalRuns, listRemoteEvals, RemoteEvalError,
|
|
28
|
+
import { cancelRemoteEvalRun, getRemoteEvalRun, listRemoteEvalRuns, listRemoteEvals, pollRemoteEvalRun, RemoteEvalError, snapshotToEvalRunResults, startRemoteEvalRun, } from "./evals-client.js";
|
|
29
29
|
import { formatInitNextSteps, formatInitScaffoldSummary, initNextCommands, initProject, installScaffoldDependencies, printInitGuide, } from "./init-project.js";
|
|
30
30
|
import { offerInstallCursorSkills } from "./install-cursor-skills.js";
|
|
31
31
|
import { runLogsTail, sanitizeCustomerError } from "./logs-client.js";
|
|
@@ -541,7 +541,8 @@ function resolveEvalTarget(options) {
|
|
|
541
541
|
export function cmdEval(options) {
|
|
542
542
|
return __awaiter(this, void 0, void 0, function* () {
|
|
543
543
|
var _a;
|
|
544
|
-
|
|
544
|
+
var _b;
|
|
545
|
+
const projectRoot = resolve((_b = options.cwd) !== null && _b !== void 0 ? _b : process.cwd(), options.dir);
|
|
545
546
|
const mode = resolveEvalTargetMode(options);
|
|
546
547
|
if (typeof mode === "object") {
|
|
547
548
|
process.stderr.write(`${mode.error}\n`);
|
|
@@ -651,20 +652,35 @@ export function cmdEval(options) {
|
|
|
651
652
|
},
|
|
652
653
|
fetchImpl: options.fetchImpl,
|
|
653
654
|
});
|
|
654
|
-
return printEvalAccepted(started, options, target.agentUrl);
|
|
655
|
+
return yield printEvalAccepted(started, options, target.agentUrl);
|
|
655
656
|
}
|
|
656
657
|
const progress = createRemoteEvalProgress(options.verbose === true || stream);
|
|
657
|
-
|
|
658
|
+
// Start first so we can print the Eval ID before the (often long) wait.
|
|
659
|
+
const started = yield startRemoteEvalRun({
|
|
658
660
|
baseUrl: target.agentUrl,
|
|
659
661
|
filterIds,
|
|
660
662
|
tags,
|
|
661
663
|
timeoutMs: options.timeoutMs,
|
|
662
664
|
verbose: Boolean(options.verbose) || stream,
|
|
663
|
-
|
|
664
|
-
|
|
665
|
+
auth: {
|
|
666
|
+
bearerToken: options.bearerToken,
|
|
667
|
+
headers: target.headers,
|
|
668
|
+
},
|
|
669
|
+
fetchImpl: options.fetchImpl,
|
|
670
|
+
});
|
|
671
|
+
yield printEvalIdBanner(started, options, target.agentUrl);
|
|
672
|
+
(_a = progress === null || progress === void 0 ? void 0 : progress.onSnapshot) === null || _a === void 0 ? void 0 : _a.call(progress, started);
|
|
673
|
+
const snapshot = yield pollRemoteEvalRun({
|
|
674
|
+
baseUrl: target.agentUrl,
|
|
675
|
+
runId: started.runId,
|
|
676
|
+
auth: {
|
|
677
|
+
bearerToken: options.bearerToken,
|
|
678
|
+
headers: target.headers,
|
|
679
|
+
},
|
|
665
680
|
fetchImpl: options.fetchImpl,
|
|
666
681
|
onSnapshot: progress === undefined ? undefined : progress.onSnapshot,
|
|
667
682
|
});
|
|
683
|
+
const results = snapshotToEvalRunResults(snapshot);
|
|
668
684
|
if (results.length === 0 && snapshot.status !== "failed") {
|
|
669
685
|
process.stderr.write("No matching evals found.\n");
|
|
670
686
|
return 2;
|
|
@@ -712,28 +728,141 @@ export function formatEvalStatusFlags(options) {
|
|
|
712
728
|
}
|
|
713
729
|
return parts.length === 0 ? "" : ` ${parts.join(" ")}`;
|
|
714
730
|
}
|
|
731
|
+
/** Print Eval ID + cancel/status hints after a remote batch is accepted. */
|
|
732
|
+
function printEvalIdBanner(started, options, agentUrl) {
|
|
733
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
734
|
+
const pollPath = `${agentUrl.replace(/\/$/, "")}/v1/dev/evals/runs/${started.runId}`;
|
|
735
|
+
const statusFlags = formatEvalStatusFlags(options);
|
|
736
|
+
const playgroundUrl = yield resolveEvalPlaygroundDeepLink(options, started.runId, agentUrl);
|
|
737
|
+
if (options.json) {
|
|
738
|
+
// Waiters still want the id on stderr so progress text stays readable.
|
|
739
|
+
process.stderr.write(`${JSON.stringify(Object.assign({ evalId: started.runId, runId: started.runId, status: started.status, summary: started.summary, pollUrl: pollPath }, (playgroundUrl === undefined ? {} : { playgroundUrl })))}\n`);
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
const durable = started.config.durableRuns === true ? " (persisted)" : "";
|
|
743
|
+
process.stderr.write(`Eval ID: ${started.runId}${durable} — ${started.summary.total} case(s)\n`);
|
|
744
|
+
process.stderr.write(`Cancel: ${CLI_COMMAND_NAME} eval cancel ${started.runId}${statusFlags}\n`);
|
|
745
|
+
process.stderr.write(`Status: ${CLI_COMMAND_NAME} eval status ${started.runId}${statusFlags}\n`);
|
|
746
|
+
if (playgroundUrl !== undefined) {
|
|
747
|
+
process.stderr.write(`Playground: ${playgroundUrl}\n`);
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
}
|
|
715
751
|
/** `--no-wait`: print the accepted batch id (and how to poll) then exit. */
|
|
716
752
|
function printEvalAccepted(started, options, agentUrl) {
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
accepted: true,
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
}
|
|
736
|
-
|
|
753
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
754
|
+
const pollPath = `${agentUrl.replace(/\/$/, "")}/v1/dev/evals/runs/${started.runId}`;
|
|
755
|
+
const statusFlags = formatEvalStatusFlags(options);
|
|
756
|
+
const playgroundUrl = yield resolveEvalPlaygroundDeepLink(options, started.runId, agentUrl);
|
|
757
|
+
if (options.json) {
|
|
758
|
+
console.log(JSON.stringify(Object.assign({ ok: true, accepted: true, evalId: started.runId, runId: started.runId, status: started.status, summary: started.summary, pollUrl: pollPath, durableRuns: started.config.durableRuns === true }, (playgroundUrl === undefined ? {} : { playgroundUrl })), null, 2));
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
const durable = started.config.durableRuns === true ? " (persisted)" : "";
|
|
762
|
+
process.stdout.write(`Eval ID: ${started.runId}${durable} — ${started.summary.total} case(s)\n`);
|
|
763
|
+
process.stdout.write(`Cancel: ${CLI_COMMAND_NAME} eval cancel ${started.runId}${statusFlags}\n`);
|
|
764
|
+
process.stdout.write(`Status: ${CLI_COMMAND_NAME} eval status ${started.runId}${statusFlags}\n`);
|
|
765
|
+
if (playgroundUrl !== undefined) {
|
|
766
|
+
process.stdout.write(`Playground: ${playgroundUrl}\n`);
|
|
767
|
+
}
|
|
768
|
+
process.stdout.write(`Poll: ${pollPath}\n`);
|
|
769
|
+
}
|
|
770
|
+
return 0;
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Hosted alias playground URL with `view=evals` + `evalRunId` so the SPA
|
|
775
|
+
* opens the batch that CLI / Slack started (not a stale sessionStorage id).
|
|
776
|
+
*/
|
|
777
|
+
function resolveEvalPlaygroundDeepLink(options, runId, agentUrl) {
|
|
778
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
779
|
+
if (options.prod !== true) {
|
|
780
|
+
const base = `${agentUrl.replace(/\/$/, "")}/playground`;
|
|
781
|
+
try {
|
|
782
|
+
const url = new URL(base);
|
|
783
|
+
url.searchParams.set("view", "evals");
|
|
784
|
+
url.searchParams.set("evalRunId", runId);
|
|
785
|
+
return url.toString();
|
|
786
|
+
}
|
|
787
|
+
catch (_a) {
|
|
788
|
+
return undefined;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
try {
|
|
792
|
+
const resolved = yield resolveProdAliasPlaygroundUrl({
|
|
793
|
+
dir: options.dir,
|
|
794
|
+
cwd: options.cwd,
|
|
795
|
+
slug: options.slug,
|
|
796
|
+
team: options.team,
|
|
797
|
+
apiKey: options.apiKey,
|
|
798
|
+
fetchImpl: options.fetchImpl,
|
|
799
|
+
// Avoid a second "Using hosted deployment" line; banner already has context.
|
|
800
|
+
err: () => { },
|
|
801
|
+
});
|
|
802
|
+
const url = new URL(resolved.playgroundUrl);
|
|
803
|
+
url.searchParams.set("view", "evals");
|
|
804
|
+
url.searchParams.set("evalRunId", runId);
|
|
805
|
+
return url.toString();
|
|
806
|
+
}
|
|
807
|
+
catch (_b) {
|
|
808
|
+
return undefined;
|
|
809
|
+
}
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* `eval cancel <runId>` — cancel a running remote batch by Eval ID.
|
|
814
|
+
*/
|
|
815
|
+
export function cmdEvalCancel(runId, options) {
|
|
816
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
817
|
+
const mode = resolveEvalTargetMode(options);
|
|
818
|
+
if (typeof mode === "object") {
|
|
819
|
+
process.stderr.write(`${mode.error}\n`);
|
|
820
|
+
return 2;
|
|
821
|
+
}
|
|
822
|
+
if (mode === "local") {
|
|
823
|
+
process.stderr.write("eval cancel requires --prod or --url (not the default local target)\n");
|
|
824
|
+
return 2;
|
|
825
|
+
}
|
|
826
|
+
if (runId === undefined || runId === "") {
|
|
827
|
+
process.stderr.write("usage: eval cancel <evalId> --prod|--url …\n");
|
|
828
|
+
return 2;
|
|
829
|
+
}
|
|
830
|
+
if (options.list === true || options.noWait === true) {
|
|
831
|
+
process.stderr.write("eval cancel does not accept --list or --no-wait\n");
|
|
832
|
+
return 2;
|
|
833
|
+
}
|
|
834
|
+
const target = yield resolveEvalTarget(options);
|
|
835
|
+
if (typeof target === "number") {
|
|
836
|
+
return target;
|
|
837
|
+
}
|
|
838
|
+
try {
|
|
839
|
+
const snap = yield cancelRemoteEvalRun({
|
|
840
|
+
baseUrl: target.agentUrl,
|
|
841
|
+
runId,
|
|
842
|
+
auth: {
|
|
843
|
+
bearerToken: options.bearerToken,
|
|
844
|
+
headers: target.headers,
|
|
845
|
+
},
|
|
846
|
+
fetchImpl: options.fetchImpl,
|
|
847
|
+
});
|
|
848
|
+
if (options.json) {
|
|
849
|
+
console.log(JSON.stringify(snap, null, 2));
|
|
850
|
+
}
|
|
851
|
+
else {
|
|
852
|
+
process.stdout.write(`Cancelled Eval ID ${snap.runId} (${snap.summary.done}/${snap.summary.total} cases finalized)\n`);
|
|
853
|
+
}
|
|
854
|
+
return 0;
|
|
855
|
+
}
|
|
856
|
+
catch (error) {
|
|
857
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
858
|
+
return 1;
|
|
859
|
+
}
|
|
860
|
+
finally {
|
|
861
|
+
if (target.close !== undefined) {
|
|
862
|
+
yield target.close();
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
});
|
|
737
866
|
}
|
|
738
867
|
/**
|
|
739
868
|
* `eval status [runId]` — fetch one batch (or list recent) on the deployment /
|
|
@@ -815,7 +944,9 @@ export function cmdEvalStatus(runId, options) {
|
|
|
815
944
|
if (snap.status === "running") {
|
|
816
945
|
return 3;
|
|
817
946
|
}
|
|
818
|
-
const failed = snap.status === "failed" ||
|
|
947
|
+
const failed = snap.status === "failed" ||
|
|
948
|
+
snap.status === "cancelled" ||
|
|
949
|
+
snap.cases.some((c) => c.ok !== true);
|
|
819
950
|
return failed ? 1 : 0;
|
|
820
951
|
}
|
|
821
952
|
catch (error) {
|
|
@@ -871,17 +1002,12 @@ function createRemoteEvalProgress(enabled) {
|
|
|
871
1002
|
if (!enabled) {
|
|
872
1003
|
return undefined;
|
|
873
1004
|
}
|
|
874
|
-
let announced = false;
|
|
875
1005
|
let lastSummaryKey = "";
|
|
876
1006
|
const seenCaseKeys = new Set();
|
|
877
1007
|
return {
|
|
878
1008
|
onSnapshot(snap) {
|
|
879
1009
|
var _a, _b;
|
|
880
|
-
|
|
881
|
-
announced = true;
|
|
882
|
-
const durable = snap.config.durableRuns === true ? " (persisted)" : "";
|
|
883
|
-
process.stderr.write(`eval run: ${snap.runId}${durable}\n`);
|
|
884
|
-
}
|
|
1010
|
+
// Eval ID is printed by printEvalIdBanner / printEvalAccepted.
|
|
885
1011
|
const summaryKey = `${snap.status}:${snap.summary.done}:${snap.summary.passed}:${snap.summary.failed}`;
|
|
886
1012
|
if (summaryKey !== lastSummaryKey) {
|
|
887
1013
|
lastSummaryKey = summaryKey;
|
|
@@ -906,6 +1032,7 @@ function createRemoteEvalProgress(enabled) {
|
|
|
906
1032
|
};
|
|
907
1033
|
}
|
|
908
1034
|
function printEvalResults(results, options, batch) {
|
|
1035
|
+
var _a;
|
|
909
1036
|
const passed = results.filter((r) => r.ok).length;
|
|
910
1037
|
const failed = results.length - passed;
|
|
911
1038
|
const batchFailed = (batch === null || batch === void 0 ? void 0 : batch.status) === "failed";
|
|
@@ -932,6 +1059,9 @@ function printEvalResults(results, options, batch) {
|
|
|
932
1059
|
for (const a of r.assertions) {
|
|
933
1060
|
process.stdout.write(` ${a.passed ? "✓" : "✗"} ${a.name}${a.detail !== undefined ? ` (${a.detail})` : ""}\n`);
|
|
934
1061
|
}
|
|
1062
|
+
for (const line of (_a = r.logs) !== null && _a !== void 0 ? _a : []) {
|
|
1063
|
+
process.stdout.write(` ${line}\n`);
|
|
1064
|
+
}
|
|
935
1065
|
if (r.error !== undefined) {
|
|
936
1066
|
process.stdout.write(` error: ${r.error}\n`);
|
|
937
1067
|
}
|
|
@@ -54,6 +54,11 @@ export interface DeployCliOptions {
|
|
|
54
54
|
allowDomains?: string[];
|
|
55
55
|
/** Test seams. */
|
|
56
56
|
fetchImpl?: typeof fetch;
|
|
57
|
+
/** Inject the connector-auth browser opener (tests; also forces interactive). */
|
|
58
|
+
openBrowserImpl?: (url: string) => void;
|
|
59
|
+
sleepImpl?: (ms: number) => Promise<void>;
|
|
60
|
+
connectorPollIntervalMs?: number;
|
|
61
|
+
connectorPollTimeoutMs?: number;
|
|
57
62
|
/** Inject git probing for deploy source inference (tests). */
|
|
58
63
|
git?: GitRunner;
|
|
59
64
|
/** Inject the multi-agent picker (tests / non-interactive hosts). */
|
|
@@ -80,6 +85,9 @@ export interface ResolveDeployAuthOptions {
|
|
|
80
85
|
export interface ResolvedDeployAuth {
|
|
81
86
|
client: AgentServeDeployClient;
|
|
82
87
|
teamId: number;
|
|
88
|
+
/** The resolved account credential, for dashboard RPCs beside the deploy API. */
|
|
89
|
+
apiKey: string;
|
|
90
|
+
backendUrl: string;
|
|
83
91
|
}
|
|
84
92
|
/**
|
|
85
93
|
* Credentials → deploy client → team id. Shared by deploy commands and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"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"}
|