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 +12 -0
- package/README.md +48 -7
- package/dist/src/cli.js +28 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/connector.d.ts +3 -1
- package/dist/src/connector.js +319 -3
- package/dist/src/connector.js.map +1 -1
- package/dist/src/consult-job-store.js +20 -1
- package/dist/src/consult-job-store.js.map +1 -1
- package/dist/src/contract.d.ts +28 -0
- package/dist/src/contract.js +26 -0
- package/dist/src/contract.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js +6 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/generated-image-files.d.ts +29 -0
- package/dist/src/generated-image-files.js +142 -0
- package/dist/src/generated-image-files.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-server.d.ts +4 -3
- package/dist/src/mcp-server.js +13 -2
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/page-bridge.d.ts +1 -1
- package/dist/src/page-bridge.js +218 -6
- package/dist/src/page-bridge.js.map +1 -1
- package/dist/src/runtime-error-store.d.ts +31 -1
- package/dist/src/runtime-error-store.js +6 -0
- package/dist/src/runtime-error-store.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/ai-installer-setup-contract.md +1 -1
- package/package.json +2 -2
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
|
[](https://www.npmjs.com/package/gpt-connector)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
|
|
6
|
-
Codex開発枠から、ログイン済みChatGPT公式Web runtimeの通常Chat
|
|
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
|
-
|
|
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.
|
|
199
|
-
7.
|
|
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
|
-
|
|
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();
|
package/dist/src/cli.js.map
CHANGED
|
@@ -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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"}
|
package/dist/src/connector.d.ts
CHANGED
|
@@ -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;
|
package/dist/src/connector.js
CHANGED
|
@@ -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
|
}
|