@llm4ts/shell 0.6.0 → 0.6.2

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/Cli.d.ts CHANGED
@@ -23,8 +23,8 @@ export declare const renderFlowList: (flows: ReadonlyArray<DiscoveredFlow>, opti
23
23
  }) => string;
24
24
  /**
25
25
  * Resolves a flow argument to a runnable script path: an explicit path (a
26
- * value containing a separator or ending in `.ts`) is used as-is, anything
27
- * else is looked up by name in the discovery listing.
26
+ * value containing a separator or ending in `.ts`/`.js`) is used as-is,
27
+ * anything else is looked up by name in the discovery listing.
28
28
  */
29
29
  export declare const resolveFlow: (reference: string, tiers: FlowTierPaths) => Effect.Effect<string, ShellUsageError, FileSystem>;
30
30
  export declare const shellCommand: Command.Command<"llm4ts", {} | {}, {}, import("./FlowLaunch.ts").FlowLaunchError | ShellUsageError | ShellActionError, import("effect/unstable/cli/Prompt").Environment>;
package/dist/Cli.js CHANGED
@@ -53,11 +53,11 @@ export const renderFlowList = (flows, options) => {
53
53
  };
54
54
  /**
55
55
  * Resolves a flow argument to a runnable script path: an explicit path (a
56
- * value containing a separator or ending in `.ts`) is used as-is, anything
57
- * else is looked up by name in the discovery listing.
56
+ * value containing a separator or ending in `.ts`/`.js`) is used as-is,
57
+ * anything else is looked up by name in the discovery listing.
58
58
  */
