@llm4ts/flow 0.1.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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/dist/AzureDevOpsTool.d.ts +60 -0
- package/dist/AzureDevOpsTool.d.ts.map +1 -0
- package/dist/AzureDevOpsTool.js +163 -0
- package/dist/AzureDevOpsTool.js.map +1 -0
- package/dist/Bench.d.ts +133 -0
- package/dist/Bench.d.ts.map +1 -0
- package/dist/Bench.js +272 -0
- package/dist/Bench.js.map +1 -0
- package/dist/BenchReport.d.ts +9 -0
- package/dist/BenchReport.d.ts.map +1 -0
- package/dist/BenchReport.js +360 -0
- package/dist/BenchReport.js.map +1 -0
- package/dist/CapabilityGuard.d.ts +6 -0
- package/dist/CapabilityGuard.d.ts.map +1 -0
- package/dist/CapabilityGuard.js +25 -0
- package/dist/CapabilityGuard.js.map +1 -0
- package/dist/Chat.d.ts +15 -0
- package/dist/Chat.d.ts.map +1 -0
- package/dist/Chat.js +36 -0
- package/dist/Chat.js.map +1 -0
- package/dist/Classified.d.ts +14 -0
- package/dist/Classified.d.ts.map +1 -0
- package/dist/Classified.js +48 -0
- package/dist/Classified.js.map +1 -0
- package/dist/CostLedger.d.ts +55 -0
- package/dist/CostLedger.d.ts.map +1 -0
- package/dist/CostLedger.js +126 -0
- package/dist/CostLedger.js.map +1 -0
- package/dist/CostTracker.d.ts +13 -0
- package/dist/CostTracker.d.ts.map +1 -0
- package/dist/CostTracker.js +116 -0
- package/dist/CostTracker.js.map +1 -0
- package/dist/Equiv.d.ts +163 -0
- package/dist/Equiv.d.ts.map +1 -0
- package/dist/Equiv.js +256 -0
- package/dist/Equiv.js.map +1 -0
- package/dist/EquivReport.d.ts +16 -0
- package/dist/EquivReport.d.ts.map +1 -0
- package/dist/EquivReport.js +77 -0
- package/dist/EquivReport.js.map +1 -0
- package/dist/Flow.d.ts +25 -0
- package/dist/Flow.d.ts.map +1 -0
- package/dist/Flow.js +39 -0
- package/dist/Flow.js.map +1 -0
- package/dist/FlowContext.d.ts +23 -0
- package/dist/FlowContext.d.ts.map +1 -0
- package/dist/FlowContext.js +4 -0
- package/dist/FlowContext.js.map +1 -0
- package/dist/FlowError.d.ts +80 -0
- package/dist/FlowError.d.ts.map +1 -0
- package/dist/FlowError.js +92 -0
- package/dist/FlowError.js.map +1 -0
- package/dist/FlowEvents.d.ts +101 -0
- package/dist/FlowEvents.d.ts.map +1 -0
- package/dist/FlowEvents.js +103 -0
- package/dist/FlowEvents.js.map +1 -0
- package/dist/FlowRecorder.d.ts +26 -0
- package/dist/FlowRecorder.d.ts.map +1 -0
- package/dist/FlowRecorder.js +74 -0
- package/dist/FlowRecorder.js.map +1 -0
- package/dist/GitHubTool.d.ts +53 -0
- package/dist/GitHubTool.d.ts.map +1 -0
- package/dist/GitHubTool.js +191 -0
- package/dist/GitHubTool.js.map +1 -0
- package/dist/GitTool.d.ts +46 -0
- package/dist/GitTool.d.ts.map +1 -0
- package/dist/GitTool.js +97 -0
- package/dist/GitTool.js.map +1 -0
- package/dist/Interaction.d.ts +21 -0
- package/dist/Interaction.d.ts.map +1 -0
- package/dist/Interaction.js +9 -0
- package/dist/Interaction.js.map +1 -0
- package/dist/McpServer.d.ts +18 -0
- package/dist/McpServer.d.ts.map +1 -0
- package/dist/McpServer.js +122 -0
- package/dist/McpServer.js.map +1 -0
- package/dist/Mermaid.d.ts +7 -0
- package/dist/Mermaid.d.ts.map +1 -0
- package/dist/Mermaid.js +98 -0
- package/dist/Mermaid.js.map +1 -0
- package/dist/Pack.d.ts +40 -0
- package/dist/Pack.d.ts.map +1 -0
- package/dist/Pack.js +141 -0
- package/dist/Pack.js.map +1 -0
- package/dist/Package.d.ts +2 -0
- package/dist/Package.d.ts.map +1 -0
- package/dist/Package.js +2 -0
- package/dist/Package.js.map +1 -0
- package/dist/Persistence.d.ts +32 -0
- package/dist/Persistence.d.ts.map +1 -0
- package/dist/Persistence.js +85 -0
- package/dist/Persistence.js.map +1 -0
- package/dist/Plan.d.ts +26 -0
- package/dist/Plan.d.ts.map +1 -0
- package/dist/Plan.js +101 -0
- package/dist/Plan.js.map +1 -0
- package/dist/PlanExecution.d.ts +7 -0
- package/dist/PlanExecution.d.ts.map +1 -0
- package/dist/PlanExecution.js +19 -0
- package/dist/PlanExecution.js.map +1 -0
- package/dist/Planner.d.ts +32 -0
- package/dist/Planner.d.ts.map +1 -0
- package/dist/Planner.js +97 -0
- package/dist/Planner.js.map +1 -0
- package/dist/PrSummary.d.ts +15 -0
- package/dist/PrSummary.d.ts.map +1 -0
- package/dist/PrSummary.js +29 -0
- package/dist/PrSummary.js.map +1 -0
- package/dist/PriceList.d.ts +11 -0
- package/dist/PriceList.d.ts.map +1 -0
- package/dist/PriceList.js +79 -0
- package/dist/PriceList.js.map +1 -0
- package/dist/Provenance.d.ts +27 -0
- package/dist/Provenance.d.ts.map +1 -0
- package/dist/Provenance.js +38 -0
- package/dist/Provenance.js.map +1 -0
- package/dist/Replay.d.ts +29 -0
- package/dist/Replay.d.ts.map +1 -0
- package/dist/Replay.js +181 -0
- package/dist/Replay.js.map +1 -0
- package/dist/Review.d.ts +71 -0
- package/dist/Review.d.ts.map +1 -0
- package/dist/Review.js +204 -0
- package/dist/Review.js.map +1 -0
- package/dist/ReviewCache.d.ts +6 -0
- package/dist/ReviewCache.d.ts.map +1 -0
- package/dist/ReviewCache.js +28 -0
- package/dist/ReviewCache.js.map +1 -0
- package/dist/Reviewer.d.ts +12 -0
- package/dist/Reviewer.d.ts.map +1 -0
- package/dist/Reviewer.js +30 -0
- package/dist/Reviewer.js.map +1 -0
- package/dist/SpecChecks.d.ts +17 -0
- package/dist/SpecChecks.d.ts.map +1 -0
- package/dist/SpecChecks.js +107 -0
- package/dist/SpecChecks.js.map +1 -0
- package/dist/Survey.d.ts +32 -0
- package/dist/Survey.d.ts.map +1 -0
- package/dist/Survey.js +119 -0
- package/dist/Survey.js.map +1 -0
- package/dist/TransientRetry.d.ts +16 -0
- package/dist/TransientRetry.d.ts.map +1 -0
- package/dist/TransientRetry.js +102 -0
- package/dist/TransientRetry.js.map +1 -0
- package/dist/Workspace.d.ts +39 -0
- package/dist/Workspace.d.ts.map +1 -0
- package/dist/Workspace.js +192 -0
- package/dist/Workspace.js.map +1 -0
- package/dist/WorkspaceLayout.d.ts +3 -0
- package/dist/WorkspaceLayout.d.ts.map +1 -0
- package/dist/WorkspaceLayout.js +19 -0
- package/dist/WorkspaceLayout.js.map +1 -0
- package/dist/WorkspaceTools.d.ts +4 -0
- package/dist/WorkspaceTools.d.ts.map +1 -0
- package/dist/WorkspaceTools.js +130 -0
- package/dist/WorkspaceTools.js.map +1 -0
- package/package.json +91 -0
- package/src/AzureDevOpsTool.ts +291 -0
- package/src/Bench.ts +340 -0
- package/src/BenchReport.ts +447 -0
- package/src/CapabilityGuard.ts +43 -0
- package/src/Chat.ts +60 -0
- package/src/Classified.ts +67 -0
- package/src/CostLedger.ts +171 -0
- package/src/CostTracker.ts +170 -0
- package/src/Equiv.ts +378 -0
- package/src/EquivReport.ts +92 -0
- package/src/Flow.ts +72 -0
- package/src/FlowContext.ts +23 -0
- package/src/FlowError.ts +112 -0
- package/src/FlowEvents.ts +147 -0
- package/src/FlowRecorder.ts +116 -0
- package/src/GitHubTool.ts +315 -0
- package/src/GitTool.ts +214 -0
- package/src/Interaction.ts +23 -0
- package/src/McpServer.ts +168 -0
- package/src/Mermaid.ts +112 -0
- package/src/Pack.ts +213 -0
- package/src/Package.ts +1 -0
- package/src/Persistence.ts +198 -0
- package/src/Plan.ts +119 -0
- package/src/PlanExecution.ts +46 -0
- package/src/Planner.ts +134 -0
- package/src/PrSummary.ts +37 -0
- package/src/PriceList.ts +91 -0
- package/src/Provenance.ts +85 -0
- package/src/Replay.ts +265 -0
- package/src/Review.ts +337 -0
- package/src/ReviewCache.ts +45 -0
- package/src/Reviewer.ts +31 -0
- package/src/SpecChecks.ts +143 -0
- package/src/Survey.ts +144 -0
- package/src/TransientRetry.ts +238 -0
- package/src/Workspace.ts +255 -0
- package/src/WorkspaceLayout.ts +22 -0
- package/src/WorkspaceTools.ts +188 -0
package/dist/Mermaid.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { StageCompleted, StageFailed, StageStarted } from "./FlowEvents.js";
|
|
2
|
+
const escapeLabel = (label) => label.replaceAll('"', "'");
|
|
3
|
+
export const renderMermaid = (events) => {
|
|
4
|
+
const starts = events
|
|
5
|
+
.filter((event) => event._tag === "StageStarted")
|
|
6
|
+
.map((event) => event.stage);
|
|
7
|
+
const failed = new Set(events
|
|
8
|
+
.filter((event) => event._tag === "StageFailed")
|
|
9
|
+
.map((event) => event.stage));
|
|
10
|
+
if (starts.length === 0) {
|
|
11
|
+
return 'flowchart TD\n none["(no stages)"]';
|
|
12
|
+
}
|
|
13
|
+
const order = [...new Set(starts)];
|
|
14
|
+
const counts = new Map();
|
|
15
|
+
for (const stage of starts) {
|
|
16
|
+
counts.set(stage, (counts.get(stage) ?? 0) + 1);
|
|
17
|
+
}
|
|
18
|
+
const ids = new Map();
|
|
19
|
+
order.forEach((name, index) => ids.set(name, `n${index}`));
|
|
20
|
+
const nodes = order.map((name) => {
|
|
21
|
+
const count = counts.get(name) ?? 1;
|
|
22
|
+
const label = count > 1 ? `${name} ×${count}` : name;
|
|
23
|
+
return ` ${ids.get(name)}["${escapeLabel(label)}"]${failed.has(name) ? ":::failed" : ""}`;
|
|
24
|
+
});
|
|
25
|
+
const edges = order
|
|
26
|
+
.slice(1)
|
|
27
|
+
.map((name, index) => ` ${ids.get(order[index] ?? "")} --> ${ids.get(name)}`);
|
|
28
|
+
const styles = failed.size === 0 ? [] : [" classDef failed fill:#fdd,stroke:#c00,color:#900;"];
|
|
29
|
+
return ["flowchart TD", ...nodes, ...edges, ...styles].join("\n");
|
|
30
|
+
};
|
|
31
|
+
const traceStage = (line) => {
|
|
32
|
+
const field = (key) => {
|
|
33
|
+
const direct = line.fields[key];
|
|
34
|
+
if (typeof direct === "string") {
|
|
35
|
+
return direct;
|
|
36
|
+
}
|
|
37
|
+
const encoded = line.fields.event;
|
|
38
|
+
if (typeof encoded !== "string") {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const event = JSON.parse(encoded);
|
|
43
|
+
if (typeof event !== "object" || event === null) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const value = Reflect.get(event, key);
|
|
47
|
+
return typeof value === "string" ? value : undefined;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
switch (line.kind) {
|
|
54
|
+
case "StageStarted": {
|
|
55
|
+
const stage = field("stage");
|
|
56
|
+
return stage === undefined ? undefined : StageStarted.make({ stage });
|
|
57
|
+
}
|
|
58
|
+
case "StageCompleted": {
|
|
59
|
+
const stage = field("stage");
|
|
60
|
+
return stage === undefined ? undefined : StageCompleted.make({ stage });
|
|
61
|
+
}
|
|
62
|
+
case "StageFailed": {
|
|
63
|
+
const stage = field("stage");
|
|
64
|
+
return stage === undefined
|
|
65
|
+
? undefined
|
|
66
|
+
: StageFailed.make({ stage, message: field("message") ?? "" });
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export const renderMermaidTrace = (lines) => renderMermaid(lines.flatMap((line) => {
|
|
73
|
+
const event = traceStage(line);
|
|
74
|
+
return event === undefined ? [] : [event];
|
|
75
|
+
}));
|
|
76
|
+
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
77
|
+
const base64Url = (value) => {
|
|
78
|
+
const bytes = new TextEncoder().encode(value);
|
|
79
|
+
let encoded = "";
|
|
80
|
+
for (let index = 0; index < bytes.length; index += 3) {
|
|
81
|
+
const first = bytes[index] ?? 0;
|
|
82
|
+
const second = bytes[index + 1];
|
|
83
|
+
const third = bytes[index + 2];
|
|
84
|
+
const block = (first << 16) | ((second ?? 0) << 8) | (third ?? 0);
|
|
85
|
+
encoded += alphabet[(block >> 18) & 63];
|
|
86
|
+
encoded += alphabet[(block >> 12) & 63];
|
|
87
|
+
if (second !== undefined) {
|
|
88
|
+
encoded += alphabet[(block >> 6) & 63];
|
|
89
|
+
}
|
|
90
|
+
if (third !== undefined) {
|
|
91
|
+
encoded += alphabet[block & 63];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return encoded;
|
|
95
|
+
};
|
|
96
|
+
export const mermaidLiveUrl = (diagram) => `https://mermaid.ink/svg/${base64Url(diagram)}`;
|
|
97
|
+
export const mermaidDocument = (diagram) => `\`\`\`mermaid\n${diagram}\n\`\`\`\n\n[View on mermaid.ink](${mermaidLiveUrl(diagram)})\n`;
|
|
98
|
+
//# sourceMappingURL=Mermaid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mermaid.js","sourceRoot":"","sources":["../src/Mermaid.ts"],"names":[],"mappings":"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"}
|
package/dist/Pack.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { Dimension } from "@llm4ts/core/eval/Eval";
|
|
4
|
+
import { PlanParseError } from "./FlowError.ts";
|
|
5
|
+
import { type Reviewer } from "./Reviewer.ts";
|
|
6
|
+
import { CoverageRule } from "./SpecChecks.ts";
|
|
7
|
+
import type { WorkspaceError, WorkspaceShape } from "./Workspace.ts";
|
|
8
|
+
export { Reviewer, parseReviewer } from "./Reviewer.ts";
|
|
9
|
+
export declare const ComparisonOrdering: Schema.Literals<readonly ["Ordered", "Unordered", "PerKey"]>;
|
|
10
|
+
export type ComparisonOrdering = typeof ComparisonOrdering.Type;
|
|
11
|
+
declare const ComparisonPolicy_base: Schema.Class<ComparisonPolicy, Schema.Struct<{
|
|
12
|
+
readonly ordering: Schema.Literals<readonly ["Ordered", "Unordered", "PerKey"]>;
|
|
13
|
+
readonly ignore: Schema.$ReadonlySet<Schema.String>;
|
|
14
|
+
}>, {}>;
|
|
15
|
+
export declare class ComparisonPolicy extends ComparisonPolicy_base {
|
|
16
|
+
}
|
|
17
|
+
export interface Pack {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly source: string;
|
|
20
|
+
readonly scaffold: string | undefined;
|
|
21
|
+
readonly sources: string | undefined;
|
|
22
|
+
readonly programs: string | undefined;
|
|
23
|
+
readonly specsDir: string;
|
|
24
|
+
readonly featuresDir: string;
|
|
25
|
+
readonly gates: Readonly<Record<string, ReadonlyArray<string>>>;
|
|
26
|
+
readonly replay: ReadonlyArray<string> | undefined;
|
|
27
|
+
readonly equivalence: ComparisonPolicy;
|
|
28
|
+
readonly judgeDimensions: ReadonlyArray<Dimension>;
|
|
29
|
+
readonly coverage: ReadonlyArray<CoverageRule>;
|
|
30
|
+
readonly survey: ReadonlyArray<CoverageRule>;
|
|
31
|
+
readonly prompts: Readonly<Record<string, string>>;
|
|
32
|
+
readonly lenses: ReadonlyArray<Reviewer>;
|
|
33
|
+
readonly lessons: string | undefined;
|
|
34
|
+
readonly dir: string;
|
|
35
|
+
readonly gate: (name: string) => ReadonlyArray<string> | undefined;
|
|
36
|
+
readonly prompt: (name: string) => string | undefined;
|
|
37
|
+
}
|
|
38
|
+
export declare const loadPack: (workspace: WorkspaceShape, directory: string) => Effect.Effect<Pack, PlanParseError | WorkspaceError, never>;
|
|
39
|
+
export declare const appendPackLesson: (workspace: WorkspaceShape, directory: string, lesson: string) => Effect.Effect<void, WorkspaceError>;
|
|
40
|
+
//# sourceMappingURL=Pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pack.d.ts","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvD,eAAO,MAAM,kBAAkB,8DAAsD,CAAA;AACrF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAA;;;;;AAE/D,qBAAa,gBAAiB,SAAQ,qBAGpC;CAAG;AAEL,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClD,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CACtD;AA+GD,eAAO,MAAM,QAAQ,+GAwDnB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,WAAW,cAAc,EACzB,WAAW,MAAM,EACjB,QAAQ,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CACgC,CAAA"}
|
package/dist/Pack.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { Dimension } from "@llm4ts/core/eval/Eval";
|
|
4
|
+
import { PlanParseError } from "./FlowError.js";
|
|
5
|
+
import { parseReviewer } from "./Reviewer.js";
|
|
6
|
+
import { CoverageRule } from "./SpecChecks.js";
|
|
7
|
+
export { Reviewer, parseReviewer } from "./Reviewer.js";
|
|
8
|
+
export const ComparisonOrdering = Schema.Literals(["Ordered", "Unordered", "PerKey"]);
|
|
9
|
+
export class ComparisonPolicy extends Schema.Class("ComparisonPolicy")({
|
|
10
|
+
ordering: ComparisonOrdering,
|
|
11
|
+
ignore: Schema.ReadonlySet(Schema.String)
|
|
12
|
+
}) {
|
|
13
|
+
}
|
|
14
|
+
const parseManifest = (markdown) => {
|
|
15
|
+
const chunks = markdown
|
|
16
|
+
.trim()
|
|
17
|
+
.split(/^(?=## )/m)
|
|
18
|
+
.map((chunk) => chunk.trim())
|
|
19
|
+
.filter((chunk) => chunk.length > 0);
|
|
20
|
+
const head = chunks[0];
|
|
21
|
+
const prefix = "# Pack: ";
|
|
22
|
+
if (head === undefined || !head.startsWith(prefix)) {
|
|
23
|
+
return Effect.fail(PlanParseError.make({
|
|
24
|
+
message: `expected a '${prefix}<name>' header`
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
const lines = head.split(/\r?\n/);
|
|
28
|
+
const fields = Object.fromEntries(lines.slice(1).flatMap((line) => {
|
|
29
|
+
const index = line.indexOf(":");
|
|
30
|
+
return index < 0 || line.trim().startsWith("#") || line.trim().startsWith("-")
|
|
31
|
+
? []
|
|
32
|
+
: [[line.slice(0, index).trim(), line.slice(index + 1).trim()]];
|
|
33
|
+
}));
|
|
34
|
+
return fields.source === undefined
|
|
35
|
+
? Effect.fail(PlanParseError.make({
|
|
36
|
+
message: "pack manifest is missing a 'source:' field"
|
|
37
|
+
}))
|
|
38
|
+
: Effect.succeed({
|
|
39
|
+
name: lines[0]?.slice(prefix.length).trim() ?? "",
|
|
40
|
+
fields,
|
|
41
|
+
sections: chunks.slice(1)
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
const section = (sections, title) => sections
|
|
45
|
+
.find((candidate) => candidate.split(/\r?\n/)[0]?.trim() === `## ${title}`)
|
|
46
|
+
?.split(/\r?\n/)
|
|
47
|
+
.slice(1)
|
|
48
|
+
.join("\n")
|
|
49
|
+
.trim();
|
|
50
|
+
const namedItems = (body) => Object.fromEntries((body ?? "").split(/\r?\n/).flatMap((line) => {
|
|
51
|
+
const match = /^- ([^:]+): (.+)$/.exec(line);
|
|
52
|
+
return match?.[1] === undefined || match[2] === undefined
|
|
53
|
+
? []
|
|
54
|
+
: [[match[1].trim(), match[2].trim()]];
|
|
55
|
+
}));
|
|
56
|
+
const rules = (sections, prefix) => sections.flatMap((candidate) => {
|
|
57
|
+
const lines = candidate.split(/\r?\n/);
|
|
58
|
+
const heading = lines[0]?.trim() ?? "";
|
|
59
|
+
if (!heading.startsWith(prefix)) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const fields = Object.fromEntries(lines.slice(1).flatMap((line) => {
|
|
63
|
+
const index = line.indexOf(":");
|
|
64
|
+
return index < 0 ? [] : [[line.slice(0, index).trim(), line.slice(index + 1).trim()]];
|
|
65
|
+
}));
|
|
66
|
+
return fields.files === undefined || fields.unit === undefined
|
|
67
|
+
? []
|
|
68
|
+
: [
|
|
69
|
+
CoverageRule.make({
|
|
70
|
+
name: heading.slice(prefix.length).trim(),
|
|
71
|
+
files: fields.files,
|
|
72
|
+
unit: fields.unit
|
|
73
|
+
})
|
|
74
|
+
];
|
|
75
|
+
});
|
|
76
|
+
const dimensions = (body) => (body ?? "").split(/\r?\n/).flatMap((line) => {
|
|
77
|
+
const match = /^- ([^(]+)\(0\.\.(\d+)\): (.+)$/.exec(line);
|
|
78
|
+
const name = match?.[1]?.trim();
|
|
79
|
+
const maxScore = Number.parseInt(match?.[2] ?? "", 10);
|
|
80
|
+
const rubric = match?.[3]?.trim();
|
|
81
|
+
return name === undefined || rubric === undefined || !Number.isInteger(maxScore)
|
|
82
|
+
? []
|
|
83
|
+
: [Dimension.make({ name, rubric, maxScore })];
|
|
84
|
+
});
|
|
85
|
+
const markdownSidecars = Effect.fn("@llm4ts/flow/Pack.markdownSidecars")(function* (workspace, directory) {
|
|
86
|
+
const paths = yield* workspace.discover(`${directory}/*.md`);
|
|
87
|
+
const entries = [];
|
|
88
|
+
for (const path of paths) {
|
|
89
|
+
const file = path.split("/").at(-1) ?? path;
|
|
90
|
+
entries.push([file.replace(/\.md$/, ""), (yield* workspace.read(path)).trim()]);
|
|
91
|
+
}
|
|
92
|
+
return Object.fromEntries(entries);
|
|
93
|
+
});
|
|
94
|
+
export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (workspace, directory) {
|
|
95
|
+
const manifest = yield* parseManifest(yield* workspace.read(`${directory}/pack.md`));
|
|
96
|
+
const prompts = yield* markdownSidecars(workspace, `${directory}/prompts`);
|
|
97
|
+
const lensFiles = yield* markdownSidecars(workspace, `${directory}/reviewers`);
|
|
98
|
+
const lessons = yield* workspace.read(`${directory}/lessons.md`).pipe(Effect.map((text) => text.trim()), Effect.catch(() => Effect.succeed(undefined)));
|
|
99
|
+
const gateValues = namedItems(section(manifest.sections, "Gates"));
|
|
100
|
+
const equivalenceValues = namedItems(section(manifest.sections, "Equivalence"));
|
|
101
|
+
const ordering = equivalenceValues.ordering?.toLowerCase() === "unordered"
|
|
102
|
+
? "Unordered"
|
|
103
|
+
: equivalenceValues.ordering?.toLowerCase() === "per-key"
|
|
104
|
+
? "PerKey"
|
|
105
|
+
: "Ordered";
|
|
106
|
+
const gates = Object.fromEntries(Object.entries(gateValues).map(([name, command]) => [name, command.split(/\s+/)]));
|
|
107
|
+
const lenses = Object.entries(lensFiles)
|
|
108
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
109
|
+
.map(([name, text]) => parseReviewer(name, text));
|
|
110
|
+
const fields = manifest.fields;
|
|
111
|
+
const pack = {
|
|
112
|
+
name: manifest.name,
|
|
113
|
+
source: fields.source ?? "",
|
|
114
|
+
scaffold: fields.scaffold,
|
|
115
|
+
sources: fields.sources,
|
|
116
|
+
programs: fields.programs,
|
|
117
|
+
specsDir: fields["specs-dir"] ?? "docs/specs",
|
|
118
|
+
featuresDir: fields["features-dir"] ?? "features",
|
|
119
|
+
gates,
|
|
120
|
+
replay: fields.replay?.split(/\s+/),
|
|
121
|
+
equivalence: ComparisonPolicy.make({
|
|
122
|
+
ordering,
|
|
123
|
+
ignore: new Set((equivalenceValues.ignore ?? "")
|
|
124
|
+
.split(",")
|
|
125
|
+
.map((item) => item.trim())
|
|
126
|
+
.filter((item) => item.length > 0))
|
|
127
|
+
}),
|
|
128
|
+
judgeDimensions: dimensions(section(manifest.sections, "Judge")),
|
|
129
|
+
coverage: rules(manifest.sections, "## Coverage: "),
|
|
130
|
+
survey: rules(manifest.sections, "## Survey: "),
|
|
131
|
+
prompts,
|
|
132
|
+
lenses,
|
|
133
|
+
lessons: lessons === undefined || lessons.length === 0 ? undefined : lessons,
|
|
134
|
+
dir: directory,
|
|
135
|
+
gate: (name) => gates[name],
|
|
136
|
+
prompt: (name) => prompts[name]
|
|
137
|
+
};
|
|
138
|
+
return pack;
|
|
139
|
+
});
|
|
140
|
+
export const appendPackLesson = (workspace, directory, lesson) => workspace.append(`${directory}/lessons.md`, `- ${lesson.trim()}\n`);
|
|
141
|
+
//# sourceMappingURL=Pack.js.map
|
package/dist/Pack.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pack.js","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Package.d.ts","sourceRoot":"","sources":["../src/Package.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,iBAAiB,CAAA"}
|
package/dist/Package.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Package.js","sourceRoot":"","sources":["../src/Package.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Schema from "effect/Schema";
|
|
4
|
+
import { PersistenceError, PlanParseError, UnsupportedSchemaVersion } from "./FlowError.ts";
|
|
5
|
+
import type { Plan } from "./Plan.ts";
|
|
6
|
+
export interface PlainFileStoreShape {
|
|
7
|
+
readonly read: (path: string) => Effect.Effect<string | undefined, PersistenceError>;
|
|
8
|
+
readonly writeAtomic: (path: string, contents: string) => Effect.Effect<void, PersistenceError>;
|
|
9
|
+
readonly append: (path: string, contents: string) => Effect.Effect<void, PersistenceError>;
|
|
10
|
+
readonly remove: (path: string) => Effect.Effect<void, PersistenceError>;
|
|
11
|
+
readonly hashSha256: (path: string) => Effect.Effect<string, PersistenceError>;
|
|
12
|
+
}
|
|
13
|
+
declare const PlainFileStore_base: Context.ServiceClass<PlainFileStore, "@llm4ts/flow/PlainFileStore", PlainFileStoreShape>;
|
|
14
|
+
export declare class PlainFileStore extends PlainFileStore_base {
|
|
15
|
+
}
|
|
16
|
+
export interface MemoryPlainFileStore {
|
|
17
|
+
readonly store: PlainFileStoreShape;
|
|
18
|
+
readonly files: Effect.Effect<Readonly<Record<string, string>>>;
|
|
19
|
+
readonly replace: (files: Readonly<Record<string, string>>) => Effect.Effect<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare const makeMemoryPlainFileStore: (initial?: Readonly<Record<string, string>>) => Effect.Effect<MemoryPlainFileStore>;
|
|
22
|
+
export interface PlanStoreShape {
|
|
23
|
+
readonly save: (path: string, plan: Plan) => Effect.Effect<void, PersistenceError>;
|
|
24
|
+
readonly load: (path: string) => Effect.Effect<Plan | undefined, PersistenceError | PlanParseError>;
|
|
25
|
+
readonly remove: (path: string) => Effect.Effect<void, PersistenceError>;
|
|
26
|
+
readonly recoverOrCreate: <E, R>(path: string, create: Effect.Effect<Plan, E, R>) => Effect.Effect<Plan, E | PersistenceError | PlanParseError, R>;
|
|
27
|
+
}
|
|
28
|
+
export declare const makePlanStore: (files: PlainFileStoreShape) => PlanStoreShape;
|
|
29
|
+
export declare const saveVersioned: <A, E, RD, RE>(files: PlainFileStoreShape, path: string, schemaVersion: number, schema: Schema.ConstraintCodec<A, E, RD, RE>, value: A) => Effect.Effect<void, PersistenceError | PlanParseError | 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").BudgetExceeded, RE>;
|
|
30
|
+
export declare const loadVersioned: <A, E, RD, RE>(files: PlainFileStoreShape, path: string, expectedVersion: number, schema: Schema.ConstraintCodec<A, E, RD, RE>) => Effect.Effect<A | undefined, PersistenceError | PlanParseError | 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").BudgetExceeded, RD>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=Persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Persistence.d.ts","sourceRoot":"","sources":["../src/Persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Ref from "effect/Ref";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { PersistenceError, PlanParseError, UnsupportedSchemaVersion } from "./FlowError.js";
|
|
6
|
+
import { parsePlan } from "./Plan.js";
|
|
7
|
+
export class PlainFileStore extends Context.Service()("@llm4ts/flow/PlainFileStore") {
|
|
8
|
+
}
|
|
9
|
+
const hexDigest = (buffer) => Array.from(new Uint8Array(buffer))
|
|
10
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
11
|
+
.join("");
|
|
12
|
+
const sha256Hex = (path, contents) => Effect.tryPromise({
|
|
13
|
+
try: async () => hexDigest(await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(contents))),
|
|
14
|
+
catch: (error) => PersistenceError.make({
|
|
15
|
+
message: `failed to hash ${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
16
|
+
cause: error
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
export const makeMemoryPlainFileStore = (initial = {}) => Ref.make(initial).pipe(Effect.map((state) => {
|
|
20
|
+
const store = {
|
|
21
|
+
read: (path) => Ref.get(state).pipe(Effect.map((files) => files[path])),
|
|
22
|
+
writeAtomic: (path, contents) => Ref.update(state, (files) => ({ ...files, [path]: contents })),
|
|
23
|
+
append: (path, contents) => Ref.update(state, (files) => ({
|
|
24
|
+
...files,
|
|
25
|
+
[path]: `${files[path] ?? ""}${contents}`
|
|
26
|
+
})),
|
|
27
|
+
remove: (path) => Ref.update(state, (files) => Object.fromEntries(Object.entries(files).filter(([candidate]) => candidate !== path))),
|
|
28
|
+
hashSha256: (path) => Ref.get(state).pipe(Effect.flatMap((files) => {
|
|
29
|
+
const contents = files[path];
|
|
30
|
+
return contents === undefined
|
|
31
|
+
? Effect.fail(PersistenceError.make({
|
|
32
|
+
message: `failed to hash ${path}: file does not exist`
|
|
33
|
+
}))
|
|
34
|
+
: sha256Hex(path, contents);
|
|
35
|
+
}))
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
store,
|
|
39
|
+
files: Ref.get(state),
|
|
40
|
+
replace: (files) => Ref.set(state, files)
|
|
41
|
+
};
|
|
42
|
+
}));
|
|
43
|
+
export const makePlanStore = (files) => {
|
|
44
|
+
const save = (path, plan) => files.writeAtomic(path, plan.render);
|
|
45
|
+
const load = (path) => Effect.flatMap(files.read(path), (contents) => contents === undefined
|
|
46
|
+
? Effect.succeed(undefined)
|
|
47
|
+
: parsePlan(contents).pipe(Effect.map((plan) => plan)));
|
|
48
|
+
const recoverOrCreate = (path, create) => Effect.flatMap(load(path), (stored) => stored === undefined ? Effect.tap(create, (plan) => save(path, plan)) : Effect.succeed(stored));
|
|
49
|
+
return {
|
|
50
|
+
save,
|
|
51
|
+
load,
|
|
52
|
+
remove: files.remove,
|
|
53
|
+
recoverOrCreate
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
const VersionedEnvelope = Schema.Struct({
|
|
57
|
+
schemaVersion: Schema.Int,
|
|
58
|
+
value: Schema.Unknown
|
|
59
|
+
});
|
|
60
|
+
export const saveVersioned = Effect.fn("@llm4ts/flow/Persistence.saveVersioned")(function* (files, path, schemaVersion, schema, value) {
|
|
61
|
+
const encoded = yield* Schema.encodeEffect(schema)(value).pipe(Effect.mapError((error) => PlanParseError.make({
|
|
62
|
+
message: `failed to encode versioned document ${path}: ${String(error)}`
|
|
63
|
+
})));
|
|
64
|
+
yield* files.writeAtomic(path, `${JSON.stringify({ schemaVersion, value: encoded }, undefined, 2)}\n`);
|
|
65
|
+
});
|
|
66
|
+
export const loadVersioned = Effect.fn("@llm4ts/flow/Persistence.loadVersioned")(function* (files, path, expectedVersion, schema) {
|
|
67
|
+
const contents = yield* files.read(path);
|
|
68
|
+
if (contents === undefined) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const envelope = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(VersionedEnvelope))(contents).pipe(Effect.mapError((error) => PlanParseError.make({
|
|
72
|
+
message: `malformed versioned document ${path}: ${String(error)}`
|
|
73
|
+
})));
|
|
74
|
+
if (envelope.schemaVersion !== expectedVersion) {
|
|
75
|
+
return yield* UnsupportedSchemaVersion.make({
|
|
76
|
+
path,
|
|
77
|
+
expected: expectedVersion,
|
|
78
|
+
actual: envelope.schemaVersion
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return yield* Schema.decodeUnknownEffect(schema)(envelope.value).pipe(Effect.mapError((error) => PlanParseError.make({
|
|
82
|
+
message: `invalid versioned document ${path}: ${String(error)}`
|
|
83
|
+
})));
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=Persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Persistence.js","sourceRoot":"","sources":["../src/Persistence.ts"],"names":[],"mappings":"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"}
|
package/dist/Plan.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { PlanParseError } from "./FlowError.ts";
|
|
4
|
+
declare const Task_base: Schema.Class<Task, Schema.Struct<{
|
|
5
|
+
readonly title: Schema.String;
|
|
6
|
+
readonly description: Schema.String;
|
|
7
|
+
readonly completed: Schema.withConstructorDefault<Schema.Boolean>;
|
|
8
|
+
}>, {}>;
|
|
9
|
+
export declare class Task extends Task_base {
|
|
10
|
+
}
|
|
11
|
+
declare const Plan_base: Schema.Class<Plan, Schema.Struct<{
|
|
12
|
+
readonly epicId: Schema.String;
|
|
13
|
+
readonly tasks: Schema.$Array<typeof Task>;
|
|
14
|
+
readonly brief: Schema.optionalKey<Schema.String>;
|
|
15
|
+
}>, {}>;
|
|
16
|
+
export declare class Plan extends Plan_base {
|
|
17
|
+
get nextIncomplete(): Task | undefined;
|
|
18
|
+
complete(title: string): Plan;
|
|
19
|
+
taskPrompt(task: Task): string;
|
|
20
|
+
get render(): string;
|
|
21
|
+
}
|
|
22
|
+
export declare const stableHash: (input: string) => string;
|
|
23
|
+
export declare const defaultPlanPath: (prompt: string, directory?: string) => string;
|
|
24
|
+
export declare const parsePlan: (markdown: string) => Effect.Effect<Plan, PlanParseError, never>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=Plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plan.d.ts","sourceRoot":"","sources":["../src/Plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;AAE/C,qBAAa,IAAK,SAAQ,SAIxB;CAAG;;;;;;AAEL,qBAAa,IAAK,SAAQ,SAIxB;IACA,IAAI,cAAc,IAAI,IAAI,GAAG,SAAS,CAErC;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS7B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAO9B,IAAI,MAAM,IAAI,MAAM,CAQnB;CACF;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAO1C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,kBAAqB,KAAG,MAC1B,CAAA;AAoC9C,eAAO,MAAM,SAAS,kEA0BpB,CAAA"}
|
package/dist/Plan.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { PlanParseError } from "./FlowError.js";
|
|
4
|
+
export class Task extends Schema.Class("Task")({
|
|
5
|
+
title: Schema.String,
|
|
6
|
+
description: Schema.String,
|
|
7
|
+
completed: Schema.Boolean.pipe(Schema.withConstructorDefault(Effect.succeed(false)))
|
|
8
|
+
}) {
|
|
9
|
+
}
|
|
10
|
+
export class Plan extends Schema.Class("Plan")({
|
|
11
|
+
epicId: Schema.String,
|
|
12
|
+
tasks: Schema.Array(Task),
|
|
13
|
+
brief: Schema.optionalKey(Schema.String)
|
|
14
|
+
}) {
|
|
15
|
+
get nextIncomplete() {
|
|
16
|
+
return this.tasks.find((task) => !task.completed);
|
|
17
|
+
}
|
|
18
|
+
complete(title) {
|
|
19
|
+
return new Plan({
|
|
20
|
+
...this,
|
|
21
|
+
tasks: this.tasks.map((task) => task.title === title ? new Task({ ...task, completed: true }) : task)
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
taskPrompt(task) {
|
|
25
|
+
const brief = this.brief?.trim();
|
|
26
|
+
return brief === undefined || brief.length === 0
|
|
27
|
+
? task.description
|
|
28
|
+
: `${brief}\n\n---\n\n${task.description}`;
|
|
29
|
+
}
|
|
30
|
+
get render() {
|
|
31
|
+
const blocks = this.tasks.map((task) => {
|
|
32
|
+
const box = task.completed ? "[x]" : "[ ]";
|
|
33
|
+
return `## ${box} ${task.title}\n${task.description}`.trimEnd();
|
|
34
|
+
});
|
|
35
|
+
const core = [`# Plan: ${this.epicId}`, ...blocks].join("\n\n");
|
|
36
|
+
const brief = this.brief?.trim();
|
|
37
|
+
return brief === undefined || brief.length === 0 ? core : `${core}\n\n# Brief\n\n${brief}`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export const stableHash = (input) => {
|
|
41
|
+
let hash = 0x811c9dc5;
|
|
42
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
43
|
+
hash ^= input.charCodeAt(index);
|
|
44
|
+
hash = Math.imul(hash, 0x01000193);
|
|
45
|
+
}
|
|
46
|
+
return (hash >>> 0).toString(16);
|
|
47
|
+
};
|
|
48
|
+
export const defaultPlanPath = (prompt, directory = ".llm4ts") => `${directory}/plan-${stableHash(prompt)}.md`;
|
|
49
|
+
const parseTask = (chunk) => {
|
|
50
|
+
const lines = chunk.split("\n");
|
|
51
|
+
const head = lines[0] ?? "";
|
|
52
|
+
const match = /^## \[([ xX])\] (.+)$/.exec(head);
|
|
53
|
+
const marker = match?.[1];
|
|
54
|
+
const title = match?.[2]?.trim();
|
|
55
|
+
return marker === undefined || title === undefined
|
|
56
|
+
? Effect.fail(PlanParseError.make({
|
|
57
|
+
message: head.length === 0 ? "empty task chunk" : `malformed task header: ${head}`
|
|
58
|
+
}))
|
|
59
|
+
: Effect.succeed(Task.make({
|
|
60
|
+
title,
|
|
61
|
+
description: lines.slice(1).join("\n").trim(),
|
|
62
|
+
completed: marker.toLowerCase() === "x"
|
|
63
|
+
}));
|
|
64
|
+
};
|
|
65
|
+
const splitBrief = (body) => {
|
|
66
|
+
const lines = body.split("\n");
|
|
67
|
+
const index = lines.findIndex((line) => line.trim() === "# Brief");
|
|
68
|
+
if (index < 0) {
|
|
69
|
+
return [body.trim(), undefined];
|
|
70
|
+
}
|
|
71
|
+
const brief = lines
|
|
72
|
+
.slice(index + 1)
|
|
73
|
+
.join("\n")
|
|
74
|
+
.trim();
|
|
75
|
+
return [lines.slice(0, index).join("\n").trim(), brief.length === 0 ? undefined : brief];
|
|
76
|
+
};
|
|
77
|
+
export const parsePlan = Effect.fn("@llm4ts/flow/Plan.parse")(function* (markdown) {
|
|
78
|
+
const stripped = markdown.trim();
|
|
79
|
+
const lines = stripped.split("\n");
|
|
80
|
+
const header = lines[0] ?? "";
|
|
81
|
+
const prefix = "# Plan: ";
|
|
82
|
+
if (!header.startsWith(prefix)) {
|
|
83
|
+
return yield* PlanParseError.make({
|
|
84
|
+
message: `expected a '${prefix}<epicId>' header`
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const [taskBody, brief] = splitBrief(lines.slice(1).join("\n").trim());
|
|
88
|
+
const chunks = taskBody.length === 0
|
|
89
|
+
? []
|
|
90
|
+
: taskBody
|
|
91
|
+
.split(/^(?=## )/m)
|
|
92
|
+
.map((chunk) => chunk.trim())
|
|
93
|
+
.filter((chunk) => chunk.length > 0);
|
|
94
|
+
const tasks = yield* Effect.forEach(chunks, parseTask);
|
|
95
|
+
return Plan.make({
|
|
96
|
+
epicId: header.slice(prefix.length).trim(),
|
|
97
|
+
tasks,
|
|
98
|
+
...(brief === undefined ? {} : { brief })
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=Plan.js.map
|
package/dist/Plan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plan.js","sourceRoot":"","sources":["../src/Plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { type FlowEventsShape } from "./FlowEvents.ts";
|
|
3
|
+
import type { Plan, Task } from "./Plan.ts";
|
|
4
|
+
import type { PlanStoreShape } from "./Persistence.ts";
|
|
5
|
+
export declare const stage: <A, E, R>(events: FlowEventsShape, name: string, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
6
|
+
export declare const implementTaskLoop: <E, R>(store: PlanStoreShape, events: FlowEventsShape, planPath: string, plan: Plan, perTask: (task: Task) => Effect.Effect<void, E, R>) => Effect.Effect<Plan, 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").BudgetExceeded | E, R>;
|
|
7
|
+
//# sourceMappingURL=PlanExecution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanExecution.d.ts","sourceRoot":"","sources":["../src/PlanExecution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjG,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKtD,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3B,QAAQ,eAAe,EACvB,MAAM,MAAM,EACZ,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAYrB,CAAA;AAEH,eAAO,MAAM,iBAAiB,GACjB,CAAC,EAAE,CAAC,gGAKG,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,kgBAYrD,CAAA"}
|