@llm4ts/core 3.3.0 → 4.0.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 (89) hide show
  1. package/dist/ConnectorConfig.d.ts +3 -1
  2. package/dist/ConnectorConfig.d.ts.map +1 -1
  3. package/dist/ConnectorConfig.js +4 -17
  4. package/dist/ConnectorConfig.js.map +1 -1
  5. package/dist/Models.d.ts +177 -22
  6. package/dist/Models.d.ts.map +1 -1
  7. package/dist/Models.js +144 -99
  8. package/dist/Models.js.map +1 -1
  9. package/dist/UsageLimits.d.ts.map +1 -1
  10. package/dist/UsageLimits.js +1 -0
  11. package/dist/UsageLimits.js.map +1 -1
  12. package/dist/eval/Checks.d.ts +1 -1
  13. package/dist/eval/Checks.d.ts.map +1 -1
  14. package/dist/eval/Checks.js.map +1 -1
  15. package/dist/eval/Eval.d.ts +4 -1
  16. package/dist/eval/Eval.d.ts.map +1 -1
  17. package/dist/eval/Eval.js.map +1 -1
  18. package/dist/eval/EvalSuite.d.ts +1 -2
  19. package/dist/eval/EvalSuite.d.ts.map +1 -1
  20. package/dist/eval/EvalSuite.js.map +1 -1
  21. package/dist/eval/Evaluator.d.ts +1 -6
  22. package/dist/eval/Evaluator.d.ts.map +1 -1
  23. package/dist/eval/Evaluator.js.map +1 -1
  24. package/dist/eval/Judge.d.ts +1 -2
  25. package/dist/eval/Judge.d.ts.map +1 -1
  26. package/dist/eval/Judge.js.map +1 -1
  27. package/dist/providers/AntigravityConnector.d.ts.map +1 -1
  28. package/dist/providers/AntigravityConnector.js +5 -4
  29. package/dist/providers/AntigravityConnector.js.map +1 -1
  30. package/dist/providers/ClaudeCliConnector.d.ts.map +1 -1
  31. package/dist/providers/ClaudeCliConnector.js +7 -6
  32. package/dist/providers/ClaudeCliConnector.js.map +1 -1
  33. package/dist/providers/CodexConnector.d.ts.map +1 -1
  34. package/dist/providers/CodexConnector.js +8 -7
  35. package/dist/providers/CodexConnector.js.map +1 -1
  36. package/dist/providers/ConnectorFactories.d.ts.map +1 -1
  37. package/dist/providers/ConnectorFactories.js +26 -20
  38. package/dist/providers/ConnectorFactories.js.map +1 -1
  39. package/dist/providers/CopilotConnector.d.ts.map +1 -1
  40. package/dist/providers/CopilotConnector.js +5 -4
  41. package/dist/providers/CopilotConnector.js.map +1 -1
  42. package/dist/providers/CursorConnector.d.ts.map +1 -1
  43. package/dist/providers/CursorConnector.js +6 -5
  44. package/dist/providers/CursorConnector.js.map +1 -1
  45. package/dist/providers/GeminiAcpSession.d.ts.map +1 -1
  46. package/dist/providers/GeminiAcpSession.js +3 -1
  47. package/dist/providers/GeminiAcpSession.js.map +1 -1
  48. package/dist/providers/GeminiCliProvider.d.ts.map +1 -1
  49. package/dist/providers/GeminiCliProvider.js +4 -3
  50. package/dist/providers/GeminiCliProvider.js.map +1 -1
  51. package/dist/providers/GrokCliConnector.d.ts.map +1 -1
  52. package/dist/providers/GrokCliConnector.js +11 -5
  53. package/dist/providers/GrokCliConnector.js.map +1 -1
  54. package/dist/providers/OpenCodeCliConnector.d.ts.map +1 -1
  55. package/dist/providers/OpenCodeCliConnector.js +6 -5
  56. package/dist/providers/OpenCodeCliConnector.js.map +1 -1
  57. package/dist/providers/PiConnector.d.ts.map +1 -1
  58. package/dist/providers/PiConnector.js +8 -7
  59. package/dist/providers/PiConnector.js.map +1 -1
  60. package/package.json +17 -20
  61. package/src/ConnectorConfig.ts +18 -17
  62. package/src/Models.ts +238 -101
  63. package/src/UsageLimits.ts +1 -0
  64. package/src/eval/Checks.ts +2 -2
  65. package/src/eval/Eval.ts +4 -1
  66. package/src/eval/EvalSuite.ts +1 -2
  67. package/src/eval/Evaluator.ts +1 -6
  68. package/src/eval/Judge.ts +2 -2
  69. package/src/providers/AntigravityConnector.ts +12 -4
  70. package/src/providers/ClaudeCliConnector.ts +9 -6
  71. package/src/providers/CodexConnector.ts +10 -7
  72. package/src/providers/ConnectorFactories.ts +53 -51
  73. package/src/providers/CopilotConnector.ts +6 -4
  74. package/src/providers/CursorConnector.ts +7 -5
  75. package/src/providers/GeminiAcpSession.ts +4 -1
  76. package/src/providers/GeminiCliProvider.ts +6 -3
  77. package/src/providers/GrokCliConnector.ts +12 -5
  78. package/src/providers/OpenCodeCliConnector.ts +7 -5
  79. package/src/providers/PiConnector.ts +15 -7
  80. package/dist/AgentSession.d.ts +0 -66
  81. package/dist/AgentSession.d.ts.map +0 -1
  82. package/dist/AgentSession.js +0 -53
  83. package/dist/AgentSession.js.map +0 -1
  84. package/dist/providers/ClaudeAgentSession.d.ts +0 -11
  85. package/dist/providers/ClaudeAgentSession.d.ts.map +0 -1
  86. package/dist/providers/ClaudeAgentSession.js +0 -161
  87. package/dist/providers/ClaudeAgentSession.js.map +0 -1
  88. package/src/AgentSession.ts +0 -69
  89. package/src/providers/ClaudeAgentSession.ts +0 -230
