@llm4ts/shell 2.44.1 → 2.46.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 (70) hide show
  1. package/dist/Cli.d.ts +3 -7
  2. package/dist/Cli.d.ts.map +1 -1
  3. package/dist/Cli.js +20 -4
  4. package/dist/Cli.js.map +1 -1
  5. package/dist/FlowLaunch.d.ts +2 -16
  6. package/dist/FlowLaunch.d.ts.map +1 -1
  7. package/dist/FlowLaunch.js +20 -66
  8. package/dist/FlowLaunch.js.map +1 -1
  9. package/dist/FlowProcess.d.ts +67 -0
  10. package/dist/FlowProcess.d.ts.map +1 -0
  11. package/dist/FlowProcess.js +175 -0
  12. package/dist/FlowProcess.js.map +1 -0
  13. package/dist/Menu.d.ts +1 -1
  14. package/dist/Menu.d.ts.map +1 -1
  15. package/dist/OperatorActTools.d.ts +170 -0
  16. package/dist/OperatorActTools.d.ts.map +1 -0
  17. package/dist/OperatorActTools.js +332 -0
  18. package/dist/OperatorActTools.js.map +1 -0
  19. package/dist/OperatorConfig.d.ts +44 -0
  20. package/dist/OperatorConfig.d.ts.map +1 -0
  21. package/dist/OperatorConfig.js +88 -0
  22. package/dist/OperatorConfig.js.map +1 -0
  23. package/dist/OperatorNode.d.ts +45 -0
  24. package/dist/OperatorNode.d.ts.map +1 -0
  25. package/dist/OperatorNode.js +103 -0
  26. package/dist/OperatorNode.js.map +1 -0
  27. package/dist/OperatorRuns.d.ts +76 -0
  28. package/dist/OperatorRuns.d.ts.map +1 -0
  29. package/dist/OperatorRuns.js +146 -0
  30. package/dist/OperatorRuns.js.map +1 -0
  31. package/dist/OperatorServer.d.ts +160 -0
  32. package/dist/OperatorServer.d.ts.map +1 -0
  33. package/dist/OperatorServer.js +123 -0
  34. package/dist/OperatorServer.js.map +1 -0
  35. package/dist/OperatorTools.d.ts +558 -0
  36. package/dist/OperatorTools.d.ts.map +1 -0
  37. package/dist/OperatorTools.js +398 -0
  38. package/dist/OperatorTools.js.map +1 -0
  39. package/dist/Refine.d.ts +2 -2
  40. package/dist/Refine.d.ts.map +1 -1
  41. package/dist/Refine.js +3 -5
  42. package/dist/Refine.js.map +1 -1
  43. package/dist/RunSupervisor.d.ts +51 -0
  44. package/dist/RunSupervisor.d.ts.map +1 -0
  45. package/dist/RunSupervisor.js +282 -0
  46. package/dist/RunSupervisor.js.map +1 -0
  47. package/dist/ShellErrors.d.ts +9 -0
  48. package/dist/ShellErrors.d.ts.map +1 -0
  49. package/dist/ShellErrors.js +7 -0
  50. package/dist/ShellErrors.js.map +1 -0
  51. package/flows/lib/epic-stories.js +83 -30
  52. package/flows/port-guide.js +4 -1
  53. package/kits/j2ee-nextjs/packs/j2ee-nextjs-spa/pack.md +1 -0
  54. package/kits/j2ee-nextjs/packs/jsp-nextjs/pack.md +1 -0
  55. package/kits/port/packs/scala-ts/pack.md +1 -0
  56. package/kits/soap-ace/fixtures/demo-bank-soap/RUNBOOK.md +5 -2
  57. package/kits/soap-ace/flows/soap-epic.js +1 -2
  58. package/package.json +13 -4
  59. package/src/Cli.ts +64 -3
  60. package/src/FlowLaunch.ts +20 -66
  61. package/src/FlowProcess.ts +239 -0
  62. package/src/OperatorActTools.ts +407 -0
  63. package/src/OperatorConfig.ts +148 -0
  64. package/src/OperatorNode.ts +147 -0
  65. package/src/OperatorRuns.ts +270 -0
  66. package/src/OperatorServer.ts +192 -0
  67. package/src/OperatorTools.ts +610 -0
  68. package/src/Refine.ts +4 -7
  69. package/src/RunSupervisor.ts +403 -0
  70. package/src/ShellErrors.ts +6 -0
