@llm4ts/flow 0.9.1 → 0.10.1

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.
@@ -0,0 +1,52 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { Sample, type Dimension } from "@llm4ts/core/eval/Eval";
3
+ import type { Evaluator } from "@llm4ts/core/eval/Evaluator";
4
+ import { FlowLlmError, type FlowError } from "./FlowError.ts";
5
+ import { FlowEvents } from "./FlowEvents.ts";
6
+ import type { GitToolShape } from "./GitTool.ts";
7
+ import type { Pack } from "./Pack.ts";
8
+ import type { PlainFileStoreShape } from "./Persistence.ts";
9
+ import { ReviewResult } from "./Review.ts";
10
+ export interface GroupedFiles {
11
+ readonly byProgram: Readonly<Record<string, ReadonlyArray<string>>>;
12
+ readonly unassigned: ReadonlyArray<string>;
13
+ }
14
+ /**
15
+ * Partition `changed` by which program's file regex matches. A file matching
16
+ * several programs is judged with each of them (a shared bridge class is
17
+ * genuinely part of both). The remainder — build files, shared utilities — is
18
+ * returned separately for the unassigned pass.
19
+ */
20
+ export declare const groupFiles: (pack: Pack, programs: ReadonlyArray<string>, changed: ReadonlyArray<string>) => GroupedFiles;
21
+ export interface ProgramJudgeOptions {
22
+ readonly pack: Pack;
23
+ readonly judge: Evaluator<Sample>;
24
+ readonly dimensions: ReadonlyArray<Dimension>;
25
+ readonly git: GitToolShape;
26
+ readonly files: PlainFileStoreShape;
27
+ /** Directory holding the per-program verdict cache (`<gateDir>/<NAME>.json`). */
28
+ readonly gateDir: string;
29
+ readonly base: string;
30
+ readonly programs: ReadonlyArray<string>;
31
+ /** A program's spec text; the caller owns where specs live. */
32
+ readonly specFor: (program: string) => Effect.Effect<string, FlowError>;
33
+ readonly query: string;
34
+ /** Content fingerprint for the verdict cache (hashing lives outside flow). */
35
+ readonly fingerprint: (...parts: ReadonlyArray<string>) => string;
36
+ }
37
+ /**
38
+ * A spec'd program with NO matching changed file is a deterministic gate
39
+ * failure, not a silent pass. Skipping it would let the branch clear a bar the
40
+ * old whole-branch judge would have failed. It also surfaces a mis-set
41
+ * `programFiles:` immediately — the top documented risk of the per-program
42
+ * design — instead of quietly degrading coverage.
43
+ */
44
+ export declare const unimplemented: (programs: ReadonlyArray<string>) => ReviewResult;
45
+ /**
46
+ * Judge every program whose files changed, plus one pass over the unassigned
47
+ * remainder. Each verdict is cached at `gateDir/<NAME>.json`, fingerprinted
48
+ * over the spec, the diff slice, and the rubric it judged — so re-running
49
+ * after a crash re-judges only what changed.
50
+ */
51
+ export declare const judgeAllPrograms: (options: ProgramJudgeOptions) => Effect.Effect<ReviewResult, import("./FlowError.ts").PersistenceError | import("./FlowError.ts").PlanParseError | import("./FlowError.ts").UnsupportedSchemaVersion | import("./FlowError.ts").WorkspacePathError | import("./FlowError.ts").WorkspaceLimitError | import("./FlowError.ts").WorkspaceIoError | import("./FlowError.ts").FlowAborted | import("./FlowError.ts").ProcessError | FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").ColumnNotFound | import("./FlowError.ts").BudgetExceeded, FlowEvents>;
52
+ //# sourceMappingURL=ProgramJudge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramJudge.d.ts","sourceRoot":"","sources":["../src/ProgramJudge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAmB,MAAM,wBAAwB,CAAA;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAQ,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAe,YAAY,EAAsB,MAAM,aAAa,CAAA;AAU3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,IAAI,EACV,UAAU,aAAa,CAAC,MAAM,CAAC,EAC/B,SAAS,aAAa,CAAC,MAAM,CAAC,KAC7B,YAYF,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAC7C,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;IACnC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,MAAM,CAAA;CAClE;AAoCD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU,aAAa,CAAC,MAAM,CAAC,KAAG,YAc5D,CAAA;AAiCJ;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,+jBA0B3B,CAAA"}
@@ -0,0 +1,100 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { Sample } from "@llm4ts/core/eval/Eval";
3
+ import { capped, withShrink } from "./Context.js";
4
+ import { FlowLlmError } from "./FlowError.js";
5
+ import { FlowEvents, Info } from "./FlowEvents.js";
6
+ import { ReviewIssue, ReviewResult, mergeReviewResults } from "./Review.js";
7
+ import { cachedReview } from "./ReviewCache.js";
8
+ /**
9
+ * Partition `changed` by which program's file regex matches. A file matching
10
+ * several programs is judged with each of them (a shared bridge class is
11
+ * genuinely part of both). The remainder — build files, shared utilities — is
12
+ * returned separately for the unassigned pass.
13
+ */
14
+ export const groupFiles = (pack, programs, changed) => {
15
+ const byProgram = Object.fromEntries(programs.map((program) => {
16
+ const matches = pack.filesFor(program);
17
+ return [program, changed.filter((file) => matches.test(file))];
18
+ }));
19
+ const assigned = new Set(Object.values(byProgram).flat());
20
+ return {
21
+ byProgram,
22
+ unassigned: changed.filter((file) => !assigned.has(file))
23
+ };
24
+ };
25
+ const join = (root, path) => `${root.replace(/[\\/]+$/, "")}/${path.replace(/^[\\/]+/, "")}`;
26
+ const rubricText = (dimensions) => dimensions
27
+ .map((dimension) => `${dimension.name} (0..${dimension.maxScore}): ${dimension.rubric}`)
28
+ .join("\n");
29
+ /**
30
+ * Sub-bar dimensions as Critical review issues, titled with the program they
31
+ * belong to — the same shape the extract gate produces, so fix loops and
32
+ * `ReviewResult.isClean` work unchanged.
33
+ */
34
+ const issues = (scored, dimensions, program) => {
35
+ const subBar = scored.scores.filter((score) => score.score < (dimensions.find((dimension) => dimension.name === score.name)?.maxScore ?? 2));
36
+ return ReviewResult.make({
37
+ issues: subBar.map((score) => ReviewIssue.make({
38
+ severity: "Critical",
39
+ title: `judge[${program}]: ${score.name} scored ${score.score}`,
40
+ description: score.reasoning
41
+ })),
42
+ summary: `judge:${program}`
43
+ });
44
+ };
45
+ /**
46
+ * A spec'd program with NO matching changed file is a deterministic gate
47
+ * failure, not a silent pass. Skipping it would let the branch clear a bar the
48
+ * old whole-branch judge would have failed. It also surfaces a mis-set
49
+ * `programFiles:` immediately — the top documented risk of the per-program
50
+ * design — instead of quietly degrading coverage.
51
+ */
52
+ export const unimplemented = (programs) => ReviewResult.make({
53
+ issues: programs.map((program) => ReviewIssue.make({
54
+ severity: "Critical",
55
+ title: `judge[${program}]: spec'd but no implementation files changed`,
56
+ description: `${program} has a committed spec but no file on this branch matches the pack's ` +
57
+ "programFiles regex for it. Either the program is unimplemented, or the pack's " +
58
+ "`programFiles:` template does not match this repo's layout — check that before " +
59
+ "assuming the former."
60
+ })),
61
+ summary: "judge:unimplemented"
62
+ });
63
+ const judgeSlice = Effect.fn("@llm4ts/flow/ProgramJudge.judgeSlice")(function* (options, label, spec, diff) {
64
+ const events = yield* FlowEvents;
65
+ const rubric = rubricText(options.dimensions);
66
+ return yield* cachedReview(options.files, join(options.gateDir, `${label}.json`), options.fingerprint(spec, diff, rubric), events.publish(Info.make({ message: `judging ${label}` })).pipe(Effect.andThen(withShrink(`judge[${label}]`, (cap) => Effect.gen(function* () {
67
+ const cappedSpec = yield* capped(`spec[${label}]`, spec, cap);
68
+ const cappedDiff = yield* capped(`diff[${label}]`, diff, cap);
69
+ return yield* options.judge
70
+ .evaluate(Sample.make({ response: cappedDiff, context: cappedSpec, query: options.query }))
71
+ .pipe(Effect.mapError(FlowLlmError.from));
72
+ }))), Effect.map((scored) => issues(scored, options.dimensions, label))));
73
+ });
74
+ /**
75
+ * Judge every program whose files changed, plus one pass over the unassigned
76
+ * remainder. Each verdict is cached at `gateDir/<NAME>.json`, fingerprinted
77
+ * over the spec, the diff slice, and the rubric it judged — so re-running
78
+ * after a crash re-judges only what changed.
79
+ */
80
+ export const judgeAllPrograms = Effect.fn("@llm4ts/flow/ProgramJudge.judgeAll")(function* (options) {
81
+ const changed = yield* options.git.changedFilesVsBase(options.base);
82
+ const { byProgram, unassigned } = groupFiles(options.pack, options.programs, changed);
83
+ const active = options.programs.filter((program) => (byProgram[program] ?? []).length > 0);
84
+ const untouched = options.programs.filter((program) => (byProgram[program] ?? []).length === 0);
85
+ const perProgram = [];
86
+ for (const program of active) {
87
+ const spec = yield* options.specFor(program);
88
+ // The file slice comes from groupFiles — re-deriving it per program would
89
+ // be N+1 git invocations for the same answer.
90
+ const diff = yield* options.git.diffVsBaseScoped(options.base, byProgram[program] ?? []);
91
+ perProgram.push(yield* judgeSlice(options, program, spec, diff));
92
+ }
93
+ if (unassigned.length > 0) {
94
+ const diff = yield* options.git.diffVsBaseScoped(options.base, unassigned);
95
+ const specs = yield* Effect.forEach(options.programs, options.specFor).pipe(Effect.map((all) => all.join("\n\n")));
96
+ perProgram.push(yield* judgeSlice(options, "unassigned", specs, diff));
97
+ }
98
+ return mergeReviewResults([...perProgram, unimplemented(untouched)]);
99
+ });
100
+ //# sourceMappingURL=ProgramJudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramJudge.js","sourceRoot":"","sources":["../src/ProgramJudge.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ declare const Provenance_base: Schema.Class<Provenance, Schema.Struct<{
13
13
  readonly gateVerdicts: Schema.$Record<Schema.String, Schema.String>;
