@llm4ts/runner 0.1.3 → 0.2.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/dist/FlowRunner.d.ts +13 -1
- package/dist/FlowRunner.d.ts.map +1 -1
- package/dist/FlowRunner.js +21 -3
- package/dist/FlowRunner.js.map +1 -1
- package/package.json +3 -6
- package/src/FlowRunner.ts +37 -4
- package/dist/cli-main.d.ts +0 -3
- package/dist/cli-main.d.ts.map +0 -1
- package/dist/cli-main.js +0 -39
- package/dist/cli-main.js.map +0 -1
- package/src/cli-main.ts +0 -53
package/dist/FlowRunner.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ import type { HttpClientShape } from "@llm4ts/core/HttpClient";
|
|
|
6
6
|
import type { ProcessExecutorShape } from "@llm4ts/core/ProcessExecutor";
|
|
7
7
|
import type { TemporaryFilesShape } from "@llm4ts/core/TemporaryFiles";
|
|
8
8
|
import type { GeminiCliExecutorShape } from "@llm4ts/core/providers/GeminiCliProvider";
|
|
9
|
+
import { type CostTracker } from "@llm4ts/flow/CostTracker";
|
|
10
|
+
import { type CostBudget } from "@llm4ts/flow/CostLedger";
|
|
9
11
|
import { FlowLlmError, type FlowError } from "@llm4ts/flow/FlowError";
|
|
10
12
|
import { type FlowEventHub } from "@llm4ts/flow/FlowEvents";
|
|
11
13
|
import { type FlowContextShape } from "@llm4ts/flow/FlowContext";
|
|
@@ -35,12 +37,22 @@ export interface FlowRunnerOptions {
|
|
|
35
37
|
readonly verbosity?: Verbosity;
|
|
36
38
|
readonly surface?: TerminalSurface;
|
|
37
39
|
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
40
|
+
/**
|
|
41
|
+
* Optional cost ceiling. Checked after the flow body completes, from the
|
|
42
|
+
* usage the run's CostTracker accrued: exceeding it fails the run with a
|
|
43
|
+
* typed BudgetExceeded. Note that enforcement is only as good as the
|
|
44
|
+
* usage events published — backends without usage reporting accrue
|
|
45
|
+
* nothing (see the connector capability matrix).
|
|
46
|
+
*/
|
|
47
|
+
readonly budget?: CostBudget;
|
|
38
48
|
}
|
|
39
49
|
export interface FlowRunnerBundle {
|
|
40
50
|
readonly context: FlowContextShape;
|
|
41
51
|
readonly events: FlowEventHub;
|
|
52
|
+
/** The run's cost tracker, already subscribed to `events`. */
|
|
53
|
+
readonly tracker: CostTracker;
|
|
42
54
|
}
|
|
43
|
-
export declare const makeFlowRunnerContext: (options: FlowRunnerOptions, dependencies: FlowRunnerDependencies) => Effect.Effect<FlowRunnerBundle, import("@llm4ts/flow/FlowError").PersistenceError | import("@llm4ts/flow/FlowError").PlanParseError | import("@llm4ts/flow/FlowError").UnsupportedSchemaVersion | import("@llm4ts/flow/FlowError").WorkspacePathError | import("@llm4ts/flow/FlowError").WorkspaceLimitError | import("@llm4ts/flow/FlowError").WorkspaceIoError | import("@llm4ts/flow/FlowError").FlowAborted | import("@llm4ts/flow/FlowError").ProcessError | FlowLlmError | import("@llm4ts/flow/FlowError").FlowCapabilityDenied | import("@llm4ts/flow/FlowError").BudgetExceeded,
|
|
55
|
+
export declare const makeFlowRunnerContext: (options: FlowRunnerOptions, dependencies: FlowRunnerDependencies) => Effect.Effect<FlowRunnerBundle, import("@llm4ts/flow/FlowError").PersistenceError | import("@llm4ts/flow/FlowError").PlanParseError | import("@llm4ts/flow/FlowError").UnsupportedSchemaVersion | import("@llm4ts/flow/FlowError").WorkspacePathError | import("@llm4ts/flow/FlowError").WorkspaceLimitError | import("@llm4ts/flow/FlowError").WorkspaceIoError | import("@llm4ts/flow/FlowError").FlowAborted | import("@llm4ts/flow/FlowError").ProcessError | FlowLlmError | import("@llm4ts/flow/FlowError").FlowCapabilityDenied | import("@llm4ts/flow/FlowError").BudgetExceeded, Scope.Scope>;
|
|
44
56
|
export declare const runWithBundle: <A, E, R>(bundle: FlowRunnerBundle, options: FlowRunnerOptions, body: (context: FlowContextShape) => Effect.Effect<A, E, R>, dependencies?: FlowRunnerDependencies | undefined) => Effect.Effect<A, import("@llm4ts/flow/FlowError").PersistenceError | import("@llm4ts/flow/FlowError").PlanParseError | import("@llm4ts/flow/FlowError").UnsupportedSchemaVersion | import("@llm4ts/flow/FlowError").WorkspacePathError | import("@llm4ts/flow/FlowError").WorkspaceLimitError | import("@llm4ts/flow/FlowError").WorkspaceIoError | import("@llm4ts/flow/FlowError").FlowAborted | import("@llm4ts/flow/FlowError").ProcessError | FlowLlmError | import("@llm4ts/flow/FlowError").FlowCapabilityDenied | import("@llm4ts/flow/FlowError").BudgetExceeded | E, Scope.Scope | R>;
|
|
45
57
|
export declare const runEmbedded: <A, E, R>(options: FlowRunnerOptions, body: (context: FlowContextShape) => Effect.Effect<A, E, R>, dependencies?: FlowRunnerDependencies | undefined) => Effect.Effect<A, import("@llm4ts/flow/FlowError").PersistenceError | import("@llm4ts/flow/FlowError").PlanParseError | import("@llm4ts/flow/FlowError").UnsupportedSchemaVersion | import("@llm4ts/flow/FlowError").WorkspacePathError | import("@llm4ts/flow/FlowError").WorkspaceLimitError | import("@llm4ts/flow/FlowError").WorkspaceIoError | import("@llm4ts/flow/FlowError").FlowAborted | import("@llm4ts/flow/FlowError").ProcessError | FlowLlmError | import("@llm4ts/flow/FlowError").FlowCapabilityDenied | import("@llm4ts/flow/FlowError").BudgetExceeded | E, Scope.Scope | R>;
|
|
46
58
|
export declare const runNode: <A, E, R>(options: FlowRunnerOptions, body: (context: FlowContextShape) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | FlowError, R>;
|
package/dist/FlowRunner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowRunner.d.ts","sourceRoot":"","sources":["../src/FlowRunner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAEnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"FlowRunner.d.ts","sourceRoot":"","sources":["../src/FlowRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/FlowRunner.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as Effect from "effect/Effect";
|
|
|
3
3
|
import { CliConnectorConfig, defaultReasoningConfig } from "@llm4ts/core/ConnectorConfig";
|
|
4
4
|
import { createConnectorRegistry } from "@llm4ts/core/providers/ConnectorFactories";
|
|
5
5
|
import { makeCostTracker } from "@llm4ts/flow/CostTracker";
|
|
6
|
+
import { checkCostBudget, makeCostRecord } from "@llm4ts/flow/CostLedger";
|
|
6
7
|
import { FlowLlmError } from "@llm4ts/flow/FlowError";
|
|
7
8
|
import { makeFlowEventHub } from "@llm4ts/flow/FlowEvents";
|
|
8
9
|
import { FlowContext } from "@llm4ts/flow/FlowContext";
|
|
@@ -33,6 +34,8 @@ export const nodeFlowRunnerDependencies = () => ({
|
|
|
33
34
|
});
|
|
34
35
|
export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeContext")(function* (options, dependencies) {
|
|
35
36
|
const events = yield* makeFlowEventHub();
|
|
37
|
+
const tracker = yield* makeCostTracker();
|
|
38
|
+
yield* tracker.consume(events);
|
|
36
39
|
const coderConfig = prepareConnector(options.coder, options.workDir, options.environment ?? process.env);
|
|
37
40
|
const reasoning = defaultReasoningConfig(options.coder, options.reasoning);
|
|
38
41
|
const reasoningPrepared = prepareConnector(reasoning, options.workDir, options.environment ?? process.env);
|
|
@@ -47,6 +50,7 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
|
|
|
47
50
|
.pipe(Effect.mapError(FlowLlmError.from)));
|
|
48
51
|
return {
|
|
49
52
|
events,
|
|
53
|
+
tracker,
|
|
50
54
|
context: FlowContext.of({
|
|
51
55
|
reasoning: reasoningService,
|
|
52
56
|
coder,
|
|
@@ -65,7 +69,7 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
65
69
|
const startedAt = yield* Clock.currentTimeMillis;
|
|
66
70
|
const environment = options.environment ?? process.env;
|
|
67
71
|
const verbosity = options.verbosity ?? "Normal";
|
|
68
|
-
const tracker =
|
|
72
|
+
const tracker = bundle.tracker;
|
|
69
73
|
const surface = options.surface ?? (yield* makeTerminalSurface(environment));
|
|
70
74
|
const palette = surface.palette;
|
|
71
75
|
const terminal = yield* consumeTerminalEvents(bundle.events, surface, verbosity, {
|
|
@@ -83,7 +87,6 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
83
87
|
yield* surface.log(palette.info(`trace ${options.tracePath}${options.runId === undefined ? "" : ` · run ${options.runId}`}`));
|
|
84
88
|
}
|
|
85
89
|
}
|
|
86
|
-
yield* tracker.consume(bundle.events);
|
|
87
90
|
const recorder = options.tracePath === undefined
|
|
88
91
|
? undefined
|
|
89
92
|
: yield* makeFlowRecorder(dependencies.files, options.tracePath, options.runId ?? `run-${(yield* Clock.currentTimeMillis).toString()}`);
|
|
@@ -91,7 +94,22 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
91
94
|
yield* recorder.consume(bundle.events);
|
|
92
95
|
}
|
|
93
96
|
yield* surface.setStatus("preparing flow");
|
|
94
|
-
|
|
97
|
+
const budget = options.budget;
|
|
98
|
+
const enforceBudget = budget === undefined
|
|
99
|
+
? Effect.void
|
|
100
|
+
: Effect.gen(function* () {
|
|
101
|
+
yield* tracker.awaitDrained(bundle.events);
|
|
102
|
+
const cells = yield* tracker.cells;
|
|
103
|
+
const at = new Date(yield* Clock.currentTimeMillis).toISOString();
|
|
104
|
+
yield* checkCostBudget(makeCostRecord({
|
|
105
|
+
runId: options.runId ?? "run",
|
|
106
|
+
at,
|
|
107
|
+
repo: options.workDir,
|
|
108
|
+
prompt: options.userPrompt,
|
|
109
|
+
cells
|
|
110
|
+
}), budget);
|
|
111
|
+
});
|
|
112
|
+
return yield* body(bundle.context).pipe(Effect.provideService(FlowContext, bundle.context), Effect.andThen((value) => Effect.as(enforceBudget, value)), Effect.ensuring(Effect.all([
|
|
95
113
|
terminal.awaitDrained(),
|
|
96
114
|
tracker.awaitDrained(bundle.events),
|
|
97
115
|
recorder === undefined ? Effect.void : recorder.awaitDrained(bundle.events)
|
package/dist/FlowRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowRunner.js","sourceRoot":"","sources":["../src/FlowRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAMzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAA;AACnF,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"FlowRunner.js","sourceRoot":"","sources":["../src/FlowRunner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llm4ts/runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Node runner, CLI, terminal, and MCP composition for llm4ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -12,9 +12,6 @@
|
|
|
12
12
|
"dist",
|
|
13
13
|
"src"
|
|
14
14
|
],
|
|
15
|
-
"bin": {
|
|
16
|
-
"llm4ts": "./dist/cli-main.js"
|
|
17
|
-
},
|
|
18
15
|
"exports": {
|
|
19
16
|
"./Cli": "./dist/Cli.js",
|
|
20
17
|
"./CoderPolicy": "./dist/CoderPolicy.js",
|
|
@@ -58,8 +55,8 @@
|
|
|
58
55
|
"typescript"
|
|
59
56
|
],
|
|
60
57
|
"dependencies": {
|
|
61
|
-
"@llm4ts/flow": "0.
|
|
62
|
-
"@llm4ts/core": "0.
|
|
58
|
+
"@llm4ts/flow": "0.2.0",
|
|
59
|
+
"@llm4ts/core": "0.2.0"
|
|
63
60
|
},
|
|
64
61
|
"peerDependencies": {
|
|
65
62
|
"effect": "^4.0.0-beta.102"
|
package/src/FlowRunner.ts
CHANGED
|
@@ -9,7 +9,8 @@ import type { ProcessExecutorShape } from "@llm4ts/core/ProcessExecutor"
|
|
|
9
9
|
import type { TemporaryFilesShape } from "@llm4ts/core/TemporaryFiles"
|
|
10
10
|
import type { GeminiCliExecutorShape } from "@llm4ts/core/providers/GeminiCliProvider"
|
|
11
11
|
import { createConnectorRegistry } from "@llm4ts/core/providers/ConnectorFactories"
|
|
12
|
-
import { makeCostTracker } from "@llm4ts/flow/CostTracker"
|
|
12
|
+
import { makeCostTracker, type CostTracker } from "@llm4ts/flow/CostTracker"
|
|
13
|
+
import { checkCostBudget, makeCostRecord, type CostBudget } from "@llm4ts/flow/CostLedger"
|
|
13
14
|
import { FlowLlmError, type FlowError } from "@llm4ts/flow/FlowError"
|
|
14
15
|
import { makeFlowEventHub, type FlowEventHub } from "@llm4ts/flow/FlowEvents"
|
|
15
16
|
import { FlowContext, type FlowContextShape } from "@llm4ts/flow/FlowContext"
|
|
@@ -73,18 +74,30 @@ export interface FlowRunnerOptions {
|
|
|
73
74
|
readonly verbosity?: Verbosity
|
|
74
75
|
readonly surface?: TerminalSurface
|
|
75
76
|
readonly environment?: Readonly<Record<string, string | undefined>>
|
|
77
|
+
/**
|
|
78
|
+
* Optional cost ceiling. Checked after the flow body completes, from the
|
|
79
|
+
* usage the run's CostTracker accrued: exceeding it fails the run with a
|
|
80
|
+
* typed BudgetExceeded. Note that enforcement is only as good as the
|
|
81
|
+
* usage events published — backends without usage reporting accrue
|
|
82
|
+
* nothing (see the connector capability matrix).
|
|
83
|
+
*/
|
|
84
|
+
readonly budget?: CostBudget
|
|
76
85
|
}
|
|
77
86
|
|
|
78
87
|
export interface FlowRunnerBundle {
|
|
79
88
|
readonly context: FlowContextShape
|
|
80
89
|
readonly events: FlowEventHub
|
|
90
|
+
/** The run's cost tracker, already subscribed to `events`. */
|
|
91
|
+
readonly tracker: CostTracker
|
|
81
92
|
}
|
|
82
93
|
|
|
83
94
|
export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeContext")(function* (
|
|
84
95
|
options: FlowRunnerOptions,
|
|
85
96
|
dependencies: FlowRunnerDependencies
|
|
86
|
-
): Effect.fn.Return<FlowRunnerBundle, FlowError> {
|
|
97
|
+
): Effect.fn.Return<FlowRunnerBundle, FlowError, Scope.Scope> {
|
|
87
98
|
const events = yield* makeFlowEventHub()
|
|
99
|
+
const tracker = yield* makeCostTracker()
|
|
100
|
+
yield* tracker.consume(events)
|
|
88
101
|
const coderConfig = prepareConnector(
|
|
89
102
|
options.coder,
|
|
90
103
|
options.workDir,
|
|
@@ -109,6 +122,7 @@ export const makeFlowRunnerContext = Effect.fn("@llm4ts/runner/FlowRunner.makeCo
|
|
|
109
122
|
)
|
|
110
123
|
return {
|
|
111
124
|
events,
|
|
125
|
+
tracker,
|
|
112
126
|
context: FlowContext.of({
|
|
113
127
|
reasoning: reasoningService,
|
|
114
128
|
coder,
|
|
@@ -137,7 +151,7 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
137
151
|
const startedAt = yield* Clock.currentTimeMillis
|
|
138
152
|
const environment = options.environment ?? process.env
|
|
139
153
|
const verbosity = options.verbosity ?? "Normal"
|
|
140
|
-
const tracker =
|
|
154
|
+
const tracker = bundle.tracker
|
|
141
155
|
const surface = options.surface ?? (yield* makeTerminalSurface(environment))
|
|
142
156
|
const palette = surface.palette
|
|
143
157
|
const terminal = yield* consumeTerminalEvents(bundle.events, surface, verbosity, {
|
|
@@ -159,7 +173,6 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
159
173
|
)
|
|
160
174
|
}
|
|
161
175
|
}
|
|
162
|
-
yield* tracker.consume(bundle.events)
|
|
163
176
|
const recorder =
|
|
164
177
|
options.tracePath === undefined
|
|
165
178
|
? undefined
|
|
@@ -172,8 +185,28 @@ export const runWithBundle = Effect.fn("@llm4ts/runner/FlowRunner.runWithBundle"
|
|
|
172
185
|
yield* recorder.consume(bundle.events)
|
|
173
186
|
}
|
|
174
187
|
yield* surface.setStatus("preparing flow")
|
|
188
|
+
const budget = options.budget
|
|
189
|
+
const enforceBudget =
|
|
190
|
+
budget === undefined
|
|
191
|
+
? Effect.void
|
|
192
|
+
: Effect.gen(function* () {
|
|
193
|
+
yield* tracker.awaitDrained(bundle.events)
|
|
194
|
+
const cells = yield* tracker.cells
|
|
195
|
+
const at = new Date(yield* Clock.currentTimeMillis).toISOString()
|
|
196
|
+
yield* checkCostBudget(
|
|
197
|
+
makeCostRecord({
|
|
198
|
+
runId: options.runId ?? "run",
|
|
199
|
+
at,
|
|
200
|
+
repo: options.workDir,
|
|
201
|
+
prompt: options.userPrompt,
|
|
202
|
+
cells
|
|
203
|
+
}),
|
|
204
|
+
budget
|
|
205
|
+
)
|
|
206
|
+
})
|
|
175
207
|
return yield* body(bundle.context).pipe(
|
|
176
208
|
Effect.provideService(FlowContext, bundle.context),
|
|
209
|
+
Effect.andThen((value) => Effect.as(enforceBudget, value)),
|
|
177
210
|
Effect.ensuring(
|
|
178
211
|
Effect.all(
|
|
179
212
|
[
|
package/dist/cli-main.d.ts
DELETED
package/dist/cli-main.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":""}
|
package/dist/cli-main.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import * as Effect from "effect/Effect";
|
|
4
|
-
import { makeCliProgram } from "./Cli.js";
|
|
5
|
-
import { makeDoctorProgram } from "./Doctor.js";
|
|
6
|
-
import { FlowHelp, parseFlowArgs } from "./FlowArgs.js";
|
|
7
|
-
const argv = process.argv.slice(2);
|
|
8
|
-
const packageVersion = () => {
|
|
9
|
-
const manifest = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
10
|
-
return typeof manifest === "object" &&
|
|
11
|
-
manifest !== null &&
|
|
12
|
-
"version" in manifest &&
|
|
13
|
-
typeof manifest.version === "string"
|
|
14
|
-
? manifest.version
|
|
15
|
-
: "unknown";
|
|
16
|
-
};
|
|
17
|
-
const flowProgram = () => {
|
|
18
|
-
const parsed = parseFlowArgs(argv);
|
|
19
|
-
if (parsed.ok && parsed.value.help === true) {
|
|
20
|
-
return Effect.sync(() => process.stdout.write(FlowHelp));
|
|
21
|
-
}
|
|
22
|
-
if (parsed.ok && parsed.value.version === true) {
|
|
23
|
-
return Effect.sync(() => process.stdout.write(`${packageVersion()}\n`));
|
|
24
|
-
}
|
|
25
|
-
return makeCliProgram(argv).pipe(Effect.match({
|
|
26
|
-
onFailure: (error) => {
|
|
27
|
-
process.stderr.write(`${error.message}\n`);
|
|
28
|
-
return error._tag === "ScriptUsage" ? 2 : 1;
|
|
29
|
-
},
|
|
30
|
-
onSuccess: () => 0
|
|
31
|
-
}), Effect.flatMap((exitCode) => Effect.sync(() => {
|
|
32
|
-
process.exitCode = exitCode;
|
|
33
|
-
})));
|
|
34
|
-
};
|
|
35
|
-
const main = argv[0] === "doctor"
|
|
36
|
-
? makeDoctorProgram().pipe(Effect.flatMap((report) => Effect.sync(() => process.stdout.write(report))))
|
|
37
|
-
: flowProgram();
|
|
38
|
-
Effect.runFork(main);
|
|
39
|
-
//# sourceMappingURL=cli-main.js.map
|
package/dist/cli-main.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAElC,MAAM,cAAc,GAAG,GAAW,EAAE;IAClC,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAClC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAClE,CAAA;IACD,OAAO,OAAO,QAAQ,KAAK,QAAQ;QACjC,QAAQ,KAAK,IAAI;QACjB,SAAS,IAAI,QAAQ;QACrB,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;QACpC,CAAC,CAAC,QAAQ,CAAC,OAAO;QAClB,CAAC,CAAC,SAAS,CAAA;AACf,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,GAAwB,EAAE;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAC9B,MAAM,CAAC,KAAK,CAAC;QACX,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;YAC1C,OAAO,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7C,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;KACnB,CAAC,EACF,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC7B,CAAC,CAAC,CACH,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,IAAI,GACR,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;IAClB,CAAC,CAAC,iBAAiB,EAAE,CAAC,IAAI,CACtB,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAC5E;IACH,CAAC,CAAC,WAAW,EAAE,CAAA;AAEnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
|
package/src/cli-main.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from "node:fs"
|
|
3
|
-
import * as Effect from "effect/Effect"
|
|
4
|
-
import { makeCliProgram } from "./Cli.ts"
|
|
5
|
-
import { makeDoctorProgram } from "./Doctor.ts"
|
|
6
|
-
import { FlowHelp, parseFlowArgs } from "./FlowArgs.ts"
|
|
7
|
-
|
|
8
|
-
const argv = process.argv.slice(2)
|
|
9
|
-
|
|
10
|
-
const packageVersion = (): string => {
|
|
11
|
-
const manifest: unknown = JSON.parse(
|
|
12
|
-
readFileSync(new URL("../package.json", import.meta.url), "utf8")
|
|
13
|
-
)
|
|
14
|
-
return typeof manifest === "object" &&
|
|
15
|
-
manifest !== null &&
|
|
16
|
-
"version" in manifest &&
|
|
17
|
-
typeof manifest.version === "string"
|
|
18
|
-
? manifest.version
|
|
19
|
-
: "unknown"
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const flowProgram = (): Effect.Effect<void> => {
|
|
23
|
-
const parsed = parseFlowArgs(argv)
|
|
24
|
-
if (parsed.ok && parsed.value.help === true) {
|
|
25
|
-
return Effect.sync(() => process.stdout.write(FlowHelp))
|
|
26
|
-
}
|
|
27
|
-
if (parsed.ok && parsed.value.version === true) {
|
|
28
|
-
return Effect.sync(() => process.stdout.write(`${packageVersion()}\n`))
|
|
29
|
-
}
|
|
30
|
-
return makeCliProgram(argv).pipe(
|
|
31
|
-
Effect.match({
|
|
32
|
-
onFailure: (error) => {
|
|
33
|
-
process.stderr.write(`${error.message}\n`)
|
|
34
|
-
return error._tag === "ScriptUsage" ? 2 : 1
|
|
35
|
-
},
|
|
36
|
-
onSuccess: () => 0
|
|
37
|
-
}),
|
|
38
|
-
Effect.flatMap((exitCode) =>
|
|
39
|
-
Effect.sync(() => {
|
|
40
|
-
process.exitCode = exitCode
|
|
41
|
-
})
|
|
42
|
-
)
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const main =
|
|
47
|
-
argv[0] === "doctor"
|
|
48
|
-
? makeDoctorProgram().pipe(
|
|
49
|
-
Effect.flatMap((report) => Effect.sync(() => process.stdout.write(report)))
|
|
50
|
-
)
|
|
51
|
-
: flowProgram()
|
|
52
|
-
|
|
53
|
-
Effect.runFork(main)
|