@phamvuhoang/otto-core 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/bench.d.ts +104 -0
  2. package/dist/bench.d.ts.map +1 -0
  3. package/dist/bench.js +175 -0
  4. package/dist/bench.js.map +1 -0
  5. package/dist/cli-help.d.ts +4 -0
  6. package/dist/cli-help.d.ts.map +1 -1
  7. package/dist/cli-help.js +8 -1
  8. package/dist/cli-help.js.map +1 -1
  9. package/dist/eval-run.d.ts +61 -0
  10. package/dist/eval-run.d.ts.map +1 -0
  11. package/dist/eval-run.js +162 -0
  12. package/dist/eval-run.js.map +1 -0
  13. package/dist/eval.d.ts +49 -0
  14. package/dist/eval.d.ts.map +1 -0
  15. package/dist/eval.js +111 -0
  16. package/dist/eval.js.map +1 -0
  17. package/dist/gh-sub-issues.d.ts +21 -0
  18. package/dist/gh-sub-issues.d.ts.map +1 -0
  19. package/dist/gh-sub-issues.js +129 -0
  20. package/dist/gh-sub-issues.js.map +1 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/inspect.d.ts +24 -0
  26. package/dist/inspect.d.ts.map +1 -0
  27. package/dist/inspect.js +97 -0
  28. package/dist/inspect.js.map +1 -0
  29. package/dist/loop.d.ts +3 -0
  30. package/dist/loop.d.ts.map +1 -1
  31. package/dist/loop.js +124 -2
  32. package/dist/loop.js.map +1 -1
  33. package/dist/panel.d.ts +7 -0
  34. package/dist/panel.d.ts.map +1 -1
  35. package/dist/panel.js +8 -1
  36. package/dist/panel.js.map +1 -1
  37. package/dist/render.d.ts +1 -0
  38. package/dist/render.d.ts.map +1 -1
  39. package/dist/render.js +1 -1
  40. package/dist/render.js.map +1 -1
  41. package/dist/run-bin.d.ts.map +1 -1
  42. package/dist/run-bin.js +60 -12
  43. package/dist/run-bin.js.map +1 -1
  44. package/dist/run-report.d.ts +105 -0
  45. package/dist/run-report.d.ts.map +1 -0
  46. package/dist/run-report.js +118 -0
  47. package/dist/run-report.js.map +1 -0
  48. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ import { spawn } from "node:child_process";
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { evaluateExpectation, readBenchmarkSuite, runFixtureChecks, } from "./bench.js";
5
+ import { compareTrajectories, scoreTrajectory } from "./eval.js";
6
+ import { listRunIds, readManifest as readManifestFs, readStageRecords as readStageRecordsFs, } from "./run-report.js";
7
+ const defaultInvoke = async (inv) => {
8
+ const argv = inv.bin === "otto-afk"
9
+ ? [inv.task.inputs, String(inv.iterations), ...inv.args]
10
+ : [String(inv.iterations), ...inv.args];
11
+ await new Promise((res, rej) => {
12
+ const child = spawn(inv.bin, argv, {
13
+ cwd: inv.fixtureDir,
14
+ env: { ...process.env, ...inv.env },
15
+ stdio: "inherit",
16
+ });
17
+ child.on("error", rej);
18
+ child.on("close", () => res());
19
+ });
20
+ const ids = listRunIds(inv.fixtureDir);
21
+ return { runId: ids[ids.length - 1] ?? "" };
22
+ };
23
+ const defaultDeps = {
24
+ env: process.env,
25
+ cwd: process.cwd(),
26
+ out: (m) => process.stdout.write(`${m}\n`),
27
+ err: (m) => process.stderr.write(`${m}\n`),
28
+ invoke: defaultInvoke,
29
+ readManifest: readManifestFs,
30
+ readStageRecords: readStageRecordsFs,
31
+ runChecks: runFixtureChecks,
32
+ };
33
+ const USAGE = "Usage: otto-eval <suite.json> [<configs.json>] [--iterations <n>]";
34
+ /**
35
+ * Validate a raw eval-config matrix (array of `{label, args?, env?}`). Throws on
36
+ * a non-array or a config missing its label. Pure.
37
+ */
38
+ export function parseEvalConfigs(raw) {
39
+ if (!Array.isArray(raw)) {
40
+ throw new Error("eval configs: expected an array of {label, args?, env?}");
41
+ }
42
+ return raw.map((c, i) => {
43
+ if (c == null || typeof c !== "object" || Array.isArray(c)) {
44
+ throw new Error(`eval config [${i}]: expected an object`);
45
+ }
46
+ const rec = c;
47
+ if (typeof rec.label !== "string" || rec.label.length === 0) {
48
+ throw new Error(`eval config [${i}]: 'label' must be a non-empty string`);
49
+ }
50
+ const args = rec.args;
51
+ if (args !== undefined && (!Array.isArray(args) || args.some((a) => typeof a !== "string"))) {
52
+ throw new Error(`eval config '${rec.label}': 'args' must be an array of strings`);
53
+ }
54
+ const env = rec.env;
55
+ if (env !== undefined && (env == null || typeof env !== "object" || Array.isArray(env))) {
56
+ throw new Error(`eval config '${rec.label}': 'env' must be an object`);
57
+ }
58
+ return {
59
+ label: rec.label,
60
+ args: args ?? [],
61
+ env: env ?? {},
62
+ };
63
+ });
64
+ }
65
+ function parseArgs(argv) {
66
+ const parsed = { iterations: 3, help: false };
67
+ const positionals = [];
68
+ for (let i = 0; i < argv.length; i++) {
69
+ const a = argv[i];
70
+ if (a === "-h" || a === "--help")
71
+ parsed.help = true;
72
+ else if (a === "--iterations")
73
+ parsed.iterations = Number(argv[++i]);
74
+ else
75
+ positionals.push(a);
76
+ }
77
+ parsed.suitePath = positionals[0];
78
+ parsed.configsPath = positionals[1];
79
+ return parsed;
80
+ }
81
+ /**
82
+ * Drive the `otto-eval` command: load a benchmark suite and a config matrix,
83
+ * replay every task under every config (via the injectable invoker — this is the
84
+ * paid, model-dependent half of the eval suite, never run in CI), score each
85
+ * run's evidence bundle, run its fixture checks, and print a per-task comparison
86
+ * table plus a PASS/FAIL verdict per config. Resolves to a process exit code:
87
+ * `0` when every expectation held, `1` otherwise.
88
+ */
89
+ export async function runEval(argv, deps = defaultDeps) {
90
+ const args = parseArgs(argv);
91
+ if (args.help) {
92
+ deps.out(USAGE);
93
+ return 0;
94
+ }
95
+ if (!args.suitePath) {
96
+ deps.err(`No benchmark suite given.\n${USAGE}`);
97
+ return 1;
98
+ }
99
+ const suitePath = resolve(deps.cwd, args.suitePath);
100
+ let tasks;
101
+ try {
102
+ tasks = readBenchmarkSuite(suitePath);
103
+ }
104
+ catch (e) {
105
+ deps.err(e.message);
106
+ return 1;
107
+ }
108
+ let configs = [{ label: "default", args: [], env: {} }];
109
+ if (args.configsPath) {
110
+ try {
111
+ configs = parseEvalConfigs(JSON.parse(readFileSync(resolve(deps.cwd, args.configsPath), "utf8")));
112
+ }
113
+ catch (e) {
114
+ deps.err(`eval configs ${args.configsPath}: ${e.message}`);
115
+ return 1;
116
+ }
117
+ }
118
+ const suiteDir = dirname(suitePath);
119
+ let allPassed = true;
120
+ for (const task of tasks) {
121
+ const fixtureDir = resolve(suiteDir, task.fixture);
122
+ const labelled = [];
123
+ const verdictLines = [];
124
+ for (const config of configs) {
125
+ const inv = {
126
+ task,
127
+ config,
128
+ fixtureDir,
129
+ bin: task.bin,
130
+ iterations: args.iterations,
131
+ args: [...task.args, ...config.args],
132
+ env: { ...task.env, ...config.env },
133
+ };
134
+ const { runId } = await deps.invoke(inv);
135
+ const manifest = deps.readManifest(fixtureDir, runId);
136
+ if (!manifest) {
137
+ allPassed = false;
138
+ verdictLines.push(` - ${config.label}: FAIL (no evidence bundle for run '${runId}')`);
139
+ continue;
140
+ }
141
+ const signals = scoreTrajectory(manifest, deps.readStageRecords(fixtureDir, runId));
142
+ const checks = deps.runChecks(task.expect.checks ?? [], fixtureDir);
143
+ const verdict = evaluateExpectation(task.expect, signals, checks);
144
+ if (!verdict.passed)
145
+ allPassed = false;
146
+ labelled.push({ label: config.label, signals });
147
+ verdictLines.push(verdict.passed
148
+ ? ` - ${config.label}: PASS`
149
+ : ` - ${config.label}: FAIL (${verdict.failures.join("; ")})`);
150
+ }
151
+ deps.out(`## ${task.id} (${task.kind})`);
152
+ deps.out("");
153
+ deps.out(compareTrajectories(labelled));
154
+ deps.out("");
155
+ deps.out("Verdicts:");
156
+ for (const line of verdictLines)
157
+ deps.out(line);
158
+ deps.out("");
159
+ }
160
+ return allPassed ? 0 : 1;
161
+ }
162
+ //# sourceMappingURL=eval-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-run.js","sourceRoot":"","sources":["../src/eval-run.ts"],"names":[],"mappings":"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"}
package/dist/eval.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import type { RunManifest, StageRecord } from "./run-report.js";
2
+ /**
3
+ * The multi-signal outcome of one Otto run, derived purely from its recorded
4
+ * trajectory (the #39 evidence bundle: a {@link RunManifest} plus its
5
+ * {@link StageRecord}s). These are the signals that need no fixture re-run — the
6
+ * deterministic, CI-runnable subset of the harness evaluation suite (issue #40).
7
+ *
8
+ * Fixture-dependent signals (tests passed, diff correctness, safety events) are
9
+ * scored separately by the runner against a benchmark task's expected outcome.
10
+ */
11
+ export type EvalSignals = {
12
+ /** Run reached a success exit reason (`complete`/`done`). */
13
+ succeeded: boolean;
14
+ /** Terminal exit reason, or `null` for an un-finalized/interrupted run. */
15
+ exitReason: string | null;
16
+ /** Iterations completed, or `null` when the manifest is un-finalized. */
17
+ completedIterations: number | null;
18
+ /** Number of stage records in the trajectory. */
19
+ stageCount: number;
20
+ /** Stage records that ended in error. */
21
+ errorStageCount: number;
22
+ /** Total USD cost of the run. */
23
+ costUsd: number;
24
+ /** Sum of all token-usage fields for the run. */
25
+ totalTokens: number;
26
+ /** Wall-clock run duration in ms, or `null` when it cannot be computed. */
27
+ elapsedMs: number | null;
28
+ };
29
+ /**
30
+ * Derive {@link EvalSignals} from a recorded run trajectory. Pure: no I/O, no
31
+ * model calls — only arithmetic over the manifest and stage records, so it is
32
+ * deterministic and unit-testable. `elapsedMs` is `null` when the run is
33
+ * un-finalized (no `finishedAt`) or either timestamp is unparseable, never NaN.
34
+ */
35
+ export declare function scoreTrajectory(manifest: RunManifest, stages: StageRecord[]): EvalSignals;
36
+ /** One Otto run's signals tagged with the configuration label that produced it. */
37
+ export type LabelledSignals = {
38
+ label: string;
39
+ signals: EvalSignals;
40
+ };
41
+ /**
42
+ * Render a stable markdown comparison table across labelled runs — one row per
43
+ * run, one column per {@link EvalSignals} field. Each directional signal (success
44
+ * up; errors/cost/tokens/elapsed down) marks its best and worst cell, so a
45
+ * maintainer can read a config A/B at a glance. Pure and deterministic. A column
46
+ * is marked only when there is a spread across at least two comparable runs.
47
+ */
48
+ export declare function compareTrajectories(runs: LabelledSignals[]): string;
49
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGhE;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,WAAW,EAAE,GACpB,WAAW,CAYb;AAUD,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAkDtE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,CAoCnE"}
package/dist/eval.js ADDED
@@ -0,0 +1,111 @@
1
+ import { tokenUsageTotal } from "./tokens.js";
2
+ const SUCCESS_REASONS = new Set(["complete", "done"]);
3
+ /**
4
+ * Derive {@link EvalSignals} from a recorded run trajectory. Pure: no I/O, no
5
+ * model calls — only arithmetic over the manifest and stage records, so it is
6
+ * deterministic and unit-testable. `elapsedMs` is `null` when the run is
7
+ * un-finalized (no `finishedAt`) or either timestamp is unparseable, never NaN.
8
+ */
9
+ export function scoreTrajectory(manifest, stages) {
10
+ const exitReason = manifest.exitReason ?? null;
11
+ return {
12
+ succeeded: exitReason != null && SUCCESS_REASONS.has(exitReason),
13
+ exitReason,
14
+ completedIterations: manifest.completedIterations ?? null,
15
+ stageCount: stages.length,
16
+ errorStageCount: stages.filter((s) => s.isError).length,
17
+ costUsd: manifest.costUsd,
18
+ totalTokens: tokenUsageTotal(manifest.tokenUsage),
19
+ elapsedMs: elapsedMs(manifest.startedAt, manifest.finishedAt),
20
+ };
21
+ }
22
+ function elapsedMs(startedAt, finishedAt) {
23
+ if (finishedAt == null)
24
+ return null;
25
+ const start = Date.parse(startedAt);
26
+ const end = Date.parse(finishedAt);
27
+ if (Number.isNaN(start) || Number.isNaN(end))
28
+ return null;
29
+ return end - start;
30
+ }
31
+ const COMPARE_COLUMNS = [
32
+ {
33
+ header: "Succeeded",
34
+ cell: (s) => (s.succeeded ? "yes" : "no"),
35
+ rank: { value: (s) => (s.succeeded ? 1 : 0), better: "higher" },
36
+ },
37
+ { header: "Exit", cell: (s) => s.exitReason ?? "—" },
38
+ {
39
+ header: "Iterations",
40
+ cell: (s) => (s.completedIterations == null ? "—" : String(s.completedIterations)),
41
+ },
42
+ { header: "Stages", cell: (s) => String(s.stageCount) },
43
+ {
44
+ header: "Errors",
45
+ cell: (s) => String(s.errorStageCount),
46
+ rank: { value: (s) => s.errorStageCount, better: "lower" },
47
+ },
48
+ {
49
+ header: "Cost (USD)",
50
+ cell: (s) => `$${s.costUsd}`,
51
+ rank: { value: (s) => s.costUsd, better: "lower" },
52
+ },
53
+ {
54
+ header: "Tokens",
55
+ cell: (s) => String(s.totalTokens),
56
+ rank: { value: (s) => s.totalTokens, better: "lower" },
57
+ },
58
+ {
59
+ header: "Elapsed (ms)",
60
+ cell: (s) => (s.elapsedMs == null ? "—" : String(s.elapsedMs)),
61
+ rank: { value: (s) => s.elapsedMs, better: "lower" },
62
+ },
63
+ ];
64
+ /**
65
+ * Render a stable markdown comparison table across labelled runs — one row per
66
+ * run, one column per {@link EvalSignals} field. Each directional signal (success
67
+ * up; errors/cost/tokens/elapsed down) marks its best and worst cell, so a
68
+ * maintainer can read a config A/B at a glance. Pure and deterministic. A column
69
+ * is marked only when there is a spread across at least two comparable runs.
70
+ */
71
+ export function compareTrajectories(runs) {
72
+ if (runs.length === 0)
73
+ return "No runs to compare.";
74
+ const extremes = COMPARE_COLUMNS.map((col) => {
75
+ if (!col.rank || runs.length < 2)
76
+ return null;
77
+ const values = runs
78
+ .map((r) => col.rank.value(r.signals))
79
+ .filter((v) => v != null);
80
+ if (values.length < 2)
81
+ return null;
82
+ const min = Math.min(...values);
83
+ const max = Math.max(...values);
84
+ if (min === max)
85
+ return null;
86
+ const higher = col.rank.better === "higher";
87
+ return { best: higher ? max : min, worst: higher ? min : max };
88
+ });
89
+ const header = ["Run", ...COMPARE_COLUMNS.map((c) => c.header)];
90
+ const rows = runs.map((r) => {
91
+ const cells = COMPARE_COLUMNS.map((col, i) => {
92
+ let cell = col.cell(r.signals);
93
+ const ext = extremes[i];
94
+ const value = col.rank?.value(r.signals);
95
+ if (ext && value != null) {
96
+ if (value === ext.best)
97
+ cell += " (best)";
98
+ else if (value === ext.worst)
99
+ cell += " (worst)";
100
+ }
101
+ return cell;
102
+ });
103
+ return [r.label, ...cells];
104
+ });
105
+ return [
106
+ `| ${header.join(" | ")} |`,
107
+ `| ${header.map(() => "---").join(" | ")} |`,
108
+ ...rows.map((cells) => `| ${cells.join(" | ")} |`),
109
+ ].join("\n");
110
+ }
111
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** A GitHub issue reference with just the fields the resolver needs. */
2
+ export type IssueRef = {
3
+ number: number;
4
+ state: "open" | "closed";
5
+ };
6
+ /** Injectable `gh` runner: takes argv (no shell), returns stdout. Tests pass a
7
+ * fake; production uses {@link defaultGh}. */
8
+ export type GhRunner = (args: string[]) => string;
9
+ /**
10
+ * Resolve the ordered list of issue numbers to process for `target`.
11
+ * Recursive depth-first (leaves-first), native sub_issues then markdown
12
+ * task-list fallback, only OPEN issues, parent skipped, cycle-guarded.
13
+ * A leaf target (no children) returns `[target]` so single-issue behavior is
14
+ * preserved; a target whose children are all closed returns `[]`.
15
+ */
16
+ export declare function resolveSubIssueList(target: number, opts: {
17
+ repo?: string;
18
+ cwd: string;
19
+ gh?: GhRunner;
20
+ }): number[];
21
+ //# sourceMappingURL=gh-sub-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-sub-issues.d.ts","sourceRoot":"","sources":["../src/gh-sub-issues.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEpE;+CAC+C;AAC/C,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAgHlD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,QAAQ,CAAA;CAAE,GAClD,MAAM,EAAE,CAmBV"}
@@ -0,0 +1,129 @@
1
+ import { execFileSync } from "node:child_process";
2
+ /** Real runner: `execFileSync` (no shell) so values are literal argv entries —
3
+ * a ref like `$(rm -rf ~)` can never be shell-evaluated. Mirrors watch.ts. */
4
+ const defaultGh = (cwd) => (args) => execFileSync("gh", args, {
5
+ cwd,
6
+ encoding: "utf8",
7
+ stdio: ["ignore", "pipe", "pipe"],
8
+ });
9
+ /** Parse `gh api … --jq '.[] | {number,state}'` output: one JSON object per
10
+ * line (gh applies --jq per page, so --paginate stays newline-delimited). */
11
+ function parseRefLines(out) {
12
+ const refs = [];
13
+ for (const line of out.split("\n")) {
14
+ const t = line.trim();
15
+ if (!t)
16
+ continue;
17
+ try {
18
+ const o = JSON.parse(t);
19
+ if (typeof o.number === "number" &&
20
+ (o.state === "open" || o.state === "closed")) {
21
+ refs.push({ number: o.number, state: o.state });
22
+ }
23
+ }
24
+ catch {
25
+ // skip a malformed line rather than abort the whole resolution.
26
+ }
27
+ }
28
+ return refs;
29
+ }
30
+ // A GitHub task-list item that references an issue: "- [ ] #123" / "- [x] #123"
31
+ // (also accepts "* "). Captures the issue number. A bare "#123" mention in prose
32
+ // is intentionally NOT matched.
33
+ const TASK_LIST_RE = /^\s*[-*] \[[ xX]\] +#(\d+)\b/;
34
+ /** Direct children of `n`: native sub_issues first, markdown task-list fallback.
35
+ * Never throws — a gh failure yields an empty list (node treated as a leaf). */
36
+ function directChildren(n, repo, gh) {
37
+ const repoPath = repo ?? "{owner}/{repo}";
38
+ const repoArg = repo ? ["--repo", repo] : [];
39
+ // 1. Native GitHub sub-issues.
40
+ try {
41
+ const out = gh([
42
+ "api",
43
+ `repos/${repoPath}/issues/${n}/sub_issues`,
44
+ "--paginate",
45
+ "--jq",
46
+ ".[] | {number,state}",
47
+ ]);
48
+ const native = parseRefLines(out);
49
+ if (native.length > 0)
50
+ return native;
51
+ }
52
+ catch {
53
+ // fall through to the markdown fallback.
54
+ }
55
+ // 2. Markdown task-list fallback: parse the parent body in document order.
56
+ let body = "";
57
+ try {
58
+ const out = gh(["issue", "view", String(n), ...repoArg, "--json", "body"]);
59
+ body = JSON.parse(out).body ?? "";
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ const seen = new Set();
65
+ const nums = [];
66
+ for (const line of body.split("\n")) {
67
+ const m = line.match(TASK_LIST_RE);
68
+ if (!m)
69
+ continue;
70
+ const num = Number.parseInt(m[1], 10);
71
+ if (Number.isInteger(num) && num > 0 && !seen.has(num)) {
72
+ seen.add(num);
73
+ nums.push(num);
74
+ }
75
+ }
76
+ // Resolve each referenced issue's state (markdown carries no state).
77
+ const refs = [];
78
+ for (const num of nums) {
79
+ try {
80
+ const out = gh([
81
+ "issue",
82
+ "view",
83
+ String(num),
84
+ ...repoArg,
85
+ "--json",
86
+ "number,state",
87
+ ]);
88
+ const o = JSON.parse(out);
89
+ const state = String(o.state ?? "").toLowerCase();
90
+ if (typeof o.number === "number" &&
91
+ (state === "open" || state === "closed")) {
92
+ refs.push({ number: o.number, state });
93
+ }
94
+ }
95
+ catch {
96
+ // unresolvable ref → skip it.
97
+ }
98
+ }
99
+ return refs;
100
+ }
101
+ /**
102
+ * Resolve the ordered list of issue numbers to process for `target`.
103
+ * Recursive depth-first (leaves-first), native sub_issues then markdown
104
+ * task-list fallback, only OPEN issues, parent skipped, cycle-guarded.
105
+ * A leaf target (no children) returns `[target]` so single-issue behavior is
106
+ * preserved; a target whose children are all closed returns `[]`.
107
+ */
108
+ export function resolveSubIssueList(target, opts) {
109
+ const gh = opts.gh ?? defaultGh(opts.cwd);
110
+ const visited = new Set([target]);
111
+ const out = [];
112
+ const visitChildren = (children) => {
113
+ for (const child of children) {
114
+ if (child.state !== "open")
115
+ continue; // closed subtree = done, skip.
116
+ if (visited.has(child.number))
117
+ continue; // cycle / already queued.
118
+ visited.add(child.number);
119
+ visitChildren(directChildren(child.number, opts.repo, gh)); // depth-first.
120
+ out.push(child.number); // child after its descendants (leaves-first).
121
+ }
122
+ };
123
+ const targetChildren = directChildren(target, opts.repo, gh);
124
+ if (targetChildren.length === 0)
125
+ return [target]; // leaf → single-issue.
126
+ visitChildren(targetChildren);
127
+ return out; // may be [] if every child (and subtree) was closed.
128
+ }
129
+ //# sourceMappingURL=gh-sub-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-sub-issues.js","sourceRoot":"","sources":["../src/gh-sub-issues.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,11 @@ export { renderTemplate, type RenderOptions, type RenderVars, } from "./render.j
8
8
  export { claudeRuntime, getAgentRuntime, runStage, type AgentRuntime, type StageResult, } from "./runner.js";
9
9
  export { AGENT_DISPLAY_NAMES, DEFAULT_AGENT, parseAgentId, readAgentConfig, resolveAgentRuntime, type AgentRuntimeId, type AgentSelectionSource, type ResolvedAgentRuntime, } from "./agent-runtime.js";
10
10
  export { emptyTokenUsage, parseTokenMode, parseTokenUsage, type TokenMode, type TokenUsage, } from "./tokens.js";
11
+ export { allocateRunId, listRunIds, readManifest, readStageRecords, runReportDir, runsDir, writeManifest, writeStageRecord, type RunArtifact, type RunManifest, type StageRecord, } from "./run-report.js";
12
+ export { formatRunReport, runInspect, type InspectDeps, } from "./inspect.js";
13
+ export { parseEvalConfigs, runEval, type EvalConfig, type EvalDeps, type EvalInvocation, type EvalInvoker, } from "./eval-run.js";
14
+ export { compareTrajectories, scoreTrajectory, type EvalSignals, type LabelledSignals, } from "./eval.js";
15
+ export { evaluateExpectation, parseBenchmarkSuite, parseBenchmarkTask, readBenchmarkSuite, runFixtureChecks, type BenchmarkBin, type BenchmarkCheck, type BenchmarkExpect, type BenchmarkTask, type CheckResult, type CheckRunner, type ExpectationVerdict, } from "./bench.js";
11
16
  export { runWatch, pollOpenIssues, pollLinearIssues, type RunWatchOptions, type PollResult, type WatchProvider, type LinearPollDeps, } from "./watch.js";
12
17
  export { runPreflight, whichBin, type PreflightResult, type PreflightProbes, } from "./preflight.js";
13
18
  export { parseLinearRef, parseLinearIssueArg, resolveLinearAuth, resolveDoneState, linearConfigPath, createLinearClient, LinearApiError, type LinearRef, type LinearAuth, type LinearAuthDeps, type LinearClient, type LinearClientDeps, type LinearViewer, type LinearIssueSummary, type LinearIssueDetail, type LinearComment, type LinearWorkflowState, type DoneStateResolution, type LinearErrorKind, } from "./linear-api.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,QAAQ,EACR,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,6 +8,11 @@ export { renderTemplate, } from "./render.js";
8
8
  export { claudeRuntime, getAgentRuntime, runStage, } from "./runner.js";
9
9
  export { AGENT_DISPLAY_NAMES, DEFAULT_AGENT, parseAgentId, readAgentConfig, resolveAgentRuntime, } from "./agent-runtime.js";
10
10
  export { emptyTokenUsage, parseTokenMode, parseTokenUsage, } from "./tokens.js";
11
+ export { allocateRunId, listRunIds, readManifest, readStageRecords, runReportDir, runsDir, writeManifest, writeStageRecord, } from "./run-report.js";
12
+ export { formatRunReport, runInspect, } from "./inspect.js";
13
+ export { parseEvalConfigs, runEval, } from "./eval-run.js";
14
+ export { compareTrajectories, scoreTrajectory, } from "./eval.js";
15
+ export { evaluateExpectation, parseBenchmarkSuite, parseBenchmarkTask, readBenchmarkSuite, runFixtureChecks, } from "./bench.js";
11
16
  export { runWatch, pollOpenIssues, pollLinearIssues, } from "./watch.js";
12
17
  export { runPreflight, whichBin, } from "./preflight.js";
13
18
  export { parseLinearRef, parseLinearIssueArg, resolveLinearAuth, resolveDoneState, linearConfigPath, createLinearClient, LinearApiError, } from "./linear-api.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAsC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,GAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,QAAQ,GAGT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,GAIpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GAaf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAsC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,GAGhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,QAAQ,GAGT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,mBAAmB,GAIpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,UAAU,GAEX,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,OAAO,GAKR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,eAAe,GAGhB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GAQjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GAaf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type RunManifest, type StageRecord } from "./run-report.js";
2
+ /**
3
+ * Injectable host surface for {@link runInspect} so the reader stays
4
+ * unit-testable without touching the real cwd/env or process stdio.
5
+ */
6
+ export type InspectDeps = {
7
+ env: NodeJS.ProcessEnv;
8
+ cwd: string;
9
+ out: (msg: string) => void;
10
+ err: (msg: string) => void;
11
+ };
12
+ /**
13
+ * Render one run's evidence bundle (manifest + stage records) into a compact,
14
+ * human-readable report answering "what happened and why did Otto stop?". Pure:
15
+ * takes the already-read manifest and stage records, returns the report string.
16
+ */
17
+ export declare function formatRunReport(manifest: RunManifest, stages: StageRecord[]): string;
18
+ /**
19
+ * Drive the `otto-inspect` command: resolve a run id (an explicit id, or
20
+ * `latest`/no arg → the most recent run under `.otto/runs/`), read its bundle,
21
+ * and print the human report. Resolves to the process exit code.
22
+ */
23
+ export declare function runInspect(argv: string[], deps?: InspectDeps): Promise<number>;
24
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,CAAC;AAWF;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,WAAW,EAAE,GACpB,MAAM,CAyDR;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,WAAyB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAmCjB"}