@llm4ts/flow 2.7.2 → 2.9.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 (75) hide show
  1. package/dist/Approval.d.ts +1 -1
  2. package/dist/Approval.d.ts.map +1 -1
  3. package/dist/Artifacts.d.ts +2 -2
  4. package/dist/Artifacts.d.ts.map +1 -1
  5. package/dist/BenchReport.d.ts +2 -2
  6. package/dist/BenchReport.d.ts.map +1 -1
  7. package/dist/Chat.d.ts.map +1 -1
  8. package/dist/Chat.js +35 -4
  9. package/dist/Chat.js.map +1 -1
  10. package/dist/CostLedger.d.ts +2 -2
  11. package/dist/CostLedger.d.ts.map +1 -1
  12. package/dist/Equiv.d.ts +3 -3
  13. package/dist/Equiv.d.ts.map +1 -1
  14. package/dist/Flow.d.ts +1 -1
  15. package/dist/Flow.d.ts.map +1 -1
  16. package/dist/FlowContext.d.ts +15 -1
  17. package/dist/FlowContext.d.ts.map +1 -1
  18. package/dist/FlowContext.js.map +1 -1
  19. package/dist/FlowError.d.ts +40 -1
  20. package/dist/FlowError.d.ts.map +1 -1
  21. package/dist/FlowError.js +58 -3
  22. package/dist/FlowError.js.map +1 -1
  23. package/dist/GitTool.d.ts +26 -2
  24. package/dist/GitTool.d.ts.map +1 -1
  25. package/dist/GitTool.js +54 -3
  26. package/dist/GitTool.js.map +1 -1
  27. package/dist/Judgment.d.ts +2 -2
  28. package/dist/Judgment.d.ts.map +1 -1
  29. package/dist/Perimeter.d.ts +22 -1
  30. package/dist/Perimeter.d.ts.map +1 -1
  31. package/dist/Perimeter.js +57 -1
  32. package/dist/Perimeter.js.map +1 -1
  33. package/dist/Persistence.d.ts +2 -2
  34. package/dist/Persistence.d.ts.map +1 -1
  35. package/dist/PlanExecution.d.ts +1 -1
  36. package/dist/PlanExecution.d.ts.map +1 -1
  37. package/dist/ProgramJudge.d.ts +1 -1
  38. package/dist/ProgramJudge.d.ts.map +1 -1
  39. package/dist/Replay.d.ts +2 -2
  40. package/dist/Replay.d.ts.map +1 -1
  41. package/dist/Review.d.ts +3 -3
  42. package/dist/Review.d.ts.map +1 -1
  43. package/dist/ReviewCache.d.ts +1 -1
  44. package/dist/ReviewCache.d.ts.map +1 -1
  45. package/dist/Roster.d.ts +163 -0
  46. package/dist/Roster.d.ts.map +1 -0
  47. package/dist/Roster.js +560 -0
  48. package/dist/Roster.js.map +1 -0
  49. package/dist/RosterSeats.d.ts +71 -0
  50. package/dist/RosterSeats.d.ts.map +1 -0
  51. package/dist/RosterSeats.js +144 -0
  52. package/dist/RosterSeats.js.map +1 -0
  53. package/dist/Stories.d.ts +54 -8
  54. package/dist/Stories.d.ts.map +1 -1
  55. package/dist/Stories.js +413 -51
  56. package/dist/Stories.js.map +1 -1
  57. package/dist/StoryPlan.d.ts +15 -0
  58. package/dist/StoryPlan.d.ts.map +1 -1
  59. package/dist/StoryPlan.js +58 -0
  60. package/dist/StoryPlan.js.map +1 -1
  61. package/dist/TransientRetry.d.ts +9 -0
  62. package/dist/TransientRetry.d.ts.map +1 -1
  63. package/dist/TransientRetry.js +43 -8
  64. package/dist/TransientRetry.js.map +1 -1
  65. package/package.json +4 -2
  66. package/src/Chat.ts +45 -6
  67. package/src/FlowContext.ts +19 -1
  68. package/src/FlowError.ts +65 -3
  69. package/src/GitTool.ts +99 -5
  70. package/src/Perimeter.ts +85 -1
  71. package/src/Roster.ts +824 -0
  72. package/src/RosterSeats.ts +306 -0
  73. package/src/Stories.ts +588 -88
  74. package/src/StoryPlan.ts +73 -0
  75. package/src/TransientRetry.ts +97 -8
