neoctl 0.1.19 → 0.1.21

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 (120) hide show
  1. package/dist/agents/local-agent-task.js +2 -1
  2. package/dist/agents/local-agent-task.js.map +1 -1
  3. package/dist/agents/smoke-agents.js +21 -4
  4. package/dist/agents/smoke-agents.js.map +1 -1
  5. package/dist/context/prompts.js +4 -0
  6. package/dist/context/prompts.js.map +1 -1
  7. package/dist/core/image-storage.d.ts +6 -0
  8. package/dist/core/image-storage.js +38 -0
  9. package/dist/core/image-storage.js.map +1 -0
  10. package/dist/core/query-engine.d.ts +21 -1
  11. package/dist/core/query-engine.js +103 -13
  12. package/dist/core/query-engine.js.map +1 -1
  13. package/dist/core/query.d.ts +2 -1
  14. package/dist/core/query.js +60 -5
  15. package/dist/core/query.js.map +1 -1
  16. package/dist/core/smoke-core-loop.js +95 -6
  17. package/dist/core/smoke-core-loop.js.map +1 -1
  18. package/dist/index.d.ts +26 -1
  19. package/dist/index.js +26 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/model/communication-logger.d.ts +2 -1
  22. package/dist/model/communication-logger.js +3 -0
  23. package/dist/model/communication-logger.js.map +1 -1
  24. package/dist/model/config.d.ts +10 -4
  25. package/dist/model/config.js +61 -12
  26. package/dist/model/config.js.map +1 -1
  27. package/dist/model/context-window.js +1 -0
  28. package/dist/model/context-window.js.map +1 -1
  29. package/dist/model/deepseek-adapter.d.ts +29 -0
  30. package/dist/model/deepseek-adapter.js +108 -0
  31. package/dist/model/deepseek-adapter.js.map +1 -0
  32. package/dist/model/env.js +35 -19
  33. package/dist/model/env.js.map +1 -1
  34. package/dist/model/kimi-adapter.d.ts +29 -0
  35. package/dist/model/kimi-adapter.js +108 -0
  36. package/dist/model/kimi-adapter.js.map +1 -0
  37. package/dist/model/model-metadata.json +726 -677
  38. package/dist/model/openai-adapter.d.ts +1 -1
  39. package/dist/model/openai-chat-mapper.d.ts +4 -1
  40. package/dist/model/openai-chat-mapper.js +30 -8
  41. package/dist/model/openai-chat-mapper.js.map +1 -1
  42. package/dist/model/openai-mappers.d.ts +5 -2
  43. package/dist/model/openai-mappers.js +33 -6
  44. package/dist/model/openai-mappers.js.map +1 -1
  45. package/dist/model/openai-responses-mapper.d.ts +1 -1
  46. package/dist/model/openai-responses-mapper.js +2 -1
  47. package/dist/model/openai-responses-mapper.js.map +1 -1
  48. package/dist/model/provider-factory.js +32 -0
  49. package/dist/model/provider-factory.js.map +1 -1
  50. package/dist/model/smoke-deepseek-mapper.d.ts +1 -0
  51. package/dist/model/smoke-deepseek-mapper.js +65 -0
  52. package/dist/model/smoke-deepseek-mapper.js.map +1 -0
  53. package/dist/model/smoke-openai.js +1 -1
  54. package/dist/model/smoke-openai.js.map +1 -1
  55. package/dist/model/smoke-responses-mapper.js +6 -6
  56. package/dist/model/smoke-responses-mapper.js.map +1 -1
  57. package/dist/open-directory.d.ts +1 -0
  58. package/dist/open-directory.js +26 -0
  59. package/dist/open-directory.js.map +1 -0
  60. package/dist/paths.d.ts +7 -0
  61. package/dist/paths.js +12 -0
  62. package/dist/paths.js.map +1 -0
  63. package/dist/repl/commands.d.ts +15 -0
  64. package/dist/repl/commands.js +58 -0
  65. package/dist/repl/commands.js.map +1 -1
  66. package/dist/repl/index.js +1012 -171
  67. package/dist/repl/index.js.map +1 -1
  68. package/dist/session/session-export.d.ts +33 -0
  69. package/dist/session/session-export.js +351 -0
  70. package/dist/session/session-export.js.map +1 -0
  71. package/dist/session/session-store.js +2 -2
  72. package/dist/session/session-store.js.map +1 -1
  73. package/dist/session/simple-session-runtime.d.ts +74 -0
  74. package/dist/session/simple-session-runtime.js +171 -0
  75. package/dist/session/simple-session-runtime.js.map +1 -0
  76. package/dist/session/smoke-session.js +22 -1
  77. package/dist/session/smoke-session.js.map +1 -1
  78. package/dist/skills/skill-filesystem.d.ts +32 -0
  79. package/dist/skills/skill-filesystem.js +371 -0
  80. package/dist/skills/skill-filesystem.js.map +1 -0
  81. package/dist/skills/skill-management-tools.d.ts +36 -0
  82. package/dist/skills/skill-management-tools.js +188 -0
  83. package/dist/skills/skill-management-tools.js.map +1 -0
  84. package/dist/skills/skill-tool.d.ts +85 -5
  85. package/dist/skills/skill-tool.js +173 -14
  86. package/dist/skills/skill-tool.js.map +1 -1
  87. package/dist/skills/smoke-skills.js +54 -5
  88. package/dist/skills/smoke-skills.js.map +1 -1
  89. package/dist/tips.d.ts +10 -0
  90. package/dist/tips.js +168 -0
  91. package/dist/tips.js.map +1 -0
  92. package/dist/tools/builtins/image-generation-tool.d.ts +96 -0
  93. package/dist/tools/builtins/image-generation-tool.js +471 -0
  94. package/dist/tools/builtins/image-generation-tool.js.map +1 -0
  95. package/dist/tools/builtins/search-providers.d.ts +15 -1
  96. package/dist/tools/builtins/search-providers.js +195 -1
  97. package/dist/tools/builtins/search-providers.js.map +1 -1
  98. package/dist/tools/builtins/search-tool.js +2 -2
  99. package/dist/tools/builtins/search-tool.js.map +1 -1
  100. package/dist/tools/registry.d.ts +1 -0
  101. package/dist/tools/registry.js +11 -0
  102. package/dist/tools/registry.js.map +1 -1
  103. package/dist/tools/run-tool-use.js +1 -1
  104. package/dist/tools/run-tool-use.js.map +1 -1
  105. package/dist/tools/smoke-tool-system.js +43 -9
  106. package/dist/tools/smoke-tool-system.js.map +1 -1
  107. package/dist/tools/tool.d.ts +9 -1
  108. package/dist/tools/tool.js.map +1 -1
  109. package/dist/types/messages.d.ts +5 -0
  110. package/dist/types/messages.js.map +1 -1
  111. package/dist/ui/display-message.d.ts +103 -0
  112. package/dist/ui/display-message.js +115 -0
  113. package/dist/ui/display-message.js.map +1 -0
  114. package/dist/web/html.d.ts +1 -0
  115. package/dist/web/html.js +862 -0
  116. package/dist/web/html.js.map +1 -0
  117. package/dist/web/index.d.ts +241 -0
  118. package/dist/web/index.js +1873 -0
  119. package/dist/web/index.js.map +1 -0
  120. package/package.json +1 -1