14
14
  readonly equivalenceReport: Schema.optionalKey<Schema.String>;
15
15
  readonly fixSpecs: Schema.$Array<Schema.String>;
16
+ readonly contextTruncations: Schema.withConstructorDefault<Schema.withDecodingDefaultKey<Schema.$Array<Schema.String>, never>>;
16
17
  }>, {}>;
17
18
  export declare class Provenance extends Provenance_base {
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Provenance.d.ts","sourceRoot":"","sources":["../src/Provenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;;;;;;;;;;;;;AAE3D,qBAAa,UAAW,SAAQ,eAW9B;CAAG;AAKL,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACxF,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IACrE,QAAQ,CAAC,MAAM,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,UAAU,KACxC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,CAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KACzB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;CACvE;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,mBAAmB,KAAG,oBAkDhE,CAAA"}
1
+ {"version":3,"file":"Provenance.d.ts","sourceRoot":"","sources":["../src/Provenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;;;;;;;;;;;;;;AAE3D,qBAAa,UAAW,SAAQ,eAoB9B;CAAG;AAKL,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACxF,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IACrE,QAAQ,CAAC,MAAM,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,UAAU,KACxC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,CAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KACzB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;CACvE;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,mBAAmB,KAAG,oBAkDhE,CAAA"}
@@ -11,7 +11,13 @@ export class Provenance extends Schema.Class("Provenance")({
11
11
  specs: Schema.Record(Schema.String, Schema.String),
12
12
  gateVerdicts: Schema.Record(Schema.String, Schema.String),
13
13
  equivalenceReport: Schema.optionalKey(Schema.String),
14
- fixSpecs: Schema.Array(Schema.String)
14
+ fixSpecs: Schema.Array(Schema.String),
15
+ // Context truncations recorded while producing this evidence
16
+ // (Context.renderTruncation strings). A gate verdict rendered on a
17
+ // partially-read spec pack says so HERE — that visibility is the whole
18
+ // reason truncation is allowed at all. Defaulted so manifests written
19
+ // before this field still load.
20
+ contextTruncations: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed([])), Schema.withConstructorDefault(Effect.succeed([])))
15
21
  }) {
16
22
  }
