xcode-copilot-server 3.4.1 → 3.4.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/config.json5 CHANGED
@@ -13,12 +13,10 @@
13
13
  toolBridge: false,
14
14
 
15
15
  mcpServers: {
16
- // Proxies Apple's xcrun mcpbridge (Xcode 26.3+). The script exits
17
- // gracefully if mcpbridge isn't installed, so safe to leave enabled.
18
16
  xcode: {
19
17
  type: "local",
20
- command: "node",
21
- args: ["./scripts/mcpbridge-proxy.mjs"],
18
+ command: "xcrun",
19
+ args: ["mcpbridge"],
22
20
  allowedTools: ["*"],
23
21
  },
24
22
  },
@@ -85,6 +85,10 @@ export class ConversationManager {
85
85
  this.logger.debug(`Primary ${primary.id} is busy, creating isolated conversation`);
86
86
  return { conversation: this.create(), isReuse: false };
87
87
  }
88
+ if (primary.state.toolRouter.hasPending) {
89
+ this.logger.debug(`Primary ${primary.id} has pending tool calls, creating isolated conversation`);
90
+ return { conversation: this.create(), isReuse: false };
91
+ }
88
92
  if (!primary.session) {
89
93
  // No SDK session yet. Create an isolated conversation so the primary
90
94
  // stays available for the first real request.
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  export async function handleContinuation(existingConv, reply, logger, callbacks) {
2
2
  const { state } = existingConv;
3
3
  logger.info(`Continuation for conversation ${existingConv.id} (hasPending=${String(state.toolRouter.hasPending)}, sessionActive=${String(state.session.sessionActive)})`);
4
+ if (state.session.sessionActive) {
5
+ logger.warn(`Conversation ${existingConv.id} is already streaming, cannot handle continuation`);
6
+ return false;
7
+ }
4
8
  state.replies.setReply(reply);
5
9
  callbacks.startStream();
6
10
  reply.raw.on("close", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"continuation.js","sourceRoot":"","sources":["../../../src/providers/shared/continuation.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,KAAmB,EACnB,MAAc,EACd,SAAgC;IAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,iCAAiC,YAAY,CAAC,EAAE,gBAAgB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1K,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,SAAS,CAAC,WAAW,EAAE,CAAC;IAExB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACvD,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,cAAc,EAAE,CAAC;IAC3B,MAAM,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAC3C,YAAY,CAAC,gBAAgB,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"continuation.js","sourceRoot":"","sources":["../../../src/providers/shared/continuation.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAA0B,EAC1B,KAAmB,EACnB,MAAc,EACd,SAAgC;IAEhC,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,iCAAiC,YAAY,CAAC,EAAE,gBAAgB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE1K,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,gBAAgB,YAAY,CAAC,EAAE,mDAAmD,CAAC,CAAC;QAChG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,SAAS,CAAC,WAAW,EAAE,CAAC;IAExB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACvD,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,cAAc,EAAE,CAAC;IAC3B,MAAM,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAC3C,YAAY,CAAC,gBAAgB,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -43,8 +43,11 @@ export function createSessionConfig({ model, systemMessage, logger, config, supp
43
43
  supportsReasoningEffort,
44
44
  cwd,
45
45
  });
46
- if (!hasToolBridge)
47
- return base;
46
+ // Hide SDK built-ins so the model uses bridge tools (forwarded to Xcode).
47
+ const excludedTools = SDK_BUILT_IN_TOOLS.filter((t) => !config.allowedCliTools.includes("*") && !config.allowedCliTools.includes(t));
48
+ if (!hasToolBridge) {
49
+ return excludedTools.length > 0 ? { ...base, excludedTools } : base;
50
+ }
48
51
  const originalOnPreToolUse = base.hooks?.onPreToolUse;
49
52
  // Bridge controls tool visibility, so remove availableTools.
50
53
  // Can't assign undefined with exactOptionalPropertyTypes, so destructure.
@@ -60,8 +63,7 @@ export function createSessionConfig({ model, systemMessage, logger, config, supp
60
63
  tools: ["*"],
61
64
  },
62
65
  },
63
- // Hide SDK built-ins so the model uses bridge tools (forwarded to Xcode).
64
- excludedTools: SDK_BUILT_IN_TOOLS.filter((t) => !config.allowedCliTools.includes("*") && !config.allowedCliTools.includes(t)),
66
+ excludedTools,
65
67
  hooks: {
66
68
  ...base.hooks,
67
69
  onPreToolUse: (input, invocation) => {
@@ -1 +1 @@
1
- {"version":3,"file":"session-config.js","sourceRoot":"","sources":["../../../src/providers/shared/session-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-config.js","sourceRoot":"","sources":["../../../src/providers/shared/session-config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { FastifyReply } from "fastify";
2
2
  export declare class ReplyTracker {
3
3
  private reply;
4
- private streamingDone;
4
+ private streamingDoneCallbacks;
5
5
  get currentReply(): FastifyReply | null;
6
6
  setReply(reply: FastifyReply): void;
7
7
  clearReply(): void;
@@ -1,6 +1,6 @@
1
1
  export class ReplyTracker {
2
2
  reply = null;
3
- streamingDone = null;
3
+ streamingDoneCallbacks = [];
4
4
  get currentReply() {
5
5
  return this.reply;
6
6
  }
@@ -11,17 +11,14 @@ export class ReplyTracker {
11
11
  this.reply = null;
12
12
  }
13
13
  notifyStreamingDone() {
14
- if (this.streamingDone) {
15
- this.streamingDone();
16
- this.streamingDone = null;
17
- }
14
+ const callbacks = this.streamingDoneCallbacks;
15
+ this.streamingDoneCallbacks = [];
16
+ for (const cb of callbacks)
17
+ cb();
18
18
  }
19
19
  waitForStreamingDone() {
20
- if (this.streamingDone) {
21
- throw new Error("Already waiting for streaming to complete");
22
- }
23
20
  return new Promise((resolve) => {
24
- this.streamingDone = resolve;
21
+ this.streamingDoneCallbacks.push(resolve);
25
22
  });
26
23
  }
27
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reply-tracker.js","sourceRoot":"","sources":["../../src/tool-bridge/reply-tracker.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACf,KAAK,GAAwB,IAAI,CAAC;IAClC,aAAa,GAAwB,IAAI,CAAC;IAElD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,mBAAmB;QACjB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"reply-tracker.js","sourceRoot":"","sources":["../../src/tool-bridge/reply-tracker.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IACf,KAAK,GAAwB,IAAI,CAAC;IAClC,sBAAsB,GAAmB,EAAE,CAAC;IAEpD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,mBAAmB;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC9C,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,KAAK,MAAM,EAAE,IAAI,SAAS;YAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xcode-copilot-server",
3
- "version": "3.4.1",
3
+ "version": "3.4.3",
4
4
  "description": "OpenAI-compatible proxy API server for Xcode, powered by GitHub Copilot",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -16,8 +16,7 @@
16
16
  },
17
17
  "files": [
18
18
  "dist/",
19
- "config.json5",
20
- "scripts/"
19
+ "config.json5"
21
20
  ],
22
21
  "scripts": {
23
22
  "build": "tsc",
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * MCP stdio proxy for Apple's `xcrun mcpbridge`.
5
- *
6
- * mcpbridge declares output schemas on its tools but returns
7
- * results via the `content` field (text array) without the corresponding
8
- * `structuredContent` field that the MCP spec requires. The Copilot CLI
9
- * enforces this strictly and rejects the response with error -32600.
10
- *
11
- * So, intercept every JSON-RPC response from mcpbridge. When a response
12
- * carries `content` but no `structuredContent`, synthesise it from the
13
- * first text content item — parsing as JSON when possible, falling back
14
- * to a `{ text }` wrapper otherwise.
15
- *
16
- * Source: https://rudrank.com/exploring-xcode-using-mcp-tools-cursor-external-clients
17
- */
18
-
19
- import { spawn, execFile } from "node:child_process";
20
- import { createInterface } from "node:readline";
21
- import { promisify } from "node:util";
22
-
23
- const execFileAsync = promisify(execFile);
24
-
25
- function patchIfNeeded(msg) {
26
- const result = msg.result;
27
- if (!result || typeof result !== "object") return;
28
- if (!Array.isArray(result.content) || result.content.length === 0) return;
29
- if (result.structuredContent !== undefined) return;
30
-
31
- const textItem = result.content.find((c) => c.type === "text");
32
- if (!textItem?.text) return;
33
-
34
- try {
35
- result.structuredContent = JSON.parse(textItem.text);
36
- } catch {
37
- result.structuredContent = { text: textItem.text };
38
- }
39
- }
40
-
41
- try {
42
- await execFileAsync("xcrun", ["--find", "mcpbridge"]);
43
- } catch (err) {
44
- console.error(
45
- "Error: xcrun mcpbridge not found. This requires Xcode 26.3 or later."
46
- );
47
- console.error(
48
- "Please install Xcode 26.3+ or remove the 'xcode' MCP server from config.json5"
49
- );
50
- process.exit(1);
51
- }
52
-
53
- const bridge = spawn("xcrun", ["mcpbridge", ...process.argv.slice(2)], {
54
- stdio: ["pipe", "pipe", "inherit"],
55
- });
56
-
57
- process.stdin.pipe(bridge.stdin);
58
-
59
- const reader = createInterface({ input: bridge.stdout, crlfDelay: Infinity });
60
-
61
- reader.on("line", (line) => {
62
- try {
63
- const msg = JSON.parse(line);
64
- patchIfNeeded(msg);
65
- process.stdout.write(JSON.stringify(msg) + "\n");
66
- } catch {
67
- process.stdout.write(line + "\n");
68
- }
69
- });
70
-
71
- bridge.on("exit", (code) => process.exit(code ?? 0));
72
- process.on("SIGTERM", () => bridge.kill("SIGTERM"));
73
- process.on("SIGINT", () => bridge.kill("SIGINT"));