@eddyskywalker/dsh-chatgpt-subscription 0.2.20 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@
7
7
  - 代理偏好在运行时变化(例如系统代理 ↔ 直连)会重新选择抓取后端;选择 ChatGPT 搜索来源时同时切换搜索与抓取的行为保持不变。
8
8
  - `ProxyManager` 新增系统代理探测的观察点(`onSystemProxyDetected`):只在「从未知变为已知代理」时通知——探测失败与「本机没有代理」都读作 `null`,因此不会因为一次 `reg query` / `scutil` 抖动就把已经可用的路由拆掉。插件据此在代理迟于 DSH 出现时自动重新选择抓取后端,否则内置 provider 会一直占到进程结束。
9
9
  - 新增 `test/fetch-address-policy.test.ts`(地址分类、fake-ip 识别、私网解析拒绝、解析失败放行),并扩充 `test/codex-fetch.test.ts`、`test/search-provider-switcher.test.ts`、`test/web-provider-lifecycle.test.ts` 覆盖抓取 provider 的拒绝路径与后端切换。
10
+ - 修复 Antigravity 线路静默丢弃用户上传图片的问题(issue #5):本插件把 `gemini-*` / `claude-*` 都声明为支持图片输入,DSH 因此不把图片投影成文本,而是以 `{ type: 'image', attachment }` 的形式原样交给适配器;但 `mapper.ts` 只认内联 `data` / `base64` / `source.*`,`contentToUserParts()` 又用 `if (img) parts.push(img)` 静默跳过,于是发给 Google 的 `streamGenerateContent` 请求里只剩下文本,模型只能回答「没有收到图片」。现在 `AntigravityAdapter` 接入 `ctx.attachments`,在组装请求前把附件解析为 Gemini `inlineData`(媒体类型取自已校验的附件引用),同一附件在多条消息中只读取一次。
11
+ - 读不出字节的图片不再静默消失:降级为 `[image unavailable: …]` 文本让模型能说明图片没读到;取消(AbortSignal)仍向上抛出,不会变成模型可见的文本。工具结果中的图片同样以 `[image: 名称]` 保留,与 Codex 线路一致。
12
+ - 新增 8 条 `test/antigravity-mapper.test.ts` 用例(内联映射、跨消息去重、读取失败降级、无附件服务降级、取消传播、旧内联格式、工具结果图片标记,以及不传解析结果时默认参数仍不静默丢弃)与 3 条 `test/antigravity-adapter.test.ts` 端到端用例:`gemini-3.8-flash` 与 `claude-opus-4-6` 各断言一次真实请求体中的 `inlineData`(两个 provider 共用同一 mapper),另一条用 429 逼出候选链,断言每个 runtime model 候选都带着图片、且附件只读一次。新增 `test/antigravity-image-wire.test.ts` 做线级验证:不 mock `fetch`,改为在 127.0.0.1 上起回环服务器并把 `DSH_ANTIGRAVITY_ENDPOINT` 指向它,读取真正离开进程的请求体,断言 `contents[0].parts` 是 `[text, inlineData]`。把这三组用例跑在回退后的修复前源码上,共 12 条失败(其中线级用例显示 socket 上只剩文本),因此它们是货真价实的回归用例。再新增 `test/antigravity-image-bundle.test.ts`:issue 是在 npm 安装版上发现的,所以这条用例直接 import 打包产物 `lib/index.js`(而不是 `src`)跑同一段线级断言,证明用户装到的那个 bundle 里同样带着修复;`lib/` 是提交进仓库的生成物,源码改动后忘记 `npm run build` 时它会失败。工具结果里的图片仍只记名不内联——DSH 自己的多 provider 适配器(`llm-pi-ai`)对工具结果里的非文本块是直接丢掉的,记名已经比参照实现保留得更多,而 `functionResponse.parts` 是否被该端点接受在本地无从验证,故按「不臆造线上行为」处理,并在代码里写明理由。
13
+ - 新增单次请求的图片体积上限(`MAX_REQUEST_IMAGE_BYTES`,12 MiB base64):修复后本线路会把历史里的图片全部内联,图片多的会话会让请求体持续膨胀直到被 Google 的 20 MB 体积上限拒绝,而最先被牺牲的恰是模型最不需要的旧图。现在超过预算时按 DSH 的顺序(最旧优先)把图片替换为上游同款占位文案,`test/antigravity-mapper.test.ts` 与 `test/antigravity-adapter.test.ts` 各有一条用例覆盖(被省略的图片不会被读取,最新一张仍以 `inlineData` 发出,且不改动持久历史)。该逻辑在插件内实现而非调用 DSH 的 `offloadRequestImagesWithPolicy`:本插件支持的 DSH 区间里这个符号的形态发生了不兼容变化(`OFFLOADED_IMAGE_TEXT` 常量 → `offloadedImageText()` 函数;`offloadRequestImages()` 在 0.1.5-rc.1 被移除;`placeholder` 由可选变必填),绑定任一形态都会重演 issue #4 那种"在某个受支持版本上直接加载失败"。
14
+ - 修正 `test/subagent-model-authorization.test.ts` 的守卫类型:Host 工具注册表登记的是单参数 `ToolGuard`(`@deepseek-ai/dsh-tools`),测试却按插件内部的三参数 `DelegationGuard` 别名调用,导致 `npm run typecheck` 长期以 TS2554 失败。模拟注册表改为按真实契约取类型后,仓库自带的 `npm run typecheck` 恢复通过。
10
15
 
11
16
  ## 0.2.15 - 2026-09-11
12
17
 
package/README.md CHANGED
@@ -30,6 +30,7 @@
30
30
  **模型接入**
31
31
 
32
32
  - 固定 Codex Responses 地址,支持流式文本、reasoning summary、图片输入与工具调用/结果;
33
+ - Antigravity(Gemini / Claude)线路同样接受图片输入:DSH 以 `{ type: 'image', attachment }` 下发的粘贴图片会经附件服务读出字节并按 Gemini `inlineData` 发出,读不出的图片降级为一条可见的说明文本而不是被静默丢弃。单次请求的图片 base64 负载超过 12 MiB 时,最旧的图片按上游同款占位文案替换为文本,避免整条请求被体积上限拒绝;
33
34
  - 原样转发 DSH 暴露的工具 schema;命令工具兼容 `pwsh` / `powershell`、`bash`、`sh` 与 `shell`,并按 PowerShell、Bash 或 POSIX sh 注入对应说明;
34
35
  - 429/5xx 由 DSH retry policy 接管;401 只强制刷新并重试一次,支持 `AbortSignal`;
35
36
  - Codex、Code review 及上游返回的额外窗口额度,支持 Credits、月度消费控制与 reset credits 展示;60 秒缓存、15 秒上游节流并遵守 `Retry-After`;
package/lib/index.js CHANGED
@@ -5222,7 +5222,157 @@ function parseArguments(raw) {
5222
5222
  const parsed = typeof raw === "string" ? safeJsonParse(raw) : raw;
5223
5223
  return isRecord(parsed) ? parsed : {};
5224
5224
  }
5225
- function imageBlockToPart(block) {
5225
+ const NO_RESOLVED_IMAGES = /* @__PURE__ */ new Map();
5226
+ function attachmentOf(block) {
5227
+ const attachment = block.attachment;
5228
+ if (!isRecord(attachment)) return void 0;
5229
+ return typeof attachment.attachmentId === "string" ? attachment : void 0;
5230
+ }
5231
+ function attachmentLabel(block) {
5232
+ const attachment = isRecord(block.attachment) ? block.attachment : void 0;
5233
+ return asString$1(attachment?.name) || asString$1(attachment?.attachmentId);
5234
+ }
5235
+ function collectImageRefs(content, refs) {
5236
+ if (!Array.isArray(content)) return;
5237
+ for (const block of content) {
5238
+ if (!isRecord(block) || block.type !== "image") continue;
5239
+ const attachment = attachmentOf(block);
5240
+ if (attachment) refs.set(attachment.attachmentId, attachment);
5241
+ }
5242
+ }
5243
+ function isAbort(error, signal) {
5244
+ return signal?.aborted === true || error instanceof Error && error.name === "AbortError";
5245
+ }
5246
+ /**
5247
+ * Model-facing replacement for an image this route omits to stay inside its
5248
+ * request budget. The wording matches DSH's own placeholder, which this plugin
5249
+ * cannot import: that symbol moved inside the supported DSH range
5250
+ * (`OFFLOADED_IMAGE_TEXT` in 0.1.1-rc.2, the `offloadedImageText()` function in
5251
+ * 0.1.5-rc.1), `offloadRequestImages()` was removed in 0.1.5-rc.1, and
5252
+ * `offloadRequestImagesWithPolicy()` gained a required `placeholder` field.
5253
+ * Binding to either shape would break the plugin on some supported host exactly
5254
+ * the way the `CallId` export did; `host/common/brand-compat.ts` carries the
5255
+ * same lesson.
5256
+ */
5257
+ const OMITTED_IMAGE_TEXT = "[image omitted to keep the request within its image limit; older images are omitted first. If this image is still needed, read its file again when a path is available; otherwise ask the user to attach it again.]";
5258
+ /**
5259
+ * Base64 image payload one Antigravity request may carry. Google caps a request
5260
+ * carrying inline data at 20 MB, and the same body also holds the system
5261
+ * instruction, the conversation text, and the tool declarations.
5262
+ */
5263
+ const MAX_REQUEST_IMAGE_BYTES = 12 * 1024 * 1024;
5264
+ /** Base64 length of raw image bytes, including padding. */
5265
+ function base64Length(bytes) {
5266
+ return Math.ceil(bytes / 3) * 4;
5267
+ }
5268
+ /** Request payload one inline image block occupies, when it can be measured. */
5269
+ function requestImageBytes(block) {
5270
+ const attachment = attachmentOf(block);
5271
+ if (attachment) return base64Length(attachment.bytes);
5272
+ const inline = asString$1(block.data) || asString$1(block.base64);
5273
+ return inline ? inline.length : void 0;
5274
+ }
5275
+ function collectRequestImageBytes(content, lengths) {
5276
+ if (!Array.isArray(content)) return;
5277
+ for (const block of content) {
5278
+ if (!isRecord(block) || block.type !== "image") continue;
5279
+ const bytes = requestImageBytes(block);
5280
+ if (bytes !== void 0) lengths.push(bytes);
5281
+ }
5282
+ }
5283
+ /**
5284
+ * Replace the oldest inline images with a text placeholder once one request
5285
+ * would carry more than {@link MAX_REQUEST_IMAGE_BYTES} of base64 image data.
5286
+ *
5287
+ * Without this bound an image-heavy session keeps growing the request body until
5288
+ * Google rejects it, and the images that made it fail are the ones the model
5289
+ * needed least. The oldest occurrences go first, exactly as DSH's own providers
5290
+ * order them, and the placeholder tells the model the image is missing instead
5291
+ * of letting it answer as though the picture were simply blank.
5292
+ *
5293
+ * @param options - the request about to be built; durable history stays untouched.
5294
+ * @returns the original options when they already fit, otherwise shallow copies.
5295
+ */
5296
+ function offloadOldestRequestImages(options) {
5297
+ const lengths = [];
5298
+ for (const message of options.messages) collectRequestImageBytes(message.content, lengths);
5299
+ const excess = lengths.reduce((sum, bytes) => sum + bytes, 0) - MAX_REQUEST_IMAGE_BYTES;
5300
+ if (excess <= 0) return options;
5301
+ let omitted = 0;
5302
+ let freed = 0;
5303
+ for (const bytes of lengths) {
5304
+ if (freed >= excess) break;
5305
+ freed += bytes;
5306
+ omitted += 1;
5307
+ }
5308
+ const remaining = { count: omitted };
5309
+ const messages = options.messages.map((message) => {
5310
+ if (remaining.count === 0 || !Array.isArray(message.content)) return message;
5311
+ let replaced = false;
5312
+ const content = message.content.map((block) => {
5313
+ if (remaining.count === 0 || !isRecord(block) || block.type !== "image") return block;
5314
+ if (requestImageBytes(block) === void 0) return block;
5315
+ remaining.count -= 1;
5316
+ replaced = true;
5317
+ return {
5318
+ type: "text",
5319
+ text: OMITTED_IMAGE_TEXT
5320
+ };
5321
+ });
5322
+ return replaced ? {
5323
+ ...message,
5324
+ content
5325
+ } : message;
5326
+ });
5327
+ return {
5328
+ ...options,
5329
+ messages
5330
+ };
5331
+ }
5332
+ /**
5333
+ * Read every durable `{ type: 'image', attachment }` block one request carries.
5334
+ *
5335
+ * This provider declares image input, so DSH hands those blocks to the adapter
5336
+ * unchanged instead of projecting them to text, and Gemini can only receive them
5337
+ * as `inlineData` bytes. An image that cannot be read resolves to
5338
+ * `unavailable` rather than disappearing: `contentToUserParts` then leaves the
5339
+ * model a text marker, because a turn that silently loses its image is far
5340
+ * harder to diagnose than one that says so.
5341
+ *
5342
+ * @param options - the exact request about to be built.
5343
+ * @param attachments - durable attachment store; absent when the host wired none.
5344
+ * @param signal - cancellation, forwarded to every attachment read.
5345
+ * @returns one resolution per distinct attachment id, empty when there is no image.
5346
+ */
5347
+ async function resolveRequestImages(options, attachments, signal) {
5348
+ const refs = /* @__PURE__ */ new Map();
5349
+ for (const message of options.messages) collectImageRefs(message.content, refs);
5350
+ if (refs.size === 0) return NO_RESOLVED_IMAGES;
5351
+ const resolved = /* @__PURE__ */ new Map();
5352
+ await Promise.all([...refs].map(async ([attachmentId, ref]) => {
5353
+ if (!attachments) {
5354
+ resolved.set(attachmentId, { kind: "unavailable" });
5355
+ return;
5356
+ }
5357
+ try {
5358
+ const stored = await attachments.readImage(ref, signal);
5359
+ resolved.set(attachmentId, {
5360
+ kind: "inline",
5361
+ mediaType: stored.ref.mediaType,
5362
+ data: Buffer.from(stored.data).toString("base64")
5363
+ });
5364
+ } catch (error) {
5365
+ if (isAbort(error, signal)) throw error;
5366
+ resolved.set(attachmentId, { kind: "unavailable" });
5367
+ }
5368
+ }));
5369
+ return resolved;
5370
+ }
5371
+ function unavailableImageText(block) {
5372
+ const label = attachmentLabel(block);
5373
+ return `[image unavailable: ${label ? `${label} could not be read` : "the image could not be read"}; ask the user to attach it again if the image is needed]`;
5374
+ }
5375
+ function imageBlockToPart(block, images) {
5226
5376
  let data = asString$1(block.data) || asString$1(block.base64);
5227
5377
  const source = isRecord(block.source) ? block.source : void 0;
5228
5378
  if (!data && source) data = asString$1(source.data) || asString$1(source.base64);
@@ -5234,19 +5384,25 @@ function imageBlockToPart(block) {
5234
5384
  data = match[2] || "";
5235
5385
  }
5236
5386
  }
5237
- return data ? { inlineData: {
5387
+ if (data) return { inlineData: {
5238
5388
  mimeType,
5239
5389
  data
5390
+ } };
5391
+ const attachment = attachmentOf(block);
5392
+ const resolved = attachment ? images.get(attachment.attachmentId) : void 0;
5393
+ return resolved?.kind === "inline" ? { inlineData: {
5394
+ mimeType: resolved.mediaType,
5395
+ data: resolved.data
5240
5396
  } } : void 0;
5241
5397
  }
5242
- function contentToUserParts(content) {
5398
+ function contentToUserParts(content, images) {
5243
5399
  if (typeof content === "string") return [{ text: sanitizeText(content) }];
5244
5400
  if (!Array.isArray(content)) return [];
5245
5401
  const parts = [];
5246
5402
  for (const block of content) if (isRecord(block) && block.type === "text" && typeof block.text === "string") parts.push({ text: sanitizeText(block.text) });
5247
5403
  else if (isRecord(block) && block.type === "image") {
5248
- const img = imageBlockToPart(block);
5249
- if (img) parts.push(img);
5404
+ const img = imageBlockToPart(block, images);
5405
+ parts.push(img ?? { text: unavailableImageText(block) });
5250
5406
  }
5251
5407
  return parts;
5252
5408
  }
@@ -5256,6 +5412,10 @@ function toolResultText(blocks) {
5256
5412
  if (!isRecord(block)) return "";
5257
5413
  if (block.type === "text" && typeof block.text === "string") return sanitizeText(block.text);
5258
5414
  if (block.type === "tool-result") return toolResultText(block.content);
5415
+ if (block.type === "image") {
5416
+ const label = attachmentLabel(block);
5417
+ return label ? `[image: ${label}]` : "[image]";
5418
+ }
5259
5419
  return "";
5260
5420
  }).join("");
5261
5421
  }
@@ -5349,7 +5509,7 @@ function pushToolResult(contents, result, toolCalls, model, runtimeModel) {
5349
5509
  parts: [part]
5350
5510
  });
5351
5511
  }
