@jeffreycao/copilot-api 1.5.3-beta.3 → 1.5.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.
package/README.md CHANGED
@@ -614,7 +614,7 @@ Here is an example `.claude/settings.json` file:
614
614
  - Setting CLAUDE_CODE_ATTRIBUTION_HEADER to 0 can prevent Claude code from adding billing and version information in system prompts, thereby avoiding prompt cache invalidation.
615
615
  - Turning off CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION can prevent quota from being consumed unnecessarily.
616
616
  - Permissions deny WebSearch because the GitHub Copilot API does not support natie websearch (some gpt models support websearch, but the current project has not adapted websearch); it is recommended to install the mcp mcp_server_fetch tool or other search tools as alternatives..
617
- - Please do not enable `ENABLE_TOOL_SEARCH`, as the current Claude Code uses the client tool search mode. In this mode, loading defer tools requires an additional request each time, and cache hit rates are affected, so it does not necessarily save tokens. Only server tool search mode can save tokens. The current project has compatibility issues with client tool search mode, which can also cause errors when used.
617
+ - If using a non-Claude model, do not enable ENABLE_TOOL_SEARCH. If using the Claude model, can enable ENABLE_TOOL_SEARCH. The current Claude Code uses the client tool search mode. In this mode, loading defer tools requires an additional request each time, and cache hit rates are affected, so it does not necessarily save tokens,but it can save context. Only server tool search mode can save tokens.
618
618
 
