@jeffreycao/copilot-api 1.5.8 → 1.6.0-beta.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.
@@ -1,6 +1,6 @@
1
1
  import { PATHS, ensurePaths } from "./paths-Cla6y5eD.js";
2
- import { state } from "./utils-Cos2YZBk.js";
3
- import { setupGitHubToken } from "./token-CWYd9Sw5.js";
2
+ import { state } from "./utils-BwypGMpg.js";
3
+ import { setupGitHubToken } from "./token-DmouB1Xt.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-k8txLjfN.js.map
46
+ //# sourceMappingURL=auth-BUcf6a44.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-k8txLjfN.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-BUcf6a44.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-Cos2YZBk.js";
3
- import { setupGitHubToken } from "./token-CWYd9Sw5.js";
2
+ import { getCopilotUsage } from "./utils-BwypGMpg.js";
3
+ import { setupGitHubToken } from "./token-DmouB1Xt.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-DKdBAt3u.js.map
44
+ //# sourceMappingURL=check-usage-BCVxySxz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-usage-DKdBAt3u.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-BCVxySxz.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-k8txLjfN.js");
24
- const { checkUsage } = await import("./check-usage-DKdBAt3u.js");
23
+ const { auth } = await import("./auth-BUcf6a44.js");
24
+ const { checkUsage } = await import("./check-usage-BCVxySxz.js");
25
25
  const { debug } = await import("./debug-DcC7ZPH0.js");