5352
- function convertMessages(options, model, runtimeModel) {
5512
+ function convertMessages(options, model, runtimeModel, images = NO_RESOLVED_IMAGES) {
5353
5513
  const contents = [];
5354
5514
  const toolCalls = /* @__PURE__ */ new Map();
5355
5515
  for (const message of options.messages) {
@@ -5363,7 +5523,7 @@ function convertMessages(options, model, runtimeModel) {
5363
5523
  continue;
5364
5524
  }
5365
5525
  const content = Array.isArray(message.content) ? message.content : [];
5366
- const userParts = contentToUserParts(content.filter((b) => !isRecord(b) || b.type !== "tool-result"));
5526
+ const userParts = contentToUserParts(content.filter((b) => !isRecord(b) || b.type !== "tool-result"), images);
5367
5527
  if (role === "system") {
5368
5528
  if (userParts.length) contents.push({
5369
5529
  role: GEMINI_ROLE.user,
@@ -5401,9 +5561,9 @@ function mapToolChoiceMode(toolChoice) {
5401
5561
  function getMaxOutputTokens(modelId, runtimeModel) {
5402
5562
  return RUNTIME_MAX_OUTPUT_TOKENS[runtimeModel] || RUNTIME_MAX_OUTPUT_TOKENS[modelId] || 65536;
5403
5563
  }
5404
- function buildRequest(options, model, projectId, runtimeModel, effort) {
5564
+ function buildRequest(options, model, projectId, runtimeModel, effort, images = NO_RESOLVED_IMAGES) {
5405
5565
  const request = {
5406
- contents: convertMessages(options, model, runtimeModel),
5566
+ contents: convertMessages(options, model, runtimeModel, images),
5407
5567
  systemInstruction: {
5408
5568
  role: GEMINI_ROLE.user,
5409
5569
  parts: [
@@ -5767,9 +5927,11 @@ var AntigravityAdapter = class extends LlmAdapter {
5767
5927
  if (routing?.fallbackCandidates) {
5768
5928
  for (const fc of routing.fallbackCandidates) if (!candidates.includes(fc)) candidates.push(fc);
5769
5929
  }
5930
+ const requestOptions = offloadOldestRequestImages(options);
5931
+ const images = await resolveRequestImages(requestOptions, this.options.attachments, signal);
5770
5932
  let response;
5771
5933
  for (const runtimeModel of candidates) {
5772
- const body = JSON.stringify(buildRequest(options, model, projectId, runtimeModel, effort));
5934
+ const body = JSON.stringify(buildRequest(requestOptions, model, projectId, runtimeModel, effort, images));
5773
5935
  const headers = {
5774
5936
  ...antigravityHeaders(token),
5775
5937
  ...model.id.startsWith("claude-") ? { "anthropic-beta": "interleaved-thinking-2025-05-14" } : {}
@@ -6229,7 +6391,10 @@ function apply(ctx, pluginConfig = {}) {
6229
6391
  logger: ctx.logger
6230
6392
  });
6231
6393
  const proxyFetch = proxyManager.createFetch();
6232
- const antigravityAdapter = new AntigravityAdapter(antigravityStore, antigravityModelSettings, antigravityPreferences, { fetchFn: proxyFetch });
6394
+ const antigravityAdapter = new AntigravityAdapter(antigravityStore, antigravityModelSettings, antigravityPreferences, {
6395
+ fetchFn: proxyFetch,
6396
+ attachments: ctx.attachments
6397
+ });
6233
6398
  const disposeAntigravityAdapter = ctx.llm.registerAdapter([PROVIDER_ID], antigravityAdapter);
6234
6399
  const disposeAntigravityRoutes = registerAntigravityRoutes(ctx, antigravityStore, antigravityModelSettings, antigravityPreferences, proxyFetch);
6235
6400
  const oauth = new OAuthService(store, {
@@ -1,5 +1,6 @@
1
1
  import { LlmAdapter, ReasoningEffortId, type GenerateOptions, type LlmModelInfo, type LlmProviderInfo, type LlmResolvedModelInfo, type PreparedAdapterCall, type StreamChunk } from '@deepseek-ai/dsh-llm';
2
2
  import { FileCredentialStore, FileModelSettingsStore, type AntigravityPreferenceStore } from './token-store.ts';
3
+ import { type AttachmentImageReader } from './mapper.ts';
3
4
  export declare function resolveDefaultReasoningEffort(efforts: readonly string[], configuredEffort?: string | null): ReasoningEffortId | undefined;
4
5
  export declare class AntigravityAdapter extends LlmAdapter {
5
6
  private readonly store;
@@ -8,6 +9,7 @@ export declare class AntigravityAdapter extends LlmAdapter {
8
9
  private readonly options;
9
10
  constructor(store?: FileCredentialStore, modelSettings?: FileModelSettingsStore, preferences?: AntigravityPreferenceStore | undefined, options?: {
10
11
  fetchFn?: typeof fetch;
12
+ attachments?: AttachmentImageReader;
11
13
  });
12
14
  providerInfo(provider: string): LlmProviderInfo;
13
15
  providerRetryPolicy(): undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAM/G,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,iBAAiB,GAAG,SAAS,CAc/B;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,sBAA4B,EACjC,aAAa,yBAA+B,EAC5C,WAAW,CAAC,EAAE,0BAA0B,YAAA,EACxC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;KAAO;IAK3D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAI/C,mBAAmB,IAAI,SAAS;IAIhC,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS;IAI7D,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAkB/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwCpG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO/F,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;YAwBpD,aAAa;CAwG7B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAG/G,OAAO,EAOL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAA;AAGpB,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,iBAAiB,GAAG,SAAS,CAc/B;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,sBAA4B,EACjC,aAAa,yBAA+B,EAC5C,WAAW,CAAC,EAAE,0BAA0B,YAAA,EACxC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;QAAC,WAAW,CAAC,EAAE,qBAAqB,CAAA;KAAO;IAKhG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAI/C,mBAAmB,IAAI,SAAS;IAIhC,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS;IAI7D,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAkB/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwCpG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO/F,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;YAwBpD,aAAa;CA+G7B"}
@@ -1,7 +1,56 @@
1
1
  import { type ContentBlock, type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm';
2
+ import type { AttachmentStore } from '@deepseek-ai/dsh-attachment';
2
3
  import { type AntigravityModelDef } from './types.ts';
3
4
  export declare function sanitizeToolCallId(id: string, fallbackName: string): string;
4
- export declare function convertMessages(options: GenerateOptions, model: AntigravityModelDef, runtimeModel: string): Array<{
5
+ /** Attachment seam this route needs: verified bytes for one durable image. */
6
+ export type AttachmentImageReader = Pick<AttachmentStore, 'readImage'>;
7
+ /** One durable user image resolved for an in-flight request, or proven unreadable. */
8
+ export type ResolvedRequestImage = {
9
+ readonly kind: 'inline';
10
+ readonly mediaType: string;
11
+ readonly data: string;
12
+ } | {
13
+ readonly kind: 'unavailable';
14
+ };
15
+ /** Resolved images keyed by durable attachment id; consumed by one request build. */
16
+ export type ResolvedRequestImages = ReadonlyMap<string, ResolvedRequestImage>;
17
+ /**
18
+ * Base64 image payload one Antigravity request may carry. Google caps a request
19
+ * carrying inline data at 20 MB, and the same body also holds the system
20
+ * instruction, the conversation text, and the tool declarations.
21
+ */
22
+ export declare const MAX_REQUEST_IMAGE_BYTES: number;
23
+ /**
24
+ * Replace the oldest inline images with a text placeholder once one request
25
+ * would carry more than {@link MAX_REQUEST_IMAGE_BYTES} of base64 image data.
26
+ *
27
+ * Without this bound an image-heavy session keeps growing the request body until
28
+ * Google rejects it, and the images that made it fail are the ones the model
29
+ * needed least. The oldest occurrences go first, exactly as DSH's own providers
30
+ * order them, and the placeholder tells the model the image is missing instead
31
+ * of letting it answer as though the picture were simply blank.
32
+ *
33
+ * @param options - the request about to be built; durable history stays untouched.
34
+ * @returns the original options when they already fit, otherwise shallow copies.
35
+ */
36
+ export declare function offloadOldestRequestImages(options: GenerateOptions): GenerateOptions;
37
+ /**
38
+ * Read every durable `{ type: 'image', attachment }` block one request carries.
39
+ *
40
+ * This provider declares image input, so DSH hands those blocks to the adapter
41
+ * unchanged instead of projecting them to text, and Gemini can only receive them
42
+ * as `inlineData` bytes. An image that cannot be read resolves to
43
+ * `unavailable` rather than disappearing: `contentToUserParts` then leaves the
44
+ * model a text marker, because a turn that silently loses its image is far
45
+ * harder to diagnose than one that says so.
46
+ *
47
+ * @param options - the exact request about to be built.
48
+ * @param attachments - durable attachment store; absent when the host wired none.
49
+ * @param signal - cancellation, forwarded to every attachment read.
50
+ * @returns one resolution per distinct attachment id, empty when there is no image.
51
+ */
52
+ export declare function resolveRequestImages(options: GenerateOptions, attachments: AttachmentImageReader | undefined, signal?: AbortSignal): Promise<ResolvedRequestImages>;
53
+ export declare function convertMessages(options: GenerateOptions, model: AntigravityModelDef, runtimeModel: string, images?: ResolvedRequestImages): Array<{
5
54
  role: string;
6
55
  parts: Array<Record<string, unknown>>;
7
56
  }>;
@@ -9,7 +58,7 @@ export declare function stripMetaSchema(schema: unknown): unknown;
9
58
  export declare function convertTools(tools: GenerateOptions['tools']): Array<Record<string, unknown>> | undefined;
10
59
  export declare function mapToolChoiceMode(toolChoice: unknown): string;
11
60
  export declare function getMaxOutputTokens(modelId: string, runtimeModel: string): number;
12
- export declare function buildRequest(options: GenerateOptions, model: AntigravityModelDef, projectId: string, runtimeModel: string, effort?: string): Record<string, unknown>;
61
+ export declare function buildRequest(options: GenerateOptions, model: AntigravityModelDef, projectId: string, runtimeModel: string, effort?: string, images?: ResolvedRequestImages): Record<string, unknown>;
13
62
  export interface StreamState {
14
63
  blocks: ContentBlock[];
15
64
  replayBlocks: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,eAAe,EAEpB,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAOL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAA;AAyBnB,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAI3E;AA+LD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,mBAAmB,EAC1B,YAAY,EAAE,MAAM,GACnB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAAC,CA2BhE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAExD;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAI7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwFzB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAA;IAC9D,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAChF,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAW/C;AA2CD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,CA0FjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,CAmB7D"}
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/mapper.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAsCxC,yDAAyD;AACzD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAI3B,CAAA;AAEF,eAAO,MAAM,MAAM,UAAqE,CAAA;AAExF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,GAAE,MAAW,GAAG,IAAI,CAsHnE;AAED,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,kCAAkC,EAClC,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,iCAAiC,EACjC,4BAA4B,EAC5B,kBAAkB,EAClB,cAAc,EACd,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AAC9G,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAsCxC,yDAAyD;AACzD,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAI3B,CAAA;AAEF,eAAO,MAAM,MAAM,UAAqE,CAAA;AAExF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,GAAE,MAAW,GAAG,IAAI,CAwHnE;AAED,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,kCAAkC,EAClC,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,iCAAiC,EACjC,4BAA4B,EAC5B,kBAAkB,EAClB,cAAc,EACd,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AAC9G,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eddyskywalker/dsh-chatgpt-subscription",
3
- "version": "0.2.20",
3
+ "version": "0.2.21",
4
4
  "description": "DSH provider plugin for Codex access through a ChatGPT subscription.",
5
5
  "author": {
6
6
  "name": "eddyskywalker",