gpt-connector 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 — 2026-07-17
4
+
5
+ - ChatGPT通常枠の画像生成を正式機能化し、CLI `image` とMCP `chatgpt_image` を追加した。
6
+ - 生成画像はserver conversationの同一turnとLibraryの`origination` metadataを相関し、MIME、byte数、
7
+ dimensions、SHA-256を照合してから256KiB chunkでローカルへ回収する。
8
+ - 保存先をabsolute `workspaceRoot` 配下へ限定し、root外symlink、既存file上書き、MIME/拡張子不一致を
9
+ fail-closedで拒否する。複数枚は決定的suffixで保存する。
10
+ - 画像jobを既存slug台帳と`sessions`回収へ統合し、会話は成功・失敗ともarchiveする。local保存とdigest
11
+ 再検証後、生成元だけをChatGPT LibraryのRecently Deletedへsoft-deleteし、失敗/partialも結果へ明示する。
12
+ - 画像jobはrequested model/effortとassistantのresolved metadataの完全一致を必須にし、runtime側の暗黙model
13
+ 変更を`MODEL_RESOLUTION_MISMATCH`で拒否する。
14
+
3
15
  ## 0.3.1 — 2026-07-14
4
16
 
5
17
  - live browser launcherがmacOS専用である契約に合わせ、LinuxとWindowsのfactory diagnosticsを