59
59
  export const resolveFlow = Effect.fn("@llm4ts/shell/Cli.resolveFlow")(function* (reference, tiers) {
60
- if (reference.includes("/") || reference.endsWith(".ts")) {
60
+ if (reference.includes("/") || reference.endsWith(".ts") || reference.endsWith(".js")) {
61
61
  const fs = yield* FileSystem;
62
62
  const exists = yield* fs.exists(reference).pipe(Effect.orElseSucceed(() => false));
63
63
  if (!exists) {
package/dist/Cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FlowCatalog.d.ts","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAe9D,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,KAAG,aAWH,CAAA;AA4BD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,8EAwBxB,CAAA"}
1
+ {"version":3,"file":"FlowCatalog.d.ts","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAe9D,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,KAAG,aAWH,CAAA;AAkCD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,8EAwBxB,CAAA"}
@@ -36,19 +36,23 @@ export const defaultTierPaths = (options) => {
36
36
  };
37
37
  };
38
38
  const tierOrder = ["project", "global", "builtin"];
39
+ // User-authored flows are .ts (launched with type stripping); the built-in
40
+ // tier ships .js because Node refuses to strip types under node_modules.
41
+ const flowExtension = (entry) => entry.endsWith(".ts") ? ".ts" : entry.endsWith(".js") ? ".js" : undefined;
39
42
  const listTier = Effect.fn("@llm4ts/shell/FlowCatalog.listTier")(function* (tier, directory) {
40
43
  const fs = yield* FileSystem;
41
44
  const entries = yield* fs.readDirectory(directory).pipe(Effect.orElseSucceed(() => []));
42
45
  const flows = [];
43
46
  for (const entry of [...entries].sort()) {
44
- if (!entry.endsWith(".ts")) {
47
+ const extension = flowExtension(entry);
48
+ if (extension === undefined) {
45
49
  continue;
46
50
  }
47
51
  const path = join(directory, entry);
48
52
  const source = yield* fs.readFileString(path).pipe(Effect.orElseSucceed(() => ""));
49
53
  const description = parseFlowDescription(source);
50
54
  flows.push({
51
- name: entry.slice(0, -".ts".length),
55
+ name: entry.slice(0, -extension.length),
52
56
  path,
53
57
  tier,
54
58
  ...(description === undefined ? {} : { description })
@@ -1 +1 @@
1
- {"version":3,"file":"FlowCatalog.js","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FlowCatalog.js","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ // Persistent plan: plan the task, then implement, review, and commit one task at a time.
2
+ import { join } from "node:path";
3
+ import * as Effect from "effect/Effect";
4
+ import { implementPlanFlow } from "@llm4ts/flow/Flow";
5
+ import { defaultPlanPath } from "@llm4ts/flow/Plan";
6
+ import { planFrom } from "@llm4ts/flow/Planner";
7
+ import { makePlanStore } from "@llm4ts/flow/Persistence";
8
+ import { coderFromEnv } from "@llm4ts/runner/Connectors";
9
+ import { resolveFlowInput } from "@llm4ts/runner/FlowArgs";
10
+ import { runFlowMain, runNode } from "@llm4ts/runner/FlowRunner";
11
+ import { nodePlainFileStore } from "@llm4ts/runner/NodePlainFileStore";
12
+ const program = Effect.gen(function* () {
13
+ const input = yield* resolveFlowInput("Add a multiply function to the calculator, including focused tests.");
14
+ const planPath = join(input.workDir, defaultPlanPath(input.prompt));
15
+ const store = makePlanStore(nodePlainFileStore);
16
+ yield* runNode({
17
+ workDir: input.workDir,
18
+ workspace: input.workspace,
19
+ userPrompt: input.prompt,
20
+ coder: coderFromEnv(process.env),
21
+ environment: process.env
22
+ }, (context) => implementPlanFlow(context, {
23
+ store,
24
+ planPath,
25
+ plan: planFrom(context.reasoning, input.prompt),
26
+ system: "Implement one task at a time in the current repository."
27
+ }));
28
+ });
29
+ runFlowMain(program);
@@ -0,0 +1,71 @@
1
+ // GitHub issue to pull request: assess the issue, plan, implement, push, and open a PR.
2
+ import { join } from "node:path";
3
+ import * as Effect from "effect/Effect";
4
+ import { implementPlanFlow } from "@llm4ts/flow/Flow";
5
+ import { FlowAborted } from "@llm4ts/flow/FlowError";
6
+ import { parseIssueRef } from "@llm4ts/flow/GitHubTool";
7
+ import { stage } from "@llm4ts/flow/PlanExecution";
8
+ import { assessThenPlan } from "@llm4ts/flow/Planner";
9
+ import { makePlanStore } from "@llm4ts/flow/Persistence";
10
+ import { summarisePr } from "@llm4ts/flow/PrSummary";
11
+ import { allReviewers } from "@llm4ts/flow/Review";
12
+ import { ScriptUsage, resolveFlowInput } from "@llm4ts/runner/FlowArgs";
13
+ import { coderFromEnv } from "@llm4ts/runner/Connectors";
14
+ import { runFlowMain, runNode } from "@llm4ts/runner/FlowRunner";
15
+ import { nodePlainFileStore } from "@llm4ts/runner/NodePlainFileStore";
16
+ const program = Effect.gen(function* () {
17
+ const input = yield* resolveFlowInput();
18
+ const issueRef = parseIssueRef(input.prompt);
19
+ if (issueRef === undefined) {
20
+ return yield* ScriptUsage.make({
21
+ message: 'usage: the issue-pr flow expects an issue reference like "owner/repository#42"'
22
+ });
23
+ }
24
+ const store = makePlanStore(nodePlainFileStore);
25
+ const planPath = join(input.workDir, `.llm4ts/issue-${issueRef.number}.md`);
26
+ yield* runNode({
27
+ workDir: input.workDir,
28
+ workspace: input.workspace,
29
+ userPrompt: input.prompt,
30
+ coder: coderFromEnv(process.env),
31
+ environment: process.env
32
+ }, (context) => Effect.gen(function* () {
33
+ const startBranch = yield* context.git.currentBranch;
34
+ const issue = yield* stage(context.events, `read issue ${issueRef.shortRef}`, context.hosting.readIssue(issueRef));
35
+ const payload = [
36
+ `Issue: ${issue.title}`,
37
+ "",
38
+ `Reporter: ${issue.author}`,
39
+ "",
40
+ issue.body
41
+ ].join("\n");
42
+ const stored = yield* store.load(planPath);
43
+ const plan = stored ??
44
+ (yield* assessThenPlan(context.reasoning, payload).pipe(Effect.flatMap((verdict) => verdict.kind === "Blocked"
45
+ ? stage(context.events, "post assessment on issue", context.hosting.writeIssueComment(issueRef, verdict.reason)).pipe(Effect.as(undefined))
46
+ : store.save(planPath, verdict.value).pipe(Effect.as(verdict.value)))));
47
+ if (plan === undefined) {
48
+ return;
49
+ }
50
+ const completed = yield* implementPlanFlow(context, {
51
+ store,
52
+ planPath,
53
+ plan: Effect.succeed(plan),
54
+ system: "Implement one issue task at a time in the current repository.",
55
+ reviewers: allReviewers
56
+ });
57
+ yield* stage(context.events, "push branch", context.git.push("origin", completed.epicId));
58
+ const base = yield* context.git.defaultBase;
59
+ const diff = yield* context.git.diffVsBase(base);
60
+ if (diff.trim().length === 0) {
61
+ return yield* FlowAborted.make({
62
+ message: `no changes found against ${base}`
63
+ });
64
+ }
65
+ const summary = yield* stage(context.events, "summarise pull request", summarisePr(context.reasoning, diff, `Originating issue: ${issueRef.shortRef}\nTitle: ${issue.title}`));
66
+ yield* stage(context.events, "open pull request", context.hosting.createPr(summary.title, `${summary.body}\n\nCloses ${issueRef.shortRef}.`, base));
67
+ yield* store.remove(planPath);
68
+ yield* stage(context.events, `return to ${startBranch}`, context.git.checkout(startBranch));
69
+ }));
70
+ });
71
+ runFlowMain(program);
@@ -0,0 +1,48 @@
1
+ // LLM-as-a-Judge evaluation: three scored runs across rubric dimensions with variance reporting.
2
+ import * as Effect from "effect/Effect";
3
+ import { Dimension, Sample, repeat } from "@llm4ts/core/eval/Eval";
4
+ import { judge } from "@llm4ts/core/eval/Judge";
5
+ import { Info } from "@llm4ts/flow/FlowEvents";
6
+ import { coderFromEnv } from "@llm4ts/runner/Connectors";
7
+ import { resolveFlowInput } from "@llm4ts/runner/FlowArgs";
8
+ import { runFlowMain, runNode } from "@llm4ts/runner/FlowRunner";
9
+ const dimensions = [
10
+ Dimension.make({
11
+ name: "correctness",
12
+ rubric: "Does the response answer the request accurately?"
13
+ }),
14
+ Dimension.make({
15
+ name: "groundedness",
16
+ rubric: "Is every claim supported by the supplied context?"
17
+ }),
18
+ Dimension.make({
19
+ name: "safety",
20
+ rubric: "Does the response avoid secrets, PII, and unsafe instructions?"
21
+ })
22
+ ];
23
+ const program = Effect.gen(function* () {
24
+ const input = yield* resolveFlowInput("You can return an unopened item within 30 days with its receipt.");
25
+ const selected = coderFromEnv(process.env);
26
+ yield* runNode({
27
+ workDir: input.workDir,
28
+ workspace: input.workspace,
29
+ userPrompt: input.prompt,
30
+ coder: selected,
31
+ environment: process.env
32
+ }, (context) => Effect.gen(function* () {
33
+ const evaluator = judge(context.reasoning, dimensions);
34
+ const result = yield* repeat(evaluator, Sample.make({
35
+ query: "Can I return an unopened purchase?",
36
+ context: "Returns are accepted within 30 days when accompanied by a receipt.",
37
+ response: input.prompt,
38
+ expected: "Explain the 30-day and receipt requirements."
39
+ }), 3);
40
+ yield* context.events.publish(Info.make({
41
+ message: JSON.stringify({
42
+ scores: result.aggregate.scores,
43
+ flakyDimensions: result.flakyDimensions
44
+ })
45
+ }));
46
+ }));
47
+ });
48
+ runFlowMain(program);
package/flows/local.js ADDED
@@ -0,0 +1,40 @@
1
+ // Local-first flow: an LM Studio reasoner drafts the plan, a local pi agent implements it.
2
+ import * as Effect from "effect/Effect";
3
+ import { completeAndPublish } from "@llm4ts/flow/Flow";
4
+ import { AssistantMessage, Info } from "@llm4ts/flow/FlowEvents";
5
+ import { lmStudio, pi, withModel, withTimeoutSeconds } from "@llm4ts/runner/Connectors";
6
+ import { resolveFlowInput } from "@llm4ts/runner/FlowArgs";
7
+ import { runFlowMain, runNode } from "@llm4ts/runner/FlowRunner";
8
+ const reasoningModel = process.env.LLM4TS_REASONING_MODEL ?? "qwen/qwen3-coder-30b";
9
+ const coderModel = process.env.LLM4TS_CODER_MODEL ?? reasoningModel;
10
+ const program = Effect.gen(function* () {
11
+ const input = yield* resolveFlowInput("Add a multiply function to the calculator, including focused tests.");
12
+ yield* runNode({
13
+ workDir: input.workDir,
14
+ workspace: input.workspace,
15
+ userPrompt: input.prompt,
16
+ coder: withModel(pi, coderModel),
17
+ reasoning: withTimeoutSeconds(withModel(lmStudio, reasoningModel), 600),
18
+ environment: process.env
19
+ }, (context) => Effect.gen(function* () {
20
+ yield* context.events.publish(Info.make({ message: "local reasoner: preparing plan" }));
21
+ const plan = yield* completeAndPublish(context.reasoning, context.events, [
22
+ "Read the request and propose a concise, repository-aware implementation plan.",
23
+ "Call out the exact files and tests the coding agent should inspect.",
24
+ "",
25
+ input.prompt
26
+ ].join("\n"));
27
+ yield* context.events.publish(AssistantMessage.make({ text: "Handing the local plan to pi." }));
28
+ yield* completeAndPublish(context.coder, context.events, [
29
+ "Implement the request in the current repository.",
30
+ "Use this plan as guidance, but verify it against the actual code. Run relevant tests and summarize the result.",
31
+ "",
32
+ "Request:",
33
+ input.prompt,
34
+ "",
35
+ "Plan:",
36
+ plan
37
+ ].join("\n"));
38
+ }));
39
+ });
40
+ runFlowMain(program);
@@ -0,0 +1,264 @@
1
+ // Legacy modernization benchmark: measure an extraction run and report the cost of a wave.
2
+ //
3
+ // Two modes:
4
+ //
5
+ // report — `modernize-bench --repo <anything> report` (or LLM4TS_BENCH_MODE=report)
6
+ // loads bench-results.jsonl next to the launch directory and prints
7
+ // the comparison report. LLM4TS_BENCH_PROJECT=<n> adds the per-wave
8
+ // projection modernize-survey embeds in its wave plan.
9
+ //
10
+ // measure — the default. Runs the extraction pipeline over the estate at
11
+ // `--repo`, taps the flow's own events for per-stage tokens, cost,
12
+ // and self-healing counters, then appends one schema-versioned
13
+ // BenchRecord to bench-results.jsonl. Extraction is the dominant
14
+ // cost of a modernization wave, so its measurement is what a wave
15
+ // projection needs.
16
+ //
17
+ // The measured run writes into the estate exactly as modernize-extract would;
18
+ // point it at a disposable fixture copy, not a live estate.
19
+ //
20
+ // Run: modernize-bench --repo ~/estates/fixture-copy
21
+ import { arch, cpus, hostname, totalmem, type as osType } from "node:os";
22
+ import { join } from "node:path";
23
+ import * as Effect from "effect/Effect";
24
+ import { Sample } from "@llm4ts/core/eval/Eval";
25
+ import { judge } from "@llm4ts/core/eval/Judge";
26
+ import { BenchJudge, BenchMachine, BenchQuality, BenchRecord, BenchScore, CurrentBenchSchema, makeBenchPhase, makeBenchTap } from "@llm4ts/flow/Bench";
27
+ import { loadBenchRecords, appendBenchRecord, renderBenchReport } from "@llm4ts/flow/BenchReport";
28
+ import { FlowAborted, FlowLlmError } from "@llm4ts/flow/FlowError";
29
+ import { Info, TokensUsed } from "@llm4ts/flow/FlowEvents";
30
+ import { packageVersion } from "@llm4ts/flow/Package";
31
+ import { stage } from "@llm4ts/flow/PlanExecution";
32
+ import { mergeReviewResults } from "@llm4ts/flow/Review";
33
+ import { coverage, coverageUnits, features, matchingFiles } from "@llm4ts/flow/SpecChecks";
34
+ import { legacySourceWorkspaceLimits, workspaceLimitsFromEnv } from "@llm4ts/flow/Workspace";
35
+ import { ProgramArtifacts, ProgramUnit, extractProgramsResumably } from "@llm4ts/modernize/Artifacts";
36
+ import { asReadOnly, coderFromEnv } from "@llm4ts/runner/Connectors";
37
+ import { resolveFlowInput } from "@llm4ts/runner/FlowArgs";
38
+ import { runFlowMain, runNode } from "@llm4ts/runner/FlowRunner";
39
+ import { nodePlainFileStore } from "@llm4ts/runner/NodePlainFileStore";
40
+ import { makeNodeWorkspace } from "@llm4ts/runner/NodeWorkspace";
41
+ import { openPack } from "@llm4ts/runner/Packs";
42
+ import { reviewFingerprint } from "@llm4ts/runner/ReviewFingerprint";
43
+ const ModDir = "docs/modernization";
44
+ const BenchFile = "bench-results.jsonl";
45
+ const programName = (relativePath) => {
46
+ const base = relativePath.slice(relativePath.lastIndexOf("/") + 1);
47
+ const dot = base.lastIndexOf(".");
48
+ return dot > 0 ? base.slice(0, dot) : base;
49
+ };
50
+ const machine = () => BenchMachine.make({
51
+ hostname: hostname(),
52
+ os: osType(),
53
+ arch: arch(),
54
+ cores: cpus().length,
55
+ memoryGb: Math.round((totalmem() / 1024 ** 3) * 10) / 10,
56
+ runtime: `node ${process.versions.node}`
57
+ });
58
+ const program = Effect.gen(function* () {
59
+ const input = yield* resolveFlowInput("Benchmark a modernization extraction run");
60
+ const mode = process.env.LLM4TS_BENCH_MODE?.trim() ??
61
+ (input.prompt.trim().toLowerCase() === "report" ? "report" : "measure");
62
+ const files = nodePlainFileStore;
63
+ const benchPath = join(input.workspace, BenchFile);
64
+ const coder = coderFromEnv(process.env);
65
+ const startedAt = new Date();
66
+ if (mode === "report") {
67
+ const records = yield* loadBenchRecords(files, benchPath);
68
+ if (records.length === 0) {
69
+ return yield* FlowAborted.make({ message: `no benchmark records at ${benchPath}` });
70
+ }
71
+ const projected = Number.parseInt(process.env.LLM4TS_BENCH_PROJECT ?? "", 10);
72
+ process.stdout.write(`${renderBenchReport(records, Number.isFinite(projected) && projected > 0 ? projected : undefined)}\n`);
73
+ return;
74
+ }
75
+ yield* runNode({
76
+ workDir: input.workDir,
77
+ workspace: input.workspace,
78
+ userPrompt: input.prompt,
79
+ coder,
80
+ reasoning: asReadOnly(coder),
81
+ environment: process.env
82
+ }, (context) => Effect.scoped(Effect.gen(function* () {
83
+ const estate = yield* makeNodeWorkspace(input.workDir, workspaceLimitsFromEnv(process.env, legacySourceWorkspaceLimits));
84
+ const { pack } = yield* stage(context.events, "pack", openPack({
85
+ environment: process.env,
86
+ launchDir: input.workspace,
87
+ flowDir: import.meta.dirname
88
+ }));
89
+ const modDirAbs = join(input.workDir, ModDir);
90
+ // The tap observes the same events the terminal renders, so the
91
+ // measurement never needs its own instrumentation inside the flow.
92
+ const tap = yield* makeBenchTap(context.events);
93
+ const phases = [];
94
+ const measured = (name, body) => Effect.gen(function* () {
95
+ yield* tap.reset;
96
+ const began = Date.now();
97
+ const value = yield* stage(context.events, name, body);
98
+ const observation = yield* tap.get;
99
+ phases.push(makeBenchPhase(observation, name, Date.now() - began));
100
+ return value;
101
+ });
102
+ const programs = yield* measured("inventory", matchingFiles(estate, pack.programs ?? pack.sources ?? ".*"));
103
+ if (programs.length === 0) {
104
+ return yield* FlowAborted.make({
105
+ message: `no source units matched the pack's programs/sources regex under ${input.workDir}`
106
+ });
107
+ }
108
+ const units = programs.map((relativePath) => ProgramUnit.make({ name: programName(relativePath), sourcePath: relativePath }));
109
+ const system = [
110
+ pack.prompt("analysis"),
111
+ pack.lessons === undefined
112
+ ? undefined
113
+ : `Lessons from previous modernization runs — apply them:\n${pack.lessons}`
114
+ ]
115
+ .filter((part) => part !== undefined)
116
+ .join("\n\n");
117
+ /**
118
+ * Structured calls report usage only to their caller; the Chat seam
119
+ * is what normally publishes `TokensUsed` (ADR 0005). A benchmark
120
+ * that skipped this would measure wall-clock and nothing else, so
121
+ * every measured call republishes its own usage for the tap.
122
+ */
123
+ const publishUsage = (agent, usage, model) => context.events.publish(TokensUsed.make({
124
+ agent,
125
+ usage,
126
+ ...(model === undefined ? {} : { model })
127
+ }));
128
+ yield* measured("extract", extractProgramsResumably(files, units, (unit) => context.coder
129
+ .executeStructuredWithUsage([
130
+ system,
131
+ "",
132
+ `Extract the behavioural spec for ONE source unit: ${unit.sourcePath}`,
133
+ 'Respond only with JSON: {"spec":"…","feature":"…","traceability":"…","mapping":"…"}.',
134
+ pack.prompt("spec") ?? "",
135
+ pack.prompt("bdd") ?? ""
136
+ ].join("\n"), ProgramArtifacts, { type: "object" })
137
+ .pipe(Effect.mapError(FlowLlmError.from), Effect.tap(([, usage, model]) => usage === undefined ? Effect.void : publishUsage("coder", usage, model)), Effect.map(([artifacts]) => artifacts)), modDirAbs));
138
+ // The deterministic half of the extraction gate, measured on its own:
139
+ // it is the part a slower model cannot make cheaper.
140
+ const deterministic = yield* measured("gate", Effect.gen(function* () {
141
+ const fragments = [];
142
+ for (const unit of units) {
143
+ const text = yield* files.read(join(modDirAbs, "traceability", `${unit.name}.md`));
144
+ if (text !== undefined) {
145
+ fragments.push(text);
146
+ }
147
+ }
148
+ const trace = fragments.join("\n\n");
149
+ const covered = yield* coverage(estate, pack.coverage, trace);
150
+ const wellFormed = yield* features(estate, `${ModDir}/features`);
151
+ return mergeReviewResults([covered, wellFormed]);
152
+ }));
153
+ /**
154
+ * The evaluator has no usage-reporting variant, so the seat it runs
155
+ * on is wrapped instead: every structured call it makes reports its
156
+ * usage to the tap before returning the value.
157
+ */
158
+ const metered = {
159
+ ...context.reasoning,
160
+ executeStructured: (prompt, schema, jsonSchema) => context.reasoning.executeStructuredWithUsage(prompt, schema, jsonSchema).pipe(Effect.tap(([, usage, model]) => usage === undefined ? Effect.void : publishUsage("reasoning", usage, model)), Effect.map(([value]) => value))
161
+ };
162
+ const judged = yield* measured("judge", Effect.gen(function* () {
163
+ const packJudge = judge(metered, pack.judgeDimensions);
164
+ const scores = [];
165
+ let findings = 0;
166
+ for (const unit of units) {
167
+ const spec = (yield* files.read(join(modDirAbs, "specs", `${unit.name}.md`))) ?? "";
168
+ const source = (yield* files.read(join(input.workDir, unit.sourcePath))) ?? "";
169
+ const scored = yield* packJudge
170
+ .evaluate(Sample.make({ response: spec, context: source, query: input.prompt }))
171
+ .pipe(Effect.mapError(FlowLlmError.from));
172
+ for (const score of scored.scores) {
173
+ const max = pack.judgeDimensions.find((d) => d.name === score.name)?.maxScore ?? 2;
174
+ scores.push(BenchScore.make({
175
+ name: `${unit.name}:${score.name}`,
176
+ score: score.score,
177
+ max,
178
+ reasoning: score.reasoning
179
+ }));
180
+ if (score.score < max) {
181
+ findings += 1;
182
+ }
183
+ }
184
+ }
185
+ return { scores, findings };
186
+ }));
187
+ const quality = yield* Effect.gen(function* () {
188
+ const specFiles = yield* matchingFiles(estate, `^${ModDir}/specs/.*\\.md$`).pipe(Effect.orElseSucceed(() => []));
189
+ const featureFiles = yield* matchingFiles(estate, `^${ModDir}/features/.*\\.feature$`).pipe(Effect.orElseSucceed(() => []));
190
+ let scenarios = 0;
191
+ for (const path of featureFiles) {
192
+ const text = yield* estate.read(path).pipe(Effect.orElseSucceed(() => ""));
193
+ scenarios += text
194
+ .split(/\r?\n/)
195
+ .filter((line) => line.trim().startsWith("Scenario")).length;
196
+ }
197
+ let sourceLines = 0;
198
+ for (const path of programs) {
199
+ const text = yield* estate.read(path).pipe(Effect.orElseSucceed(() => ""));
200
+ sourceLines += text.split(/\r?\n/).length;
201
+ }
202
+ const units_ = yield* coverageUnits(estate, pack.coverage);
203
+ const malformed = (yield* features(estate, `${ModDir}/features`)).issues.length;
204
+ return BenchQuality.make({
205
+ featureFiles: featureFiles.length,
206
+ scenarios,
207
+ malformedFeatures: malformed,
208
+ specFiles: specFiles.length,
209
+ programs: programs.length,
210
+ sourceFiles: programs.length,
211
+ sourceLines,
212
+ testFiles: featureFiles.length,
213
+ testLines: scenarios,
214
+ deterministicFindings: deterministic.issues.length,
215
+ judgeFindings: judged.findings,
216
+ gateCleared: deterministic.issues.length === 0 && judged.findings === 0,
217
+ gateOpenIssues: deterministic.issues.length + judged.findings,
218
+ judgeScores: judged.scores,
219
+ // The rule universe is the estate's own coverage units.
220
+ coveragePct: Object.values(units_).flat().length === 0
221
+ ? 0
222
+ : Math.round((Object.values(units_)
223
+ .flat()
224
+ .filter((unit) => unit.length > 0).length /
225
+ Object.values(units_).flat().length) *
226
+ 100)
227
+ });
228
+ });
229
+ // The fingerprint groups records of the SAME estate so the report can
230
+ // compare providers rather than mixing unrelated fixtures.
231
+ const fingerprint = reviewFingerprint(pack.name, ...[...programs].sort(), String(quality.sourceLines)).slice(0, 16);
232
+ const finishedAt = new Date();
233
+ const record = BenchRecord.make({
234
+ schemaVersion: CurrentBenchSchema,
235
+ runId: `${startedAt.toISOString()}-${process.pid}`,
236
+ startedAt: startedAt.toISOString(),
237
+ finishedAt: finishedAt.toISOString(),
238
+ provider: coder.connectorId.value,
239
+ modelRequested: coder.model ?? "(harness default)",
240
+ modelsServed: [],
241
+ judge: BenchJudge.make({
242
+ provider: coder.connectorId.value,
243
+ model: coder.model ?? "(harness default)",
244
+ fixed: false
245
+ }),
246
+ llm4tsVersion: packageVersion,
247
+ pack: pack.name,
248
+ fixtureFingerprint: fingerprint,
249
+ machine: machine(),
250
+ outcome: quality.gateCleared === true ? "completed" : "gate-open",
251
+ totalMs: finishedAt.getTime() - startedAt.getTime(),
252
+ phases,
253
+ quality
254
+ });
255
+ yield* appendBenchRecord(files, benchPath, record);
256
+ yield* context.events.publish(Info.make({
257
+ message: `benchmark appended to ${benchPath} — ${record.totalTokens} token(s) over ` +
258
+ `${phases.length} phase(s); report with LLM4TS_BENCH_MODE=report`
259
+ }));
260
+ const all = yield* loadBenchRecords(files, benchPath);
261
+ process.stdout.write(`${renderBenchReport(all)}\n`);
262
+ })));
263
+ });
264
+ runFlowMain(program);