@@ -0,0 +1,471 @@
1
+ const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
2
+ const DEFAULT_IMAGE_MODEL = "gpt-image-1";
3
+ const DEFAULT_TIMEOUT_MS = 120_000;
4
+ const MAX_IMAGES = 4;
5
+ /**
6
+ * OpenAI-only image generation tool backed by the Images API.
7
+ *
8
+ * The tool is intentionally exposed only when MODEL_PROVIDER=openai. Other providers
9
+ * should not receive a drawable tool definition; the default system prompt tells the
10
+ * model that image generation is unavailable in that configuration.
11
+ */
12
+ export function createOpenAIImageGenerationTool(options = {}) {
13
+ return {
14
+ name: "image2",
15
+ aliases: ["draw_image", "generate_image", "edit_image", "modify_image"],
16
+ description: "Generate or edit images with OpenAI's Images API. Use mode=generate for new images and mode=edit to modify existing images. Edit mode accepts explicit image/image(s), imageRefs for prior conversation images, or falls back to the latest prior image. Return generated/edited image data URLs in the tool result for the UI to display. This tool is available only when MODEL_PROVIDER=openai; with other providers, state that this model does not have a drawing/editing tool.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ mode: { type: "string", enum: ["generate", "edit"], description: "Operation mode. generate creates a new image; edit modifies existing image(s). Defaults to generate." },
21
+ prompt: { type: "string", description: "Detailed image prompt/instruction. For edit mode, describe exactly how to modify the source image(s)." },
22
+ model: { type: "string", description: `Optional OpenAI image model. Defaults to OPENAI_IMAGE_MODEL or ${DEFAULT_IMAGE_MODEL}.` },
23
+ size: { type: "string", enum: ["auto", "1024x1024", "1536x1024", "1024x1536"], description: "Output image size. Use 1024x1024 for square, 1536x1024 for landscape, 1024x1536 for portrait. Defaults to auto." },
24
+ quality: { type: "string", enum: ["auto", "low", "medium", "high"], description: "Rendering quality. Defaults to auto." },
25
+ outputFormat: { type: "string", enum: ["png", "jpeg", "webp"], description: "Returned image format. Defaults to png." },
26
+ background: { type: "string", enum: ["auto", "transparent", "opaque"], description: "Background handling for supported models. Defaults to auto." },
27
+ moderation: { type: "string", enum: ["auto", "low"], description: "OpenAI image moderation setting for supported models. Defaults to auto." },
28
+ n: { type: "integer", description: `Number of output images, 1-${MAX_IMAGES}. Defaults to 1.` },
29
+ image: { type: "object", description: "Single source image for mode=edit. Provide base64/data/dataUrl plus mimeType when not using a dataUrl.", additionalProperties: true },
30
+ images: { type: "array", description: "Multiple source images for mode=edit.", items: { type: "object", additionalProperties: true } },
31
+ imageRefs: { type: "array", description: "Labels of prior conversation image blocks to edit, e.g. Generated image 1 or [img#1].", items: { type: "string" } },
32
+ useLatestImage: { type: "boolean", description: "In edit mode, use the latest prior conversation image when no explicit source image or imageRefs are provided. Defaults to true." },
33
+ },
34
+ required: ["prompt"],
35
+ additionalProperties: false,
36
+ },
37
+ metadata: {
38
+ readOnly: false,
39
+ concurrent: true,
40
+ visible: true,
41
+ maxResultSizeChars: 24000,
42
+ },
43
+ validate(input) {
44
+ const record = input;
45
+ return {
46
+ mode: record.mode ?? "generate",
47
+ prompt: record.prompt ?? "",
48
+ model: record.model,
49
+ size: record.size ?? "auto",
50
+ quality: record.quality ?? "auto",
51
+ outputFormat: record.outputFormat ?? "png",
52
+ background: record.background ?? "auto",
53
+ moderation: record.moderation ?? "auto",
54
+ n: record.n ?? 1,
55
+ image: record.image,
56
+ images: record.images,
57
+ imageRefs: record.imageRefs,
58
+ useLatestImage: record.useLatestImage ?? true,
59
+ };
60
+ },
61
+ validateInput(input) {
62
+ if (!isImageToolMode(input.mode))
63
+ return { ok: false, message: "image2.mode must be generate or edit" };
64
+ if (!input.prompt.trim())
65
+ return { ok: false, message: "image2.prompt cannot be empty" };
66
+ if (input.model !== undefined && !input.model.trim())
67
+ return { ok: false, message: "image2.model cannot be empty" };
68
+ if (!isImageSize(input.size))
69
+ return { ok: false, message: "image2.size must be auto, 1024x1024, 1536x1024, or 1024x1536" };
70
+ if (!isImageQuality(input.quality))
71
+ return { ok: false, message: "image2.quality must be auto, low, medium, or high" };
72
+ if (!isImageFormat(input.outputFormat))
73
+ return { ok: false, message: "image2.outputFormat must be png, jpeg, or webp" };
74
+ if (!isImageBackground(input.background))
75
+ return { ok: false, message: "image2.background must be auto, transparent, or opaque" };
76
+ if (!isImageModeration(input.moderation))
77
+ return { ok: false, message: "image2.moderation must be auto or low" };
78
+ const count = input.n ?? 1;
79
+ if (!Number.isInteger(count) || count < 1 || count > MAX_IMAGES)
80
+ return { ok: false, message: `image2.n must be between 1 and ${MAX_IMAGES}` };
81
+ if (input.images !== undefined && (!Array.isArray(input.images) || input.images.length === 0))
82
+ return { ok: false, message: "image2.images must be a non-empty array when provided" };
83
+ if (input.imageRefs !== undefined && (!Array.isArray(input.imageRefs) || input.imageRefs.some((ref) => !ref.trim())))
84
+ return { ok: false, message: "image2.imageRefs must contain non-empty strings" };
85
+ return { ok: true, value: { ...input, n: count } };
86
+ },
87
+ isConcurrencySafe() {
88
+ return true;
89
+ },
90
+ async call(input, context, callOptions) {
91
+ const apiKey = resolveApiKey(options.apiKey);
92
+ if (!apiKey) {
93
+ return {
94
+ ok: false,
95
+ output: {
96
+ provider: "openai",
97
+ error: "OpenAI image generation requires OPENAI_IMAGE_API_KEY or OPENAI_API_KEY.",
98
+ },
99
+ };
100
+ }
101
+ const baseUrl = stripTrailingSlash(options.baseUrl?.trim() || process.env.OPENAI_IMAGE_BASE_URL?.trim() || process.env.OPENAI_BASE_URL?.trim() || DEFAULT_OPENAI_BASE_URL);
102
+ const model = input.model?.trim() || options.model?.trim() || process.env.OPENAI_IMAGE_MODEL?.trim() || DEFAULT_IMAGE_MODEL;
103
+ const timeoutMs = options.timeoutMs ?? parsePositiveNumber(process.env.OPENAI_IMAGE_TIMEOUT_MS) ?? parsePositiveNumber(process.env.MODEL_TIMEOUT_MS) ?? DEFAULT_TIMEOUT_MS;
104
+ const mode = input.mode ?? "generate";
105
+ callOptions.onProgress?.({ toolName: "image2", message: `${mode === "edit" ? "Editing" : "Generating"} image with OpenAI ${model}` });
106
+ const startedAt = Date.now();
107
+ try {
108
+ const editSources = mode === "edit" ? resolveImageEditSources(input, context.messages) : [];
109
+ if (mode === "edit" && editSources.length === 0) {
110
+ throw new Error("image2 mode=edit requires a source image. Provide image/images/imageRefs, attach an image, or keep useLatestImage enabled with a prior image in the conversation.");
111
+ }
112
+ const response = mode === "edit"
113
+ ? await callOpenAIImageEdit({
114
+ apiKey,
115
+ baseUrl,
116
+ timeoutMs,
117
+ signal: context.abortSignal,
118
+ input: { ...input, model },
119
+ images: editSources,
120
+ })
121
+ : await callOpenAIImageGeneration({
122
+ apiKey,
123
+ baseUrl,
124
+ timeoutMs,
125
+ signal: context.abortSignal,
126
+ input: { ...input, model },
127
+ });
128
+ const images = extractGeneratedImages(response, input.outputFormat ?? "png");
129
+ const timing = imageGenerationTiming(startedAt);
130
+ const output = {
131
+ ...timing,
132
+ provider: "openai",
133
+ mode,
134
+ model,
135
+ prompt: input.prompt,
136
+ size: input.size ?? "auto",
137
+ quality: input.quality ?? "auto",
138
+ outputFormat: input.outputFormat ?? "png",
139
+ background: input.background ?? "auto",
140
+ returnedImages: images.length,
141
+ sourceImages: mode === "edit" ? editSources.length : undefined,
142
+ imageRefs: mode === "edit" ? editSources.map((source) => source.label).filter((label) => Boolean(label)) : undefined,
143
+ images,
144
+ raw: compactRawResponse(response),
145
+ };
146
+ return {
147
+ ok: images.length > 0,
148
+ output,
149
+ summary: images.length ? `${images.length} image(s) ${mode === "edit" ? "edited" : "generated"} in ${timing.duration}ms` : `OpenAI returned no image data after ${timing.duration}ms`,
150
+ };
151
+ }
152
+ catch (error) {
153
+ return {
154
+ ok: false,
155
+ output: {
156
+ ...imageGenerationTiming(startedAt),
157
+ provider: "openai",
158
+ mode,
159
+ model,
160
+ prompt: input.prompt,
161
+ error: error instanceof Error ? error.message : String(error),
162
+ },
163
+ };
164
+ }
165
+ },
166
+ mapResult(result) {
167
+ return compactImageGenerationOutput(result.output);
168
+ },
169
+ renderToolResultMessage(result, request) {
170
+ return createImageGenerationToolResultMessage(result, request?.id ?? "");
171
+ },
172
+ };
173
+ }
174
+ export const openAIImageGenerationTool = createOpenAIImageGenerationTool();
175
+ async function callOpenAIImageGeneration(options) {
176
+ const controller = new AbortController();
177
+ const abort = () => controller.abort(options.signal?.reason);
178
+ const timeout = setTimeout(() => controller.abort(new Error(`Image generation request timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
179
+ options.signal?.addEventListener("abort", abort, { once: true });
180
+ try {
181
+ const response = await fetch(`${options.baseUrl}/v1/images/generations`, {
182
+ method: "POST",
183
+ headers: {
184
+ Accept: "application/json",
185
+ "Content-Type": "application/json",
186
+ Authorization: `Bearer ${options.apiKey}`,
187
+ },
188
+ body: JSON.stringify(buildOpenAIImageRequestBody(options.input)),
189
+ signal: controller.signal,
190
+ });
191
+ const text = await response.text();
192
+ const body = text ? parseJsonObject(text) : {};
193
+ if (!response.ok) {
194
+ throw new Error(`OpenAI image generation HTTP ${response.status}: ${openAIErrorMessage(body) ?? text.slice(0, 1000)}`);
195
+ }
196
+ return body;
197
+ }
198
+ finally {
199
+ clearTimeout(timeout);
200
+ options.signal?.removeEventListener("abort", abort);
201
+ }
202
+ }
203
+ async function callOpenAIImageEdit(options) {
204
+ const controller = new AbortController();
205
+ const abort = () => controller.abort(options.signal?.reason);
206
+ const timeout = setTimeout(() => controller.abort(new Error(`Image edit request timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
207
+ options.signal?.addEventListener("abort", abort, { once: true });
208
+ try {
209
+ const form = new FormData();
210
+ for (const image of options.images) {
211
+ form.append("image[]", base64ToBlob(image.base64, image.mimeType), image.filename);
212
+ }
213
+ for (const [key, value] of Object.entries(buildOpenAIImageRequestBody(options.input))) {
214
+ if (value !== undefined)
215
+ form.append(key, String(value));
216
+ }
217
+ const response = await fetch(`${options.baseUrl}/v1/images/edits`, {
218
+ method: "POST",
219
+ headers: {
220
+ Accept: "application/json",
221
+ Authorization: `Bearer ${options.apiKey}`,
222
+ },
223
+ body: form,
224
+ signal: controller.signal,
225
+ });
226
+ const text = await response.text();
227
+ const body = text ? parseJsonObject(text) : {};
228
+ if (!response.ok) {
229
+ throw new Error(`OpenAI image edit HTTP ${response.status}: ${openAIErrorMessage(body) ?? text.slice(0, 1000)}`);
230
+ }
231
+ return body;
232
+ }
233
+ finally {
234
+ clearTimeout(timeout);
235
+ options.signal?.removeEventListener("abort", abort);
236
+ }
237
+ }
238
+ function buildOpenAIImageRequestBody(input) {
239
+ return dropUndefined({
240
+ model: input.model,
241
+ prompt: input.prompt,
242
+ n: input.n ?? 1,
243
+ size: input.size ?? "auto",
244
+ quality: input.quality ?? "auto",
245
+ output_format: input.outputFormat ?? "png",
246
+ background: input.background === "auto" ? undefined : input.background,
247
+ moderation: input.moderation === "auto" ? undefined : input.moderation,
248
+ });
249
+ }
250
+ function imageGenerationTiming(startedAt, finishedAt = Date.now()) {
251
+ const duration = Math.max(0, finishedAt - startedAt);
252
+ return {
253
+ startedAt,
254
+ startedAtIso: new Date(startedAt).toISOString(),
255
+ finishedAt,
256
+ finishedAtIso: new Date(finishedAt).toISOString(),
257
+ duration,
258
+ elapsed: duration,
259
+ durationMs: duration,
260
+ elapsedMs: duration,
261
+ };
262
+ }
263
+ function resolveImageEditSources(input, messages) {
264
+ const explicit = [input.image, ...(input.images ?? [])].filter((image) => !!image);
265
+ const fromInput = explicit.map((image, index) => resolveInputImage(image, index));
266
+ const fromRefs = resolveReferencedImages(messages, input.imageRefs ?? []);
267
+ const shouldUseLatest = input.useLatestImage !== false && fromInput.length === 0 && fromRefs.length === 0 && (!input.imageRefs || input.imageRefs.length === 0);
268
+ const latest = shouldUseLatest ? latestConversationImage(messages) : undefined;
269
+ return [...fromInput, ...fromRefs, ...(latest ? [latest] : [])];
270
+ }
271
+ function resolveInputImage(image, index) {
272
+ const parsed = parseImageData(image.dataUrl ?? image.base64 ?? image.data);
273
+ const mimeType = image.mimeType?.trim() || parsed.mimeType;
274
+ if (!parsed.base64)
275
+ throw new Error(`image2 edit source image ${index + 1} is missing base64/data/dataUrl`);
276
+ if (!mimeType)
277
+ throw new Error(`image2 edit source image ${index + 1} is missing mimeType`);
278
+ return {
279
+ index,
280
+ base64: normalizeBase64ImageData(parsed.base64),
281
+ mimeType,
282
+ filename: image.name?.trim() || imageFilename(mimeType, index),
283
+ label: image.label,
284
+ };
285
+ }
286
+ function resolveReferencedImages(messages, refs) {
287
+ if (!messages || refs.length === 0)
288
+ return [];
289
+ const imageBlocks = collectConversationImages(messages);
290
+ return refs.map((ref, index) => {
291
+ const normalizedRef = normalizeImageRef(ref);
292
+ const found = imageBlocks.find((image) => normalizeImageRef(image.label ?? "") === normalizedRef || normalizeImageRef(image.filename) === normalizedRef || String(image.index + 1) === normalizedRef);
293
+ if (!found)
294
+ throw new Error(`image2 could not find referenced image: ${ref}`);
295
+ return { ...found, filename: found.filename || imageFilename(found.mimeType, index) };
296
+ });
297
+ }
298
+ function latestConversationImage(messages) {
299
+ const images = collectConversationImages(messages);
300
+ return images[images.length - 1];
301
+ }
302
+ function collectConversationImages(messages) {
303
+ if (!messages)
304
+ return [];
305
+ const images = [];
306
+ for (const message of messages) {
307
+ for (const block of message.blocks) {
308
+ if (block.type !== "image")
309
+ continue;
310
+ const parsed = parseImageData(block.data);
311
+ const mimeType = block.mimeType || parsed.mimeType;
312
+ if (!parsed.base64 || !mimeType)
313
+ continue;
314
+ images.push({
315
+ index: images.length,
316
+ base64: normalizeBase64ImageData(parsed.base64),
317
+ mimeType,
318
+ filename: imageFilename(mimeType, images.length),
319
+ label: block.label,
320
+ });
321
+ }
322
+ }
323
+ return images;
324
+ }
325
+ function parseImageData(value) {
326
+ if (!value)
327
+ return {};
328
+ const match = /^data:([^;,]+);base64,(.*)$/su.exec(value.trim());
329
+ if (match)
330
+ return { mimeType: match[1], base64: match[2] };
331
+ return { base64: value };
332
+ }
333
+ function normalizeBase64ImageData(value) {
334
+ return value.replace(/^data:[^;,]+;base64,/su, "").replace(/\s+/gu, "");
335
+ }
336
+ function base64ToBlob(base64, mimeType) {
337
+ return new Blob([Buffer.from(normalizeBase64ImageData(base64), "base64")], { type: mimeType });
338
+ }
339
+ function imageFilename(mimeType, index) {
340
+ const subtype = mimeType.split("/")[1]?.split(";")[0]?.trim() || "png";
341
+ const extension = subtype === "jpeg" ? "jpg" : subtype.replace(/[^a-z0-9]/giu, "") || "png";
342
+ return `image-${index + 1}.${extension}`;
343
+ }
344
+ function normalizeImageRef(value) {
345
+ return value.trim().toLowerCase();
346
+ }
347
+ function createImageGenerationToolResultMessage(result, toolUseId) {
348
+ const output = result.output;
349
+ const blocks = [{
350
+ type: "tool_result",
351
+ toolUseId,
352
+ name: "image2",
353
+ ok: result.ok,
354
+ output: compactImageGenerationOutput(output),
355
+ }];
356
+ if (result.ok && isImageGenerationToolOutput(output)) {
357
+ for (const image of output.images) {
358
+ blocks.push({ type: "image", mimeType: image.mimeType, data: image.base64, label: `Generated image ${image.index + 1}` });
359
+ }
360
+ }
361
+ return {
362
+ id: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
363
+ role: "tool_result",
364
+ createdAt: new Date().toISOString(),
365
+ blocks,
366
+ metadata: result.ok ? { generatedImages: true, tool: "image2" } : undefined,
367
+ };
368
+ }
369
+ function compactImageGenerationOutput(output) {
370
+ if (!isImageGenerationToolOutput(output))
371
+ return output;
372
+ return {
373
+ ...output,
374
+ images: output.images.map((image) => ({
375
+ ...image,
376
+ base64: `[base64 image omitted from model context; image ${image.index}, ${image.mimeType}]`,
377
+ dataUrl: `[data URL omitted from model context; image ${image.index}, ${image.mimeType}]`,
378
+ })),
379
+ };
380
+ }
381
+ function isImageGenerationToolOutput(value) {
382
+ return isRecord(value) && value.provider === "openai" && Array.isArray(value.images);
383
+ }
384
+ function extractGeneratedImages(response, format) {
385
+ const data = Array.isArray(response.data) ? response.data : [];
386
+ return data.flatMap((item, index) => {
387
+ if (!isRecord(item))
388
+ return [];
389
+ const base64 = stringFrom(item.b64_json ?? item.image_base64 ?? item.base64_json ?? item.base64);
390
+ if (!base64)
391
+ return [];
392
+ const mimeType = `image/${format === "jpg" ? "jpeg" : format}`;
393
+ return [{
394
+ index,
395
+ mimeType,
396
+ base64,
397
+ dataUrl: `data:${mimeType};base64,${base64}`,
398
+ revisedPrompt: stringFrom(item.revised_prompt),
399
+ }];
400
+ });
401
+ }
402
+ function resolveApiKey(configured) {
403
+ return configured?.trim() || process.env.OPENAI_IMAGE_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim() || undefined;
404
+ }
405
+ function stripTrailingSlash(value) {
406
+ return value.replace(/\/+$/, "");
407
+ }
408
+ function parsePositiveNumber(value) {
409
+ if (!value)
410
+ return undefined;
411
+ const parsed = Number(value);
412
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
413
+ }
414
+ function parseJsonObject(text) {
415
+ try {
416
+ const value = JSON.parse(text);
417
+ return isRecord(value) ? value : { value };
418
+ }
419
+ catch {
420
+ return { text };
421
+ }
422
+ }
423
+ function openAIErrorMessage(body) {
424
+ const error = isRecord(body.error) ? body.error : undefined;
425
+ return stringFrom(error?.message);
426
+ }
427
+ function compactRawResponse(response) {
428
+ const data = Array.isArray(response.data) ? response.data : undefined;
429
+ return {
430
+ ...response,
431
+ data: data?.map((item) => {
432
+ if (!isRecord(item))
433
+ return item;
434
+ return {
435
+ ...item,
436
+ b64_json: item.b64_json ? "[base64 image omitted]" : undefined,
437
+ image_base64: item.image_base64 ? "[base64 image omitted]" : undefined,
438
+ base64_json: item.base64_json ? "[base64 image omitted]" : undefined,
439
+ base64: item.base64 ? "[base64 image omitted]" : undefined,
440
+ };
441
+ }),
442
+ };
443
+ }
444
+ function dropUndefined(value) {
445
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
446
+ }
447
+ function stringFrom(value) {
448
+ return typeof value === "string" ? value : undefined;
449
+ }
450
+ function isRecord(value) {
451
+ return !!value && typeof value === "object" && !Array.isArray(value);
452
+ }
453
+ function isImageToolMode(value) {
454
+ return value === "generate" || value === "edit";
455
+ }
456
+ function isImageSize(value) {
457
+ return value === "auto" || value === "1024x1024" || value === "1536x1024" || value === "1024x1536";
458
+ }
459
+ function isImageQuality(value) {
460
+ return value === "auto" || value === "low" || value === "medium" || value === "high";
461
+ }
462
+ function isImageFormat(value) {
463
+ return value === "png" || value === "jpeg" || value === "webp";
464
+ }
465
+ function isImageBackground(value) {
466
+ return value === "auto" || value === "transparent" || value === "opaque";
467
+ }
468
+ function isImageModeration(value) {
469
+ return value === "auto" || value === "low";
470
+ }
471
+ //# sourceMappingURL=image-generation-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-tool.js","sourceRoot":"","sources":["../../../src/tools/builtins/image-generation-tool.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export type SearchProviderName = "exa" | (string & {});
1
+ export type SearchProviderName = "exa" | "openai" | "gpt" | (string & {});
2
2
  export interface SearchToolInput {
3
3
  query: string;
4
4
  numResults: number;
@@ -30,15 +30,28 @@ export interface SearchProvider {
30
30
  export interface SearchProviderConfig {
31
31
  provider?: string;
32
32
  exa?: ExaSearchProviderConfig;
33
+ openai?: OpenAISearchProviderConfig;
33
34
  }
34
35
  export interface ExaSearchProviderConfig {
35
36
  mcpUrl?: string;
36
37
  toolName?: string;
37
38
  timeoutMs?: number;
38
39
  }
40
+ export interface OpenAISearchProviderConfig {
41
+ apiKey?: string;
42
+ baseUrl?: string;
43
+ model?: string;
44
+ timeoutMs?: number;
45
+ toolType?: string;
46
+ searchContextSize?: "low" | "medium" | "high";
47
+ maxOutputTokens?: number;
48
+ }
39
49
  export declare const DEFAULT_SEARCH_PROVIDER = "exa";
40
50
  export declare const DEFAULT_EXA_MCP_URL = "https://mcp.exa.ai/mcp";
41
51
  export declare const DEFAULT_EXA_MCP_TOOL_NAME = "web_search_exa";
52
+ export declare const DEFAULT_OPENAI_SEARCH_MODEL = "gpt-4.1-mini";
53
+ export declare const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
54
+ export declare const DEFAULT_OPENAI_WEB_SEARCH_TOOL_TYPE = "web_search_preview";
42
55
  export declare const DEFAULT_SEARCH_TIMEOUT_MS = 30000;
43
56
  export declare class SearchProviderError extends Error {
44
57
  readonly provider: string;
@@ -47,3 +60,4 @@ export declare class SearchProviderError extends Error {
47
60
  }
48
61
  export declare function createSearchProvider(config?: SearchProviderConfig, env?: NodeJS.ProcessEnv): SearchProvider;
49
62
  export declare function createExaSearchProvider(config?: ExaSearchProviderConfig): SearchProvider;
63
+ export declare function createOpenAISearchProvider(config?: OpenAISearchProviderConfig): SearchProvider;