coding-agents-sdk 0.2.0 → 0.3.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.
- package/README.md +32 -0
- package/dist/SdkAgent-a97nkDuR.mjs +1 -0
- package/dist/adapters/claude-code-cli/index.d.mts +1 -1
- package/dist/adapters/claude-code-cli/index.mjs +2 -490
- package/dist/adapters/claude-code-sdk/index.d.mts +1 -1
- package/dist/adapters/claude-code-sdk/index.mjs +4 -483
- package/dist/adapters/codex-cli/index.d.mts +1 -1
- package/dist/adapters/codex-cli/index.mjs +2 -626
- package/dist/adapters/codex-sdk/index.d.mts +1 -1
- package/dist/adapters/codex-sdk/index.mjs +1 -286
- package/dist/adapters/gemini-cli/index.d.mts +1 -1
- package/dist/adapters/gemini-cli/index.mjs +1 -292
- package/dist/classify-error-V6x6jP_R.mjs +8 -0
- package/dist/container/index.d.mts +1 -1
- package/dist/container/index.mjs +1 -24
- package/dist/container-BY7JDOGo.mjs +1 -0
- package/dist/container-DWTITDhL.mjs +1 -0
- package/dist/container-vkn5-3Xl.mjs +1 -0
- package/dist/diff-BCfLDXNN.mjs +1 -0
- package/dist/env-Dkd8Sgjf.mjs +1 -0
- package/dist/errors-XV0frS3r.mjs +1 -0
- package/dist/execution-target-BJ5mWjDM.mjs +4 -0
- package/dist/{index-C3ZxLAd0.d.mts → index-COHwWTg_.d.mts} +6 -6
- package/dist/{index-B3YqrgIp.d.mts → index-CzvanLE_.d.mts} +3 -2
- package/dist/index-DCaZeLrI.d.mts +51 -0
- package/dist/{index-dRVpEAr8.d.mts → index-DNyKelMh.d.mts} +5 -5
- package/dist/{index-nzo1sBiK.d.mts → index-DP4Jxoax.d.mts} +7 -7
- package/dist/{index-ByAOGMUM.d.mts → index-R77YR8ak.d.mts} +1 -1
- package/dist/{index-CFpNOmdA.d.mts → index-jUwKDQ34.d.mts} +2 -1
- package/dist/index.d.mts +10 -9
- package/dist/index.mjs +1 -61
- package/dist/oci-C_S_FKHj.mjs +1 -0
- package/dist/sandbox/index.d.mts +2 -0
- package/dist/sandbox/index.mjs +1 -0
- package/dist/sandbox-DeKpyenZ.mjs +1 -0
- package/dist/schemas/index.d.mts +1 -1
- package/dist/schemas/index.mjs +1 -2
- package/dist/schemas-BM6qORw3.mjs +1 -0
- package/dist/spawner-BJesLc8I.mjs +1 -0
- package/dist/structured-output-DEkBQ-1Z.mjs +1 -0
- package/dist/{types-Cb_EXIEe.d.mts → types-COlDAzs5.d.mts} +9 -24
- package/dist/types-CwvWHEpy.mjs +1 -0
- package/dist/util-CGg8cK92.mjs +1 -0
- package/package.json +5 -1
- package/dist/Agent-D8WkUilj.mjs +0 -262
- package/dist/SdkAgent-B47mJiIE.mjs +0 -38
- package/dist/classify-error-pL6jeu4T.mjs +0 -456
- package/dist/container-2UmPZ0CI.mjs +0 -22
- package/dist/container-CHxKIonn.mjs +0 -440
- package/dist/container-D2Z0ITDJ.mjs +0 -22
- package/dist/diff-De8d3MVb.mjs +0 -333
- package/dist/errors-BAmHDQu8.mjs +0 -45
- package/dist/oci-DMZZQZ47.mjs +0 -438
- package/dist/schemas-DwD4pwJB.mjs +0 -96
- package/dist/spawner-Bw9UBEGX.mjs +0 -54
- package/dist/structured-output-BHtr_zpz.mjs +0 -19
- package/dist/types-aNMD8h3x.mjs +0 -19
- package/dist/util-B4RQZkKr.mjs +0 -77
- /package/dist/{events-nxuRbYIu.d.mts → events-D31_b0sA.d.mts} +0 -0
|
@@ -1,286 +1 @@
|
|
|
1
|
-
import { r as
|
|
2
|
-
import { a as buildBaseProcessEnv, l as toTextPart, o as createAgentEvent, r as applyMappedEventBatch } from "../../classify-error-pL6jeu4T.mjs";
|
|
3
|
-
import { t as SdkAgent } from "../../SdkAgent-B47mJiIE.mjs";
|
|
4
|
-
import { Codex } from "@openai/codex-sdk";
|
|
5
|
-
//#region src/adapters/codex-sdk/events/mappers.ts
|
|
6
|
-
const toStats = (usage) => ({
|
|
7
|
-
turns: 1,
|
|
8
|
-
costUsd: 0,
|
|
9
|
-
inputTokens: usage.input_tokens,
|
|
10
|
-
cacheReadInputTokens: usage.cached_input_tokens,
|
|
11
|
-
outputTokens: usage.output_tokens,
|
|
12
|
-
totalTokens: usage.input_tokens + usage.cached_input_tokens + usage.output_tokens
|
|
13
|
-
});
|
|
14
|
-
const getCommandToolRecord = (item) => ({
|
|
15
|
-
toolCallId: item.id,
|
|
16
|
-
toolName: "Bash",
|
|
17
|
-
input: { command: item.command }
|
|
18
|
-
});
|
|
19
|
-
const getMcpToolRecord = (item) => ({
|
|
20
|
-
toolCallId: item.id,
|
|
21
|
-
toolName: item.tool,
|
|
22
|
-
input: {
|
|
23
|
-
server: item.server,
|
|
24
|
-
arguments: item.arguments
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
const getWebSearchToolRecord = (item) => ({
|
|
28
|
-
toolCallId: item.id,
|
|
29
|
-
toolName: "WebSearch",
|
|
30
|
-
input: { query: item.query }
|
|
31
|
-
});
|
|
32
|
-
const mapToolCallStart = (toolRecord, context, options) => ({
|
|
33
|
-
events: [createAgentEvent(context.runId, "tool-call", {
|
|
34
|
-
sessionId: context.sessionId,
|
|
35
|
-
model: options.model ?? null,
|
|
36
|
-
toolCallId: toolRecord.toolCallId,
|
|
37
|
-
toolName: toolRecord.toolName,
|
|
38
|
-
input: toolRecord.input
|
|
39
|
-
})],
|
|
40
|
-
toolCalls: [{
|
|
41
|
-
toolCallId: toolRecord.toolCallId,
|
|
42
|
-
toolName: toolRecord.toolName,
|
|
43
|
-
input: toolRecord.input
|
|
44
|
-
}]
|
|
45
|
-
});
|
|
46
|
-
const mapToolResultCompletion = (toolRecord, output, errorState, context, options) => {
|
|
47
|
-
const priorToolCall = context.toolCalls.get(toolRecord.toolCallId);
|
|
48
|
-
const resolvedTool = priorToolCall ?? toolRecord;
|
|
49
|
-
const events = [];
|
|
50
|
-
const toolCalls = [];
|
|
51
|
-
if (!priorToolCall) {
|
|
52
|
-
events.push(createAgentEvent(context.runId, "tool-call", {
|
|
53
|
-
sessionId: context.sessionId,
|
|
54
|
-
model: options.model ?? null,
|
|
55
|
-
toolCallId: toolRecord.toolCallId,
|
|
56
|
-
toolName: toolRecord.toolName,
|
|
57
|
-
input: toolRecord.input
|
|
58
|
-
}));
|
|
59
|
-
toolCalls.push({
|
|
60
|
-
toolCallId: toolRecord.toolCallId,
|
|
61
|
-
toolName: toolRecord.toolName,
|
|
62
|
-
input: toolRecord.input
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
events.push(createAgentEvent(context.runId, "tool-result", {
|
|
66
|
-
sessionId: context.sessionId,
|
|
67
|
-
toolCallId: toolRecord.toolCallId,
|
|
68
|
-
toolName: resolvedTool.toolName,
|
|
69
|
-
input: resolvedTool.input,
|
|
70
|
-
output,
|
|
71
|
-
isError: errorState.isError || void 0,
|
|
72
|
-
error: errorState.error
|
|
73
|
-
}));
|
|
74
|
-
return {
|
|
75
|
-
events,
|
|
76
|
-
toolCalls: toolCalls.length > 0 ? toolCalls : void 0
|
|
77
|
-
};
|
|
78
|
-
};
|
|
79
|
-
const getCommandErrorState = (item) => {
|
|
80
|
-
const isError = item.status === "failed" || item.exit_code !== void 0 && item.exit_code !== 0;
|
|
81
|
-
return {
|
|
82
|
-
isError,
|
|
83
|
-
error: isError ? `Command exited with code ${item.exit_code ?? 1}.` : void 0
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
|
-
const getMcpOutput = (item) => item.result?.structured_content ?? item.result?.content ?? item.error?.message ?? "";
|
|
87
|
-
const getMcpErrorState = (item) => ({
|
|
88
|
-
isError: item.status === "failed" || item.error !== void 0,
|
|
89
|
-
error: item.error?.message
|
|
90
|
-
});
|
|
91
|
-
const mapErrorItem = (item, context) => ({
|
|
92
|
-
events: [createAgentEvent(context.runId, "stderr", {
|
|
93
|
-
sessionId: context.sessionId,
|
|
94
|
-
text: item.message
|
|
95
|
-
})],
|
|
96
|
-
state: { error: {
|
|
97
|
-
kind: "provider",
|
|
98
|
-
message: item.message
|
|
99
|
-
} }
|
|
100
|
-
});
|
|
101
|
-
const mapItemStartedEvent = (event, context, options) => {
|
|
102
|
-
switch (event.item.type) {
|
|
103
|
-
case "command_execution": return mapToolCallStart(getCommandToolRecord(event.item), context, options);
|
|
104
|
-
case "mcp_tool_call": return mapToolCallStart(getMcpToolRecord(event.item), context, options);
|
|
105
|
-
case "web_search": return mapToolCallStart(getWebSearchToolRecord(event.item), context, options);
|
|
106
|
-
default: return { events: [] };
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
const mapItemCompletedEvent = (event, context, options) => {
|
|
110
|
-
switch (event.item.type) {
|
|
111
|
-
case "agent_message": return {
|
|
112
|
-
events: [createAgentEvent(context.runId, "message", {
|
|
113
|
-
sessionId: context.sessionId,
|
|
114
|
-
model: options.model ?? null,
|
|
115
|
-
role: "assistant",
|
|
116
|
-
content: [toTextPart(event.item.text)],
|
|
117
|
-
text: event.item.text
|
|
118
|
-
})],
|
|
119
|
-
state: { output: { text: event.item.text } }
|
|
120
|
-
};
|
|
121
|
-
case "reasoning": return { events: [createAgentEvent(context.runId, "reasoning", {
|
|
122
|
-
sessionId: context.sessionId,
|
|
123
|
-
model: options.model ?? null,
|
|
124
|
-
content: [toTextPart(event.item.text)],
|
|
125
|
-
text: event.item.text
|
|
126
|
-
})] };
|
|
127
|
-
case "command_execution": return mapToolResultCompletion(getCommandToolRecord(event.item), event.item.aggregated_output, getCommandErrorState(event.item), context, options);
|
|
128
|
-
case "mcp_tool_call": return mapToolResultCompletion(getMcpToolRecord(event.item), getMcpOutput(event.item), getMcpErrorState(event.item), context, options);
|
|
129
|
-
case "web_search": return mapToolResultCompletion(getWebSearchToolRecord(event.item), "", { isError: false }, context, options);
|
|
130
|
-
case "error": return mapErrorItem(event.item, context);
|
|
131
|
-
default: return { events: [] };
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
const mapCodexSdkEvent = (event, context, options = {}) => {
|
|
135
|
-
switch (event.type) {
|
|
136
|
-
case "thread.started": return {
|
|
137
|
-
events: [],
|
|
138
|
-
sessionId: event.thread_id
|
|
139
|
-
};
|
|
140
|
-
case "turn.started": return { events: [] };
|
|
141
|
-
case "turn.completed": return {
|
|
142
|
-
events: [],
|
|
143
|
-
state: {
|
|
144
|
-
stats: toStats(event.usage),
|
|
145
|
-
status: "completed",
|
|
146
|
-
error: void 0
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
case "turn.failed": return {
|
|
150
|
-
events: [],
|
|
151
|
-
state: {
|
|
152
|
-
status: "failed",
|
|
153
|
-
error: {
|
|
154
|
-
kind: "provider",
|
|
155
|
-
message: event.error.message
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
case "item.started": return mapItemStartedEvent(event, context, options);
|
|
160
|
-
case "item.updated": return { events: [] };
|
|
161
|
-
case "item.completed": return mapItemCompletedEvent(event, context, options);
|
|
162
|
-
case "error": return {
|
|
163
|
-
events: [],
|
|
164
|
-
state: {
|
|
165
|
-
status: "failed",
|
|
166
|
-
error: {
|
|
167
|
-
kind: "provider",
|
|
168
|
-
message: event.message
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
default: return { events: [] };
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
//#endregion
|
|
176
|
-
//#region src/adapters/codex-sdk/adapter.ts
|
|
177
|
-
const CODEX_SDK_CAPABILITIES = {
|
|
178
|
-
structuredOutput: true,
|
|
179
|
-
sessionResume: true,
|
|
180
|
-
imageInput: true,
|
|
181
|
-
mcp: true,
|
|
182
|
-
eventStreaming: true
|
|
183
|
-
};
|
|
184
|
-
const toCodexInput = (input) => {
|
|
185
|
-
return input.length === 1 && input[0]?.type === "text" ? input[0].text : input.map((part) => part.type === "text" ? {
|
|
186
|
-
type: "text",
|
|
187
|
-
text: part.text
|
|
188
|
-
} : {
|
|
189
|
-
type: "local_image",
|
|
190
|
-
path: part.path
|
|
191
|
-
});
|
|
192
|
-
};
|
|
193
|
-
const buildTurnOptions = (run, signal) => ({
|
|
194
|
-
outputSchema: run.normalizedRequest.schema.kind === "none" ? void 0 : run.normalizedRequest.schema.jsonSchema,
|
|
195
|
-
signal
|
|
196
|
-
});
|
|
197
|
-
var CodexSdkAgentImpl = class extends SdkAgent {
|
|
198
|
-
type = "codex-sdk";
|
|
199
|
-
defaults;
|
|
200
|
-
runDefaults;
|
|
201
|
-
command;
|
|
202
|
-
codex;
|
|
203
|
-
resolvedEnv;
|
|
204
|
-
constructor(options = {}) {
|
|
205
|
-
super({
|
|
206
|
-
type: "codex-sdk",
|
|
207
|
-
capabilities: CODEX_SDK_CAPABILITIES,
|
|
208
|
-
sessionId: options.sessionId,
|
|
209
|
-
onEvent: options.onEvent
|
|
210
|
-
});
|
|
211
|
-
this.command = options.command;
|
|
212
|
-
this.defaults = {
|
|
213
|
-
cwd: options.cwd,
|
|
214
|
-
model: options.model
|
|
215
|
-
};
|
|
216
|
-
this.runDefaults = {
|
|
217
|
-
permissionMode: options.permissionMode,
|
|
218
|
-
sandboxMode: options.sandboxMode,
|
|
219
|
-
skipGitRepoCheck: options.skipGitRepoCheck,
|
|
220
|
-
modelReasoningEffort: options.modelReasoningEffort,
|
|
221
|
-
networkAccessEnabled: options.networkAccessEnabled,
|
|
222
|
-
webSearchMode: options.webSearchMode,
|
|
223
|
-
webSearchEnabled: options.webSearchEnabled,
|
|
224
|
-
additionalDirectories: options.additionalDirectories ? [...options.additionalDirectories] : void 0
|
|
225
|
-
};
|
|
226
|
-
const env = buildBaseProcessEnv({ propagateEnv: options.propagateEnv });
|
|
227
|
-
if (options.env) Object.assign(env, options.env);
|
|
228
|
-
this.resolvedEnv = env;
|
|
229
|
-
this.codex = options.codex ?? new Codex({
|
|
230
|
-
codexPathOverride: this.command,
|
|
231
|
-
baseUrl: options.baseUrl,
|
|
232
|
-
apiKey: options.apiKey,
|
|
233
|
-
config: options.config,
|
|
234
|
-
env
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
getResolvedEnvForTesting() {
|
|
238
|
-
return this.resolvedEnv;
|
|
239
|
-
}
|
|
240
|
-
get runRequestDefaults() {
|
|
241
|
-
return this.defaults;
|
|
242
|
-
}
|
|
243
|
-
async executeSdkRun(run, request, abortController) {
|
|
244
|
-
const threadOptions = this.buildThreadOptions(request, run);
|
|
245
|
-
const thread = run.requestedSessionId ? this.codex.resumeThread(run.requestedSessionId, threadOptions) : this.codex.startThread(threadOptions);
|
|
246
|
-
if (!run.sessionId && thread.id) {
|
|
247
|
-
run.sessionId = thread.id;
|
|
248
|
-
this.setSessionId(thread.id);
|
|
249
|
-
}
|
|
250
|
-
if (run.stopReason) return;
|
|
251
|
-
const streamed = await thread.runStreamed(toCodexInput(run.normalizedRequest.input), buildTurnOptions(run, abortController.signal));
|
|
252
|
-
for await (const event of streamed.events) {
|
|
253
|
-
const batch = mapCodexSdkEvent(event, {
|
|
254
|
-
runId: run.runId,
|
|
255
|
-
requestedSessionId: run.requestedSessionId,
|
|
256
|
-
sessionId: run.sessionId,
|
|
257
|
-
schemaRequested: run.normalizedRequest.schema.kind !== "none",
|
|
258
|
-
toolCalls: run.toolCalls
|
|
259
|
-
}, { model: run.normalizedRequest.model });
|
|
260
|
-
this.applyBatch(run, batch);
|
|
261
|
-
}
|
|
262
|
-
if (run.normalizedRequest.schema.kind !== "none" && run.output.value === void 0 && run.error === void 0 && run.status !== "failed" && run.output.text) try {
|
|
263
|
-
applyMappedEventBatch(run, {
|
|
264
|
-
events: [],
|
|
265
|
-
state: { output: { value: parseJsonResponseText(run.output.text) } }
|
|
266
|
-
});
|
|
267
|
-
} catch {}
|
|
268
|
-
}
|
|
269
|
-
buildThreadOptions(request, run) {
|
|
270
|
-
return {
|
|
271
|
-
model: run.normalizedRequest.model,
|
|
272
|
-
workingDirectory: run.normalizedRequest.cwd,
|
|
273
|
-
approvalPolicy: request.permissionMode ?? this.runDefaults.permissionMode,
|
|
274
|
-
sandboxMode: request.sandboxMode ?? this.runDefaults.sandboxMode,
|
|
275
|
-
skipGitRepoCheck: request.skipGitRepoCheck ?? this.runDefaults.skipGitRepoCheck,
|
|
276
|
-
modelReasoningEffort: request.modelReasoningEffort ?? this.runDefaults.modelReasoningEffort,
|
|
277
|
-
networkAccessEnabled: request.networkAccessEnabled ?? this.runDefaults.networkAccessEnabled,
|
|
278
|
-
webSearchMode: request.webSearchMode ?? this.runDefaults.webSearchMode,
|
|
279
|
-
webSearchEnabled: request.webSearchEnabled ?? this.runDefaults.webSearchEnabled,
|
|
280
|
-
additionalDirectories: request.additionalDirectories ?? this.runDefaults.additionalDirectories
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
const createCodexSdkAgent = (options) => new CodexSdkAgentImpl(options);
|
|
285
|
-
//#endregion
|
|
286
|
-
export { createCodexSdkAgent };
|
|
1
|
+
import{r as e}from"../../util-CGg8cK92.mjs";import{t}from"../../env-Dkd8Sgjf.mjs";import{a as n,c as r,r as i}from"../../classify-error-V6x6jP_R.mjs";import{t as a}from"../../SdkAgent-a97nkDuR.mjs";import{Codex as o}from"@openai/codex-sdk";const s=e=>({turns:1,costUsd:0,inputTokens:e.input_tokens,cacheReadInputTokens:e.cached_input_tokens,outputTokens:e.output_tokens,totalTokens:e.input_tokens+e.cached_input_tokens+e.output_tokens}),c=e=>({toolCallId:e.id,toolName:`Bash`,input:{command:e.command}}),l=e=>({toolCallId:e.id,toolName:e.tool,input:{server:e.server,arguments:e.arguments}}),u=e=>({toolCallId:e.id,toolName:`WebSearch`,input:{query:e.query}}),d=(e,t,r)=>({events:[n(t.runId,`tool-call`,{sessionId:t.sessionId,model:r.model??null,toolCallId:e.toolCallId,toolName:e.toolName,input:e.input})],toolCalls:[{toolCallId:e.toolCallId,toolName:e.toolName,input:e.input}]}),f=(e,t,r,i,a)=>{let o=i.toolCalls.get(e.toolCallId),s=o??e,c=[],l=[];return o||(c.push(n(i.runId,`tool-call`,{sessionId:i.sessionId,model:a.model??null,toolCallId:e.toolCallId,toolName:e.toolName,input:e.input})),l.push({toolCallId:e.toolCallId,toolName:e.toolName,input:e.input})),c.push(n(i.runId,`tool-result`,{sessionId:i.sessionId,toolCallId:e.toolCallId,toolName:s.toolName,input:s.input,output:t,isError:r.isError||void 0,error:r.error})),{events:c,toolCalls:l.length>0?l:void 0}},p=e=>{let t=e.status===`failed`||e.exit_code!==void 0&&e.exit_code!==0;return{isError:t,error:t?`Command exited with code ${e.exit_code??1}.`:void 0}},m=e=>e.result?.structured_content??e.result?.content??e.error?.message??``,h=e=>({isError:e.status===`failed`||e.error!==void 0,error:e.error?.message}),g=(e,t)=>({events:[n(t.runId,`stderr`,{sessionId:t.sessionId,text:e.message})],state:{error:{kind:`provider`,message:e.message}}}),_=(e,t,n)=>{switch(e.item.type){case`command_execution`:return d(c(e.item),t,n);case`mcp_tool_call`:return d(l(e.item),t,n);case`web_search`:return d(u(e.item),t,n);default:return{events:[]}}},v=(e,t,i)=>{switch(e.item.type){case`agent_message`:return{events:[n(t.runId,`message`,{sessionId:t.sessionId,model:i.model??null,role:`assistant`,content:[r(e.item.text)],text:e.item.text})],state:{output:{text:e.item.text}}};case`reasoning`:return{events:[n(t.runId,`reasoning`,{sessionId:t.sessionId,model:i.model??null,content:[r(e.item.text)],text:e.item.text})]};case`command_execution`:return f(c(e.item),e.item.aggregated_output,p(e.item),t,i);case`mcp_tool_call`:return f(l(e.item),m(e.item),h(e.item),t,i);case`web_search`:return f(u(e.item),``,{isError:!1},t,i);case`error`:return g(e.item,t);default:return{events:[]}}},y=(e,t,n={})=>{switch(e.type){case`thread.started`:return{events:[],sessionId:e.thread_id};case`turn.started`:return{events:[]};case`turn.completed`:return{events:[],state:{stats:s(e.usage),status:`completed`,error:void 0}};case`turn.failed`:return{events:[],state:{status:`failed`,error:{kind:`provider`,message:e.error.message}}};case`item.started`:return _(e,t,n);case`item.updated`:return{events:[]};case`item.completed`:return v(e,t,n);case`error`:return{events:[],state:{status:`failed`,error:{kind:`provider`,message:e.message}}};default:return{events:[]}}},b={structuredOutput:!0,sessionResume:!0,imageInput:!0,mcp:!0,eventStreaming:!0},x=e=>e.length===1&&e[0]?.type===`text`?e[0].text:e.map(e=>e.type===`text`?{type:`text`,text:e.text}:{type:`local_image`,path:e.path}),S=(e,t)=>({outputSchema:e.normalizedRequest.schema.kind===`none`?void 0:e.normalizedRequest.schema.jsonSchema,signal:t});var C=class extends a{type=`codex-sdk`;defaults;runDefaults;command;codex;resolvedEnv;constructor(e={}){super({type:`codex-sdk`,capabilities:b,sessionId:e.sessionId,onEvent:e.onEvent}),this.command=e.command,this.defaults={cwd:e.cwd,model:e.model},this.runDefaults={permissionMode:e.permissionMode,sandboxMode:e.sandboxMode,skipGitRepoCheck:e.skipGitRepoCheck,modelReasoningEffort:e.modelReasoningEffort,networkAccessEnabled:e.networkAccessEnabled,webSearchMode:e.webSearchMode,webSearchEnabled:e.webSearchEnabled,additionalDirectories:e.additionalDirectories?[...e.additionalDirectories]:void 0};let n=t({propagateEnv:e.propagateEnv});e.env&&Object.assign(n,e.env),this.resolvedEnv=n,this.codex=e.codex??new o({codexPathOverride:this.command,baseUrl:e.baseUrl,apiKey:e.apiKey,config:e.config,env:n})}getResolvedEnvForTesting(){return this.resolvedEnv}get runRequestDefaults(){return this.defaults}async executeSdkRun(t,n,r){let a=this.buildThreadOptions(n,t),o=t.requestedSessionId?this.codex.resumeThread(t.requestedSessionId,a):this.codex.startThread(a);if(!t.sessionId&&o.id&&(t.sessionId=o.id,this.setSessionId(o.id)),t.stopReason)return;let s=await o.runStreamed(x(t.normalizedRequest.input),S(t,r.signal));for await(let e of s.events){let n=y(e,{runId:t.runId,requestedSessionId:t.requestedSessionId,sessionId:t.sessionId,schemaRequested:t.normalizedRequest.schema.kind!==`none`,toolCalls:t.toolCalls},{model:t.normalizedRequest.model});this.applyBatch(t,n)}if(t.normalizedRequest.schema.kind!==`none`&&t.output.value===void 0&&t.error===void 0&&t.status!==`failed`&&t.output.text)try{i(t,{events:[],state:{output:{value:e(t.output.text)}}})}catch{}}buildThreadOptions(e,t){return{model:t.normalizedRequest.model,workingDirectory:t.normalizedRequest.cwd,approvalPolicy:e.permissionMode??this.runDefaults.permissionMode,sandboxMode:e.sandboxMode??this.runDefaults.sandboxMode,skipGitRepoCheck:e.skipGitRepoCheck??this.runDefaults.skipGitRepoCheck,modelReasoningEffort:e.modelReasoningEffort??this.runDefaults.modelReasoningEffort,networkAccessEnabled:e.networkAccessEnabled??this.runDefaults.networkAccessEnabled,webSearchMode:e.webSearchMode??this.runDefaults.webSearchMode,webSearchEnabled:e.webSearchEnabled??this.runDefaults.webSearchEnabled,additionalDirectories:e.additionalDirectories??this.runDefaults.additionalDirectories}}};const w=e=>new C(e);export{w as createCodexSdkAgent};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as GeminiCliRunOptions, i as GeminiCliPermissionMode, n as GeminiCliAgent, o as GeminiEvent, r as GeminiCliAgentOptions, t as createGeminiCliAgent } from "../../index-
|
|
1
|
+
import { a as GeminiCliRunOptions, i as GeminiCliPermissionMode, n as GeminiCliAgent, o as GeminiEvent, r as GeminiCliAgentOptions, t as createGeminiCliAgent } from "../../index-DNyKelMh.mjs";
|
|
2
2
|
export { GeminiCliAgent, GeminiCliAgentOptions, GeminiCliPermissionMode, GeminiCliRunOptions, GeminiEvent, createGeminiCliAgent };
|
|
@@ -1,292 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as getInputText, l as toTextPart, o as createAgentEvent, s as createEventParser } from "../../classify-error-pL6jeu4T.mjs";
|
|
3
|
-
import { t as Agent } from "../../Agent-D8WkUilj.mjs";
|
|
4
|
-
import { z } from "zod/v4";
|
|
5
|
-
//#region src/adapters/gemini-cli/events/mappers.ts
|
|
6
|
-
const asString = (value) => typeof value === "string" ? value : void 0;
|
|
7
|
-
const asNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
8
|
-
const extractText = (value) => {
|
|
9
|
-
if (typeof value === "string") return value;
|
|
10
|
-
if (Array.isArray(value)) return value.map(extractText).join("");
|
|
11
|
-
if (isRecord(value)) {
|
|
12
|
-
const text = asString(value.text);
|
|
13
|
-
if (text) return text;
|
|
14
|
-
const parts = value.parts ?? value.content;
|
|
15
|
-
if (Array.isArray(parts)) return parts.map(extractText).join("");
|
|
16
|
-
}
|
|
17
|
-
return "";
|
|
18
|
-
};
|
|
19
|
-
const stringifyValue = (value) => {
|
|
20
|
-
if (typeof value === "string") return value;
|
|
21
|
-
if (value === null || value === void 0) return "";
|
|
22
|
-
try {
|
|
23
|
-
return JSON.stringify(value);
|
|
24
|
-
} catch {
|
|
25
|
-
return String(value);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
const nextId = () => crypto.randomUUID();
|
|
29
|
-
const getGeminiSessionId = (event) => {
|
|
30
|
-
const raw = event;
|
|
31
|
-
const sessionId = asString(raw.session_id) ?? asString(raw.sessionId);
|
|
32
|
-
if (sessionId) return sessionId;
|
|
33
|
-
if (isRecord(raw.message)) return asString(raw.message.session_id) ?? asString(raw.message.sessionId);
|
|
34
|
-
};
|
|
35
|
-
const mapInitEvent = (_raw, context) => {
|
|
36
|
-
const text = "[init]";
|
|
37
|
-
return { events: [createAgentEvent(context.runId, "message", {
|
|
38
|
-
sessionId: context.sessionId,
|
|
39
|
-
model: null,
|
|
40
|
-
role: "system",
|
|
41
|
-
content: [toTextPart(text)],
|
|
42
|
-
text
|
|
43
|
-
})] };
|
|
44
|
-
};
|
|
45
|
-
const mapMessageEvent = (raw, context, options) => {
|
|
46
|
-
const payload = isRecord(raw.message) ? raw.message : raw;
|
|
47
|
-
const role = asString(payload.role) ?? asString(raw.role) ?? "assistant";
|
|
48
|
-
const model = asString(payload.model) ?? asString(raw.model) ?? options.model ?? null;
|
|
49
|
-
const text = extractText(payload.content ?? payload.parts ?? payload.text ?? raw.content ?? raw.text);
|
|
50
|
-
if (!text?.trim()) return { events: [] };
|
|
51
|
-
if (role === "assistant") return { events: [createAgentEvent(context.runId, "message", {
|
|
52
|
-
sessionId: context.sessionId,
|
|
53
|
-
model,
|
|
54
|
-
role: "assistant",
|
|
55
|
-
content: [toTextPart(text)],
|
|
56
|
-
text
|
|
57
|
-
})] };
|
|
58
|
-
return { events: [createAgentEvent(context.runId, "message", {
|
|
59
|
-
sessionId: context.sessionId,
|
|
60
|
-
model: null,
|
|
61
|
-
role: "user",
|
|
62
|
-
content: [toTextPart(text)],
|
|
63
|
-
text
|
|
64
|
-
})] };
|
|
65
|
-
};
|
|
66
|
-
const mapThoughtEvent = (raw, context, options) => {
|
|
67
|
-
const text = asString(raw.thought) ?? asString(raw.text) ?? asString(raw.content) ?? "";
|
|
68
|
-
if (!text.trim()) return { events: [] };
|
|
69
|
-
return { events: [createAgentEvent(context.runId, "reasoning", {
|
|
70
|
-
sessionId: context.sessionId,
|
|
71
|
-
model: options.model ?? null,
|
|
72
|
-
content: [toTextPart(text)],
|
|
73
|
-
text
|
|
74
|
-
})] };
|
|
75
|
-
};
|
|
76
|
-
const mapToolUseEvent = (raw, context, options) => {
|
|
77
|
-
const toolCallId = asString(raw.tool_id) ?? asString(raw.id) ?? nextId();
|
|
78
|
-
const toolName = asString(raw.tool_name) ?? asString(raw.name) ?? "tool";
|
|
79
|
-
const input = (isRecord(raw.parameters) ? raw.parameters : void 0) ?? (isRecord(raw.args) ? raw.args : void 0) ?? (isRecord(raw.input) ? raw.input : void 0) ?? {};
|
|
80
|
-
return {
|
|
81
|
-
events: [createAgentEvent(context.runId, "tool-call", {
|
|
82
|
-
sessionId: context.sessionId,
|
|
83
|
-
model: options.model ?? null,
|
|
84
|
-
toolCallId,
|
|
85
|
-
toolName,
|
|
86
|
-
input
|
|
87
|
-
})],
|
|
88
|
-
toolCalls: [{
|
|
89
|
-
toolCallId,
|
|
90
|
-
toolName,
|
|
91
|
-
input
|
|
92
|
-
}]
|
|
93
|
-
};
|
|
94
|
-
};
|
|
95
|
-
const mapToolResultEvent = (raw, context) => {
|
|
96
|
-
const toolCallId = asString(raw.tool_id) ?? asString(raw.tool_use_id) ?? asString(raw.id) ?? nextId();
|
|
97
|
-
const status = asString(raw.status);
|
|
98
|
-
const isError = status ? status !== "success" : Boolean(raw.error);
|
|
99
|
-
const output = raw.output ?? raw.result ?? raw.content ?? raw.message ?? (typeof raw.error === "string" ? raw.error : void 0);
|
|
100
|
-
const outputStr = stringifyValue(output);
|
|
101
|
-
const tool = context.toolCalls.get(toolCallId);
|
|
102
|
-
return { events: [createAgentEvent(context.runId, "tool-result", {
|
|
103
|
-
sessionId: context.sessionId,
|
|
104
|
-
toolCallId,
|
|
105
|
-
toolName: tool?.toolName,
|
|
106
|
-
input: tool?.input,
|
|
107
|
-
output: outputStr,
|
|
108
|
-
isError: isError || void 0,
|
|
109
|
-
error: isError ? stringifyValue(raw.error ?? output) : void 0
|
|
110
|
-
})] };
|
|
111
|
-
};
|
|
112
|
-
const extractUsage = (raw) => {
|
|
113
|
-
const tokenCount = (isRecord(raw.token_count) ? raw.token_count : void 0) ?? (isRecord(raw.tokenCount) ? raw.tokenCount : void 0) ?? (isRecord(raw.usage) ? raw.usage : void 0) ?? (isRecord(raw.usage_metadata) ? raw.usage_metadata : void 0) ?? (isRecord(raw.usageMetadata) ? raw.usageMetadata : void 0) ?? (isRecord(raw.stats) ? raw.stats : void 0);
|
|
114
|
-
if (!tokenCount) return void 0;
|
|
115
|
-
const inputTokens = asNumber(tokenCount.prompt_tokens) ?? asNumber(tokenCount.promptTokens) ?? asNumber(tokenCount.input_tokens) ?? asNumber(tokenCount.inputTokens) ?? asNumber(tokenCount.prompt_token_count);
|
|
116
|
-
const outputTokens = asNumber(tokenCount.completion_tokens) ?? asNumber(tokenCount.output_tokens) ?? asNumber(tokenCount.outputTokens) ?? asNumber(tokenCount.candidates_token_count) ?? asNumber(tokenCount.completion_token_count);
|
|
117
|
-
if (inputTokens === void 0 && outputTokens === void 0) return void 0;
|
|
118
|
-
return {
|
|
119
|
-
inputTokens: inputTokens ?? 0,
|
|
120
|
-
outputTokens: outputTokens ?? 0
|
|
121
|
-
};
|
|
122
|
-
};
|
|
123
|
-
const mapResultEvent = (raw, context) => {
|
|
124
|
-
const status = asString(raw.status) ?? asString(raw.subtype) ?? "success";
|
|
125
|
-
const isError = status !== "success" || Boolean(raw.error) || raw.is_error === true;
|
|
126
|
-
const resultValue = raw.result ?? raw.output ?? raw.text ?? raw.content;
|
|
127
|
-
const durationMs = asNumber(raw.duration_ms) ?? asNumber(raw.durationMs) ?? (isRecord(raw.stats) ? asNumber(raw.stats.total_time_ms) : void 0) ?? 0;
|
|
128
|
-
const usage = extractUsage(raw);
|
|
129
|
-
const totalTokens = usage ? usage.inputTokens + usage.outputTokens : void 0;
|
|
130
|
-
const state = { stats: {
|
|
131
|
-
durationMs,
|
|
132
|
-
apiDurationMs: durationMs,
|
|
133
|
-
turns: asNumber(raw.num_turns) ?? 1,
|
|
134
|
-
costUsd: asNumber(raw.total_cost_usd) ?? 0,
|
|
135
|
-
inputTokens: usage?.inputTokens,
|
|
136
|
-
outputTokens: usage?.outputTokens,
|
|
137
|
-
totalTokens
|
|
138
|
-
} };
|
|
139
|
-
if (typeof resultValue === "string") state.output = { text: resultValue };
|
|
140
|
-
if (raw.structured_output !== void 0) state.output = {
|
|
141
|
-
...state.output,
|
|
142
|
-
value: raw.structured_output
|
|
143
|
-
};
|
|
144
|
-
else if (context.schemaRequested && resultValue !== void 0) state.output = {
|
|
145
|
-
...state.output,
|
|
146
|
-
value: resultValue
|
|
147
|
-
};
|
|
148
|
-
if (isError) {
|
|
149
|
-
state.status = "failed";
|
|
150
|
-
state.error = {
|
|
151
|
-
kind: "provider",
|
|
152
|
-
message: asString(raw.error) ?? (typeof resultValue === "string" && resultValue.trim() ? resultValue : stringifyValue(raw.error ?? resultValue ?? status))
|
|
153
|
-
};
|
|
154
|
-
} else state.status = "completed";
|
|
155
|
-
return {
|
|
156
|
-
events: [],
|
|
157
|
-
state
|
|
158
|
-
};
|
|
159
|
-
};
|
|
160
|
-
const mapErrorEvent = (raw, context) => {
|
|
161
|
-
const message = asString(raw.message) ?? (raw.error === void 0 ? void 0 : stringifyValue(raw.error)) ?? (raw.details === void 0 ? void 0 : stringifyValue(raw.details)) ?? "Gemini emitted an error event.";
|
|
162
|
-
return { events: [createAgentEvent(context.runId, "stderr", {
|
|
163
|
-
sessionId: context.sessionId,
|
|
164
|
-
text: message
|
|
165
|
-
})] };
|
|
166
|
-
};
|
|
167
|
-
const mapGeminiEvent = (event, context, options = {}) => {
|
|
168
|
-
const raw = event;
|
|
169
|
-
switch (event.type) {
|
|
170
|
-
case "init": return mapInitEvent(raw, context);
|
|
171
|
-
case "message": return mapMessageEvent(raw, context, options);
|
|
172
|
-
case "thought": return mapThoughtEvent(raw, context, options);
|
|
173
|
-
case "tool_use": return mapToolUseEvent(raw, context, options);
|
|
174
|
-
case "tool_result": return mapToolResultEvent(raw, context);
|
|
175
|
-
case "result": return mapResultEvent(raw, context);
|
|
176
|
-
case "error": return mapErrorEvent(raw, context);
|
|
177
|
-
default: return { events: [] };
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
//#endregion
|
|
181
|
-
//#region src/adapters/gemini-cli/events/parser.ts
|
|
182
|
-
const parseGeminiEvent = createEventParser(z.object({ type: z.string() }).passthrough());
|
|
183
|
-
//#endregion
|
|
184
|
-
//#region src/adapters/gemini-cli/adapter.ts
|
|
185
|
-
const GEMINI_CLI_CAPABILITIES = {
|
|
186
|
-
structuredOutput: false,
|
|
187
|
-
sessionResume: true,
|
|
188
|
-
imageInput: false,
|
|
189
|
-
mcp: true,
|
|
190
|
-
eventStreaming: true
|
|
191
|
-
};
|
|
192
|
-
var GeminiCliAgentImpl = class extends Agent {
|
|
193
|
-
type = "gemini-cli";
|
|
194
|
-
creationOptions;
|
|
195
|
-
runDefaults;
|
|
196
|
-
runModels = /* @__PURE__ */ new Map();
|
|
197
|
-
runTextBuffers = /* @__PURE__ */ new Map();
|
|
198
|
-
constructor(options = {}) {
|
|
199
|
-
super({
|
|
200
|
-
type: "gemini-cli",
|
|
201
|
-
capabilities: GEMINI_CLI_CAPABILITIES,
|
|
202
|
-
defaults: {
|
|
203
|
-
cwd: options.cwd,
|
|
204
|
-
env: options.env,
|
|
205
|
-
command: toArray(options.command ?? "gemini"),
|
|
206
|
-
sessionId: options.sessionId,
|
|
207
|
-
model: options.model,
|
|
208
|
-
systemPrompt: options.systemPrompt
|
|
209
|
-
},
|
|
210
|
-
spawner: options.spawner,
|
|
211
|
-
container: options.container,
|
|
212
|
-
logPath: options.logPath,
|
|
213
|
-
onEvent: options.onEvent
|
|
214
|
-
});
|
|
215
|
-
this.creationOptions = options;
|
|
216
|
-
this.runDefaults = {
|
|
217
|
-
allowedTools: options.allowedTools ? [...options.allowedTools] : void 0,
|
|
218
|
-
disallowedTools: options.disallowedTools ? [...options.disallowedTools] : void 0,
|
|
219
|
-
permissionMode: options.permissionMode,
|
|
220
|
-
extraArgs: options.extraArgs ? [...options.extraArgs] : void 0
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
buildArgs(request, run) {
|
|
224
|
-
const args = ["--output-format", "stream-json"];
|
|
225
|
-
const inputText = getInputText(request.input);
|
|
226
|
-
const allowedTools = request.allowedTools ?? this.runDefaults.allowedTools;
|
|
227
|
-
const disallowedTools = request.disallowedTools ?? this.runDefaults.disallowedTools;
|
|
228
|
-
const permissionMode = request.permissionMode ?? this.runDefaults.permissionMode;
|
|
229
|
-
const extraArgs = request.extraArgs ?? this.runDefaults.extraArgs;
|
|
230
|
-
this.runModels.set(run.runId, request.model);
|
|
231
|
-
if (request.model) args.push("--model", request.model);
|
|
232
|
-
if (request.systemPrompt) args.push("--system-prompt", request.systemPrompt);
|
|
233
|
-
if (permissionMode === "full") args.push("--approval-mode", "yolo");
|
|
234
|
-
if (allowedTools && allowedTools.length > 0) {
|
|
235
|
-
const disallowed = new Set((disallowedTools ?? []).map((t) => t.toLowerCase()));
|
|
236
|
-
const filtered = allowedTools.filter((t) => !disallowed.has(t.toLowerCase()));
|
|
237
|
-
for (const tool of filtered) args.push("--allowed-tools", tool);
|
|
238
|
-
}
|
|
239
|
-
if (run.requestedSessionId) args.push("--resume", run.requestedSessionId);
|
|
240
|
-
if (extraArgs && extraArgs.length > 0) args.push(...extraArgs);
|
|
241
|
-
if (inputText.trim().startsWith("-")) args.push("--prompt", inputText);
|
|
242
|
-
else args.push(inputText);
|
|
243
|
-
return args;
|
|
244
|
-
}
|
|
245
|
-
buildEnv(_request, _run) {
|
|
246
|
-
return this.buildDefaultEnv(this.creationOptions.propagateEnv);
|
|
247
|
-
}
|
|
248
|
-
mapRawEvent(raw, context) {
|
|
249
|
-
this.appendRawLog(raw);
|
|
250
|
-
const parsed = parseGeminiEvent(raw);
|
|
251
|
-
if (!parsed) {
|
|
252
|
-
this.onParseError(JSON.stringify(raw).slice(0, 200), /* @__PURE__ */ new Error("schema validation failed"));
|
|
253
|
-
return { events: [] };
|
|
254
|
-
}
|
|
255
|
-
const sessionId = getGeminiSessionId(parsed) ?? context.sessionId;
|
|
256
|
-
const batch = mapGeminiEvent(parsed, {
|
|
257
|
-
...context,
|
|
258
|
-
sessionId
|
|
259
|
-
}, { model: this.runModels.get(context.runId) });
|
|
260
|
-
if (sessionId && batch.sessionId === void 0) batch.sessionId = sessionId;
|
|
261
|
-
let assistantText;
|
|
262
|
-
for (const event of batch.events) {
|
|
263
|
-
if (event.type !== "message" || event.role !== "assistant" || !event.text) continue;
|
|
264
|
-
const nextText = `${this.runTextBuffers.get(context.runId) ?? ""}${event.text}`;
|
|
265
|
-
this.runTextBuffers.set(context.runId, nextText);
|
|
266
|
-
assistantText = nextText;
|
|
267
|
-
}
|
|
268
|
-
if (parsed.type === "result" && batch.state?.output?.text !== void 0) this.runTextBuffers.set(context.runId, batch.state.output.text);
|
|
269
|
-
else if (assistantText !== void 0) batch.state = {
|
|
270
|
-
...batch.state,
|
|
271
|
-
output: {
|
|
272
|
-
...batch.state?.output,
|
|
273
|
-
text: assistantText
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
return batch;
|
|
277
|
-
}
|
|
278
|
-
async onRunFinished(run) {
|
|
279
|
-
await super.onRunFinished(run);
|
|
280
|
-
this.runModels.delete(run.runId);
|
|
281
|
-
this.runTextBuffers.delete(run.runId);
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
const createGeminiCliAgent = (options) => {
|
|
285
|
-
if (!options?.container) return new GeminiCliAgentImpl(options);
|
|
286
|
-
return new GeminiCliAgentImpl({
|
|
287
|
-
...options,
|
|
288
|
-
spawner: options.container.spawner
|
|
289
|
-
});
|
|
290
|
-
};
|
|
291
|
-
//#endregion
|
|
292
|
-
export { createGeminiCliAgent };
|
|
1
|
+
import{a as e,n as t}from"../../util-CGg8cK92.mjs";import{a as n,c as r,o as i,s as a}from"../../classify-error-V6x6jP_R.mjs";import{n as o,t as s}from"../../execution-target-BJ5mWjDM.mjs";import{z as c}from"zod/v4";const l=e=>typeof e==`string`?e:void 0,u=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,d=e=>{if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(d).join(``);if(t(e)){let t=l(e.text);if(t)return t;let n=e.parts??e.content;if(Array.isArray(n))return n.map(d).join(``)}return``},f=e=>{if(typeof e==`string`)return e;if(e==null)return``;try{return JSON.stringify(e)}catch{return String(e)}},p=()=>crypto.randomUUID(),m=e=>{let n=e,r=l(n.session_id)??l(n.sessionId);if(r)return r;if(t(n.message))return l(n.message.session_id)??l(n.message.sessionId)},h=(e,t)=>{let i=`[init]`;return{events:[n(t.runId,`message`,{sessionId:t.sessionId,model:null,role:`system`,content:[r(i)],text:i})]}},g=(e,i,a)=>{let o=t(e.message)?e.message:e,s=l(o.role)??l(e.role)??`assistant`,c=l(o.model)??l(e.model)??a.model??null,u=d(o.content??o.parts??o.text??e.content??e.text);return u?.trim()?s===`assistant`?{events:[n(i.runId,`message`,{sessionId:i.sessionId,model:c,role:`assistant`,content:[r(u)],text:u})]}:{events:[n(i.runId,`message`,{sessionId:i.sessionId,model:null,role:`user`,content:[r(u)],text:u})]}:{events:[]}},_=(e,t,i)=>{let a=l(e.thought)??l(e.text)??l(e.content)??``;return a.trim()?{events:[n(t.runId,`reasoning`,{sessionId:t.sessionId,model:i.model??null,content:[r(a)],text:a})]}:{events:[]}},v=(e,r,i)=>{let a=l(e.tool_id)??l(e.id)??p(),o=l(e.tool_name)??l(e.name)??`tool`,s=(t(e.parameters)?e.parameters:void 0)??(t(e.args)?e.args:void 0)??(t(e.input)?e.input:void 0)??{};return{events:[n(r.runId,`tool-call`,{sessionId:r.sessionId,model:i.model??null,toolCallId:a,toolName:o,input:s})],toolCalls:[{toolCallId:a,toolName:o,input:s}]}},y=(e,t)=>{let r=l(e.tool_id)??l(e.tool_use_id)??l(e.id)??p(),i=l(e.status),a=i?i!==`success`:!!e.error,o=e.output??e.result??e.content??e.message??(typeof e.error==`string`?e.error:void 0),s=f(o),c=t.toolCalls.get(r);return{events:[n(t.runId,`tool-result`,{sessionId:t.sessionId,toolCallId:r,toolName:c?.toolName,input:c?.input,output:s,isError:a||void 0,error:a?f(e.error??o):void 0})]}},b=e=>{let n=(t(e.token_count)?e.token_count:void 0)??(t(e.tokenCount)?e.tokenCount:void 0)??(t(e.usage)?e.usage:void 0)??(t(e.usage_metadata)?e.usage_metadata:void 0)??(t(e.usageMetadata)?e.usageMetadata:void 0)??(t(e.stats)?e.stats:void 0);if(!n)return;let r=u(n.prompt_tokens)??u(n.promptTokens)??u(n.input_tokens)??u(n.inputTokens)??u(n.prompt_token_count),i=u(n.completion_tokens)??u(n.output_tokens)??u(n.outputTokens)??u(n.candidates_token_count)??u(n.completion_token_count);if(!(r===void 0&&i===void 0))return{inputTokens:r??0,outputTokens:i??0}},x=(e,n)=>{let r=l(e.status)??l(e.subtype)??`success`,i=r!==`success`||!!e.error||e.is_error===!0,a=e.result??e.output??e.text??e.content,o=u(e.duration_ms)??u(e.durationMs)??(t(e.stats)?u(e.stats.total_time_ms):void 0)??0,s=b(e),c=s?s.inputTokens+s.outputTokens:void 0,d={stats:{durationMs:o,apiDurationMs:o,turns:u(e.num_turns)??1,costUsd:u(e.total_cost_usd)??0,inputTokens:s?.inputTokens,outputTokens:s?.outputTokens,totalTokens:c}};return typeof a==`string`&&(d.output={text:a}),e.structured_output===void 0?n.schemaRequested&&a!==void 0&&(d.output={...d.output,value:a}):d.output={...d.output,value:e.structured_output},i?(d.status=`failed`,d.error={kind:`provider`,message:l(e.error)??(typeof a==`string`&&a.trim()?a:f(e.error??a??r))}):d.status=`completed`,{events:[],state:d}},S=(e,t)=>{let r=l(e.message)??(e.error===void 0?void 0:f(e.error))??(e.details===void 0?void 0:f(e.details))??`Gemini emitted an error event.`;return{events:[n(t.runId,`stderr`,{sessionId:t.sessionId,text:r})]}},C=(e,t,n={})=>{let r=e;switch(e.type){case`init`:return h(r,t);case`message`:return g(r,t,n);case`thought`:return _(r,t,n);case`tool_use`:return v(r,t,n);case`tool_result`:return y(r,t);case`result`:return x(r,t);case`error`:return S(r,t);default:return{events:[]}}},w=i(c.object({type:c.string()}).passthrough()),T={structuredOutput:!1,sessionResume:!0,imageInput:!1,mcp:!0,eventStreaming:!0};var E=class extends o{type=`gemini-cli`;creationOptions;runDefaults;runModels=new Map;runTextBuffers=new Map;constructor(t={}){super({type:`gemini-cli`,capabilities:T,defaults:{cwd:t.cwd,env:t.env,command:e(t.command??`gemini`),sessionId:t.sessionId,model:t.model,systemPrompt:t.systemPrompt},spawner:t.spawner,executionTarget:t.container??t.sandbox,logPath:t.logPath,onEvent:t.onEvent}),this.creationOptions=t,this.runDefaults={allowedTools:t.allowedTools?[...t.allowedTools]:void 0,disallowedTools:t.disallowedTools?[...t.disallowedTools]:void 0,permissionMode:t.permissionMode,extraArgs:t.extraArgs?[...t.extraArgs]:void 0}}buildArgs(e,t){let n=[`--output-format`,`stream-json`],r=a(e.input),i=e.allowedTools??this.runDefaults.allowedTools,o=e.disallowedTools??this.runDefaults.disallowedTools,s=e.permissionMode??this.runDefaults.permissionMode,c=e.extraArgs??this.runDefaults.extraArgs;if(this.runModels.set(t.runId,e.model),e.model&&n.push(`--model`,e.model),e.systemPrompt&&n.push(`--system-prompt`,e.systemPrompt),s===`full`&&n.push(`--approval-mode`,`yolo`),i&&i.length>0){let e=new Set((o??[]).map(e=>e.toLowerCase())),t=i.filter(t=>!e.has(t.toLowerCase()));for(let e of t)n.push(`--allowed-tools`,e)}return t.requestedSessionId&&n.push(`--resume`,t.requestedSessionId),c&&c.length>0&&n.push(...c),r.trim().startsWith(`-`)?n.push(`--prompt`,r):n.push(r),n}buildEnv(e,t){return this.buildDefaultEnv(this.creationOptions.propagateEnv)}mapRawEvent(e,t){this.appendRawLog(e);let n=w(e);if(!n)return this.onParseError(JSON.stringify(e).slice(0,200),Error(`schema validation failed`)),{events:[]};let r=m(n)??t.sessionId,i=C(n,{...t,sessionId:r},{model:this.runModels.get(t.runId)});r&&i.sessionId===void 0&&(i.sessionId=r);let a;for(let e of i.events){if(e.type!==`message`||e.role!==`assistant`||!e.text)continue;let n=`${this.runTextBuffers.get(t.runId)??``}${e.text}`;this.runTextBuffers.set(t.runId,n),a=n}return n.type===`result`&&i.state?.output?.text!==void 0?this.runTextBuffers.set(t.runId,i.state.output.text):a!==void 0&&(i.state={...i.state,output:{...i.state?.output,text:a}}),i}async onRunFinished(e){await super.onRunFinished(e),this.runModels.delete(e.runId),this.runTextBuffers.delete(e.runId)}};const D=e=>new E(s(e).options);export{D as createGeminiCliAgent};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{n as e,t}from"./types-CwvWHEpy.mjs";import{z as n}from"zod/v4";const r=()=>crypto.randomUUID(),i=()=>`evt_${crypto.randomUUID()}`,a=e=>({type:`text`,text:e}),o=e=>e.flatMap(e=>e.type===`text`?[e.text]:[]).join(`
|
|
2
|
+
`),s=e=>e.flatMap(e=>e.type===`text`?[e.text]:[]).join(`
|
|
3
|
+
|
|
4
|
+
`),c=e=>t=>{let n=e.safeParse(t);return n.success?n.data:null},l=(e,t,n)=>({id:n.id??i(),runId:e,timestamp:new Date,type:t,...n}),u=e=>e instanceof n.ZodType,d=e=>{if(!(`schema`in e))return{kind:`none`};let{schema:t}=e;return u(t)?{kind:`zod`,jsonSchema:n.toJSONSchema(t),zodSchema:t}:{kind:`json-schema`,jsonSchema:t}},f=(t,n,r,i)=>{let a=typeof i.input==`string`?[{type:`text`,text:i.input}]:i.input;if(a.length===0||a.every(e=>e.type===`text`&&e.text.trim()===``))throw new e(`Run input cannot be empty.`);if(!n.imageInput&&a.some(e=>e.type===`image`))throw new e(`${t} does not support image input.`);let o=d(i);if(!n.structuredOutput&&o.kind!==`none`)throw new e(`${t} does not support structured output.`);if(i.timeoutMs!==void 0&&(!Number.isFinite(i.timeoutMs)||i.timeoutMs<=0))throw new e(`timeoutMs must be a positive finite number.`);return{input:a,schema:o,cwd:i.cwd??r?.cwd,model:i.model??r?.model,systemPrompt:i.systemPrompt??r?.systemPrompt,timeoutMs:i.timeoutMs,signal:i.signal}},p=(e,t)=>{if(!e.stats)return;let n=Math.max(0,t.getTime()-e.startedAt.getTime());e.stats={...e.stats,durationMs:e.stats.durationMs??n,apiDurationMs:e.stats.apiDurationMs??n}},m=(e,t)=>{let n=e.normalizedRequest.schema;if(n.kind!==`none`){if(n.kind===`zod`){let r=n.zodSchema.safeParse(t);if(!r.success){e.status=`failed`,e.error={kind:`parse`,message:r.error.message};return}e.output.value=r.data;return}e.output.value=t}},h=(e,t)=>{if(e.events.push(t),t.type!==`message`||t.role!==`assistant`)return;let n=t.text??o(t.content);n&&e.assistantTexts.push(n)},g=(e,t,n={})=>{t.sessionId&&(e.sessionId=t.sessionId,n.onSessionId?.(t.sessionId));for(let n of t.toolCalls??[])e.toolCalls.set(n.toolCallId,{toolName:n.toolName,input:n.input});if(!t.state)return;let r=t.state;r.output&&(`text`in r.output&&(e.output.text=r.output.text),`value`in r.output&&m(e,r.output.value)),`stats`in r&&(e.stats=r.stats),`status`in r&&(e.status=r.status),`error`in r&&(e.error=r.error)},_=e=>e.events.some(e=>e.type===`message`||e.type===`reasoning`||e.type===`tool-call`||e.type===`tool-result`),v=e=>{let t=e.normalizedRequest.schema.kind!==`none`&&e.output.value===void 0;return e.stopReason===`user`||e.stopReason===`abort`||e.stopReason===`timeout`?`cancelled`:e.error?e.error.kind===`abort`?`cancelled`:`failed`:e.status?e.status===`completed`&&t?`failed`:e.status:e.processResult&&e.processResult.exitCode!==null&&e.processResult.exitCode!==0||!_(e)&&e.stderrLines.length>0||t?`failed`:`completed`},y=(e,t)=>{let n=e.processResult,r=e.stderrLines.join(`
|
|
5
|
+
`);if(e.stopReason===`user`)return{kind:`abort`,message:`Run stopped by user.`};if(e.stopReason===`abort`)return{kind:`abort`,message:`Run aborted.`};if(e.stopReason===`timeout`)return{kind:`abort`,message:`Run timed out after ${e.normalizedRequest.timeoutMs}ms.`};if(e.error)return e.error;if(n&&n.exitCode!==null&&n.exitCode!==0)return{kind:`process`,message:r||`Process exited with code ${n.exitCode}.`};if(t===`failed`&&e.stderrLines.length>0)return{kind:`process`,message:r};if(t===`failed`&&e.normalizedRequest.schema.kind!==`none`&&e.output.value===void 0)return{kind:`parse`,message:`Structured output was requested but no structured output value was produced.`}},b=(e,t,n,r,i)=>{let a=t.stderrLines.join(`
|
|
6
|
+
`),o={type:e,runId:t.runId,sessionId:t.sessionId,text:t.output.text??t.assistantTexts.join(`
|
|
7
|
+
|
|
8
|
+
`),events:[...t.events],stats:t.stats,timing:{startedAt:t.startedAt,endedAt:n,durationMs:n.getTime()-t.startedAt.getTime()},process:t.processResult?{exitCode:t.processResult.exitCode,signal:t.processResult.signal,stderr:a}:void 0};switch(r){case`completed`:return t.normalizedRequest.schema.kind===`none`?{...o,status:r,error:void 0,cancelReason:void 0}:{...o,status:r,output:t.output.value,error:void 0,cancelReason:void 0};case`failed`:return{...o,status:r,output:void 0,error:i??{kind:`process`,message:`Unknown error.`},cancelReason:void 0};case`cancelled`:return{...o,status:r,output:void 0,error:i??{kind:`abort`,message:`Run cancelled.`},cancelReason:t.stopReason??`user`};default:throw Error(`Unsupported run status.`)}},x=()=>{let e=new Date;return{runCount:0,messagesReceived:0,toolCalls:0,errors:0,startedAt:e,lastActivityAt:e}};var S=class{type;capabilities;currentRun;eventHandlers=[];_sessionId;_metrics;constructor(e){this.type=e.type,this.capabilities=e.capabilities,this._sessionId=e.sessionId,this._metrics=x(),e.onEvent&&this.onEvent(e.onEvent)}onValidateRun(e,t){}async onDispose(){}onHandlerError(e){}get sessionId(){return this._sessionId}get metrics(){return this._metrics}get isRunning(){return this.currentRun?.running??!1}onEvent(e){return this.eventHandlers.push(e),()=>{let t=this.eventHandlers.indexOf(e);t>=0&&this.eventHandlers.splice(t,1)}}async run(t){if(this.currentRun?.running)throw new e(`This agent is already running. Wait for it to finish first.`);let n=f(this.type,this.capabilities,this.runRequestDefaults,t);this.onValidateRun(t,n);let i={runId:r(),startedAt:new Date,requestedSessionId:this._sessionId,sessionId:this._sessionId,normalizedRequest:n,events:[],stderrLines:[],assistantTexts:[],toolCalls:new Map,output:{}},a={context:i,running:!0,promise:new Promise(()=>{})};this._metrics.runCount++;let o=Promise.resolve().then(()=>this.executeRunCore(i,t)).finally(()=>{a.running=!1});return a.promise=o,this.currentRun=a,o}async runOrThrow(e){let n=await this.run(e);if(n.status!==`completed`)throw new t(n);return n}async stop(){let e=this.currentRun?.context;if(!(!e||!this.currentRun?.running)){this.requestStop(e,`user`);try{return await this.currentRun.promise}catch{return}}}reset(){if(this.currentRun?.running)throw new e(`Cannot reset agent state while a run is active. Call stop() and wait() first.`);this.currentRun=void 0,this._sessionId=void 0,this._metrics=x()}wait(){if(!this.currentRun)throw new e(`There is no run to wait for.`);return this.currentRun.promise}async dispose(){if(this.currentRun?.running){this.requestStop(this.currentRun.context,`user`);try{await this.currentRun.promise}catch{}}await this.onDispose()}async[Symbol.asyncDispose](){await this.dispose()}applyBatch(e,t){g(e,t,{onSessionId:e=>{this.setSessionId(e)}});for(let n of t.events)this.emit(e,n)}setupRunLifecycle(e){let t=!1,n=()=>{t||this.requestStop(e,`abort`)},r=e.normalizedRequest.timeoutMs===void 0?void 0:setTimeout(()=>{t||this.requestStop(e,`timeout`)},e.normalizedRequest.timeoutMs);r?.unref?.(),e.normalizedRequest.signal?.addEventListener(`abort`,n,{once:!0});let i=e.normalizedRequest.signal?.aborted===!0;return i&&this.requestStop(e,`abort`),{abortedBeforeStart:i,cleanup:()=>{t=!0,r&&clearTimeout(r),e.normalizedRequest.signal?.removeEventListener(`abort`,n)}}}emitSessionStart(e){e.sessionStarted||(e.sessionStarted=!0,this.emit(e,l(e.runId,`session-start`,{requestedSessionId:e.requestedSessionId,sessionId:e.sessionId,resumed:e.requestedSessionId!==void 0})))}emit(e,t){h(e,t),this.updateMetrics(t);for(let e of this.eventHandlers)try{e(t)}catch(e){this.onHandlerError(e)}}requestStop(e,t){e.stopReason||(e.stopReason=t,this.onStopRequested(e))}buildResult(e,t){p(e,t);let n=v(e),r=y(e,n);return e.sessionStarted&&this.emit(e,l(e.runId,`session-end`,{sessionId:e.sessionId,status:n,error:r?.message})),b(this.type,e,t,n,r)}setSessionId(e){this._sessionId=e}updateMetrics(e){switch(this._metrics.lastActivityAt=e.timestamp,e.type){case`message`:e.role===`assistant`&&this._metrics.messagesReceived++;break;case`tool-call`:this._metrics.toolCalls++;break;case`session-end`:e.status===`failed`&&this._metrics.errors++;break;default:break}}};const C=new Set([`ENOENT`,`ERR_MODULE_NOT_FOUND`]),w=e=>`code`in e,T=(e,t)=>{let n=t??(e instanceof Error?e.message:String(e));if(e instanceof Error){if(e.name===`AbortError`)return{kind:`abort`,message:n};if(w(e)&&C.has(String(e.code)))return{kind:`spawn`,message:n};if(e instanceof SyntaxError)return{kind:`parse`,message:n}}return{kind:`provider`,message:n}};export{l as a,a as c,_ as i,S as n,c as o,g as r,s,T as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as ContainerBase, B as ExecResult, C as E2BProviderConfig, D as DockerContainerBase, E as DockerContainer, F as ContainerLifecycle, G as WorkdirDiffStats, H as VolumeMount, I as ContainerObservability, J as WorkdirSnapshotOptions, K as WorkdirFileChange, L as ContainerStatus, M as ContainerExecution, N as ContainerFileSystem, O as DockerContainerConfig, P as ContainerIdentity, R as ContainerType, S as E2BCreateConfig, T as DockerBuildConfig, U as WorkdirChangeKind, V as PortMapping, W as WorkdirDiff, _ as E2BConnectConfig, a as ContainerDiffError, b as E2BContainerBase, c as ContainerExecError, d as PodmanBuildBase, f as PodmanBuildConfig, g as PodmanProviderConfig, h as PodmanContainerConfig, i as ContainerCreateError, j as ContainerConfigBase, k as DockerProviderConfig, l as ContainerNotRunningError, m as PodmanContainerBase, n as ContainerConfig, o as ContainerDisposedError, p as PodmanContainer, q as WorkdirSnapshot, r as createContainer, s as ContainerError, t as Container, u as ContainerStartError, v as E2BConnectionConfig, w as DockerBuildBase, x as E2BContainerConfig, y as E2BContainer, z as ExecOptions } from "../index-
|
|
1
|
+
import { A as ContainerBase, B as ExecResult, C as E2BProviderConfig, D as DockerContainerBase, E as DockerContainer, F as ContainerLifecycle, G as WorkdirDiffStats, H as VolumeMount, I as ContainerObservability, J as WorkdirSnapshotOptions, K as WorkdirFileChange, L as ContainerStatus, M as ContainerExecution, N as ContainerFileSystem, O as DockerContainerConfig, P as ContainerIdentity, R as ContainerType, S as E2BCreateConfig, T as DockerBuildConfig, U as WorkdirChangeKind, V as PortMapping, W as WorkdirDiff, _ as E2BConnectConfig, a as ContainerDiffError, b as E2BContainerBase, c as ContainerExecError, d as PodmanBuildBase, f as PodmanBuildConfig, g as PodmanProviderConfig, h as PodmanContainerConfig, i as ContainerCreateError, j as ContainerConfigBase, k as DockerProviderConfig, l as ContainerNotRunningError, m as PodmanContainerBase, n as ContainerConfig, o as ContainerDisposedError, p as PodmanContainer, q as WorkdirSnapshot, r as createContainer, s as ContainerError, t as Container, u as ContainerStartError, v as E2BConnectionConfig, w as DockerBuildBase, x as E2BContainerConfig, y as E2BContainer, z as ExecOptions } from "../index-R77YR8ak.mjs";
|
|
2
2
|
export { Container, ContainerBase, ContainerConfig, ContainerConfigBase, ContainerCreateError, ContainerDiffError, ContainerDisposedError, ContainerError, ContainerExecError, ContainerExecution, ContainerFileSystem, ContainerIdentity, ContainerLifecycle, ContainerNotRunningError, ContainerObservability, ContainerStartError, ContainerStatus, ContainerType, DockerBuildBase, DockerBuildConfig, DockerContainer, DockerContainerBase, DockerContainerConfig, DockerProviderConfig, E2BConnectConfig, E2BConnectionConfig, E2BContainer, E2BContainerBase, E2BContainerConfig, E2BCreateConfig, E2BProviderConfig, ExecOptions, ExecResult, PodmanBuildBase, PodmanBuildConfig, PodmanContainer, PodmanContainerBase, PodmanContainerConfig, PodmanProviderConfig, PortMapping, VolumeMount, WorkdirChangeKind, WorkdirDiff, WorkdirDiffStats, WorkdirFileChange, WorkdirSnapshot, WorkdirSnapshotOptions, createContainer };
|
package/dist/container/index.mjs
CHANGED
|
@@ -1,24 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
//#region src/container/index.ts
|
|
3
|
-
async function createContainer(config) {
|
|
4
|
-
switch (config.type) {
|
|
5
|
-
case "docker": {
|
|
6
|
-
const { createDockerContainer } = await import("../container-2UmPZ0CI.mjs");
|
|
7
|
-
return createDockerContainer(config);
|
|
8
|
-
}
|
|
9
|
-
case "e2b": try {
|
|
10
|
-
const { createE2BContainer } = await import("../container-CHxKIonn.mjs");
|
|
11
|
-
return await createE2BContainer(config);
|
|
12
|
-
} catch (error) {
|
|
13
|
-
if (error instanceof Error && error.message.includes("e2b") && (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND")) throw new ContainerCreateError("Container type \"e2b\" requires the optional peer dependency \"e2b\". Install it to use this provider.");
|
|
14
|
-
throw error;
|
|
15
|
-
}
|
|
16
|
-
case "podman": {
|
|
17
|
-
const { createPodmanContainer } = await import("../container-D2Z0ITDJ.mjs");
|
|
18
|
-
return createPodmanContainer(config);
|
|
19
|
-
}
|
|
20
|
-
default: throw new ContainerCreateError("Unsupported container type.");
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//#endregion
|
|
24
|
-
export { ContainerCreateError, ContainerDiffError, ContainerDisposedError, ContainerError, ContainerExecError, ContainerNotRunningError, ContainerStartError, createContainer };
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"../errors-XV0frS3r.mjs";async function s(e){switch(e.type){case`docker`:{let{createDockerContainer:t}=await import(`../container-DWTITDhL.mjs`);return t(e)}case`e2b`:try{let{createE2BContainer:t}=await import(`../container-BY7JDOGo.mjs`);return await t(e)}catch(e){throw e instanceof Error&&e.message.includes(`e2b`)&&(e.code===`ERR_MODULE_NOT_FOUND`||e.code===`MODULE_NOT_FOUND`)?new o(`Container type "e2b" requires the optional peer dependency "e2b". Install it to use this provider.`):e}case`podman`:{let{createPodmanContainer:t}=await import(`../container-vkn5-3Xl.mjs`);return t(e)}default:throw new o(`Unsupported container type.`)}}export{o as ContainerCreateError,n as ContainerDiffError,i as ContainerDisposedError,t as ContainerError,e as ContainerExecError,r as ContainerNotRunningError,a as ContainerStartError,s as createContainer};
|