17
23
  const join = (root, path) => `${root.replace(/[\\/]+$/, "")}/${path.replace(/^[\\/]+/, "")}`;
@@ -1 +1 @@
1
- {"version":3,"file":"Provenance.js","sourceRoot":"","sources":["../src/Provenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Provenance.js","sourceRoot":"","sources":["../src/Provenance.ts"],"names":[],"mappings":"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"}
package/dist/Survey.d.ts CHANGED
@@ -25,6 +25,16 @@ export declare class SurveyGraph extends SurveyGraph_base {
25
25
  incoming(name: string): ReadonlyArray<SurveyEdge>;
26
26
  outgoing(name: string): ReadonlyArray<SurveyEdge>;
27
27
  }
28
+ /**
29
+ * The transitive dependency closure of `program` as repo-relative paths,
30
+ * breadth-first, excluding the program itself. The `seen` set is required, not
31
+ * optional bookkeeping: COBOL copybook graphs genuinely contain cycles (a
32
+ * copybook that COPYs something which eventually COPYs back), and without it
33
+ * this walk would never terminate on a real estate. Truncated to `maxFiles` so
34
+ * a program pulling hundreds of copybooks still gets a bounded, visible subset
35
+ * instead of an unbounded read.
36
+ */
37
+ export declare const closureFor: (graph: SurveyGraph, program: string, maxFiles: number) => ReadonlyArray<string>;
28
38
  export declare const surveyGraph: (workspace: WorkspaceShape, sources: string, units: readonly CoverageRule[], edgeRules: readonly CoverageRule[]) => Effect.Effect<SurveyGraph, WorkspaceError, never>;
29
39
  export declare const mergeSurveyEdges: (graph: SurveyGraph, refined: ReadonlyArray<SurveyEdge>) => SurveyGraph;
30
40
  export declare const renderSurveyInventory: (graph: SurveyGraph) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"Survey.d.ts","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;;AAEpE,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;AAEL,qBAAa,UAAW,SAAQ,eAI9B;CAAG;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAG/B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;CAGlD;AAaD,eAAO,MAAM,WAAW,uKA8CtB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,WAAW,EAClB,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,WA2BF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAqB1D,CAAA"}
