neoctl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +146 -0
  2. package/dist/agents/agent-definition.d.ts +39 -0
  3. package/dist/agents/agent-definition.js +57 -0
  4. package/dist/agents/agent-definition.js.map +1 -0
  5. package/dist/agents/agent-tool.d.ts +38 -0
  6. package/dist/agents/agent-tool.js +336 -0
  7. package/dist/agents/agent-tool.js.map +1 -0
  8. package/dist/agents/local-agent-task.d.ts +52 -0
  9. package/dist/agents/local-agent-task.js +63 -0
  10. package/dist/agents/local-agent-task.js.map +1 -0
  11. package/dist/agents/smoke-agents.d.ts +1 -0
  12. package/dist/agents/smoke-agents.js +142 -0
  13. package/dist/agents/smoke-agents.js.map +1 -0
  14. package/dist/agents/team.d.ts +10 -0
  15. package/dist/agents/team.js +2 -0
  16. package/dist/agents/team.js.map +1 -0
  17. package/dist/app/app-state.d.ts +21 -0
  18. package/dist/app/app-state.js +24 -0
  19. package/dist/app/app-state.js.map +1 -0
  20. package/dist/context/compaction.d.ts +49 -0
  21. package/dist/context/compaction.js +334 -0
  22. package/dist/context/compaction.js.map +1 -0
  23. package/dist/context/context-manager.d.ts +53 -0
  24. package/dist/context/context-manager.js +98 -0
  25. package/dist/context/context-manager.js.map +1 -0
  26. package/dist/context/prompts.d.ts +22 -0
  27. package/dist/context/prompts.js +84 -0
  28. package/dist/context/prompts.js.map +1 -0
  29. package/dist/context/smoke-context.d.ts +1 -0
  30. package/dist/context/smoke-context.js +151 -0
  31. package/dist/context/smoke-context.js.map +1 -0
  32. package/dist/core/assistant-output-filter.d.ts +9 -0
  33. package/dist/core/assistant-output-filter.js +78 -0
  34. package/dist/core/assistant-output-filter.js.map +1 -0
  35. package/dist/core/context-metrics.d.ts +10 -0
  36. package/dist/core/context-metrics.js +77 -0
  37. package/dist/core/context-metrics.js.map +1 -0
  38. package/dist/core/message-pipeline.d.ts +10 -0
  39. package/dist/core/message-pipeline.js +138 -0
  40. package/dist/core/message-pipeline.js.map +1 -0
  41. package/dist/core/query-engine.d.ts +86 -0
  42. package/dist/core/query-engine.js +337 -0
  43. package/dist/core/query-engine.js.map +1 -0
  44. package/dist/core/query.d.ts +47 -0
  45. package/dist/core/query.js +408 -0
  46. package/dist/core/query.js.map +1 -0
  47. package/dist/core/run-agent.d.ts +48 -0
  48. package/dist/core/run-agent.js +150 -0
  49. package/dist/core/run-agent.js.map +1 -0
  50. package/dist/core/smoke-core-loop.d.ts +1 -0
  51. package/dist/core/smoke-core-loop.js +42 -0
  52. package/dist/core/smoke-core-loop.js.map +1 -0
  53. package/dist/core/state.d.ts +37 -0
  54. package/dist/core/state.js +31 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/model/communication-logger.d.ts +30 -0
  60. package/dist/model/communication-logger.js +218 -0
  61. package/dist/model/communication-logger.js.map +1 -0
  62. package/dist/model/config.d.ts +25 -0
  63. package/dist/model/config.js +65 -0
  64. package/dist/model/config.js.map +1 -0
  65. package/dist/model/context-window.d.ts +32 -0
  66. package/dist/model/context-window.js +76 -0
  67. package/dist/model/context-window.js.map +1 -0
  68. package/dist/model/credentials.d.ts +13 -0
  69. package/dist/model/credentials.js +19 -0
  70. package/dist/model/credentials.js.map +1 -0
  71. package/dist/model/env.d.ts +8 -0
  72. package/dist/model/env.js +36 -0
  73. package/dist/model/env.js.map +1 -0
  74. package/dist/model/errors.d.ts +42 -0
  75. package/dist/model/errors.js +74 -0
  76. package/dist/model/errors.js.map +1 -0
  77. package/dist/model/http-transport.d.ts +26 -0
  78. package/dist/model/http-transport.js +118 -0
  79. package/dist/model/http-transport.js.map +1 -0
  80. package/dist/model/model-gateway.d.ts +103 -0
  81. package/dist/model/model-gateway.js +15 -0
  82. package/dist/model/model-gateway.js.map +1 -0
  83. package/dist/model/model-metadata.json +677 -0
  84. package/dist/model/openai-adapter.d.ts +34 -0
  85. package/dist/model/openai-adapter.js +152 -0
  86. package/dist/model/openai-adapter.js.map +1 -0
  87. package/dist/model/openai-chat-mapper.d.ts +11 -0
  88. package/dist/model/openai-chat-mapper.js +114 -0
  89. package/dist/model/openai-chat-mapper.js.map +1 -0
  90. package/dist/model/openai-mappers.d.ts +21 -0
  91. package/dist/model/openai-mappers.js +261 -0
  92. package/dist/model/openai-mappers.js.map +1 -0
  93. package/dist/model/openai-responses-adapter.d.ts +2 -0
  94. package/dist/model/openai-responses-adapter.js +2 -0
  95. package/dist/model/openai-responses-adapter.js.map +1 -0
  96. package/dist/model/openai-responses-mapper.d.ts +11 -0
  97. package/dist/model/openai-responses-mapper.js +218 -0
  98. package/dist/model/openai-responses-mapper.js.map +1 -0
  99. package/dist/model/provider-adapter.d.ts +17 -0
  100. package/dist/model/provider-adapter.js +2 -0
  101. package/dist/model/provider-adapter.js.map +1 -0
  102. package/dist/model/provider-factory.d.ts +4 -0
  103. package/dist/model/provider-factory.js +29 -0
  104. package/dist/model/provider-factory.js.map +1 -0
  105. package/dist/model/retry-runner.d.ts +8 -0
  106. package/dist/model/retry-runner.js +28 -0
  107. package/dist/model/retry-runner.js.map +1 -0
  108. package/dist/model/smoke-openai.d.ts +1 -0
  109. package/dist/model/smoke-openai.js +44 -0
  110. package/dist/model/smoke-openai.js.map +1 -0
  111. package/dist/model/smoke-responses-mapper.d.ts +1 -0
  112. package/dist/model/smoke-responses-mapper.js +72 -0
  113. package/dist/model/smoke-responses-mapper.js.map +1 -0
  114. package/dist/model/sse-decoder.d.ts +5 -0
  115. package/dist/model/sse-decoder.js +79 -0
  116. package/dist/model/sse-decoder.js.map +1 -0
  117. package/dist/repl/clipboard.d.ts +14 -0
  118. package/dist/repl/clipboard.js +92 -0
  119. package/dist/repl/clipboard.js.map +1 -0
  120. package/dist/repl/commands.d.ts +38 -0
  121. package/dist/repl/commands.js +86 -0
  122. package/dist/repl/commands.js.map +1 -0
  123. package/dist/repl/index.d.ts +2 -0
  124. package/dist/repl/index.js +2836 -0
  125. package/dist/repl/index.js.map +1 -0
  126. package/dist/repl/markdown-renderer.d.ts +81 -0
  127. package/dist/repl/markdown-renderer.js +546 -0
  128. package/dist/repl/markdown-renderer.js.map +1 -0
  129. package/dist/repl/render.d.ts +2 -0
  130. package/dist/repl/render.js +45 -0
  131. package/dist/repl/render.js.map +1 -0
  132. package/dist/repl/status-line.d.ts +19 -0
  133. package/dist/repl/status-line.js +160 -0
  134. package/dist/repl/status-line.js.map +1 -0
  135. package/dist/safety/audit.d.ts +10 -0
  136. package/dist/safety/audit.js +2 -0
  137. package/dist/safety/audit.js.map +1 -0
  138. package/dist/safety/permissions.d.ts +10 -0
  139. package/dist/safety/permissions.js +2 -0
  140. package/dist/safety/permissions.js.map +1 -0
  141. package/dist/safety/sandbox.d.ts +6 -0
  142. package/dist/safety/sandbox.js +2 -0
  143. package/dist/safety/sandbox.js.map +1 -0
  144. package/dist/session/session-store.d.ts +98 -0
  145. package/dist/session/session-store.js +249 -0
  146. package/dist/session/session-store.js.map +1 -0
  147. package/dist/session/smoke-session.d.ts +1 -0
  148. package/dist/session/smoke-session.js +85 -0
  149. package/dist/session/smoke-session.js.map +1 -0
  150. package/dist/session/tool-result-memory.d.ts +64 -0
  151. package/dist/session/tool-result-memory.js +303 -0
  152. package/dist/session/tool-result-memory.js.map +1 -0
  153. package/dist/skills/skill-tool.d.ts +28 -0
  154. package/dist/skills/skill-tool.js +107 -0
  155. package/dist/skills/skill-tool.js.map +1 -0
  156. package/dist/skills/smoke-skills.d.ts +1 -0
  157. package/dist/skills/smoke-skills.js +60 -0
  158. package/dist/skills/smoke-skills.js.map +1 -0
  159. package/dist/tasks/task-store.d.ts +43 -0
  160. package/dist/tasks/task-store.js +150 -0
  161. package/dist/tasks/task-store.js.map +1 -0
  162. package/dist/tasks/task-tools.d.ts +31 -0
  163. package/dist/tasks/task-tools.js +232 -0
  164. package/dist/tasks/task-tools.js.map +1 -0
  165. package/dist/tools/builtins/echo-tool.d.ts +4 -0
  166. package/dist/tools/builtins/echo-tool.js +26 -0
  167. package/dist/tools/builtins/echo-tool.js.map +1 -0
  168. package/dist/tools/builtins/edit-tool.d.ts +30 -0
  169. package/dist/tools/builtins/edit-tool.js +423 -0
  170. package/dist/tools/builtins/edit-tool.js.map +1 -0
  171. package/dist/tools/builtins/exec-tool.d.ts +18 -0
  172. package/dist/tools/builtins/exec-tool.js +290 -0
  173. package/dist/tools/builtins/exec-tool.js.map +1 -0
  174. package/dist/tools/builtins/filesystem-tools.d.ts +16 -0
  175. package/dist/tools/builtins/filesystem-tools.js +306 -0
  176. package/dist/tools/builtins/filesystem-tools.js.map +1 -0
  177. package/dist/tools/builtins/grep-tool.d.ts +56 -0
  178. package/dist/tools/builtins/grep-tool.js +320 -0
  179. package/dist/tools/builtins/grep-tool.js.map +1 -0
  180. package/dist/tools/builtins/ripgrep-binary.d.ts +6 -0
  181. package/dist/tools/builtins/ripgrep-binary.js +51 -0
  182. package/dist/tools/builtins/ripgrep-binary.js.map +1 -0
  183. package/dist/tools/builtins/search-providers.d.ts +49 -0
  184. package/dist/tools/builtins/search-providers.js +240 -0
  185. package/dist/tools/builtins/search-providers.js.map +1 -0
  186. package/dist/tools/builtins/search-tool.d.ts +18 -0
  187. package/dist/tools/builtins/search-tool.js +171 -0
  188. package/dist/tools/builtins/search-tool.js.map +1 -0
  189. package/dist/tools/registry.d.ts +18 -0
  190. package/dist/tools/registry.js +69 -0
  191. package/dist/tools/registry.js.map +1 -0
  192. package/dist/tools/run-tool-use.d.ts +13 -0
  193. package/dist/tools/run-tool-use.js +113 -0
  194. package/dist/tools/run-tool-use.js.map +1 -0
  195. package/dist/tools/schema.d.ts +2 -0
  196. package/dist/tools/schema.js +61 -0
  197. package/dist/tools/schema.js.map +1 -0
  198. package/dist/tools/smoke-tool-system.d.ts +1 -0
  199. package/dist/tools/smoke-tool-system.js +204 -0
  200. package/dist/tools/smoke-tool-system.js.map +1 -0
  201. package/dist/tools/streaming-tool-executor.d.ts +19 -0
  202. package/dist/tools/streaming-tool-executor.js +89 -0
  203. package/dist/tools/streaming-tool-executor.js.map +1 -0
  204. package/dist/tools/tool-orchestration.d.ts +15 -0
  205. package/dist/tools/tool-orchestration.js +89 -0
  206. package/dist/tools/tool-orchestration.js.map +1 -0
  207. package/dist/tools/tool.d.ts +121 -0
  208. package/dist/tools/tool.js +4 -0
  209. package/dist/tools/tool.js.map +1 -0
  210. package/dist/types/events.d.ts +66 -0
  211. package/dist/types/events.js +2 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/messages.d.ts +57 -0
  214. package/dist/types/messages.js +42 -0
  215. package/dist/types/messages.js.map +1 -0
  216. package/package.json +49 -0
  217. package/scripts/copy-model-metadata.mjs +4 -0
  218. package/scripts/install-ripgrep.cjs +152 -0
