xcode-copilot-server 2.2.0 → 3.1.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.
Files changed (173) hide show
  1. package/config.json5 +13 -8
  2. package/dist/cli-validators.d.ts +2 -0
  3. package/dist/cli-validators.js +10 -3
  4. package/dist/cli-validators.js.map +1 -1
  5. package/dist/config.d.ts +1 -1
  6. package/dist/config.js +2 -2
  7. package/dist/config.js.map +1 -1
  8. package/dist/conversation-manager.d.ts +2 -1
  9. package/dist/conversation-manager.js +20 -1
  10. package/dist/conversation-manager.js.map +1 -1
  11. package/dist/index.js +66 -105
  12. package/dist/index.js.map +1 -1
  13. package/dist/launchd/agent.d.ts +52 -0
  14. package/dist/launchd/agent.js +185 -0
  15. package/dist/launchd/agent.js.map +1 -0
  16. package/dist/launchd/index.d.ts +4 -0
  17. package/dist/launchd/index.js +3 -0
  18. package/dist/launchd/index.js.map +1 -0
  19. package/dist/launchd/socket.d.ts +5 -0
  20. package/dist/launchd/socket.js +31 -0
  21. package/dist/launchd/socket.js.map +1 -0
  22. package/dist/launchd-agent.d.ts +50 -0
  23. package/dist/launchd-agent.js +175 -0
  24. package/dist/launchd-agent.js.map +1 -0
  25. package/dist/launchd-socket.d.ts +5 -0
  26. package/dist/launchd-socket.js +33 -0
  27. package/dist/launchd-socket.js.map +1 -0
  28. package/dist/{handlers/messages → providers/claude}/count-tokens.js +2 -2
  29. package/dist/providers/claude/count-tokens.js.map +1 -0
  30. package/dist/{handlers/messages.d.ts → providers/claude/handler.d.ts} +2 -2
  31. package/dist/{handlers/messages.js → providers/claude/handler.js} +8 -8
  32. package/dist/providers/claude/handler.js.map +1 -0
  33. package/dist/{utils/anthropic-prompt.d.ts → providers/claude/prompt.d.ts} +1 -1
  34. package/dist/{utils/anthropic-prompt.js → providers/claude/prompt.js} +2 -2
  35. package/dist/providers/claude/prompt.js.map +1 -0
  36. package/dist/providers/{anthropic.d.ts → claude/provider.d.ts} +2 -2
  37. package/dist/providers/{anthropic.js → claude/provider.js} +8 -8
  38. package/dist/providers/claude/provider.js.map +1 -0
  39. package/dist/{schemas/anthropic.js → providers/claude/schemas.js} +1 -1
  40. package/dist/providers/claude/schemas.js.map +1 -0
  41. package/dist/providers/claude/streaming.js +116 -0
  42. package/dist/providers/claude/streaming.js.map +1 -0
  43. package/dist/{handlers/messages/tool-result-handler.d.ts → providers/claude/tool-results.d.ts} +1 -1
  44. package/dist/{handlers/messages/tool-result-handler.js → providers/claude/tool-results.js} +1 -1
  45. package/dist/providers/claude/tool-results.js.map +1 -0
  46. package/dist/providers/codex/handler.d.ts +4 -0
  47. package/dist/providers/codex/handler.js +164 -0
  48. package/dist/providers/codex/handler.js.map +1 -0
  49. package/dist/providers/codex/prompt.d.ts +4 -0
  50. package/dist/providers/codex/prompt.js +58 -0
  51. package/dist/providers/codex/prompt.js.map +1 -0
  52. package/dist/providers/codex/provider.d.ts +5 -0
  53. package/dist/providers/codex/provider.js +24 -0
  54. package/dist/providers/codex/provider.js.map +1 -0
  55. package/dist/providers/codex/schemas.d.ts +122 -0
  56. package/dist/providers/codex/schemas.js +55 -0
  57. package/dist/providers/codex/schemas.js.map +1 -0
  58. package/dist/providers/codex/streaming.d.ts +9 -0
  59. package/dist/providers/codex/streaming.js +172 -0
  60. package/dist/providers/codex/streaming.js.map +1 -0
  61. package/dist/providers/codex/tool-results.d.ts +4 -0
  62. package/dist/providers/codex/tool-results.js +9 -0
  63. package/dist/providers/codex/tool-results.js.map +1 -0
  64. package/dist/providers/index.d.ts +6 -1
  65. package/dist/providers/index.js +5 -3
  66. package/dist/providers/index.js.map +1 -1
  67. package/dist/{handlers/completions.d.ts → providers/openai/handler.d.ts} +2 -2
  68. package/dist/{handlers/completions.js → providers/openai/handler.js} +6 -6
  69. package/dist/providers/openai/handler.js.map +1 -0
  70. package/dist/{handlers → providers/openai}/models.d.ts +1 -1
  71. package/dist/{handlers → providers/openai}/models.js +1 -1
  72. package/dist/providers/openai/models.js.map +1 -0
  73. package/dist/providers/openai/prompt.d.ts +3 -0
  74. package/dist/{utils → providers/openai}/prompt.js +3 -15
  75. package/dist/providers/openai/prompt.js.map +1 -0
  76. package/dist/providers/{openai.d.ts → openai/provider.d.ts} +1 -1
  77. package/dist/providers/{openai.js → openai/provider.js} +4 -4
  78. package/dist/providers/openai/provider.js.map +1 -0
  79. package/dist/{schemas/openai.js → providers/openai/schemas.js} +1 -1
  80. package/dist/providers/openai/schemas.js.map +1 -0
  81. package/dist/{handlers/completions → providers/openai}/streaming.js +3 -3
  82. package/dist/providers/openai/streaming.js.map +1 -0
  83. package/dist/providers/shared/errors.js.map +1 -0
  84. package/dist/{utils → providers/shared}/model-resolver.d.ts +1 -1
  85. package/dist/providers/shared/model-resolver.js.map +1 -0
  86. package/dist/providers/shared/prompt-utils.d.ts +1 -0
  87. package/dist/providers/shared/prompt-utils.js +15 -0
  88. package/dist/providers/shared/prompt-utils.js.map +1 -0
  89. package/dist/{handlers → providers/shared}/session-config.d.ts +2 -2
  90. package/dist/{handlers → providers/shared}/session-config.js +24 -5
  91. package/dist/providers/shared/session-config.js.map +1 -0
  92. package/dist/providers/shared/streaming-core.d.ts +19 -0
  93. package/dist/providers/shared/streaming-core.js +176 -0
  94. package/dist/providers/shared/streaming-core.js.map +1 -0
  95. package/dist/{handlers → providers/shared}/streaming-utils.d.ts +2 -1
  96. package/dist/{handlers → providers/shared}/streaming-utils.js +11 -2
  97. package/dist/providers/shared/streaming-utils.js.map +1 -0
  98. package/dist/schemas/config.d.ts +19 -1
  99. package/dist/schemas/config.js +2 -1
  100. package/dist/schemas/config.js.map +1 -1
  101. package/dist/server.js +1 -2
  102. package/dist/server.js.map +1 -1
  103. package/dist/settings-patcher/claude.d.ts +5 -0
  104. package/dist/{settings-patcher.js → settings-patcher/claude.js} +4 -8
  105. package/dist/settings-patcher/claude.js.map +1 -0
  106. package/dist/settings-patcher/codex.d.ts +23 -0
  107. package/dist/settings-patcher/codex.js +114 -0
  108. package/dist/settings-patcher/codex.js.map +1 -0
  109. package/dist/settings-patcher/index.d.ts +15 -0
  110. package/dist/settings-patcher/index.js +9 -0
  111. package/dist/settings-patcher/index.js.map +1 -0
  112. package/dist/{settings-patcher.d.ts → settings-patcher/types.d.ts} +1 -5
  113. package/dist/settings-patcher/types.js.map +1 -0
  114. package/dist/startup.d.ts +13 -0
  115. package/dist/startup.js +193 -0
  116. package/dist/startup.js.map +1 -0
  117. package/dist/tool-bridge/constants.d.ts +2 -0
  118. package/dist/tool-bridge/constants.js +3 -0
  119. package/dist/tool-bridge/constants.js.map +1 -0
  120. package/dist/tool-bridge/index.d.ts +1 -0
  121. package/dist/tool-bridge/index.js +1 -0
  122. package/dist/tool-bridge/index.js.map +1 -1
  123. package/dist/tool-bridge/routes.js +2 -1
  124. package/dist/tool-bridge/routes.js.map +1 -1
  125. package/dist/tool-bridge/session-lifecycle.js +1 -1
  126. package/dist/tool-bridge/state.d.ts +1 -1
  127. package/dist/tool-bridge/tool-cache.d.ts +1 -1
  128. package/dist/ui.d.ts +7 -0
  129. package/dist/ui.js +8 -0
  130. package/dist/ui.js.map +1 -1
  131. package/package.json +8 -5
  132. package/LICENSE +0 -21
  133. package/README.md +0 -212
  134. package/dist/config-schema.d.ts +0 -85
  135. package/dist/config-schema.js +0 -38
  136. package/dist/config-schema.js.map +0 -1
  137. package/dist/handlers/completions/session-config.d.ts +0 -12
  138. package/dist/handlers/completions/session-config.js +0 -63
  139. package/dist/handlers/completions/session-config.js.map +0 -1
  140. package/dist/handlers/completions/streaming.js.map +0 -1
  141. package/dist/handlers/completions.js.map +0 -1
  142. package/dist/handlers/errors.js.map +0 -1
  143. package/dist/handlers/messages/count-tokens.js.map +0 -1
  144. package/dist/handlers/messages/streaming.js +0 -274
  145. package/dist/handlers/messages/streaming.js.map +0 -1
  146. package/dist/handlers/messages/tool-result-handler.js.map +0 -1
  147. package/dist/handlers/messages.js.map +0 -1
  148. package/dist/handlers/models.js.map +0 -1
  149. package/dist/handlers/session-config.js.map +0 -1
  150. package/dist/handlers/streaming-utils.js.map +0 -1
  151. package/dist/providers/anthropic.js.map +0 -1
  152. package/dist/providers/openai.js.map +0 -1
  153. package/dist/schemas/anthropic.js.map +0 -1
  154. package/dist/schemas/openai.js.map +0 -1
  155. package/dist/schemas.d.ts +0 -49
  156. package/dist/schemas.js +0 -75
  157. package/dist/schemas.js.map +0 -1
  158. package/dist/settings-patcher.js.map +0 -1
  159. package/dist/types.d.ts +0 -83
  160. package/dist/types.js.map +0 -1
  161. package/dist/utils/anthropic-prompt.js.map +0 -1
  162. package/dist/utils/model-resolver.js.map +0 -1
  163. package/dist/utils/prompt.d.ts +0 -3
  164. package/dist/utils/prompt.js.map +0 -1
  165. /package/dist/{handlers/messages → providers/claude}/count-tokens.d.ts +0 -0
  166. /package/dist/{schemas/anthropic.d.ts → providers/claude/schemas.d.ts} +0 -0
  167. /package/dist/{handlers/messages → providers/claude}/streaming.d.ts +0 -0
  168. /package/dist/{schemas/openai.d.ts → providers/openai/schemas.d.ts} +0 -0
  169. /package/dist/{handlers/completions → providers/openai}/streaming.d.ts +0 -0
  170. /package/dist/{handlers → providers/shared}/errors.d.ts +0 -0
  171. /package/dist/{handlers → providers/shared}/errors.js +0 -0
  172. /package/dist/{utils → providers/shared}/model-resolver.js +0 -0
  173. /package/dist/{types.js → settings-patcher/types.js} +0 -0
