@cursor/july 0.1.6 → 0.1.7
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 +42 -17
- package/dist/channels/slack/post-update-delivery.d.ts +85 -0
- package/dist/channels/slack/post-update-delivery.d.ts.map +1 -0
- package/dist/docs/404.html +1 -1
- package/dist/docs/ab.html +2 -2
- package/dist/docs/assets/{app.DMboGKUD.js → app.COTN7wgo.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.B7UcKvIn.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DkEqEnJU.js → VPLocalSearchBox.BW3TBdT0.js} +1 -1
- package/dist/docs/assets/chunks/{theme.ASugdMNm.js → theme.BEJW0vE7.js} +2 -2
- package/dist/docs/building-with-agents.html +2 -2
- package/dist/docs/concepts.html +2 -2
- package/dist/docs/deployment.html +2 -2
- package/dist/docs/evals.html +2 -2
- package/dist/docs/example-agents/approval-buddy.html +2 -2
- package/dist/docs/example-agents/benny.html +2 -2
- package/dist/docs/example-agents/bugbot.html +2 -2
- package/dist/docs/example-agents/codebase-wiki.html +2 -2
- package/dist/docs/example-agents/codeowners-review.html +2 -2
- package/dist/docs/example-agents/concierge.html +2 -2
- package/dist/docs/example-agents/fsd.html +2 -2
- package/dist/docs/example-agents/index.html +2 -2
- package/dist/docs/example-agents/knowledge-base.html +2 -2
- package/dist/docs/example-agents/security-reviewer.html +2 -2
- package/dist/docs/example-agents/slack-agent.html +2 -2
- package/dist/docs/example-agents/weather-agent.html +2 -2
- package/dist/docs/guides/agent-to-agent.html +2 -2
- package/dist/docs/guides/cloud-runtime.html +2 -2
- package/dist/docs/guides/github.html +2 -2
- package/dist/docs/guides/human-in-the-loop.html +2 -2
- package/dist/docs/guides/slack.html +2 -2
- package/dist/docs/guides/webhooks.html +2 -2
- package/dist/docs/hillclimbing.html +2 -2
- package/dist/docs/index.html +2 -2
- package/dist/docs/quickstart.html +2 -2
- package/dist/docs/reference/agent-config.html +2 -2
- package/dist/docs/reference/channels.html +2 -2
- package/dist/docs/reference/cli.html +2 -2
- package/dist/docs/reference/connections.html +2 -2
- package/dist/docs/reference/hooks.html +2 -2
- package/dist/docs/reference/http-api.html +2 -2
- package/dist/docs/reference/instructions.html +2 -2
- package/dist/docs/reference/playground.html +2 -2
- package/dist/docs/reference/project-layout.html +2 -2
- package/dist/docs/reference/schedules.html +2 -2
- package/dist/docs/reference/sessions.html +2 -2
- package/dist/docs/reference/skills.html +2 -2
- package/dist/docs/reference/subagents.html +2 -2
- package/dist/docs/reference/tools.html +2 -2
- package/dist/docs/scaffolding-agents.html +2 -2
- package/dist/docs/storage.html +2 -2
- package/dist/docs/troubleshooting.html +2 -2
- package/dist/evals.d.ts +2 -2
- package/dist/internal/cli-ax.d.ts +23 -10
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +358 -55
- package/dist/internal/eval-run-store.d.ts +2 -0
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +4 -4
- package/dist/internal/evals-client.d.ts +96 -0
- package/dist/internal/evals-client.d.ts.map +1 -0
- package/dist/internal/evals-client.js +262 -0
- package/dist/internal/init-project.js +3 -3
- package/dist/internal/json-dir-store.d.ts +32 -0
- package/dist/internal/json-dir-store.d.ts.map +1 -0
- package/dist/internal/persistence-coordinator.d.ts +127 -0
- package/dist/internal/persistence-coordinator.d.ts.map +1 -0
- package/dist/internal/server.js +11 -2
- package/dist/persistence.d.ts +184 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/playground/assets/index-72vCOBWO.js +86 -0
- package/dist/playground/assets/index-BjnMwYoR.css +1 -0
- package/dist/playground/index.html +2 -2
- package/package.json +1 -1
- package/src/bin/agent-serve.ts +47 -16
- package/src/evals.ts +2 -2
- package/src/internal/cli-ax.ts +466 -75
- package/src/internal/eval-run-store.ts +5 -0
- package/src/internal/evals-client.ts +431 -0
- package/src/internal/init-project.ts +3 -3
- package/src/internal/server.ts +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.O6eP7QZr.js +0 -1
- package/dist/playground/assets/index-7GJIUFQj.css +0 -1
- package/dist/playground/assets/index-mux9aj5P.js +0 -319
package/dist/internal/cli-ax.js
CHANGED
|
@@ -25,6 +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, runRemoteEvals, startRemoteEvalRun, } from "./evals-client.js";
|
|
28
29
|
import { formatInitNextSteps, formatInitScaffoldSummary, initNextCommands, initProject, installScaffoldDependencies, printInitGuide, } from "./init-project.js";
|
|
29
30
|
import { offerInstallCursorSkills } from "./install-cursor-skills.js";
|
|
30
31
|
import { runLogsTail, sanitizeCustomerError } from "./logs-client.js";
|
|
@@ -476,26 +477,25 @@ export function cmdTrajectory(options) {
|
|
|
476
477
|
});
|
|
477
478
|
}
|
|
478
479
|
/**
|
|
479
|
-
* Which surface `eval` should target.
|
|
480
|
-
*
|
|
480
|
+
* Which surface `eval` should target. Local (ephemeral) is the default;
|
|
481
|
+
* `--prod` uses the hosted deployment, `--url` a running server.
|
|
481
482
|
* Exported for tests.
|
|
482
483
|
*/
|
|
483
484
|
export function resolveEvalTargetMode(options) {
|
|
484
485
|
const flags = [
|
|
485
|
-
options.local === true ? "--local" : undefined,
|
|
486
486
|
options.prod === true ? "--prod" : undefined,
|
|
487
487
|
options.url !== undefined ? "--url" : undefined,
|
|
488
488
|
].filter((flag) => flag !== undefined);
|
|
489
489
|
if (flags.length > 1) {
|
|
490
490
|
return { error: `${flags.join(" and ")} are mutually exclusive` };
|
|
491
491
|
}
|
|
492
|
-
if (options.local === true) {
|
|
493
|
-
return "local";
|
|
494
|
-
}
|
|
495
492
|
if (options.url !== undefined) {
|
|
496
493
|
return "url";
|
|
497
494
|
}
|
|
498
|
-
|
|
495
|
+
if (options.prod === true) {
|
|
496
|
+
return "deployment";
|
|
497
|
+
}
|
|
498
|
+
return "local";
|
|
499
499
|
}
|
|
500
500
|
/** Resolve the eval target; prints a CLI-ready error and returns an exit code on failure. */
|
|
501
501
|
function resolveEvalTarget(options) {
|
|
@@ -528,13 +528,12 @@ function resolveEvalTarget(options) {
|
|
|
528
528
|
// disabled feature gate, and the message distinguishes those from a
|
|
529
529
|
// genuinely missing deployment.
|
|
530
530
|
process.stderr.write(`${sanitizeCustomerError(error.message)}\n` +
|
|
531
|
-
`Evals run on the hosted deployment by default.\n` +
|
|
532
531
|
` deploy it first: ${CLI_COMMAND_NAME} deploy --slug ${error.slug}\n` +
|
|
533
|
-
` or
|
|
532
|
+
` or omit --prod: ${CLI_COMMAND_NAME} eval --dir ${options.dir}\n`);
|
|
534
533
|
return 1;
|
|
535
534
|
}
|
|
536
535
|
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n` +
|
|
537
|
-
`
|
|
536
|
+
`Pass --prod for the hosted deployment, or omit it to run on an ephemeral local server.\n`);
|
|
538
537
|
return 1;
|
|
539
538
|
}
|
|
540
539
|
});
|
|
@@ -543,81 +542,385 @@ export function cmdEval(options) {
|
|
|
543
542
|
return __awaiter(this, void 0, void 0, function* () {
|
|
544
543
|
var _a;
|
|
545
544
|
const projectRoot = resolve((_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd(), options.dir);
|
|
545
|
+
const mode = resolveEvalTargetMode(options);
|
|
546
|
+
if (typeof mode === "object") {
|
|
547
|
+
process.stderr.write(`${mode.error}\n`);
|
|
548
|
+
return 2;
|
|
549
|
+
}
|
|
550
|
+
if (options.noWait === true) {
|
|
551
|
+
if (options.list === true) {
|
|
552
|
+
process.stderr.write("--no-wait and --list are mutually exclusive\n");
|
|
553
|
+
return 2;
|
|
554
|
+
}
|
|
555
|
+
if (mode === "local") {
|
|
556
|
+
process.stderr.write("--no-wait requires --prod or --url (not the default local target)\n");
|
|
557
|
+
return 2;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
const filterIds = options.evalIds === undefined || options.evalIds.length === 0
|
|
561
|
+
? undefined
|
|
562
|
+
: options.evalIds;
|
|
563
|
+
const tags = options.tags === undefined || options.tags.length === 0
|
|
564
|
+
? undefined
|
|
565
|
+
: options.tags;
|
|
546
566
|
if (options.list) {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
|
|
567
|
+
// List the same surface a run will execute: local filesystem by default,
|
|
568
|
+
// GET /v1/dev/evals on --prod / --url.
|
|
569
|
+
if (mode === "local") {
|
|
570
|
+
return listLocalEvals(projectRoot, options, filterIds, tags);
|
|
571
|
+
}
|
|
572
|
+
const target = yield resolveEvalTarget(options);
|
|
573
|
+
if (typeof target === "number") {
|
|
574
|
+
return target;
|
|
575
|
+
}
|
|
576
|
+
try {
|
|
577
|
+
const listed = yield listRemoteEvals({
|
|
578
|
+
baseUrl: target.agentUrl,
|
|
579
|
+
auth: {
|
|
580
|
+
bearerToken: options.bearerToken,
|
|
581
|
+
headers: target.headers,
|
|
582
|
+
},
|
|
583
|
+
fetchImpl: options.fetchImpl,
|
|
584
|
+
filterIds,
|
|
585
|
+
tags,
|
|
586
|
+
});
|
|
587
|
+
return printListedEvals(listed.map((e) => { var _a; return ({
|
|
554
588
|
id: e.id,
|
|
555
589
|
fileId: e.fileId,
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
}); }), null, 2));
|
|
590
|
+
description: e.description,
|
|
591
|
+
tags: (_a = e.tags) !== null && _a !== void 0 ? _a : [],
|
|
592
|
+
}); }), options, `No evals on ${target.agentUrl}`);
|
|
560
593
|
}
|
|
561
|
-
|
|
562
|
-
process.
|
|
594
|
+
catch (error) {
|
|
595
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
596
|
+
return 1;
|
|
563
597
|
}
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
? ` [${e.definition.tags.join(", ")}]`
|
|
568
|
-
: "";
|
|
569
|
-
const desc = e.definition.description !== undefined
|
|
570
|
-
? ` — ${e.definition.description}`
|
|
571
|
-
: "";
|
|
572
|
-
process.stdout.write(`${e.id}${tags}${desc}\n`);
|
|
598
|
+
finally {
|
|
599
|
+
if (target.close !== undefined) {
|
|
600
|
+
yield target.close();
|
|
573
601
|
}
|
|
574
602
|
}
|
|
575
|
-
return 0;
|
|
576
603
|
}
|
|
577
604
|
const target = yield resolveEvalTarget(options);
|
|
578
605
|
if (typeof target === "number") {
|
|
579
606
|
return target;
|
|
580
607
|
}
|
|
581
608
|
const stream = shouldStreamProgress(options);
|
|
582
|
-
const progress = stream ? createStreamProgress() : undefined;
|
|
583
609
|
try {
|
|
584
610
|
if (options.verbose || stream) {
|
|
585
611
|
process.stderr.write(`eval target: ${target.agentUrl}\n`);
|
|
586
612
|
}
|
|
587
|
-
|
|
588
|
-
|
|
613
|
+
// Default local: ephemeral in-process harness against local eval sources.
|
|
614
|
+
// --prod / --url: run on the serve process via /v1/dev/evals/runs so the
|
|
615
|
+
// batch lands in playground history and defineStorage evals (when set).
|
|
616
|
+
if (mode === "local") {
|
|
617
|
+
const progress = stream ? createStreamProgress() : undefined;
|
|
618
|
+
try {
|
|
619
|
+
const results = yield runDiscoveredEvals({
|
|
620
|
+
projectRoot,
|
|
621
|
+
baseUrl: target.agentUrl,
|
|
622
|
+
filterIds,
|
|
623
|
+
tags,
|
|
624
|
+
timeoutMs: options.timeoutMs,
|
|
625
|
+
bearerToken: options.bearerToken,
|
|
626
|
+
headers: target.headers,
|
|
627
|
+
verbose: Boolean(options.verbose) || stream,
|
|
628
|
+
onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
|
|
629
|
+
});
|
|
630
|
+
if (results.length === 0) {
|
|
631
|
+
process.stderr.write("No matching evals found.\n");
|
|
632
|
+
return 2;
|
|
633
|
+
}
|
|
634
|
+
return printEvalResults(results, options);
|
|
635
|
+
}
|
|
636
|
+
finally {
|
|
637
|
+
progress === null || progress === void 0 ? void 0 : progress.close();
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
try {
|
|
641
|
+
if (options.noWait === true) {
|
|
642
|
+
const started = yield startRemoteEvalRun({
|
|
643
|
+
baseUrl: target.agentUrl,
|
|
644
|
+
filterIds,
|
|
645
|
+
tags,
|
|
646
|
+
timeoutMs: options.timeoutMs,
|
|
647
|
+
verbose: Boolean(options.verbose),
|
|
648
|
+
auth: {
|
|
649
|
+
bearerToken: options.bearerToken,
|
|
650
|
+
headers: target.headers,
|
|
651
|
+
},
|
|
652
|
+
fetchImpl: options.fetchImpl,
|
|
653
|
+
});
|
|
654
|
+
return printEvalAccepted(started, options, target.agentUrl);
|
|
655
|
+
}
|
|
656
|
+
const progress = createRemoteEvalProgress(options.verbose === true || stream);
|
|
657
|
+
const { snapshot, results } = yield runRemoteEvals({
|
|
658
|
+
baseUrl: target.agentUrl,
|
|
659
|
+
filterIds,
|
|
660
|
+
tags,
|
|
661
|
+
timeoutMs: options.timeoutMs,
|
|
662
|
+
verbose: Boolean(options.verbose) || stream,
|
|
663
|
+
bearerToken: options.bearerToken,
|
|
664
|
+
headers: target.headers,
|
|
665
|
+
fetchImpl: options.fetchImpl,
|
|
666
|
+
onSnapshot: progress === undefined ? undefined : progress.onSnapshot,
|
|
667
|
+
});
|
|
668
|
+
if (results.length === 0 && snapshot.status !== "failed") {
|
|
669
|
+
process.stderr.write("No matching evals found.\n");
|
|
670
|
+
return 2;
|
|
671
|
+
}
|
|
672
|
+
return printEvalResults(results, options, {
|
|
673
|
+
runId: snapshot.runId,
|
|
674
|
+
status: snapshot.status,
|
|
675
|
+
error: snapshot.error,
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
catch (error) {
|
|
679
|
+
if (error instanceof RemoteEvalError &&
|
|
680
|
+
error.code === "no_matching_evals") {
|
|
681
|
+
process.stderr.write(`${error.message}\n`);
|
|
682
|
+
return 2;
|
|
683
|
+
}
|
|
684
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
685
|
+
return 1;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
finally {
|
|
689
|
+
if (target.close !== undefined) {
|
|
690
|
+
yield target.close();
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Flags to re-target the same surface from an `eval --no-wait` hint.
|
|
697
|
+
* Exported for tests.
|
|
698
|
+
*/
|
|
699
|
+
export function formatEvalStatusFlags(options) {
|
|
700
|
+
const parts = [];
|
|
701
|
+
if (options.url !== undefined) {
|
|
702
|
+
parts.push(`--url ${options.url.replace(/\/$/, "")}`);
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
parts.push("--prod");
|
|
706
|
+
if (options.slug !== undefined && options.slug !== "") {
|
|
707
|
+
parts.push(`--slug ${options.slug}`);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
if (options.team !== undefined && options.team !== "") {
|
|
711
|
+
parts.push(`--team ${options.team}`);
|
|
712
|
+
}
|
|
713
|
+
return parts.length === 0 ? "" : ` ${parts.join(" ")}`;
|
|
714
|
+
}
|
|
715
|
+
/** `--no-wait`: print the accepted batch id (and how to poll) then exit. */
|
|
716
|
+
function printEvalAccepted(started, options, agentUrl) {
|
|
717
|
+
const pollPath = `${agentUrl.replace(/\/$/, "")}/v1/dev/evals/runs/${started.runId}`;
|
|
718
|
+
const statusFlags = formatEvalStatusFlags(options);
|
|
719
|
+
if (options.json) {
|
|
720
|
+
console.log(JSON.stringify({
|
|
721
|
+
ok: true,
|
|
722
|
+
accepted: true,
|
|
723
|
+
runId: started.runId,
|
|
724
|
+
status: started.status,
|
|
725
|
+
summary: started.summary,
|
|
726
|
+
pollUrl: pollPath,
|
|
727
|
+
durableRuns: started.config.durableRuns === true,
|
|
728
|
+
}, null, 2));
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
const durable = started.config.durableRuns === true ? " (persisted)" : "";
|
|
732
|
+
process.stdout.write(`Accepted eval run ${started.runId}${durable} — ${started.summary.total} case(s)\n`);
|
|
733
|
+
process.stdout.write(`Status: ${CLI_COMMAND_NAME} eval status ${started.runId}${statusFlags}\n`);
|
|
734
|
+
process.stdout.write(`Poll: ${pollPath}\n`);
|
|
735
|
+
}
|
|
736
|
+
return 0;
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* `eval status [runId]` — fetch one batch (or list recent) on the deployment /
|
|
740
|
+
* `--url` target. Exit `0` when the batch is completed with all cases passing,
|
|
741
|
+
* `1` when failed / any case failed / unknown, `2` for usage errors, `3` when
|
|
742
|
+
* the batch is still running (for poll loops after `--no-wait`).
|
|
743
|
+
*/
|
|
744
|
+
export function cmdEvalStatus(runId, options) {
|
|
745
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
746
|
+
const mode = resolveEvalTargetMode(options);
|
|
747
|
+
if (typeof mode === "object") {
|
|
748
|
+
process.stderr.write(`${mode.error}\n`);
|
|
749
|
+
return 2;
|
|
750
|
+
}
|
|
751
|
+
if (mode === "local") {
|
|
752
|
+
process.stderr.write("eval status requires --prod or --url (not the default local target)\n");
|
|
753
|
+
return 2;
|
|
754
|
+
}
|
|
755
|
+
if (options.list === true || options.noWait === true) {
|
|
756
|
+
process.stderr.write("eval status does not accept --list or --no-wait\n");
|
|
757
|
+
return 2;
|
|
758
|
+
}
|
|
759
|
+
const target = yield resolveEvalTarget(options);
|
|
760
|
+
if (typeof target === "number") {
|
|
761
|
+
return target;
|
|
762
|
+
}
|
|
763
|
+
const auth = {
|
|
764
|
+
bearerToken: options.bearerToken,
|
|
765
|
+
headers: target.headers,
|
|
766
|
+
};
|
|
767
|
+
try {
|
|
768
|
+
if (runId === undefined || runId === "") {
|
|
769
|
+
const { runs, activeRunId } = yield listRemoteEvalRuns({
|
|
770
|
+
baseUrl: target.agentUrl,
|
|
771
|
+
auth,
|
|
772
|
+
fetchImpl: options.fetchImpl,
|
|
773
|
+
});
|
|
774
|
+
if (options.json) {
|
|
775
|
+
console.log(JSON.stringify({ runs, activeRunId }, null, 2));
|
|
776
|
+
}
|
|
777
|
+
else if (runs.length === 0) {
|
|
778
|
+
process.stdout.write("No eval runs on this agent.\n");
|
|
779
|
+
}
|
|
780
|
+
else {
|
|
781
|
+
if (activeRunId !== undefined) {
|
|
782
|
+
process.stdout.write(`active: ${activeRunId}\n`);
|
|
783
|
+
}
|
|
784
|
+
for (const run of runs) {
|
|
785
|
+
process.stdout.write(`${formatEvalRunSummaryLine(run)}\n`);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
return 0;
|
|
789
|
+
}
|
|
790
|
+
const snap = yield getRemoteEvalRun({
|
|
589
791
|
baseUrl: target.agentUrl,
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
tags: options.tags === undefined || options.tags.length === 0
|
|
594
|
-
? undefined
|
|
595
|
-
: options.tags,
|
|
596
|
-
timeoutMs: options.timeoutMs,
|
|
597
|
-
bearerToken: options.bearerToken,
|
|
598
|
-
headers: target.headers,
|
|
599
|
-
verbose: Boolean(options.verbose) || stream,
|
|
600
|
-
onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
|
|
792
|
+
runId,
|
|
793
|
+
auth,
|
|
794
|
+
fetchImpl: options.fetchImpl,
|
|
601
795
|
});
|
|
602
|
-
if (
|
|
603
|
-
|
|
604
|
-
|
|
796
|
+
if (options.json) {
|
|
797
|
+
console.log(JSON.stringify(snap, null, 2));
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
process.stdout.write(`${formatEvalRunSummaryLine(snap)}\n`);
|
|
801
|
+
if (snap.error !== undefined && snap.error !== "") {
|
|
802
|
+
process.stdout.write(`error: ${snap.error}\n`);
|
|
803
|
+
}
|
|
804
|
+
for (const c of snap.cases) {
|
|
805
|
+
const mark = c.status !== "done" ? c.status : c.ok === true ? "PASS" : "FAIL";
|
|
806
|
+
const dur = c.durationMs === undefined
|
|
807
|
+
? ""
|
|
808
|
+
: ` (${(c.durationMs / 1000).toFixed(1)}s)`;
|
|
809
|
+
process.stdout.write(` ${mark} ${c.id}${dur}\n`);
|
|
810
|
+
if (c.error !== undefined && c.error !== "") {
|
|
811
|
+
process.stdout.write(` error: ${c.error}\n`);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
if (snap.status === "running") {
|
|
816
|
+
return 3;
|
|
605
817
|
}
|
|
606
|
-
|
|
818
|
+
const failed = snap.status === "failed" || snap.cases.some((c) => c.ok !== true);
|
|
819
|
+
return failed ? 1 : 0;
|
|
820
|
+
}
|
|
821
|
+
catch (error) {
|
|
822
|
+
process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
|
|
823
|
+
return 1;
|
|
607
824
|
}
|
|
608
825
|
finally {
|
|
609
|
-
progress === null || progress === void 0 ? void 0 : progress.close();
|
|
610
826
|
if (target.close !== undefined) {
|
|
611
827
|
yield target.close();
|
|
612
828
|
}
|
|
613
829
|
}
|
|
614
830
|
});
|
|
615
831
|
}
|
|
616
|
-
function
|
|
832
|
+
function formatEvalRunSummaryLine(run) {
|
|
833
|
+
const { passed, failed, total, done } = run.summary;
|
|
834
|
+
const durable = run.config.durableRuns === true ? " persisted" : "";
|
|
835
|
+
return `${run.runId} ${run.status} ${done}/${total} done (${passed} passed, ${failed} failed)${durable}`;
|
|
836
|
+
}
|
|
837
|
+
function listLocalEvals(projectRoot, options, filterIds, tags) {
|
|
838
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
839
|
+
const { evals } = yield discoverEvals(projectRoot);
|
|
840
|
+
const listed = filterDiscoveredEvals(evals, { filterIds, tags });
|
|
841
|
+
return printListedEvals(listed.map((e) => { var _a; return ({
|
|
842
|
+
id: e.id,
|
|
843
|
+
fileId: e.fileId,
|
|
844
|
+
path: e.path,
|
|
845
|
+
description: e.definition.description,
|
|
846
|
+
tags: (_a = e.definition.tags) !== null && _a !== void 0 ? _a : [],
|
|
847
|
+
}); }), options, `No evals under ${projectRoot}/evals`);
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
function printListedEvals(listed, options, emptyMessage) {
|
|
851
|
+
if (options.json) {
|
|
852
|
+
console.log(JSON.stringify(listed, null, 2));
|
|
853
|
+
}
|
|
854
|
+
else if (listed.length === 0) {
|
|
855
|
+
process.stdout.write(`${emptyMessage}\n`);
|
|
856
|
+
}
|
|
857
|
+
else {
|
|
858
|
+
for (const e of listed) {
|
|
859
|
+
const tagSuffix = e.tags.length > 0 ? ` [${e.tags.join(", ")}]` : "";
|
|
860
|
+
const desc = e.description !== undefined ? ` — ${e.description}` : "";
|
|
861
|
+
process.stdout.write(`${e.id}${tagSuffix}${desc}\n`);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
return 0;
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Remote batches don't stream turn events to the CLI; print run/case progress
|
|
868
|
+
* (and case logs once they appear on the snapshot) instead.
|
|
869
|
+
*/
|
|
870
|
+
function createRemoteEvalProgress(enabled) {
|
|
871
|
+
if (!enabled) {
|
|
872
|
+
return undefined;
|
|
873
|
+
}
|
|
874
|
+
let announced = false;
|
|
875
|
+
let lastSummaryKey = "";
|
|
876
|
+
const seenCaseKeys = new Set();
|
|
877
|
+
return {
|
|
878
|
+
onSnapshot(snap) {
|
|
879
|
+
var _a, _b;
|
|
880
|
+
if (!announced) {
|
|
881
|
+
announced = true;
|
|
882
|
+
const durable = snap.config.durableRuns === true ? " (persisted)" : "";
|
|
883
|
+
process.stderr.write(`eval run: ${snap.runId}${durable}\n`);
|
|
884
|
+
}
|
|
885
|
+
const summaryKey = `${snap.status}:${snap.summary.done}:${snap.summary.passed}:${snap.summary.failed}`;
|
|
886
|
+
if (summaryKey !== lastSummaryKey) {
|
|
887
|
+
lastSummaryKey = summaryKey;
|
|
888
|
+
const { done, total, passed, failed } = snap.summary;
|
|
889
|
+
process.stderr.write(`eval progress: ${done}/${total} done (${passed} passed, ${failed} failed) [${snap.status}]\n`);
|
|
890
|
+
}
|
|
891
|
+
for (const c of snap.cases) {
|
|
892
|
+
if (c.status !== "done") {
|
|
893
|
+
continue;
|
|
894
|
+
}
|
|
895
|
+
const caseKey = `${c.id}:${c.ok === true ? "pass" : "fail"}:${(_a = c.durationMs) !== null && _a !== void 0 ? _a : 0}`;
|
|
896
|
+
if (seenCaseKeys.has(caseKey)) {
|
|
897
|
+
continue;
|
|
898
|
+
}
|
|
899
|
+
seenCaseKeys.add(caseKey);
|
|
900
|
+
process.stderr.write(` eval ${c.id}: ${c.ok === true ? "PASS" : "FAIL"}${c.error !== undefined ? ` — ${c.error}` : ""}\n`);
|
|
901
|
+
for (const line of (_b = c.logs) !== null && _b !== void 0 ? _b : []) {
|
|
902
|
+
process.stderr.write(` ${line}\n`);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
},
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
function printEvalResults(results, options, batch) {
|
|
617
909
|
const passed = results.filter((r) => r.ok).length;
|
|
618
910
|
const failed = results.length - passed;
|
|
911
|
+
const batchFailed = (batch === null || batch === void 0 ? void 0 : batch.status) === "failed";
|
|
912
|
+
const ok = failed === 0 && !batchFailed;
|
|
913
|
+
if ((batch === null || batch === void 0 ? void 0 : batch.error) !== undefined && batch.error !== "" && !options.json) {
|
|
914
|
+
// Always surface harness-level failures (not only --verbose).
|
|
915
|
+
process.stderr.write(`eval run error: ${batch.error}\n`);
|
|
916
|
+
}
|
|
619
917
|
if (options.json) {
|
|
620
|
-
console.log(JSON.stringify({ ok
|
|
918
|
+
console.log(JSON.stringify(Object.assign(Object.assign(Object.assign({ ok,
|
|
919
|
+
passed,
|
|
920
|
+
failed,
|
|
921
|
+
results }, ((batch === null || batch === void 0 ? void 0 : batch.runId) === undefined ? {} : { runId: batch.runId })), ((batch === null || batch === void 0 ? void 0 : batch.status) === undefined ? {} : { status: batch.status })), ((batch === null || batch === void 0 ? void 0 : batch.error) === undefined || batch.error === ""
|
|
922
|
+
? {}
|
|
923
|
+
: { error: batch.error })), null, 2));
|
|
621
924
|
}
|
|
622
925
|
else {
|
|
623
926
|
for (const r of results) {
|
|
@@ -638,7 +941,7 @@ function printEvalResults(results, options) {
|
|
|
638
941
|
}
|
|
639
942
|
process.stdout.write(`\n${passed} passed, ${failed} failed, ${results.length} total\n`);
|
|
640
943
|
}
|
|
641
|
-
return
|
|
944
|
+
return ok ? 0 : 1;
|
|
642
945
|
}
|
|
643
946
|
/**
|
|
644
947
|
* `logs` — follow deploy progress (`--prod`) then runtime agent logs.
|
|
@@ -25,6 +25,8 @@ export interface StartEvalRunInput {
|
|
|
25
25
|
tags?: string[];
|
|
26
26
|
bearerToken?: string;
|
|
27
27
|
verbose?: boolean;
|
|
28
|
+
/** Per-case timeout override (same semantics as CLI `--timeout-ms`). */
|
|
29
|
+
timeoutMs?: number;
|
|
28
30
|
}
|
|
29
31
|
export type EvalListConfig = {
|
|
30
32
|
maxConcurrency?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval-run-store.d.ts","sourceRoot":"","sources":["../../src/internal/eval-run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,aAAa,CAAC;AASrB,YAAY,EACV,eAAe,EACf,iBAAiB,IAAI,cAAc,EACnC,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"eval-run-store.d.ts","sourceRoot":"","sources":["../../src/internal/eval-run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,aAAa,CAAC;AASrB,YAAY,EACV,eAAe,EACf,iBAAiB,IAAI,cAAc,EACnC,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAOF,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAX3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,wEAAwE;IACxE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,YACmB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAC/C,oEAAoE;IACnD,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,EACnD;IAEE,IAAI,IAAI,OAAO,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC;YACX,EAAE,EAAE,MAAM,CAAC;YACX,MAAM,EAAE,MAAM,CAAC;YACf,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;SACjB,CAAC,CAAC;QACH,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC,CAcD;IAEK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAG7D;IAED,+EAA+E;IACzE,QAAQ,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAG3C;IAED;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC;QAClC,IAAI,EAAE,eAAe,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAOD;IAED,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,CAAC,KAAK,GAAE,iBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6DnE;IAED,OAAO,CAAC,UAAU;IAMlB;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7B;YAEa,kBAAkB;IAkDhC,OAAO,CAAC,YAAY;IAepB,6EAA6E;IAC7E,OAAO,CAAC,OAAO;IAIf;;;;;;OAMG;IACH,KAAK,IAAI,IAAI,CAYZ;YAEa,OAAO;IAsGrB,OAAO,CAAC,eAAe;CAqCxB;AAyED,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM;IAAxC,YAAqB,WAAW,EAAE,MAAM,EAGvC;CACF;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,cAGC;CACF"}
|
|
@@ -112,9 +112,9 @@ export class EvalRunStore {
|
|
|
112
112
|
this.pruneOldRuns(config);
|
|
113
113
|
this.persist(snapshot);
|
|
114
114
|
this.logger(`[agentkit] eval run ${runId}: starting ${cases.length} case(s)`);
|
|
115
|
-
void this.execute(runId, Object.assign(Object.assign({ baseUrl: loopbackUrl, evals: selected, config }, (input.bearerToken === undefined
|
|
115
|
+
void this.execute(runId, Object.assign(Object.assign(Object.assign({ baseUrl: loopbackUrl, evals: selected, config }, (input.bearerToken === undefined
|
|
116
116
|
? {}
|
|
117
|
-
: { bearerToken: input.bearerToken })), (input.verbose === undefined ? {} : { verbose: input.verbose })));
|
|
117
|
+
: { bearerToken: input.bearerToken })), (input.verbose === undefined ? {} : { verbose: input.verbose })), (input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs })));
|
|
118
118
|
return snapshot;
|
|
119
119
|
});
|
|
120
120
|
}
|
|
@@ -228,9 +228,9 @@ export class EvalRunStore {
|
|
|
228
228
|
return;
|
|
229
229
|
}
|
|
230
230
|
try {
|
|
231
|
-
yield runDiscoveredEvals(Object.assign(Object.assign(Object.assign({ projectRoot: this.projectRoot, baseUrl: opts.baseUrl, discovered: { evals: opts.evals, config: opts.config } }, (opts.bearerToken === undefined
|
|
231
|
+
yield runDiscoveredEvals(Object.assign(Object.assign(Object.assign(Object.assign({ projectRoot: this.projectRoot, baseUrl: opts.baseUrl, discovered: { evals: opts.evals, config: opts.config } }, (opts.bearerToken === undefined
|
|
232
232
|
? {}
|
|
233
|
-
: { bearerToken: opts.bearerToken })), (opts.verbose === undefined ? {} : { verbose: opts.verbose })), { onCaseStart: (id) => {
|
|
233
|
+
: { bearerToken: opts.bearerToken })), (opts.verbose === undefined ? {} : { verbose: opts.verbose })), (opts.timeoutMs === undefined ? {} : { timeoutMs: opts.timeoutMs })), { onCaseStart: (id) => {
|
|
234
234
|
const run = this.runs.get(runId);
|
|
235
235
|
if (run === undefined) {
|
|
236
236
|
return;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for playground eval batches (`/v1/dev/evals/runs`).
|
|
3
|
+
*
|
|
4
|
+
* Used by `agentkit eval --prod` (or `--url`) so the batch runs on the serve
|
|
5
|
+
* process and is mirrored to `defineStorage` when an `evals` table is
|
|
6
|
+
* configured. Without those flags, eval keeps the in-process ephemeral path
|
|
7
|
+
* in `cli-ax.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import type { EvalRunSnapshot } from "../evals.js";
|
|
10
|
+
import type { EvalRunResult } from "./eval-runner.js";
|
|
11
|
+
import { type RequestAuth } from "./request-headers.js";
|
|
12
|
+
export type RemoteEvalErrorCode = "no_matching_evals" | "eval_run_in_progress" | "unknown_eval_run" | "start_failed" | "poll_failed" | "aborted";
|
|
13
|
+
export declare class RemoteEvalError extends Error {
|
|
14
|
+
readonly status?: number | undefined;
|
|
15
|
+
readonly code?: RemoteEvalErrorCode | undefined;
|
|
16
|
+
readonly activeRunId?: string | undefined;
|
|
17
|
+
constructor(message: string, status?: number | undefined, code?: RemoteEvalErrorCode | undefined, activeRunId?: string | undefined);
|
|
18
|
+
}
|
|
19
|
+
export interface RemoteEvalListItem {
|
|
20
|
+
id: string;
|
|
21
|
+
fileId: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
tags?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface RunRemoteEvalsOptions extends RequestAuth {
|
|
26
|
+
baseUrl: string;
|
|
27
|
+
filterIds?: string[];
|
|
28
|
+
tags?: string[];
|
|
29
|
+
/** Per-case timeout override forwarded to the serve process. */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
/** Ask the serve harness to emit verbose case logs (server-side). */
|
|
32
|
+
verbose?: boolean;
|
|
33
|
+
fetchImpl?: typeof fetch;
|
|
34
|
+
/** Poll interval while the batch is `running`. */
|
|
35
|
+
pollMs?: number;
|
|
36
|
+
/** Abort the wait (not the remote batch). */
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
/** Called each time the polled snapshot changes. */
|
|
39
|
+
onSnapshot?: (snap: EvalRunSnapshot) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start a batch on the target serve via `POST /v1/dev/evals/runs`, poll until
|
|
43
|
+
* terminal, and return CLI-shaped case results.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runRemoteEvals(options: RunRemoteEvalsOptions): Promise<{
|
|
46
|
+
snapshot: EvalRunSnapshot;
|
|
47
|
+
results: EvalRunResult[];
|
|
48
|
+
}>;
|
|
49
|
+
/** List datapoints from `GET /v1/dev/evals` (same surface a remote run uses). */
|
|
50
|
+
export declare function listRemoteEvals(args: {
|
|
51
|
+
baseUrl: string;
|
|
52
|
+
auth?: RequestAuth;
|
|
53
|
+
fetchImpl?: typeof fetch;
|
|
54
|
+
filterIds?: string[];
|
|
55
|
+
tags?: string[];
|
|
56
|
+
signal?: AbortSignal;
|
|
57
|
+
}): Promise<RemoteEvalListItem[]>;
|
|
58
|
+
export declare function startRemoteEvalRun(args: {
|
|
59
|
+
baseUrl: string;
|
|
60
|
+
auth?: RequestAuth;
|
|
61
|
+
fetchImpl?: typeof fetch;
|
|
62
|
+
filterIds?: string[];
|
|
63
|
+
tags?: string[];
|
|
64
|
+
timeoutMs?: number;
|
|
65
|
+
verbose?: boolean;
|
|
66
|
+
signal?: AbortSignal;
|
|
67
|
+
}): Promise<EvalRunSnapshot>;
|
|
68
|
+
/** One-shot `GET /v1/dev/evals/runs/:runId` (no polling). */
|
|
69
|
+
export declare function getRemoteEvalRun(args: {
|
|
70
|
+
baseUrl: string;
|
|
71
|
+
runId: string;
|
|
72
|
+
auth?: RequestAuth;
|
|
73
|
+
fetchImpl?: typeof fetch;
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
}): Promise<EvalRunSnapshot>;
|
|
76
|
+
/** Recent batches from `GET /v1/dev/evals/runs`. */
|
|
77
|
+
export declare function listRemoteEvalRuns(args: {
|
|
78
|
+
baseUrl: string;
|
|
79
|
+
auth?: RequestAuth;
|
|
80
|
+
fetchImpl?: typeof fetch;
|
|
81
|
+
signal?: AbortSignal;
|
|
82
|
+
}): Promise<{
|
|
83
|
+
runs: EvalRunSnapshot[];
|
|
84
|
+
activeRunId?: string;
|
|
85
|
+
}>;
|
|
86
|
+
export declare function pollRemoteEvalRun(args: {
|
|
87
|
+
baseUrl: string;
|
|
88
|
+
runId: string;
|
|
89
|
+
auth?: RequestAuth;
|
|
90
|
+
fetchImpl?: typeof fetch;
|
|
91
|
+
pollMs?: number;
|
|
92
|
+
signal?: AbortSignal;
|
|
93
|
+
onSnapshot?: (snap: EvalRunSnapshot) => void;
|
|
94
|
+
}): Promise<EvalRunSnapshot>;
|
|
95
|
+
export declare function snapshotToEvalRunResults(snapshot: EvalRunSnapshot): EvalRunResult[];
|
|
96
|
+
//# sourceMappingURL=evals-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals-client.d.ts","sourceRoot":"","sources":["../../src/internal/evals-client.ts"],"names":[],"mappings":"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"}
|