@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.
Files changed (83) hide show
  1. package/dist/bin/agent-serve.js +42 -17
  2. package/dist/channels/slack/post-update-delivery.d.ts +85 -0
  3. package/dist/channels/slack/post-update-delivery.d.ts.map +1 -0
  4. package/dist/docs/404.html +1 -1
  5. package/dist/docs/ab.html +2 -2
  6. package/dist/docs/assets/{app.DMboGKUD.js → app.COTN7wgo.js} +1 -1
  7. package/dist/docs/assets/chunks/@localSearchIndexroot.B7UcKvIn.js +1 -0
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.DkEqEnJU.js → VPLocalSearchBox.BW3TBdT0.js} +1 -1
  9. package/dist/docs/assets/chunks/{theme.ASugdMNm.js → theme.BEJW0vE7.js} +2 -2
  10. package/dist/docs/building-with-agents.html +2 -2
  11. package/dist/docs/concepts.html +2 -2
  12. package/dist/docs/deployment.html +2 -2
  13. package/dist/docs/evals.html +2 -2
  14. package/dist/docs/example-agents/approval-buddy.html +2 -2
  15. package/dist/docs/example-agents/benny.html +2 -2
  16. package/dist/docs/example-agents/bugbot.html +2 -2
  17. package/dist/docs/example-agents/codebase-wiki.html +2 -2
  18. package/dist/docs/example-agents/codeowners-review.html +2 -2
  19. package/dist/docs/example-agents/concierge.html +2 -2
  20. package/dist/docs/example-agents/fsd.html +2 -2
  21. package/dist/docs/example-agents/index.html +2 -2
  22. package/dist/docs/example-agents/knowledge-base.html +2 -2
  23. package/dist/docs/example-agents/security-reviewer.html +2 -2
  24. package/dist/docs/example-agents/slack-agent.html +2 -2
  25. package/dist/docs/example-agents/weather-agent.html +2 -2
  26. package/dist/docs/guides/agent-to-agent.html +2 -2
  27. package/dist/docs/guides/cloud-runtime.html +2 -2
  28. package/dist/docs/guides/github.html +2 -2
  29. package/dist/docs/guides/human-in-the-loop.html +2 -2
  30. package/dist/docs/guides/slack.html +2 -2
  31. package/dist/docs/guides/webhooks.html +2 -2
  32. package/dist/docs/hillclimbing.html +2 -2
  33. package/dist/docs/index.html +2 -2
  34. package/dist/docs/quickstart.html +2 -2
  35. package/dist/docs/reference/agent-config.html +2 -2
  36. package/dist/docs/reference/channels.html +2 -2
  37. package/dist/docs/reference/cli.html +2 -2
  38. package/dist/docs/reference/connections.html +2 -2
  39. package/dist/docs/reference/hooks.html +2 -2
  40. package/dist/docs/reference/http-api.html +2 -2
  41. package/dist/docs/reference/instructions.html +2 -2
  42. package/dist/docs/reference/playground.html +2 -2
  43. package/dist/docs/reference/project-layout.html +2 -2
  44. package/dist/docs/reference/schedules.html +2 -2
  45. package/dist/docs/reference/sessions.html +2 -2
  46. package/dist/docs/reference/skills.html +2 -2
  47. package/dist/docs/reference/subagents.html +2 -2
  48. package/dist/docs/reference/tools.html +2 -2
  49. package/dist/docs/scaffolding-agents.html +2 -2
  50. package/dist/docs/storage.html +2 -2
  51. package/dist/docs/troubleshooting.html +2 -2
  52. package/dist/evals.d.ts +2 -2
  53. package/dist/internal/cli-ax.d.ts +23 -10
  54. package/dist/internal/cli-ax.d.ts.map +1 -1
  55. package/dist/internal/cli-ax.js +358 -55
  56. package/dist/internal/eval-run-store.d.ts +2 -0
  57. package/dist/internal/eval-run-store.d.ts.map +1 -1
  58. package/dist/internal/eval-run-store.js +4 -4
  59. package/dist/internal/evals-client.d.ts +96 -0
  60. package/dist/internal/evals-client.d.ts.map +1 -0
  61. package/dist/internal/evals-client.js +262 -0
  62. package/dist/internal/init-project.js +3 -3
  63. package/dist/internal/json-dir-store.d.ts +32 -0
  64. package/dist/internal/json-dir-store.d.ts.map +1 -0
  65. package/dist/internal/persistence-coordinator.d.ts +127 -0
  66. package/dist/internal/persistence-coordinator.d.ts.map +1 -0
  67. package/dist/internal/server.js +11 -2
  68. package/dist/persistence.d.ts +184 -0
  69. package/dist/persistence.d.ts.map +1 -0
  70. package/dist/playground/assets/index-72vCOBWO.js +86 -0
  71. package/dist/playground/assets/index-BjnMwYoR.css +1 -0
  72. package/dist/playground/index.html +2 -2
  73. package/package.json +1 -1
  74. package/src/bin/agent-serve.ts +47 -16
  75. package/src/evals.ts +2 -2
  76. package/src/internal/cli-ax.ts +466 -75
  77. package/src/internal/eval-run-store.ts +5 -0
  78. package/src/internal/evals-client.ts +431 -0
  79. package/src/internal/init-project.ts +3 -3
  80. package/src/internal/server.ts +12 -0
  81. package/dist/docs/assets/chunks/@localSearchIndexroot.O6eP7QZr.js +0 -1
  82. package/dist/playground/assets/index-7GJIUFQj.css +0 -1
  83. package/dist/playground/assets/index-mux9aj5P.js +0 -319
@@ -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. Deployment is the default; `--local`
480
- * opts into an ephemeral local server, `--url` into a running one.
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
- return "deployment";
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 run locally: ${CLI_COMMAND_NAME} eval --local --dir ${options.dir}\n`);
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
- `Evals run on the hosted deployment by default; pass --local to run on an ephemeral local server.\n`);
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
- const { evals } = yield discoverEvals(projectRoot);
548
- const listed = filterDiscoveredEvals(evals, {
549
- filterIds: options.evalIds,
550
- tags: options.tags,
551
- });
552
- if (options.json) {
553
- console.log(JSON.stringify(listed.map((e) => { var _a; return ({
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
- path: e.path,
557
- description: e.definition.description,
558
- tags: (_a = e.definition.tags) !== null && _a !== void 0 ? _a : [],
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
- else if (listed.length === 0) {
562
- process.stdout.write(`No evals under ${projectRoot}/evals\n`);
594
+ catch (error) {
595
+ process.stderr.write(`${sanitizeCustomerError(error instanceof Error ? error.message : String(error))}\n`);
596
+ return 1;
563
597
  }
564
- else {
565
- for (const e of listed) {
566
- const tags = e.definition.tags && e.definition.tags.length > 0
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
- const results = yield runDiscoveredEvals({
588
- projectRoot,
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
- filterIds: options.evalIds === undefined || options.evalIds.length === 0
591
- ? undefined
592
- : options.evalIds,
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 (results.length === 0) {
603
- process.stderr.write("No matching evals found.\n");
604
- return 2;
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
- return printEvalResults(results, options);
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 printEvalResults(results, options) {
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: failed === 0, passed, failed, results }, null, 2));
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 failed === 0 ? 0 : 1;
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":"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"}
1
+ {"version":3,"file":"eval-run-store.d.ts","sourceRoot":"","sources":["../../src/internal/eval-run-store.ts"],"names":[],"mappings":"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"}
@@ -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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"}