openrouter-genimage-kote-opencode 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 (163) hide show
  1. package/.opencode/skills/openrouter-image-generation/SKILL.md +379 -0
  2. package/CHANGELOG.md +10 -0
  3. package/LICENSE +21 -0
  4. package/README.md +229 -0
  5. package/README.ru.md +229 -0
  6. package/SECURITY.md +31 -0
  7. package/THIRD_PARTY_NOTICES.md +16 -0
  8. package/dist/cli.d.ts +20 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +277 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/balance-command.d.ts +5 -0
  13. package/dist/commands/balance-command.d.ts.map +1 -0
  14. package/dist/commands/balance-command.js +20 -0
  15. package/dist/commands/balance-command.js.map +1 -0
  16. package/dist/config/resolve.d.ts +5 -0
  17. package/dist/config/resolve.d.ts.map +1 -0
  18. package/dist/config/resolve.js +113 -0
  19. package/dist/config/resolve.js.map +1 -0
  20. package/dist/config/schema.d.ts +188 -0
  21. package/dist/config/schema.d.ts.map +1 -0
  22. package/dist/config/schema.js +144 -0
  23. package/dist/config/schema.js.map +1 -0
  24. package/dist/config/types.d.ts +75 -0
  25. package/dist/config/types.d.ts.map +1 -0
  26. package/dist/config/types.js +30 -0
  27. package/dist/config/types.js.map +1 -0
  28. package/dist/logging.d.ts +46 -0
  29. package/dist/logging.d.ts.map +1 -0
  30. package/dist/logging.js +58 -0
  31. package/dist/logging.js.map +1 -0
  32. package/dist/openrouter/capabilities.d.ts +22 -0
  33. package/dist/openrouter/capabilities.d.ts.map +1 -0
  34. package/dist/openrouter/capabilities.js +137 -0
  35. package/dist/openrouter/capabilities.js.map +1 -0
  36. package/dist/openrouter/client.d.ts +54 -0
  37. package/dist/openrouter/client.d.ts.map +1 -0
  38. package/dist/openrouter/client.js +440 -0
  39. package/dist/openrouter/client.js.map +1 -0
  40. package/dist/openrouter/errors.d.ts +22 -0
  41. package/dist/openrouter/errors.d.ts.map +1 -0
  42. package/dist/openrouter/errors.js +75 -0
  43. package/dist/openrouter/errors.js.map +1 -0
  44. package/dist/openrouter/models.d.ts +37 -0
  45. package/dist/openrouter/models.d.ts.map +1 -0
  46. package/dist/openrouter/models.js +113 -0
  47. package/dist/openrouter/models.js.map +1 -0
  48. package/dist/openrouter/requests.d.ts +6 -0
  49. package/dist/openrouter/requests.d.ts.map +1 -0
  50. package/dist/openrouter/requests.js +74 -0
  51. package/dist/openrouter/requests.js.map +1 -0
  52. package/dist/openrouter/schemas.d.ts +37 -0
  53. package/dist/openrouter/schemas.d.ts.map +1 -0
  54. package/dist/openrouter/schemas.js +2 -0
  55. package/dist/openrouter/schemas.js.map +1 -0
  56. package/dist/output/attachments.d.ts +10 -0
  57. package/dist/output/attachments.d.ts.map +1 -0
  58. package/dist/output/attachments.js +13 -0
  59. package/dist/output/attachments.js.map +1 -0
  60. package/dist/output/formats.d.ts +42 -0
  61. package/dist/output/formats.d.ts.map +1 -0
  62. package/dist/output/formats.js +126 -0
  63. package/dist/output/formats.js.map +1 -0
  64. package/dist/output/index.d.ts +5 -0
  65. package/dist/output/index.d.ts.map +1 -0
  66. package/dist/output/index.js +5 -0
  67. package/dist/output/index.js.map +1 -0
  68. package/dist/output/paths.d.ts +38 -0
  69. package/dist/output/paths.d.ts.map +1 -0
  70. package/dist/output/paths.js +296 -0
  71. package/dist/output/paths.js.map +1 -0
  72. package/dist/output/writer.d.ts +33 -0
  73. package/dist/output/writer.d.ts.map +1 -0
  74. package/dist/output/writer.js +176 -0
  75. package/dist/output/writer.js.map +1 -0
  76. package/dist/references/attachments.d.ts +82 -0
  77. package/dist/references/attachments.d.ts.map +1 -0
  78. package/dist/references/attachments.js +238 -0
  79. package/dist/references/attachments.js.map +1 -0
  80. package/dist/references/data-url.d.ts +12 -0
  81. package/dist/references/data-url.d.ts.map +1 -0
  82. package/dist/references/data-url.js +75 -0
  83. package/dist/references/data-url.js.map +1 -0
  84. package/dist/references/formats.d.ts +13 -0
  85. package/dist/references/formats.d.ts.map +1 -0
  86. package/dist/references/formats.js +50 -0
  87. package/dist/references/formats.js.map +1 -0
  88. package/dist/references/index.d.ts +7 -0
  89. package/dist/references/index.d.ts.map +1 -0
  90. package/dist/references/index.js +7 -0
  91. package/dist/references/index.js.map +1 -0
  92. package/dist/references/limits.d.ts +15 -0
  93. package/dist/references/limits.d.ts.map +1 -0
  94. package/dist/references/limits.js +62 -0
  95. package/dist/references/limits.js.map +1 -0
  96. package/dist/references/project-files.d.ts +13 -0
  97. package/dist/references/project-files.d.ts.map +1 -0
  98. package/dist/references/project-files.js +148 -0
  99. package/dist/references/project-files.js.map +1 -0
  100. package/dist/references/remote-urls.d.ts +3 -0
  101. package/dist/references/remote-urls.d.ts.map +1 -0
  102. package/dist/references/remote-urls.js +22 -0
  103. package/dist/references/remote-urls.js.map +1 -0
  104. package/dist/server.d.ts +8 -0
  105. package/dist/server.d.ts.map +1 -0
  106. package/dist/server.js +97 -0
  107. package/dist/server.js.map +1 -0
  108. package/dist/tools/balance.d.ts +8 -0
  109. package/dist/tools/balance.d.ts.map +1 -0
  110. package/dist/tools/balance.js +133 -0
  111. package/dist/tools/balance.js.map +1 -0
  112. package/dist/tools/common.d.ts +3 -0
  113. package/dist/tools/common.d.ts.map +1 -0
  114. package/dist/tools/common.js +18 -0
  115. package/dist/tools/common.js.map +1 -0
  116. package/dist/tools/edit-image.d.ts +90 -0
  117. package/dist/tools/edit-image.d.ts.map +1 -0
  118. package/dist/tools/edit-image.js +47 -0
  119. package/dist/tools/edit-image.js.map +1 -0
  120. package/dist/tools/generate-image.d.ts +70 -0
  121. package/dist/tools/generate-image.d.ts.map +1 -0
  122. package/dist/tools/generate-image.js +36 -0
  123. package/dist/tools/generate-image.js.map +1 -0
  124. package/dist/tools/generation.d.ts +19 -0
  125. package/dist/tools/generation.d.ts.map +1 -0
  126. package/dist/tools/generation.js +154 -0
  127. package/dist/tools/generation.js.map +1 -0
  128. package/dist/tools/schema.d.ts +127 -0
  129. package/dist/tools/schema.d.ts.map +1 -0
  130. package/dist/tools/schema.js +47 -0
  131. package/dist/tools/schema.js.map +1 -0
  132. package/dist/tools/types.d.ts +18 -0
  133. package/dist/tools/types.d.ts.map +1 -0
  134. package/dist/tools/types.js +2 -0
  135. package/dist/tools/types.js.map +1 -0
  136. package/dist/transport/direct.d.ts +10 -0
  137. package/dist/transport/direct.d.ts.map +1 -0
  138. package/dist/transport/direct.js +15 -0
  139. package/dist/transport/direct.js.map +1 -0
  140. package/dist/transport/index.d.ts +4 -0
  141. package/dist/transport/index.d.ts.map +1 -0
  142. package/dist/transport/index.js +4 -0
  143. package/dist/transport/index.js.map +1 -0
  144. package/dist/transport/kote-gateway.d.ts +19 -0
  145. package/dist/transport/kote-gateway.d.ts.map +1 -0
  146. package/dist/transport/kote-gateway.js +224 -0
  147. package/dist/transport/kote-gateway.js.map +1 -0
  148. package/dist/transport/types.d.ts +10 -0
  149. package/dist/transport/types.d.ts.map +1 -0
  150. package/dist/transport/types.js +9 -0
  151. package/dist/transport/types.js.map +1 -0
  152. package/dist/utils/abort.d.ts +19 -0
  153. package/dist/utils/abort.d.ts.map +1 -0
  154. package/dist/utils/abort.js +121 -0
  155. package/dist/utils/abort.js.map +1 -0
  156. package/docs/architecture.md +75 -0
  157. package/docs/configuration.md +110 -0
  158. package/docs/image-to-image.md +101 -0
  159. package/docs/security.md +49 -0
  160. package/docs/testing.md +81 -0
  161. package/docs/troubleshooting.md +73 -0
  162. package/package.json +88 -0
  163. package/schema/plugin-options.schema.json +182 -0