@@ -0,0 +1,332 @@
1
+ import * as Clock from "effect/Clock";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Schema from "effect/Schema";
4
+ import * as Tool from "effect/ai/Tool";
5
+ import * as Toolkit from "effect/ai/Toolkit";
6
+ import { approveMarkdown } from "@llm4ts/flow/Approval";
7
+ import { PersistenceError } from "@llm4ts/flow/FlowError";
8
+ import { InvalidKnob, NotAllowed, OperatorRun, ReadFailed, RunInProgress, RunWaitResult, UnknownEpic, UnknownFlow, UnknownRepo, UnknownRun } from "@llm4ts/flow/OperatorSchemas";
9
+ import { retroApprovalOf, retroPaths } from "@llm4ts/flow/Retro";
10
+ import { emptyTree } from "@llm4ts/runner/AgentTree";
11
+ import { TraceUnreadable, foldTrace, meaningfulEventsAfter, runStatusOf } from "@llm4ts/runner/RunReaders";
12
+ import { FlowLaunchError } from "./FlowProcess.js";
13
+ import { resolveRepo } from "./OperatorTools.js";
14
+ import { epicDirOf, epicOfRun, readEpicRunsStrict, readFailed, resolveRun, tracePending } from "./OperatorRuns.js";
15
+ /**
16
+ * The operator's `run_wait` and act tools (`llm4ts mcp`, ADR 0041): waiting on
17
+ * a run without polling from the client, and starting, stopping, retro-ing and
18
+ * approving through the run supervisor. `run_wait` only reads, so it has its
19
+ * own toolkit the server registers beside the read tools; the act toolkit is
20
+ * registered only when the configuration allows runs or approvals.
21
+ */
22
+ const repoParam = Schema.optional(Schema.String);
23
+ // ---- run_wait -----------------------------------------------------------------------------
24
+ export const runWaitTool = Tool.make("run_wait", {
25
+ description: "Wait for a run's next meaningful events after sinceSeq: returns as soon as one appears or the run is no longer running, else after timeoutSeconds (default 120, at most 300) with no events.",
26
+ parameters: Schema.Struct({
27
+ runId: Schema.String,
28
+ sinceSeq: Schema.optional(Schema.Int),
29
+ timeoutSeconds: Schema.optional(Schema.Int)
30
+ }),
31
+ success: RunWaitResult,
32
+ failure: Schema.Union([UnknownRun, TraceUnreadable, ReadFailed])
33
+ })
34
+ .annotate(Tool.Readonly, true)
35
+ .annotate(Tool.Destructive, false);
36
+ export const waitToolkit = Toolkit.make(runWaitTool);
37
+ const pollInterval = "500 millis";
38
+ const defaultWaitSeconds = 120;
39
+ const maxWaitSeconds = 300;
40
+ const isActive = (state) => state === "starting" || state === "running";
41
+ const emptyFold = () => ({ lines: [], state: emptyTree(), seq: 0 });
42
+ export const waitHandlers = (deps) => waitToolkit.of({
43
+ run_wait: ({ runId, sinceSeq, timeoutSeconds }) => Effect.gen(function* () {
44
+ const since = sinceSeq ?? 0;
45
+ const timeoutMs = Math.min(Math.max(0, timeoutSeconds ?? defaultWaitSeconds), maxWaitSeconds) * 1_000;
46
+ const run = yield* resolveRun(deps, runId);
47
+ const epic = yield* epicOfRun(deps, run);
48
+ const startedAt = yield* Clock.currentTimeMillis;
49
+ for (;;) {
50
+ const fold = (yield* tracePending(deps.files, run))
51
+ ? emptyFold()
52
+ : yield* foldTrace(deps.files, run.tracePath, epic?.dir);
53
+ // A supervised run's state is the supervisor's; a run found on disk ends with its trace.
54
+ const state = run.supervised === undefined
55
+ ? fold.lines.some((line) => line.kind === "RunEnded")
56
+ ? "exited"
57
+ : run.state
58
+ : ((yield* deps.supervisor.get(runId))?.state ?? run.state);
59
+ const events = meaningfulEventsAfter(fold.lines, since);
60
+ const exited = !isActive(state);
61
+ const elapsed = (yield* Clock.currentTimeMillis) - startedAt;
62
+ if (events.length > 0 || exited || elapsed >= timeoutMs) {
63
+ const status = runStatusOf(fold, { ...run, state }, yield* deps.now);
64
+ return RunWaitResult.make({
65
+ events,
66
+ seq: Math.max(fold.seq, since),
67
+ ...(status.ended === undefined ? {} : { ended: status.ended }),
68
+ exited,
69
+ summary: status.summary
70
+ });
71
+ }
72
+ yield* Effect.sleep(pollInterval);
73
+ }
74
+ })
75
+ });
76
+ // ---- Act tools ----------------------------------------------------------------------------
77
+ export const StartedRun = Schema.Struct({
78
+ runId: Schema.String,
79
+ tracePath: Schema.optionalKey(Schema.String),
80
+ pid: Schema.optionalKey(Schema.Int)
81
+ });
82
+ const startFailures = Schema.Union([
83
+ NotAllowed,
84
+ InvalidKnob,
85
+ UnknownRepo,
86
+ UnknownEpic,
87
+ UnknownRun,
88
+ UnknownFlow,
89
+ ReadFailed,
90
+ FlowLaunchError,
91
+ RunInProgress,
92
+ PersistenceError
93
+ ]);
94
+ const StartRunParams = Schema.Struct({
95
+ repo: repoParam,
96
+ flow: Schema.String,
97
+ task: Schema.optional(Schema.String),
98
+ epic: Schema.optional(Schema.String),
99
+ pack: Schema.optional(Schema.String),
100
+ executors: Schema.optional(Schema.Array(Schema.String)),
101
+ coder: Schema.optional(Schema.String),
102
+ judgeRounds: Schema.optional(Schema.Int),
103
+ mergeRevisions: Schema.optional(Schema.Int),
104
+ land: Schema.optional(Schema.String),
105
+ flags: Schema.optional(Schema.Array(Schema.String)),
106
+ requestId: Schema.optional(Schema.String)
107
+ });
108
+ export const startRunTool = Tool.make("start_run", {
109
+ description: "Start a flow by name in the background with typed knobs; returns the run id at once. Repeating a call is safe only with the same requestId, which returns the run it already started; without one, every call starts a new run.",
110
+ parameters: StartRunParams,
111
+ success: StartedRun,
112
+ failure: startFailures
113
+ }).annotate(Tool.Destructive, false);
114
+ export const stopRunTool = Tool.make("stop_run", {
115
+ description: "Stop a run this server started: SIGINT, then SIGTERM after a grace period; returns its final record.",
116
+ parameters: Schema.Struct({ runId: Schema.String }),
117
+ success: OperatorRun,
118
+ failure: Schema.Union([NotAllowed, UnknownRun])
119
+ }).annotate(Tool.Destructive, true);
120
+ export const retroStartTool = Tool.make("retro_start", {
121
+ description: "Start epic-retro for an epic, optionally for one of its recorded runs; the retro report then waits for approve.",
122
+ parameters: Schema.Struct({
123
+ repo: repoParam,
124
+ epic: Schema.String,
125
+ run: Schema.optional(Schema.String)
126
+ }),
127
+ success: StartedRun,
128
+ failure: startFailures
129
+ }).annotate(Tool.Destructive, false);
130
+ export const approveTool = Tool.make("approve", {
131
+ description: "Approve a retro report: ticks its approval marker so the next epic run applies its fixes.",
132
+ parameters: Schema.Struct({
133
+ repo: repoParam,
134
+ kind: Schema.Literals(["retro"]),
135
+ epic: Schema.String,
136
+ id: Schema.String
137
+ }),
138
+ success: Schema.Struct({ path: Schema.String, approved: Schema.Boolean }),
139
+ failure: Schema.Union([
140
+ NotAllowed,
141
+ UnknownRepo,
142
+ UnknownEpic,
143
+ UnknownRun,
144
+ ReadFailed,
145
+ PersistenceError
146
+ ])
147
+ }).annotate(Tool.Destructive, false);
148
+ export const actToolkit = Toolkit.make(startRunTool, stopRunTool, retroStartTool, approveTool);
149
+ const knobsOf = (params) => ({
150
+ ...(params.task === undefined ? {} : { task: params.task }),
151
+ ...(params.epic === undefined ? {} : { epic: params.epic }),
152
+ ...(params.pack === undefined ? {} : { pack: params.pack }),
153
+ ...(params.executors === undefined ? {} : { executors: params.executors }),
154
+ ...(params.coder === undefined ? {} : { coder: params.coder }),
155
+ ...(params.judgeRounds === undefined ? {} : { judgeRounds: params.judgeRounds }),
156
+ ...(params.mergeRevisions === undefined ? {} : { mergeRevisions: params.mergeRevisions }),
157
+ ...(params.land === undefined ? {} : { land: params.land }),
158
+ ...(params.flags === undefined ? {} : { flags: params.flags }),
159
+ ...(params.requestId === undefined ? {} : { requestId: params.requestId })
160
+ });
161
+ const namePattern = /^[A-Za-z0-9][A-Za-z0-9._-]*$/u;
162
+ const packPattern = /^[\w.-]+(\/[\w.-]+)?$/u;
163
+ const branchPattern = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/u;
164
+ const flagPattern = /^--[a-z][a-z0-9-]*(=[A-Za-z0-9][A-Za-z0-9._/-]*)?$/u;
165
+ const flagValuePattern = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/u;
166
+ /**
167
+ * Flags a client may never pass through `flags`, with or without `=value`.
168
+ * `-C` already fails the shape pattern; it is named so a looser pattern
169
+ * cannot reopen it.
170
+ */
171
+ const reservedFlags = [
172
+ // Points the flow at another directory (`FlowArgs.ts`).
173
+ "--repo",
174
+ // Alias of --repo in the flow argument parser.
175
+ "-C",
176
+ // Reads the prompt from any file on the server.
177
+ "--prompt-file",
178
+ // Typed knob: epic.
179
+ "--epic",
180
+ // Typed knob: land.
181
+ "--land",
182
+ // Typed knob: judgeRounds.
183
+ "--judge-rounds",
184
+ // Typed knob: mergeRevisions.
185
+ "--merge-revisions",
186
+ // Lets soap flows send mutating calls to a real ESB.
187
+ "--allow-mutating",
188
+ // Auto-confirms prompts a human is meant to answer.
189
+ "--yes",
190
+ // Selects which environment's credentials a flow uses.
191
+ "--env",
192
+ // A filesystem path in epic-design.
193
+ "--target"
194
+ ];
195
+ const reservedFlagOf = (entry) => reservedFlags.find((flag) => entry === flag || entry.startsWith(`${flag}=`));
196
+ /** Why a flags list is refused, or undefined when every entry has a safe shape. */
197
+ const flagsProblem = (flags) => {
198
+ let previousWasFlag = false;
199
+ for (const entry of flags) {
200
+ const reserved = reservedFlagOf(entry);
201
+ if (reserved !== undefined)
202
+ return `${reserved} may not be passed through flags`;
203
+ const flag = flagPattern.exec(entry);
204
+ if (flag !== null) {
205
+ previousWasFlag = flag[1] === undefined;
206
+ continue;
207
+ }
208
+ if (!previousWasFlag || !flagValuePattern.test(entry)) {
209
+ return "every entry must be a --flag[=value] or a plain value right after a flag";
210
+ }
211
+ previousWasFlag = false;
212
+ }
213
+ return undefined;
214
+ };
215
+ const invalid = (knob, message) => Effect.fail(InvalidKnob.make({ knob, message }));
216
+ /**
217
+ * Every client value that reaches the flow's argv or environment, checked
218
+ * before the supervisor sees it. Names stay names, never paths or flags:
219
+ * `pack` is a kit or kit/pack name (no `.`/`..` segment), `epic`, `coder` and
220
+ * executors are ids, `land` is a branch name. `task` is the flow's first
221
+ * positional argument, so it may not start with `-` (it would parse as a
222
+ * flag) or `@` (the flow parser reads `@<path>` as a prompt file on the
223
+ * server). `flags` is an allowlist of shapes: `--flag[=value]`, or a plain
224
+ * value right after a flag, never a reserved flag (`reservedFlags`).
225
+ */
226
+ export const validateKnobs = (knobs) => {
227
+ if (knobs.pack !== undefined &&
228
+ (!packPattern.test(knobs.pack) ||
229
+ knobs.pack.split("/").some((segment) => segment === "." || segment === ".."))) {
230
+ return invalid("pack", "pack must be a kit or kit/pack name, not a path");
231
+ }
232
+ if (knobs.epic !== undefined && !namePattern.test(knobs.epic)) {
233
+ return invalid("epic", "epic must be an epic id");
234
+ }
235
+ if (knobs.coder !== undefined && !namePattern.test(knobs.coder)) {
236
+ return invalid("coder", "coder must be an executor or connector id");
237
+ }
238
+ if (knobs.executors?.some((id) => !namePattern.test(id)) === true) {
239
+ return invalid("executors", "every executor must be an executor id");
240
+ }
241
+ if (knobs.land !== undefined && !branchPattern.test(knobs.land)) {
242
+ return invalid("land", "land must be a branch name");
243
+ }
244
+ const nonNegative = (value) => value === undefined || (Number.isInteger(value) && value >= 0);
245
+ if (!nonNegative(knobs.judgeRounds)) {
246
+ return invalid("judgeRounds", "judgeRounds must be an integer of 0 or more");
247
+ }
248
+ if (!nonNegative(knobs.mergeRevisions)) {
249
+ return invalid("mergeRevisions", "mergeRevisions must be an integer of 0 or more");
250
+ }
251
+ if (knobs.task !== undefined && (knobs.task.startsWith("-") || knobs.task.startsWith("@"))) {
252
+ return invalid("task", "task must not start with '-' or '@'");
253
+ }
254
+ const problem = knobs.flags === undefined ? undefined : flagsProblem(knobs.flags);
255
+ if (problem !== undefined)
256
+ return invalid("flags", problem);
257
+ return Effect.succeed(knobs);
258
+ };
259
+ /** A run or retro id names one file, never a path. */
260
+ const isPlainId = (id) => /^[\w.-]+$/u.test(id) && id !== "." && id !== "..";
261
+ export const actHandlers = (deps) => {
262
+ const requireRun = deps.config.allowRun
263
+ ? Effect.void
264
+ : Effect.fail(NotAllowed.make({ message: "this server was not started with --allow-run" }));
265
+ const requireApprove = deps.config.allowApprove
266
+ ? Effect.void
267
+ : Effect.fail(NotAllowed.make({ message: "this server was not started with --allow-approve" }));
268
+ const startFlow = (repo, name, knobs) => Effect.gen(function* () {
269
+ const flows = yield* deps.flows(repo.path).pipe(Effect.mapError(readFailed));
270
+ const flow = flows.find((candidate) => candidate.name === name);
271
+ if (flow === undefined) {
272
+ return yield* UnknownFlow.make({
273
+ message: `unknown flow '${name}' in ${repo.id}: list_flows names the flows it can start`
274
+ });
275
+ }
276
+ const run = yield* deps.supervisor.start({
277
+ repo,
278
+ flow: { name: flow.name, path: flow.path },
279
+ knobs,
280
+ baseEnvironment: deps.environment
281
+ });
282
+ return {
283
+ runId: run.runId,
284
+ ...(run.tracePath === undefined ? {} : { tracePath: run.tracePath }),
285
+ ...(run.pid === undefined ? {} : { pid: run.pid })
286
+ };
287
+ });
288
+ return actToolkit.of({
289
+ start_run: (params) => Effect.gen(function* () {
290
+ yield* requireRun;
291
+ const repo = yield* resolveRepo(deps.config, params.repo);
292
+ const knobs = yield* validateKnobs(knobsOf(params));
293
+ return yield* startFlow(repo, params.flow, knobs);
294
+ }),
295
+ stop_run: ({ runId }) => Effect.andThen(requireRun, deps.supervisor.stop(runId)),
296
+ retro_start: ({ repo: repoId, epic, run }) => Effect.gen(function* () {
297
+ yield* requireRun;
298
+ const repo = yield* resolveRepo(deps.config, repoId);
299
+ const dir = yield* epicDirOf(deps, repo, epic);
300
+ if (run !== undefined) {
301
+ const recorded = yield* readEpicRunsStrict(deps.files, dir);
302
+ if (!recorded.some((entry) => entry.runId === run)) {
303
+ return yield* UnknownRun.make({
304
+ message: `epic '${epic}' has no recorded run '${run}'`
305
+ });
306
+ }
307
+ }
308
+ // The client's values, checked like start_run's; the --epic flag itself is ours.
309
+ yield* validateKnobs({ epic, ...(run === undefined ? {} : { flags: ["--run", run] }) });
310
+ return yield* startFlow(repo, "epic-retro", {
311
+ flags: ["--epic", epic, ...(run === undefined ? [] : ["--run", run])]
312
+ });
313
+ }),
314
+ approve: ({ repo: repoId, epic, id }) => Effect.gen(function* () {
315
+ yield* requireApprove;
316
+ const repo = yield* resolveRepo(deps.config, repoId);
317
+ const dir = yield* epicDirOf(deps, repo, epic);
318
+ const unknown = UnknownRun.make({ message: `no retro '${id}' for epic '${epic}'` });
319
+ if (!isPlainId(id))
320
+ return yield* unknown;
321
+ const path = retroPaths(dir, id).report;
322
+ const markdown = yield* deps.files.read(path).pipe(Effect.mapError(readFailed));
323
+ if (markdown === undefined)
324
+ return yield* unknown;
325
+ const approved = approveMarkdown(markdown);
326
+ if (approved !== markdown)
327
+ yield* deps.files.writeAtomic(path, approved);
328
+ return { path, approved: retroApprovalOf(approved).approved };
329
+ })
330
+ });
331
+ };
332
+ //# sourceMappingURL=OperatorActTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorActTools.js","sourceRoot":"","sources":["../src/OperatorActTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Option from "effect/Option";
3
+ import * as Schema from "effect/Schema";
4
+ import { ShellUsageError } from "./ShellErrors.ts";
5
+ export interface McpFlags {
6
+ readonly stdio: boolean;
7
+ readonly http: boolean;
8
+ readonly host: Option.Option<string>;
9
+ readonly port: Option.Option<number>;
10
+ readonly tokenFile: Option.Option<string>;
11
+ readonly repo: ReadonlyArray<string>;
12
+ readonly allowRun: boolean;
13
+ readonly allowApprove: boolean;
14
+ readonly parallelRuns: Option.Option<number>;
15
+ }
16
+ export interface OperatorConfig {
17
+ readonly transport: {
18
+ readonly _tag: "stdio";
19
+ } | {
20
+ readonly _tag: "http";
21
+ readonly host: string;
22
+ readonly port: number;
23
+ readonly token: string;
24
+ };
25
+ readonly repos: ReadonlyArray<{
26
+ readonly id: string;
27
+ readonly path: string;
28
+ }>;
29
+ readonly allowRun: boolean;
30
+ readonly allowApprove: boolean;
31
+ readonly parallelRuns: number;
32
+ }
33
+ export declare const McpConfigFile: Schema.Struct<{
34
+ readonly repos: Schema.$Array<Schema.Struct<{
35
+ readonly id: Schema.String;
36
+ readonly path: Schema.String;
37
+ }>>;
38
+ }>;
39
+ /**
40
+ * Turns the `mcp` flags into the operator configuration. The token is read from the
41
+ * environment or a file and is never echoed in an error message.
42
+ */
43
+ export declare const mcpOptionsFrom: (flags: McpFlags, environment: Readonly<Record<string, string | undefined>>, cwd: string, readFile: (path: string) => Effect.Effect<string | undefined>) => Effect.Effect<OperatorConfig, ShellUsageError>;
44
+ //# sourceMappingURL=OperatorConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorConfig.d.ts","sourceRoot":"","sources":["../src/OperatorConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EACd;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAC1B;QACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KACvB,CAAA;IACL,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,eAAO,MAAM,aAAa;;;;;EAExB,CAAA;AAOF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,QAAQ,EACf,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACzD,KAAK,MAAM,EACX,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,KAC5D,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,CA4B5C,CAAA"}
@@ -0,0 +1,88 @@
1
+ import { homedir } from "node:os";
2
+ import { basename, join, resolve } from "node:path";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Option from "effect/Option";
5
+ import * as Schema from "effect/Schema";
6
+ import { ShellUsageError } from "./ShellErrors.js";
7
+ export const McpConfigFile = Schema.Struct({
8
+ repos: Schema.Array(Schema.Struct({ id: Schema.String, path: Schema.String }))
9
+ });
10
+ /** The same name shape as an epic id: it names the repository's state directory. */
11
+ const repoIdPattern = /^[A-Za-z0-9][A-Za-z0-9._-]*$/u;
12
+ const usage = (message) => new ShellUsageError({ message });
13
+ /**
14
+ * Turns the `mcp` flags into the operator configuration. The token is read from the
15
+ * environment or a file and is never echoed in an error message.
16
+ */
17
+ export const mcpOptionsFrom = (flags, environment, cwd, readFile) => Effect.gen(function* () {
18
+ if (flags.stdio && flags.http) {
19
+ return yield* usage("mcp takes either --stdio or --http, not both");
20
+ }
21
+ const parallelRuns = Option.getOrElse(flags.parallelRuns, () => 1);
22
+ if (!Number.isInteger(parallelRuns) || parallelRuns < 1) {
23
+ return yield* usage("--parallel-runs must be a positive integer");
24
+ }
25
+ const transport = flags.http ? yield* httpTransport(flags, environment, cwd, readFile) : stdio;
26
+ const repos = yield* reposFrom(flags, environment, cwd, readFile);
27
+ const seen = new Set();
28
+ for (const repo of repos) {
29
+ if (seen.has(repo.id)) {
30
+ return yield* usage(`mcp repository id "${repo.id}" is used twice`);
31
+ }
32
+ seen.add(repo.id);
33
+ }
34
+ return {
35
+ transport,
36
+ repos,
37
+ allowRun: flags.allowRun,
38
+ allowApprove: flags.allowApprove,
39
+ parallelRuns
40
+ };
41
+ });
42
+ const stdio = { _tag: "stdio" };
43
+ const httpTransport = (flags, environment, cwd, readFile) => Effect.gen(function* () {
44
+ const fromEnvironment = environment.LLM4TS_MCP_TOKEN?.trim() ?? "";
45
+ const fromFile = fromEnvironment.length === 0 && Option.isSome(flags.tokenFile)
46
+ ? ((yield* readFile(resolve(cwd, flags.tokenFile.value)))?.trim() ?? "")
47
+ : "";
48
+ const token = fromEnvironment.length > 0 ? fromEnvironment : fromFile;
49
+ if (token.length === 0) {
50
+ return yield* usage("--http needs a token: LLM4TS_MCP_TOKEN or --token-file");
51
+ }
52
+ const port = Option.getOrElse(flags.port, () => 4321);
53
+ if (!Number.isInteger(port) || port < 0 || port > 65535) {
54
+ return yield* usage("--port must be between 0 and 65535");
55
+ }
56
+ return {
57
+ _tag: "http",
58
+ host: Option.getOrElse(flags.host, () => "127.0.0.1"),
59
+ port,
60
+ token
61
+ };
62
+ });
63
+ const reposFrom = (flags, environment, cwd, readFile) => Effect.gen(function* () {
64
+ if (flags.repo.length > 0) {
65
+ return flags.repo.map((path) => {
66
+ const absolute = resolve(cwd, path);
67
+ return { id: basename(absolute), path: absolute };
68
+ });
69
+ }
70
+ const configHome = environment.XDG_CONFIG_HOME !== undefined && environment.XDG_CONFIG_HOME.length > 0
71
+ ? environment.XDG_CONFIG_HOME
72
+ : join(environment.HOME ?? homedir(), ".config");
73
+ const configPath = join(configHome, "llm4ts", "mcp.json");
74
+ const raw = yield* readFile(configPath);
75
+ if (raw === undefined) {
76
+ return yield* usage("mcp needs --repo <path> or ~/.config/llm4ts/mcp.json");
77
+ }
78
+ const file = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(McpConfigFile))(raw).pipe(Effect.mapError(() => usage(`${configPath} is not a valid mcp config`)));
79
+ if (file.repos.length === 0) {
80
+ return yield* usage("mcp needs --repo <path> or ~/.config/llm4ts/mcp.json");
81
+ }
82
+ const badId = file.repos.find(({ id }) => !repoIdPattern.test(id));
83
+ if (badId !== undefined) {
84
+ return yield* usage(`${configPath}: repository id "${badId.id}" must match ${repoIdPattern.source}`);
85
+ }
86
+ return file.repos.map(({ id, path }) => ({ id, path: resolve(cwd, path) }));
87
+ });
88
+ //# sourceMappingURL=OperatorConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorConfig.js","sourceRoot":"","sources":["../src/OperatorConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type * as Cause from "effect/Cause";
2
+ import * as Effect from "effect/Effect";
3
+ import type { ServeError } from "effect/http/HttpServerError";
4
+ import type { PersistenceError } from "@llm4ts/flow/FlowError";
5
+ import { type SignalSource } from "@llm4ts/runner/FlowRunner";
6
+ import { type FlowTierPaths } from "./FlowCatalog.ts";
7
+ import { type FlowProcessShape } from "./FlowProcess.ts";
8
+ import type { OperatorConfig } from "./OperatorConfig.ts";
9
+ import type { OperatorDeps } from "./OperatorTools.ts";
10
+ /**
11
+ * The Node side of `llm4ts mcp` (ADR 0041): the operator's dependencies over
12
+ * the real file system and processes, and `runMcp`, which serves until the
13
+ * server fails or a SIGINT/SIGTERM interrupts it, then stops the flows it
14
+ * started before returning.
15
+ */
16
+ /** Everything `runMcp` needs besides the run supervisor, which it builds itself. */
17
+ export interface McpRuntime<E> {
18
+ readonly operator: Omit<OperatorDeps, "supervisor">;
19
+ readonly flowProcess: FlowProcessShape;
20
+ /** The server; `runOperatorServer` on Node, a stand-in in tests. */
21
+ readonly serve: (config: OperatorConfig, deps: OperatorDeps) => Effect.Effect<never, E>;
22
+ /** How long stopping a run waits after SIGINT before SIGTERM; the supervisor's default when absent. */
23
+ readonly graceMs?: number;
24
+ }
25
+ /**
26
+ * Serves the operator until the server ends or a signal arrives. The first
27
+ * SIGINT or SIGTERM interrupts the server; closing the scope then runs the
28
+ * supervisor's finalizer, which stops every flow it started. A second signal
29
+ * exits at once (130 or 143). The handlers are removed on the way out.
30
+ */
31
+ export declare const runMcp: <E>(config: OperatorConfig, runtime: McpRuntime<E>, signals: SignalSource) => Effect.Effect<void, E | PersistenceError>;
32
+ /** A file's text, or `undefined` when it cannot be read (the `mcp` config and token file). */
33
+ export declare const nodeRead: (path: string) => Effect.Effect<string | undefined>;
34
+ /**
35
+ * Relative paths of every regular file under a directory, recursively; never
36
+ * directory names, and none when the directory is absent or unreadable.
37
+ */
38
+ export declare const nodeListFiles: (directory: string) => ReadonlyArray<string>;
39
+ /**
40
+ * The operator's dependencies on Node. `tierPaths` gives the flow tiers for a
41
+ * repository (the CLI's `shellTierPaths`, passed in to keep this module free
42
+ * of the CLI).
43
+ */
44
+ export declare const nodeOperatorRuntime: (config: OperatorConfig, tierPaths: (repoPath: string) => FlowTierPaths, environment?: Readonly<Record<string, string | undefined>>) => McpRuntime<ServeError | Cause.IllegalArgumentError>;
45
+ //# sourceMappingURL=OperatorNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorNode.d.ts","sourceRoot":"","sources":["../src/OperatorNode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIhF,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGtD;;;;;GAKG;AAEH,oFAAoF;AACpF,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IACnD,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;IACtC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACvF,uGAAuG;IACvG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EACtB,QAAQ,cAAc,EACtB,SAAS,UAAU,CAAC,CAAC,CAAC,EACtB,SAAS,YAAY,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,gBAAgB,CA0B1C,CAAA;AAED,8FAA8F;AAC9F,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAOpE,CAAA;AAEJ;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,KAAG,aAAa,CAAC,MAAM,CAwBrE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,cAAc,EACtB,WAAW,CAAC,QAAQ,EAAE,MAAM,KAAK,aAAa,EAC9C,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC,oBAAoB,CAmBnD,CAAA"}