@jeffreycao/copilot-api 1.10.5 → 1.10.7

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
@@ -609,7 +609,7 @@ Add the tool search bridge to the MCP config used by Claude Code:
609
609
  "tool_search": {
610
610
  "type": "stdio",
611
611
  "command": "npx",
612
- "args": ["@jeffreycao/copilot-api@latest", "mcp"]
612
+ "args": ["-y", "@jeffreycao/copilot-api@latest", "mcp"]
613
613
  }
614
614
  }
615
615
  }
@@ -622,7 +622,7 @@ Add the tool search bridge to the MCP config used by opencode:
622
622
  "mcp": {
623
623
  "tool_search": {
624
624
  "type": "local",
625
- "command": ["npx", "@jeffreycao/copilot-api@latest", "mcp"]
625
+ "command": ["npx", "-y", "@jeffreycao/copilot-api@latest", "mcp"]
626
626
  }
627
627
  }
628
628
  }
package/README.zh-CN.md CHANGED
@@ -615,7 +615,7 @@ GPT 模型不要设置 Claude Code 原生的 `ENABLE_TOOL_SEARCH`。这个开关
615
615
  "tool_search": {
616
616
  "type": "stdio",
617
617
  "command": "npx",
618
- "args": ["@jeffreycao/copilot-api@latest", "mcp"]
618
+ "args": ["-y", "@jeffreycao/copilot-api@latest", "mcp"]
619
619
  }
620
620
  }
621
621
  }
@@ -628,7 +628,7 @@ GPT 模型不要设置 Claude Code 原生的 `ENABLE_TOOL_SEARCH`。这个开关
628
628
  "mcp": {
629
629
  "tool_search": {
630
630
  "type": "local",
631
- "command": ["npx", "@jeffreycao/copilot-api@latest", "mcp"]
631
+ "command": ["npx", "-y", "@jeffreycao/copilot-api@latest", "mcp"]
632
632
  }
633
633
  }
634
634
  }
package/dist/main.js CHANGED
@@ -42,8 +42,8 @@ bindElectronFetch();
42
42
  const { auth } = await import("./auth-BHa2OHXf.js");
43
43
  const { checkUsage } = await import("./check-usage-BdXGp1Wr.js");
44
44
  const { debug } = await import("./debug-C_TBkyUw.js");
