@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,161 +0,0 @@
1
- import * as Deferred from "effect/Deferred";
2
- import * as Effect from "effect/Effect";
3
- import * as PubSub from "effect/PubSub";
4
- import * as Queue from "effect/Queue";
5
- import * as Ref from "effect/Ref";
6
- import * as Stream from "effect/Stream";
7
- import { SessionDone, SessionResult, SessionTextDelta, SessionToolResult, SessionToolUse, SessionUsage } from "../AgentSession.js";
8
- import { ProviderError } from "../Errors.js";
9
- import { TokenUsage } from "../Models.js";
10
- import { jsonArray, jsonBooleanField, jsonField, jsonIntField, jsonNumberField, jsonStringField, jsonText, parseJsonLine } from "./CliSupport.js";
11
- export const claudeSessionArgv = (model, extraFlags) => [
12
- "claude",
13
- "--print",
14
- "--input-format",
15
- "stream-json",
16
- "--output-format",
17
- "stream-json",
18
- "--verbose",
19
- ...(model === undefined ? [] : ["--model", model]),
20
- ...extraFlags
21
- ];
22
- export const claudeUserMessageJson = (text) => JSON.stringify({
23
- type: "user",
24
- message: {
25
- role: "user",
26
- content: text
27
- }
28
- });
29
- const contentBlocks = (json) => jsonArray(jsonField(jsonField(json, "message"), "content"));
30
- const assistantEvents = (json) => contentBlocks(json).flatMap((block) => {
31
- switch (jsonStringField(block, "type")) {
32
- case "text": {
33
- const text = jsonStringField(block, "text");
34
- return text === undefined || text.length === 0 ? [] : [SessionTextDelta.make({ text })];
35
- }
36
- case "tool_use":
37
- return [
38
- SessionToolUse.make({
39
- tool: jsonStringField(block, "name") ?? "",
40
- rawInput: jsonText(jsonField(block, "input") ?? {}),
41
- id: jsonStringField(block, "id") ?? ""
42
- })
43
- ];
44
- default:
45
- return [];
46
- }
47
- });
48
- const toolResultEvents = (json) => contentBlocks(json).flatMap((block) => {
49
- if (jsonStringField(block, "type") !== "tool_result") {
50
- return [];
51
- }
52
- const content = jsonField(block, "content");
53
- return [
54
- SessionToolResult.make({
55
- id: jsonStringField(block, "tool_use_id") ?? "",
56
- status: jsonBooleanField(block, "is_error") === true ? "error" : "success",
57
- content: content === undefined ? "" : jsonText(content)
58
- })
59
- ];
60
- });
61
- const resultEvents = (json) => {
62
- const usage = jsonField(json, "usage");
63
- const usageEvents = usage === undefined
64
- ? []
65
- : [
66
- SessionUsage.make({
67
- usage: TokenUsage.make({
68
- prompt: jsonIntField(usage, "input_tokens") ?? 0,
69
- completion: jsonIntField(usage, "output_tokens") ?? 0,
70
- total: (jsonIntField(usage, "input_tokens") ?? 0) +
71
- (jsonIntField(usage, "output_tokens") ?? 0),
72
- ...(jsonIntField(usage, "cache_read_input_tokens") === undefined
73
- ? {}
74
- : {
75
- cached: jsonIntField(usage, "cache_read_input_tokens") ?? 0
76
- }),
77
- ...(jsonNumberField(json, "total_cost_usd") === undefined
78
- ? {}
79
- : { costUsd: jsonNumberField(json, "total_cost_usd") ?? 0 })
80
- })
81
- })
82
- ];
83
- return [
84
- ...usageEvents,
85
- SessionDone.make({
86
- result: jsonStringField(json, "result") ?? ""
87
- })
88
- ];
89
- };
90
- export const parseClaudeSessionLine = (line) => {
91
- const json = parseJsonLine(line);
92
- if (json === undefined) {
93
- return [];
94
- }
95
- switch (jsonStringField(json, "type")) {
96
- case "assistant":
97
- return assistantEvents(json);
98
- case "user":
99
- return toolResultEvents(json);
100
- case "result":
101
- return resultEvents(json);
102
- default:
103
- return [];
104
- }
105
- };
106
- export const claudeSessionInitModel = (line) => {
107
- const json = parseJsonLine(line);
108
- return json !== undefined && jsonStringField(json, "type") === "system"
109
- ? jsonStringField(json, "model")
110
- : undefined;
111
- };
112
- export const openClaudeAgentSession = Effect.fn("@llm4ts/core/providers/ClaudeAgentSession.open")(function* (executor, argv, cwd, envVars = {}) {
113
- const [stdin, stdout] = yield* executor.runBidirectional(argv, cwd, envVars);
114
- const events = yield* PubSub.unbounded();
115
- const done = yield* Deferred.make();
116
- const model = yield* Ref.make(undefined);
117
- const text = yield* Ref.make("");
118
- const usage = yield* Ref.make(undefined);
119
- const trackEvent = Effect.fn("@llm4ts/core/providers/ClaudeAgentSession.trackEvent")(function* (event) {
120
- switch (event._tag) {
121
- case "TextDelta":
122
- yield* Ref.update(text, (current) => current + event.text);
123
- break;
124
- case "Usage":
125
- yield* Ref.set(usage, event.usage);
126
- break;
127
- case "Done": {
128
- const accumulated = yield* Ref.get(text);
129
- const finalUsage = yield* Ref.get(usage);
130
- const finalModel = yield* Ref.get(model);
131
- yield* Deferred.succeed(done, SessionResult.make({
132
- text: event.result.length === 0 ? accumulated : event.result,
133
- ...(finalUsage === undefined ? {} : { usage: finalUsage }),
134
- ...(finalModel === undefined ? {} : { model: finalModel })
135
- }));
136
- break;
137
- }
138
- default:
139
- break;
140
- }
141
- yield* PubSub.publish(events, event);
142
- });
143
- yield* stdout.pipe(Stream.mapEffect((line) => {
144
- const initializedModel = claudeSessionInitModel(line);
145
- return initializedModel === undefined
146
- ? Effect.succeed(line)
147
- : Ref.set(model, initializedModel).pipe(Effect.as(line));
148
- }), Stream.flatMap((line) => Stream.fromIterable(parseClaudeSessionLine(line))), Stream.mapEffect(trackEvent), Stream.runDrain, Effect.catch((error) => Deferred.fail(done, error).pipe(Effect.asVoid)), Effect.ensuring(Deferred.fail(done, ProviderError.make({
149
- message: "claude session ended before a result"
150
- })).pipe(Effect.asVoid)), Effect.forkScoped);
151
- const sendUserMessage = (message) => Queue.offer(stdin, claudeUserMessageJson(message)).pipe(Effect.asVoid);
152
- return {
153
- events: Stream.fromPubSub(events),
154
- sendUserMessage,
155
- respondToAsk: sendUserMessage,
156
- respondToApproval: (_id, _approved) => Effect.void,
157
- awaitResult: Deferred.await(done),
158
- cancel: Queue.shutdown(stdin)
159
- };
160
- });
161
- //# sourceMappingURL=ClaudeAgentSession.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClaudeAgentSession.js","sourceRoot":"","sources":["../../src/providers/ClaudeAgentSession.ts"],"names":[],"mappings":"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"}
@@ -1,69 +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
-
7
- export class SessionTextDelta extends Schema.TaggedClass<SessionTextDelta>()("TextDelta", {
8
- text: Schema.String
9
- }) {}
10
-
11
- export class SessionToolUse extends Schema.TaggedClass<SessionToolUse>()("ToolUse", {
12
- tool: Schema.String,
13
- rawInput: Schema.String,
14
- id: Schema.String
15
- }) {}
16
-
17
- export class SessionToolResult extends Schema.TaggedClass<SessionToolResult>()("ToolResult", {
18
- id: Schema.String,
19
- status: Schema.String,
20
- content: Schema.String
21
- }) {}
22
-
23
- export class SessionAskUser extends Schema.TaggedClass<SessionAskUser>()("AskUser", {
24
- question: Schema.String
25
- }) {}
26
-
27
- export class SessionApprovalRequest extends Schema.TaggedClass<SessionApprovalRequest>()(
28
- "ApprovalRequest",
29
- {
30
- tool: Schema.String,
31
- rawInput: Schema.String,
32
- id: Schema.String
33
- }
34
- ) {}
35
-
36
- export class SessionUsage extends Schema.TaggedClass<SessionUsage>()("Usage", {
37
- usage: TokenUsage,
38
- model: Schema.optionalKey(Schema.String)
39
- }) {}
40
-
41
- export class SessionDone extends Schema.TaggedClass<SessionDone>()("Done", {
42
- result: Schema.String
43
- }) {}
44
-
45
- export const SessionEvent = Schema.Union([
46
- SessionTextDelta,
47
- SessionToolUse,
48
- SessionToolResult,
49
- SessionAskUser,
50
- SessionApprovalRequest,
51
- SessionUsage,
52
- SessionDone
53
- ])
54
- export type SessionEvent = typeof SessionEvent.Type
55
-
56
- export class SessionResult extends Schema.Class<SessionResult>("SessionResult")({
57
- text: Schema.String,
58
- usage: Schema.optionalKey(TokenUsage),
59
- model: Schema.optionalKey(Schema.String)
60
- }) {}
61
-
62
- export interface AgentSessionShape {
63
- readonly events: Stream.Stream<SessionEvent, LlmError>
64
- readonly sendUserMessage: (text: string) => Effect.Effect<void, LlmError>
65
- readonly respondToAsk: (answer: string) => Effect.Effect<void, LlmError>
66
- readonly respondToApproval: (id: string, approved: boolean) => Effect.Effect<void, LlmError>
67
- readonly awaitResult: Effect.Effect<SessionResult, LlmError>
68
- readonly cancel: Effect.Effect<void>
69
- }
@@ -1,230 +0,0 @@
1
- import * as Deferred from "effect/Deferred"
2
- import * as Effect from "effect/Effect"
3
- import * as PubSub from "effect/PubSub"
4
- import * as Queue from "effect/Queue"
5
- import * as Ref from "effect/Ref"
6
- import type * as Scope from "effect/Scope"
7
- import * as Stream from "effect/Stream"
8
- import {
9
- SessionDone,
10
- SessionResult,
11
- SessionTextDelta,
12
- SessionToolResult,
13
- SessionToolUse,
14
- SessionUsage,
15
- type AgentSessionShape,
16
- type SessionEvent
17
- } from "../AgentSession.ts"
18
- import { ProviderError, type LlmError } from "../Errors.ts"
19
- import { TokenUsage } from "../Models.ts"
20
- import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
21
- import {
22
- jsonArray,
23
- jsonBooleanField,
24
- jsonField,
25
- jsonIntField,
26
- jsonNumberField,
27
- jsonStringField,
28
- jsonText,
29
- parseJsonLine,
30
- type JsonValue
31
- } from "./CliSupport.ts"
32
-
33
- export const claudeSessionArgv = (
34
- model: string | undefined,
35
- extraFlags: ReadonlyArray<string>
36
- ): ReadonlyArray<string> => [
37
- "claude",
38
- "--print",
39
- "--input-format",
40
- "stream-json",
41
- "--output-format",
42
- "stream-json",
43
- "--verbose",
44
- ...(model === undefined ? [] : ["--model", model]),
45
- ...extraFlags
46
- ]
47
-
48
- export const claudeUserMessageJson = (text: string): string =>
49
- JSON.stringify({
50
- type: "user",
51
- message: {
52
- role: "user",
53
- content: text
54
- }
55
- })
56
-
57
- const contentBlocks = (json: JsonValue): ReadonlyArray<JsonValue> =>
58
- jsonArray(jsonField(jsonField(json, "message"), "content"))
59
-
60
- const assistantEvents = (json: JsonValue): ReadonlyArray<SessionEvent> =>
61
- contentBlocks(json).flatMap((block): ReadonlyArray<SessionEvent> => {
62
- switch (jsonStringField(block, "type")) {
63
- case "text": {
64
- const text = jsonStringField(block, "text")
65
- return text === undefined || text.length === 0 ? [] : [SessionTextDelta.make({ text })]
66
- }
67
- case "tool_use":
68
- return [
69
- SessionToolUse.make({
70
- tool: jsonStringField(block, "name") ?? "",
71
- rawInput: jsonText(jsonField(block, "input") ?? {}),
72
- id: jsonStringField(block, "id") ?? ""
73
- })
74
- ]
75
- default:
76
- return []
77
- }
78
- })
79
-
80
- const toolResultEvents = (json: JsonValue): ReadonlyArray<SessionEvent> =>
81
- contentBlocks(json).flatMap((block): ReadonlyArray<SessionEvent> => {
82
- if (jsonStringField(block, "type") !== "tool_result") {
83
- return []
84
- }
85
- const content = jsonField(block, "content")
86
- return [
87
- SessionToolResult.make({
88
- id: jsonStringField(block, "tool_use_id") ?? "",
89
- status: jsonBooleanField(block, "is_error") === true ? "error" : "success",
90
- content: content === undefined ? "" : jsonText(content)
91
- })
92
- ]
93
- })
94
-
95
- const resultEvents = (json: JsonValue): ReadonlyArray<SessionEvent> => {
96
- const usage = jsonField(json, "usage")
97
- const usageEvents: ReadonlyArray<SessionEvent> =
98
- usage === undefined
99
- ? []
100
- : [
101
- SessionUsage.make({
102
- usage: TokenUsage.make({
103
- prompt: jsonIntField(usage, "input_tokens") ?? 0,
104
- completion: jsonIntField(usage, "output_tokens") ?? 0,
105
- total:
106
- (jsonIntField(usage, "input_tokens") ?? 0) +
107
- (jsonIntField(usage, "output_tokens") ?? 0),
108
- ...(jsonIntField(usage, "cache_read_input_tokens") === undefined
109
- ? {}
110
- : {
111
- cached: jsonIntField(usage, "cache_read_input_tokens") ?? 0
112
- }),
113
- ...(jsonNumberField(json, "total_cost_usd") === undefined
114
- ? {}
115
- : { costUsd: jsonNumberField(json, "total_cost_usd") ?? 0 })
116
- })
117
- })
118
- ]
119
-
120
- return [
121
- ...usageEvents,
122
- SessionDone.make({
123
- result: jsonStringField(json, "result") ?? ""
124
- })
125
- ]
126
- }
127
-
128
- export const parseClaudeSessionLine = (line: string): ReadonlyArray<SessionEvent> => {
129
- const json = parseJsonLine(line)
130
- if (json === undefined) {
131
- return []
132
- }
133
- switch (jsonStringField(json, "type")) {
134
- case "assistant":
135
- return assistantEvents(json)
136
- case "user":
137
- return toolResultEvents(json)
138
- case "result":
139
- return resultEvents(json)
140
- default:
141
- return []
142
- }
143
- }
144
-
145
- export const claudeSessionInitModel = (line: string): string | undefined => {
146
- const json = parseJsonLine(line)
147
- return json !== undefined && jsonStringField(json, "type") === "system"
148
- ? jsonStringField(json, "model")
149
- : undefined
150
- }
151
-
152
- export const openClaudeAgentSession = Effect.fn("@llm4ts/core/providers/ClaudeAgentSession.open")(
153
- function* (
154
- executor: ProcessExecutorShape,
155
- argv: ReadonlyArray<string>,
156
- cwd: string,
157
- envVars: Readonly<Record<string, string>> = {}
158
- ): Effect.fn.Return<AgentSessionShape, LlmError, Scope.Scope> {
159
- const [stdin, stdout] = yield* executor.runBidirectional(argv, cwd, envVars)
160
- const events = yield* PubSub.unbounded<SessionEvent>()
161
- const done = yield* Deferred.make<SessionResult, LlmError>()
162
- const model = yield* Ref.make<string | undefined>(undefined)
163
- const text = yield* Ref.make("")
164
- const usage = yield* Ref.make<TokenUsage | undefined>(undefined)
165
-
166
- const trackEvent = Effect.fn("@llm4ts/core/providers/ClaudeAgentSession.trackEvent")(function* (
167
- event: SessionEvent
168
- ) {
169
- switch (event._tag) {
170
- case "TextDelta":
171
- yield* Ref.update(text, (current) => current + event.text)
172
- break
173
- case "Usage":
174
- yield* Ref.set(usage, event.usage)
175
- break
176
- case "Done": {
177
- const accumulated = yield* Ref.get(text)
178
- const finalUsage = yield* Ref.get(usage)
179
- const finalModel = yield* Ref.get(model)
180
- yield* Deferred.succeed(
181
- done,
182
- SessionResult.make({
183
- text: event.result.length === 0 ? accumulated : event.result,
184
- ...(finalUsage === undefined ? {} : { usage: finalUsage }),
185
- ...(finalModel === undefined ? {} : { model: finalModel })
186
- })
187
- )
188
- break
189
- }
190
- default:
191
- break
192
- }
193
- yield* PubSub.publish(events, event)
194
- })
195
-
196
- yield* stdout.pipe(
197
- Stream.mapEffect((line) => {
198
- const initializedModel = claudeSessionInitModel(line)
199
- return initializedModel === undefined
200
- ? Effect.succeed(line)
201
- : Ref.set(model, initializedModel).pipe(Effect.as(line))
202
- }),
203
- Stream.flatMap((line) => Stream.fromIterable(parseClaudeSessionLine(line))),
204
- Stream.mapEffect(trackEvent),
205
- Stream.runDrain,
206
- Effect.catch((error) => Deferred.fail(done, error).pipe(Effect.asVoid)),
207
- Effect.ensuring(
208
- Deferred.fail(
209
- done,
210
- ProviderError.make({
211
- message: "claude session ended before a result"
212
- })
213
- ).pipe(Effect.asVoid)
214
- ),
215
- Effect.forkScoped
216
- )
217
-
218
- const sendUserMessage = (message: string): Effect.Effect<void, LlmError> =>
219
- Queue.offer(stdin, claudeUserMessageJson(message)).pipe(Effect.asVoid)
220
-
221
- return {
222
- events: Stream.fromPubSub(events),
223
- sendUserMessage,
224
- respondToAsk: sendUserMessage,
225
- respondToApproval: (_id, _approved) => Effect.void,
226
- awaitResult: Deferred.await(done),
227
- cancel: Queue.shutdown(stdin)
228
- }
229
- }
230
- )