chivgent 0.6.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +359 -0
  3. package/README.zh-CN.md +345 -0
  4. package/dist/agent.d.ts +58 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +281 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/cli-options.d.ts +33 -0
  9. package/dist/cli-options.d.ts.map +1 -0
  10. package/dist/cli-options.js +151 -0
  11. package/dist/cli-options.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +233 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/events.d.ts +79 -0
  17. package/dist/events.d.ts.map +1 -0
  18. package/dist/events.js +12 -0
  19. package/dist/events.js.map +1 -0
  20. package/dist/llm.d.ts +38 -0
  21. package/dist/llm.d.ts.map +1 -0
  22. package/dist/llm.js +17 -0
  23. package/dist/llm.js.map +1 -0
  24. package/dist/messages.d.ts +23 -0
  25. package/dist/messages.d.ts.map +1 -0
  26. package/dist/messages.js +2 -0
  27. package/dist/messages.js.map +1 -0
  28. package/dist/providers/deepseek.d.ts +12 -0
  29. package/dist/providers/deepseek.d.ts.map +1 -0
  30. package/dist/providers/deepseek.js +15 -0
  31. package/dist/providers/deepseek.js.map +1 -0
  32. package/dist/providers/openai-compatible-chat.d.ts +25 -0
  33. package/dist/providers/openai-compatible-chat.d.ts.map +1 -0
  34. package/dist/providers/openai-compatible-chat.js +293 -0
  35. package/dist/providers/openai-compatible-chat.js.map +1 -0
  36. package/dist/providers/openai.d.ts +16 -0
  37. package/dist/providers/openai.d.ts.map +1 -0
  38. package/dist/providers/openai.js +183 -0
  39. package/dist/providers/openai.js.map +1 -0
  40. package/dist/render.d.ts +26 -0
  41. package/dist/render.d.ts.map +1 -0
  42. package/dist/render.js +95 -0
  43. package/dist/render.js.map +1 -0
  44. package/dist/repl.d.ts +29 -0
  45. package/dist/repl.d.ts.map +1 -0
  46. package/dist/repl.js +119 -0
  47. package/dist/repl.js.map +1 -0
  48. package/dist/retry.d.ts +42 -0
  49. package/dist/retry.d.ts.map +1 -0
  50. package/dist/retry.js +186 -0
  51. package/dist/retry.js.map +1 -0
  52. package/dist/session-store.d.ts +66 -0
  53. package/dist/session-store.d.ts.map +1 -0
  54. package/dist/session-store.js +183 -0
  55. package/dist/session-store.js.map +1 -0
  56. package/dist/session.d.ts +49 -0
  57. package/dist/session.d.ts.map +1 -0
  58. package/dist/session.js +115 -0
  59. package/dist/session.js.map +1 -0
  60. package/dist/tools/list-files.d.ts +24 -0
  61. package/dist/tools/list-files.d.ts.map +1 -0
  62. package/dist/tools/list-files.js +80 -0
  63. package/dist/tools/list-files.js.map +1 -0
  64. package/dist/tools/output.d.ts +10 -0
  65. package/dist/tools/output.d.ts.map +1 -0
  66. package/dist/tools/output.js +44 -0
  67. package/dist/tools/output.js.map +1 -0
  68. package/dist/tools/read-file.d.ts +29 -0
  69. package/dist/tools/read-file.d.ts.map +1 -0
  70. package/dist/tools/read-file.js +150 -0
  71. package/dist/tools/read-file.js.map +1 -0
  72. package/dist/tools/search-text.d.ts +28 -0
  73. package/dist/tools/search-text.d.ts.map +1 -0
  74. package/dist/tools/search-text.js +94 -0
  75. package/dist/tools/search-text.js.map +1 -0
  76. package/dist/tools/tool.d.ts +22 -0
  77. package/dist/tools/tool.d.ts.map +1 -0
  78. package/dist/tools/tool.js +2 -0
  79. package/dist/tools/tool.js.map +1 -0
  80. package/dist/workspace.d.ts +72 -0
  81. package/dist/workspace.d.ts.map +1 -0
  82. package/dist/workspace.js +504 -0
  83. package/dist/workspace.js.map +1 -0
  84. package/package.json +55 -0
