@jeffreycao/copilot-api 1.6.1 → 1.6.3

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.
@@ -1,6 +1,6 @@
1
1
  import { PATHS, ensurePaths } from "./paths-Cla6y5eD.js";
2
- import { state } from "./utils-BWikssll.js";
3
- import { setupGitHubToken } from "./token-DCEVJpKB.js";
2
+ import { state } from "./utils-C_HZ9gNe.js";
3
+ import { setupGitHubToken } from "./token-BINhAFp5.js";
4
4
  import { defineCommand } from "citty";
5
5
  import consola from "consola";
6
6
 
@@ -43,4 +43,4 @@ const auth = defineCommand({
43
43
 
44
44
  //#endregion
45
45
  export { auth };
46
- //# sourceMappingURL=auth-DAlTk9BR.js.map
46
+ //# sourceMappingURL=auth-I-jV5RwF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-DAlTk9BR.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;;;AAcA,eAAsB,QAAQ,SAAwC;AACpE,KAAI,QAAQ,SAAS;AACnB,UAAQ,QAAQ;AAChB,UAAQ,KAAK,0BAA0B;;AAGzC,OAAM,YAAY,QAAQ;AAE1B,OAAM,aAAa;AACnB,OAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AACvC,SAAQ,QAAQ,2BAA2B,MAAM,kBAAkB;;AAGrE,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACF;CACD,IAAI,EAAE,QAAQ;AACZ,SAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GACjB,CAAC;;CAEL,CAAC"}
1
+ {"version":3,"file":"auth-I-jV5RwF.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;;;AAcA,eAAsB,QAAQ,SAAwC;AACpE,KAAI,QAAQ,SAAS;AACnB,UAAQ,QAAQ;AAChB,UAAQ,KAAK,0BAA0B;;AAGzC,OAAM,YAAY,QAAQ;AAE1B,OAAM,aAAa;AACnB,OAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AACvC,SAAQ,QAAQ,2BAA2B,MAAM,kBAAkB;;AAGrE,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACF;CACD,IAAI,EAAE,QAAQ;AACZ,SAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GACjB,CAAC;;CAEL,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { ensurePaths } from "./paths-Cla6y5eD.js";
2
- import { getCopilotUsage } from "./utils-BWikssll.js";
3
- import { setupGitHubToken } from "./token-DCEVJpKB.js";
2
+ import { getCopilotUsage } from "./utils-C_HZ9gNe.js";
3
+ import { setupGitHubToken } from "./token-BINhAFp5.js";
4
4
  import { defineCommand } from "citty";
5
5
  import consola from "consola";
6
6
 
@@ -41,4 +41,4 @@ const checkUsage = defineCommand({
41
41
 
42
42
  //#endregion
43
43
  export { checkUsage };
44
- //# sourceMappingURL=check-usage-B-1bXEu4.js.map
44
+ //# sourceMappingURL=check-usage-DYLFqYhN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-usage-B-1bXEu4.js","names":[],"sources":["../src/check-usage.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { ensurePaths } from \"./lib/paths\"\nimport { setupGitHubToken } from \"./lib/token\"\nimport {\n getCopilotUsage,\n type QuotaDetail,\n} from \"./services/github/get-copilot-usage\"\n\nexport const checkUsage = defineCommand({\n meta: {\n name: \"check-usage\",\n description: \"Show current GitHub Copilot usage/quota information\",\n },\n async run() {\n await ensurePaths()\n await setupGitHubToken()\n try {\n const usage = await getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed =\n premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap) return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota(\"Chat\", usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n \"Completions\",\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n } catch (err) {\n consola.error(\"Failed to fetch Copilot usage:\", err)\n process.exit(1)\n }\n },\n})\n"],"mappings":";;;;;;;AAUA,MAAa,aAAa,cAAc;CACtC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,MAAM;AACV,QAAM,aAAa;AACnB,QAAM,kBAAkB;AACxB,MAAI;GACF,MAAM,QAAQ,MAAM,iBAAiB;GACrC,MAAM,UAAU,MAAM,gBAAgB;GACtC,MAAM,eAAe,QAAQ;GAC7B,MAAM,cAAc,eAAe,QAAQ;GAC3C,MAAM,qBACJ,eAAe,IAAK,cAAc,eAAgB,MAAM;GAC1D,MAAM,0BAA0B,QAAQ;GAGxC,SAAS,eAAe,MAAc,MAA+B;AACnE,QAAI,CAAC,KAAM,QAAO,GAAG,KAAK;IAC1B,MAAM,QAAQ,KAAK;IACnB,MAAM,OAAO,QAAQ,KAAK;IAC1B,MAAM,cAAc,QAAQ,IAAK,OAAO,QAAS,MAAM;IACvD,MAAM,mBAAmB,KAAK;AAC9B,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,SAAS,YAAY,QAAQ,EAAE,CAAC,UAAU,iBAAiB,QAAQ,EAAE,CAAC;;GAGzG,MAAM,cAAc,YAAY,YAAY,GAAG,aAAa,SAAS,mBAAmB,QAAQ,EAAE,CAAC,UAAU,wBAAwB,QAAQ,EAAE,CAAC;GAChJ,MAAM,WAAW,eAAe,QAAQ,MAAM,gBAAgB,KAAK;GACnE,MAAM,kBAAkB,eACtB,eACA,MAAM,gBAAgB,YACvB;AAED,WAAQ,IACN,wBAAwB,MAAM,aAAa,mBACtB,MAAM,iBAAiB,iBAEnC,YAAY,MACZ,SAAS,MACT,kBACV;WACM,KAAK;AACZ,WAAQ,MAAM,kCAAkC,IAAI;AACpD,WAAQ,KAAK,EAAE;;;CAGpB,CAAC"}
1
+ {"version":3,"file":"check-usage-DYLFqYhN.js","names":[],"sources":["../src/check-usage.ts"],"sourcesContent":["import { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { ensurePaths } from \"./lib/paths\"\nimport { setupGitHubToken } from \"./lib/token\"\nimport {\n getCopilotUsage,\n type QuotaDetail,\n} from \"./services/github/get-copilot-usage\"\n\nexport const checkUsage = defineCommand({\n meta: {\n name: \"check-usage\",\n description: \"Show current GitHub Copilot usage/quota information\",\n },\n async run() {\n await ensurePaths()\n await setupGitHubToken()\n try {\n const usage = await getCopilotUsage()\n const premium = usage.quota_snapshots.premium_interactions\n const premiumTotal = premium.entitlement\n const premiumUsed = premiumTotal - premium.remaining\n const premiumPercentUsed =\n premiumTotal > 0 ? (premiumUsed / premiumTotal) * 100 : 0\n const premiumPercentRemaining = premium.percent_remaining\n\n // Helper to summarize a quota snapshot\n function summarizeQuota(name: string, snap: QuotaDetail | undefined) {\n if (!snap) return `${name}: N/A`\n const total = snap.entitlement\n const used = total - snap.remaining\n const percentUsed = total > 0 ? (used / total) * 100 : 0\n const percentRemaining = snap.percent_remaining\n return `${name}: ${used}/${total} used (${percentUsed.toFixed(1)}% used, ${percentRemaining.toFixed(1)}% remaining)`\n }\n\n const premiumLine = `Premium: ${premiumUsed}/${premiumTotal} used (${premiumPercentUsed.toFixed(1)}% used, ${premiumPercentRemaining.toFixed(1)}% remaining)`\n const chatLine = summarizeQuota(\"Chat\", usage.quota_snapshots.chat)\n const completionsLine = summarizeQuota(\n \"Completions\",\n usage.quota_snapshots.completions,\n )\n\n consola.box(\n `Copilot Usage (plan: ${usage.copilot_plan})\\n`\n + `Quota resets: ${usage.quota_reset_date}\\n`\n + `\\nQuotas:\\n`\n + ` ${premiumLine}\\n`\n + ` ${chatLine}\\n`\n + ` ${completionsLine}`,\n )\n } catch (err) {\n consola.error(\"Failed to fetch Copilot usage:\", err)\n process.exit(1)\n }\n },\n})\n"],"mappings":";;;;;;;AAUA,MAAa,aAAa,cAAc;CACtC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,MAAM;AACV,QAAM,aAAa;AACnB,QAAM,kBAAkB;AACxB,MAAI;GACF,MAAM,QAAQ,MAAM,iBAAiB;GACrC,MAAM,UAAU,MAAM,gBAAgB;GACtC,MAAM,eAAe,QAAQ;GAC7B,MAAM,cAAc,eAAe,QAAQ;GAC3C,MAAM,qBACJ,eAAe,IAAK,cAAc,eAAgB,MAAM;GAC1D,MAAM,0BAA0B,QAAQ;GAGxC,SAAS,eAAe,MAAc,MAA+B;AACnE,QAAI,CAAC,KAAM,QAAO,GAAG,KAAK;IAC1B,MAAM,QAAQ,KAAK;IACnB,MAAM,OAAO,QAAQ,KAAK;IAC1B,MAAM,cAAc,QAAQ,IAAK,OAAO,QAAS,MAAM;IACvD,MAAM,mBAAmB,KAAK;AAC9B,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,SAAS,YAAY,QAAQ,EAAE,CAAC,UAAU,iBAAiB,QAAQ,EAAE,CAAC;;GAGzG,MAAM,cAAc,YAAY,YAAY,GAAG,aAAa,SAAS,mBAAmB,QAAQ,EAAE,CAAC,UAAU,wBAAwB,QAAQ,EAAE,CAAC;GAChJ,MAAM,WAAW,eAAe,QAAQ,MAAM,gBAAgB,KAAK;GACnE,MAAM,kBAAkB,eACtB,eACA,MAAM,gBAAgB,YACvB;AAED,WAAQ,IACN,wBAAwB,MAAM,aAAa,mBACtB,MAAM,iBAAiB,iBAEnC,YAAY,MACZ,SAAS,MACT,kBACV;WACM,KAAK;AACZ,WAAQ,MAAM,kCAAkC,IAAI;AACpD,WAAQ,KAAK,EAAE;;;CAGpB,CAAC"}
package/dist/main.js CHANGED
@@ -20,10 +20,10 @@ const args = parseArgs(process.argv, cliArgs);
20
20
  if (typeof args["api-home"] === "string") process.env.COPILOT_API_HOME = args["api-home"];
21
21
  if (typeof args["oauth-app"] === "string") process.env.COPILOT_API_OAUTH_APP = args["oauth-app"];
22
22
  if (typeof args["enterprise-url"] === "string") process.env.COPILOT_API_ENTERPRISE_URL = args["enterprise-url"];
23
- const { auth } = await import("./auth-DAlTk9BR.js");
24
- const { checkUsage } = await import("./check-usage-B-1bXEu4.js");
23
+ const { auth } = await import("./auth-I-jV5RwF.js");
24
+ const { checkUsage } = await import("./check-usage-DYLFqYhN.js");
25
25
  const { debug } = await import("./debug-DcC7ZPH0.js");
26
- const { start } = await import("./start-CZaoeGeK.js");
26
+ const { start } = await import("./start-DzdGfvGi.js");
27
27
  const main = defineCommand({
28
28
  meta: {
29
29
  name: "copilot-api",
@@ -1,5 +1,5 @@
1
1
  import { PATHS } from "./paths-Cla6y5eD.js";
2
- import { COMPACT_AUTO_CONTINUE, COMPACT_REQUEST, HTTPError, cacheModels, compactAutoContinuePromptStarts, compactMessageSections, compactSummaryPromptStart, compactSystemPromptStart, compactTextOnlyGuard, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-BWikssll.js";
2
+ import { COMPACT_AUTO_CONTINUE, COMPACT_REQUEST, HTTPError, cacheModels, compactAutoContinuePromptStarts, compactMessageSections, compactSummaryPromptStart, compactSystemPromptStart, compactTextOnlyGuard, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-C_HZ9gNe.js";
3
3
  import { getAnthropicApiKey, getClaudeTokenMultiplier, getConfig, getExtraPromptForModel, getProviderConfig, getReasoningEffortForModel, getSmallModel, isMessagesApiEnabled, isResponsesApiContextManagementModel, isResponsesApiWebSearchEnabled } from "./config-D44X0MP1.js";
4
4
  import consola from "consola";
5
5
  import path from "node:path";
@@ -756,6 +756,9 @@ function mapContent(content) {
756
756
  image_url: { url: `data:${block.source.media_type};base64,${block.source.data}` }
757
757
  });
758
758
  break;
759
+ case "document":
760
+ contentParts.push(createDocumentTextPart());
761
+ break;
759
762
  case "tool_reference":
760
763
  contentParts.push({
761
764
  type: "text",
@@ -765,6 +768,12 @@ function mapContent(content) {
765
768
  }
766
769
  return contentParts;
767
770
  }
771
+ function createDocumentTextPart() {
772
+ return {
773
+ type: "text",
774
+ text: "A PDF document was attached, but this api cannot send PDF inputs directly. Analyze using other tools."
775
+ };
776
+ }
768
777
  function translateAnthropicToolsToOpenAI(anthropicTools) {
769
778
  if (!anthropicTools) return;
770
779
  return anthropicTools.map((tool) => ({
@@ -1026,7 +1035,7 @@ const translateUserMessage = (message) => {
1026
1035
  continue;
1027
1036
  }
1028
1037
  const converted = translateUserContentBlock(block);
1029
- if (converted) pendingContent.push(converted);
1038
+ if (converted.length > 0) pendingContent.push(...converted);
1030
1039
  }
1031
1040
  flushPendingContent(pendingContent, items, { role: "user" });
1032
1041
  return items;
@@ -1076,9 +1085,10 @@ const translateAssistantMessage = (message, model, applyPhase) => {
1076
1085
  };
1077
1086
  const translateUserContentBlock = (block) => {
1078
1087
  switch (block.type) {
1079
- case "text": return createTextContent(block.text);
1080
- case "image": return createImageContent(block);
1081
- default: return;
1088
+ case "text": return [createTextContent(block.text)];
1089
+ case "image": return [createImageContent(block)];
1090
+ case "document": return [createFileContent(block)];
1091
+ default: return [];
1082
1092
  }
1083
1093
  };
1084
1094
  const translateAssistantContentBlock = (block) => {
@@ -1122,6 +1132,11 @@ const createImageContent = (block) => ({
1122
1132
  image_url: `data:${block.source.media_type};base64,${block.source.data}`,
1123
1133
  detail: "auto"
1124
1134
  });
1135
+ const createFileContent = (block) => ({
1136
+ type: "input_file",
1137
+ file_data: `data:${block.source.media_type};base64,${block.source.data}`,
1138
+ filename: block.title ?? "document.pdf"
1139
+ });
1125
1140
  const createReasoningContent = (block) => {
1126
1141
  const { encryptedContent, id } = parseReasoningSignature(block.signature);
1127
1142
  const thinking = block.thinking === THINKING_TEXT$1 ? "" : block.thinking;
@@ -1373,6 +1388,9 @@ const convertToolResultContent = (content) => {
1373
1388
  case "image":
1374
1389
  result.push(createImageContent(block));
1375
1390
  break;
1391
+ case "document":
1392
+ result.push(createFileContent(block));
1393
+ break;
1376
1394
  case "tool_reference":
1377
1395
  result.push(createTextContent(`Tool ${block.tool_name} loaded`));
1378
1396
  break;
@@ -1882,11 +1900,21 @@ const allowedAnthropicBetas = new Set([
1882
1900
  "context-management-2025-06-27",
1883
1901
  ADVANCED_TOOL_USE_BETA
1884
1902
  ]);
1885
- const buildAnthropicBetaHeader = (anthropicBetaHeader, thinking) => {
1903
+ const TOOL_SEARCH_SUPPORTED_MODELS = [
1904
+ "claude-sonnet-4.5",
1905
+ "claude-sonnet-4.6",
1906
+ "claude-opus-4.5",
1907
+ "claude-opus-4.6"
1908
+ ];
1909
+ const modelSupportsToolSearch = (modelId) => {
1910
+ return TOOL_SEARCH_SUPPORTED_MODELS.some((prefix) => modelId.toLowerCase().startsWith(prefix));
1911
+ };
1912
+ const buildAnthropicBetaHeader = (anthropicBetaHeader, thinking, model) => {
1886
1913
  const isAdaptiveThinking = thinking?.type === "adaptive";
1887
1914
  if (anthropicBetaHeader) {
1888
1915
  const filteredBeta = anthropicBetaHeader.split(",").map((item) => item.trim()).filter((item) => item.length > 0).filter((item) => allowedAnthropicBetas.has(item));
1889
- const uniqueFilteredBetas = [...new Set([ADVANCED_TOOL_USE_BETA, ...filteredBeta])];
1916
+ const copilotHeaderSet = modelSupportsToolSearch(model) ? [ADVANCED_TOOL_USE_BETA] : [];
1917
+ const uniqueFilteredBetas = [...new Set([...copilotHeaderSet, ...filteredBeta])];
1890
1918
  if (uniqueFilteredBetas.length > 0) return uniqueFilteredBetas.join(",");
1891
1919
  return;
1892
1920
  }
@@ -1909,7 +1937,7 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
1909
1937
  prepareForCompact(headers, options.compactType);
1910
1938
  const { safetyIdentifier, sessionId } = parseUserIdMetadata(payload.metadata?.user_id);
1911
1939
  if (safetyIdentifier && sessionId) prepareMessageProxyHeaders(headers);
1912
- const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking);
1940
+ const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking, payload.model);
1913
1941
  if (anthropicBeta) headers["anthropic-beta"] = anthropicBeta;
1914
1942
  const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {
1915
1943
  method: "POST",
@@ -1979,6 +2007,48 @@ const mergeContentWithTexts = (tr, textBlocks) => {
1979
2007
  content: [...tr.content, ...textBlocks]
1980
2008
  };
1981
2009
  };
2010
+ const mergeContentWithAttachments = (tr, attachments) => {
2011
+ if (typeof tr.content === "string") return {
2012
+ ...tr,
2013
+ content: [{
2014
+ type: "text",
2015
+ text: tr.content
2016
+ }, ...attachments]
2017
+ };
2018
+ return {
2019
+ ...tr,
2020
+ content: [...tr.content, ...attachments]
2021
+ };
2022
+ };
2023
+ const isAttachmentBlock = (block) => {
2024
+ return block.type === "image" || block.type === "document";
2025
+ };
2026
+ const mergeAttachmentsIntoLastToolResult = (content) => {
2027
+ const attachments = content.filter((block) => isAttachmentBlock(block));
2028
+ if (attachments.length === 0) return content;
2029
+ const mergeableToolResultIndices = content.flatMap((block, index) => block.type === "tool_result" && !hasToolRef(block) ? [index] : []);
2030
+ if (mergeableToolResultIndices.length === 0) return content;
2031
+ const attachmentsByToolResultIndex = /* @__PURE__ */ new Map();
2032
+ if (mergeableToolResultIndices.length === attachments.length) for (const [index, toolResultIndex] of mergeableToolResultIndices.entries()) attachmentsByToolResultIndex.set(toolResultIndex, [attachments[index]]);
2033
+ else {
2034
+ const lastToolResultIndex = mergeableToolResultIndices.at(-1);
2035
+ if (lastToolResultIndex === void 0) return content;
2036
+ attachmentsByToolResultIndex.set(lastToolResultIndex, attachments);
2037
+ }
2038
+ const mergedContent = [];
2039
+ for (const [index, block] of content.entries()) {
2040
+ if (isAttachmentBlock(block)) continue;
2041
+ if (block.type === "tool_result") {
2042
+ const matchedAttachments = attachmentsByToolResultIndex.get(index);
2043
+ if (matchedAttachments) {
2044
+ mergedContent.push(mergeContentWithAttachments(block, matchedAttachments));
2045
+ continue;
2046
+ }
2047
+ }
2048
+ mergedContent.push(block);
2049
+ }
2050
+ return mergedContent;
2051
+ };
1982
2052
  const mergeToolResult = (toolResults, textBlocks) => {
1983
2053
  if (toolResults.length === textBlocks.length) return toolResults.map((tr, i) => mergeContentWithText(tr, textBlocks[i]));
1984
2054
  const lastIndex = toolResults.length - 1;
@@ -1996,6 +2066,7 @@ const mergeToolResultForClaude = (anthropicPayload, options) => {
1996
2066
  for (const [index, msg] of anthropicPayload.messages.entries()) {
1997
2067
  if (options?.skipLastMessage && index === lastMessageIndex) continue;
1998
2068
  if (msg.role !== "user" || !Array.isArray(msg.content)) continue;
2069
+ msg.content = mergeAttachmentsIntoLastToolResult(msg.content);
1999
2070
  const toolResults = [];
2000
2071
  const textBlocks = [];
2001
2072
  let valid = true;
@@ -2012,7 +2083,7 @@ const mergeToolResultForClaude = (anthropicPayload, options) => {
2012
2083
  const sanitizeIdeTools = (payload) => {
2013
2084
  if (!payload.tools || payload.tools.length === 0) return;
2014
2085
  payload.tools = payload.tools.flatMap((tool) => {
2015
- if (tool.name === IDE_EXECUTE_CODE_TOOL) return [];
2086
+ if (tool.name === IDE_EXECUTE_CODE_TOOL && !tool.defer_loading) return [];
2016
2087
  if (tool.name === IDE_GET_DIAGNOSTICS_TOOL) return [{
2017
2088
  ...tool,
2018
2089
  description: IDE_GET_DIAGNOSTICS_DESCRIPTION
@@ -3025,4 +3096,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
3025
3096
 
3026
3097
  //#endregion
3027
3098
  export { server };
3028
- //# sourceMappingURL=server-CBnVrsFn.js.map
3099
+ //# sourceMappingURL=server-wOqxNjw_.js.map