619
619
  You can find more options here: [Claude Code settings](https://docs.anthropic.com/en/docs/claude-code/settings#environment-variables)
620
620
 
@@ -1,6 +1,6 @@
1
1
  import { PATHS, ensurePaths } from "./paths-Cla6y5eD.js";
2
- import { state } from "./utils-DDQKGVRQ.js";
3
- import { setupGitHubToken } from "./token-CEABFmH9.js";
2
+ import { state } from "./utils-CKrfAAVw.js";
3
+ import { setupGitHubToken } from "./token-CQKghKXN.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-DqeBalDi.js.map
46
+ //# sourceMappingURL=auth-B7io-Eju.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-DqeBalDi.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-B7io-Eju.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-DDQKGVRQ.js";
3
- import { setupGitHubToken } from "./token-CEABFmH9.js";
2
+ import { getCopilotUsage } from "./utils-CKrfAAVw.js";
3
+ import { setupGitHubToken } from "./token-CQKghKXN.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-BCT4zrbb.js.map
44
+ //# sourceMappingURL=check-usage-DLE8UgqB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-usage-BCT4zrbb.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-DLE8UgqB.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-DqeBalDi.js");
24
- const { checkUsage } = await import("./check-usage-BCT4zrbb.js");
23
+ const { auth } = await import("./auth-B7io-Eju.js");
24
+ const { checkUsage } = await import("./check-usage-DLE8UgqB.js");
25
25
  const { debug } = await import("./debug-DcC7ZPH0.js");
26
- const { start } = await import("./start-CrNDSGP_.js");
26
+ const { start } = await import("./start-CuRcvtuH.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-DDQKGVRQ.js";
2
+ import { HTTPError, cacheModels, copilotBaseUrl, copilotHeaders, forwardError, generateRequestIdFromPayload, getCopilotUsage, getRootSessionId, getUUID, isNullish, parseUserIdMetadata, prepareForCompact, prepareInteractionHeaders, prepareMessageProxyHeaders, requestContext, resolveTraceId, sleep, state } from "./utils-CKrfAAVw.js";
3
3
  import { getAnthropicApiKey, getClaudeTokenMultiplier, getConfig, getExtraPromptForModel, getProviderConfig, getReasoningEffortForModel, getSmallModel, isMessagesApiEnabled, isResponsesApiContextManagementModel, isResponsesApiWebSearchEnabled } from "./config-EvlyFBSs.js";
4
4
  import consola from "consola";
5
5
  import path from "node:path";
@@ -64,7 +64,9 @@ const traceIdMiddleware = async (c, next) => {
64
64
  const context = {
65
65
  traceId,
66
66
  startTime: Date.now(),
67
- userAgent: c.req.header("user-agent") || ""
67
+ userAgent: c.req.header("user-agent") || "",
68
+ sessionAffinity: c.req.header("x-session-affinity"),
69
+ parentSessionId: c.req.header("x-parent-session-id")
68
70
  };
69
71
  await requestContext.run(context, async () => {
70
72
  await next();
@@ -744,7 +746,6 @@ function handleAssistantMessage(message, modelId) {
744
746
  function mapContent(content) {
745
747
  if (typeof content === "string") return content;
746
748
  if (!Array.isArray(content)) return null;
747
- if (!content.some((block) => block.type === "image")) return content.filter((block) => block.type === "text").map((block) => block.text).join("\n\n");
748
749
  const contentParts = [];
749
750
  for (const block of content) switch (block.type) {
750
751
  case "text":
@@ -759,6 +760,12 @@ function mapContent(content) {
759
760
  image_url: { url: `data:${block.source.media_type};base64,${block.source.data}` }
760
761
  });
761
762
  break;
763
+ case "tool_reference":
764
+ contentParts.push({
765
+ type: "text",
766
+ text: `Tool ${block.tool_name} loaded`
767
+ });
768
+ break;
762
769
  }
763
770
  return contentParts;
764
771
  }
@@ -1370,6 +1377,9 @@ const convertToolResultContent = (content) => {
1370
1377
  case "image":
1371
1378
  result.push(createImageContent(block));
1372
1379
  break;
1380
+ case "tool_reference":
1381
+ result.push(createTextContent(`Tool ${block.tool_name} loaded`));
1382
+ break;
1373
1383
  default: break;
1374
1384
  }
1375
1385
  return result;
@@ -1924,6 +1934,7 @@ const compactSystemPromptStart = "You are a helpful AI assistant tasked with sum
1924
1934
  const compactTextOnlyGuard = "CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.";
1925
1935
  const compactSummaryPromptStart = "Your task is to create a detailed summary of the conversation so far";
1926
1936
  const compactMessageSections = ["Pending Tasks:", "Current Work:"];
1937
+ const TOOL_REFERENCE_TURN_BOUNDARY = "Tool loaded.";
1927
1938
  const getAnthropicEffortForModel = (model) => {
1928
1939
  const reasoningEffort = getReasoningEffortForModel(model);
1929
1940
  if (reasoningEffort === "xhigh") return "max";
@@ -1953,6 +1964,7 @@ const mergeContentWithText = (tr, textBlock) => {
1953
1964
  ...tr,
1954
1965
  content: `${tr.content}\n\n${textBlock.text}`
1955
1966
  };
1967
+ if (hasToolRef(tr)) return tr;
1956
1968
  return {
1957
1969
  ...tr,
1958
1970
  content: [...tr.content, textBlock]
@@ -1966,6 +1978,7 @@ const mergeContentWithTexts = (tr, textBlocks) => {
1966
1978
  content: `${tr.content}\n\n${appendedTexts}`
1967
1979
  };
1968
1980
  }
1981
+ if (hasToolRef(tr)) return tr;
1969
1982
  return {
1970
1983
  ...tr,
1971
1984
  content: [...tr.content, ...textBlocks]
@@ -1976,6 +1989,13 @@ const mergeToolResult = (toolResults, textBlocks) => {
1976
1989
  const lastIndex = toolResults.length - 1;
1977
1990
  return toolResults.map((tr, i) => i === lastIndex ? mergeContentWithTexts(tr, textBlocks) : tr);
1978
1991
  };
1992
+ const stripToolReferenceTurnBoundary = (anthropicPayload) => {
1993
+ for (const msg of anthropicPayload.messages) {
1994
+ if (msg.role !== "user" || !Array.isArray(msg.content)) continue;
1995
+ if (!msg.content.some((block) => block.type === "tool_result" && hasToolRef(block))) continue;
1996
+ msg.content = msg.content.filter((block) => block.type !== "text" || block.text.trim() !== TOOL_REFERENCE_TURN_BOUNDARY);
1997
+ }
1998
+ };
1979
1999
  const mergeToolResultForClaude = (anthropicPayload) => {
1980
2000
  for (const msg of anthropicPayload.messages) {
1981
2001
  if (msg.role !== "user" || !Array.isArray(msg.content)) continue;
@@ -1992,6 +2012,9 @@ const mergeToolResultForClaude = (anthropicPayload) => {
1992
2012
  msg.content = mergeToolResult(toolResults, textBlocks);
1993
2013
  }
1994
2014
  };
2015
+ const hasToolRef = (block) => {
2016
+ return Array.isArray(block.content) && block.content.some((c) => c.type === "tool_reference");
2017
+ };
1995
2018
  const stripCacheControl = (payload) => {
1996
2019
  if (Array.isArray(payload.system)) for (const block of payload.system) {
1997
2020
  const systemBlock = block;
@@ -2412,7 +2435,7 @@ const isAsyncIterable$1 = (value) => Boolean(value) && typeof value[Symbol.async
2412
2435
  //#region src/routes/messages/subagent-marker.ts
2413
2436
  const subagentMarkerPrefix = "__SUBAGENT_MARKER__";
2414
2437
  const parseSubagentMarkerFromFirstUser = (payload) => {
2415
- const firstUserMessage = payload.messages.find((msg) => msg.role === "user");
2438
+ const firstUserMessage = payload.messages.find((msg) => msg.role === "user" && Array.isArray(msg.content));
2416
2439
  if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) return null;
2417
2440
  for (const block of firstUserMessage.content) {
2418
2441
  if (block.type !== "text") continue;
@@ -2470,7 +2493,10 @@ async function handleCompletion(c) {
2470
2493
  const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
2471
2494
  if (anthropicBeta && noTools && !isCompact) anthropicPayload.model = getSmallModel();
2472
2495
  if (isCompact) logger$5.debug("Is compact request:", isCompact);
2473
- else mergeToolResultForClaude(anthropicPayload);
2496
+ else {
2497
+ stripToolReferenceTurnBoundary(anthropicPayload);
2498
+ mergeToolResultForClaude(anthropicPayload);
2499
+ }
2474
2500
  const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
2475
2501
  logger$5.debug("Generated request ID:", requestId);
2476
2502
  if (state.manualApprove) await awaitApproval();
@@ -2979,4 +3005,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
2979
3005
 
2980
3006
  //#endregion
2981
3007
  export { server };
2982
- //# sourceMappingURL=server-DLaz3q72.js.map
3008
+ //# sourceMappingURL=server-CFiXEbAJ.js.map