@@ -1,10 +1,12 @@
1
1
  import * as Effect from "effect/Effect"
2
2
  import * as Layer from "effect/Layer"
3
+ import * as Record from "effect/Record"
3
4
  import {
4
5
  ApiConnectorConfig,
5
6
  CliConnectorConfig,
6
7
  toLlmConfig,
7
- type ConnectorConfig
8
+ type ConnectorConfig,
9
+ type ConnectorConfigOf
8
10
  } from "../ConnectorConfig.ts"
9
11
  import {
10
12
  ConnectorRegistry,
@@ -15,7 +17,14 @@ import {
15
17
  import type { ConnectorShape } from "../Connector.ts"
16
18
  import { ConfigError, type LlmError } from "../Errors.ts"
17
19
  import { HttpClient, type HttpClientShape } from "../HttpClient.ts"
18
- import { ConnectorIds, LlmConfig, type ConnectorId, type ConnectorKind } from "../Models.ts"
20
+ import {
21
+ ConnectorIds,
22
+ LlmConfig,
23
+ isCliConnectorName,
24
+ type ConnectorId,
25
+ type ConnectorKind,
26
+ type ConnectorName
27
+ } from "../Models.ts"
19
28
  import { ProcessExecutor, type ProcessExecutorShape } from "../ProcessExecutor.ts"
20
29
  import { TemporaryFiles, type TemporaryFilesShape } from "../TemporaryFiles.ts"
21
30
  import { makeAnthropicProvider } from "./AnthropicProvider.ts"
@@ -76,58 +85,51 @@ const cliFactory = (
76
85
  : Effect.fail(expectedConfig("Cli", id))
77
86
  })
78
87
 
88
+ // A connector without an entry here does not compile. The registry lists
89
+ // them in this order.
90
+ const builders: {
91
+ readonly [K in ConnectorName]: (
92
+ config: ConnectorConfigOf<K>,
93
+ dependencies: ConnectorFactoryDependencies
94
+ ) => ConnectorShape
95
+ } = {
96
+ OpenAI: (config, { http }) => makeOpenAIProvider(toLlmConfig(config), http),
97
+ Anthropic: (config, { http }) => makeAnthropicProvider(toLlmConfig(config), http),
98
+ GeminiApi: (config, { http }) => makeGeminiApiProvider(toLlmConfig(config), http),
99
+ LmStudio: (config, { http }) => makeLmStudioProvider(toLlmConfig(config), http),
100
+ Ollama: (config, { http }) => makeOllamaProvider(toLlmConfig(config), http),
101
+ MlxLm: (config, { http }) => makeMlxLmProvider(toLlmConfig(config), http),
102
+ ClaudeCli: (config, { process }) => makeClaudeCliConnector(config, process),
103
+ OpenCode: (config, { process }) => makeOpenCodeCliConnector(config, process),
104
+ GeminiCli: (config, { geminiCli }) =>
105
+ makeGeminiCliProvider(
106
+ LlmConfig.make({
107
+ provider: "GeminiCli",
108
+ model: config.model ?? "gemini-2.5-flash"
109
+ }),
110
+ geminiCli,
111
+ geminiCliExecutionContextFrom(config)
112
+ ),
113
+ Codex: (config, { process, temporaryFiles }) =>
114
+ makeCodexConnector(config, process, temporaryFiles),
115
+ Copilot: (config, { process }) => makeCopilotConnector(config, process),
116
+ Pi: (config, { process }) => makePiConnector(config, process),
117
+ AntigravityCli: (config, { process }) => makeAntigravityConnector(config, process),
118
+ Grok: (config, { process }) => makeGrokCliConnector(config, process),
119
+ Cursor: (config, { process }) => makeCursorConnector(config, process),
120
+ Mock: (config) => makeMockProvider(toLlmConfig(config))
121
+ }
122
+
79
123
  export const createConnectorRegistry = (
80
124
  dependencies: ConnectorFactoryDependencies
81
125
  ): ConnectorRegistryShape =>
82
- makeConnectorRegistry([
83
- apiFactory(ConnectorIds.OpenAI, (config) =>
84
- makeOpenAIProvider(toLlmConfig(config), dependencies.http)
85
- ),
86
- apiFactory(ConnectorIds.Anthropic, (config) =>
87
- makeAnthropicProvider(toLlmConfig(config), dependencies.http)
88
- ),
89
- apiFactory(ConnectorIds.GeminiApi, (config) =>
90
- makeGeminiApiProvider(toLlmConfig(config), dependencies.http)
91
- ),
92
- apiFactory(ConnectorIds.LmStudio, (config) =>
93
- makeLmStudioProvider(toLlmConfig(config), dependencies.http)
94
- ),
95
- apiFactory(ConnectorIds.Ollama, (config) =>
96
- makeOllamaProvider(toLlmConfig(config), dependencies.http)
97
- ),
98
- apiFactory(ConnectorIds.MlxLm, (config) =>
99
- makeMlxLmProvider(toLlmConfig(config), dependencies.http)
100
- ),
101
- cliFactory(ConnectorIds.ClaudeCli, (config) =>
102
- makeClaudeCliConnector(config, dependencies.process)
103
- ),
104
- cliFactory(ConnectorIds.OpenCode, (config) =>
105
- makeOpenCodeCliConnector(config, dependencies.process)
106
- ),
107
- cliFactory(ConnectorIds.GeminiCli, (config) =>
108
- makeGeminiCliProvider(
109
- LlmConfig.make({
110
- provider: "GeminiCli",
111
- model: config.model ?? "gemini-2.5-flash"
112
- }),
113
- dependencies.geminiCli,
114
- geminiCliExecutionContextFrom(config)
115
- )
116
- ),
117
- cliFactory(ConnectorIds.Codex, (config) =>
118
- makeCodexConnector(config, dependencies.process, dependencies.temporaryFiles)
119
- ),
120
- cliFactory(ConnectorIds.Copilot, (config) =>
121
- makeCopilotConnector(config, dependencies.process)
122
- ),
123
- cliFactory(ConnectorIds.Pi, (config) => makePiConnector(config, dependencies.process)),
124
- cliFactory(ConnectorIds.AntigravityCli, (config) =>
125
- makeAntigravityConnector(config, dependencies.process)
126
- ),
127
- cliFactory(ConnectorIds.Grok, (config) => makeGrokCliConnector(config, dependencies.process)),
128
- cliFactory(ConnectorIds.Cursor, (config) => makeCursorConnector(config, dependencies.process)),
129
- apiFactory(ConnectorIds.Mock, (config) => makeMockProvider(toLlmConfig(config)))
130
- ])
126
+ makeConnectorRegistry(
127
+ Record.keys(builders).map((name) =>
128
+ isCliConnectorName(name)
129
+ ? cliFactory(ConnectorIds[name], (config) => builders[name](config, dependencies))
130
+ : apiFactory(ConnectorIds[name], (config) => builders[name](config, dependencies))
131
+ )
132
+ )
131
133
 
132
134
  export const ConnectorRegistryLive = Layer.effect(
133
135
  ConnectorRegistry,
@@ -2,12 +2,14 @@ import * as Effect from "effect/Effect"
2
2
  import * as Stream from "effect/Stream"
3
3
  import { makeCliConnector, type CliConnectorShape } from "../Connector.ts"
4
4
  import type { CliConnectorConfig } from "../ConnectorConfig.ts"
5
- import { ConnectorCapabilities, ConnectorIds, LlmChunk } from "../Models.ts"
5
+ import { ConnectorCapabilities, ConnectorIds, LlmChunk, cliExecutable } from "../Models.ts"
6
6
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
7
7
  import { failClassifiedCliError } from "./CliSupport.ts"
8
8
 
9
+ const executable = cliExecutable("Copilot")
10
+
9
11
  export const buildCopilotArgv = (prompt: string): ReadonlyArray<string> => [
10
- "gh",
12
+ executable,
11
13
  "copilot",
12
14
  "suggest",
13
15
  "-t",
@@ -46,7 +48,7 @@ export const makeCopilotConnector = (
46
48
  readOnlyEnforcement: "ignored"
47
49
  }),
48
50
  buildArgv: (prompt, _context) => buildCopilotArgv(prompt),
49
- buildInteractiveArgv: (_context) => ["gh", "copilot"],
51
+ buildInteractiveArgv: (_context) => [executable, "copilot"],
50
52
  complete,
51
53
  completeStream: (prompt) =>
52
54
  Stream.fromEffect(complete(prompt)).pipe(
@@ -55,6 +57,6 @@ export const makeCopilotConnector = (
55
57
  // No auth probe: `gh auth status` validates every stored token against
56
58
  // the GitHub API (and `gh auth token` would print the secret), so there
57
59
  // is no offline login check to run; the login stays Unknown.
58
- versionProbe: { executor, binary: "gh", versionArgs: ["copilot", "--version"], cwd: "." }
60
+ versionProbe: { executor, binary: executable, versionArgs: ["copilot", "--version"], cwd: "." }
59
61
  })
60
62
  }
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
2
2
  import * as Stream from "effect/Stream"
3
3
  import { makeCliConnector, type CliAuthProbe, type CliConnectorShape } from "../Connector.ts"
4
4
  import type { CliConnectorConfig } from "../ConnectorConfig.ts"
5
- import { ConnectorCapabilities, ConnectorIds, LlmChunk } from "../Models.ts"
5
+ import { ConnectorCapabilities, ConnectorIds, LlmChunk, cliExecutable } from "../Models.ts"
6
6
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
7
7
  import {
8
8
  failClassifiedCliError,
@@ -19,6 +19,8 @@ import {
19
19
  type JsonValue
20
20
  } from "./CliSupport.ts"
21
21
 
22
+ const executable = cliExecutable("Cursor")
23
+
22
24
  /**
23
25
  * `cursor-agent status --format json` (alias `whoami`) answers
24
26
  * `{"isAuthenticated": true|false, ...}` from the stored tokens.
@@ -84,7 +86,7 @@ export const makeCursorConnector = (
84
86
  const cwd = config.workingDir ?? "."
85
87
  const extraArgs = cursorExtraArgs(config)
86
88
  const buildArgv = (prompt: string): ReadonlyArray<string> => [
87
- "cursor-agent",
89
+ executable,
88
90
  ...extraArgs,
89
91
  "-p",
90
92
  prompt
@@ -107,7 +109,7 @@ export const makeCursorConnector = (
107
109
  const completeStream = (prompt: string) =>
108
110
  executor
109
111
  .runStreaming(
110
- ["cursor-agent", "--output-format", "stream-json", ...extraArgs, "-p", prompt],
112
+ [executable, "--output-format", "stream-json", ...extraArgs, "-p", prompt],
111
113
  cwd,
112
114
  config.envVars
113
115
  )
@@ -133,9 +135,9 @@ export const makeCursorConnector = (
133
135
  readOnlyEnforcement: "ignored"
134
136
  }),
135
137
  buildArgv: (prompt, _context) => buildArgv(prompt),
136
- buildInteractiveArgv: (_context) => ["cursor-agent", ...extraArgs],
138
+ buildInteractiveArgv: (_context) => [executable, ...extraArgs],
137
139
  complete,
138
140
  completeStream,
139
- versionProbe: { executor, binary: "cursor-agent", cwd, authProbe: cursorAuthProbe }
141
+ versionProbe: { executor, binary: executable, cwd, authProbe: cursorAuthProbe }
140
142
  })
141
143
  }
@@ -16,6 +16,9 @@ import {
16
16
  type JsonRecord,
17
17
  type JsonValue
18
18
  } from "./CliSupport.ts"
19
+ import { cliExecutable } from "../Models.ts"
20
+
21
+ const executable = cliExecutable("GeminiCli")
19
22
 
20
23
  /**
21
24
  * ACP (Agent Client Protocol, `gemini --experimental-acp`) message shapes
@@ -28,7 +31,7 @@ import {
28
31
  * integration smoke test, not a substitute for that determinism.
29
32
  */
30
33
  export const geminiAcpArgv = (model: string | undefined): ReadonlyArray<string> => [
31
- "gemini",
34
+ executable,
32
35
  "--experimental-acp",
33
36
  ...(model === undefined ? [] : ["-m", model])
34
37
  ]
@@ -22,7 +22,8 @@ import {
22
22
  TokenUsage,
23
23
  type JsonSchema,
24
24
  type LlmConfig,
25
- type Message
25
+ type Message,
26
+ cliExecutable
26
27
  } from "../Models.ts"
27
28
  import { collect } from "../Streaming.ts"
28
29
  import { jsonCandidates, parseFromText, withSchemaHint } from "../StructuredOutput.ts"
@@ -41,6 +42,8 @@ import {
41
42
  type JsonValue
42
43
  } from "./CliSupport.ts"
43
44
 
45
+ const executable = cliExecutable("GeminiCli")
46
+
44
47
  export class GeminiCliLogLine extends Schema.TaggedClass<GeminiCliLogLine>()("LogLine", {
45
48
  line: Schema.String
46
49
  }) {}
@@ -1005,14 +1008,14 @@ export const makeGeminiCliProvider = (
1005
1008
  id: ConnectorIds.GeminiCli,
1006
1009
  interactionSupport: "InteractiveStdin",
1007
1010
  buildArgv: (prompt, context) => [
1008
- "gemini",
1011
+ executable,
1009
1012
  "--yolo",
1010
1013
  ...(context.repoPath.length === 0 ? [] : ["--include-directories", context.repoPath]),
1011
1014
  "-p",
1012
1015
  prompt
1013
1016
  ],
1014
1017
  buildInteractiveArgv: (context) => [
1015
- "gemini",
1018
+ executable,
1016
1019
  "--yolo",
1017
1020
  ...(context.repoPath.length === 0 ? [] : ["--include-directories", context.repoPath])
1018
1021
  ],
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
2
2
  import * as Stream from "effect/Stream"
3
3
  import { makeCliConnector, type CliConnectorShape } from "../Connector.ts"
4
4
  import type { CliConnectorConfig } from "../ConnectorConfig.ts"
5
- import { ConnectorIds, LlmChunk, TokenUsage } from "../Models.ts"
5
+ import { ConnectorIds, LlmChunk, TokenUsage, cliExecutable } from "../Models.ts"
6
6
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
7
7
  import {
8
8
  failClassifiedCliError,
@@ -16,6 +16,8 @@ import {
16
16
  usageEventChunk
17
17
  } from "./CliSupport.ts"
18
18
 
19
+ const executable = cliExecutable("Grok")
20
+
19
21
  export const grokCliExtraArgs = (config: CliConnectorConfig): ReadonlyArray<string> => [
20
22
  ...optionalModelArgs(config.model),
21
23
  ...(config.readOnly ? ["--permission-mode", "plan"] : ["--always-approve"]),
@@ -75,7 +77,12 @@ export const makeGrokCliConnector = (
75
77
  ): CliConnectorShape => {
76
78
  const cwd = config.workingDir ?? "."
77
79
  const extraArgs = grokCliExtraArgs(config)
78
- const buildArgv = (prompt: string): ReadonlyArray<string> => ["grok", ...extraArgs, "-p", prompt]
80
+ const buildArgv = (prompt: string): ReadonlyArray<string> => [
81
+ executable,
82
+ ...extraArgs,
83
+ "-p",
84
+ prompt
85
+ ]
79
86
 
80
87
  const complete = Effect.fn("@llm4ts/core/providers/GrokCliConnector.complete")(function* (
81
88
  prompt: string
@@ -91,7 +98,7 @@ export const makeGrokCliConnector = (
91
98
  const completeStream = (prompt: string) =>
92
99
  executor
93
100
  .runStreaming(
94
- ["grok", "--output-format", "streaming-json", ...extraArgs, "-p", prompt],
101
+ [executable, "--output-format", "streaming-json", ...extraArgs, "-p", prompt],
95
102
  cwd,
96
103
  config.envVars
97
104
  )
@@ -109,10 +116,10 @@ export const makeGrokCliConnector = (
109
116
  id: ConnectorIds.Grok,
110
117
  interactionSupport: "ContinuationOnly",
111
118
  buildArgv: (prompt, _context) => buildArgv(prompt),
112
- buildInteractiveArgv: (_context) => ["grok", ...extraArgs],
119
+ buildInteractiveArgv: (_context) => [executable, ...extraArgs],
113
120
  complete,
114
121
  completeStream,
115
122
  // No auth probe: grok offers `login` but no status subcommand; Unknown.
116
- versionProbe: { executor, binary: "grok", cwd }
123
+ versionProbe: { executor, binary: executable, cwd }
117
124
  })
118
125
  }
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect"
2
2
  import * as Stream from "effect/Stream"
3
3
  import { makeCliConnector, type CliConnectorShape } from "../Connector.ts"
4
4
  import type { CliConnectorConfig } from "../ConnectorConfig.ts"
5
- import { ConnectorIds, LlmChunk, TokenUsage } from "../Models.ts"
5
+ import { ConnectorIds, LlmChunk, TokenUsage, cliExecutable } from "../Models.ts"
6
6
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
7
7
  import {
8
8
  failClassifiedCliError,
@@ -17,6 +17,8 @@ import {
17
17
  usageEventChunk
18
18
  } from "./CliSupport.ts"
19
19
 
20
+ const executable = cliExecutable("OpenCode")
21
+
20
22
  export const openCodeCliExtraArgs = (config: CliConnectorConfig): ReadonlyArray<string> => [
21
23
  ...optionalModelArgs(config.model),
22
24
  ...(config.readOnly ? ["--agent", "plan"] : ["--auto"]),
@@ -98,7 +100,7 @@ export const makeOpenCodeCliConnector = (
98
100
  const cwd = config.workingDir ?? "."
99
101
  const extraArgs = openCodeCliExtraArgs(config)
100
102
  const buildArgv = (prompt: string): ReadonlyArray<string> => [
101
- "opencode",
103
+ executable,
102
104
  "run",
103
105
  ...extraArgs,
104
106
  prompt
@@ -122,7 +124,7 @@ export const makeOpenCodeCliConnector = (
122
124
  const completeStream = (prompt: string) =>
123
125
  executor
124
126
  .runStreaming(
125
- ["opencode", "run", "--format", "json", ...extraArgs, prompt],
127
+ [executable, "run", "--format", "json", ...extraArgs, prompt],
126
128
  cwd,
127
129
  config.envVars
128
130
  )
@@ -142,11 +144,11 @@ export const makeOpenCodeCliConnector = (
142
144
  id: ConnectorIds.OpenCode,
143
145
  interactionSupport: "ContinuationOnly",
144
146
  buildArgv: (prompt, _context) => buildArgv(prompt),
145
- buildInteractiveArgv: (_context) => ["opencode"],
147
+ buildInteractiveArgv: (_context) => [executable],
146
148
  complete,
147
149
  completeStream,
148
150
  // No auth probe: `opencode auth list` lists stored credentials by
149
151
  // provider, not whether the provider this seat runs has any; Unknown.
150
- versionProbe: { executor, binary: "opencode", cwd }
152
+ versionProbe: { executor, binary: executable, cwd }
151
153
  })
152
154
  }
@@ -3,7 +3,13 @@ import * as Stream from "effect/Stream"
3
3
  import { makeCliConnector, type CliAuthProbe, type CliConnectorShape } from "../Connector.ts"
4
4
  import type { CliConnectorConfig } from "../ConnectorConfig.ts"
5
5
  import { InvalidRequestError, ProviderError, type LlmError } from "../Errors.ts"
6
- import { ConnectorCapabilities, ConnectorIds, LlmChunk, TokenUsage } from "../Models.ts"
6
+ import {
7
+ ConnectorCapabilities,
8
+ ConnectorIds,
9
+ LlmChunk,
10
+ TokenUsage,
11
+ cliExecutable
12
+ } from "../Models.ts"
7
13
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
8
14
  import {
9
15
  atLeastVersion,
@@ -26,6 +32,8 @@ import {
26
32
  statusChunk
27
33
  } from "./CliSupport.ts"
28
34
 
35
+ const executable = cliExecutable("Pi")
36
+
29
37
  /**
30
38
  * `pi auth check --model <model> --no-refresh --json` says whether pi holds
31
39
  * credentials for the provider that model resolves to:
@@ -235,7 +243,7 @@ export const makePiConnector = (
235
243
  const checkFloorOnce: Effect.Effect<void, LlmError> = Effect.suspend(() =>
236
244
  floorChecked
237
245
  ? Effect.void
238
- : Effect.flatMap(executor.run(["pi", "--version"], cwd, config.envVars), (result) => {
246
+ : Effect.flatMap(executor.run([executable, "--version"], cwd, config.envVars), (result) => {
239
247
  const problem = piReadOnlyProblem([...result.stdout, ...result.stderr].join("\n"))
240
248
  return problem === undefined
241
249
  ? Effect.sync(() => {
@@ -250,7 +258,7 @@ export const makePiConnector = (
250
258
  ) {
251
259
  yield* checkFloorOnce
252
260
  const result = yield* executor.runWithStdin(
253
- ["pi", "-p", ...extraArgs],
261
+ [executable, "-p", ...extraArgs],
254
262
  cwd,
255
263
  config.envVars,
256
264
  prompt
@@ -273,7 +281,7 @@ export const makePiConnector = (
273
281
  Stream.drain,
274
282
  Stream.concat(
275
283
  executor.runStreamingWithStdin(
276
- ["pi", "-p", "--mode", "json", ...extraArgs],
284
+ [executable, "-p", "--mode", "json", ...extraArgs],
277
285
  cwd,
278
286
  config.envVars,
279
287
  prompt
@@ -306,13 +314,13 @@ export const makePiConnector = (
306
314
  }),
307
315
  // `--` ends the options (pi >= 0.84.3): a prompt starting with a dash
308
316
  // is a prompt, not a flag. Stdin paths need no separator.
309
- buildArgv: (prompt, _context) => ["pi", "-p", ...extraArgs, "--", prompt],
310
- buildInteractiveArgv: (_context) => ["pi", ...extraArgs],
317
+ buildArgv: (prompt, _context) => [executable, "-p", ...extraArgs, "--", prompt],
318
+ buildInteractiveArgv: (_context) => [executable, ...extraArgs],
311
319
  complete,
312
320
  completeStream,
313
321
  versionProbe: {
314
322
  executor,
315
- binary: "pi",
323
+ binary: executable,
316
324
  cwd,
317
325
  ...(config.model === undefined ? {} : { authProbe: piAuthProbe(config.model) })
318
326
  }
@@ -1,66 +0,0 @@
1
- import type * as Effect from "effect/Effect";
2
- import * as Schema from "effect/Schema";
3
- import type * as Stream from "effect/Stream";
4
- import type { LlmError } from "./Errors.ts";
5
- import { TokenUsage } from "./Models.ts";
6
- declare const SessionTextDelta_base: Schema.Class<SessionTextDelta, Schema.TaggedStruct<"TextDelta", {
7
- readonly text: Schema.String;
8
- }>, {}>;
9
- export declare class SessionTextDelta extends SessionTextDelta_base {
10
- }
11
- declare const SessionToolUse_base: Schema.Class<SessionToolUse, Schema.TaggedStruct<"ToolUse", {
12
- readonly tool: Schema.String;
13
- readonly rawInput: Schema.String;
14
- readonly id: Schema.String;
15
- }>, {}>;
16
- export declare class SessionToolUse extends SessionToolUse_base {
17
- }
18
- declare const SessionToolResult_base: Schema.Class<SessionToolResult, Schema.TaggedStruct<"ToolResult", {
19
- readonly id: Schema.String;
20
- readonly status: Schema.String;
21
- readonly content: Schema.String;
22
- }>, {}>;
23
- export declare class SessionToolResult extends SessionToolResult_base {
24
- }
25
- declare const SessionAskUser_base: Schema.Class<SessionAskUser, Schema.TaggedStruct<"AskUser", {
26
- readonly question: Schema.String;
27
- }>, {}>;
28
- export declare class SessionAskUser extends SessionAskUser_base {
29
- }
30
- declare const SessionApprovalRequest_base: Schema.Class<SessionApprovalRequest, Schema.TaggedStruct<"ApprovalRequest", {
31
- readonly tool: Schema.String;
32
- readonly rawInput: Schema.String;
33
- readonly id: Schema.String;
34
- }>, {}>;
35
- export declare class SessionApprovalRequest extends SessionApprovalRequest_base {
36
- }
37
- declare const SessionUsage_base: Schema.Class<SessionUsage, Schema.TaggedStruct<"Usage", {
38
- readonly usage: typeof TokenUsage;
39
- readonly model: Schema.optionalKey<Schema.String>;
40
- }>, {}>;
41
- export declare class SessionUsage extends SessionUsage_base {
42
- }
43
- declare const SessionDone_base: Schema.Class<SessionDone, Schema.TaggedStruct<"Done", {
44
- readonly result: Schema.String;
45
- }>, {}>;
46
- export declare class SessionDone extends SessionDone_base {
47
- }
48
- export declare const SessionEvent: Schema.Union<readonly [typeof SessionTextDelta, typeof SessionToolUse, typeof SessionToolResult, typeof SessionAskUser, typeof SessionApprovalRequest, typeof SessionUsage, typeof SessionDone]>;
49
- export type SessionEvent = typeof SessionEvent.Type;
50
- declare const SessionResult_base: Schema.Class<SessionResult, Schema.Struct<{
51
- readonly text: Schema.String;
52
- readonly usage: Schema.optionalKey<typeof TokenUsage>;
53
- readonly model: Schema.optionalKey<Schema.String>;
54
- }>, {}>;
55
- export declare class SessionResult extends SessionResult_base {
56
- }
57
- export interface AgentSessionShape {
58
- readonly events: Stream.Stream<SessionEvent, LlmError>;
59
- readonly sendUserMessage: (text: string) => Effect.Effect<void, LlmError>;
60
- readonly respondToAsk: (answer: string) => Effect.Effect<void, LlmError>;
61
- readonly respondToApproval: (id: string, approved: boolean) => Effect.Effect<void, LlmError>;
62
- readonly awaitResult: Effect.Effect<SessionResult, LlmError>;
63
- readonly cancel: Effect.Effect<void>;
64
- }
65
- export {};
66
- //# sourceMappingURL=AgentSession.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentSession.d.ts","sourceRoot":"","sources":["../src/AgentSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;;;;AAExC,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAIlC;CAAG;;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAIrC;CAAG;;;;AAEL,qBAAa,cAAe,SAAQ,mBAElC;CAAG;;;;;;AAEL,qBAAa,sBAAuB,SAAQ,2BAO3C;CAAG;;;;;AAEJ,qBAAa,YAAa,SAAQ,iBAGhC;CAAG;;;;AAEL,qBAAa,WAAY,SAAQ,gBAE/B;CAAG;AAEL,eAAO,MAAM,YAAY,kMAQvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;;;;;;AAEnD,qBAAa,aAAc,SAAQ,kBAIjC;CAAG;AAEL,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IACtD,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACzE,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACxE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CACrC"}
@@ -1,53 +0,0 @@
1
- import * as Schema from "effect/Schema";
2
- import { TokenUsage } from "./Models.js";
3
- export class SessionTextDelta extends Schema.TaggedClass()("TextDelta", {
4
- text: Schema.String
5
- }) {
6
- }
7
- export class SessionToolUse extends Schema.TaggedClass()("ToolUse", {
8
- tool: Schema.String,
9
- rawInput: Schema.String,
10
- id: Schema.String
11
- }) {
12
- }
13
- export class SessionToolResult extends Schema.TaggedClass()("ToolResult", {
14
- id: Schema.String,
15
- status: Schema.String,
16
- content: Schema.String
17
- }) {
18
- }
19
- export class SessionAskUser extends Schema.TaggedClass()("AskUser", {
20
- question: Schema.String
21
- }) {
22
- }
23
- export class SessionApprovalRequest extends Schema.TaggedClass()("ApprovalRequest", {
24
- tool: Schema.String,
25
- rawInput: Schema.String,
26
- id: Schema.String
27
- }) {
28
- }
29
- export class SessionUsage extends Schema.TaggedClass()("Usage", {
30
- usage: TokenUsage,
31
- model: Schema.optionalKey(Schema.String)
32
- }) {
33
- }
34
- export class SessionDone extends Schema.TaggedClass()("Done", {
35
- result: Schema.String
36
- }) {
37
- }
38
- export const SessionEvent = Schema.Union([
39
- SessionTextDelta,
40
- SessionToolUse,
41
- SessionToolResult,
42
- SessionAskUser,
43
- SessionApprovalRequest,
44
- SessionUsage,
45
- SessionDone
46
- ]);
47
- export class SessionResult extends Schema.Class("SessionResult")({
48
- text: Schema.String,
49
- usage: Schema.optionalKey(TokenUsage),
50
- model: Schema.optionalKey(Schema.String)
51
- }) {
52
- }
53
- //# sourceMappingURL=AgentSession.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentSession.js","sourceRoot":"","sources":["../src/AgentSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,WAAW,EAAE;IACxF,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,SAAS,EAAE;IAClF,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,EAAE,EAAE,MAAM,CAAC,MAAM;CAClB,CAAC;CAAG;AAEL,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAAC,YAAY,EAAE;IAC3F,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,SAAS,EAAE;IAClF,QAAQ,EAAE,MAAM,CAAC,MAAM;CACxB,CAAC;CAAG;AAEL,MAAM,OAAO,sBAAuB,SAAQ,MAAM,CAAC,WAAW,EAA0B,CACtF,iBAAiB,EACjB;IACE,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,EAAE,EAAE,MAAM,CAAC,MAAM;CAClB,CACF;CAAG;AAEJ,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,OAAO,EAAE;IAC5E,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CACzC,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,WAAW,EAAe,CAAC,MAAM,EAAE;IACzE,MAAM,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC;CAAG;AAEL,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;IACvC,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,sBAAsB;IACtB,YAAY;IACZ,WAAW;CACZ,CAAC,CAAA;AAGF,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,eAAe,CAAC,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CACzC,CAAC;CAAG"}
@@ -1,11 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import type * as Scope from "effect/Scope";
3
- import { type AgentSessionShape, type SessionEvent } from "../AgentSession.ts";
4
- import { ProviderError } from "../Errors.ts";
5
- import type { ProcessExecutorShape } from "../ProcessExecutor.ts";
6
- export declare const claudeSessionArgv: (model: string | undefined, extraFlags: ReadonlyArray<string>) => ReadonlyArray<string>;
7
- export declare const claudeUserMessageJson: (text: string) => string;
8
- export declare const parseClaudeSessionLine: (line: string) => ReadonlyArray<SessionEvent>;
9
- export declare const claudeSessionInitModel: (line: string) => string | undefined;
10
- export declare const openClaudeAgentSession: (executor: ProcessExecutorShape, argv: readonly string[], cwd: string, envVars?: Readonly<Record<string, string>> | undefined) => Effect.Effect<AgentSessionShape, ProviderError | import("../Errors.ts").UsageLimitError | import("../Errors.ts").AuthenticationError | import("../Errors.ts").InvalidRequestError | import("../Errors.ts").ParseError | import("../Errors.ts").ToolError | import("../Errors.ts").ConfigError | import("../Errors.ts").RateLimitError | import("../Errors.ts").TimeoutError | import("../Errors.ts").TurnLimitError, Scope.Scope>;
11
- //# sourceMappingURL=ClaudeAgentSession.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClaudeAgentSession.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeAgentSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAIvC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAE1C,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAajE,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,GAAG,SAAS,EACzB,YAAY,aAAa,CAAC,MAAM,CAAC,KAChC,aAAa,CAAC,MAAM,CAUtB,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,MAOjD,CAAA;AAyEJ,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,YAAY,CAe/E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAK9D,CAAA;AAED,eAAO,MAAM,sBAAsB,qiBA8ElC,CAAA"}