1
+ {"version":3,"file":"Survey.d.ts","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;;AAEpE,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;AAEL,qBAAa,UAAW,SAAQ,eAI9B;CAAG;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAG/B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;CAGlD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,WAAW,EAClB,SAAS,MAAM,EACf,UAAU,MAAM,KACf,aAAa,CAAC,MAAM,CAsBtB,CAAA;AAaD,eAAO,MAAM,WAAW,uKA8CtB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,WAAW,EAClB,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,WA2BF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAqB1D,CAAA"}
package/dist/Survey.js CHANGED
@@ -24,6 +24,34 @@ export class SurveyGraph extends Schema.Class("SurveyGraph")({
24
24
  return this.edges.filter((edge) => edge.from === name);
25
25
  }
26
26
  }
27
+ /**
28
+ * The transitive dependency closure of `program` as repo-relative paths,
29
+ * breadth-first, excluding the program itself. The `seen` set is required, not
30
+ * optional bookkeeping: COBOL copybook graphs genuinely contain cycles (a
31
+ * copybook that COPYs something which eventually COPYs back), and without it
32
+ * this walk would never terminate on a real estate. Truncated to `maxFiles` so
33
+ * a program pulling hundreds of copybooks still gets a bounded, visible subset
34
+ * instead of an unbounded read.
35
+ */
36
+ export const closureFor = (graph, program, maxFiles) => {
37
+ const pathOf = new Map(graph.nodes.map((node) => [node.name, node.path]));
38
+ const walk = (frontier, seen, acc) => {
39
+ if (frontier.length === 0 || acc.length >= maxFiles) {
40
+ return acc.slice(0, maxFiles);
41
+ }
42
+ const next = [
43
+ ...new Set(frontier.flatMap((from) => graph.outgoing(from).map((edge) => edge.to)))
44
+ ].filter((name) => !seen.has(name));
45
+ return walk(next, new Set([...seen, ...next]), [
46
+ ...acc,
47
+ ...next.flatMap((name) => {
48
+ const path = pathOf.get(name);
49
+ return path === undefined ? [] : [path];
50
+ })
51
+ ]);
52
+ };
53
+ return walk([program], new Set([program]), []);
54
+ };
27
55
  const unitName = (path) => {
28
56
  const base = path.split("/").at(-1) ?? path;
29
57
  const dot = base.lastIndexOf(".");
@@ -1 +1 @@
1
- {"version":3,"file":"Survey.js","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,KAAK,CAAa,YAAY,CAAC,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC,GAAG;CAClB,CAAC;CAAG;AAEL,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,KAAK,CAAa,YAAY,CAAC,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAc,aAAa,CAAC,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;CAChC,CAAC;IACA,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;IACtD,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACxD,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAyB,EAAE;IACzE,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EACzE,SAAyB,EACzB,OAAe,EACf,KAAkC,EAClC,SAAsC;IAEtC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7F,MAAM,KAAK,GAAsB,EAAE,CAAA;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACxB,KAAK,CAAC,IAAI,CACR,UAAU,CAAC,IAAI,CAAC;YACd,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM;YACjC,KAAK,EAAE,KAAK;iBACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACnD,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SACvE,CAAC,CACH,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAsB,EAAE,CAAA;IACnC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClE,KAAK,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;oBAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;oBACpB,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAA;gBACF,IACE,CAAC,KAAK,CAAC,IAAI,CACT,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CACrF,EACD,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAkB,EAClB,OAAkC,EACrB,EAAE;IACf,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACnF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,EAAE,CAAA;QAC1C,IACE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;YACrB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACrB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EACb,CAAC;YACD,OAAO,EAAE,CAAA;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO;YACL,IAAI,UAAU,CAAC;gBACb,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE;aACpE,CAAC;SACH,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,WAAW,CAAC;QACrB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAkB,EAAU,EAAE;IAClE,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;SAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;QACjD,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,CAAA;QACxF,OAAO,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,CAAA;IACjH,CAAC,CAAC,CAAA;IACJ,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IACjF,OAAO;QACL,oBAAoB;QACpB,EAAE;QACF,oDAAoD;QACpD,oDAAoD;QACpD,GAAG,IAAI;QACP,EAAE;QACF,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,KAAK,CAAC,MAAM,WAAW;QAC/D,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,+CAA+C,CAAC,CAAC;QACrF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC,CAAA"}
1
+ {"version":3,"file":"Survey.js","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ import type { LlmError } from "@llm4ts/core/Errors";
4
4
  import { type LlmServiceShape } from "@llm4ts/core/LlmService";
5
5
  import { FlowEvents } from "./FlowEvents.ts";
6
6
  export declare const isFlakyStream: (error: LlmError) => boolean;
7
+ export declare const isContextOverflowMessage: (message: string) => boolean;
8
+ export declare const isContextOverflow: (error: LlmError) => boolean;
7
9
  export declare const isTransient: (error: LlmError) => boolean;
8
10
  export declare const transientDelay: (error: LlmError, backoff: Duration.Duration) => Duration.Duration;
9
11
  export interface TransientRetryOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"TransientRetry.d.ts","sourceRoot":"","sources":["../src/TransientRetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAE1E,OAAO,EAAE,UAAU,EAAQ,MAAM,iBAAiB,CAAA;AAkClD,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,KAAG,OACqC,CAAA;AAErF,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,KAAG,OAU7C,CAAA;AAID,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC,QAAQ,KAAG,QAAQ,CAAC,QAMrF,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CACrC;AAyID,eAAO,MAAM,kBAAkB,sIA8B7B,CAAA"}
1
+ {"version":3,"file":"TransientRetry.d.ts","sourceRoot":"","sources":["../src/TransientRetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAE1E,OAAO,EAAE,UAAU,EAAQ,MAAM,iBAAiB,CAAA;AA8DlD,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,KAAG,OACqC,CAAA;AAKrF,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,KAAG,OACV,CAAA;AAKjD,eAAO,MAAM,iBAAiB,GAAI,OAAO,QAAQ,KAAG,OACuB,CAAA;AAE3E,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,KAAG,OAc7C,CAAA;AAID,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC,QAAQ,KAAG,QAAQ,CAAC,QAMrF,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CACrC;AAyID,eAAO,MAAM,kBAAkB,sIA8B7B,CAAA"}
@@ -23,23 +23,57 @@ const transientSignals = [
23
23
  " 503",
24
24
  " 504"
25
25
  ];
26
+ // An "empty response" is ambiguous: gemini returns one both for a random mid-stream
27
+ // flake and for a prompt too large to start on. This classifier sees only the message,
28
+ // so it deliberately treats both as flaky — a fresh process fixes the common (flake)
29
+ // case, and the oversized-prompt case is resolved a layer up by Context.withShrink.
30
+ // Do not route empty responses into isContextOverflow.
26
31
  const flakyStreamSignals = [
27
32
  "empty response",
28
33
  "malformed tool call",
29
34
  "invalid stream"
30
35
  ];
36
+ // Deterministic client errors a retry can never fix. Gemini wraps every error in
37
+ // "[API Error: {...}]", including 400s, so the "api error" transient signal would
38
+ // otherwise swallow them.
39
+ const deterministic4xxSignals = [
40
+ "invalid_argument",
41
+ '"code": 400',
42
+ '"code":400',
43
+ "code=400",
44
+ "exceeds the maximum number of tokens"
45
+ ];
46
+ // The message signatures of a prompt-too-large failure, in one place: isContextOverflow
47
+ // matches them on a typed LlmError, and Context.withShrink matches them on a bare
48
+ // message string when no typed cause survived. Two copies of this list would drift.
49
+ const contextOverflowSignals = [
50
+ "exceeds the maximum number of tokens",
51
+ "input token count exceeds",
52
+ "context length exceeded",
53
+ "maximum context length",
54
+ "prompt is too long",
55
+ "request too large"
56
+ ];
31
57
  const includesSignal = (message, signals) => {
32
58
  const normalized = message.toLowerCase();
33
59
  return signals.some((signal) => normalized.includes(signal));
34
60
  };
35
61
  export const isFlakyStream = (error) => error._tag === "ProviderError" && includesSignal(error.message, flakyStreamSignals);
62
+ const isDeterministic4xx = (message) => includesSignal(message, deterministic4xxSignals);
63
+ export const isContextOverflowMessage = (message) => includesSignal(message, contextOverflowSignals);
64
+ // The prompt was larger than the model's input window. Deterministic: the same prompt
65
+ // always fails, so it is not transient — it routes to Context.withShrink, which retries
66
+ // at a smaller budget.
67
+ export const isContextOverflow = (error) => error._tag === "ProviderError" && isContextOverflowMessage(error.message);
36
68
  export const isTransient = (error) => {
37
69
  switch (error._tag) {
38
70
  case "TimeoutError":
39
71
  case "RateLimitError":
40
72
  return true;
41
73
  case "ProviderError":
42
- return !isFlakyStream(error) && includesSignal(error.message, transientSignals);
74
+ return (!isFlakyStream(error) &&
75
+ !isDeterministic4xx(error.message) &&
76
+ includesSignal(error.message, transientSignals));
43
77
  default:
44
78
  return false;
45
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TransientRetry.js","sourceRoot":"","sources":["../src/TransientRetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TransientRetry.js","sourceRoot":"","sources":["../src/TransientRetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/flow",
3
- "version": "0.9.1",
3
+ "version": "0.10.1",
4
4
  "description": "Effect-native LLM workflow, persistence, review, and repository automation",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -22,6 +22,7 @@
22
22
  "./CapabilityGuard": "./dist/CapabilityGuard.js",
23
23
  "./Chat": "./dist/Chat.js",
24
24
  "./Classified": "./dist/Classified.js",
25
+ "./Context": "./dist/Context.js",
25
26
  "./CostLedger": "./dist/CostLedger.js",
26
27
  "./CostTracker": "./dist/CostTracker.js",
27
28
  "./Equiv": "./dist/Equiv.js",
@@ -45,6 +46,7 @@
45
46
  "./Planner": "./dist/Planner.js",
46
47
  "./PrSummary": "./dist/PrSummary.js",
47
48
  "./PriceList": "./dist/PriceList.js",
49
+ "./ProgramJudge": "./dist/ProgramJudge.js",
48
50
  "./Provenance": "./dist/Provenance.js",
49
51
  "./Replay": "./dist/Replay.js",
50
52
  "./Review": "./dist/Review.js",
@@ -81,7 +83,7 @@
81
83
  "typescript"
82
84
  ],
83
85
  "dependencies": {
84
- "@llm4ts/core": "0.9.1"
86
+ "@llm4ts/core": "0.10.1"
85
87
  },
86
88
  "peerDependencies": {
87
89
  "effect": "4.0.0-beta.102"
@@ -155,6 +155,14 @@ export const cardCommentCreateArgs = (cardId: number, body: string): ReadonlyArr
155
155
  "create",
156
156
  String(cardId),
157
157
  body,
158
+ ...jsonFlags
159
+ ]
160
+
161
+ export const cardCommentUpdateArgs = (commentId: number, body: string): ReadonlyArray<string> => [
162
+ "comments",
163
+ "update",
164
+ String(commentId),
165
+ body,
158
166
  "--quiet"
159
167
  ]
160
168
 
@@ -298,6 +306,19 @@ const commentStruct = Schema.Struct({
298
306
  created_at: Schema.String
299
307
  })
300
308
 
309
+ const toCardComment = (item: typeof commentStruct.Type): CardComment =>
310
+ CardComment.make({
311
+ id: item.id,
312
+ author: item.creator.name,
313
+ contentHtml: item.content,
314
+ createdAt: item.created_at
315
+ })
316
+
317
+ export const parseCardComment = (json: string): Effect.Effect<CardComment, ProcessError> =>
318
+ decodeJson("basecamp parse comment", Schema.fromJsonString(commentStruct), json).pipe(
319
+ Effect.map(toCardComment)
320
+ )
321
+
301
322
  export const parseCardComments = (
302
323
  json: string
303
324
  ): Effect.Effect<ReadonlyArray<CardComment>, ProcessError> =>
@@ -305,18 +326,7 @@ export const parseCardComments = (
305
326
  "basecamp parse comments",
306
327
  Schema.fromJsonString(Schema.NullOr(Schema.Array(commentStruct))),
307
328
  json
308
- ).pipe(
309
- Effect.map((comments) =>
310
- (comments ?? []).map((comment) =>
311
- CardComment.make({
312
- id: comment.id,
313
- author: comment.creator.name,
314
- contentHtml: comment.content,
315
- createdAt: comment.created_at
316
- })
317
- )
318
- )
319
- )
329
+ ).pipe(Effect.map((comments) => (comments ?? []).map(toCardComment)))
320
330
 
321
331
  const stepStruct = Schema.Struct({
322
332
  id: Schema.Int,
@@ -404,7 +414,8 @@ export interface BasecampToolShape {
404
414
  readonly readCardComments: (
405
415
  cardId: number
406
416
  ) => Effect.Effect<ReadonlyArray<CardComment>, FlowError>
407
- readonly writeCardComment: (cardId: number, body: string) => Effect.Effect<void, FlowError>
417
+ readonly writeCardComment: (cardId: number, body: string) => Effect.Effect<CardComment, FlowError>
418
+ readonly editCardComment: (commentId: number, body: string) => Effect.Effect<void, FlowError>
408
419
  readonly listSteps: (cardId: number) => Effect.Effect<ReadonlyArray<CardStep>, FlowError>
409
420
  readonly completeStep: (stepId: number) => Effect.Effect<void, FlowError>
410
421
  readonly listMessages: Effect.Effect<ReadonlyArray<Message>, FlowError>
@@ -523,7 +534,14 @@ export const makeBasecampTool = Effect.fn("@llm4ts/flow/BasecampTool.make")(func
523
534
  writeCardComment: (cardId, body) =>
524
535
  write(
525
536
  "basecamp comments create",
526
- run(cardCommentCreateArgs(cardId, body)).pipe(Effect.asVoid)
537
+ run(cardCommentCreateArgs(cardId, body)).pipe(
538
+ Effect.flatMap((result) => parseCardComment(output(result)))
539
+ )
540
+ ),
541
+ editCardComment: (commentId, body) =>
542
+ write(
543
+ "basecamp comments update",
544
+ run(cardCommentUpdateArgs(commentId, body)).pipe(Effect.asVoid)
527
545
  ),
528
546
  listSteps: (cardId) =>
529
547
  read(