@llm4ts/flow 2.16.0 → 2.18.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 (50) 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/CostLedger.d.ts +2 -2
  8. package/dist/CostLedger.d.ts.map +1 -1
  9. package/dist/CoverageLedger.d.ts +180 -0
  10. package/dist/CoverageLedger.d.ts.map +1 -0
  11. package/dist/CoverageLedger.js +415 -0
  12. package/dist/CoverageLedger.js.map +1 -0
  13. package/dist/EpicBrief.d.ts +239 -0
  14. package/dist/EpicBrief.d.ts.map +1 -0
  15. package/dist/EpicBrief.js +868 -0
  16. package/dist/EpicBrief.js.map +1 -0
  17. package/dist/Equiv.d.ts +3 -3
  18. package/dist/Equiv.d.ts.map +1 -1
  19. package/dist/Flow.d.ts +1 -1
  20. package/dist/Flow.d.ts.map +1 -1
  21. package/dist/FlowError.d.ts +23 -1
  22. package/dist/FlowError.d.ts.map +1 -1
  23. package/dist/FlowError.js +30 -1
  24. package/dist/FlowError.js.map +1 -1
  25. package/dist/Judgment.d.ts +2 -2
  26. package/dist/Judgment.d.ts.map +1 -1
  27. package/dist/Landing.d.ts +1 -1
  28. package/dist/Landing.d.ts.map +1 -1
  29. package/dist/Persistence.d.ts +2 -2
  30. package/dist/Persistence.d.ts.map +1 -1
  31. package/dist/PlanExecution.d.ts +1 -1
  32. package/dist/PlanExecution.d.ts.map +1 -1
  33. package/dist/ProgramJudge.d.ts +1 -1
  34. package/dist/ProgramJudge.d.ts.map +1 -1
  35. package/dist/Replay.d.ts +2 -2
  36. package/dist/Replay.d.ts.map +1 -1
  37. package/dist/Review.d.ts +3 -3
  38. package/dist/Review.d.ts.map +1 -1
  39. package/dist/ReviewCache.d.ts +1 -1
  40. package/dist/ReviewCache.d.ts.map +1 -1
  41. package/dist/Roster.d.ts +1 -1
  42. package/dist/Roster.d.ts.map +1 -1
  43. package/dist/RosterSeats.d.ts +1 -1
  44. package/dist/RosterSeats.d.ts.map +1 -1
  45. package/dist/Stories.d.ts +1 -1
  46. package/dist/Stories.d.ts.map +1 -1
  47. package/package.json +4 -2
  48. package/src/CoverageLedger.ts +549 -0
  49. package/src/EpicBrief.ts +1014 -0
  50. package/src/FlowError.ts +39 -1
