@llm4ts/shell 2.45.0 → 2.47.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 (67) 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/epic-mvp.js +21 -0
  52. package/flows/lib/epic-mvp.js +451 -0
  53. package/flows/lib/epic-stories.js +88 -48
  54. package/flows/port-guide.js +4 -1
  55. package/package.json +13 -4
  56. package/src/Cli.ts +64 -3
  57. package/src/FlowLaunch.ts +20 -66
  58. package/src/FlowProcess.ts +239 -0
  59. package/src/OperatorActTools.ts +407 -0
  60. package/src/OperatorConfig.ts +148 -0
  61. package/src/OperatorNode.ts +147 -0
  62. package/src/OperatorRuns.ts +270 -0
  63. package/src/OperatorServer.ts +192 -0
  64. package/src/OperatorTools.ts +610 -0
  65. package/src/Refine.ts +4 -7
  66. package/src/RunSupervisor.ts +403 -0
  67. package/src/ShellErrors.ts +6 -0
@@ -0,0 +1,123 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import * as NodeHttpServer from "@effect/platform-node/NodeHttpServer";
4
+ import * as NodeStdio from "@effect/platform-node/NodeStdio";
5
+ import * as Clock from "effect/Clock";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Layer from "effect/Layer";
8
+ import * as Logger from "effect/Logger";
9
+ import * as Option from "effect/Option";
10
+ import * as Schema from "effect/Schema";
11
+ import * as McpProtocol from "effect/ai/McpProtocol";
12
+ import * as McpServer from "effect/ai/McpServer";
13
+ import * as Toolkit from "effect/ai/Toolkit";
14
+ import * as HttpRouter from "effect/http/HttpRouter";
15
+ import * as HttpServerRequest from "effect/http/HttpServerRequest";
16
+ import * as HttpServerResponse from "effect/http/HttpServerResponse";
17
+ import { actHandlers, actToolkit, approveTool, retroStartTool, startRunTool, stopRunTool, waitHandlers, waitToolkit } from "./OperatorActTools.js";
18
+ import { readHandlers, readToolkit } from "./OperatorTools.js";
19
+ import { packageVersion } from "./Package.js";
20
+ /**
21
+ * The operator MCP server (`llm4ts mcp`, ADR 0041): the read, wait and allowed
22
+ * act tools served over stdio, or over HTTP at `/mcp` behind a bearer token.
23
+ * A tool that the configuration does not allow is never registered, so it is
24
+ * absent from `tools/list` rather than refused when called.
25
+ */
26
+ export const serverName = "llm4ts";
27
+ export const serverPath = "/mcp";
28
+ const serverInfo = {
29
+ name: serverName,
30
+ version: packageVersion,
31
+ protocols: [McpProtocol.v2025_06_18]
32
+ };
33
+ const runToolkit = Toolkit.make(startRunTool, stopRunTool, retroStartTool);
34
+ const approveToolkit = Toolkit.make(approveTool);
35
+ /** The act tools a configuration allows: `--allow-run` and `--allow-approve` each add their own. */
36
+ export const actToolkitFor = (config) => config.allowRun
37
+ ? config.allowApprove
38
+ ? actToolkit
39
+ : runToolkit
40
+ : config.allowApprove
41
+ ? approveToolkit
42
+ : Toolkit.empty;
43
+ const actLayer = (config, deps) => {
44
+ const act = actHandlers(deps);
45
+ if (config.allowRun && config.allowApprove) {
46
+ return McpServer.toolkit(actToolkit).pipe(Layer.provide(actToolkit.toLayer(act)));
47
+ }
48
+ if (config.allowRun) {
49
+ const handlers = runToolkit.of({
50
+ start_run: act.start_run,
51
+ stop_run: act.stop_run,
52
+ retro_start: act.retro_start
53
+ });
54
+ return McpServer.toolkit(runToolkit).pipe(Layer.provide(runToolkit.toLayer(handlers)));
55
+ }
56
+ if (config.allowApprove) {
57
+ const handlers = approveToolkit.of({ approve: act.approve });
58
+ return McpServer.toolkit(approveToolkit).pipe(Layer.provide(approveToolkit.toLayer(handlers)));
59
+ }
60
+ return Layer.empty;
61
+ };
62
+ /** Every tool this configuration serves, registered on the server it is provided. */
63
+ export const toolLayer = (config, deps) => Layer.mergeAll(McpServer.toolkit(readToolkit).pipe(Layer.provide(readToolkit.toLayer(readHandlers(deps)))), McpServer.toolkit(waitToolkit).pipe(Layer.provide(waitToolkit.toLayer(waitHandlers(deps)))), actLayer(config, deps));
64
+ const unauthorized = HttpServerResponse.empty({ status: 401 });
65
+ /**
66
+ * Lets a request through only with `Authorization: Bearer <token>`, compared in
67
+ * constant time; anything else is a bare 401. The token is never logged.
68
+ */
69
+ export const bearerMiddleware = (token) => {
70
+ const expected = Buffer.from(`Bearer ${token}`, "utf8");
71
+ const matches = (header) => {
72
+ if (header === undefined)
73
+ return false;
74
+ const actual = Buffer.from(header, "utf8");
75
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
76
+ };
77
+ return HttpRouter.middleware((httpEffect) => Effect.gen(function* () {
78
+ const request = yield* HttpServerRequest.HttpServerRequest;
79
+ return matches(request.headers.authorization) ? yield* httpEffect : unauthorized;
80
+ })).layer;
81
+ };
82
+ /** The HTTP application: the tools on an MCP endpoint at `/mcp`, behind the bearer token. */
83
+ export const httpAppLayer = (config, deps) => toolLayer(config, deps).pipe(Layer.provide(McpServer.layerHttp({ ...serverInfo, path: serverPath })), Layer.provide(bearerMiddleware(config.transport.token)));
84
+ const RpcCall = Schema.Struct({
85
+ method: Schema.String,
86
+ params: Schema.optional(Schema.Struct({ name: Schema.optional(Schema.String) }))
87
+ });
88
+ const decodeRpcCall = Schema.decodeUnknownOption(Schema.fromJsonString(RpcCall));
89
+ /** What a request asked for: its JSON-RPC method and, for `tools/call`, the tool. Never its arguments. */
90
+ const requestLabel = (body) => Option.match(decodeRpcCall(body), {
91
+ onNone: () => "request",
92
+ onSome: (call) => call.method === "tools/call" && call.params?.name !== undefined
93
+ ? `tools/call ${call.params.name}`
94
+ : call.method
95
+ });
96
+ /**
97
+ * One log line per HTTP request: method, tool, duration and status. The body
98
+ * is read only after the endpoint has read it (the read is cached), and never
99
+ * for a request the token check turned away.
100
+ */
101
+ const requestLog = HttpRouter.middleware((httpEffect) => Effect.gen(function* () {
102
+ const request = yield* HttpServerRequest.HttpServerRequest;
103
+ const startedAt = yield* Clock.currentTimeMillis;
104
+ const response = yield* httpEffect;
105
+ const elapsed = (yield* Clock.currentTimeMillis) - startedAt;
106
+ const label = response.status === 401 || request.method !== "POST"
107
+ ? request.method
108
+ : yield* request.text.pipe(Effect.map(requestLabel), Effect.orElseSucceed(() => "request"));
109
+ yield* Effect.logInfo(`mcp ${label} ${elapsed}ms status=${response.status}`);
110
+ return response;
111
+ }), { global: true });
112
+ /** Serves the operator tools on the configured transport until interrupted. */
113
+ export const runOperatorServer = (config, deps) => {
114
+ const transport = config.transport;
115
+ if (transport._tag === "stdio") {
116
+ // stdout carries the protocol: every log line goes to stderr.
117
+ return Layer.launch(toolLayer(config, deps).pipe(Layer.provide(McpServer.layerStdio(serverInfo)), Layer.provide(NodeStdio.layer))).pipe(Effect.provideService(Logger.LogToStderr, true));
118
+ }
119
+ return Layer.launch(HttpRouter.serve(Layer.merge(httpAppLayer({ ...config, transport }, deps), requestLog), {
120
+ disableLogger: true
121
+ }).pipe(Layer.provide(NodeHttpServer.layer(createServer, { host: transport.host, port: transport.port }))));
122
+ };
123
+ //# sourceMappingURL=OperatorServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorServer.js","sourceRoot":"","sources":["../src/OperatorServer.ts"],"names":[],"mappings":"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"}