@jeffreycao/copilot-api 1.5.9 → 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.
- package/dist/{auth-yt2WMpWW.js → auth-BUcf6a44.js} +3 -3
- package/dist/{auth-yt2WMpWW.js.map → auth-BUcf6a44.js.map} +1 -1
- package/dist/{check-usage-DED1f_8E.js → check-usage-BCVxySxz.js} +3 -3
- package/dist/{check-usage-DED1f_8E.js.map → check-usage-BCVxySxz.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{server-CtHcJs9h.js → server-0qplzbyJ.js} +55 -33
- package/dist/server-0qplzbyJ.js.map +1 -0
- package/dist/{start-BcKayImL.js → start-D_vX0qu0.js} +4 -4
- package/dist/{start-BcKayImL.js.map → start-D_vX0qu0.js.map} +1 -1
- package/dist/{token-D1JoGg8c.js → token-DmouB1Xt.js} +2 -2
- package/dist/{token-D1JoGg8c.js.map → token-DmouB1Xt.js.map} +1 -1
- package/dist/{utils-CAW43BKR.js → utils-BwypGMpg.js} +25 -7
- package/dist/utils-BwypGMpg.js.map +1 -0
- package/package.json +1 -1
- package/dist/server-CtHcJs9h.js.map +0 -1
- package/dist/utils-CAW43BKR.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PATHS, ensurePaths } from "./paths-Cla6y5eD.js";
|
|
2
|
-
import { state } from "./utils-
|
|
3
|
-
import { setupGitHubToken } from "./token-
|
|
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-
|
|
46
|
+
//# sourceMappingURL=auth-BUcf6a44.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-
|
|
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-
|
|
3
|
-
import { setupGitHubToken } from "./token-
|
|
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-
|
|
44
|
+
//# sourceMappingURL=check-usage-BCVxySxz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-usage-
|
|
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-
|
|
24
|
-
const { checkUsage } = await import("./check-usage-
|
|
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-
|
|
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-
|
|
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.
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
1956
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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/
|
|
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 +
|
|
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
|
|
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 &&
|
|
2491
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
3029
|
+
//# sourceMappingURL=server-0qplzbyJ.js.map
|