package/README.md CHANGED
@@ -3,14 +3,14 @@
3
3
  [![npm version](https://img.shields.io/npm/v/gpt-connector.svg)](https://www.npmjs.com/package/gpt-connector)
4
4
  [![license](https://img.shields.io/npm/l/gpt-connector.svg)](LICENSE)
5
5
 
6
- Codex開発枠から、ログイン済みChatGPT公式Web runtimeの通常Chatを呼び出すローカルconnector。
6
+ Codex開発枠から、ログイン済みChatGPT公式Web runtimeの通常Chatと画像生成を呼び出すローカルconnector。
7
7
 
8
8
  ブラウザは認証・integrity・attestation・conversation lifecycleの実行環境として使う。composer、送信button、回答DOM、React fiberは操作・参照しない。
9
9
 
10
10
  > [!WARNING]
11
11
  > consumer Chatの非公開Web runtimeとminified bundleに依存する実験的実装。OpenAIの公開・安定APIではない。bundle contractが変わった場合は`RUNTIME_DRIFT`で停止し、別方式へ自動fallbackしない。
12
12
 
13
- 現在版は[`gpt-connector@0.3.0`](https://www.npmjs.com/package/gpt-connector)。ソースと変更履歴は[GitHub repository](https://github.com/kitepon-rgb/gpt-connector)を正とする。
13
+ 現在ソース版は`gpt-connector@0.4.0`。公開済みversionは[npm](https://www.npmjs.com/package/gpt-connector)、ソースと変更履歴は[GitHub repository](https://github.com/kitepon-rgb/gpt-connector)を正とする。
14
14
 
15
15
  ## 成立済み機能
16
16
 
@@ -19,6 +19,7 @@ Codex開発枠から、ログイン済みChatGPT公式Web runtimeの通常Chat
19
19
  - explicit closeとserver archive read-back。
20
20
  - live model catalog取得。
21
21
  - model/thinking effort明示選択。
22
+ - ChatGPT通常枠の画像生成、Library相関read-back、安全なローカル保存。
22
23
  - Work-only modelの除外。
23
24
  - 非対応model/effortの送信前拒否。
24
25
  - 全regular fileのChatGPT正規添付。known extensionは標準MIME、unknown extensionは`application/octet-stream`。
@@ -100,6 +101,22 @@ gpt-connector chat \
100
101
 
101
102
  CLIの`chat`はone-shot専用。`consult` jobはdurable台帳へ残るため、別processの`sessions`から回収できる。複数turnの会話sessionはMCP adapterを使う。
102
103
 
104
+ ChatGPT通常枠で画像を生成してworkspaceへ保存する。この経路はOpenAI APIを呼ばず、
105
+ `OPENAI_API_KEY`も使わない。利用可否と生成枠は、専用ChromeへログインしたChatGPT accountのplanに従う。
106
+
107
+ ```bash
108
+ gpt-connector image \
109
+ --endpoint http://127.0.0.1:9223 \
110
+ --workspace-root "$PWD" \
111
+ --output 'assets/generated/ad.png' \
112
+ --prompt '白い背景に珊瑚色の円を置いた縦長広告素材' \
113
+ --slug image-ad-001 \
114
+ --model gpt-5-6-thinking \
115
+ --effort min
116
+ ```
117
+
118
+ caller timeout後は同じ画像promptを再送せず、`sessions --slug image-ad-001`でterminal stateを回収する。
119
+
103
120
  正規添付のdry-run:
104
121
 
105
122
  ```bash
@@ -179,7 +196,7 @@ startup_timeout_sec = 20
179
196
  tool_timeout_sec = 240
180
197
  enabled = true
181
198
  required = false
182
- enabled_tools = ["chatgpt_models", "chatgpt_chat", "chatgpt_close", "consult", "sessions", "diagnostics"]
199
+ enabled_tools = ["chatgpt_models", "chatgpt_chat", "chatgpt_image", "chatgpt_close", "consult", "sessions", "diagnostics"]
183
200
 
184
201
  [mcp_servers.gpt_connector.env]
185
202
  GPT_CONNECTOR_CDP_ENDPOINT = "http://127.0.0.1:9223"
@@ -195,13 +212,15 @@ GPT_CONNECTOR_STATE_DIR = "/absolute/product-owned/state/gpt-connector"
195
212
  3. `.codex/config.toml`を置いたprojectで新しいCodex taskを開く。
196
213
  4. `chatgpt_models`でlive catalogを確認する。
197
214
  5. second opinionはcaller既知slugを付けて`consult`を呼ぶ。
198
- 6. timeout時は再送せず、同じslugを`sessions`へ渡す。
199
- 7. 既存互換の複数turnで`keepOpen=true`を使った場合は、最後に`chatgpt_close`を呼ぶ。
215
+ 6. 画像生成はcaller既知slug、model、absolute `workspaceRoot`、relative `output`を付けて`chatgpt_image`を呼ぶ。
216
+ 7. timeout時は再送せず、同じslugを`sessions`へ渡す。
217
+ 8. 既存互換の複数turnで`keepOpen=true`を使った場合は、最後に`chatgpt_close`を呼ぶ。
200
218
 
201
219
  MCP tools:
202
220
 
203
221
  - `chatgpt_models`: 通常Chat model/effort一覧。
204
222
  - `chatgpt_chat`: 新規またはsession継続。既定`keepOpen=false`で応答後archive。
223
+ - `chatgpt_image`: 通常枠で画像を生成し、同一turnのLibrary fileを検証してworkspaceへ保存。
205
224
  - `chatgpt_close`: sessionをarchiveしてhandleを破棄。deleteは行わない。
206
225
  - `consult`: slug冪等化、任意の正規添付、model/effort、dry-runを持つsecond opinion入口。
207
226
  - `sessions`: exact slug 1件の状態/terminal resultを返す。uploadや会話を作らず、connector未起動時は台帳を直接読む。
@@ -223,6 +242,20 @@ MCP tools:
223
242
 
224
243
  詳細は[`docs/native-attachment-contract.md`](docs/native-attachment-contract.md)。
225
244
 
245
+ ## image generation contract
246
+
247
+ - `model`は必須。live catalogにないmodel/effortへfallbackせず、runtimeのresolved model/effortが
248
+ requested selectionと完全一致しない場合も`MODEL_RESOLUTION_MISMATCH`で失敗する。
249
+ - connectorが画像生成を明示する指示を加え、実画像が生成されなければ`IMAGE_NOT_GENERATED`で失敗する。
250
+ - Libraryの「最新画像」は使わない。server conversationの同一`turn_exchange_id`/`working_turn_id`に属する
251
+ tool messageと、Libraryの`origination_thread_id`/`origination_message_id`が一致した画像だけを回収する。
252
+ - MIME、byte数、dimensions、SHA-256をpage側とNode側で照合し、256KiB chunkで転送する。
253
+ - `workspaceRoot`はabsolute directory、`output`はその配下のrelative `.png`/`.jpg`/`.jpeg`/`.webp` path。
254
+ - root外path/symlink、MIMEと拡張子の不一致、既存file上書きを拒否する。複数枚は`name-2.png`のように保存する。
255
+ - local保存とdigest再検証が完了してから、生成元だけをChatGPT LibraryのRecently Deletedへ移す。
256
+ 成功時は`retention=recently_deleted`/`cleanup=soft_deleted`、失敗時は`library`/`failed`、
257
+ 複数枚の一部だけ成功した場合は`mixed`/`partial`を返す。
258
+
226
259
  ## model/effort contract
227
260
 
228
261
  - catalogは毎回公式`/models` runtimeから取得する。
@@ -242,7 +275,7 @@ MCP tools:
242
275
  - one-shotと`chatgpt_close`はserverの`is_archived=true`をread-backしてから成功を返す。
243
276
  - delete機能はない。
244
277
 
245
- `consult` jobは別契約:
278
+ `consult`/`chatgpt_image` jobは別契約:
246
279
 
247
280
  - callerが`^[a-z0-9][a-z0-9._-]{2,63}$`のslugを事前指定する。
248
281
  - 同slug/同fingerprintは既存snapshotを返し、再upload/再送しない。
@@ -259,6 +292,7 @@ MCP tools:
259
292
  - `RUNTIME_DRIFT`
260
293
  - `MODEL_NOT_AVAILABLE`
261
294
  - `EFFORT_NOT_SUPPORTED`
295
+ - `MODEL_RESOLUTION_MISMATCH`
262
296
  - `FILE_NOT_FOUND`
263
297
  - `FILE_OUTSIDE_ROOT`
264
298
  - `SENSITIVE_FILE_BLOCKED`
@@ -268,6 +302,11 @@ MCP tools:
268
302
  - `UPLOAD_FAILED`
269
303
  - `UPLOAD_TIMEOUT`
270
304
  - `ATTACHMENT_READBACK_FAILED`
305
+ - `IMAGE_NOT_GENERATED`
306
+ - `IMAGE_READBACK_FAILED`
307
+ - `IMAGE_DOWNLOAD_FAILED`
308
+ - `IMAGE_OUTPUT_FAILED`
309
+ - `IMAGE_CLEANUP_FAILED`
271
310
  - `CHAT_FAILED`
272
311
  - `STREAM_INCOMPLETE`
273
312
  - `SESSION_NOT_FOUND`
@@ -284,6 +323,7 @@ MCP tools:
284
323
  - server conversation IDをtool resultやlogへ出さない。
285
324
  - prompt、file本文、absolute pathをlogやjob台帳へ保存しない。
286
325
  - terminal assistant responseはcaller timeout後の回収に必要なため、fingerprint/状態/結果とともにowner-only job台帳へ保存する。
326
+ - 画像job台帳はrelative出力path、MIME、byte数、dimensions、SHA-256だけを保存し、Library ID、conversation ID、content URL、absolute pathを保存しない。
287
327
  - job台帳は製品所有state directoryに置き、他ツールの管理directoryやhookへ便乗しない。
288
328
  - `.browser-profile/`、log、temporary dumpはgit管理外。
289
329
 
@@ -294,7 +334,8 @@ Codex ──stdio MCP──> resolver/job store ──> GptConnector core ─
294
334
  │ │
295
335
  └─ slug status ├─ official upload client
296
336
  ├─ builder/sender
297
- └─ state/server read-back
337
+ ├─ Library/server turn read-back
338
+ └─ verified image chunk download
298
339
  ```
299
340
 
300
341
  runtime roleは上限付きasset import graph、function source signature、object method shape、read-only catalog probeで一意検出する。候補が0件または複数なら実行しない。DOM selector、file input、React fiber、座標操作は本番経路に含まない。
package/dist/src/cli.js CHANGED
@@ -60,7 +60,7 @@ function writeJson(value) {
60
60
  async function main() {
61
61
  const argv = process.argv.slice(2);
62
62
  if (argv.length === 0 || argv[0] === "--help" || argv[0] === "help") {
63
- process.stdout.write("usage: gpt-connector --version | browser <start|show> | models | doctor | factory-diagnostics --json | chat --prompt <text> | consult --prompt <text> --slug <id> | sessions --slug <id> | close --session-id <uuid>\n");
63
+ process.stdout.write("usage: gpt-connector --version | browser <start|show> | models | doctor | factory-diagnostics --json | chat --prompt <text> | image --prompt <text> --slug <id> --workspace-root <abs> --output <relative.png> --model <id> | consult --prompt <text> --slug <id> | sessions --slug <id> | close --session-id <uuid>\n");
64
64
  return;
65
65
  }
66
66
  if (argv[0] === "runtime-errors") {
@@ -131,6 +131,32 @@ async function main() {
131
131
  writeJson(result);
132
132
  return;
133
133
  }
134
+ if (command === "image") {
135
+ const prompt = stringArg(values, "prompt");
136
+ const slug = stringArg(values, "slug");
137
+ const workspaceRoot = stringArg(values, "workspace-root");
138
+ const output = stringArg(values, "output");
139
+ const model = stringArg(values, "model");
140
+ if (prompt === undefined ||
141
+ slug === undefined ||
142
+ workspaceRoot === undefined ||
143
+ output === undefined ||
144
+ model === undefined) {
145
+ throw new Error("imageには--prompt、--slug、--workspace-root、--output、--modelが必要です。");
146
+ }
147
+ const result = await connector.image({
148
+ prompt,
149
+ slug,
150
+ workspaceRoot,
151
+ output,
152
+ model,
153
+ effort: stringArg(values, "effort"),
154
+ });
155
+ writeJson(result);
156
+ if (result.state === "failed")
157
+ process.exitCode = 1;
158
+ return;
159
+ }
134
160
  if (command === "consult") {
135
161
  const prompt = stringArg(values, "prompt");
136
162
  const slug = stringArg(values, "slug");
@@ -156,7 +182,7 @@ async function main() {
156
182
  writeJson(await connector.closeSession({ sessionId }));
157
183
  return;
158
184
  }
159
- throw new Error("usage: gpt-connector --version | models | doctor | chat --prompt <text> | consult --prompt <text> --slug <id> [--workspace-root <abs> --file <spec> ...] [--model <id> --effort <id>] [--dry-run] | sessions --slug <id> | close --session-id <uuid>");
185
+ throw new Error("usage: gpt-connector --version | models | doctor | chat --prompt <text> | image --prompt <text> --slug <id> --workspace-root <abs> --output <relative.png> --model <id> [--effort <id>] | consult --prompt <text> --slug <id> [--workspace-root <abs> --file <spec> ...] [--model <id> --effort <id>] [--dry-run] | sessions --slug <id> | close --session-id <uuid>");
160
186
  }
161
187
  finally {
162
188
  connector.close();
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { type ChatInput, type ChatResult, type CloseInput, type CloseResult, type ConnectorDiagnostics, type ConsultDryRunResult, type ConsultInput, type ConsultSnapshot, type ModelCatalog, type SessionsInput } from "./contract.js";
1
+ import { type ChatInput, type ChatResult, type CloseInput, type CloseResult, type ConnectorDiagnostics, type ConsultDryRunResult, type ConsultInput, type ConsultSnapshot, type ImageInput, type ImageSnapshot, type ModelCatalog, type SessionsInput } from "./contract.js";
2
+ export declare function imageResolutionMatches(requestedModel: string, requestedEffort: string | undefined, resolvedModel: string | null, resolvedEffort: string | null): boolean;
2
3
  export interface ConnectorOptions {
3
4
  readonly endpoint?: string;
4
5
  /** 有界なread-only readiness probeだけが差し替える内部transport。 */
@@ -20,6 +21,7 @@ export declare class GptConnector {
20
21
  diagnostics(): Promise<ConnectorDiagnostics>;
21
22
  chat(input: ChatInput): Promise<ChatResult>;
22
23
  consult(input: ConsultInput): Promise<ConsultSnapshot | ConsultDryRunResult>;
24
+ image(input: ImageInput): Promise<ImageSnapshot>;
23
25
  sessions(input: SessionsInput): ConsultSnapshot;
24
26
  closeSession(input: CloseInput): Promise<CloseResult>;
25
27
  close(): void;
@@ -4,7 +4,8 @@ import { z } from "zod";
4
4
  import { attachmentLimits, prepareAttachmentFiles, } from "./attachment-files.js";
5
5
  import { discoverRuntimeAssets, listLoadedAssetUrls } from "./asset-discovery.js";
6
6
  import { CdpClient, discoverChatGptTarget } from "./cdp.js";
7
- import { chatInputSchema, closeInputSchema, consultInputSchema, sessionsInputSchema, } from "./contract.js";
7
+ import { chatInputSchema, closeInputSchema, consultInputSchema, imageInputSchema, sessionsInputSchema, } from "./contract.js";
8
+ import { prepareGeneratedImageOutput, writeGeneratedImageFiles, } from "./generated-image-files.js";
8
9
  import { ConsultJobStore } from "./consult-job-store.js";
9
10
  import { ConnectorError, connectorErrorCodes, } from "./errors.js";
10
11
  import { validateModelSelection } from "./model-catalog.js";
@@ -52,6 +53,27 @@ const attachmentSummarySchema = z.object({
52
53
  const bridgeChatResultSchema = chatResultSchema.extend({
53
54
  attachments: attachmentSummarySchema,
54
55
  });
56
+ const bridgeGeneratedImageSchema = z.object({
57
+ downloadHandle: z.string().uuid(),
58
+ mimeType: z.string().startsWith("image/"),
59
+ bytes: z.number().int().positive(),
60
+ sha256: z.string().regex(/^[0-9a-f]{64}$/u),
61
+ width: z.number().int().positive().nullable(),
62
+ height: z.number().int().positive().nullable(),
63
+ });
64
+ const bridgeImageResultSchema = z.object({
65
+ text: z.string(),
66
+ status: z.string(),
67
+ endTurn: z.literal(true),
68
+ resolvedModel: z.string().nullable(),
69
+ resolvedEffort: z.string().nullable(),
70
+ attachments: attachmentSummarySchema,
71
+ images: z.array(bridgeGeneratedImageSchema).min(1),
72
+ });
73
+ export function imageResolutionMatches(requestedModel, requestedEffort, resolvedModel, resolvedEffort) {
74
+ return resolvedModel === requestedModel
75
+ && (requestedEffort === undefined || resolvedEffort === requestedEffort);
76
+ }
55
77
  const uploadHandleSchema = z.object({ uploadHandle: z.string().uuid() });
56
78
  const uploadChunkResultSchema = z.object({ receivedBytes: z.number().int().nonnegative() });
57
79
  const uploadResultSchema = z.object({
@@ -61,12 +83,23 @@ const uploadResultSchema = z.object({
61
83
  mimeType: z.string(),
62
84
  });
63
85
  const uploadChunkBytes = 256 * 1024;
86
+ const downloadChunkBytes = 256 * 1024;
87
+ const downloadChunkSchema = z.object({
88
+ base64Chunk: z.string().min(1),
89
+ offset: z.number().int().nonnegative(),
90
+ bytes: z.number().int().positive(),
91
+ totalBytes: z.number().int().positive(),
92
+ });
93
+ const discardDownloadSchema = z.object({ discarded: z.literal(true) });
94
+ const softDeleteDownloadSchema = z.object({ softDeleted: z.literal(true) });
64
95
  const closeResultSchema = z.object({ archived: z.literal(true) });
65
96
  const pageDiagnosticsSchema = z.object({
66
97
  sessionCount: z.number().int().nonnegative(),
67
98
  operationCount: z.number().int().nonnegative(),
68
99
  uploadCount: z.number().int().nonnegative(),
69
100
  bufferedUploadBytes: z.number().int().nonnegative(),
101
+ downloadCount: z.number().int().nonnegative(),
102
+ bufferedDownloadBytes: z.number().int().nonnegative(),
70
103
  });
71
104
  export class GptConnector {
72
105
  #client;
@@ -122,6 +155,8 @@ export class GptConnector {
122
155
  operationCount: null,
123
156
  uploadCount: null,
124
157
  bufferedUploadBytes: null,
158
+ downloadCount: null,
159
+ bufferedDownloadBytes: null,
125
160
  jobCount: null,
126
161
  activeJobCount: null,
127
162
  terminalJobCount: null,
@@ -209,6 +244,28 @@ export class GptConnector {
209
244
  }
210
245
  return this.#runConsultJob(parsed, prepared.files);
211
246
  }
247
+ async image(input) {
248
+ let parsed;
249
+ try {
250
+ parsed = imageInputSchema.parse(input);
251
+ }
252
+ catch {
253
+ throw new ConnectorError("INVALID_INPUT", "image inputが公開schemaに一致しません。");
254
+ }
255
+ const catalog = await this.models();
256
+ validateModelSelection(catalog, parsed.model, parsed.effort);
257
+ const fingerprint = imageFingerprint({
258
+ prompt: parsed.prompt,
259
+ workspaceRoot: parsed.workspaceRoot,
260
+ output: parsed.output,
261
+ model: parsed.model,
262
+ effort: parsed.effort ?? null,
263
+ });
264
+ const reservation = await this.#jobs.reserve(parsed.slug, fingerprint);
265
+ if (!reservation.created)
266
+ return reservation.snapshot;
267
+ return this.#runImageJob(parsed);
268
+ }
212
269
  sessions(input) {
213
270
  let parsed;
214
271
  try {
@@ -282,6 +339,239 @@ export class GptConnector {
282
339
  });
283
340
  }
284
341
  }
342
+ async #runImageJob(parsed) {
343
+ let images = [];
344
+ let downloadsDiscarded = false;
345
+ try {
346
+ await prepareGeneratedImageOutput({
347
+ workspaceRoot: parsed.workspaceRoot,
348
+ output: parsed.output,
349
+ });
350
+ await this.#jobs.transition(parsed.slug, "submitted");
351
+ await this.#jobs.transition(parsed.slug, "running");
352
+ const result = await this.#imageParsed(parsed);
353
+ images = await this.#downloadGeneratedImages(result.images);
354
+ const files = await writeGeneratedImageFiles({
355
+ workspaceRoot: parsed.workspaceRoot,
356
+ output: parsed.output,
357
+ images,
358
+ });
359
+ const cleanup = await this.#softDeleteGeneratedImageSources(images);
360
+ const discardFailureCount = await this.#discardGeneratedImageDownloads(images);
361
+ downloadsDiscarded = discardFailureCount === 0;
362
+ const finalCleanup = discardFailureCount === 0
363
+ ? cleanup
364
+ : {
365
+ retention: cleanup.retention === "recently_deleted" ? "recently_deleted" : "mixed",
366
+ cleanup: "failed",
367
+ };
368
+ return this.#jobs.transition(parsed.slug, "succeeded", {
369
+ result: {
370
+ text: result.text,
371
+ status: result.status,
372
+ endTurn: true,
373
+ resolvedModel: result.resolvedModel,
374
+ resolvedEffort: result.resolvedEffort,
375
+ attachments: {
376
+ count: 0,
377
+ names: [],
378
+ mimeTypes: [],
379
+ readBack: "confirmed",
380
+ retention: "unknown",
381
+ cleanup: "not_supported",
382
+ },
383
+ images: {
384
+ count: files.length,
385
+ files,
386
+ readBack: "confirmed",
387
+ ...finalCleanup,
388
+ },
389
+ archived: true,
390
+ },
391
+ error: null,
392
+ });
393
+ }
394
+ catch (error) {
395
+ const discardFailureCount = downloadsDiscarded
396
+ ? 0
397
+ : await this.#discardGeneratedImageDownloads(images);
398
+ const connectorError = discardFailureCount > 0
399
+ ? new ConnectorError("IMAGE_CLEANUP_FAILED", "image job失敗後にpage側bufferを完全破棄できませんでした。", { discardFailureCount })
400
+ : error instanceof ConnectorError
401
+ ? error
402
+ : new ConnectorError("CHAT_FAILED", "image jobが失敗しました。");
403
+ return this.#jobs.transition(parsed.slug, "failed", {
404
+ result: null,
405
+ error: {
406
+ code: connectorError.code,
407
+ message: connectorError.message,
408
+ retry: retryFor(connectorError.code),
409
+ },
410
+ });
411
+ }
412
+ finally {
413
+ for (const image of images)
414
+ image.content.fill(0);
415
+ }
416
+ }
417
+ async #imageParsed(parsed) {
418
+ const raw = await this.#runOperation("startChat", [{
419
+ prompt: imageGenerationPrompt(parsed.prompt),
420
+ model: parsed.model,
421
+ effort: parsed.effort,
422
+ keepOpen: false,
423
+ attachmentHandles: [],
424
+ imageMode: true,
425
+ }]);
426
+ const result = bridgeImageResultSchema.safeParse(raw);
427
+ if (result.success) {
428
+ if (imageResolutionMatches(parsed.model, parsed.effort, result.data.resolvedModel, result.data.resolvedEffort))
429
+ return result.data;
430
+ let cleanupFailureCount = 0;
431
+ for (const image of result.data.images) {
432
+ try {
433
+ await evaluateByValue(this.#client, createBridgeCallExpression("softDeleteDownloadSource", [image.downloadHandle]));
434
+ }
435
+ catch {
436
+ cleanupFailureCount += 1;
437
+ }
438
+ try {
439
+ await evaluateByValue(this.#client, createBridgeCallExpression("discardDownload", [image.downloadHandle]), false);
440
+ }
441
+ catch {
442
+ cleanupFailureCount += 1;
443
+ }
444
+ }
445
+ throw new ConnectorError("MODEL_RESOLUTION_MISMATCH", "画像生成のresolved modelまたはeffortがrequested selectionと一致しませんでした。", {
446
+ requestedModel: parsed.model,
447
+ resolvedModel: result.data.resolvedModel,
448
+ requestedEffort: parsed.effort ?? null,
449
+ resolvedEffort: result.data.resolvedEffort,
450
+ cleanupFailureCount,
451
+ });
452
+ }
453
+ const handles = z.array(z.object({ downloadHandle: z.string().uuid() }))
454
+ .safeParse(raw?.images);
455
+ let cleanupFailureCount = 0;
456
+ if (handles.success) {
457
+ for (const image of handles.data) {
458
+ try {
459
+ await evaluateByValue(this.#client, createBridgeCallExpression("discardDownload", [image.downloadHandle]), false);
460
+ }
461
+ catch {
462
+ cleanupFailureCount += 1;
463
+ }
464
+ }
465
+ }
466
+ throw new ConnectorError("RUNTIME_DRIFT", cleanupFailureCount === 0
467
+ ? "画像生成結果がbridge schemaに一致しませんでした。"
468
+ : "画像生成結果のschema不一致後にpage側bufferを完全破棄できませんでした。", { cleanupFailureCount });
469
+ }
470
+ async #downloadGeneratedImages(descriptors) {
471
+ const results = [];
472
+ try {
473
+ for (const descriptor of descriptors) {
474
+ const chunks = [];
475
+ try {
476
+ for (let offset = 0; offset < descriptor.bytes; offset += downloadChunkBytes) {
477
+ const length = Math.min(downloadChunkBytes, descriptor.bytes - offset);
478
+ const chunk = downloadChunkSchema.parse(await evaluateByValue(this.#client, createBridgeCallExpression("readDownloadChunk", [
479
+ descriptor.downloadHandle,
480
+ offset,
481
+ length,
482
+ ]), false));
483
+ if (chunk.offset !== offset ||
484
+ chunk.bytes !== length ||
485
+ chunk.totalBytes !== descriptor.bytes) {
486
+ throw new ConnectorError("IMAGE_DOWNLOAD_FAILED", "生成画像のchunk metadataが一致しませんでした。");
487
+ }
488
+ const bytes = Buffer.from(chunk.base64Chunk, "base64");
489
+ if (bytes.byteLength !== length) {
490
+ bytes.fill(0);
491
+ throw new ConnectorError("IMAGE_DOWNLOAD_FAILED", "生成画像のchunk byte数が一致しませんでした。");
492
+ }
493
+ chunks.push(bytes);
494
+ }
495
+ const content = Buffer.concat(chunks);
496
+ for (const chunk of chunks)
497
+ chunk.fill(0);
498
+ if (content.byteLength !== descriptor.bytes ||
499
+ createHash("sha256").update(content).digest("hex") !== descriptor.sha256) {
500
+ content.fill(0);
501
+ throw new ConnectorError("IMAGE_DOWNLOAD_FAILED", "生成画像のbyte数またはdigestが一致しませんでした。");
502
+ }
503
+ results.push({
504
+ downloadHandle: descriptor.downloadHandle,
505
+ content,
506
+ mimeType: descriptor.mimeType,
507
+ bytes: descriptor.bytes,
508
+ sha256: descriptor.sha256,
509
+ width: descriptor.width,
510
+ height: descriptor.height,
511
+ });
512
+ }
513
+ catch (error) {
514
+ for (const chunk of chunks)
515
+ chunk.fill(0);
516
+ throw error;
517
+ }
518
+ }
519
+ return results;
520
+ }
521
+ catch (error) {
522
+ for (const result of results)
523
+ result.content.fill(0);
524
+ let cleanupFailureCount = 0;
525
+ for (const descriptor of descriptors) {
526
+ try {
527
+ await evaluateByValue(this.#client, createBridgeCallExpression("discardDownload", [descriptor.downloadHandle]), false);
528
+ }
529
+ catch {
530
+ cleanupFailureCount += 1;
531
+ }
532
+ }
533
+ if (cleanupFailureCount > 0) {
534
+ throw new ConnectorError("IMAGE_DOWNLOAD_FAILED", "生成画像の回収失敗後にpage側bufferを完全破棄できませんでした。", {
535
+ cleanupFailureCount,
536
+ originalCode: error instanceof ConnectorError ? error.code : "IMAGE_DOWNLOAD_FAILED",
537
+ });
538
+ }
539
+ if (error instanceof ConnectorError)
540
+ throw error;
541
+ throw new ConnectorError("IMAGE_DOWNLOAD_FAILED", "生成画像をpageから回収できませんでした。");
542
+ }
543
+ }
544
+ async #softDeleteGeneratedImageSources(images) {
545
+ let softDeletedCount = 0;
546
+ for (const image of images) {
547
+ try {
548
+ softDeleteDownloadSchema.parse(await evaluateByValue(this.#client, createBridgeCallExpression("softDeleteDownloadSource", [image.downloadHandle])));
549
+ softDeletedCount += 1;
550
+ }
551
+ catch {
552
+ // aggregate結果へ明示し、保存済みlocal imageは成功結果として維持する。
553
+ }
554
+ }
555
+ if (softDeletedCount === images.length) {
556
+ return { retention: "recently_deleted", cleanup: "soft_deleted" };
557
+ }
558
+ if (softDeletedCount === 0) {
559
+ return { retention: "library", cleanup: "failed" };
560
+ }
561
+ return { retention: "mixed", cleanup: "partial" };
562
+ }
563
+ async #discardGeneratedImageDownloads(images) {
564
+ let failureCount = 0;
565
+ for (const image of images) {
566
+ try {
567
+ discardDownloadSchema.parse(await evaluateByValue(this.#client, createBridgeCallExpression("discardDownload", [image.downloadHandle]), false));
568
+ }
569
+ catch {
570
+ failureCount += 1;
571
+ }
572
+ }
573
+ return failureCount;
574
+ }
285
575
  async #chatParsed(parsed, attachmentHandles, selectionValidated = false) {
286
576
  if (!selectionValidated) {
287
577
  const catalog = await this.models();
@@ -553,6 +843,26 @@ function consultFingerprint(input) {
553
843
  }))
554
844
  .digest("hex");
555
845
  }
846
+ function imageFingerprint(input) {
847
+ return createHash("sha256")
848
+ .update(JSON.stringify({
849
+ kind: "image.v1",
850
+ promptSha256: createHash("sha256").update(input.prompt).digest("hex"),
851
+ workspaceRoot: input.workspaceRoot,
852
+ output: input.output,
853
+ model: input.model,
854
+ effort: input.effort,
855
+ }))
856
+ .digest("hex");
857
+ }
858
+ function imageGenerationPrompt(prompt) {
859
+ return [
860
+ "画像生成ツールを使い、次の仕様に従う画像を1枚生成してください。",
861
+ "説明文だけで終えず、必ず実画像を生成してください。",
862
+ "",
863
+ prompt,
864
+ ].join("\n");
865
+ }
556
866
  function retryFor(code) {
557
867
  if (code === "AUTH_REQUIRED")
558
868
  return "after_auth";
@@ -566,14 +876,20 @@ function retryFor(code) {
566
876
  code === "FILE_EMPTY" ||
567
877
  code === "FILE_LIMIT_EXCEEDED" ||
568
878
  code === "MODEL_NOT_AVAILABLE" ||
569
- code === "EFFORT_NOT_SUPPORTED")
879
+ code === "EFFORT_NOT_SUPPORTED"
880
+ || code === "IMAGE_OUTPUT_FAILED")
570
881
  return "after_input_change";
571
882
  if (code === "UPLOAD_TIMEOUT" ||
572
883
  code === "UPLOAD_FAILED" ||
573
884
  code === "CHAT_FAILED" ||
574
885
  code === "STREAM_INCOMPLETE" ||
575
886
  code === "ATTACHMENT_READBACK_FAILED" ||
576
- code === "JOB_RECOVERY_UNAVAILABLE")
887
+ code === "JOB_RECOVERY_UNAVAILABLE"
888
+ || code === "IMAGE_NOT_GENERATED"
889
+ || code === "IMAGE_READBACK_FAILED"
890
+ || code === "IMAGE_DOWNLOAD_FAILED"
891
+ || code === "IMAGE_CLEANUP_FAILED"
892
+ || code === "MODEL_RESOLUTION_MISMATCH")
577
893
  return "status_first";
578
894
  return "never";
579
895
  }