@@ -0,0 +1,23 @@
1
+ export type Message = UserMessage | AssistantMessage | ToolResultMessage;
2
+ export interface UserMessage {
3
+ readonly role: "user";
4
+ readonly content: string;
5
+ }
6
+ export interface AssistantMessage {
7
+ readonly role: "assistant";
8
+ readonly content: string;
9
+ readonly toolCalls: readonly ToolCall[];
10
+ }
11
+ export interface ToolCall {
12
+ readonly id: string;
13
+ readonly name: string;
14
+ readonly arguments: unknown;
15
+ }
16
+ export interface ToolResultMessage {
17
+ readonly role: "tool";
18
+ readonly toolCallId: string;
19
+ readonly toolName: string;
20
+ readonly content: string;
21
+ readonly isError: boolean;
22
+ }
23
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type OpenAI from "openai";
2
+ import { OpenAICompatibleChatClient } from "./openai-compatible-chat.js";
3
+ export interface DeepSeekChatClientOptions {
4
+ readonly apiKey: string;
5
+ readonly model: string;
6
+ readonly baseURL?: string;
7
+ readonly client?: OpenAI;
8
+ }
9
+ export declare class DeepSeekChatClient extends OpenAICompatibleChatClient {
10
+ constructor(options: DeepSeekChatClientOptions);
11
+ }
12
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EACL,0BAA0B,EAE3B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAmB,SAAQ,0BAA0B;IAChE,YAAY,OAAO,EAAE,yBAAyB,EAS7C;CACF"}
@@ -0,0 +1,15 @@
1
+ import { OpenAICompatibleChatClient, } from "./openai-compatible-chat.js";
2
+ const DEFAULT_BASE_URL = "https://api.deepseek.com";
3
+ export class DeepSeekChatClient extends OpenAICompatibleChatClient {
4
+ constructor(options) {
5
+ const compatibleOptions = {
6
+ apiKey: options.apiKey,
7
+ model: options.model,
8
+ baseURL: options.baseURL ?? DEFAULT_BASE_URL,
9
+ continuationTag: "deepseek-chat",
10
+ ...(options.client === undefined ? {} : { client: options.client }),
11
+ };
12
+ super(compatibleOptions);
13
+ }
14
+ }
15
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,GAE3B,MAAM,6BAA6B,CAAC;AAErC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AASpD,MAAM,OAAO,kBAAmB,SAAQ,0BAA0B;IAChE,YAAY,OAAkC;QAC5C,MAAM,iBAAiB,GAAsC;YAC3D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,gBAAgB;YAC5C,eAAe,EAAE,eAAe;YAChC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACpE,CAAC;QACF,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import OpenAI from "openai";
2
+ import type { LLMClient, LLMRequest, LLMResponse, LLMStreamHandlers } from "../llm.js";
3
+ export interface OpenAICompatibleChatClientOptions {
4
+ readonly apiKey: string;
5
+ readonly model: string;
6
+ readonly baseURL: string;
7
+ readonly continuationTag?: string;
8
+ readonly client?: OpenAI;
9
+ }
10
+ /**
11
+ * Shared adapter for Providers that implement OpenAI-compatible Chat
12
+ * Completions. Provider-only fields stay inside the opaque continuation.
13
+ */
14
+ export declare class OpenAICompatibleChatClient implements LLMClient {
15
+ private readonly client;
16
+ private readonly continuationTag;
17
+ private readonly model;
18
+ constructor(options: OpenAICompatibleChatClientOptions);
19
+ complete(request: LLMRequest): Promise<LLMResponse>;
20
+ stream(request: LLMRequest, handlers: LLMStreamHandlers): Promise<LLMResponse>;
21
+ private createHistory;
22
+ private createParameters;
23
+ private toLLMResponse;
24
+ }
25
+ //# sourceMappingURL=openai-compatible-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible-chat.d.ts","sourceRoot":"","sources":["../../src/providers/openai-compatible-chat.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAW5B,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EAClB,MAAM,WAAW,CAAC;AA0BnB,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,SAAS;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,YAAY,OAAO,EAAE,iCAAiC,EAUrD;IAEK,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAcxD;IAEK,MAAM,CACV,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAsBtB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,aAAa;CAiBtB"}
@@ -0,0 +1,293 @@
1
+ import OpenAI from "openai";
2
+ /**
3
+ * Shared adapter for Providers that implement OpenAI-compatible Chat
4
+ * Completions. Provider-only fields stay inside the opaque continuation.
5
+ */
6
+ export class OpenAICompatibleChatClient {
7
+ client;
8
+ continuationTag;
9
+ model;
10
+ constructor(options) {
11
+ this.client =
12
+ options.client ??
13
+ new OpenAI({
14
+ apiKey: options.apiKey,
15
+ baseURL: options.baseURL,
16
+ });
17
+ this.continuationTag =
18
+ options.continuationTag ?? "openai-compatible-chat";
19
+ this.model = options.model;
20
+ }
21
+ async complete(request) {
22
+ const history = this.createHistory(request);
23
+ const parameters = {
24
+ ...this.createParameters(request, history),
25
+ stream: false,
26
+ };
27
+ const response = request.signal === undefined
28
+ ? await this.client.chat.completions.create(parameters)
29
+ : await this.client.chat.completions.create(parameters, {
30
+ signal: request.signal,
31
+ });
32
+ return this.toLLMResponse(request, history, getProviderMessage(response));
33
+ }
34
+ async stream(request, handlers) {
35
+ const history = this.createHistory(request);
36
+ const parameters = {
37
+ ...this.createParameters(request, history),
38
+ stream: true,
39
+ };
40
+ const chunks = request.signal === undefined
41
+ ? await this.client.chat.completions.create(parameters)
42
+ : await this.client.chat.completions.create(parameters, {
43
+ signal: request.signal,
44
+ });
45
+ const accumulator = new ChatCompletionAccumulator();
46
+ for await (const chunk of chunks) {
47
+ const delta = accumulator.add(chunk);
48
+ if (delta.length > 0) {
49
+ handlers.onTextDelta(delta);
50
+ }
51
+ }
52
+ return this.toLLMResponse(request, history, accumulator.toMessage());
53
+ }
54
+ createHistory(request) {
55
+ const continuation = parseContinuation(request.continuation, this.continuationTag);
56
+ return continuation === undefined
57
+ ? createInitialHistory(request.systemPrompt, request.messages)
58
+ : continueHistory(continuation, request);
59
+ }
60
+ createParameters(request, history) {
61
+ return {
62
+ model: this.model,
63
+ messages: [...history],
64
+ tools: request.tools.map(toCompatibleTool),
65
+ };
66
+ }
67
+ toLLMResponse(request, history, providerMessage) {
68
+ return {
69
+ message: toInternalMessage(providerMessage),
70
+ continuation: {
71
+ provider: this.continuationTag,
72
+ systemPrompt: request.systemPrompt,
73
+ messages: structuredClone([
74
+ ...history,
75
+ toHistoryMessage(providerMessage),
76
+ ]),
77
+ },
78
+ };
79
+ }
80
+ }
81
+ /**
82
+ * Rebuilds one assistant message from Chat Completions chunks. Tool call
83
+ * fragments arrive out of band and are keyed by their stream index, so the
84
+ * final message matches what a non-streaming call would have returned.
85
+ */
86
+ class ChatCompletionAccumulator {
87
+ content = "";
88
+ reasoningContent = "";
89
+ toolCalls = new Map();
90
+ /** Returns the text delta contributed by this chunk. */
91
+ add(chunk) {
92
+ const delta = chunk.choices[0]?.delta;
93
+ if (delta === undefined) {
94
+ return "";
95
+ }
96
+ const reasoning = delta
97
+ .reasoning_content;
98
+ if (typeof reasoning === "string") {
99
+ this.reasoningContent += reasoning;
100
+ }
101
+ for (const toolCall of delta.tool_calls ?? []) {
102
+ const partial = this.toolCalls.get(toolCall.index) ?? {
103
+ id: "",
104
+ name: "",
105
+ arguments: "",
106
+ };
107
+ this.toolCalls.set(toolCall.index, {
108
+ id: toolCall.id ?? partial.id,
109
+ name: toolCall.function?.name ?? partial.name,
110
+ arguments: partial.arguments + (toolCall.function?.arguments ?? ""),
111
+ });
112
+ }
113
+ const text = delta.content ?? "";
114
+ this.content += text;
115
+ return text;
116
+ }
117
+ toMessage() {
118
+ const toolCalls = [...this.toolCalls.entries()]
119
+ .sort(([left], [right]) => left - right)
120
+ .map(([, toolCall]) => {
121
+ if (toolCall.id.length === 0 || toolCall.name.length === 0) {
122
+ throw new TypeError("OpenAI-compatible stream produced an incomplete tool call.");
123
+ }
124
+ return {
125
+ id: toolCall.id,
126
+ type: "function",
127
+ function: { name: toolCall.name, arguments: toolCall.arguments },
128
+ };
129
+ });
130
+ return {
131
+ role: "assistant",
132
+ content: this.content,
133
+ refusal: null,
134
+ ...(this.reasoningContent.length === 0
135
+ ? {}
136
+ : { reasoning_content: this.reasoningContent }),
137
+ ...(toolCalls.length === 0 ? {} : { tool_calls: toolCalls }),
138
+ };
139
+ }
140
+ }
141
+ function parseContinuation(value, expectedTag) {
142
+ if (value === undefined) {
143
+ return undefined;
144
+ }
145
+ if (typeof value !== "object" ||
146
+ value === null ||
147
+ !("provider" in value) ||
148
+ value.provider !== expectedTag ||
149
+ !("systemPrompt" in value) ||
150
+ typeof value.systemPrompt !== "string" ||
151
+ !("messages" in value) ||
152
+ !Array.isArray(value.messages)) {
153
+ throw new TypeError("OpenAI-compatible client received an incompatible continuation.");
154
+ }
155
+ return value;
156
+ }
157
+ /**
158
+ * Replays a whole transcript as Chat Completions history. A session's second
159
+ * prompt starts a new request with earlier assistant turns and tool results
160
+ * already in it, so the initial history cannot be limited to user messages.
161
+ */
162
+ function createInitialHistory(systemPrompt, messages) {
163
+ const history = [
164
+ { role: "system", content: systemPrompt },
165
+ ];
166
+ for (const message of messages) {
167
+ switch (message.role) {
168
+ case "user":
169
+ history.push({ role: "user", content: message.content });
170
+ break;
171
+ case "assistant":
172
+ history.push(toAssistantParam(message));
173
+ break;
174
+ case "tool":
175
+ history.push({
176
+ role: "tool",
177
+ tool_call_id: message.toolCallId,
178
+ content: toolOutput(message),
179
+ });
180
+ break;
181
+ }
182
+ }
183
+ return history;
184
+ }
185
+ function toAssistantParam(message) {
186
+ const toolCalls = message.toolCalls.map((toolCall) => ({
187
+ id: toolCall.id,
188
+ type: "function",
189
+ function: {
190
+ name: toolCall.name,
191
+ arguments: typeof toolCall.arguments === "string"
192
+ ? toolCall.arguments
193
+ : JSON.stringify(toolCall.arguments ?? {}),
194
+ },
195
+ }));
196
+ return {
197
+ role: "assistant",
198
+ content: message.content,
199
+ ...(toolCalls.length === 0 ? {} : { tool_calls: toolCalls }),
200
+ };
201
+ }
202
+ function toolOutput(message) {
203
+ return message.isError ? `Tool error: ${message.content}` : message.content;
204
+ }
205
+ function continueHistory(continuation, request) {
206
+ if (continuation.systemPrompt !== request.systemPrompt) {
207
+ throw new TypeError("Cannot change the system prompt during an OpenAI-compatible turn.");
208
+ }
209
+ const lastAssistantIndex = findLastAssistantIndex(request.messages);
210
+ if (lastAssistantIndex < 0) {
211
+ throw new TypeError("Cannot continue an OpenAI-compatible turn without an assistant message.");
212
+ }
213
+ const pendingMessages = request.messages.slice(lastAssistantIndex + 1);
214
+ if (pendingMessages.length === 0 ||
215
+ pendingMessages.some((message) => message.role !== "tool")) {
216
+ throw new TypeError("OpenAI-compatible continuation requires pending tool results.");
217
+ }
218
+ const history = structuredClone(continuation.messages);
219
+ for (const message of pendingMessages) {
220
+ if (message.role !== "tool") {
221
+ throw new TypeError("OpenAI-compatible continuation only accepts tool results.");
222
+ }
223
+ history.push({
224
+ role: "tool",
225
+ tool_call_id: message.toolCallId,
226
+ content: toolOutput(message),
227
+ });
228
+ }
229
+ return history;
230
+ }
231
+ function toCompatibleTool(tool) {
232
+ return {
233
+ type: "function",
234
+ function: {
235
+ name: tool.name,
236
+ description: tool.description,
237
+ parameters: { ...tool.inputSchema },
238
+ },
239
+ };
240
+ }
241
+ function getProviderMessage(response) {
242
+ const choice = response.choices[0];
243
+ if (choice === undefined) {
244
+ throw new TypeError("OpenAI-compatible Provider returned a completion with no choices.");
245
+ }
246
+ return choice.message;
247
+ }
248
+ function toInternalMessage(message) {
249
+ const toolCalls = (message.tool_calls ?? []).map((toolCall) => {
250
+ if (toolCall.type !== "function") {
251
+ throw new TypeError(`OpenAI-compatible Provider returned an unsupported tool type: ${toolCall.type}`);
252
+ }
253
+ return {
254
+ id: toolCall.id,
255
+ name: toolCall.function.name,
256
+ arguments: parseArguments(toolCall.function.arguments),
257
+ };
258
+ });
259
+ return {
260
+ role: "assistant",
261
+ content: message.content ?? "",
262
+ toolCalls,
263
+ };
264
+ }
265
+ function toHistoryMessage(message) {
266
+ return {
267
+ role: "assistant",
268
+ content: message.content,
269
+ ...(message.reasoning_content === undefined
270
+ ? {}
271
+ : { reasoning_content: message.reasoning_content }),
272
+ ...(message.tool_calls === undefined
273
+ ? {}
274
+ : { tool_calls: structuredClone(message.tool_calls) }),
275
+ };
276
+ }
277
+ function findLastAssistantIndex(messages) {
278
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
279
+ if (messages[index]?.role === "assistant") {
280
+ return index;
281
+ }
282
+ }
283
+ return -1;
284
+ }
285
+ function parseArguments(value) {
286
+ try {
287
+ return JSON.parse(value);
288
+ }
289
+ catch {
290
+ return value;
291
+ }
292
+ }
293
+ //# sourceMappingURL=openai-compatible-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible-chat.js","sourceRoot":"","sources":["../../src/providers/openai-compatible-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import OpenAI from "openai";
2
+ import type { LLMClient, LLMRequest, LLMResponse, LLMStreamHandlers } from "../llm.js";
3
+ export interface OpenAIClientOptions {
4
+ readonly apiKey: string;
5
+ readonly model: string;
6
+ readonly client?: OpenAI;
7
+ }
8
+ export declare class OpenAIClient implements LLMClient {
9
+ private readonly client;
10
+ private readonly model;
11
+ constructor(options: OpenAIClientOptions);
12
+ complete(request: LLMRequest): Promise<LLMResponse>;
13
+ stream(request: LLMRequest, handlers: LLMStreamHandlers): Promise<LLMResponse>;
14
+ private createParameters;
15
+ }
16
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAQ5B,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAYnB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,YAAY,OAAO,EAAE,mBAAmB,EAGvC;IAEK,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAUxD;IAEK,MAAM,CACV,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,WAAW,CAAC,CA0BtB;IAED,OAAO,CAAC,gBAAgB;CAkBzB"}
@@ -0,0 +1,183 @@
1
+ import OpenAI from "openai";
2
+ export class OpenAIClient {
3
+ client;
4
+ model;
5
+ constructor(options) {
6
+ this.client = options.client ?? new OpenAI({ apiKey: options.apiKey });
7
+ this.model = options.model;
8
+ }
9
+ async complete(request) {
10
+ const parameters = { ...this.createParameters(request), stream: false };
11
+ const response = request.signal === undefined
12
+ ? await this.client.responses.create(parameters)
13
+ : await this.client.responses.create(parameters, {
14
+ signal: request.signal,
15
+ });
16
+ return toLLMResponse(response);
17
+ }
18
+ async stream(request, handlers) {
19
+ const parameters = { ...this.createParameters(request), stream: true };
20
+ const events = request.signal === undefined
21
+ ? await this.client.responses.create(parameters)
22
+ : await this.client.responses.create(parameters, {
23
+ signal: request.signal,
24
+ });
25
+ let completed;
26
+ for await (const event of events) {
27
+ if (event.type === "response.output_text.delta") {
28
+ handlers.onTextDelta(event.delta);
29
+ }
30
+ else if (event.type === "response.completed") {
31
+ completed = event.response;
32
+ }
33
+ else if (event.type === "response.failed") {
34
+ throw new TypeError(`OpenAI stream failed: ${event.response.error?.message ?? "unknown error"}`);
35
+ }
36
+ }
37
+ if (completed === undefined) {
38
+ throw new TypeError("OpenAI stream ended without a completed response.");
39
+ }
40
+ return toLLMResponse(completed);
41
+ }
42
+ createParameters(request) {
43
+ const continuation = parseContinuation(request.continuation);
44
+ return {
45
+ model: this.model,
46
+ instructions: request.systemPrompt,
47
+ input: continuation === undefined
48
+ ? toInitialInput(request.messages)
49
+ : toContinuationInput(request.messages),
50
+ tools: request.tools.map(toOpenAITool),
51
+ parallel_tool_calls: false,
52
+ ...(continuation === undefined
53
+ ? {}
54
+ : { previous_response_id: continuation.previousResponseId }),
55
+ };
56
+ }
57
+ }
58
+ function toLLMResponse(response) {
59
+ return {
60
+ message: fromOpenAIResponse(response),
61
+ continuation: {
62
+ provider: "openai-responses",
63
+ previousResponseId: response.id,
64
+ },
65
+ };
66
+ }
67
+ function parseContinuation(value) {
68
+ if (value === undefined) {
69
+ return undefined;
70
+ }
71
+ if (typeof value !== "object" ||
72
+ value === null ||
73
+ !("provider" in value) ||
74
+ value.provider !== "openai-responses" ||
75
+ !("previousResponseId" in value) ||
76
+ typeof value.previousResponseId !== "string") {
77
+ throw new TypeError("OpenAIClient received an incompatible continuation.");
78
+ }
79
+ return value;
80
+ }
81
+ /**
82
+ * Replays a whole transcript as Responses input. A session's second prompt
83
+ * starts a new request with earlier assistant turns and tool results already in
84
+ * it, so the initial input cannot be limited to user messages.
85
+ */
86
+ function toInitialInput(messages) {
87
+ const input = [];
88
+ for (const message of messages) {
89
+ switch (message.role) {
90
+ case "user":
91
+ input.push({ role: "user", content: message.content });
92
+ break;
93
+ case "assistant":
94
+ if (message.content.length > 0) {
95
+ input.push({ role: "assistant", content: message.content });
96
+ }
97
+ for (const toolCall of message.toolCalls) {
98
+ input.push({
99
+ type: "function_call",
100
+ call_id: toolCall.id,
101
+ name: toolCall.name,
102
+ arguments: stringifyArguments(toolCall.arguments),
103
+ });
104
+ }
105
+ break;
106
+ case "tool":
107
+ input.push({
108
+ type: "function_call_output",
109
+ call_id: message.toolCallId,
110
+ output: toolOutput(message),
111
+ });
112
+ break;
113
+ }
114
+ }
115
+ return input;
116
+ }
117
+ function stringifyArguments(value) {
118
+ return typeof value === "string" ? value : JSON.stringify(value ?? {});
119
+ }
120
+ function toContinuationInput(messages) {
121
+ const lastAssistantIndex = findLastAssistantIndex(messages);
122
+ if (lastAssistantIndex < 0) {
123
+ throw new TypeError("Cannot continue without an assistant message.");
124
+ }
125
+ const pendingMessages = messages.slice(lastAssistantIndex + 1);
126
+ if (pendingMessages.length === 0 ||
127
+ pendingMessages.some((message) => message.role !== "tool")) {
128
+ throw new TypeError("OpenAI continuation requires pending tool results.");
129
+ }
130
+ return pendingMessages.map((message) => {
131
+ if (message.role !== "tool") {
132
+ throw new TypeError("OpenAI continuation only accepts tool results.");
133
+ }
134
+ return {
135
+ type: "function_call_output",
136
+ call_id: message.toolCallId,
137
+ output: toolOutput(message),
138
+ };
139
+ });
140
+ }
141
+ function toolOutput(message) {
142
+ return message.isError ? `Tool error: ${message.content}` : message.content;
143
+ }
144
+ function toOpenAITool(tool) {
145
+ return {
146
+ type: "function",
147
+ name: tool.name,
148
+ description: tool.description,
149
+ parameters: { ...tool.inputSchema },
150
+ strict: true,
151
+ };
152
+ }
153
+ function fromOpenAIResponse(response) {
154
+ const toolCalls = response.output
155
+ .filter((item) => item.type === "function_call")
156
+ .map((item) => ({
157
+ id: item.call_id,
158
+ name: item.name,
159
+ arguments: parseArguments(item.arguments),
160
+ }));
161
+ return {
162
+ role: "assistant",
163
+ content: response.output_text,
164
+ toolCalls,
165
+ };
166
+ }
167
+ function findLastAssistantIndex(messages) {
168
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
169
+ if (messages[index]?.role === "assistant") {
170
+ return index;
171
+ }
172
+ }
173
+ return -1;
174
+ }
175
+ function parseArguments(value) {
176
+ try {
177
+ return JSON.parse(value);
178
+ }
179
+ catch {
180
+ return value;
181
+ }
182
+ }
183
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AgentEventListener } from "./events.js";
2
+ export interface OutputStream {
3
+ write(chunk: string): unknown;
4
+ }
5
+ export interface RendererStreams {
6
+ readonly stdout: OutputStream;
7
+ readonly stderr: OutputStream;
8
+ }
9
+ export interface RendererOptions {
10
+ /** Print assistant text as it arrives instead of at the end of a turn. */
11
+ readonly stream?: boolean;
12
+ /** Print tool activity to stderr. */
13
+ readonly showToolActivity?: boolean;
14
+ readonly color?: boolean;
15
+ }
16
+ /**
17
+ * Renders runtime events for a terminal. The answer goes to stdout so it stays
18
+ * pipeable; tool activity and run status go to stderr.
19
+ */
20
+ export declare function createEventRenderer(streams: RendererStreams, options?: RendererOptions): AgentEventListener;
21
+ /**
22
+ * Writes one JSON object per line: the session header first, then every event.
23
+ * This is the machine-readable counterpart of the terminal renderer.
24
+ */
25
+ export declare function createJsonEventWriter(output: OutputStream, header?: object): AgentEventListener;
26
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,aAAa,CAAC;AASlE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,eAAoB,GAC5B,kBAAkB,CAiEpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,CAOpB"}