@@ -0,0 +1,218 @@
1
+ import { createTextMessage, createThinkingMessage } from "../types/messages.js";
2
+ import { decodeSSE } from "./sse-decoder.js";
3
+ import { asNumber, asString, buildResponsesInput, buildResponsesTools, dropUndefined, ensureToolBuffer, extractResponsesMessageText, normalizeOpenAIStreamError, normalizeUsage, toToolUse, } from "./openai-mappers.js";
4
+ export function buildResponsesRequest(request, options) {
5
+ const tools = buildResponsesTools(request.tools);
6
+ return dropUndefined({
7
+ model: request.model ?? options.model,
8
+ instructions: request.instructions ?? request.systemPrompt,
9
+ input: buildResponsesInput(request.messages),
10
+ tools: tools.length ? tools : undefined,
11
+ tool_choice: request.toolChoice ?? (tools.length ? "auto" : undefined),
12
+ previous_response_id: request.previousResponseId,
13
+ max_output_tokens: request.maxOutputTokens ?? options.defaultMaxOutputTokens,
14
+ reasoning: request.reasoning === null ? undefined : (request.reasoning ?? options.defaultReasoning),
15
+ text: request.textFormat ? { format: request.textFormat } : undefined,
16
+ metadata: request.metadata,
17
+ store: shouldStoreResponse(request, tools.length),
18
+ ...(request.providerOptions?.responses ?? {}),
19
+ });
20
+ }
21
+ export async function* normalizeResponsesStream(stream, options) {
22
+ const textParts = [];
23
+ const thinkingParts = [];
24
+ const toolBuffers = new Map();
25
+ let responseId;
26
+ for await (const sse of decodeSSE(stream, options.streamIdleTimeoutMs ?? 120000)) {
27
+ const event = sse.data;
28
+ const type = asString(event.type ?? sse.event);
29
+ yield { type: "provider_event", event };
30
+ if (type === "response.created") {
31
+ const response = event.response;
32
+ responseId = asString(response?.id);
33
+ if (responseId)
34
+ yield { type: "response_started", responseId };
35
+ }
36
+ if (type === "response.output_text.delta") {
37
+ const delta = asString(event.delta) ?? "";
38
+ if (delta) {
39
+ textParts.push(delta);
40
+ yield { type: "assistant_delta", text: delta };
41
+ }
42
+ }
43
+ if (isReasoningDeltaEvent(type)) {
44
+ const delta = extractThinkingDelta(event);
45
+ if (delta) {
46
+ thinkingParts.push(delta);
47
+ yield { type: "thinking_delta", text: delta };
48
+ }
49
+ }
50
+ if (type === "response.output_item.added") {
51
+ const item = event.item;
52
+ if (item?.type === "function_call") {
53
+ const outputIndex = asNumber(event.output_index) ?? toolBuffers.size;
54
+ toolBuffers.set(outputIndex, {
55
+ callId: asString(item.call_id) ?? asString(item.id) ?? `call_${outputIndex}`,
56
+ name: asString(item.name) ?? "unknown_tool",
57
+ argumentsBuffer: asString(item.arguments) ?? "",
58
+ });
59
+ }
60
+ }
61
+ if (type === "response.function_call_arguments.delta") {
62
+ const outputIndex = asNumber(event.output_index) ?? 0;
63
+ const delta = asString(event.delta) ?? "";
64
+ const buffer = ensureToolBuffer(toolBuffers, outputIndex);
65
+ buffer.argumentsBuffer += delta;
66
+ yield { type: "tool_call_delta", callId: buffer.callId, name: buffer.name, argumentsDelta: delta };
67
+ }
68
+ if (type === "response.function_call_arguments.done") {
69
+ const outputIndex = asNumber(event.output_index) ?? 0;
70
+ const buffer = ensureToolBuffer(toolBuffers, outputIndex);
71
+ buffer.argumentsBuffer = asString(event.arguments) ?? buffer.argumentsBuffer;
72
+ }
73
+ if (type === "response.output_item.done") {
74
+ const item = event.item;
75
+ if (item?.type === "function_call") {
76
+ const outputIndex = asNumber(event.output_index) ?? 0;
77
+ const buffer = toolBuffers.get(outputIndex) ?? {
78
+ callId: asString(item.call_id) ?? asString(item.id) ?? `call_${outputIndex}`,
79
+ name: asString(item.name) ?? "unknown_tool",
80
+ argumentsBuffer: asString(item.arguments) ?? "{}",
81
+ };
82
+ yield { type: "tool_use", toolUse: toToolUse(buffer) };
83
+ }
84
+ }
85
+ if (type === "response.completed") {
86
+ const response = event.response;
87
+ responseId = asString(response?.id) ?? responseId;
88
+ const text = textParts.join("");
89
+ if (text)
90
+ yield { type: "assistant_message", message: createTextMessage("assistant", text) };
91
+ const thinking = collectThinkingFromResponse(response, thinkingParts);
92
+ if (thinking)
93
+ yield { type: "assistant_message", message: createThinkingMessage(thinking) };
94
+ const usage = normalizeUsage(response?.usage);
95
+ if (usage)
96
+ yield { type: "usage", usage };
97
+ yield { type: "response_completed", responseId, stopReason: asString(response?.status) ?? "completed", usage };
98
+ }
99
+ if (type === "response.incomplete") {
100
+ const response = event.response;
101
+ const usage = normalizeUsage(response?.usage);
102
+ yield {
103
+ type: "response_incomplete",
104
+ responseId: asString(response?.id) ?? responseId,
105
+ reason: asString(response?.incomplete_details?.reason),
106
+ usage,
107
+ };
108
+ }
109
+ if (type === "error") {
110
+ throw normalizeOpenAIStreamError(event);
111
+ }
112
+ }
113
+ }
114
+ export function* normalizeResponsesObject(response) {
115
+ const body = response.body;
116
+ const responseId = asString(body.id);
117
+ if (responseId)
118
+ yield { type: "response_started", responseId };
119
+ const output = Array.isArray(body.output) ? body.output : [];
120
+ const textParts = [];
121
+ const thinkingParts = [];
122
+ for (const item of output) {
123
+ if (item.type === "message")
124
+ textParts.push(extractResponsesMessageText(item));
125
+ if (item.type === "reasoning")
126
+ thinkingParts.push(extractReasoningText(item));
127
+ if (item.type === "function_call") {
128
+ yield {
129
+ type: "tool_use",
130
+ toolUse: toToolUse({
131
+ callId: asString(item.call_id) ?? asString(item.id) ?? "call_unknown",
132
+ name: asString(item.name) ?? "unknown_tool",
133
+ argumentsBuffer: asString(item.arguments) ?? "{}",
134
+ }),
135
+ };
136
+ }
137
+ }
138
+ const text = textParts.join("");
139
+ if (text)
140
+ yield { type: "assistant_message", message: createTextMessage("assistant", text) };
141
+ const thinking = collectThinkingFromResponse(body, thinkingParts);
142
+ if (thinking)
143
+ yield { type: "assistant_message", message: createThinkingMessage(thinking) };
144
+ const usage = normalizeUsage(body.usage);
145
+ if (usage)
146
+ yield { type: "usage", usage };
147
+ if (body.status === "incomplete") {
148
+ yield { type: "response_incomplete", responseId, reason: asString(body.incomplete_details?.reason), usage };
149
+ }
150
+ else {
151
+ yield { type: "response_completed", responseId, stopReason: asString(body.status), usage };
152
+ }
153
+ }
154
+ function shouldStoreResponse(request, toolCount) {
155
+ return Boolean(request.previousResponseId || toolCount > 0);
156
+ }
157
+ function isReasoningDeltaEvent(type) {
158
+ return type === "response.reasoning_summary.delta" ||
159
+ type === "response.reasoning_summary_text.delta" ||
160
+ type === "response.reasoning.delta" ||
161
+ type === "response.output_item.delta";
162
+ }
163
+ function extractThinkingDelta(event) {
164
+ const delta = event.delta;
165
+ if (typeof delta === "string")
166
+ return delta;
167
+ if (delta && typeof delta === "object")
168
+ return extractReasoningText(delta);
169
+ return asString(event.text) ?? asString(event.summary_text) ?? "";
170
+ }
171
+ function collectThinkingFromResponse(response, streamedParts) {
172
+ const streamed = streamedParts.join("");
173
+ const output = Array.isArray(response?.output) ? response.output : [];
174
+ const fromOutput = output
175
+ .map((item) => {
176
+ const record = item;
177
+ return record.type === "reasoning" ? extractReasoningText(record) : "";
178
+ })
179
+ .join("");
180
+ return dedupeThinkingText(streamed, fromOutput).trim();
181
+ }
182
+ function extractReasoningText(item) {
183
+ const direct = asString(item.text) ?? asString(item.summary_text) ?? asString(item.content);
184
+ if (direct)
185
+ return direct;
186
+ const summary = Array.isArray(item.summary) ? item.summary : [];
187
+ const summaryText = summary.map((part) => {
188
+ if (typeof part === "string")
189
+ return part;
190
+ if (!part || typeof part !== "object")
191
+ return "";
192
+ const record = part;
193
+ return asString(record.text) ?? asString(record.summary_text) ?? "";
194
+ }).join("");
195
+ if (summaryText)
196
+ return summaryText;
197
+ const content = Array.isArray(item.content) ? item.content : [];
198
+ return content.map((part) => {
199
+ if (typeof part === "string")
200
+ return part;
201
+ if (!part || typeof part !== "object")
202
+ return "";
203
+ const record = part;
204
+ return asString(record.text) ?? asString(record.summary_text) ?? "";
205
+ }).join("");
206
+ }
207
+ function dedupeThinkingText(streamed, completed) {
208
+ if (!streamed)
209
+ return completed;
210
+ if (!completed || completed === streamed)
211
+ return streamed;
212
+ if (completed.startsWith(streamed))
213
+ return completed;
214
+ if (streamed.startsWith(completed))
215
+ return streamed;
216
+ return `${streamed}\n${completed}`;
217
+ }
218
+ //# sourceMappingURL=openai-responses-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-mapper.js","sourceRoot":"","sources":["../../src/model/openai-responses-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ModelGateway, ModelRequest, ModelStreamEvent } from "./model-gateway.js";
2
+ export interface ProviderCapabilities {
3
+ streaming: boolean;
4
+ functionTools: boolean;
5
+ parallelToolCalls: boolean;
6
+ structuredOutput: boolean;
7
+ previousResponseId: boolean;
8
+ imageInput: boolean;
9
+ fileInput: boolean;
10
+ reasoningConfig: boolean;
11
+ builtInTools: boolean;
12
+ }
13
+ export interface ProviderAdapter extends ModelGateway {
14
+ readonly name: string;
15
+ readonly capabilities: ProviderCapabilities;
16
+ stream(request: ModelRequest): AsyncIterable<ModelStreamEvent>;
17
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-adapter.js","sourceRoot":"","sources":["../../src/model/provider-adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { ModelGateway } from "./model-gateway.js";
2
+ import type { ModelProviderConfig } from "./config.js";
3
+ export declare function createModelGatewayFromConfig(config: ModelProviderConfig | undefined): ModelGateway;
4
+ export declare function createModelGatewayFromProcessEnv(env?: NodeJS.ProcessEnv): ModelGateway;
@@ -0,0 +1,29 @@
1
+ import { NotConfiguredModelGateway } from "./model-gateway.js";
2
+ import { OpenAIAdapter } from "./openai-adapter.js";
3
+ import { readModelProviderConfig } from "./config.js";
4
+ export function createModelGatewayFromConfig(config) {
5
+ if (!config)
6
+ return new NotConfiguredModelGateway();
7
+ switch (config.provider) {
8
+ case "openai":
9
+ return createOpenAIGateway(config);
10
+ }
11
+ }
12
+ export function createModelGatewayFromProcessEnv(env = process.env) {
13
+ return createModelGatewayFromConfig(readModelProviderConfig(env));
14
+ }
15
+ function createOpenAIGateway(config) {
16
+ return new OpenAIAdapter({
17
+ apiKey: config.apiKey,
18
+ baseUrl: config.baseUrl,
19
+ model: config.model,
20
+ fallbackModel: config.fallbackModel,
21
+ endpoint: config.openai?.endpoint,
22
+ timeoutMs: config.timeoutMs,
23
+ streamIdleTimeoutMs: config.streamIdleTimeoutMs,
24
+ maxRetries: config.maxRetries,
25
+ defaultMaxOutputTokens: config.defaultMaxOutputTokens,
26
+ defaultReasoning: config.defaultReasoning,
27
+ });
28
+ }
29
+ //# sourceMappingURL=provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../src/model/provider-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,4BAA4B,CAAC,MAAuC;IAClF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,yBAAyB,EAAE,CAAC;IAEpD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnF,OAAO,4BAA4B,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAA4B;IACvD,OAAO,IAAI,aAAa,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ModelStreamEvent } from "./model-gateway.js";
2
+ export interface RetryOptions {
3
+ provider: string;
4
+ maxRetries: number;
5
+ delayMs?: number;
6
+ maxDelayMs?: number;
7
+ }
8
+ export declare function streamWithRetry(operation: (attempt: number) => AsyncIterable<ModelStreamEvent>, options: RetryOptions): AsyncGenerator<ModelStreamEvent>;
@@ -0,0 +1,28 @@
1
+ import { normalizeUnknownError } from "./errors.js";
2
+ export async function* streamWithRetry(operation, options) {
3
+ for (let attempt = 1;; attempt += 1) {
4
+ try {
5
+ yield* operation(attempt);
6
+ return;
7
+ }
8
+ catch (error) {
9
+ const normalized = normalizeUnknownError(error, options.provider);
10
+ if (!shouldRetry(normalized, attempt, options.maxRetries))
11
+ throw normalized;
12
+ const delayMs = computeDelayMs(normalized, options);
13
+ yield { type: "retrying", error: normalized, attempt, delayMs };
14
+ await sleep(delayMs);
15
+ }
16
+ }
17
+ }
18
+ function shouldRetry(error, attempt, maxRetries) {
19
+ return error.retryable && attempt <= maxRetries;
20
+ }
21
+ function computeDelayMs(error, options) {
22
+ const delayMs = options.delayMs ?? error.retryAfterMs ?? 3000;
23
+ return Math.min(delayMs, options.maxDelayMs ?? 32000);
24
+ }
25
+ function sleep(ms) {
26
+ return new Promise((resolve) => setTimeout(resolve, ms));
27
+ }
28
+ //# sourceMappingURL=retry-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-runner.js","sourceRoot":"","sources":["../../src/model/retry-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUnE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,SAA+D,EAC/D,OAAqB;IAErB,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;gBAAE,MAAM,UAAU,CAAC;YAC5E,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAChE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB,EAAE,OAAe,EAAE,UAAkB;IAC5E,OAAO,KAAK,CAAC,SAAS,IAAI,OAAO,IAAI,UAAU,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB,EAAE,OAAqB;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { createTextMessage } from "../types/messages.js";
2
+ import { readModelProviderConfig } from "./config.js";
3
+ import { loadDotEnvIfPresent } from "./env.js";
4
+ import { createModelGatewayFromConfig } from "./provider-factory.js";
5
+ async function main() {
6
+ loadDotEnvIfPresent(undefined, { override: true });
7
+ const config = readModelProviderConfig(process.env);
8
+ if (!config)
9
+ throw new Error("MODEL_API_KEY or OPENAI_API_KEY is required");
10
+ const gateway = createModelGatewayFromConfig({
11
+ ...config,
12
+ defaultMaxOutputTokens: 64,
13
+ timeoutMs: 120000,
14
+ streamIdleTimeoutMs: 120000,
15
+ maxRetries: 1,
16
+ });
17
+ let text = "";
18
+ let completed = false;
19
+ for await (const event of gateway.stream({
20
+ model: config.model,
21
+ instructions: "Answer with exactly one short word when possible.",
22
+ messages: [createTextMessage("user", process.argv.slice(2).join(" ") || "Say pong")],
23
+ tools: [],
24
+ stream: true,
25
+ maxOutputTokens: 64,
26
+ })) {
27
+ if (event.type === "assistant_delta")
28
+ text += event.text;
29
+ if (event.type === "assistant_message" && !text) {
30
+ text += event.message.blocks
31
+ .filter((block) => block.type === "text")
32
+ .map((block) => block.text)
33
+ .join("\n");
34
+ }
35
+ if (event.type === "response_completed")
36
+ completed = true;
37
+ }
38
+ console.log(JSON.stringify({ ok: completed && text.trim().length > 0, completed, text: text.trim() }, null, 2));
39
+ }
40
+ main().catch((error) => {
41
+ console.error(error instanceof Error ? error.stack ?? error.message : String(error));
42
+ process.exitCode = 1;
43
+ });
44
+ //# sourceMappingURL=smoke-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-openai.js","sourceRoot":"","sources":["../../src/model/smoke-openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,KAAK,UAAU,IAAI;IACjB,mBAAmB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,4BAA4B,CAAC;QAC3C,GAAG,MAAM;QACT,sBAAsB,EAAE,EAAE;QAC1B,SAAS,EAAE,MAAM;QACjB,mBAAmB,EAAE,MAAM;QAC3B,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,mDAAmD;QACjE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC;QACpF,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,IAAI;QACZ,eAAe,EAAE,EAAE;KACpB,CAAC,EAAE,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QACzD,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM;iBACzB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;iBACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB;YAAE,SAAS,GAAG,IAAI,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,72 @@
1
+ import { createTextMessage, createToolResultMessage } from "../types/messages.js";
2
+ import { buildChatRequest } from "./openai-chat-mapper.js";
3
+ import { buildResponsesRequest } from "./openai-responses-mapper.js";
4
+ const tool = {
5
+ name: "echo",
6
+ description: "Echo text.",
7
+ inputSchema: {
8
+ type: "object",
9
+ properties: { text: { type: "string" } },
10
+ required: ["text"],
11
+ additionalProperties: false,
12
+ },
13
+ };
14
+ const assistantToolUse = {
15
+ id: "assistant_tool_use",
16
+ role: "assistant",
17
+ createdAt: new Date().toISOString(),
18
+ blocks: [{ type: "tool_use", id: "call_1", name: "echo", input: { text: "ok" } }],
19
+ };
20
+ const toolResult = createToolResultMessage({ id: "call_1", name: "echo", input: { text: "ok" } }, true, "ok");
21
+ const danglingToolUse = {
22
+ id: "dangling_tool_use",
23
+ role: "assistant",
24
+ createdAt: new Date().toISOString(),
25
+ blocks: [{ type: "tool_use", id: "call_missing_result", name: "echo", input: { text: "missing" } }],
26
+ };
27
+ const danglingToolResult = createToolResultMessage({ id: "call_missing_use", name: "echo", input: { text: "missing" } }, true, "missing");
28
+ const plain = buildResponsesRequest({ messages: [createTextMessage("user", "hello")], tools: [], stream: true }, { model: "gpt-test" });
29
+ const withTools = buildResponsesRequest({ messages: [createTextMessage("user", "hello")], tools: [tool], stream: true }, { model: "gpt-test" });
30
+ const continuation = buildResponsesRequest({
31
+ messages: [assistantToolUse, toolResult],
32
+ tools: [tool],
33
+ stream: true,
34
+ }, { model: "gpt-test" });
35
+ const dangling = buildResponsesRequest({
36
+ messages: [danglingToolUse, danglingToolResult],
37
+ tools: [tool],
38
+ stream: true,
39
+ }, { model: "gpt-test" });
40
+ const override = buildResponsesRequest({
41
+ messages: [createTextMessage("user", "hello")],
42
+ tools: [tool],
43
+ stream: true,
44
+ providerOptions: { responses: { store: false } },
45
+ }, { model: "gpt-test" });
46
+ const chat = buildChatRequest({ messages: [assistantToolUse, toolResult], tools: [tool], stream: true }, { model: "gpt-test" });
47
+ const chatWithSystemState = buildChatRequest({ messages: [createTextMessage("system", "Internal continuation state from context compaction.")], tools: [], stream: true }, { model: "gpt-test" });
48
+ const danglingChat = buildChatRequest({ messages: [danglingToolUse, danglingToolResult], tools: [tool], stream: true }, { model: "gpt-test" });
49
+ const continuationInput = continuation.input;
50
+ const danglingInput = dangling.input;
51
+ const chatMessages = chat.messages;
52
+ const chatWithSystemStateMessages = chatWithSystemState.messages;
53
+ const danglingChatMessages = danglingChat.messages;
54
+ const chatAssistant = chatMessages.find((message) => message.role === "assistant");
55
+ const ok = plain.store === false &&
56
+ withTools.store === true &&
57
+ continuation.store === true &&
58
+ continuation.previous_response_id === undefined &&
59
+ continuationInput.some((item) => item.type === "function_call" && item.call_id === "call_1") &&
60
+ continuationInput.some((item) => item.type === "function_call_output" && item.call_id === "call_1") &&
61
+ !JSON.stringify(danglingInput).includes("call_missing_result") &&
62
+ !JSON.stringify(danglingInput).includes("call_missing_use") &&
63
+ Array.isArray(chatAssistant?.tool_calls) &&
64
+ JSON.stringify(chatMessages).includes('"tool_call_id":"call_1"') &&
65
+ chatWithSystemStateMessages.some((message) => message.role === "system" && String(message.content).includes("Internal continuation state")) &&
66
+ !JSON.stringify(danglingChatMessages).includes("call_missing_result") &&
67
+ !JSON.stringify(danglingChatMessages).includes("call_missing_use") &&
68
+ override.store === false;
69
+ console.log(JSON.stringify({ ok, stores: { plain: plain.store, withTools: withTools.store, continuation: continuation.store, override: override.store } }, null, 2));
70
+ if (!ok)
71
+ process.exitCode = 1;
72
+ //# sourceMappingURL=smoke-responses-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-responses-mapper.js","sourceRoot":"","sources":["../../src/model/smoke-responses-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAgB,MAAM,sBAAsB,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,IAAI,GAAmB;IAC3B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAY;IAChC,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;CAClF,CAAC;AACF,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9G,MAAM,eAAe,GAAY;IAC/B,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;CACpG,CAAC;AACF,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAE1I,MAAM,KAAK,GAAG,qBAAqB,CACjC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAC3E,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,SAAS,GAAG,qBAAqB,CACrC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAC/E,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,YAAY,GAAG,qBAAqB,CACxC;IACE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,UAAU,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,MAAM,EAAE,IAAI;CACb,EACD,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,QAAQ,GAAG,qBAAqB,CACpC;IACE,QAAQ,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC/C,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,MAAM,EAAE,IAAI;CACb,EACD,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,QAAQ,GAAG,qBAAqB,CACpC;IACE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,MAAM,EAAE,IAAI;IACZ,eAAe,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;CACjD,EACD,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,IAAI,GAAG,gBAAgB,CAC3B,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EACzE,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,mBAAmB,GAAG,gBAAgB,CAC1C,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,sDAAsD,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAC5H,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AACF,MAAM,YAAY,GAAG,gBAAgB,CACnC,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAChF,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;AAEF,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAuC,CAAC;AAC/E,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAuC,CAAC;AACvE,MAAM,YAAY,GAAG,IAAI,CAAC,QAA0C,CAAC;AACrE,MAAM,2BAA2B,GAAG,mBAAmB,CAAC,QAA0C,CAAC;AACnG,MAAM,oBAAoB,GAAG,YAAY,CAAC,QAA0C,CAAC;AACrF,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAwC,CAAC;AAC1H,MAAM,EAAE,GACN,KAAK,CAAC,KAAK,KAAK,KAAK;IACrB,SAAS,CAAC,KAAK,KAAK,IAAI;IACxB,YAAY,CAAC,KAAK,KAAK,IAAI;IAC3B,YAAY,CAAC,oBAAoB,KAAK,SAAS;IAC/C,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;IAC5F,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;IACnG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC9D,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC3D,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChE,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IAC3I,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrE,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAClE,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC;AAE3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrK,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface SSEEvent {
2
+ event?: string;
3
+ data: unknown;
4
+ }
5
+ export declare function decodeSSE(stream: ReadableStream<Uint8Array>, idleTimeoutMs?: number): AsyncGenerator<SSEEvent>;
@@ -0,0 +1,79 @@
1
+ export async function* decodeSSE(stream, idleTimeoutMs = 120000) {
2
+ const reader = stream.getReader();
3
+ const decoder = new TextDecoder();
4
+ let buffer = "";
5
+ while (true) {
6
+ const result = await readWithIdleTimeout(reader, idleTimeoutMs);
7
+ if (result.done)
8
+ break;
9
+ buffer += decoder.decode(result.value, { stream: true });
10
+ while (true) {
11
+ const index = firstFrameBoundary(buffer);
12
+ if (index < 0)
13
+ break;
14
+ const frame = buffer.slice(0, index);
15
+ buffer = buffer.slice(buffer[index] === "\r" ? index + 4 : index + 2);
16
+ const event = parseFrame(frame);
17
+ if (!event)
18
+ continue;
19
+ if (event.data === "[DONE]")
20
+ return;
21
+ yield event;
22
+ }
23
+ }
24
+ const tail = buffer.trim();
25
+ if (tail) {
26
+ const event = parseFrame(tail);
27
+ if (event && event.data !== "[DONE]")
28
+ yield event;
29
+ }
30
+ }
31
+ function firstFrameBoundary(buffer) {
32
+ const lf = buffer.indexOf("\n\n");
33
+ const crlf = buffer.indexOf("\r\n\r\n");
34
+ if (lf < 0)
35
+ return crlf;
36
+ if (crlf < 0)
37
+ return lf;
38
+ return Math.min(lf, crlf);
39
+ }
40
+ function parseFrame(frame) {
41
+ let eventName;
42
+ const dataLines = [];
43
+ for (const rawLine of frame.split(/\r?\n/)) {
44
+ const line = rawLine.trimEnd();
45
+ if (!line || line.startsWith(":"))
46
+ continue;
47
+ if (line.startsWith("event:"))
48
+ eventName = line.slice("event:".length).trim();
49
+ if (line.startsWith("data:"))
50
+ dataLines.push(line.slice("data:".length).trimStart());
51
+ }
52
+ if (dataLines.length === 0)
53
+ return undefined;
54
+ const rawData = dataLines.join("\n");
55
+ if (rawData === "[DONE]")
56
+ return { event: eventName, data: rawData };
57
+ try {
58
+ return { event: eventName, data: JSON.parse(rawData) };
59
+ }
60
+ catch {
61
+ return { event: eventName, data: rawData };
62
+ }
63
+ }
64
+ async function readWithIdleTimeout(reader, idleTimeoutMs) {
65
+ let timeout;
66
+ try {
67
+ return await Promise.race([
68
+ reader.read(),
69
+ new Promise((_, reject) => {
70
+ timeout = setTimeout(() => reject(new Error(`SSE stream idle for ${idleTimeoutMs}ms`)), idleTimeoutMs);
71
+ }),
72
+ ]);
73
+ }
74
+ finally {
75
+ if (timeout)
76
+ clearTimeout(timeout);
77
+ }
78
+ }
79
+ //# sourceMappingURL=sse-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-decoder.js","sourceRoot":"","sources":["../../src/model/sse-decoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ClipboardImagePayload {
2
+ mimeType: string;
3
+ data: string;
4
+ }
5
+ export type ClipboardPayload = {
6
+ type: "image";
7
+ image: ClipboardImagePayload;
8
+ } | {
9
+ type: "text";
10
+ text: string;
11
+ } | {
12
+ type: "empty";
13
+ };
14
+ export declare function readClipboard(): Promise<ClipboardPayload>;