45
- const { mcp } = await import("./mcp-cZ7TLr1M.js");
46
- const { start } = await import("./start-BkG22v1Z.js");
45
+ const { mcp } = await import("./mcp-CTb-DbQH.js");
46
+ const { start } = await import("./start-D5EioAT0.js");
47
47
  await runMain(defineCommand({
48
48
  meta: {
49
49
  name: "copilot-api",
@@ -1,4 +1,4 @@
1
- import { n as createMcpToolSearchSentinel } from "./tool-search-CKe6hqnv.js";
1
+ import { n as createMcpToolSearchSentinel } from "./tool-search-D3SN0jX-.js";
2
2
  import { defineCommand } from "citty";
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -34,4 +34,4 @@ const mcp = defineCommand({
34
34
  //#endregion
35
35
  export { mcp };
36
36
 
37
- //# sourceMappingURL=mcp-cZ7TLr1M.js.map
37
+ //# sourceMappingURL=mcp-CTb-DbQH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-cZ7TLr1M.js","names":[],"sources":["../src/mcp.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { defineCommand } from \"citty\"\nimport { z } from \"zod\"\n\nimport { createMcpToolSearchSentinel } from \"./lib/tool-search\"\n\nconst SERVER_NAME = \"tool_search\"\nconst SERVER_VERSION = \"1.0.0\"\n\nexport const runMcpServer = async (): Promise<void> => {\n const server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n })\n\n server.registerTool(\n \"search\",\n {\n title: \"Tool Search Bridge\",\n description:\n \"Load deferred tools by exact name through the Copilot API tool_search bridge.\",\n inputSchema: {\n names: z\n .string()\n .describe(\n 'Comma-separated exact deferred tool names to load, for example \"TaskList,TaskGet,mcp__fetch__fetch\".',\n ),\n },\n _meta: {\n \"anthropic/alwaysLoad\": true,\n },\n },\n ({ names }) => ({\n content: [\n {\n type: \"text\",\n text: createMcpToolSearchSentinel(names),\n },\n ],\n }),\n )\n\n await server.connect(new StdioServerTransport())\n}\n\nexport const mcp = defineCommand({\n meta: {\n name: \"mcp\",\n description: \"Start the Copilot API MCP tool_search bridge over stdio\",\n },\n run() {\n return runMcpServer()\n },\n})\n"],"mappings":";;;;;;AASA,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAEvB,MAAa,eAAe,YAA2B;CACrD,MAAM,SAAS,IAAI,UAAU;EAC3B,MAAM;EACN,SAAS;EACV,CAAC;CAEF,OAAO,aACL,UACA;EACE,OAAO;EACP,aACE;EACF,aAAa,EACX,OAAO,EACJ,QAAQ,CACR,SACC,yGACD,EACJ;EACD,OAAO,EACL,wBAAwB,MACzB;EACF,GACA,EAAE,aAAa,EACd,SAAS,CACP;EACE,MAAM;EACN,MAAM,4BAA4B,MAAM;EACzC,CACF,EACF,EACF;CAED,MAAM,OAAO,QAAQ,IAAI,sBAAsB,CAAC;;AAGlD,MAAa,MAAM,cAAc;CAC/B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,OAAO,cAAc;;CAExB,CAAC"}
1
+ {"version":3,"file":"mcp-CTb-DbQH.js","names":[],"sources":["../src/mcp.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { defineCommand } from \"citty\"\nimport { z } from \"zod\"\n\nimport { createMcpToolSearchSentinel } from \"./lib/tool-search\"\n\nconst SERVER_NAME = \"tool_search\"\nconst SERVER_VERSION = \"1.0.0\"\n\nexport const runMcpServer = async (): Promise<void> => {\n const server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n })\n\n server.registerTool(\n \"search\",\n {\n title: \"Tool Search Bridge\",\n description:\n \"Load deferred tools by exact name through the Copilot API tool_search bridge.\",\n inputSchema: {\n names: z\n .string()\n .describe(\n 'Comma-separated exact deferred tool names to load, for example \"TaskList,TaskGet,mcp__fetch__fetch\".',\n ),\n },\n _meta: {\n \"anthropic/alwaysLoad\": true,\n },\n },\n ({ names }) => ({\n content: [\n {\n type: \"text\",\n text: createMcpToolSearchSentinel(names),\n },\n ],\n }),\n )\n\n await server.connect(new StdioServerTransport())\n}\n\nexport const mcp = defineCommand({\n meta: {\n name: \"mcp\",\n description: \"Start the Copilot API MCP tool_search bridge over stdio\",\n },\n run() {\n return runMcpServer()\n },\n})\n"],"mappings":";;;;;;AASA,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAEvB,MAAa,eAAe,YAA2B;CACrD,MAAM,SAAS,IAAI,UAAU;EAC3B,MAAM;EACN,SAAS;EACV,CAAC;CAEF,OAAO,aACL,UACA;EACE,OAAO;EACP,aACE;EACF,aAAa,EACX,OAAO,EACJ,QAAQ,CACR,SACC,yGACD,EACJ;EACD,OAAO,EACL,wBAAwB,MACzB;EACF,GACA,EAAE,aAAa,EACd,SAAS,CACP;EACE,MAAM;EACN,MAAM,4BAA4B,MAAM;EACzC,CACF,EACF,EACF;CAED,MAAM,OAAO,QAAQ,IAAI,sBAAsB,CAAC;;AAGlD,MAAa,MAAM,cAAc;CAC/B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,OAAO,cAAc;;CAExB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { t as PATHS } from "./paths-DC-mqCY3.js";
2
2
  import { D as generateTraceId, E as prepareMessageProxyHeaders, I as state, M as compactMessageSections, O as requestContext, P as compactSystemPromptStarts, T as prepareInteractionHeaders, _ as copilotWebSocketHeaders, c as getUUID, d as sleep, f as getCopilotUsage, g as copilotHeaders, h as copilotBaseUrl, j as compactAutoContinuePromptStarts, k as resolveTraceId$1, l as isNullish, m as forwardError, n as cacheModels, o as generateRequestIdFromPayload, p as HTTPError, s as getRootSessionId, u as parseUserIdMetadata, w as prepareForCompact } from "./utils-jHLgqAq2.js";
3
- import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-CKe6hqnv.js";
3
+ import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-D3SN0jX-.js";
4
4
  import { _ as setModelMappings, a as getConfig, c as getProviderConfig, d as isMessagesApiEnabled, f as isResponsesApiContextManagementModel, g as resolveMappedModel, i as getClaudeTokenMultiplier, l as getReasoningEffortForModel, m as isResponsesApiWebSocketEnabled, o as getExtraPromptForModel, p as isResponsesApiWebSearchEnabled, r as getAnthropicApiKey, s as getModelMappings, t as getProxyEnvDispatcher, u as getSmallModel } from "./proxy-CSO5SLia.js";
5
5
  import consola from "consola";
6
6
  import fs from "node:fs/promises";
@@ -4080,6 +4080,25 @@ const IDE_EXECUTE_CODE_TOOL = "mcp__ide__executeCode";
4080
4080
  const IDE_GET_DIAGNOSTICS_TOOL = "mcp__ide__getDiagnostics";
4081
4081
  const IDE_GET_DIAGNOSTICS_DESCRIPTION = "Get language diagnostics from VS Code. Returns errors, warnings, information, and hints for files in the workspace.";
4082
4082
  const PDF_FILE_READ_PREFIX = "PDF file read:";
4083
+ const getBlockCacheControl = (block) => {
4084
+ if (!block || block.type === "thinking") return;
4085
+ const cacheControl = block.cache_control;
4086
+ if (!cacheControl || typeof cacheControl !== "object") return;
4087
+ return cacheControl;
4088
+ };
4089
+ const getLastMessageContentCacheControl = (lastMessage) => {
4090
+ if (!lastMessage || !Array.isArray(lastMessage.content)) return;
4091
+ const cacheControl = getBlockCacheControl(lastMessage.content.at(-1));
4092
+ return cacheControl ? { ...cacheControl } : void 0;
4093
+ };
4094
+ const applyLastMessageCacheControl = (anthropicPayload, lastMessageCacheControl) => {
4095
+ const cacheControl = lastMessageCacheControl ?? { type: "ephemeral" };
4096
+ const lastMessage = anthropicPayload.messages.at(-1);
4097
+ if (!lastMessage || !Array.isArray(lastMessage.content)) return;
4098
+ const lastBlock = lastMessage.content.at(-1);
4099
+ if (!lastBlock || lastBlock.type === "thinking" || lastBlock.cache_control) return;
4100
+ lastBlock.cache_control = { ...cacheControl };
4101
+ };
4083
4102
  const getCompactCandidateText = (message) => {
4084
4103
  if (message.role !== "user") return "";
4085
4104
  if (typeof message.content === "string") return message.content;
@@ -4284,11 +4303,10 @@ const hasToolRef = (block) => {
4284
4303
  };
4285
4304
  const stripCacheControl = (payload) => {
4286
4305
  if (Array.isArray(payload.system)) for (const block of payload.system) {
4287
- const systemBlock = block;
4288
- const cacheControl = systemBlock.cache_control;
4306
+ const cacheControl = block.cache_control;
4289
4307
  if (cacheControl && typeof cacheControl === "object") {
4290
4308
  const { scope, ...rest } = cacheControl;
4291
- systemBlock.cache_control = rest;
4309
+ block.cache_control = rest;
4292
4310
  }
4293
4311
  }
4294
4312
  };
@@ -4618,8 +4636,10 @@ async function handleCompletion(c) {
4618
4636
  const noTools = !anthropicPayload.tools || anthropicPayload.tools.length === 0;
4619
4637
  if (anthropicBeta && noTools && compactType === 0) anthropicPayload.model = getSmallModel();
4620
4638
  if (compactType) logger$3.debug("Compact request type:", compactType);
4639
+ const lastMessageCacheControl = getLastMessageContentCacheControl(anthropicPayload.messages.at(-1));
4621
4640
  stripToolReferenceTurnBoundary(anthropicPayload);
4622
4641
  mergeToolResultForClaude(anthropicPayload, { skipLastMessage: compactType === 1 });
4642
+ applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl);
4623
4643
  const requestId = generateRequestIdFromPayload(anthropicPayload, sessionId);
4624
4644
  logger$3.debug("Generated request ID:", requestId);
4625
4645
  if (state.manualApprove) await awaitApproval();
@@ -5019,4 +5039,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
5019
5039
  //#endregion
5020
5040
  export { server };
5021
5041
 
5022
- //# sourceMappingURL=server-DsfYz_GE.js.map
5042
+ //# sourceMappingURL=server-S8A-8fWL.js.map