@llm4ts/flow 0.10.0 → 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.
@@ -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":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAkB,MAAM,gBAAgB,CAAA;AAGjF,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,KAAK,CAAa,YAAY,CAAC,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,aAAa,EAAE,MAAM,CAAC,MAAM;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAClD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IACzD,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,6DAA6D;IAC7D,mEAAmE;IACnE,uEAAuE;IACvE,sEAAsE;IACtE,gCAAgC;IAChC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EACjD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAClD;CACF,CAAC;CAAG;AAEL,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE,CAClD,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAA;AAejE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAA0B,EAAwB,EAAE;IACtF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,UAAsB,EAAkC,EAAE,CACrF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CACrE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,cAAc,CAAC,IAAI,CAAC;QAClB,OAAO,EAAE,wCAAwC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE;KAC1E,CAAC,CACH,EACD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC,CACvE,CAAA;IAEH,MAAM,IAAI,GAAG,CAAC,IAAY,EAAwC,EAAE,CAClE,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAChB,CAAC,QAAQ,EAAwC,EAAE,CACjD,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,gBAAgB,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,uCAAuC,IAAI,EAAE;SACvD,CAAC,CACH;QACH,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC1E,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,cAAc,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,iCAAiC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE;SACnE,CAAC,CACH,CACF,CACR,CAAA;IAEH,MAAM,MAAM,GAAG,CACb,IAAY,EACZ,MAA2C,EACL,EAAE,CACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/B,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEJ,MAAM,SAAS,GAAG,CAChB,IAAY,EACZ,KAA4B,EACuC,EAAE,CACrE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7B,KAAK;SACF,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAyC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CACnF,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAExC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAC3C,CAAC,CAAA"}
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":"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"}
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.10.0",
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.10.0"
86
+ "@llm4ts/core": "0.10.1"
85
87
  },