@@ -0,0 +1,193 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { CopilotService } from "./copilot-service.js";
5
+ import { loadConfig, resolveConfigPath } from "./config.js";
6
+ import { createServer } from "./server.js";
7
+ import { Logger } from "./logger.js";
8
+ import { providers } from "./providers/index.js";
9
+ import { patcherByProxy } from "./settings-patcher/index.js";
10
+ import { parsePort, parseLogLevel, parseProxy, parseIdleTimeout, validateAutoPatch, } from "./cli-validators.js";
11
+ import { bold, dim, createSpinner, printBanner } from "./ui.js";
12
+ import { activateSocket } from "./launchd/index.js";
13
+ const AGENTS_DIR = join(homedir(), "Library/Developer/Xcode/CodingAssistant/Agents/Versions");
14
+ const AGENT_BINARY_NAMES = {
15
+ claude: "claude",
16
+ codex: "codex",
17
+ };
18
+ function findAgentBinary(proxy) {
19
+ const binaryName = AGENT_BINARY_NAMES[proxy];
20
+ if (!binaryName)
21
+ return null;
22
+ if (!existsSync(AGENTS_DIR))
23
+ return null;
24
+ let versions;
25
+ try {
26
+ versions = readdirSync(AGENTS_DIR);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ for (const version of versions) {
32
+ const binaryPath = join(AGENTS_DIR, version, binaryName);
33
+ if (existsSync(binaryPath))
34
+ return binaryPath;
35
+ }
36
+ return null;
37
+ }
38
+ export async function startServer(options) {
39
+ const logLevel = parseLogLevel(options.logLevel);
40
+ const logger = new Logger(logLevel);
41
+ const port = parsePort(options.port);
42
+ const proxy = parseProxy(options.proxy);
43
+ const idleTimeoutMinutes = options.idleTimeout ? parseIdleTimeout(options.idleTimeout) : 0;
44
+ const launchdMode = options.launchd === true;
45
+ const autoPatch = options.autoPatch === true && !launchdMode;
46
+ if (!launchdMode) {
47
+ validateAutoPatch(proxy, options.autoPatch === true);
48
+ }
49
+ const provider = providers[proxy];
50
+ const configPath = options.config ?? resolveConfigPath(options.cwd, process.cwd(), options.defaultConfigPath);
51
+ const config = await loadConfig(configPath, logger, proxy);
52
+ const cwd = options.cwd;
53
+ const service = new CopilotService({
54
+ logLevel,
55
+ logger,
56
+ cwd,
57
+ });
58
+ const quiet = logLevel === "none" || launchdMode;
59
+ if (!quiet) {
60
+ console.log();
61
+ console.log(` ${bold("xcode-copilot-server")} ${dim(`v${options.version}`)}`);
62
+ console.log();
63
+ }
64
+ const bootSpinner = quiet ? null : createSpinner("Initialising Copilot SDK...");
65
+ await service.start();
66
+ bootSpinner?.succeed("Copilot SDK initialised");
67
+ const authSpinner = quiet ? null : createSpinner("Authenticating...");
68
+ const auth = await service.getAuthStatus();
69
+ if (!auth.isAuthenticated) {
70
+ authSpinner?.fail("Not authenticated");
71
+ logger.error("Sign in with the Copilot CLI (copilot login) or GitHub CLI (gh auth login), or set a GITHUB_TOKEN environment variable.");
72
+ await service.stop();
73
+ process.exit(1);
74
+ }
75
+ const login = auth.login ?? "unknown";
76
+ const authType = auth.authType ?? "unknown";
77
+ authSpinner?.succeed(`Authenticated as ${bold(login)} ${dim(`(${authType})`)}`);
78
+ if (autoPatch) {
79
+ const patcher = patcherByProxy[proxy];
80
+ if (patcher) {
81
+ const patchSpinner = quiet ? null : createSpinner("Patching settings...");
82
+ try {
83
+ await patcher.patch({ port, logger });
84
+ patchSpinner?.succeed("Settings patched");
85
+ }
86
+ catch (err) {
87
+ patchSpinner?.fail(`Failed to patch settings: ${String(err)}`);
88
+ }
89
+ }
90
+ }
91
+ const ctx = { service, logger, config, port };
92
+ const app = await createServer(ctx, provider);
93
+ const listenSpinner = quiet ? null : createSpinner(`Starting server on port ${String(port)}...`);
94
+ const prevPinoLevel = app.log.level;
95
+ app.log.level = "silent";
96
+ if (launchdMode) {
97
+ const fds = activateSocket("Listeners");
98
+ const fd = fds[0];
99
+ if (fd === undefined) {
100
+ throw new Error("launch_activate_socket returned no file descriptors");
101
+ }
102
+ // TODO: Remove cast when Fastify types add fd support
103
+ // @ts-expect-error Fastify supports listen({ fd }) at runtime but the types don't include it yet
104
+ await app.listen({ fd });
105
+ logger.info(`Listening via launchd socket activation (fd ${String(fd)}, port ${String(port)})`);
106
+ }
107
+ else {
108
+ await app.listen({ port, host: "127.0.0.1" });
109
+ }
110
+ app.log.level = prevPinoLevel;
111
+ listenSpinner?.succeed(`Listening on ${bold(`http://localhost:${String(port)}`)}`);
112
+ if (!quiet) {
113
+ const binaryName = AGENT_BINARY_NAMES[proxy];
114
+ const bannerBase = {
115
+ port,
116
+ proxy,
117
+ providerName: provider.name,
118
+ routes: provider.routes,
119
+ cwd: service.cwd,
120
+ autoPatch,
121
+ };
122
+ if (binaryName) {
123
+ const agentPath = findAgentBinary(proxy);
124
+ const agentBinary = agentPath
125
+ ? { found: true, path: agentPath }
126
+ : { found: false, expected: `${AGENTS_DIR}/<version>/${binaryName}` };
127
+ printBanner({ ...bannerBase, agentBinary });
128
+ }
129
+ else {
130
+ printBanner(bannerBase);
131
+ }
132
+ }
133
+ logger.debug(`Config loaded from ${configPath}`);
134
+ const mcpCount = Object.keys(config.mcpServers).length;
135
+ const cliToolsSummary = config.allowedCliTools.includes("*")
136
+ ? "all CLI tools allowed"
137
+ : `${String(config.allowedCliTools.length)} allowed CLI tool(s)`;
138
+ logger.debug(`${String(mcpCount)} MCP server(s), ${cliToolsSummary}`);
139
+ const shutdown = async (signal) => {
140
+ logger.info(`Got ${signal}, shutting down...`);
141
+ if (autoPatch) {
142
+ const patcher = patcherByProxy[proxy];
143
+ if (patcher) {
144
+ try {
145
+ await patcher.restore({ logger });
146
+ }
147
+ catch (err) {
148
+ logger.error(`Failed to restore settings: ${String(err)}`);
149
+ }
150
+ }
151
+ }
152
+ await app.close();
153
+ const stopPromise = service.stop().then(() => {
154
+ logger.info("Clean shutdown complete");
155
+ });
156
+ const timeoutPromise = new Promise((resolve) => setTimeout(() => {
157
+ logger.warn("Copilot client didn't stop in time, forcing exit");
158
+ resolve();
159
+ }, 3000));
160
+ await Promise.race([stopPromise, timeoutPromise]);
161
+ process.exit(0);
162
+ };
163
+ let shuttingDown = false;
164
+ const onSignal = (signal) => {
165
+ if (shuttingDown)
166
+ return;
167
+ shuttingDown = true;
168
+ shutdown(signal).catch((err) => {
169
+ console.error("Shutdown error:", err);
170
+ process.exit(1);
171
+ });
172
+ };
173
+ process.on("SIGINT", () => { onSignal("SIGINT"); });
174
+ process.on("SIGTERM", () => { onSignal("SIGTERM"); });
175
+ if (idleTimeoutMinutes > 0) {
176
+ const idleMs = idleTimeoutMinutes * 60_000;
177
+ let lastActivity = Date.now();
178
+ app.addHook("onResponse", () => {
179
+ lastActivity = Date.now();
180
+ });
181
+ const checkInterval = Math.min(idleMs, 60_000);
182
+ const timer = setInterval(() => {
183
+ if (Date.now() - lastActivity >= idleMs) {
184
+ clearInterval(timer);
185
+ logger.info(`Idle for ${String(idleTimeoutMinutes)} minute(s), shutting down`);
186
+ onSignal("idle-timeout");
187
+ }
188
+ }, checkInterval);
189
+ // Don't let the timer alone keep the process alive
190
+ timer.unref();
191
+ }
192
+ }
193
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const BRIDGE_SERVER_NAME = "xcode-bridge";
2
+ export declare const BRIDGE_TOOL_PREFIX = "xcode-bridge-";
@@ -0,0 +1,3 @@
1
+ export const BRIDGE_SERVER_NAME = "xcode-bridge";
2
+ export const BRIDGE_TOOL_PREFIX = `${BRIDGE_SERVER_NAME}-`;
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tool-bridge/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,kBAAkB,GAAG,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { FastifyInstance } from "fastify";
2
2
  import type { Logger } from "../logger.js";
3
3
  import { ConversationManager } from "../conversation-manager.js";
4
+ export { BRIDGE_SERVER_NAME, BRIDGE_TOOL_PREFIX } from "./constants.js";
4
5
  export declare function registerToolBridge(app: FastifyInstance, logger: Logger): ConversationManager;
@@ -1,5 +1,6 @@
1
1
  import { ConversationManager } from "../conversation-manager.js";
2
2
  import { registerRoutes } from "./routes.js";
3
+ export { BRIDGE_SERVER_NAME, BRIDGE_TOOL_PREFIX } from "./constants.js";
3
4
  export function registerToolBridge(app, logger) {
4
5
  const manager = new ConversationManager(logger);
5
6
  registerRoutes(app, manager, logger);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-bridge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,GAAoB,EAAE,MAAc;IACrE,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-bridge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,UAAU,kBAAkB,CAAC,GAAoB,EAAE,MAAc;IACrE,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { BRIDGE_SERVER_NAME } from "./constants.js";
2
3
  const JsonRpcRequestSchema = z.object({
3
4
  jsonrpc: z.literal("2.0"),
4
5
  id: z.union([z.number(), z.string()]).optional(),
@@ -54,7 +55,7 @@ export function registerRoutes(app, manager, logger) {
54
55
  return reply.send(jsonRpcResult(id, {
55
56
  protocolVersion: PROTOCOL_VERSION,
56
57
  capabilities: { tools: {} },
57
- serverInfo: { name: "xcode-bridge", version: "1.0.0" },
58
+ serverInfo: { name: BRIDGE_SERVER_NAME, version: "1.0.0" },
58
59
  }));
59
60
  case "tools/list": {
60
61
  const state = manager.getState(convId);
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/tool-bridge/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/tool-bridge/routes.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ export class SessionLifecycle {
23
23
  }
24
24
  markSessionInactive() {
25
25
  this._sessionActive = false;
26
- // stale entries from tool calls that never went through the bridge
26
+ // Stale entries from tool calls that never went through the bridge
27
27
  // (denied or handled internally) would hang the next continuation
28
28
  this.toolRouter.rejectAll("Session ended");
29
29
  this.fireSessionEnd();
@@ -1,5 +1,5 @@
1
1
  import type { FastifyReply } from "fastify";
2
- import type { AnthropicToolDefinition } from "../schemas/anthropic.js";
2
+ import type { AnthropicToolDefinition } from "../providers/claude/schemas.js";
3
3
  import { ToolCache } from "./tool-cache.js";
4
4
  import { ToolRouter } from "./tool-router.js";
5
5
  import { ReplyTracker } from "./reply-tracker.js";
@@ -1,4 +1,4 @@
1
- import type { AnthropicToolDefinition } from "../schemas/anthropic.js";
1
+ import type { AnthropicToolDefinition } from "../providers/claude/schemas.js";
2
2
  export declare class ToolCache {
3
3
  private cachedTools;
4
4
  cacheTools(tools: AnthropicToolDefinition[]): void;
package/dist/ui.d.ts CHANGED
@@ -25,5 +25,12 @@ export interface BannerInfo {
25
25
  routes: string[];
26
26
  cwd: string;
27
27
  autoPatch: boolean;
28
+ agentBinary?: {
29
+ found: true;
30
+ path: string;
31
+ } | {
32
+ found: false;
33
+ expected: string;
34
+ };
28
35
  }
29
36
  export declare function printBanner(info: BannerInfo): void;
package/dist/ui.js CHANGED
@@ -53,6 +53,14 @@ export function createSpinner(text) {
53
53
  export function printBanner(info) {
54
54
  console.log();
55
55
  console.log(` ${dim("Provider")} ${info.providerName} ${dim(`(--proxy ${info.proxy})`)}`);
56
+ if (info.agentBinary) {
57
+ if (info.agentBinary.found) {
58
+ console.log(` ${dim("Agent")} ${info.agentBinary.path}`);
59
+ }
60
+ else {
61
+ console.log(` ${dim("Agent")} ${yellow("not found")} ${dim(`(expected at ${info.agentBinary.expected})`)}`);
62
+ }
63
+ }
56
64
  console.log(` ${dim("Routes")} ${info.routes.join(dim(", "))}`);
57
65
  console.log(` ${dim("Directory")} ${info.cwd}`);
58
66
  if (info.autoPatch) {
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xcode-copilot-server",
3
- "version": "2.2.0",
3
+ "version": "3.1.0",
4
4
  "description": "OpenAI-compatible proxy API server for Xcode, powered by GitHub Copilot",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -31,21 +31,24 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@fastify/cors": "11.2.0",
34
- "@github/copilot-sdk": "0.1.23",
34
+ "@github/copilot-sdk": "0.1.24",
35
35
  "commander": "14.0.3",
36
36
  "fastify": "5.7.4",
37
37
  "json5": "2.2.3",
38
+ "koffi": "2.15.1",
38
39
  "picocolors": "1.1.1",
40
+ "plist": "3.1.0",
39
41
  "tokenx": "1.3.0",
40
42
  "zod": "4.3.6"
41
43
  },
42
44
  "devDependencies": {
43
- "@eslint/js": "9.39.2",
45
+ "@eslint/js": "10.0.1",
44
46
  "@types/node": "25.2.3",
45
- "eslint": "9.39.2",
47
+ "@types/plist": "^3.0.5",
48
+ "eslint": "10.0.0",
46
49
  "tsx": "4.21.0",
47
50
  "typescript": "5.9.3",
48
- "typescript-eslint": "8.55.0",
51
+ "typescript-eslint": "8.56.0",
49
52
  "vitest": "4.0.18"
50
53
  }
51
54
  }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Suyash Srijan
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/README.md DELETED
@@ -1,212 +0,0 @@
1
- # xcode-copilot-server [![npm version](https://img.shields.io/npm/v/xcode-copilot-server)](https://www.npmjs.com/package/xcode-copilot-server)
2
-
3
- A proxy API server that lets you use GitHub Copilot in Xcode, either as a custom model provider (OpenAI mode) or as the backend for Claude Agent (Anthropic mode).
4
-
5
- ## Why
6
-
7
- Xcode 26 added support for third-party LLM providers, but it only supports ChatGPT and Claude out of the box. If you have a GitHub Copilot subscription, there's no built-in way to use it.
8
-
9
- This server bridges the gap by wrapping the [GitHub Copilot SDK](https://github.com/github/copilot-sdk) and exposing it as an API that Xcode can talk to. It supports two modes:
10
-
11
- - **OpenAI mode** (default): This exposes an OpenAI-compatible API so Xcode can use Copilot as a custom model provider. Xcode handles tool execution directly.
12
- - **Anthropic mode**: This exposes an Anthropic-compatible API so Xcode can use Copilot as the proxy for Claude Agent. A built-in tool bridge intercepts tool calls from the Copilot session and routes them back to Xcode for execution.
13
-
14
- Both modes connect to Xcode's built-in MCP tools (via `xcrun mcpbridge`), giving Copilot access to your project's build logs, indexes and other context. This requires Xcode 26.3 or later.
15
-
16
- ## Installation
17
-
18
- You need [Node.js](https://nodejs.org) 25.6.0 or later and a GitHub Copilot subscription. Before starting the server, authenticate using one of the following methods (the Copilot CLI is bundled with the SDK, so you only need one of these for initial sign-in):
19
-
20
- - [Install the Copilot CLI](https://docs.github.com/en/copilot/how-tos/copilot-cli/install-copilot-cli) and run `copilot login`
21
- - [Install the GitHub CLI](https://cli.github.com/) and run `gh auth login`
22
- - Set a `GITHUB_TOKEN` environment variable with a valid fine-grained Copilot access token
23
-
24
- Then install the server via:
25
-
26
- ```bash
27
- npm install -g xcode-copilot-server
28
- ```
29
-
30
- Or run it without installing globally:
31
-
32
- ```bash
33
- npx xcode-copilot-server
34
- ```
35
-
36
- ## Usage
37
-
38
- ```bash
39
- xcode-copilot-server [options]
40
-
41
- Options:
42
- -p, --port <number> Port to listen on (default: 8080)
43
- --proxy <provider> API format: openai, anthropic (default: openai)
44
- -l, --log-level <level> Log verbosity (default: info)
45
- -c, --config <path> Path to config file
46
- --cwd <path> Working directory for Copilot sessions
47
- --auto-patch Auto-patch settings.json on start, restore on exit
48
- -v, --version Output the version number
49
- -h, --help Show help
50
-
51
- Commands:
52
- patch-settings Patch Claude Agent's settings.json and exit (Anthropic mode)
53
- restore-settings Restore Claude Agent's settings.json from backup and exit
54
- ```
55
-
56
- The `--proxy` flag determines which API the server exposes:
57
-
58
- | Mode | Flag | Routes |
59
- |-----------|----------------------------|-------------------------------------------------------|
60
- | OpenAI | `--proxy openai` (default) | `GET /v1/models`, `POST /v1/chat/completions` |
61
- | Anthropic | `--proxy anthropic` | `POST /v1/messages`, `POST /v1/messages/count_tokens` |
62
-
63
- ## Xcode integration
64
-
65
- ### OpenAI mode (custom model provider)
66
-
67
- 1. Start the server: `xcode-copilot-server`
68
- 2. Open Xcode and go to Settings > Intelligence > Add a provider
69
- 3. Select "Locally hosted" and set the port to 8080 (or the port that you've chosen)
70
- 4. Give it a description e.g. "Copilot"
71
- 5. Save
72
-
73
- To enable tool calling, select the provider and enable "Allow tools" under "Advanced". To connect Xcode's MCP tools (Xcode 26.3+), enable "Xcode Tools" under "Model Context Protocol".
74
-
75
- ### Anthropic mode (Claude Agent)
76
-
77
- 1. Open Xcode and go to Settings > Intelligence > Anthropic > Claude Agent
78
- 2. Enable Claude Agent and sign in with an API key (the key can be any random text, since the calls are proxied through the server)
79
- 3. Start the server with `--auto-patch` to automatically configure `settings.json`:
80
-
81
- ```bash
82
- xcode-copilot-server --proxy anthropic --auto-patch
83
- ```
84
-
85
- This creates (or updates) `settings.json` at `~/Library/Developer/Xcode/CodingAssistant/ClaudeAgentConfig/` to point to the server, and restores the original file when the server shuts down. If `settings.json` already exists, a backup is saved as `settings.json.backup` and restored on exit.
86
-
87
- Alternatively, you can manage `settings.json` yourself. Create it manually at the path above:
88
-
89
- ```json
90
- {
91
- "env": {
92
- "ANTHROPIC_BASE_URL": "http://localhost:8080",
93
- "ANTHROPIC_AUTH_TOKEN": "12345"
94
- }
95
- }
96
- ```
97
-
98
- Set the port to match your `--port` flag (default 8080). The auth token can be any non-empty string. Then start the server without `--auto-patch`:
99
-
100
- ```bash
101
- xcode-copilot-server --proxy anthropic
102
- ```
103
-
104
- You can also use the `patch-settings` and `restore-settings` subcommands to patch or restore `settings.json` without starting the server:
105
-
106
- ```bash
107
- xcode-copilot-server patch-settings --port 8080
108
- xcode-copilot-server restore-settings
109
- ```
110
-
111
- The tool bridge is enabled by default in Anthropic mode (`toolBridge: true` in the config). It intercepts tool calls from the Copilot session and forwards them to Xcode, so Claude Agent can read files, search code, and make edits through the IDE.
112
-
113
- ### Agent skills
114
-
115
- The underlying Copilot CLI session can access and invoke [Agent skills](https://docs.github.com/en/copilot/customizing-copilot/extending-copilot-coding-agent-with-agent-skills), which are folders of instructions, scripts, and resources that improve Copilot's performance on specialised tasks. Skills stored in your repository (`.github/skills/` or `.claude/skills/`) and personal skills in your home directory (`~/.copilot/skills/` or `~/.claude/skills/`) are automatically available.
116
-
117
- ## Configuration
118
-
119
- The server reads its configuration from a `config.json5` file. By default, it uses the bundled one, but you can point to your own with `--config`:
120
-
121
- ```bash
122
- xcode-copilot-server --config ./my-config.json5
123
- ```
124
-
125
- The config file uses [JSON5](https://json5.org/) format, which supports comments and trailing commas. The `--proxy` flag determines which provider section (`openai` or `anthropic`) is used at runtime:
126
-
127
- ```json5
128
- {
129
- openai: {
130
- // No tool bridge needed, as Xcode drives tool execution directly.
131
- toolBridge: false,
132
-
133
- mcpServers: {
134
- // Proxies Apple's xcrun mcpbridge (Xcode 26.3+).
135
- xcode: {
136
- type: "local",
137
- command: "node",
138
- args: ["./scripts/mcpbridge-proxy.mjs"],
139
- allowedTools: ["*"],
140
- },
141
- },
142
- },
143
-
144
- anthropic: {
145
- // Intercepts tool calls and forwards them to Xcode so Claude Agent
146
- // can drive tool execution through the IDE.
147
- toolBridge: true,
148
-
149
- // No MCP servers needed, as Claude Agent handles tools natively.
150
- mcpServers: {},
151
- },
152
-
153
- // Built-in CLI tools allowlist.
154
- // ["*"] to allow all, [] to deny all, or a list of specific tool names.
155
- //
156
- // Empty by default so Xcode can handle all operations (search, read, edit)
157
- // through its UI. Enabling CLI tools lets the Copilot session perform
158
- // those operations directly, bypassing Xcode.
159
- allowedCliTools: [],
160
-
161
- // Maximum request body size in MiB.
162
- bodyLimitMiB: 10,
163
-
164
- // Filename patterns to filter out from search results in the prompt.
165
- //
166
- // Xcode can include full file contents for every search match, so add patterns
167
- // here to strip files that bloat the prompt (e.g. ["mock", "generated"]).
168
- excludedFilePatterns: [],
169
-
170
- // Reasoning effort for models that support it: "low", "medium", "high", "xhigh"
171
- reasoningEffort: "xhigh",
172
-
173
- // Auto-approve permission requests.
174
- // true to approve all, false to deny all,
175
- // or an array of kinds: "read", "write", "shell", "mcp", "url"
176
- autoApprovePermissions: ["read", "mcp"],
177
- }
178
- ```
179
-
180
- ## Security
181
-
182
- This server acts as a local proxy between Xcode and GitHub Copilot. It's designed to run on your machine and isn't intended to be exposed to the internet or shared networks. So, here's what you should know:
183
-
184
- - The server binds to `127.0.0.1`, so it's only reachable from your machine. Incoming requests are checked for expected user-agent headers (`Xcode/` in OpenAI mode, `claude-cli/` in Anthropic mode), which means casual or accidental connections from other tools will be rejected. This isn't a strong security boundary since user-agent headers can be trivially spoofed, but it helps ensure only the expected client is talking to the server.
185
-
186
- - The bundled config sets `autoApprovePermissions` to `["read", "mcp"]`, which lets the Copilot session read files and call MCP tools without prompting. Writes, shell commands, and URL fetches are denied by default. You can set it to `true` to approve everything, `false` to deny everything, or pick specific kinds from `"read"`, `"write"`, `"shell"`, `"mcp"`, and `"url"`.
187
-
188
- - MCP servers defined in the config are spawned as child processes. The bundled config uses `xcrun mcpbridge`, which is an Apple-signed binary. If you add your own MCP servers, make sure you trust the commands you're configuring.
189
-
190
- ## License
191
-
192
- MIT License
193
-
194
- Copyright (c) 2026 Suyash Srijan
195
-
196
- Permission is hereby granted, free of charge, to any person obtaining a copy
197
- of this software and associated documentation files (the "Software"), to deal
198
- in the Software without restriction, including without limitation the rights
199
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
200
- copies of the Software, and to permit persons to whom the Software is
201
- furnished to do so, subject to the following conditions:
202
-
203
- The above copyright notice and this permission notice shall be included in all
204
- copies or substantial portions of the Software.
205
-
206
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
207
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
208
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
209
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
210
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
211
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
212
- SOFTWARE.