@llm4ts/runner 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.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -0
  3. package/dist/Cli.d.ts +5 -0
  4. package/dist/Cli.d.ts.map +1 -0
  5. package/dist/Cli.js +36 -0
  6. package/dist/Cli.js.map +1 -0
  7. package/dist/CoderPolicy.d.ts +12 -0
  8. package/dist/CoderPolicy.d.ts.map +1 -0
  9. package/dist/CoderPolicy.js +59 -0
  10. package/dist/CoderPolicy.js.map +1 -0
  11. package/dist/Connectors.d.ts +28 -0
  12. package/dist/Connectors.d.ts.map +1 -0
  13. package/dist/Connectors.js +165 -0
  14. package/dist/Connectors.js.map +1 -0
  15. package/dist/Doctor.d.ts +4 -0
  16. package/dist/Doctor.d.ts.map +1 -0
  17. package/dist/Doctor.js +33 -0
  18. package/dist/Doctor.js.map +1 -0
  19. package/dist/FlowArgs.d.ts +34 -0
  20. package/dist/FlowArgs.d.ts.map +1 -0
  21. package/dist/FlowArgs.js +136 -0
  22. package/dist/FlowArgs.js.map +1 -0
  23. package/dist/FlowRunner.d.ts +48 -0
  24. package/dist/FlowRunner.d.ts.map +1 -0
  25. package/dist/FlowRunner.js +97 -0
  26. package/dist/FlowRunner.js.map +1 -0
  27. package/dist/McpStdio.d.ts +7 -0
  28. package/dist/McpStdio.d.ts.map +1 -0
  29. package/dist/McpStdio.js +19 -0
  30. package/dist/McpStdio.js.map +1 -0
  31. package/dist/NodeGeminiCliExecutor.d.ts +7 -0
  32. package/dist/NodeGeminiCliExecutor.d.ts.map +1 -0
  33. package/dist/NodeGeminiCliExecutor.js +26 -0
  34. package/dist/NodeGeminiCliExecutor.js.map +1 -0
  35. package/dist/NodeHttpClient.d.ts +5 -0
  36. package/dist/NodeHttpClient.d.ts.map +1 -0
  37. package/dist/NodeHttpClient.js +109 -0
  38. package/dist/NodeHttpClient.js.map +1 -0
  39. package/dist/NodePlainFileStore.d.ts +5 -0
  40. package/dist/NodePlainFileStore.d.ts.map +1 -0
  41. package/dist/NodePlainFileStore.js +64 -0
  42. package/dist/NodePlainFileStore.js.map +1 -0
  43. package/dist/NodeProcessExecutor.d.ts +5 -0
  44. package/dist/NodeProcessExecutor.d.ts.map +1 -0
  45. package/dist/NodeProcessExecutor.js +212 -0
  46. package/dist/NodeProcessExecutor.js.map +1 -0
  47. package/dist/NodeRuntime.d.ts +4 -0
  48. package/dist/NodeRuntime.d.ts.map +1 -0
  49. package/dist/NodeRuntime.js +11 -0
  50. package/dist/NodeRuntime.js.map +1 -0
  51. package/dist/NodeTemporaryFiles.d.ts +5 -0
  52. package/dist/NodeTemporaryFiles.d.ts.map +1 -0
  53. package/dist/NodeTemporaryFiles.js +30 -0
  54. package/dist/NodeTemporaryFiles.js.map +1 -0
  55. package/dist/NodeWorkspace.d.ts +6 -0
  56. package/dist/NodeWorkspace.d.ts.map +1 -0
  57. package/dist/NodeWorkspace.js +231 -0
  58. package/dist/NodeWorkspace.js.map +1 -0
  59. package/dist/Package.d.ts +2 -0
  60. package/dist/Package.d.ts.map +1 -0
  61. package/dist/Package.js +2 -0
  62. package/dist/Package.js.map +1 -0
  63. package/dist/ReviewFingerprint.d.ts +2 -0
  64. package/dist/ReviewFingerprint.d.ts.map +1 -0
  65. package/dist/ReviewFingerprint.js +13 -0
  66. package/dist/ReviewFingerprint.js.map +1 -0
  67. package/dist/Terminal.d.ts +46 -0
  68. package/dist/Terminal.d.ts.map +1 -0
  69. package/dist/Terminal.js +226 -0
  70. package/dist/Terminal.js.map +1 -0
  71. package/dist/TerminalInteraction.d.ts +4 -0
  72. package/dist/TerminalInteraction.d.ts.map +1 -0
  73. package/dist/TerminalInteraction.js +25 -0
  74. package/dist/TerminalInteraction.js.map +1 -0
  75. package/dist/cli-main.d.ts +3 -0
  76. package/dist/cli-main.d.ts.map +1 -0
  77. package/dist/cli-main.js +39 -0
  78. package/dist/cli-main.js.map +1 -0
  79. package/package.json +74 -0
  80. package/src/Cli.ts +51 -0
  81. package/src/CoderPolicy.ts +82 -0
  82. package/src/Connectors.ts +225 -0
  83. package/src/Doctor.ts +44 -0
  84. package/src/FlowArgs.ts +167 -0
  85. package/src/FlowRunner.ts +220 -0
  86. package/src/McpStdio.ts +41 -0
  87. package/src/NodeGeminiCliExecutor.ts +56 -0
  88. package/src/NodeHttpClient.ts +224 -0
  89. package/src/NodePlainFileStore.ts +75 -0
  90. package/src/NodeProcessExecutor.ts +331 -0
  91. package/src/NodeRuntime.ts +19 -0
  92. package/src/NodeTemporaryFiles.ts +46 -0
  93. package/src/NodeWorkspace.ts +282 -0
  94. package/src/Package.ts +1 -0
  95. package/src/ReviewFingerprint.ts +13 -0
  96. package/src/Terminal.ts +329 -0
  97. package/src/TerminalInteraction.ts +43 -0
  98. package/src/cli-main.ts +53 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Riccardo Merolla
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # @llm4ts/runner
2
+
3
+ Node runner for [llm4ts](https://github.com/riccardomerolla/llm4ts): the
4
+ `runNode` embedded entry point, connector presets, terminal rendering, the
5
+ `llm4ts` CLI, and the MCP stdio server.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @llm4ts/runner @llm4ts/flow @llm4ts/core effect
11
+ ```
12
+
13
+ Requires Node.js >= 22. `effect` is a peer dependency pinned to the Effect 4
14
+ beta line.
15
+
16
+ ## Run a flow
17
+
18
+ `runNode` provides every Node boundary (HTTP client, process executor,
19
+ temporary files, file store, connector registry) with sensible defaults — you
20
+ never assemble Effect layers yourself:
21
+
22
+ ```ts
23
+ import { runNode } from "@llm4ts/runner/FlowRunner"
24
+ import { ApiConnectorConfig } from "@llm4ts/core/ConnectorConfig"
25
+ import { ConnectorIds } from "@llm4ts/core/Models"
26
+ import { collect } from "@llm4ts/core/Streaming"
27
+
28
+ const program = runNode(
29
+ {
30
+ workDir: process.cwd(),
31
+ workspace: process.cwd(),
32
+ userPrompt: "Draft a small implementation plan",
33
+ coder: ApiConnectorConfig.make({ connectorId: ConnectorIds.Mock })
34
+ },
35
+ (context) => collect(context.coder.executeStream(context.userPrompt))
36
+ )
37
+ ```
38
+
39
+ The mock connector needs no credentials. Swap in a real provider via
40
+ `ApiConnectorConfig` (API keys are read from standard environment variables
41
+ such as `ANTHROPIC_API_KEY`) or a CLI coding agent via `coderFromEnv`
42
+ (`LLM4TS_CODER=claude|codex|gemini|...`).
43
+
44
+ ## CLI
45
+
46
+ The package ships a `llm4ts` binary that streams one prompt to your configured
47
+ coder and records a trace under `.llm4ts/`:
48
+
49
+ ```bash
50
+ npx llm4ts "explain this repository" --repo .
51
+ ```
52
+
53
+ ## Documentation
54
+
55
+ - [Repository and full documentation](https://github.com/riccardomerolla/llm4ts)
56
+ - [Configuration guide](https://github.com/riccardomerolla/llm4ts/blob/main/docs/configuration.md)
57
+ - [Runnable examples](https://github.com/riccardomerolla/llm4ts/tree/main/examples)
58
+
59
+ ## License
60
+
61
+ MIT
package/dist/Cli.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { type FlowError } from "@llm4ts/flow/FlowError";
3
+ import { type ScriptUsage } from "./FlowArgs.ts";
4
+ export declare const makeCliProgram: (argv: ReadonlyArray<string>, environment?: Readonly<Record<string, string | undefined>>, workspace?: string, defaultPrompt?: string) => Effect.Effect<void, ScriptUsage | FlowError>;
5
+ //# sourceMappingURL=Cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAKrE,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAIhG,eAAO,MAAM,cAAc,GACzB,MAAM,aAAa,CAAC,MAAM,CAAC,EAC3B,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,EACvE,kBAAyB,EACzB,gBAAgB,MAAM,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAkC7C,CAAA"}
package/dist/Cli.js ADDED
@@ -0,0 +1,36 @@
1
+ import { join } from "node:path";
2
+ import * as Effect from "effect/Effect";
3
+ import { FlowLlmError } from "@llm4ts/flow/FlowError";
4
+ import { AssistantMessage } from "@llm4ts/flow/FlowEvents";
5
+ import { collect } from "@llm4ts/core/Streaming";
6
+ import { CliConnectorConfig } from "@llm4ts/core/ConnectorConfig";
7
+ import { coderFromEnv } from "./Connectors.js";
8
+ import { parseFlowArgs, readFlowPrompt, resolveFlowRepo } from "./FlowArgs.js";
9
+ import { runNode } from "./FlowRunner.js";
10
+ import { parseVerbosity } from "./Terminal.js";
11
+ export const makeCliProgram = (argv, environment = process.env, workspace = process.cwd(), defaultPrompt) => {
12
+ const parsed = parseFlowArgs(argv);
13
+ if (!parsed.ok) {
14
+ return Effect.fail(parsed.error);
15
+ }
16
+ return Effect.gen(function* () {
17
+ const prompt = yield* readFlowPrompt(parsed.value, defaultPrompt);
18
+ const workDir = yield* resolveFlowRepo(parsed.value, workspace);
19
+ const selected = coderFromEnv(environment);
20
+ const coder = CliConnectorConfig.make({
21
+ ...selected,
22
+ workingDir: workDir
23
+ });
24
+ const timestamp = Date.now();
25
+ yield* runNode({
26
+ workDir,
27
+ workspace,
28
+ userPrompt: prompt,
29
+ coder,
30
+ verbosity: parseVerbosity(environment.LLM4TS_VERBOSITY),
31
+ tracePath: join(workDir, ".llm4ts", `trace-${timestamp}.jsonl`),
32
+ runId: timestamp.toString()
33
+ }, (context) => collect(context.coder.executeStream(prompt)).pipe(Effect.mapError(FlowLlmError.from), Effect.tap((response) => context.events.publish(AssistantMessage.make({ text: response.content }))), Effect.asVoid));
34
+ });
35
+ };
36
+ //# sourceMappingURL=Cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAoB,MAAM,eAAe,CAAA;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,IAA2B,EAC3B,cAA4D,OAAO,CAAC,GAAG,EACvE,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,EACzB,aAAsB,EACwB,EAAE;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC;YACpC,GAAG,QAAQ;YACX,UAAU,EAAE,OAAO;SACpB,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,KAAK,CAAC,CAAC,OAAO,CACZ;YACE,OAAO;YACP,SAAS;YACT,UAAU,EAAE,MAAM;YAClB,KAAK;YACL,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,gBAAgB,CAAC;YACvD,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,QAAQ,CAAC;YAC/D,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;SAC5B,EACD,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAC/C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAClC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAC1E,EACD,MAAM,CAAC,MAAM,CACd,CACJ,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import * as Schema from "effect/Schema";
2
+ import type { Grants } from "@llm4ts/core/Capability";
3
+ import { CliConnectorConfig } from "@llm4ts/core/ConnectorConfig";
4
+ declare const AppliedCoderPolicy_base: Schema.Class<AppliedCoderPolicy, Schema.Struct<{
5
+ readonly config: typeof CliConnectorConfig;
6
+ readonly unenforceable: Schema.$Array<Schema.String>;
7
+ }>, {}>;
8
+ export declare class AppliedCoderPolicy extends AppliedCoderPolicy_base {
9
+ }
10
+ export declare const applyCoderPolicy: (config: CliConnectorConfig, grants: Grants) => AppliedCoderPolicy;
11
+ export {};
12
+ //# sourceMappingURL=CoderPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoderPolicy.d.ts","sourceRoot":"","sources":["../src/CoderPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;;;;;AAGjE,qBAAa,kBAAmB,SAAQ,uBAGtC;CAAG;AAgDL,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,kBAAkB,EAC1B,QAAQ,MAAM,KACb,kBAqBF,CAAA"}
@@ -0,0 +1,59 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { Capabilities, allows } from "@llm4ts/core/Capability";
3
+ import { CliConnectorConfig } from "@llm4ts/core/ConnectorConfig";
4
+ import { ConnectorIds } from "@llm4ts/core/Models";
5
+ export class AppliedCoderPolicy extends Schema.Class("AppliedCoderPolicy")({
6
+ config: CliConnectorConfig,
7
+ unenforceable: Schema.Array(Schema.String)
8
+ }) {
9
+ }
10
+ const patterns = [
11
+ {
12
+ capability: Capabilities.GitPush,
13
+ pattern: "Bash(git push:*)"
14
+ },
15
+ {
16
+ capability: Capabilities.GitWrite,
17
+ pattern: "Bash(git commit:*),Bash(git add:*),Bash(git checkout:*)"
18
+ },
19
+ {
20
+ capability: Capabilities.GhWrite,
21
+ pattern: "Bash(gh pr:*),Bash(gh issue:*),Bash(gh api:*)"
22
+ },
23
+ {
24
+ capability: Capabilities.AdoWrite,
25
+ pattern: "Bash(az repos:*),Bash(az boards:*)"
26
+ }
27
+ ];
28
+ const capabilityName = (capability) => capability._tag === "Exec" ? `Exec(${capability.command})` : capability._tag;
29
+ const withDisallowed = (config, denied) => {
30
+ const existing = config.flags["disallowed-tools"];
31
+ const values = [
32
+ ...(existing === undefined || existing.length === 0 ? [] : [existing]),
33
+ ...denied.map(({ pattern }) => pattern)
34
+ ];
35
+ return new CliConnectorConfig({
36
+ ...config,
37
+ flags: {
38
+ ...config.flags,
39
+ "disallowed-tools": values.join(",")
40
+ }
41
+ });
42
+ };
43
+ export const applyCoderPolicy = (config, grants) => {
44
+ const denied = patterns.filter(({ capability }) => !allows(grants, capability));
45
+ if (denied.length === 0) {
46
+ return new AppliedCoderPolicy({ config, unenforceable: [] });
47
+ }
48
+ if (config.connectorId.value === ConnectorIds.ClaudeCli.value) {
49
+ return new AppliedCoderPolicy({
50
+ config: withDisallowed(config, denied),
51
+ unenforceable: []
52
+ });
53
+ }
54
+ return new AppliedCoderPolicy({
55
+ config,
56
+ unenforceable: denied.map(({ capability }) => `${config.connectorId.value} cannot enforce the missing ${capabilityName(capability)} restriction on the coder`)
57
+ });
58
+ };
59
+ //# sourceMappingURL=CoderPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoderPolicy.js","sourceRoot":"","sources":["../src/CoderPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,YAAY,EAAmB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,KAAK,CAAqB,oBAAoB,CAAC,CAAC;IAC7F,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CAC3C,CAAC;CAAG;AAOL,MAAM,QAAQ,GAAiC;IAC7C;QACE,UAAU,EAAE,YAAY,CAAC,OAAO;QAChC,OAAO,EAAE,kBAAkB;KAC5B;IACD;QACE,UAAU,EAAE,YAAY,CAAC,QAAQ;QACjC,OAAO,EAAE,yDAAyD;KACnE;IACD;QACE,UAAU,EAAE,YAAY,CAAC,OAAO;QAChC,OAAO,EAAE,+CAA+C;KACzD;IACD;QACE,UAAU,EAAE,YAAY,CAAC,QAAQ;QACjC,OAAO,EAAE,oCAAoC;KAC9C;CACF,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,UAAsB,EAAU,EAAE,CACxD,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAA;AAE9E,MAAM,cAAc,GAAG,CACrB,MAA0B,EAC1B,MAAoC,EAChB,EAAE;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;KACxC,CAAA;IAED,OAAO,IAAI,kBAAkB,CAAC;QAC5B,GAAG,MAAM;QACT,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK;YACf,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SACrC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAA0B,EAC1B,MAAc,EACM,EAAE;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IAE/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC9D,OAAO,IAAI,kBAAkB,CAAC;YAC5B,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;YACtC,aAAa,EAAE,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,IAAI,kBAAkB,CAAC;QAC5B,MAAM;QACN,aAAa,EAAE,MAAM,CAAC,GAAG,CACvB,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACjB,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,+BAA+B,cAAc,CAAC,UAAU,CAAC,2BAA2B,CAClH;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { ApiConnectorConfig, CliConnectorConfig, type ConnectorConfig } from "@llm4ts/core/ConnectorConfig";
3
+ import { ScriptUsage } from "./FlowArgs.ts";
4
+ export declare const claude: CliConnectorConfig;
5
+ export declare const codex: CliConnectorConfig;
6
+ export declare const gemini: CliConnectorConfig;
7
+ export declare const pi: CliConnectorConfig;
8
+ export declare const antigravity: CliConnectorConfig;
9
+ export declare const grok: CliConnectorConfig;
10
+ export declare const cursor: CliConnectorConfig;
11
+ export declare const opencode: CliConnectorConfig;
12
+ export declare const lmStudio: ApiConnectorConfig;
13
+ export declare const openAI: ApiConnectorConfig;
14
+ export declare const anthropic: ApiConnectorConfig;
15
+ export declare const geminiApi: ApiConnectorConfig;
16
+ export declare const ollama: ApiConnectorConfig;
17
+ export declare const mock: ApiConnectorConfig;
18
+ export declare function withModel(config: CliConnectorConfig, model: string): CliConnectorConfig;
19
+ export declare function withModel(config: ApiConnectorConfig, model: string): ApiConnectorConfig;
20
+ export declare const withTurnLimit: (config: CliConnectorConfig, turnLimit: number) => CliConnectorConfig;
21
+ export declare const withEnvironment: (config: CliConnectorConfig, environment: Readonly<Record<string, string>>) => CliConnectorConfig;
22
+ export declare const asReadOnly: (config: CliConnectorConfig) => CliConnectorConfig;
23
+ export declare const withTimeoutSeconds: (config: ApiConnectorConfig, seconds: number) => ApiConnectorConfig;
24
+ export declare const enrichApiConnector: (config: ApiConnectorConfig, environment?: Readonly<Record<string, string | undefined>>) => ApiConnectorConfig;
25
+ export declare const prepareConnector: (config: ConnectorConfig, workDir: string, environment?: Readonly<Record<string, string | undefined>>) => ConnectorConfig;
26
+ export declare const apiConnectorFromEnvironment: (environment?: Readonly<Record<string, string | undefined>> | undefined) => Effect.Effect<ApiConnectorConfig, ScriptUsage, never>;
27
+ export declare const coderFromEnv: (env?: Readonly<Record<string, string | undefined>>) => CliConnectorConfig;
28
+ //# sourceMappingURL=Connectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connectors.d.ts","sourceRoot":"","sources":["../src/Connectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,eAAO,MAAM,MAAM,oBAKjB,CAAA;AAEF,eAAO,MAAM,KAAK,oBAKhB,CAAA;AAEF,eAAO,MAAM,MAAM,oBAEjB,CAAA;AAEF,eAAO,MAAM,EAAE,oBAEb,CAAA;AAEF,eAAO,MAAM,WAAW,oBAKtB,CAAA;AAEF,eAAO,MAAM,IAAI,oBAEf,CAAA;AAEF,eAAO,MAAM,MAAM,oBAEjB,CAAA;AAEF,eAAO,MAAM,QAAQ,oBAEnB,CAAA;AAEF,eAAO,MAAM,QAAQ,oBAGnB,CAAA;AAEF,eAAO,MAAM,MAAM,oBAEjB,CAAA;AAEF,eAAO,MAAM,SAAS,oBAEpB,CAAA;AAEF,eAAO,MAAM,SAAS,oBAEpB,CAAA;AAEF,eAAO,MAAM,MAAM,oBAEjB,CAAA;AAEF,eAAO,MAAM,IAAI,oBAGf,CAAA;AAEF,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAA;AACxF,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAA;AAUxF,eAAO,MAAM,aAAa,GAAI,QAAQ,kBAAkB,EAAE,WAAW,MAAM,KAAG,kBAI1E,CAAA;AAEJ,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAC5C,kBAOC,CAAA;AAEJ,eAAO,MAAM,UAAU,GAAI,QAAQ,kBAAkB,KAAG,kBACA,CAAA;AAExD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,kBAAkB,EAC1B,SAAS,MAAM,KACd,kBAIC,CAAA;AAkBJ,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,kBAAkB,EAC1B,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,kBAYF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,eAAe,EACvB,SAAS,MAAM,EACf,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,eAG8D,CAAA;AAEjE,eAAO,MAAM,2BAA2B,mIAwCtC,CAAA;AAEF,eAAO,MAAM,YAAY,GACvB,MAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KAC9D,kBAmBF,CAAA"}
@@ -0,0 +1,165 @@
1
+ import * as Duration from "effect/Duration";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Redacted from "effect/Redacted";
4
+ import { ApiConnectorConfig, CliConnectorConfig } from "@llm4ts/core/ConnectorConfig";
5
+ import { ConnectorIds, connectorDefaultBaseUrl } from "@llm4ts/core/Models";
6
+ import { ScriptUsage } from "./FlowArgs.js";
7
+ export const claude = CliConnectorConfig.make({
8
+ connectorId: ConnectorIds.ClaudeCli,
9
+ flags: {
10
+ "permission-mode": "acceptEdits"
11
+ }
12
+ });
13
+ export const codex = CliConnectorConfig.make({
14
+ connectorId: ConnectorIds.Codex,
15
+ flags: {
16
+ sandbox: "workspace-write"
17
+ }
18
+ });
19
+ export const gemini = CliConnectorConfig.make({
20
+ connectorId: ConnectorIds.GeminiCli
21
+ });
22
+ export const pi = CliConnectorConfig.make({
23
+ connectorId: ConnectorIds.Pi
24
+ });
25
+ export const antigravity = CliConnectorConfig.make({
26
+ connectorId: ConnectorIds.AntigravityCli,
27
+ flags: {
28
+ mode: "accept-edits"
29
+ }
30
+ });
31
+ export const grok = CliConnectorConfig.make({
32
+ connectorId: ConnectorIds.Grok
33
+ });
34
+ export const cursor = CliConnectorConfig.make({
35
+ connectorId: ConnectorIds.Cursor
36
+ });
37
+ export const opencode = CliConnectorConfig.make({
38
+ connectorId: ConnectorIds.OpenCode
39
+ });
40
+ export const lmStudio = ApiConnectorConfig.make({
41
+ connectorId: ConnectorIds.LmStudio,
42
+ baseUrl: "http://localhost:1234/v1"
43
+ });
44
+ export const openAI = ApiConnectorConfig.make({
45
+ connectorId: ConnectorIds.OpenAI
46
+ });
47
+ export const anthropic = ApiConnectorConfig.make({
48
+ connectorId: ConnectorIds.Anthropic
49
+ });
50
+ export const geminiApi = ApiConnectorConfig.make({
51
+ connectorId: ConnectorIds.GeminiApi
52
+ });
53
+ export const ollama = ApiConnectorConfig.make({
54
+ connectorId: ConnectorIds.Ollama
55
+ });
56
+ export const mock = ApiConnectorConfig.make({
57
+ connectorId: ConnectorIds.Mock,
58
+ model: "mock"
59
+ });
60
+ export function withModel(config, model) {
61
+ return config instanceof CliConnectorConfig
62
+ ? CliConnectorConfig.make({ ...config, model })
63
+ : ApiConnectorConfig.make({ ...config, model });
64
+ }
65
+ export const withTurnLimit = (config, turnLimit) => CliConnectorConfig.make({
66
+ ...config,
67
+ turnLimit
68
+ });
69
+ export const withEnvironment = (config, environment) => CliConnectorConfig.make({
70
+ ...config,
71
+ envVars: {
72
+ ...config.envVars,
73
+ ...environment
74
+ }
75
+ });
76
+ export const asReadOnly = (config) => CliConnectorConfig.make({ ...config, readOnly: true });
77
+ export const withTimeoutSeconds = (config, seconds) => ApiConnectorConfig.make({
78
+ ...config,
79
+ timeout: Duration.seconds(seconds)
80
+ });
81
+ const environmentApiKey = (config, environment) => {
82
+ switch (config.connectorId.value) {
83
+ case "openai":
84
+ return environment.OPENAI_API_KEY;
85
+ case "anthropic":
86
+ return environment.ANTHROPIC_API_KEY;
87
+ case "gemini-api":
88
+ return environment.GEMINI_API_KEY ?? environment.GOOGLE_API_KEY;
89
+ default:
90
+ return undefined;
91
+ }
92
+ };
93
+ export const enrichApiConnector = (config, environment = process.env) => {
94
+ const baseUrl = config.baseUrl ?? connectorDefaultBaseUrl(config.connectorId);
95
+ const environmentKey = environmentApiKey(config, environment);
96
+ return ApiConnectorConfig.make({
97
+ ...config,
98
+ ...(baseUrl === undefined ? {} : { baseUrl }),
99
+ ...(config.apiKey !== undefined
100
+ ? { apiKey: config.apiKey }
101
+ : environmentKey === undefined
102
+ ? {}
103
+ : { apiKey: Redacted.make(environmentKey) })
104
+ });
105
+ };
106
+ export const prepareConnector = (config, workDir, environment = process.env) => config instanceof ApiConnectorConfig
107
+ ? enrichApiConnector(config, environment)
108
+ : CliConnectorConfig.make({ ...config, workingDir: workDir });
109
+ export const apiConnectorFromEnvironment = Effect.fn("@llm4ts/runner/Connectors.apiConnectorFromEnvironment")(function* (environment = process.env) {
110
+ const provider = environment.LLM4TS_PROVIDER?.trim().toLowerCase() ?? "mock";
111
+ const preset = (() => {
112
+ switch (provider) {
113
+ case "mock":
114
+ return mock;
115
+ case "openai":
116
+ return openAI;
117
+ case "anthropic":
118
+ return anthropic;
119
+ case "gemini":
120
+ case "gemini-api":
121
+ return geminiApi;
122
+ case "lm-studio":
123
+ case "lmstudio":
124
+ return lmStudio;
125
+ case "ollama":
126
+ return ollama;
127
+ default:
128
+ return undefined;
129
+ }
130
+ })();
131
+ if (preset === undefined) {
132
+ return yield* ScriptUsage.make({
133
+ message: `unknown LLM4TS_PROVIDER '${provider}'; expected ` +
134
+ "mock|openai|anthropic|gemini|lm-studio|ollama"
135
+ });
136
+ }
137
+ const model = environment.LLM4TS_MODEL?.trim();
138
+ if (provider !== "mock" && (model === undefined || model.length === 0)) {
139
+ return yield* ScriptUsage.make({
140
+ message: `LLM4TS_MODEL is required for provider '${provider}' (e.g. LLM4TS_MODEL=gpt-4o-mini)`
141
+ });
142
+ }
143
+ return model === undefined || model.length === 0 ? preset : withModel(preset, model);
144
+ });
145
+ export const coderFromEnv = (env = process.env) => {
146
+ switch (env.LLM4TS_CODER ?? env.LLM4ZIO_CODER ?? "claude") {
147
+ case "codex":
148
+ return codex;
149
+ case "gemini":
150
+ return gemini;
151
+ case "pi":
152
+ return pi;
153
+ case "agy":
154
+ return antigravity;
155
+ case "grok":
156
+ return grok;
157
+ case "cursor":
158
+ return cursor;
159
+ case "opencode":
160
+ return opencode;
161
+ default:
162
+ return claude;
163
+ }
164
+ };
165
+ //# sourceMappingURL=Connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connectors.js","sourceRoot":"","sources":["../src/Connectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC5C,WAAW,EAAE,YAAY,CAAC,SAAS;IACnC,KAAK,EAAE;QACL,iBAAiB,EAAE,aAAa;KACjC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC3C,WAAW,EAAE,YAAY,CAAC,KAAK;IAC/B,KAAK,EAAE;QACL,OAAO,EAAE,iBAAiB;KAC3B;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC5C,WAAW,EAAE,YAAY,CAAC,SAAS;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACxC,WAAW,EAAE,YAAY,CAAC,EAAE;CAC7B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACjD,WAAW,EAAE,YAAY,CAAC,cAAc;IACxC,KAAK,EAAE;QACL,IAAI,EAAE,cAAc;KACrB;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC1C,WAAW,EAAE,YAAY,CAAC,IAAI;CAC/B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC5C,WAAW,EAAE,YAAY,CAAC,MAAM;CACjC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC9C,WAAW,EAAE,YAAY,CAAC,QAAQ;CACnC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC9C,WAAW,EAAE,YAAY,CAAC,QAAQ;IAClC,OAAO,EAAE,0BAA0B;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC5C,WAAW,EAAE,YAAY,CAAC,MAAM;CACjC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC/C,WAAW,EAAE,YAAY,CAAC,SAAS;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC/C,WAAW,EAAE,YAAY,CAAC,SAAS;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC5C,WAAW,EAAE,YAAY,CAAC,MAAM;CACjC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC1C,WAAW,EAAE,YAAY,CAAC,IAAI;IAC9B,KAAK,EAAE,MAAM;CACd,CAAC,CAAA;AAIF,MAAM,UAAU,SAAS,CACvB,MAA+C,EAC/C,KAAa;IAEb,OAAO,MAAM,YAAY,kBAAkB;QACzC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/C,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,SAAiB,EAAsB,EAAE,CACjG,kBAAkB,CAAC,IAAI,CAAC;IACtB,GAAG,MAAM;IACT,SAAS;CACV,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAA0B,EAC1B,WAA6C,EACzB,EAAE,CACtB,kBAAkB,CAAC,IAAI,CAAC;IACtB,GAAG,MAAM;IACT,OAAO,EAAE;QACP,GAAG,MAAM,CAAC,OAAO;QACjB,GAAG,WAAW;KACf;CACF,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAA0B,EAAsB,EAAE,CAC3E,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAA0B,EAC1B,OAAe,EACK,EAAE,CACtB,kBAAkB,CAAC,IAAI,CAAC;IACtB,GAAG,MAAM;IACT,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;CACnC,CAAC,CAAA;AAEJ,MAAM,iBAAiB,GAAG,CACxB,MAA0B,EAC1B,WAAyD,EACrC,EAAE;IACtB,QAAQ,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,cAAc,CAAA;QACnC,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,iBAAiB,CAAA;QACtC,KAAK,YAAY;YACf,OAAO,WAAW,CAAC,cAAc,IAAI,WAAW,CAAC,cAAc,CAAA;QACjE;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAA0B,EAC1B,cAA4D,OAAO,CAAC,GAAG,EACnD,EAAE;IACtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC7E,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC7D,OAAO,kBAAkB,CAAC,IAAI,CAAC;QAC7B,GAAG,MAAM;QACT,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAC3B,CAAC,CAAC,cAAc,KAAK,SAAS;gBAC5B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;KACjD,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAuB,EACvB,OAAe,EACf,cAA4D,OAAO,CAAC,GAAG,EACtD,EAAE,CACnB,MAAM,YAAY,kBAAkB;IAClC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC;IACzC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,EAAE,CAClD,uDAAuD,CACxD,CAAC,QAAQ,CAAC,EACT,cAA4D,OAAO,CAAC,GAAG;IAEvE,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,MAAM,CAAA;IAC5E,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAA;YACb,KAAK,QAAQ;gBACX,OAAO,MAAM,CAAA;YACf,KAAK,WAAW;gBACd,OAAO,SAAS,CAAA;YAClB,KAAK,QAAQ,CAAC;YACd,KAAK,YAAY;gBACf,OAAO,SAAS,CAAA;YAClB,KAAK,WAAW,CAAC;YACjB,KAAK,UAAU;gBACb,OAAO,QAAQ,CAAA;YACjB,KAAK,QAAQ;gBACX,OAAO,MAAM,CAAA;YACf;gBACE,OAAO,SAAS,CAAA;QACpB,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YAC7B,OAAO,EACL,4BAA4B,QAAQ,cAAc;gBAClD,+CAA+C;SAClD,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE,CAAA;IAC9C,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,0CAA0C,QAAQ,mCAAmC;SAC/F,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACtF,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAoD,OAAO,CAAC,GAAG,EAC3C,EAAE;IACtB,QAAQ,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,KAAK,CAAA;QACd,KAAK,QAAQ;YACX,OAAO,MAAM,CAAA;QACf,KAAK,IAAI;YACP,OAAO,EAAE,CAAA;QACX,KAAK,KAAK;YACR,OAAO,WAAW,CAAA;QACpB,KAAK,MAAM;YACT,OAAO,IAAI,CAAA;QACb,KAAK,QAAQ;YACX,OAAO,MAAM,CAAA;QACf,KAAK,UAAU;YACb,OAAO,QAAQ,CAAA;QACjB;YACE,OAAO,MAAM,CAAA;IACjB,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type { ConnectorRegistryShape } from "@llm4ts/core/ConnectorRegistry";
3
+ export declare const makeDoctorProgram: (registry?: ConnectorRegistryShape, environment?: Readonly<Record<string, string | undefined>>) => Effect.Effect<string>;
4
+ //# sourceMappingURL=Doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Doctor.d.ts","sourceRoot":"","sources":["../src/Doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAiB5E,eAAO,MAAM,iBAAiB,GAC5B,WAAU,sBAA8D,EACxE,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAqBnB,CAAA"}
package/dist/Doctor.js ADDED
@@ -0,0 +1,33 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { nodeFlowRunnerDependencies } from "./FlowRunner.js";
3
+ const credentialKeys = [
4
+ "OPENAI_API_KEY",
5
+ "ANTHROPIC_API_KEY",
6
+ "GEMINI_API_KEY",
7
+ "GOOGLE_API_KEY"
8
+ ];
9
+ const statusLine = (id, status) => {
10
+ const mark = status.availability === "Healthy" ? "✔" : status.availability === "Unknown" ? "?" : "✖";
11
+ const auth = status.authStatus === "Unknown" ? "" : ` auth: ${status.authStatus.toLowerCase()}`;
12
+ return ` ${mark} ${id.padEnd(14)} ${status.availability.toLowerCase()}${auth}`;
13
+ };
14
+ export const makeDoctorProgram = (registry = nodeFlowRunnerDependencies().registry, environment = process.env) => Effect.map(registry.healthCheckAll, (statuses) => {
15
+ const lines = [];
16
+ lines.push("llm4ts doctor");
17
+ lines.push("");
18
+ lines.push("connectors:");
19
+ const sorted = Array.from(statuses.entries()).sort(([a], [b]) => a.value.localeCompare(b.value));
20
+ for (const [id, status] of sorted) {
21
+ lines.push(statusLine(id.value, status));
22
+ }
23
+ lines.push("");
24
+ lines.push("credentials:");
25
+ for (const key of credentialKeys) {
26
+ const value = environment[key];
27
+ lines.push(` ${value === undefined || value.length === 0 ? "✖" : "✔"} ${key}`);
28
+ }
29
+ lines.push("");
30
+ lines.push(`coder: ${environment.LLM4TS_CODER ?? environment.LLM4ZIO_CODER ?? "claude (default)"}`);
31
+ return `${lines.join("\n")}\n`;
32
+ });
33
+ //# sourceMappingURL=Doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Doctor.js","sourceRoot":"","sources":["../src/Doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAE5D,MAAM,cAAc,GAAG;IACrB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;CACR,CAAA;AAEV,MAAM,UAAU,GAAG,CAAC,EAAU,EAAE,MAAoB,EAAU,EAAE;IAC9D,MAAM,IAAI,GACR,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IACzF,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAA;IAChG,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,IAAI,EAAE,CAAA;AACjF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,WAAmC,0BAA0B,EAAE,CAAC,QAAQ,EACxE,cAA4D,OAAO,CAAC,GAAG,EAChD,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE;IAC/C,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IAChG,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAA;IACjF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CACR,UAAU,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,aAAa,IAAI,kBAAkB,EAAE,CACxF,CAAA;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC,CAAC,CAAA"}
@@ -0,0 +1,34 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ export interface FlowArgs {
4
+ readonly promptText?: string;
5
+ readonly promptFile?: string;
6
+ readonly repo?: string;
7
+ readonly help?: boolean;
8
+ readonly version?: boolean;
9
+ }
10
+ export declare const FlowUsage = "usage: llm4ts [\"<prompt>\" | --prompt-file <path> | @<path>] [--repo <path>] | llm4ts doctor";
11
+ export declare const FlowHelp = "usage: llm4ts [\"<prompt>\" | --prompt-file <path> | @<path>] [--repo <path>] | llm4ts doctor\n\nStream one prompt to your configured coding agent and print the response.\n\narguments:\n \"<prompt>\" prompt text\n @<path> read the prompt from a file\n --prompt-file <path> read the prompt from a file\n --repo, -C <path> run against this repository (default: current directory)\n -h, --help show this help\n --version print the version\n\ncommands:\n doctor check connector availability and credentials\n\nenvironment:\n LLM4TS_CODER coding agent: claude|codex|gemini|pi|agy|grok|cursor|opencode (default: claude)\n LLM4TS_VERBOSITY terminal verbosity: quiet|normal|verbose\n OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY\n credentials for API providers\n\nA trace of each run is written under .llm4ts/ in the target repository.\n";
12
+ declare const ScriptUsage_base: Schema.Class<ScriptUsage, Schema.TaggedStruct<"ScriptUsage", {
13
+ readonly message: Schema.String;
14
+ }>, import("effect/Cause").YieldableError>;
15
+ export declare class ScriptUsage extends ScriptUsage_base {
16
+ }
17
+ export type FlowArgsParseResult = {
18
+ readonly ok: true;
19
+ readonly value: FlowArgs;
20
+ } | {
21
+ readonly ok: false;
22
+ readonly error: ScriptUsage;
23
+ };
24
+ export declare const parseFlowArgs: (args: ReadonlyArray<string>) => FlowArgsParseResult;
25
+ export declare const readFlowPrompt: (args: FlowArgs, defaultPrompt?: string) => Effect.Effect<string, ScriptUsage>;
26
+ export declare const resolveFlowRepo: (args: FlowArgs, workspace: string) => Effect.Effect<string, ScriptUsage>;
27
+ export interface FlowInput {
28
+ readonly prompt: string;
29
+ readonly workDir: string;
30
+ readonly workspace: string;
31
+ }
32
+ export declare const resolveFlowInput: (defaultPrompt?: string | undefined, argv?: readonly string[] | undefined, workspace?: any) => Effect.Effect<FlowInput, ScriptUsage, never>;
33
+ export {};
34
+ //# sourceMappingURL=FlowArgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowArgs.d.ts","sourceRoot":"","sources":["../src/FlowArgs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,SAAS,kGACyE,CAAA;AAE/F,eAAO,MAAM,QAAQ,88BAsBpB,CAAA;;;;AAED,qBAAa,WAAY,SAAQ,gBAE/B;CAAG;AAEL,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAEvD,eAAO,MAAM,aAAa,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,KAAG,mBAuD3D,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,MAAM,QAAQ,EACd,gBAAgB,MAAM,KACrB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAgBnC,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,MAAM,QAAQ,EACd,WAAW,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAiBnC,CAAA;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,gBAAgB,6IAY3B,CAAA"}