86
88
  "peerDependencies": {
87
89
  "effect": "4.0.0-beta.102"
package/src/Context.ts ADDED
@@ -0,0 +1,207 @@
1
+ import * as Context from "effect/Context"
2
+ import * as Effect from "effect/Effect"
3
+ import * as Ref from "effect/Ref"
4
+ import { FlowLlmError, type FlowError } from "./FlowError.ts"
5
+ import { FlowEvents, Info } from "./FlowEvents.ts"
6
+ import { isContextOverflow, isContextOverflowMessage } from "./TransientRetry.ts"
7
+
8
+ // Context budgeting for LLM prompts: bound what a call ships, and make every
9
+ // truncation visible. Budgets are in CHARACTERS, not tokens — deterministic, no
10
+ // tokenizer dependency. Rule of thumb ~3.5 chars/token for code, so the 400k
11
+ // default is ~115k tokens: conservative against every provider.
12
+
13
+ const marker = "\n\n… [truncated] …\n\n"
14
+
15
+ export interface CappedText {
16
+ readonly text: string
17
+ readonly originalChars: number
18
+ readonly truncated: boolean
19
+ }
20
+
21
+ /**
22
+ * Bound `text` to `limit` characters — the result is NEVER longer than `limit`,
23
+ * marker included. Keeps the head (3/4 of the remaining room) and the tail (1/4)
24
+ * so both the entry points and the trailing rules survive; the middle is where
25
+ * boilerplate lives. For `limit <= 0` the closest achievable result is the
26
+ * empty string, since length can't go negative.
27
+ */
28
+ export const cap = (text: string, limit: number): CappedText => {
29
+ if (text.length <= limit) {
30
+ return { text, originalChars: text.length, truncated: false }
31
+ }
32
+ if (limit <= marker.length) {
33
+ return { text: text.slice(0, Math.max(limit, 0)), originalChars: text.length, truncated: true }
34
+ }
35
+ const room = limit - marker.length
36
+ const head = Math.floor((room * 3) / 4)
37
+ const tail = room - head
38
+ return {
39
+ text: `${text.slice(0, head)}${marker}${text.slice(text.length - tail)}`,
40
+ originalChars: text.length,
41
+ truncated: true
42
+ }
43
+ }
44
+
45
+ export const defaultContextBudget = 400_000
46
+
47
+ /**
48
+ * The default character budget: `LLM4TS_CONTEXT_BUDGET`, else the deprecated
49
+ * `LLM4TS_JUDGE_SOURCES_LIMIT`, else 400_000.
50
+ */
51
+ export const budget = (
52
+ environment: Readonly<Record<string, string | undefined>> = process.env
53
+ ): number => {
54
+ const raw = environment["LLM4TS_CONTEXT_BUDGET"] ?? environment["LLM4TS_JUDGE_SOURCES_LIMIT"]
55
+ if (raw === undefined) {
56
+ return defaultContextBudget
57
+ }
58
+ const parsed = Number.parseInt(raw.trim(), 10)
59
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : defaultContextBudget
60
+ }
61
+
62
+ /**
63
+ * Which kind of shrinking produced a truncation — the two are NOT
64
+ * interchangeable. "capped" numbers are literal character counts of shortened
65
+ * text; "shrunk" numbers are attempted budget CEILINGS after an oversized
66
+ * prompt failed. Conflating them would misreport how much content a
67
+ * clean-room audit actually lost.
68
+ */
69
+ export type TruncationKind = "capped" | "shrunk"
70
+
71
+ export interface Truncation {
72
+ readonly label: string
73
+ readonly originalChars: number
74
+ readonly keptChars: number
75
+ readonly kind: TruncationKind
76
+ }
77
+
78
+ export const renderTruncation = (truncation: Truncation): string =>
79
+ truncation.kind === "capped"
80
+ ? `${truncation.label}: truncated ${truncation.originalChars} → ${truncation.keptChars} chars`
81
+ : `${truncation.label}: retried at a lower budget, ${truncation.originalChars} → ${truncation.keptChars} chars (ceilings, not text size)`
82
+
83
+ // The ambient truncation log, written only by `capped` and `withShrink` so no
84
+ // call site can truncate without recording. The Reference default is a single
85
+ // process-wide cell; `isolateTruncations` scopes a fresh one so concurrent
86
+ // flows don't cross-contaminate and a phase reads back exactly what its own
87
+ // calls truncated.
88
+ const CurrentTruncations = Context.Reference<Ref.Ref<ReadonlyArray<Truncation>>>(
89
+ "@llm4ts/flow/Context/CurrentTruncations",
90
+ { defaultValue: () => Ref.makeUnsafe<ReadonlyArray<Truncation>>([]) }
91
+ )
92
+
93
+ const record = (truncation: Truncation): Effect.Effect<void> =>
94
+ Effect.flatMap(Effect.service(CurrentTruncations), (log) =>
95
+ Ref.update(log, (recorded) => [...recorded, truncation])
96
+ )
97
+
98
+ /** Truncations recorded so far. Phases write these into `provenance.json`. */
99
+ export const truncations: Effect.Effect<ReadonlyArray<Truncation>> = Effect.flatMap(
100
+ Effect.service(CurrentTruncations),
101
+ Ref.get
102
+ )
103
+
104
+ /** Run `effect` against a fresh, private truncation log. */
105
+ export const isolateTruncations = <A, E, R>(
106
+ effect: Effect.Effect<A, E, R>
107
+ ): Effect.Effect<A, E, R> =>
108
+ Effect.flatMap(Ref.make<ReadonlyArray<Truncation>>([]), (fresh) =>
109
+ Effect.provideService(effect, CurrentTruncations, fresh)
110
+ )
111
+
112
+ /**
113
+ * `cap`, publishing a `FlowEvent` and recording the truncation when one
114
+ * happens. `label` names what was shortened, so the event and the provenance
115
+ * entry are readable ("specs", "branch diff", "judge context").
116
+ */
117
+ export const capped = Effect.fn("@llm4ts/flow/Context.capped")(function* (
118
+ label: string,
119
+ text: string,
120
+ limit: number
121
+ ): Effect.fn.Return<string, never, FlowEvents> {
122
+ const out = cap(text, limit)
123
+ if (!out.truncated) {
124
+ return out.text
125
+ }
126
+ const events = yield* FlowEvents
127
+ yield* events.publish(
128
+ Info.make({
129
+ message: `⚠ context: ${label} truncated ${out.originalChars} → ${out.text.length} chars`
130
+ })
131
+ )
132
+ yield* record({
133
+ label,
134
+ originalChars: out.originalChars,
135
+ keptChars: out.text.length,
136
+ kind: "capped"
137
+ })
138
+ return out.text
139
+ })
140
+
141
+ // True for the two failure classes a smaller prompt can fix: a deterministic
142
+ // context overflow, and the empty response gemini returns when a prompt is too
143
+ // large for it to even start. The overflow check delegates to TransientRetry's
144
+ // phrasing list so a message-only failure (no surviving typed LlmError) is
145
+ // still caught — a second, shorter copy here would drift.
146
+ const shrinkable = (error: FlowError): boolean =>
147
+ error._tag === "Llm" &&
148
+ ((error.cause !== undefined && isContextOverflow(error.cause)) ||
149
+ isContextOverflowMessage(error.message) ||
150
+ error.message.toLowerCase().includes("empty response"))
151
+
152
+ export interface WithShrinkOptions {
153
+ readonly start?: number
154
+ readonly environment?: Readonly<Record<string, string | undefined>>
155
+ }
156
+
157
+ /**
158
+ * Run `f` at `start` characters (default: `budget()`); on a shrinkable failure
159
+ * retry at 1/2, then 1/4, then give up. Repeating the same oversized prompt
160
+ * cannot succeed, so shrinking is the only retry that makes sense for this
161
+ * failure class — which is why context overflow is deliberately excluded from
162
+ * `TransientRetry`'s budget. Each shrink publishes a `FlowEvent` and is
163
+ * recorded like any other truncation. The terminal failure deliberately drops
164
+ * the typed cause: a resume layer classifying an "empty response" cause as
165
+ * flaky would replay this exact, permanently-failing budget sequence forever.
166
+ */
167
+ export const withShrink = <A, E extends FlowError, R>(
168
+ label: string,
169
+ f: (chars: number) => Effect.Effect<A, E, R>,
170
+ options: WithShrinkOptions = {}
171
+ ): Effect.Effect<A, E | FlowLlmError, R | FlowEvents> => {
172
+ const start = options.start ?? budget(options.environment)
173
+ const attempt = (
174
+ atChars: number,
175
+ rest: ReadonlyArray<number>
176
+ ): Effect.Effect<A, E | FlowLlmError, R | FlowEvents> =>
177
+ Effect.catchIf(
178
+ f(atChars),
179
+ () => true,
180
+ (error): Effect.Effect<A, E | FlowLlmError, R | FlowEvents> => {
181
+ if (!shrinkable(error)) {
182
+ return Effect.fail(error)
183
+ }
184
+ if (rest.length === 0) {
185
+ return Effect.fail(
186
+ FlowLlmError.make({
187
+ message:
188
+ `${label} exceeded the model's input limit even after shrinking to ${atChars} chars — ` +
189
+ `lower LLM4TS_CONTEXT_BUDGET or scope this phase further (cause: ${error.message})`
190
+ })
191
+ )
192
+ }
193
+ const [next, ...remaining] = rest
194
+ return Effect.gen(function* () {
195
+ const events = yield* FlowEvents
196
+ yield* events.publish(
197
+ Info.make({
198
+ message: `⚠ context: ${label} did not fit at ${atChars} chars — shrinking to ${next}: ${error.message}`
199
+ })
200
+ )
201
+ yield* record({ label, originalChars: atChars, keptChars: next, kind: "shrunk" })
202
+ return yield* attempt(next, remaining)
203
+ })
204
+ }
205
+ )
206
+ return attempt(start, [Math.floor(start / 2), Math.floor(start / 4)])
207
+ }
package/src/GitTool.ts CHANGED
@@ -29,6 +29,11 @@ export interface GitToolShape {
29
29
  readonly diffAll: Effect.Effect<string, FlowError>
30
30
  readonly defaultBase: Effect.Effect<string, FlowError>
31
31
  readonly diffVsBase: (base: string, threeDot?: boolean) => Effect.Effect<string, FlowError>
32
+ readonly diffVsBaseScoped: (
33
+ base: string,
34
+ paths: ReadonlyArray<string>,
35
+ threeDot?: boolean
36
+ ) => Effect.Effect<string, FlowError>
32
37
  readonly changedFilesVsBase: (
33
38
  base: string,
34
39
  threeDot?: boolean
@@ -206,6 +211,22 @@ export const makeGitTool = (
206
211
  defaultBase: read("git defaultBase", defaultBaseEffect),
207
212
  diffVsBase: (base, threeDot = true) =>
208
213
  read("git diffVsBase", runOrFail(["diff", `${base}${threeDot ? "..." : ".."}HEAD`])),
214
+ // Diff vs base restricted to paths — the per-program / per-lens scoping
215
+ // primitive. An EMPTY paths list returns the empty string rather than the
216
+ // whole diff: bare `git diff <range> --` means "everything", which would
217
+ // silently defeat every caller that scopes by a computed, possibly-empty
218
+ // file set. The empty check lives INSIDE read(...), not before it — a
219
+ // pre-guard early return would let diffVsBaseScoped(base, []) silently
220
+ // succeed under grants that deny GitRead, with no CapabilityDenied audit.
221
+ diffVsBaseScoped: (base, paths, threeDot = true) =>
222
+ read(
223
+ "git diffVsBase (scoped)",
224
+ Effect.suspend(() =>
225
+ paths.length === 0
226
+ ? Effect.succeed("")
227
+ : runOrFail(["diff", `${base}${threeDot ? "..." : ".."}HEAD`, "--", ...paths])
228
+ )
229
+ ),
209
230
  changedFilesVsBase: (base, threeDot = true) =>
210
231
  read(
211
232
  "git changedFilesVsBase",
package/src/Pack.ts CHANGED
@@ -33,9 +33,17 @@ export interface Pack {
33
33
  readonly prompts: Readonly<Record<string, string>>
34
34
  readonly lenses: ReadonlyArray<Reviewer>
35
35
  readonly lessons: string | undefined
36
+ // Regex template locating a program's TARGET implementation files (relative
37
+ // paths), `<NAME>` substituted with the program name. The seam that makes
38
+ // per-program judging possible.
39
+ readonly programFiles: string | undefined
36
40
  readonly dir: string
37
41
  readonly gate: (name: string) => ReadonlyArray<string> | undefined
38
42
  readonly prompt: (name: string) => string | undefined
43
+ // The regex for `program`'s implementation files: the `programFiles:`
44
+ // template with `<NAME>` substituted, or a case-insensitive "path contains
45
+ // the program name" fallback.
46
+ readonly filesFor: (program: string) => RegExp
39
47
  }
40
48
 
41
49
  interface ParsedManifest {
@@ -134,6 +142,17 @@ const dimensions = (body: string | undefined): ReadonlyArray<Dimension> =>
134
142
  : [Dimension.make({ name, rubric, maxScore })]
135
143
  })
136
144
 
145
+ const escapeRegExp = (value: string): string => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
146
+
147
+ const isValidRegExp = (source: string): boolean => {
148
+ try {
149
+ new RegExp(source)
150
+ return true
151
+ } catch {
152
+ return false
153
+ }
154
+ }
155
+
137
156
  const markdownSidecars = Effect.fn("@llm4ts/flow/Pack.markdownSidecars")(function* (
138
157
  workspace: WorkspaceShape,
139
158
  directory: string
@@ -173,6 +192,16 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (
173
192
  .sort(([left], [right]) => left.localeCompare(right))
174
193
  .map(([name, text]) => parseReviewer(name, text))
175
194
  const fields = manifest.fields
195
+ const programFiles = fields["programFiles"]
196
+ // Validated at load so a mis-typed template fails the pack, not a later
197
+ // phase; substitution cannot introduce invalid syntax because the fallback
198
+ // probe uses an alphanumeric stand-in and real substitutions are escaped
199
+ // only in the no-template fallback, mirroring the reference behavior.
200
+ if (programFiles !== undefined && !isValidRegExp(programFiles.replaceAll("<NAME>", "PROBE"))) {
201
+ return yield* PlanParseError.make({
202
+ message: `pack manifest 'programFiles:' is not a valid regex template: ${programFiles}`
203
+ })
204
+ }
176
205
  const pack: Pack = {
177
206
  name: manifest.name,
178
207
  source: fields.source ?? "",
@@ -198,9 +227,16 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (
198
227
  prompts,
199
228
  lenses,
200
229
  lessons: lessons === undefined || lessons.length === 0 ? undefined : lessons,
230
+ programFiles,
201
231
  dir: directory,
202
232
  gate: (name) => gates[name],
203
- prompt: (name) => prompts[name]
233
+ prompt: (name) => prompts[name],
234
+ // The template is anchored to the whole path (the reference full-matches);
235
+ // the fallback is a deliberate substring "path contains the name" match.
236
+ filesFor: (program) =>
237
+ programFiles === undefined
238
+ ? new RegExp(escapeRegExp(program), "i")
239
+ : new RegExp(`^(?:${programFiles.replaceAll("<NAME>", program)})$`)
204
240
  }
205
241
  return pack
206
242
  })