@@ -0,0 +1,163 @@
1
+ import * as Duration from "effect/Duration";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import type * as Scope from "effect/Scope";
5
+ import type { LlmError } from "@llm4ts/core/Errors";
6
+ import { RosterExhausted, type FlowError } from "./FlowError.ts";
7
+ import { type FlowEventsShape } from "./FlowEvents.ts";
8
+ import { type PlainFileStoreShape } from "./Persistence.ts";
9
+ export declare const Role: Schema.Literals<readonly ["planner", "coder", "reviewer", "judge", "verifier"]>;
10
+ export type Role = typeof Role.Type;
11
+ export declare const roles: ReadonlyArray<Role>;
12
+ declare const Cooldown_base: Schema.Class<Cooldown, Schema.Struct<{
13
+ readonly usageLimit: Schema.optionalKey<Schema.String>;
14
+ readonly rateLimit: Schema.optionalKey<Schema.String>;
15
+ readonly outage: Schema.optionalKey<Schema.String>;
16
+ }>, {}>;
17
+ /** How long each exclusion lasts, as duration strings ("30 minutes"). */
18
+ export declare class Cooldown extends Cooldown_base {
19
+ }
20
+ declare const ExecutorSpec_base: Schema.Class<ExecutorSpec, Schema.Struct<{
21
+ readonly id: Schema.String;
22
+ /** A CLI harness (`pi`, `claude`, `codex`, `opencode`, …) or an API provider (`lm-studio`, …). */
23
+ readonly harness: Schema.String;
24
+ readonly model: Schema.optionalKey<Schema.String>;
25
+ readonly flags: Schema.optionalKey<Schema.$Record<Schema.String, Schema.String>>;
26
+ /** Environment for the harness process; secrets only as `${VAR}` references. */
27
+ readonly env: Schema.optionalKey<Schema.$Record<Schema.String, Schema.String>>;
28
+ /** Endpoint for an API harness. */
29
+ readonly baseUrl: Schema.optionalKey<Schema.String>;
30
+ readonly roles: Schema.$Array<Schema.String>;
31
+ readonly slots: Schema.optionalKey<Schema.Number>;
32
+ /** Slots coders may use; default `slots - 1` when the executor also reasons. */
33
+ readonly coderSlots: Schema.optionalKey<Schema.Number>;
34
+ /** Lower first. A number for every role, or per role with a `default`. */
35
+ readonly priority: Schema.optionalKey<Schema.Union<readonly [Schema.Number, Schema.$Record<Schema.String, Schema.Number>]>>;
36
+ /** A URL that answers 2xx when the executor's serving engine is up. */
37
+ readonly health: Schema.optionalKey<Schema.String>;
38
+ readonly cooldown: Schema.optionalKey<typeof Cooldown>;
39
+ /** In a repository roster: removes the user roster's entry with this id. */
40
+ readonly disabled: Schema.optionalKey<Schema.Boolean>;
41
+ }>, {}>;
42
+ /** One executor: a harness and a model, the roles it takes, its slots and priorities. */
43
+ export declare class ExecutorSpec extends ExecutorSpec_base {
44
+ }
45
+ declare const RosterDocument_base: Schema.Class<RosterDocument, Schema.Struct<{
46
+ readonly executors: Schema.$Array<typeof ExecutorSpec>;
47
+ }>, {}>;
48
+ export declare class RosterDocument extends RosterDocument_base {
49
+ }
50
+ export declare const ExclusionKind: Schema.Literals<readonly ["until", "health", "run", "manual"]>;
51
+ export type ExclusionKind = typeof ExclusionKind.Type;
52
+ declare const Exclusion_base: Schema.Class<Exclusion, Schema.Struct<{
53
+ readonly id: Schema.String;
54
+ readonly reason: Schema.String;
55
+ readonly kind: Schema.Literals<readonly ["until", "health", "run", "manual"]>;
56
+ /** Epoch milliseconds; for `until`, and as the next probe time for `health`. */
57
+ readonly until: Schema.optionalKey<Schema.Number>;
58
+ }>, {}>;
59
+ /**
60
+ * Why an executor is out of the pick-up round, and until when: `until` an
61
+ * instant, `health` its health URL answers, `run` the end of this run,
62
+ * `manual` an operator's resume.
63
+ */
64
+ export declare class Exclusion extends Exclusion_base {
65
+ }
66
+ export declare const RosterStateVersion = 1;
67
+ declare const RosterState_base: Schema.Class<RosterState, Schema.Struct<{
68
+ readonly exclusions: Schema.$Array<typeof Exclusion>;
69
+ }>, {}>;
70
+ export declare class RosterState extends RosterState_base {
71
+ }
72
+ export declare const isRole: (value: string) => value is Role;
73
+ export declare const rolesOf: (spec: ExecutorSpec) => ReadonlyArray<Role>;
74
+ export declare const hasRole: (spec: ExecutorSpec, role: Role) => boolean;
75
+ export declare const slotsOf: (spec: ExecutorSpec) => number;
76
+ /** Slots coders may hold: one stays free for reasoning on an executor that does both. */
77
+ export declare const coderSlotsOf: (spec: ExecutorSpec) => number;
78
+ export declare const priorityOf: (spec: ExecutorSpec, role: Role) => number;
79
+ /** "30 minutes", "90s", "2h" — the cooldown vocabulary of a roster file. */
80
+ export declare const parseDuration: (text: string) => Duration.Duration | undefined;
81
+ export declare const usageLimitCooldown: (spec: ExecutorSpec) => Duration.Duration;
82
+ export declare const rateLimitCooldown: (spec: ExecutorSpec) => Duration.Duration;
83
+ export declare const outageCooldown: (spec: ExecutorSpec) => Duration.Duration;
84
+ /** Rate limits in this window count towards an exclusion. */
85
+ export declare const rateLimitWindow: Duration.Duration;
86
+ /** Rate limits within the window that exclude an executor. */
87
+ export declare const rateLimitsToExclude = 3;
88
+ /** How often a health-excluded executor is probed while someone waits. */
89
+ export declare const healthProbeInterval: Duration.Duration;
90
+ /**
91
+ * Every violation of a roster document, in one pass: duplicate ids, unknown
92
+ * or missing roles, impossible slot counts, unparseable cooldowns. Harness
93
+ * checks need the connector table and live in the runner.
94
+ */
95
+ export declare const rosterViolations: (document: RosterDocument) => ReadonlyArray<string>;
96
+ /**
97
+ * A repository roster over the user's: an entry replaces the user entry
98
+ * with the same id, `disabled: true` removes it, a new id is added.
99
+ */
100
+ export declare const mergeRosterDocuments: (user: RosterDocument | undefined, repo: RosterDocument | undefined) => RosterDocument;
101
+ /** Only the named executors (`--executors a,b`); an empty list keeps all. */
102
+ export declare const narrowRoster: (document: RosterDocument, ids: ReadonlyArray<string>) => RosterDocument;
103
+ /**
104
+ * The exclusion a failure earns, or none. `recentRateLimits` holds the
105
+ * executor's rate-limit instants inside the window, this one included.
106
+ */
107
+ export declare const exclusionFor: (error: LlmError, spec: ExecutorSpec, now: number, recentRateLimits: number) => Exclusion | undefined;
108
+ export declare const describeExclusion: (exclusion: Exclusion) => string;
109
+ export interface RosterStateStoreShape {
110
+ readonly load: Effect.Effect<ReadonlyArray<Exclusion>, FlowError>;
111
+ /** Replaces the entries of `ids` with `exclusions`, keeping everyone else's. */
112
+ readonly save: (ids: ReadonlyArray<string>, exclusions: ReadonlyArray<Exclusion>) => Effect.Effect<void, FlowError>;
113
+ }
114
+ export declare const makeRosterStateStore: (files: PlainFileStoreShape, path: string) => RosterStateStoreShape;
115
+ export interface Lease {
116
+ readonly executor: ExecutorSpec;
117
+ readonly role: Role;
118
+ /** Frees the slot; idempotent, and also run when the lease's scope closes. */
119
+ readonly release: Effect.Effect<void>;
120
+ }
121
+ export interface LeaseOptions {
122
+ /** Executors this lease must not use (independence, or a handover away from one). */
123
+ readonly avoid?: ReadonlyArray<string>;
124
+ /** Taken first while free: the executor a resumed context held before. */
125
+ readonly prefer?: string;
126
+ /** Who is asking, for the events (a story's worktree). */
127
+ readonly label?: string;
128
+ }
129
+ export interface ExecutorStatus {
130
+ readonly executor: ExecutorSpec;
131
+ readonly busy: number;
132
+ readonly busyCoders: number;
133
+ readonly exclusion?: Exclusion;
134
+ }
135
+ export interface RosterShape {
136
+ readonly executors: ReadonlyArray<ExecutorSpec>;
137
+ /** Waits for a slot; fails `RosterExhausted` when none can ever come. */
138
+ readonly lease: (role: Role, options?: LeaseOptions) => Effect.Effect<Lease, RosterExhausted, Scope.Scope>;
139
+ /** A slot now, or `undefined`. */
140
+ readonly tryLease: (role: Role, options?: LeaseOptions) => Effect.Effect<Lease | undefined, never, Scope.Scope>;
141
+ /** Whether an executor outside `avoid` has the role and is not out for the run. */
142
+ readonly canEverServe: (role: Role, avoid?: ReadonlyArray<string>) => Effect.Effect<boolean>;
143
+ /** Free slots for `role` now, across executors in the round. */
144
+ readonly available: (role: Role) => Effect.Effect<number>;
145
+ /** Configured slots for `role`. */
146
+ readonly slots: (role: Role) => number;
147
+ /** Classifies a failure of `id`'s call; returns the exclusion it earned, if any. */
148
+ readonly report: (id: string, error: LlmError) => Effect.Effect<Exclusion | undefined>;
149
+ readonly exclude: (exclusion: Exclusion) => Effect.Effect<void>;
150
+ readonly resume: (id: string) => Effect.Effect<void>;
151
+ readonly snapshot: Effect.Effect<ReadonlyArray<ExecutorStatus>>;
152
+ }
153
+ export interface RosterOptions {
154
+ readonly executors: ReadonlyArray<ExecutorSpec>;
155
+ readonly events: FlowEventsShape;
156
+ /** Exclusions that outlive a run; omit to keep them in memory. */
157
+ readonly state?: RosterStateStoreShape;
158
+ /** Answers whether a health URL is up; omit and `health` exclusions wait out the outage cooldown. */
159
+ readonly probe?: (url: string) => Effect.Effect<boolean>;
160
+ }
161
+ export declare const makeRoster: (options: RosterOptions) => Effect.Effect<RosterShape, 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 | import("./FlowError.ts").FlowLlmError | import("./FlowError.ts").FlowCapabilityDenied | import("./FlowError.ts").ColumnNotFound | import("./FlowError.ts").BudgetExceeded | import("./FlowError.ts").StoryPlanInvalid | import("./FlowError.ts").PerimeterViolation | import("./FlowError.ts").MissingDependency | import("./FlowError.ts").MergeConflict | import("./FlowError.ts").EpicCheckoutDirty | import("./FlowError.ts").RosterInvalid | RosterExhausted | import("./FlowError.ts").StoryFailed | import("./FlowError.ts").DecisionsInvalid | import("./FlowError.ts").OpenPointsPending | import("./FlowError.ts").ContractConflict, never>;
162
+ export {};
163
+ //# sourceMappingURL=Roster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Roster.d.ts","sourceRoot":"","sources":["../src/Roster.ts"],"names":[],"mappings":"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"}