26
- const { start } = await import("./start-YQSDnOkf.js");
26
+ const { start } = await import("./start-D_vX0qu0.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 { HTTPError, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-Cos2YZBk.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-BwypGMpg.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";
@@ -263,7 +263,7 @@ const createChatCompletions = async (payload, options) => {
263
263
  "x-initiator": isAgentCall ? "agent" : "user"
264
264
  };
265
265
  prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
266
- prepareForCompact(headers, options.isCompact);
266
+ prepareForCompact(headers, options.compactType);
267
267
  const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {
268
268
  method: "POST",
269
269
  headers,
@@ -937,14 +937,14 @@ async function handleCountTokens(c) {
937
937
 
938
938
  //#endregion
939
939
  //#region src/services/copilot/create-responses.ts
940
- const createResponses = async (payload, { vision, initiator, subagentMarker, requestId, sessionId, isCompact }) => {
940
+ const createResponses = async (payload, { vision, initiator, subagentMarker, requestId, sessionId, compactType }) => {
941
941
  if (!state.copilotToken) throw new Error("Copilot token not found");
942
942
  const headers = {
943
943
  ...copilotHeaders(state, requestId, vision),
944
944
  "x-initiator": initiator
945
945
  };
946
946
  prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers);
947
- prepareForCompact(headers, isCompact);
947
+ prepareForCompact(headers, compactType);
948
948
  payload.service_tier = null;
949
949
  const response = await fetch(`${copilotBaseUrl(state)}/responses`, {
950
950
  method: "POST",
@@ -1876,18 +1876,18 @@ const containsVisionContent = (value) => {
1876
1876
  //#endregion
1877
1877
  //#region src/services/copilot/create-messages.ts
1878
1878
  const INTERLEAVED_THINKING_BETA = "interleaved-thinking-2025-05-14";
1879
+ const ADVANCED_TOOL_USE_BETA = "advanced-tool-use-2025-11-20";
1879
1880
  const allowedAnthropicBetas = new Set([
1880
1881
  INTERLEAVED_THINKING_BETA,
1881
1882
  "context-management-2025-06-27",
1882
- "advanced-tool-use-2025-11-20"
1883
+ ADVANCED_TOOL_USE_BETA
1883
1884
  ]);
1884
1885
  const buildAnthropicBetaHeader = (anthropicBetaHeader, thinking) => {
1885
1886
  const isAdaptiveThinking = thinking?.type === "adaptive";
1886
1887
  if (anthropicBetaHeader) {
1887
1888
  const filteredBeta = anthropicBetaHeader.split(",").map((item) => item.trim()).filter((item) => item.length > 0).filter((item) => allowedAnthropicBetas.has(item));
1888
- const uniqueFilteredBetas = [...new Set(filteredBeta)];
1889
- const finalFilteredBetas = isAdaptiveThinking ? uniqueFilteredBetas.filter((item) => item !== INTERLEAVED_THINKING_BETA) : uniqueFilteredBetas;
1890
- if (finalFilteredBetas.length > 0) return finalFilteredBetas.join(",");
1889
+ const uniqueFilteredBetas = [...new Set([ADVANCED_TOOL_USE_BETA, ...filteredBeta])];
1890
+ if (uniqueFilteredBetas.length > 0) return uniqueFilteredBetas.join(",");
1891
1891
  return;
1892
1892
  }
1893
1893
  if (thinking?.budget_tokens && !isAdaptiveThinking) return INTERLEAVED_THINKING_BETA;
@@ -1906,7 +1906,7 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
1906
1906
  "x-initiator": isInitiateRequest ? "user" : "agent"
1907
1907
  };
1908
1908
  prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
1909
- prepareForCompact(headers, options.isCompact);
1909
+ prepareForCompact(headers, options.compactType);
1910
1910
  const { safetyIdentifier, sessionId } = parseUserIdMetadata(payload.metadata?.user_id);
1911
1911
  if (safetyIdentifier && sessionId) prepareMessageProxyHeaders(headers);
1912
1912
  const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking);
@@ -1926,11 +1926,10 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
1926
1926
 
1927
1927
  //#endregion
1928
1928
  //#region src/routes/messages/preprocess.ts
1929
- const compactSystemPromptStart = "You are a helpful AI assistant tasked with summarizing conversations";
1930
- const compactTextOnlyGuard = "CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.";
1931
- const compactSummaryPromptStart = "Your task is to create a detailed summary of the conversation so far";
1932
- const compactMessageSections = ["Pending Tasks:", "Current Work:"];
1933
1929
  const TOOL_REFERENCE_TURN_BOUNDARY = "Tool loaded.";
1930
+ const IDE_EXECUTE_CODE_TOOL = "mcp__ide__executeCode";
1931
+ const IDE_GET_DIAGNOSTICS_TOOL = "mcp__ide__getDiagnostics";
1932
+ const IDE_GET_DIAGNOSTICS_DESCRIPTION = "Get language diagnostics from VS Code. Returns errors, warnings, information, and hints for files in the workspace.";
1934
1933
  const getAnthropicEffortForModel = (model) => {
1935
1934
  const reasoningEffort = getReasoningEffortForModel(model);
1936
1935
  if (reasoningEffort === "xhigh") return "max";
@@ -1947,13 +1946,19 @@ const isCompactMessage = (lastMessage) => {
1947
1946
  if (!text) return false;
1948
1947
  return text.includes(compactTextOnlyGuard) && text.includes(compactSummaryPromptStart) && compactMessageSections.some((section) => text.includes(section));
1949
1948
  };
1950
- const isCompactRequest = (anthropicPayload) => {
1949
+ const isCompactAutoContinueMessage = (lastMessage) => {
1950
+ const text = getCompactCandidateText(lastMessage);
1951
+ return Boolean(text) && compactAutoContinuePromptStarts.some((promptStart) => text.startsWith(promptStart));
1952
+ };
1953
+ const getCompactType = (anthropicPayload) => {
1951
1954
  const lastMessage = anthropicPayload.messages.at(-1);
1952
- if (lastMessage && isCompactMessage(lastMessage)) return true;
1955
+ if (lastMessage && isCompactMessage(lastMessage)) return COMPACT_REQUEST;
1956
+ if (lastMessage && isCompactAutoContinueMessage(lastMessage)) return COMPACT_AUTO_CONTINUE;
1953
1957
  const system = anthropicPayload.system;
1954
- if (typeof system === "string") return system.startsWith(compactSystemPromptStart);
1955
- if (!Array.isArray(system)) return false;
1956
- return system.some((msg) => typeof msg.text === "string" && msg.text.startsWith(compactSystemPromptStart));
1958
+ if (typeof system === "string") return system.startsWith(compactSystemPromptStart) ? COMPACT_REQUEST : 0;
1959
+ if (!Array.isArray(system)) return 0;
1960
+ if (system.some((msg) => typeof msg.text === "string" && msg.text.startsWith(compactSystemPromptStart))) return COMPACT_REQUEST;
1961
+ return 0;
1957
1962
  };
1958
1963
  const mergeContentWithText = (tr, textBlock) => {
1959
1964
  if (typeof tr.content === "string") return {
@@ -2008,6 +2013,17 @@ const mergeToolResultForClaude = (anthropicPayload) => {
2008
2013
  msg.content = mergeToolResult(toolResults, textBlocks);
2009
2014
  }
2010
2015
  };
2016
+ const sanitizeIdeTools = (payload) => {
2017
+ if (!payload.tools || payload.tools.length === 0) return;
2018
+ payload.tools = payload.tools.flatMap((tool) => {
2019
+ if (tool.name === IDE_EXECUTE_CODE_TOOL) return [];
2020
+ if (tool.name === IDE_GET_DIAGNOSTICS_TOOL) return [{
2021
+ ...tool,
2022
+ description: IDE_GET_DIAGNOSTICS_DESCRIPTION
2023
+ }];
2024
+ return [tool];
2025
+ });
2026
+ };
2011
2027
  const hasToolRef = (block) => {
2012
2028
  return Array.isArray(block.content) && block.content.some((c) => c.type === "tool_reference");
2013
2029
  };
@@ -2030,10 +2046,12 @@ const filterAssistantThinkingBlocks = (payload) => {
2030
2046
  const prepareMessagesApiPayload = (payload, selectedModel) => {
2031
2047
  stripCacheControl(payload);
2032
2048
  filterAssistantThinkingBlocks(payload);
2049
+ const hasThinking = Boolean(payload.thinking);
2033
2050
  const toolChoice = payload.tool_choice;
2034
2051
  const disableThink = toolChoice?.type === "any" || toolChoice?.type === "tool";
2035
2052
  if (selectedModel?.capabilities.supports.adaptive_thinking && !disableThink) {
2036
2053
  payload.thinking = { type: "adaptive" };
2054
+ if (!hasThinking) payload.thinking.display = "summarized";
2037
2055
  payload.output_config = { effort: getAnthropicEffortForModel(payload.model) };
2038
2056
  }
2039
2057
  };
@@ -2291,14 +2309,14 @@ function closeThinkingBlockIfOpen(state$1, events$1) {
2291
2309
  //#endregion
2292
2310
  //#region src/routes/messages/api-flows.ts
2293
2311
  const handleWithChatCompletions = async (c, anthropicPayload, options) => {
2294
- const { logger: logger$7, subagentMarker, requestId, sessionId, isCompact } = options;
2312
+ const { logger: logger$7, subagentMarker, requestId, sessionId, compactType } = options;
2295
2313
  const openAIPayload = translateToOpenAI(anthropicPayload);
2296
2314
  debugJson(logger$7, "Translated OpenAI request payload:", openAIPayload);
2297
2315
  const response = await createChatCompletions(openAIPayload, {
2298
2316
  subagentMarker,
2299
2317
  requestId,
2300
2318
  sessionId,
2301
- isCompact
2319
+ compactType
2302
2320
  });
2303
2321
  if (isNonStreaming(response)) {
2304
2322
  debugJson(logger$7, "Non-streaming response from Copilot:", response);
@@ -2333,7 +2351,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
2333
2351
  });
2334
2352
  };
2335
2353
  const handleWithResponsesApi = async (c, anthropicPayload, options) => {
2336
- const { logger: logger$7, subagentMarker, selectedModel, requestId, sessionId, isCompact } = options;
2354
+ const { logger: logger$7, subagentMarker, selectedModel, requestId, sessionId, compactType } = options;
2337
2355
  const responsesPayload = translateAnthropicMessagesToResponsesPayload(anthropicPayload);
2338
2356
  applyResponsesApiContextManagement(responsesPayload, selectedModel?.capabilities.limits.max_prompt_tokens);
2339
2357
  compactInputByLatestCompaction(responsesPayload);
@@ -2345,7 +2363,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
2345
2363
  subagentMarker,
2346
2364
  requestId,
2347
2365
  sessionId,
2348
- isCompact
2366
+ compactType
2349
2367
  });
2350
2368
  if (responsesPayload.stream && isAsyncIterable$1(response)) {
2351
2369
  logger$7.debug("Streaming response from Copilot (Responses API)");
@@ -2395,14 +2413,14 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
2395
2413
  return c.json(anthropicResponse);
2396
2414
  };
2397
2415
  const handleWithMessagesApi = async (c, anthropicPayload, options) => {
2398
- const { logger: logger$7, anthropicBetaHeader, subagentMarker, selectedModel, requestId, sessionId, isCompact } = options;
2416
+ const { logger: logger$7, anthropicBetaHeader, subagentMarker, selectedModel, requestId, sessionId, compactType } = options;
2399
2417
  prepareMessagesApiPayload(anthropicPayload, selectedModel);
2400
2418
  debugJson(logger$7, "Translated Messages payload:", anthropicPayload);
2401
2419
  const response = await createMessages(anthropicPayload, anthropicBetaHeader, {
2402
2420
  subagentMarker,
2403
2421
  requestId,
2404
2422
  sessionId,
2405
- isCompact
2423
+ compactType
2406
2424
  });
2407
2425
  if (isAsyncIterable$1(response)) {
2408
2426
  logger$7.debug("Streaming response from Copilot (Messages API)");
@@ -2428,8 +2446,11 @@ const isNonStreaming = (response) => Object.hasOwn(response, "choices");
2428
2446
  const isAsyncIterable$1 = (value) => Boolean(value) && typeof value[Symbol.asyncIterator] === "function";
2429
2447
 
2430
2448
  //#endregion
2431
- //#region src/routes/messages/subagent-marker.ts
2449
+ //#region src/lib/subagent.ts
2432
2450
  const subagentMarkerPrefix = "__SUBAGENT_MARKER__";
2451
+
2452
+ //#endregion
2453
+ //#region src/routes/messages/subagent-marker.ts
2433
2454
  const parseSubagentMarkerFromFirstUser = (payload) => {
2434
2455
  const firstUserMessage = payload.messages.find((msg) => msg.role === "user" && Array.isArray(msg.content));
2435
2456
  if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) return null;
@@ -2456,7 +2477,7 @@ const parseSubagentMarkerFromSystemReminder = (text) => {
2456
2477
  searchFrom = reminderEnd + 18;
2457
2478
  continue;
2458
2479
  }
2459
- const markerJson = reminderContent.slice(markerIndex + 19).trim();
2480
+ const markerJson = reminderContent.slice(markerIndex + subagentMarkerPrefix.length).trim();
2460
2481
  try {
2461
2482
  const parsed = JSON.parse(markerJson);
2462
2483
  if (!parsed.session_id || !parsed.agent_id || !parsed.agent_type) {
@@ -2479,16 +2500,17 @@ async function handleCompletion(c) {
2479
2500
  await checkRateLimit(state);
2480
2501
  const anthropicPayload = await c.req.json();
2481
2502
  debugJson(logger$5, "Anthropic request payload:", anthropicPayload);
2503
+ sanitizeIdeTools(anthropicPayload);
2482
2504
  const subagentMarker = parseSubagentMarkerFromFirstUser(anthropicPayload);
2483
2505
  if (subagentMarker) debugJson(logger$5, "Detected Subagent marker:", subagentMarker);
2484
2506
  const sessionId = getRootSessionId(anthropicPayload, c);
2485
2507
  logger$5.debug("Extracted session ID:", sessionId);
2486
- const isCompact = isCompactRequest(anthropicPayload);
2508
+ const compactType = getCompactType(anthropicPayload);
2487
2509
  const anthropicBeta = c.req.header("anthropic-beta");
2488
2510
  logger$5.debug("Anthropic Beta header:", anthropicBeta);
2489
2511
  const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
2490
- if (anthropicBeta && noTools && !isCompact) anthropicPayload.model = getSmallModel();
2491
- if (isCompact) logger$5.debug("Is compact request:", isCompact);
2512
+ if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
2513
+ if (compactType) logger$5.debug("Compact request type:", compactType);
2492
2514
  else {
2493
2515
  stripToolReferenceTurnBoundary(anthropicPayload);
2494
2516
  mergeToolResultForClaude(anthropicPayload);
@@ -2504,7 +2526,7 @@ async function handleCompletion(c) {
2504
2526
  selectedModel,
2505
2527
  requestId,
2506
2528
  sessionId,
2507
- isCompact,
2529
+ compactType,
2508
2530
  logger: logger$5
2509
2531
  });
2510
2532
  if (shouldUseResponsesApi(selectedModel)) return await handleWithResponsesApi(c, anthropicPayload, {
@@ -2512,14 +2534,14 @@ async function handleCompletion(c) {
2512
2534
  selectedModel,
2513
2535
  requestId,
2514
2536
  sessionId,
2515
- isCompact,
2537
+ compactType,
2516
2538
  logger: logger$5
2517
2539
  });
2518
2540
  return await handleWithChatCompletions(c, anthropicPayload, {
2519
2541
  subagentMarker,
2520
2542
  requestId,
2521
2543
  sessionId,
2522
- isCompact,
2544
+ compactType,
2523
2545
  logger: logger$5
2524
2546
  });
2525
2547
  }
@@ -3004,4 +3026,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
3004
3026
 
3005
3027
  //#endregion
3006
3028
  export { server };
3007
- //# sourceMappingURL=server-k1q2UIFm.js.map
3029
+ //# sourceMappingURL=server-0qplzbyJ.js.map