@@ -0,0 +1,296 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { lstat, mkdir, realpath } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { PluginError } from "../openrouter/errors.js";
5
+ import { isPathInside, sameCanonicalPath, } from "../references/project-files.js";
6
+ import { formatFromExtension, } from "../references/formats.js";
7
+ const WINDOWS_DRIVE_PREFIX = /^[A-Za-z]:/u;
8
+ const WINDOWS_UNC_PREFIX = /^(?:\\\\|\/\/)/u;
9
+ function pathError(message) {
10
+ return new PluginError("GENIMAGE_OUTPUT_PATH_INVALID", message);
11
+ }
12
+ function outsideError(message, cause) {
13
+ return new PluginError("GENIMAGE_OUTPUT_OUTSIDE_WORKTREE", message, {
14
+ ...(cause === undefined ? {} : { cause }),
15
+ });
16
+ }
17
+ function normalizeSeparators(value) {
18
+ return value.replaceAll("\\", "/");
19
+ }
20
+ function toNativeRelativePath(value) {
21
+ return normalizeSeparators(value).split("/").join(path.sep);
22
+ }
23
+ function portableRelativePath(value) {
24
+ return value.split(path.sep).join("/");
25
+ }
26
+ function containsControlCharacter(value) {
27
+ for (let index = 0; index < value.length; index += 1) {
28
+ const codeUnit = value.charCodeAt(index);
29
+ if (codeUnit <= 0x1f || codeUnit === 0x7f)
30
+ return true;
31
+ }
32
+ return false;
33
+ }
34
+ function pathExistsError(error) {
35
+ return (typeof error === "object" &&
36
+ error !== null &&
37
+ "code" in error &&
38
+ error.code === "ENOENT");
39
+ }
40
+ /** Validate a portable, worktree-relative path without resolving it. */
41
+ export function assertSafeOutputRelativePath(value, kind = "file") {
42
+ const portable = normalizeSeparators(value);
43
+ const segments = portable.split("/");
44
+ if (value.trim() === "" ||
45
+ containsControlCharacter(value) ||
46
+ path.posix.isAbsolute(portable) ||
47
+ path.win32.isAbsolute(value) ||
48
+ WINDOWS_DRIVE_PREFIX.test(value) ||
49
+ WINDOWS_UNC_PREFIX.test(value)) {
50
+ throw pathError("Output paths must be relative to the OpenCode worktree.");
51
+ }
52
+ if (segments.includes("..")) {
53
+ throw outsideError("The output path may not traverse outside the worktree.");
54
+ }
55
+ if (kind === "file" &&
56
+ (portable.endsWith("/") || segments.at(-1) === "" || segments.at(-1) === ".")) {
57
+ throw pathError("The output path must name a file, not a directory.");
58
+ }
59
+ return portable;
60
+ }
61
+ export function isExistingPathError(error) {
62
+ return (typeof error === "object" &&
63
+ error !== null &&
64
+ "code" in error &&
65
+ error.code === "EEXIST");
66
+ }
67
+ export async function findNearestExistingAncestor(value) {
68
+ let current = path.resolve(value);
69
+ let atFilesystemRoot = false;
70
+ while (!atFilesystemRoot) {
71
+ try {
72
+ await lstat(current);
73
+ return current;
74
+ }
75
+ catch (error) {
76
+ if (!pathExistsError(error))
77
+ throw error;
78
+ }
79
+ const parent = path.dirname(current);
80
+ atFilesystemRoot = parent === current;
81
+ current = parent;
82
+ }
83
+ throw outsideError("No existing output ancestor was found.");
84
+ }
85
+ export async function assertOutputParentContained(canonicalWorktree, parent) {
86
+ let ancestor;
87
+ let canonicalAncestor;
88
+ try {
89
+ ancestor = await findNearestExistingAncestor(parent);
90
+ canonicalAncestor = await realpath(ancestor);
91
+ }
92
+ catch (error) {
93
+ if (error instanceof PluginError)
94
+ throw error;
95
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The output directory could not be inspected.", { cause: error });
96
+ }
97
+ if (!isPathInside(canonicalWorktree, canonicalAncestor)) {
98
+ throw outsideError("The output directory resolves outside the worktree.");
99
+ }
100
+ }
101
+ /** Create an output parent, then canonicalize it again to catch symlink escapes. */
102
+ export async function ensureSafeOutputParent(canonicalWorktree, parent) {
103
+ await assertOutputParentContained(canonicalWorktree, parent);
104
+ try {
105
+ await mkdir(parent, { recursive: true });
106
+ const canonicalParent = await realpath(parent);
107
+ if (!isPathInside(canonicalWorktree, canonicalParent)) {
108
+ throw outsideError("The output directory resolves outside the worktree.");
109
+ }
110
+ return canonicalParent;
111
+ }
112
+ catch (error) {
113
+ if (error instanceof PluginError)
114
+ throw error;
115
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The output directory could not be created.", { cause: error });
116
+ }
117
+ }
118
+ export async function recheckSafeOutputParent(canonicalWorktree, parent) {
119
+ let canonicalParent;
120
+ try {
121
+ canonicalParent = await realpath(parent);
122
+ }
123
+ catch (error) {
124
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The output directory could not be verified before publication.", { cause: error });
125
+ }
126
+ if (!isPathInside(canonicalWorktree, canonicalParent)) {
127
+ throw outsideError("The output directory changed to point outside the worktree.");
128
+ }
129
+ }
130
+ function utcTimestamp(value) {
131
+ if (!Number.isFinite(value.getTime()))
132
+ throw new TypeError("now must be a valid Date");
133
+ return value.toISOString().replaceAll("-", "").replaceAll(":", "").replace(".", "");
134
+ }
135
+ function safeShortId(randomId) {
136
+ const supplied = randomId?.();
137
+ const normalized = supplied?.replace(/[^A-Za-z0-9_-]/gu, "").slice(0, 12);
138
+ return normalized === undefined || normalized === ""
139
+ ? randomBytes(4).toString("hex")
140
+ : normalized;
141
+ }
142
+ function replaceWithActualExtension(relativePath, detected) {
143
+ const parsed = path.posix.parse(relativePath);
144
+ const requestedFormat = formatFromExtension(parsed.ext);
145
+ if (requestedFormat === detected.format)
146
+ return { relativePath };
147
+ const corrected = path.posix.join(parsed.dir, `${parsed.name === "" ? parsed.base : parsed.name}${detected.extension}`);
148
+ if (parsed.ext === "")
149
+ return { relativePath: corrected };
150
+ return {
151
+ relativePath: corrected,
152
+ warning: `Output extension ${parsed.ext} did not match the returned ${detected.format.toUpperCase()} bytes; the file was saved as ${detected.extension}.`,
153
+ };
154
+ }
155
+ function addOrdinalSuffix(relativePath, index, count) {
156
+ if (count === 1)
157
+ return relativePath;
158
+ const parsed = path.posix.parse(relativePath);
159
+ const width = Math.max(2, String(count).length);
160
+ return path.posix.join(parsed.dir, `${parsed.name}-${String(index + 1).padStart(width, "0")}${parsed.ext}`);
161
+ }
162
+ export function addCollisionSuffix(relativePath, collision) {
163
+ if (collision < 2 || !Number.isSafeInteger(collision)) {
164
+ throw new TypeError("collision must be an integer greater than one");
165
+ }
166
+ const parsed = path.posix.parse(relativePath);
167
+ return path.posix.join(parsed.dir, `${parsed.name}-${collision}${parsed.ext}`);
168
+ }
169
+ async function canonicalizeSourcePaths(worktree, sourcePaths) {
170
+ return Promise.all(sourcePaths.map(async (source) => {
171
+ const absolute = path.isAbsolute(source) ? path.resolve(source) : path.resolve(worktree, source);
172
+ try {
173
+ return await realpath(absolute);
174
+ }
175
+ catch {
176
+ return absolute;
177
+ }
178
+ }));
179
+ }
180
+ function assertNotSource(target, canonicalTarget, sourcePaths) {
181
+ if (sourcePaths.some((source) => sameCanonicalPath(source, target) ||
182
+ (canonicalTarget !== undefined && sameCanonicalPath(source, canonicalTarget)))) {
183
+ throw new PluginError("GENIMAGE_SOURCE_OVERWRITE_FORBIDDEN", "The output path may not overwrite a source image.");
184
+ }
185
+ }
186
+ async function inspectTarget(target, canonicalWorktree, sourcePaths) {
187
+ let stats;
188
+ try {
189
+ stats = await lstat(target);
190
+ }
191
+ catch (error) {
192
+ if (pathExistsError(error)) {
193
+ assertNotSource(target, undefined, sourcePaths);
194
+ return { exists: false, isDirectory: false };
195
+ }
196
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The output path could not be inspected.", { cause: error });
197
+ }
198
+ let canonicalTarget;
199
+ try {
200
+ canonicalTarget = await realpath(target);
201
+ }
202
+ catch (error) {
203
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The existing output path could not be resolved.", { cause: error });
204
+ }
205
+ if (!isPathInside(canonicalWorktree, canonicalTarget)) {
206
+ throw outsideError("The output path resolves outside the worktree.");
207
+ }
208
+ assertNotSource(target, canonicalTarget, sourcePaths);
209
+ return { exists: true, isDirectory: stats.isDirectory() };
210
+ }
211
+ function resolveInsideLexically(worktree, relativePath) {
212
+ const target = path.resolve(worktree, toNativeRelativePath(relativePath));
213
+ if (!isPathInside(path.resolve(worktree), target)) {
214
+ throw outsideError("The output path escapes the worktree.");
215
+ }
216
+ return target;
217
+ }
218
+ /**
219
+ * Plans non-conflicting destinations. This is advisory only: the writer still
220
+ * uses an atomic no-clobber operation to close the check/write race.
221
+ */
222
+ export async function planOutputPaths(request) {
223
+ if (request.detectedFormats.length === 0) {
224
+ return { canonicalWorktree: await realpath(request.worktree), paths: [] };
225
+ }
226
+ let canonicalWorktree;
227
+ try {
228
+ canonicalWorktree = await realpath(request.worktree);
229
+ }
230
+ catch (error) {
231
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The OpenCode worktree could not be resolved.", { cause: error });
232
+ }
233
+ const outputDirectory = assertSafeOutputRelativePath(request.outputDirectory, "directory");
234
+ const requestedOutput = request.outputPath === undefined
235
+ ? undefined
236
+ : assertSafeOutputRelativePath(request.outputPath);
237
+ const basePath = requestedOutput ??
238
+ `${outputDirectory.replace(/\/$/u, "")}/generated-${utcTimestamp(request.now ?? new Date())}-${safeShortId(request.randomId)}`;
239
+ const sourcePaths = await canonicalizeSourcePaths(request.worktree, request.sourcePaths ?? []);
240
+ // An explicit path naming a source is forbidden even when multi-image
241
+ // suffixing would otherwise make the eventual paths different.
242
+ if (requestedOutput !== undefined) {
243
+ const requestedAbsolute = resolveInsideLexically(request.worktree, requestedOutput);
244
+ let canonicalRequested;
245
+ try {
246
+ canonicalRequested = await realpath(requestedAbsolute);
247
+ const requestedStats = await lstat(requestedAbsolute);
248
+ if (requestedStats.isDirectory()) {
249
+ throw pathError("The output path points to an existing directory.");
250
+ }
251
+ }
252
+ catch (error) {
253
+ if (error instanceof PluginError)
254
+ throw error;
255
+ if (!pathExistsError(error)) {
256
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "The requested output path could not be inspected.", { cause: error });
257
+ }
258
+ }
259
+ assertNotSource(requestedAbsolute, canonicalRequested, sourcePaths);
260
+ }
261
+ const planned = [];
262
+ const reserved = new Set();
263
+ for (const [index, detected] of request.detectedFormats.entries()) {
264
+ const corrected = replaceWithActualExtension(basePath, detected);
265
+ const ordinal = addOrdinalSuffix(corrected.relativePath, index, request.detectedFormats.length);
266
+ let selected = false;
267
+ for (let collision = 1; collision < Number.MAX_SAFE_INTEGER; collision += 1) {
268
+ const relativePath = collision === 1 ? ordinal : addCollisionSuffix(ordinal, collision);
269
+ const absolutePath = resolveInsideLexically(request.worktree, relativePath);
270
+ await assertOutputParentContained(canonicalWorktree, path.dirname(absolutePath));
271
+ const inspection = await inspectTarget(absolutePath, canonicalWorktree, sourcePaths);
272
+ if (inspection.isDirectory) {
273
+ throw pathError("The output path points to an existing directory.");
274
+ }
275
+ const key = process.platform === "win32" ? absolutePath.toLowerCase() : absolutePath;
276
+ if (!inspection.exists && !reserved.has(key)) {
277
+ reserved.add(key);
278
+ planned.push({
279
+ absolutePath,
280
+ relativePath: portableRelativePath(path.relative(request.worktree, absolutePath)),
281
+ filename: path.basename(absolutePath),
282
+ warnings: corrected.warning === undefined ? [] : [corrected.warning],
283
+ collisionBaseRelativePath: ordinal,
284
+ collisionNumber: collision,
285
+ });
286
+ selected = true;
287
+ break;
288
+ }
289
+ }
290
+ if (!selected) {
291
+ throw new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", "No available output filename could be selected.");
292
+ }
293
+ }
294
+ return { canonicalWorktree, paths: planned };
295
+ }
296
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/output/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { PluginError } from "../openrouter/errors.js";
2
+ import { type DetectedImageFormat } from "../references/formats.js";
3
+ import type { ValidatedImage } from "./formats.js";
4
+ export interface SaveImagesOptions {
5
+ images: readonly ValidatedImage[];
6
+ outputPath?: string | undefined;
7
+ outputDirectory: string;
8
+ worktree: string;
9
+ sourcePaths?: readonly string[] | undefined;
10
+ signal?: AbortSignal | undefined;
11
+ now?: Date | undefined;
12
+ randomId?: (() => string) | undefined;
13
+ }
14
+ export interface SavedImage {
15
+ absolutePath: string;
16
+ relativePath: string;
17
+ filename: string;
18
+ mime: DetectedImageFormat["mime"];
19
+ bytes: number;
20
+ data: Buffer;
21
+ detected: DetectedImageFormat;
22
+ warnings: string[];
23
+ }
24
+ export declare class ImageSaveError extends PluginError {
25
+ readonly savedImages: readonly SavedImage[];
26
+ constructor(error: PluginError, savedImages: readonly SavedImage[]);
27
+ }
28
+ /**
29
+ * Saves validated images in response order. If a later write fails, the thrown
30
+ * ImageSaveError exposes already published images for partial-success handling.
31
+ */
32
+ export declare function saveImages(options: SaveImagesOptions): Promise<SavedImage[]>;
33
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/output/writer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAiB,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAUlD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAC3C,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IAChC,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;gBAE/B,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,UAAU,EAAE;CAYnE;AA8ID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiDlF"}
@@ -0,0 +1,176 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { link, open, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { PluginError, isPluginError } from "../openrouter/errors.js";
5
+ import { detectImageFormat } from "../references/formats.js";
6
+ import { isAbortError, throwIfAborted } from "../utils/abort.js";
7
+ import { addCollisionSuffix, ensureSafeOutputParent, isExistingPathError, planOutputPaths, recheckSafeOutputParent, } from "./paths.js";
8
+ export class ImageSaveError extends PluginError {
9
+ savedImages;
10
+ constructor(error, savedImages) {
11
+ super(error.code, error.message, {
12
+ details: {
13
+ ...(error.details ?? {}),
14
+ savedCount: savedImages.length,
15
+ },
16
+ ...(error.suggestion === undefined ? {} : { suggestion: error.suggestion }),
17
+ cause: error,
18
+ });
19
+ this.name = "ImageSaveError";
20
+ this.savedImages = [...savedImages];
21
+ }
22
+ }
23
+ const NEVER_ABORTED = new AbortController().signal;
24
+ function outputWriteError(message, cause) {
25
+ return new PluginError("GENIMAGE_OUTPUT_WRITE_FAILED", message, { cause });
26
+ }
27
+ function validatedActualImage(image) {
28
+ const actual = detectImageFormat(image.bytes);
29
+ if (actual === undefined) {
30
+ throw new PluginError("GENIMAGE_IMAGE_INVALID", "An output image failed binary format validation before it was saved.");
31
+ }
32
+ const warnings = [...(image.warnings ?? [])];
33
+ if (actual.format !== image.detected.format) {
34
+ warnings.push(`Output metadata said ${image.detected.format.toUpperCase()}, but the bytes are ${actual.format.toUpperCase()}; the binary format was used.`);
35
+ }
36
+ return { bytes: image.bytes, detected: actual, warnings };
37
+ }
38
+ async function removeTemporaryFile(temporaryPath) {
39
+ try {
40
+ await unlink(temporaryPath);
41
+ }
42
+ catch (error) {
43
+ if (typeof error !== "object" ||
44
+ error === null ||
45
+ !("code" in error) ||
46
+ error.code !== "ENOENT") {
47
+ throw error;
48
+ }
49
+ }
50
+ }
51
+ async function writeCompleteTemporaryFile(temporaryPath, bytes, signal) {
52
+ let handle;
53
+ try {
54
+ handle = await open(temporaryPath, "wx", 0o600);
55
+ throwIfAborted(signal);
56
+ await handle.writeFile(bytes);
57
+ throwIfAborted(signal);
58
+ await handle.sync();
59
+ }
60
+ finally {
61
+ await handle?.close();
62
+ }
63
+ }
64
+ function withCollision(originalAbsolute, originalRelative, collision) {
65
+ const relativePath = addCollisionSuffix(originalRelative, collision);
66
+ const absolutePath = path.resolve(path.dirname(originalAbsolute), path.basename(relativePath));
67
+ return { absolutePath, relativePath, filename: path.basename(absolutePath) };
68
+ }
69
+ async function publishOne(initial, image, canonicalWorktree, signal) {
70
+ const lexicalParent = path.dirname(initial.absolutePath);
71
+ const parent = await ensureSafeOutputParent(canonicalWorktree, lexicalParent);
72
+ throwIfAborted(signal);
73
+ const canonicalInitial = {
74
+ absolutePath: path.join(parent, initial.filename),
75
+ relativePath: initial.relativePath,
76
+ filename: initial.filename,
77
+ };
78
+ const temporaryPath = path.join(parent, `.${initial.filename}.${randomUUID()}.tmp`);
79
+ try {
80
+ await writeCompleteTemporaryFile(temporaryPath, image.bytes, signal);
81
+ let destination = canonicalInitial;
82
+ for (let collision = initial.collisionNumber; collision < Number.MAX_SAFE_INTEGER; collision += 1) {
83
+ throwIfAborted(signal);
84
+ await recheckSafeOutputParent(canonicalWorktree, parent);
85
+ try {
86
+ // Linking a complete same-directory temporary file is atomic and, in
87
+ // contrast to rename on POSIX, is guaranteed not to replace a target.
88
+ await link(temporaryPath, destination.absolutePath);
89
+ try {
90
+ await removeTemporaryFile(temporaryPath);
91
+ }
92
+ catch {
93
+ // Publication succeeded. Cleanup is retried in finally and must not
94
+ // turn a complete, visible result into a reported write failure.
95
+ }
96
+ return {
97
+ absolutePath: destination.absolutePath,
98
+ relativePath: destination.relativePath,
99
+ filename: destination.filename,
100
+ mime: image.detected.mime,
101
+ bytes: image.bytes.byteLength,
102
+ data: image.bytes,
103
+ detected: image.detected,
104
+ warnings: [...(image.warnings ?? [])],
105
+ };
106
+ }
107
+ catch (error) {
108
+ if (!isExistingPathError(error))
109
+ throw error;
110
+ destination = withCollision(canonicalInitial.absolutePath, initial.collisionBaseRelativePath, collision + 1);
111
+ }
112
+ }
113
+ throw new Error("output filename collision limit exhausted");
114
+ }
115
+ catch (error) {
116
+ if (signal.aborted || isAbortError(error))
117
+ throw error;
118
+ if (isPluginError(error))
119
+ throw error;
120
+ throw outputWriteError("The generated image could not be written atomically.", error);
121
+ }
122
+ finally {
123
+ try {
124
+ await removeTemporaryFile(temporaryPath);
125
+ }
126
+ catch {
127
+ // The intended final path is either absent or fully published. A failed
128
+ // cleanup is deliberately not allowed to mask that primary outcome.
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Saves validated images in response order. If a later write fails, the thrown
134
+ * ImageSaveError exposes already published images for partial-success handling.
135
+ */
136
+ export async function saveImages(options) {
137
+ const signal = options.signal ?? NEVER_ABORTED;
138
+ throwIfAborted(signal);
139
+ if (options.images.length === 0) {
140
+ throw new PluginError("GENIMAGE_IMAGE_INVALID", "No valid generated images were available to save.");
141
+ }
142
+ const images = options.images.map(validatedActualImage);
143
+ const plan = await planOutputPaths({
144
+ worktree: options.worktree,
145
+ outputDirectory: options.outputDirectory,
146
+ ...(options.outputPath === undefined ? {} : { outputPath: options.outputPath }),
147
+ detectedFormats: images.map((image) => image.detected),
148
+ ...(options.sourcePaths === undefined ? {} : { sourcePaths: options.sourcePaths }),
149
+ ...(options.now === undefined ? {} : { now: options.now }),
150
+ ...(options.randomId === undefined ? {} : { randomId: options.randomId }),
151
+ });
152
+ const saved = [];
153
+ try {
154
+ for (const [index, image] of images.entries()) {
155
+ const destination = plan.paths[index];
156
+ if (destination === undefined) {
157
+ throw outputWriteError("An output destination could not be planned.", new Error("missing output path"));
158
+ }
159
+ const result = await publishOne(destination, {
160
+ ...image,
161
+ warnings: [...(image.warnings ?? []), ...destination.warnings],
162
+ }, plan.canonicalWorktree, signal);
163
+ saved.push(result);
164
+ }
165
+ return saved;
166
+ }
167
+ catch (error) {
168
+ if (signal.aborted || isAbortError(error))
169
+ throw error;
170
+ const pluginError = isPluginError(error)
171
+ ? error
172
+ : outputWriteError("The generated image could not be saved.", error);
173
+ throw new ImageSaveError(pluginError, saved);
174
+ }
175
+ }
176
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/output/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { OpenRouterInputReference } from "../openrouter/schemas.js";
2
+ import { type DetectedImageFormat } from "./formats.js";
3
+ import { type ReferenceLimits } from "./limits.js";
4
+ export interface MessageAttachmentReference {
5
+ type: "message_attachment";
6
+ index: number;
7
+ }
8
+ export interface ProjectFileReference {
9
+ type: "project_file";
10
+ path: string;
11
+ }
12
+ export interface HttpsUrlReference {
13
+ type: "https_url";
14
+ url: string;
15
+ }
16
+ export type ImageReference = MessageAttachmentReference | ProjectFileReference | HttpsUrlReference;
17
+ export interface OpenCodeFilePart {
18
+ type: "file";
19
+ mime: string;
20
+ filename?: string;
21
+ url: string;
22
+ }
23
+ interface OpenCodeMessageData {
24
+ info: {
25
+ role: "user" | "assistant";
26
+ parentID?: string;
27
+ };
28
+ parts: Array<OpenCodeFilePart | {
29
+ type: string;
30
+ [key: string]: unknown;
31
+ }>;
32
+ }
33
+ export interface OpenCodeMessageClient {
34
+ session: {
35
+ message(options: {
36
+ path: {
37
+ id: string;
38
+ messageID: string;
39
+ };
40
+ query?: {
41
+ directory?: string;
42
+ };
43
+ signal?: AbortSignal;
44
+ }): Promise<{
45
+ data?: OpenCodeMessageData;
46
+ error?: unknown;
47
+ }>;
48
+ };
49
+ }
50
+ export interface ReferenceToolContext {
51
+ sessionID: string;
52
+ messageID: string;
53
+ directory: string;
54
+ worktree: string;
55
+ abort: AbortSignal;
56
+ }
57
+ export interface ResolvedReference {
58
+ source: ImageReference["type"];
59
+ openRouterReference: OpenRouterInputReference;
60
+ byteLength?: number;
61
+ detected?: DetectedImageFormat;
62
+ canonicalSourcePath?: string;
63
+ }
64
+ export interface ResolveReferencesOptions {
65
+ references: readonly ImageReference[] | undefined;
66
+ context: ReferenceToolContext;
67
+ client: OpenCodeMessageClient;
68
+ serverUrl: URL;
69
+ limits: ReferenceLimits;
70
+ promptLength: number;
71
+ fetch?: typeof globalThis.fetch;
72
+ }
73
+ export interface ResolvedReferences {
74
+ references: ResolvedReference[];
75
+ inputReferences: OpenRouterInputReference[];
76
+ canonicalSourcePaths: ReadonlySet<string>;
77
+ localBytes: number;
78
+ }
79
+ export declare function getCurrentUserImageParts(client: OpenCodeMessageClient, context: ReferenceToolContext): Promise<OpenCodeFilePart[]>;
80
+ export declare function resolveImageReferences(options: ResolveReferencesOptions): Promise<ResolvedReferences>;
81
+ export {};
82
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/references/attachments.ts"],"names":[],"mappings":"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"}