@@ -0,0 +1,239 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import type { JsonSchema } from "@llm4ts/core/Models";
4
+ import { OpenPoint } from "./Decisions.ts";
5
+ import { EpicBriefInvalid } from "./FlowError.ts";
6
+ /**
7
+ * The epic brief: what `epic-design` writes and `epic-stories` plans from.
8
+ * The file is the state. It says what an epic delivers and, for every
9
+ * scenario of every legacy program it considered, whether that behaviour is
10
+ * carried over, dropped, already provided by the target, or deferred, each
11
+ * with its evidence in the extract pack (`PROGRAM › scenario title`). A human
12
+ * edits it, answers its open points, writes feedback, and approves it by
13
+ * setting `Status: approved`.
14
+ */
15
+ export declare const BriefStatus: Schema.Literals<readonly ["draft", "approved"]>;
16
+ export type BriefStatus = typeof BriefStatus.Type;
17
+ declare const Citation_base: Schema.Class<Citation, Schema.Struct<{
18
+ readonly program: Schema.String;
19
+ readonly scenario: Schema.String;
20
+ }>, {}>;
21
+ /** Legacy evidence: a scenario of a program, both named exactly as in the pack. */
22
+ export declare class Citation extends Citation_base {
23
+ }
24
+ declare const ScopeItem_base: Schema.Class<ScopeItem, Schema.Struct<{
25
+ readonly title: Schema.String;
26
+ readonly citations: Schema.$Array<typeof Citation>;
27
+ /** Why an item with no citation exists: behaviour with no legacy counterpart. */
28
+ readonly newBehaviour: Schema.optionalKey<Schema.String>;
29
+ }>, {}>;
30
+ export declare class ScopeItem extends ScopeItem_base {
31
+ }
32
+ declare const Disposed_base: Schema.Class<Disposed, Schema.Struct<{
33
+ readonly program: Schema.String;
34
+ readonly scenario: Schema.String;
35
+ readonly note: Schema.String;
36
+ }>, {}>;
37
+ /** A scenario not carried over; `note` is the reason (dropped), the pointer (provided) or the note (deferred). */
38
+ export declare class Disposed extends Disposed_base {
39
+ }
40
+ declare const ConsideredProgram_base: Schema.Class<ConsideredProgram, Schema.Struct<{
41
+ readonly name: Schema.String;
42
+ readonly reason: Schema.String;
43
+ }>, {}>;
44
+ export declare class ConsideredProgram extends ConsideredProgram_base {
45
+ }
46
+ declare const EpicBrief_base: Schema.Class<EpicBrief, Schema.Struct<{
47
+ readonly epicId: Schema.String;
48
+ readonly status: Schema.Literals<readonly ["draft", "approved"]>;
49
+ /** The epic as the user asked for it; becomes the story plan's `epic`. */
50
+ readonly request: Schema.String;
51
+ readonly legacy: Schema.String;
52
+ readonly goal: Schema.String;
53
+ readonly programs: Schema.$Array<typeof ConsideredProgram>;
54
+ readonly scope: Schema.$Array<typeof ScopeItem>;
55
+ readonly dropped: Schema.$Array<typeof Disposed>;
56
+ readonly provided: Schema.$Array<typeof Disposed>;
57
+ readonly deferred: Schema.$Array<typeof Disposed>;
58
+ readonly constraints: Schema.String;
59
+ readonly openPoints: Schema.$Array<typeof OpenPoint>;
60
+ readonly feedback: Schema.String;
61
+ }>, {}>;
62
+ export declare class EpicBrief extends EpicBrief_base {
63
+ }
64
+ /** Open points with no answer, or an empty one. */
65
+ export declare const unanswered: (brief: EpicBrief) => ReadonlyArray<OpenPoint>;
66
+ export declare const renderEpicBrief: (brief: EpicBrief) => string;
67
+ export declare const parseEpicBrief: (markdown: string, path?: string | undefined) => Effect.Effect<EpicBrief, EpicBriefInvalid, never>;
68
+ /**
69
+ * The brief as the file can hold it. A model's proposal may carry a newline
70
+ * in a title, a `## ` line in the goal, an unclosed fence; written as they
71
+ * are, those would parse back as something else on the next run. Fields that
72
+ * live on one line are folded onto one, prose is made safe for the section
73
+ * grammar, and nothing else changes.
74
+ */
75
+ export declare const normalizeBrief: (brief: EpicBrief) => EpicBrief;
76
+ export interface PackProgram {
77
+ readonly name: string;
78
+ /** The first paragraph of the program's spec. */
79
+ readonly summary: string;
80
+ readonly scenarios: ReadonlyArray<string>;
81
+ }
82
+ /** A disposition `modernize-refine` recorded in the legacy pack's decisions.md. */
83
+ export interface RefineDisposition {
84
+ readonly program: string;
85
+ /** Absent: the disposition covers every scenario of the program. */
86
+ readonly scenario?: string;
87
+ readonly disposition: "drop" | "provided" | "defer" | "wrap";
88
+ }
89
+ /** What the checks need from the extract pack, built by the flow from its files. */
90
+ export interface PackIndex {
91
+ readonly programs: ReadonlyArray<PackProgram>;
92
+ readonly refine: ReadonlyArray<RefineDisposition>;
93
+ }
94
+ export declare const BriefProblem: Schema.Union<readonly [Schema.Struct<{
95
+ readonly kind: Schema.Literal<"UnknownProgram">;
96
+ readonly program: Schema.String;
97
+ }>, Schema.Struct<{
98
+ readonly kind: Schema.Literal<"UnknownScenario">;
99
+ readonly program: Schema.String;
100
+ readonly scenario: Schema.String;
101
+ readonly closest: Schema.optionalKey<Schema.String>;
102
+ }>, Schema.Struct<{
103
+ readonly kind: Schema.Literal<"MissingPointer">;
104
+ readonly program: Schema.String;
105
+ readonly scenario: Schema.String;
106
+ readonly pointer: Schema.String;
107
+ }>, Schema.Struct<{
108
+ readonly kind: Schema.Literal<"MissingReason">;
109
+ readonly where: Schema.String;
110
+ }>, Schema.Struct<{
111
+ readonly kind: Schema.Literal<"DuplicateDisposition">;
112
+ readonly program: Schema.String;
113
+ readonly scenario: Schema.String;
114
+ readonly lists: Schema.$Array<Schema.String>;
115
+ }>, Schema.Struct<{
116
+ readonly kind: Schema.Literal<"Unaccounted">;
117
+ readonly program: Schema.String;
118
+ readonly scenario: Schema.String;
119
+ }>, Schema.Struct<{
120
+ readonly kind: Schema.Literal<"RefineConflict">;
121
+ readonly program: Schema.String;
122
+ readonly scenario: Schema.String;
123
+ readonly disposition: Schema.String;
124
+ }>, Schema.Struct<{
125
+ readonly kind: Schema.Literal<"AlreadyOwned">;
126
+ readonly program: Schema.String;
127
+ readonly scenario: Schema.String;
128
+ /** The approved epic that already has the scenario in scope. */
129
+ readonly epic: Schema.String;
130
+ }>, Schema.Struct<{
131
+ readonly kind: Schema.Literal<"ContradictsBrief">;
132
+ readonly program: Schema.String;
133
+ readonly scenario: Schema.String;
134
+ /** The approved epic that decided otherwise. */
135
+ readonly epic: Schema.String;
136
+ /** This brief's disposition, in words. */
137
+ readonly here: Schema.String;
138
+ /** The other epic's disposition, in words. */
139
+ readonly disposition: Schema.String;
140
+ }>, Schema.Struct<{
141
+ readonly kind: Schema.Literal<"ApprovedWithOpenPoints">;
142
+ readonly numbers: Schema.$Array<Schema.Int>;
143
+ }>]>;
144
+ export type BriefProblem = typeof BriefProblem.Type;
145
+ export declare const renderBriefProblem: (problem: BriefProblem) => string;
146
+ /** How a brief disposes of a scenario. */
147
+ export type BriefDisposition = "in-scope" | "dropped" | "provided" | "deferred";
148
+ export declare const dispositionWords: Readonly<Record<BriefDisposition, string>>;
149
+ /** What an approved brief of another epic decided about a scenario (the coverage ledger). */
150
+ export interface InheritedDecision {
151
+ readonly program: string;
152
+ readonly scenario: string;
153
+ readonly epic: string;
154
+ readonly disposition: BriefDisposition;
155
+ readonly note: string;
156
+ /** The epics this decision was kept against on purpose (`keep: <why>` in that brief). */
157
+ readonly keptAgainst?: ReadonlyArray<string>;
158
+ }
159
+ /**
160
+ * The one rule for two briefs on one scenario, read from the side of the
161
+ * brief that has `here`. A deferred scenario is free on either side; two
162
+ * briefs that agree are fine; both in scope is ownership shared or disputed;
163
+ * anything else is a contradiction. The ledger and the per-brief check both
164
+ * use it, so they cannot disagree about what a conflict is.
165
+ */
166
+ export declare const crossProblem: (program: string, scenario: string, here: BriefDisposition, other: {
167
+ readonly epic: string;
168
+ readonly disposition: BriefDisposition;
169
+ }) => BriefProblem | undefined;
170
+ /**
171
+ * Whether the brief overrides a check on purpose: the check's own `[check]`
172
+ * question, answered `keep: <why>`. Any other answer, or an answer to
173
+ * another question, overrides nothing.
174
+ */
175
+ export declare const hasOverride: (brief: EpicBrief, problem: BriefProblem) => boolean;
176
+ /** The pointers of the provided entries: what the caller verifies before checking. */
177
+ export declare const providedPointers: (brief: EpicBrief) => ReadonlyArray<string>;
178
+ export interface BriefCheckInputs {
179
+ readonly pack: PackIndex;
180
+ /** The provided pointers that were found in the target (or its pack). */
181
+ readonly pointers: ReadonlySet<string>;
182
+ /**
183
+ * What approved briefs of other epics decided (the coverage ledger). Their
184
+ * decisions are inherited: they count towards completeness, and deciding
185
+ * otherwise here is a problem. Absent: the brief is checked on its own.
186
+ */
187
+ readonly others?: ReadonlyArray<InheritedDecision>;
188
+ /** This brief's epic, as the other briefs name it. Default: the brief's own id. */
189
+ readonly epicId?: string;
190
+ }
191
+ /** Every problem of a brief against the pack, all at once; empty means acceptable. */
192
+ export declare const checkEpicBrief: (brief: EpicBrief, inputs: BriefCheckInputs) => ReadonlyArray<BriefProblem>;
193
+ declare const ProgramSelection_base: Schema.Class<ProgramSelection, Schema.Struct<{
194
+ readonly programs: Schema.$Array<typeof ConsideredProgram>;
195
+ }>, {}>;
196
+ /** The programs of the pack a request touches; the model's first typed reply. */
197
+ export declare class ProgramSelection extends ProgramSelection_base {
198
+ }
199
+ declare const EpicBriefProposal_base: Schema.Class<EpicBriefProposal, Schema.Struct<{
200
+ readonly goal: Schema.String;
201
+ readonly scope: Schema.$Array<typeof ScopeItem>;
202
+ readonly dropped: Schema.$Array<typeof Disposed>;
203
+ readonly provided: Schema.$Array<typeof Disposed>;
204
+ readonly deferred: Schema.$Array<typeof Disposed>;
205
+ readonly constraints: Schema.String;
206
+ /** Questions only a human can answer. */
207
+ readonly openPoints: Schema.$Array<Schema.String>;
208
+ }>, {}>;
209
+ /** The model's typed proposal for a brief; checked before anything is written. */
210
+ export declare class EpicBriefProposal extends EpicBriefProposal_base {
211
+ }
212
+ export declare const programSelectionJsonSchema: JsonSchema;
213
+ export declare const epicBriefProposalJsonSchema: JsonSchema;
214
+ export interface AssembleOptions {
215
+ readonly epicId: string;
216
+ readonly request: string;
217
+ readonly legacy: string;
218
+ readonly programs: ReadonlyArray<ConsideredProgram>;
219
+ readonly proposal: EpicBriefProposal;
220
+ /** The brief this one revises: its unanswered points the proposal did not restate are kept. */
221
+ readonly previous?: EpicBrief;
222
+ /** Problems the fix round could not clear: raised as `[check]` open points. */
223
+ readonly problems?: ReadonlyArray<BriefProblem>;
224
+ }
225
+ export declare const checkMark = "[check]";
226
+ /**
227
+ * The next draft: never approved, feedback consumed, open points renumbered.
228
+ * Answered points are folded in by the revision and go, except answered
229
+ * `[check]` points: those are the human overriding a check (a scenario
230
+ * refine dropped, kept on purpose) and stay as the record of it.
231
+ */
232
+ export declare const assembleBrief: (options: AssembleOptions) => EpicBrief;
233
+ export type LoopAction = "propose" | "revise" | "halt" | "await-approval" | "validate";
234
+ /** What one run does, decided from the file alone. */
235
+ export declare const loopAction: (brief: EpicBrief | undefined) => LoopAction;
236
+ /** What a revision changed, in lines a person reads; empty when nothing did. */
237
+ export declare const diffBriefs: (previous: EpicBrief | undefined, next: EpicBrief) => ReadonlyArray<string>;
238
+ export {};
239
+ //# sourceMappingURL=EpicBrief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EpicBrief.d.ts","sourceRoot":"","sources":["../src/EpicBrief.ts"],"names":[],"mappings":"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"}