xcode-copilot-server 2.1.0 → 3.0.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/README.md +94 -29
- package/config.json5 +13 -8
- package/dist/cli-validators.d.ts +6 -0
- package/dist/cli-validators.js +35 -0
- package/dist/cli-validators.js.map +1 -0
- package/dist/config.d.ts +3 -3
- package/dist/config.js +11 -10
- package/dist/config.js.map +1 -1
- package/dist/conversation-manager.d.ts +2 -1
- package/dist/conversation-manager.js +20 -1
- package/dist/conversation-manager.js.map +1 -1
- package/dist/handlers/responses/streaming.d.ts +6 -0
- package/dist/handlers/responses/streaming.js +265 -0
- package/dist/handlers/responses/streaming.js.map +1 -0
- package/dist/handlers/responses/tool-result-handler.d.ts +4 -0
- package/dist/handlers/responses/tool-result-handler.js +9 -0
- package/dist/handlers/responses/tool-result-handler.js.map +1 -0
- package/dist/handlers/responses.d.ts +4 -0
- package/dist/handlers/responses.js +164 -0
- package/dist/handlers/responses.js.map +1 -0
- package/dist/handlers/streaming-utils.d.ts +1 -0
- package/dist/handlers/streaming-utils.js +3 -0
- package/dist/handlers/streaming-utils.js.map +1 -1
- package/dist/index.js +51 -132
- package/dist/index.js.map +1 -1
- package/dist/logger.js +15 -4
- package/dist/logger.js.map +1 -1
- package/dist/providers/claude/count-tokens.d.ts +3 -0
- package/dist/providers/claude/count-tokens.js +72 -0
- package/dist/providers/claude/count-tokens.js.map +1 -0
- package/dist/providers/claude/handler.d.ts +4 -0
- package/dist/providers/claude/handler.js +150 -0
- package/dist/providers/claude/handler.js.map +1 -0
- package/dist/providers/claude/prompt.d.ts +2 -0
- package/dist/providers/claude/prompt.js +52 -0
- package/dist/providers/claude/prompt.js.map +1 -0
- package/dist/providers/claude/provider.d.ts +5 -0
- package/dist/providers/claude/provider.js +28 -0
- package/dist/providers/claude/provider.js.map +1 -0
- package/dist/providers/claude/schemas.d.ts +140 -0
- package/dist/providers/claude/schemas.js +58 -0
- package/dist/providers/claude/schemas.js.map +1 -0
- package/dist/providers/claude/streaming.d.ts +6 -0
- package/dist/providers/claude/streaming.js +116 -0
- package/dist/providers/claude/streaming.js.map +1 -0
- package/dist/providers/claude/tool-results.d.ts +4 -0
- package/dist/providers/claude/tool-results.js +19 -0
- package/dist/providers/claude/tool-results.js.map +1 -0
- package/dist/providers/codex/handler.d.ts +4 -0
- package/dist/providers/codex/handler.js +164 -0
- package/dist/providers/codex/handler.js.map +1 -0
- package/dist/providers/codex/prompt.d.ts +4 -0
- package/dist/providers/codex/prompt.js +58 -0
- package/dist/providers/codex/prompt.js.map +1 -0
- package/dist/providers/codex/provider.d.ts +5 -0
- package/dist/providers/codex/provider.js +24 -0
- package/dist/providers/codex/provider.js.map +1 -0
- package/dist/providers/codex/schemas.d.ts +122 -0
- package/dist/providers/codex/schemas.js +55 -0
- package/dist/providers/codex/schemas.js.map +1 -0
- package/dist/providers/codex/streaming.d.ts +9 -0
- package/dist/providers/codex/streaming.js +172 -0
- package/dist/providers/codex/streaming.js.map +1 -0
- package/dist/providers/codex/tool-results.d.ts +4 -0
- package/dist/providers/codex/tool-results.js +9 -0
- package/dist/providers/codex/tool-results.js.map +1 -0
- package/dist/providers/codex.d.ts +5 -0
- package/dist/providers/codex.js +24 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/index.d.ts +6 -1
- package/dist/providers/index.js +5 -3
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai/handler.d.ts +4 -0
- package/dist/providers/openai/handler.js +120 -0
- package/dist/providers/openai/handler.js.map +1 -0
- package/dist/providers/openai/models.d.ts +3 -0
- package/dist/providers/openai/models.js +28 -0
- package/dist/providers/openai/models.js.map +1 -0
- package/dist/providers/openai/prompt.d.ts +3 -0
- package/dist/providers/openai/prompt.js +38 -0
- package/dist/providers/openai/prompt.js.map +1 -0
- package/dist/providers/openai/provider.d.ts +5 -0
- package/dist/providers/openai/provider.js +25 -0
- package/dist/providers/openai/provider.js.map +1 -0
- package/dist/providers/openai/schemas.d.ts +98 -0
- package/dist/providers/openai/schemas.js +76 -0
- package/dist/providers/openai/schemas.js.map +1 -0
- package/dist/providers/openai/streaming.d.ts +4 -0
- package/dist/providers/openai/streaming.js +121 -0
- package/dist/providers/openai/streaming.js.map +1 -0
- package/dist/providers/shared/errors.d.ts +5 -0
- package/dist/providers/shared/errors.js +10 -0
- package/dist/providers/shared/errors.js.map +1 -0
- package/dist/providers/shared/model-resolver.d.ts +3 -0
- package/dist/providers/shared/model-resolver.js +45 -0
- package/dist/providers/shared/model-resolver.js.map +1 -0
- package/dist/providers/shared/prompt-utils.d.ts +1 -0
- package/dist/providers/shared/prompt-utils.js +15 -0
- package/dist/providers/shared/prompt-utils.js.map +1 -0
- package/dist/providers/shared/session-config.d.ts +15 -0
- package/dist/providers/shared/session-config.js +98 -0
- package/dist/providers/shared/session-config.js.map +1 -0
- package/dist/providers/shared/streaming-core.d.ts +19 -0
- package/dist/providers/shared/streaming-core.js +176 -0
- package/dist/providers/shared/streaming-core.js.map +1 -0
- package/dist/providers/shared/streaming-utils.d.ts +10 -0
- package/dist/providers/shared/streaming-utils.js +28 -0
- package/dist/providers/shared/streaming-utils.js.map +1 -0
- package/dist/schemas/config.d.ts +19 -1
- package/dist/schemas/config.js +2 -1
- package/dist/schemas/config.js.map +1 -1
- package/dist/schemas/responses.d.ts +122 -0
- package/dist/schemas/responses.js +54 -0
- package/dist/schemas/responses.js.map +1 -0
- package/dist/server.js +1 -2
- package/dist/server.js.map +1 -1
- package/dist/settings-patcher/anthropic.d.ts +5 -0
- package/dist/{settings-patcher.js → settings-patcher/anthropic.js} +3 -7
- package/dist/settings-patcher/anthropic.js.map +1 -0
- package/dist/settings-patcher/claude.d.ts +5 -0
- package/dist/settings-patcher/claude.js +75 -0
- package/dist/settings-patcher/claude.js.map +1 -0
- package/dist/settings-patcher/codex.d.ts +23 -0
- package/dist/settings-patcher/codex.js +114 -0
- package/dist/settings-patcher/codex.js.map +1 -0
- package/dist/settings-patcher/index.d.ts +15 -0
- package/dist/settings-patcher/index.js +9 -0
- package/dist/settings-patcher/index.js.map +1 -0
- package/dist/{settings-patcher.d.ts → settings-patcher/types.d.ts} +1 -5
- package/dist/settings-patcher/types.js +2 -0
- package/dist/settings-patcher/types.js.map +1 -0
- package/dist/startup.d.ts +11 -0
- package/dist/startup.js +154 -0
- package/dist/startup.js.map +1 -0
- package/dist/tool-bridge/constants.d.ts +2 -0
- package/dist/tool-bridge/constants.js +3 -0
- package/dist/tool-bridge/constants.js.map +1 -0
- package/dist/tool-bridge/index.d.ts +1 -0
- package/dist/tool-bridge/index.js +1 -0
- package/dist/tool-bridge/index.js.map +1 -1
- package/dist/tool-bridge/routes.js +2 -1
- package/dist/tool-bridge/routes.js.map +1 -1
- package/dist/tool-bridge/session-lifecycle.js +1 -1
- package/dist/tool-bridge/state.d.ts +1 -1
- package/dist/tool-bridge/tool-cache.d.ts +1 -1
- package/dist/ui.d.ts +36 -0
- package/dist/ui.js +71 -0
- package/dist/ui.js.map +1 -0
- package/dist/utils/responses-prompt.d.ts +4 -0
- package/dist/utils/responses-prompt.js +58 -0
- package/dist/utils/responses-prompt.js.map +1 -0
- package/package.json +3 -1
- package/dist/settings-patcher.js.map +0 -1
|
@@ -41,14 +41,13 @@ export async function detectPatchState(options) {
|
|
|
41
41
|
}
|
|
42
42
|
return { patched: true };
|
|
43
43
|
}
|
|
44
|
-
export async function
|
|
44
|
+
export async function patchAnthropicSettings(options) {
|
|
45
45
|
const { logger } = options;
|
|
46
46
|
const p = options.paths ?? defaultSettingsPaths();
|
|
47
47
|
await mkdir(p.dir, { recursive: true });
|
|
48
48
|
// Only back up once so crash recovery doesn't overwrite the original.
|
|
49
49
|
if (existsSync(p.file) && !existsSync(p.backup)) {
|
|
50
50
|
await copyFile(p.file, p.backup);
|
|
51
|
-
logger.info("Backed up settings.json");
|
|
52
51
|
}
|
|
53
52
|
let settings = {};
|
|
54
53
|
try {
|
|
@@ -63,17 +62,14 @@ export async function patchSettings(options) {
|
|
|
63
62
|
ANTHROPIC_AUTH_TOKEN: options.authToken ?? "12345",
|
|
64
63
|
};
|
|
65
64
|
await writeFile(p.file, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
66
|
-
logger.info(`Patched settings.json to point to http://localhost:${String(options.port)}`);
|
|
67
65
|
}
|
|
68
|
-
export async function
|
|
69
|
-
const { logger } = options;
|
|
66
|
+
export async function restoreAnthropicSettings(options) {
|
|
70
67
|
const p = options.paths ?? defaultSettingsPaths();
|
|
71
68
|
if (existsSync(p.file)) {
|
|
72
69
|
await unlink(p.file);
|
|
73
70
|
}
|
|
74
71
|
if (existsSync(p.backup)) {
|
|
75
72
|
await rename(p.backup, p.file);
|
|
76
|
-
logger.info("Restored settings.json from backup");
|
|
77
73
|
}
|
|
78
74
|
}
|
|
79
|
-
//# sourceMappingURL=
|
|
75
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/settings-patcher/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SettingsPaths, PatchResult, PatchOptions, RestoreOptions, DetectOptions } from "./types.js";
|
|
2
|
+
export declare function defaultSettingsPaths(): SettingsPaths;
|
|
3
|
+
export declare function detectPatchState(options: DetectOptions): Promise<PatchResult>;
|
|
4
|
+
export declare function patchClaudeSettings(options: PatchOptions): Promise<void>;
|
|
5
|
+
export declare function restoreClaudeSettings(options: RestoreOptions): Promise<void>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile, rename, unlink, mkdir, copyFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
export function defaultSettingsPaths() {
|
|
6
|
+
const dir = join(homedir(), "Library/Developer/Xcode/CodingAssistant/ClaudeAgentConfig");
|
|
7
|
+
return {
|
|
8
|
+
dir,
|
|
9
|
+
file: join(dir, "settings.json"),
|
|
10
|
+
backup: join(dir, "settings.json.backup"),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function isSettings(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
async function readSettingsFile(path) {
|
|
17
|
+
if (!existsSync(path))
|
|
18
|
+
return null;
|
|
19
|
+
const content = await readFile(path, "utf-8");
|
|
20
|
+
const parsed = JSON.parse(content);
|
|
21
|
+
return isSettings(parsed) ? parsed : null;
|
|
22
|
+
}
|
|
23
|
+
export async function detectPatchState(options) {
|
|
24
|
+
const { logger } = options;
|
|
25
|
+
const p = options.paths ?? defaultSettingsPaths();
|
|
26
|
+
if (!existsSync(p.backup)) {
|
|
27
|
+
return { patched: false };
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const settings = await readSettingsFile(p.file);
|
|
31
|
+
const url = settings?.env?.ANTHROPIC_BASE_URL;
|
|
32
|
+
if (url) {
|
|
33
|
+
const match = /localhost:(\d+)/.exec(url);
|
|
34
|
+
if (match?.[1]) {
|
|
35
|
+
return { patched: true, port: parseInt(match[1], 10) };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
logger.warn(`Could not read settings.json to extract port: ${String(err)}`);
|
|
41
|
+
}
|
|
42
|
+
return { patched: true };
|
|
43
|
+
}
|
|
44
|
+
export async function patchClaudeSettings(options) {
|
|
45
|
+
const { logger } = options;
|
|
46
|
+
const p = options.paths ?? defaultSettingsPaths();
|
|
47
|
+
await mkdir(p.dir, { recursive: true });
|
|
48
|
+
// Only back up once so a crash doesn't clobber the real original
|
|
49
|
+
if (existsSync(p.file) && !existsSync(p.backup)) {
|
|
50
|
+
await copyFile(p.file, p.backup);
|
|
51
|
+
}
|
|
52
|
+
let settings = {};
|
|
53
|
+
try {
|
|
54
|
+
settings = await readSettingsFile(p.file) ?? {};
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
logger.warn(`Could not read settings.json, starting fresh: ${String(err)}`);
|
|
58
|
+
}
|
|
59
|
+
settings.env = {
|
|
60
|
+
...settings.env,
|
|
61
|
+
ANTHROPIC_BASE_URL: `http://localhost:${String(options.port)}`,
|
|
62
|
+
ANTHROPIC_AUTH_TOKEN: options.authToken ?? "12345",
|
|
63
|
+
};
|
|
64
|
+
await writeFile(p.file, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
65
|
+
}
|
|
66
|
+
export async function restoreClaudeSettings(options) {
|
|
67
|
+
const p = options.paths ?? defaultSettingsPaths();
|
|
68
|
+
if (existsSync(p.file)) {
|
|
69
|
+
await unlink(p.file);
|
|
70
|
+
}
|
|
71
|
+
if (existsSync(p.backup)) {
|
|
72
|
+
await rename(p.backup, p.file);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/settings-patcher/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import type { PatchResult } from "./types.js";
|
|
3
|
+
export type ExecFn = (cmd: string, args: string[]) => Promise<string>;
|
|
4
|
+
export declare function defaultCodexBackupPath(): string;
|
|
5
|
+
export interface CodexPatchOptions {
|
|
6
|
+
port: number;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
exec?: ExecFn;
|
|
9
|
+
backupFile?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CodexRestoreOptions {
|
|
12
|
+
logger: Logger;
|
|
13
|
+
exec?: ExecFn;
|
|
14
|
+
backupFile?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CodexDetectOptions {
|
|
17
|
+
logger: Logger;
|
|
18
|
+
exec?: ExecFn;
|
|
19
|
+
backupFile?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function detectCodexPatchState(options: CodexDetectOptions): Promise<PatchResult>;
|
|
22
|
+
export declare function patchCodexSettings(options: CodexPatchOptions): Promise<void>;
|
|
23
|
+
export declare function restoreCodexSettings(options: CodexRestoreOptions): Promise<void>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Config.toml doesn't work here because the built-in "openai" provider
|
|
2
|
+
// always takes priority over custom [model_providers.openai] entries:
|
|
3
|
+
// https://github.com/openai/codex/blob/abeafbdca17f6102099ac5b792761b6883c52d35/codex-rs/core/src/config/mod.rs#L1544
|
|
4
|
+
//
|
|
5
|
+
// So we set OPENAI_BASE_URL via launchctl instead, that way Xcode (and
|
|
6
|
+
// any Codex process it spawns) can see it without a shell restart.
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
import { readFile, writeFile, unlink, mkdir } from "node:fs/promises";
|
|
9
|
+
import { execFile as execFileCb } from "node:child_process";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
const execFileAsync = promisify(execFileCb);
|
|
14
|
+
async function defaultExec(cmd, args) {
|
|
15
|
+
const { stdout } = await execFileAsync(cmd, args);
|
|
16
|
+
return stdout;
|
|
17
|
+
}
|
|
18
|
+
export function defaultCodexBackupPath() {
|
|
19
|
+
return join(homedir(), "Library/Developer/Xcode/CodingAssistant/codex", "env.backup.json");
|
|
20
|
+
}
|
|
21
|
+
async function launchctlGetenv(exec, name) {
|
|
22
|
+
try {
|
|
23
|
+
const value = (await exec("launchctl", ["getenv", name])).trim();
|
|
24
|
+
return value || null;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function detectCodexPatchState(options) {
|
|
31
|
+
const { logger } = options;
|
|
32
|
+
const exec = options.exec ?? defaultExec;
|
|
33
|
+
const backupFile = options.backupFile ?? defaultCodexBackupPath();
|
|
34
|
+
if (!existsSync(backupFile)) {
|
|
35
|
+
return { patched: false };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const url = await launchctlGetenv(exec, "OPENAI_BASE_URL");
|
|
39
|
+
if (url) {
|
|
40
|
+
const match = /localhost:(\d+)/.exec(url);
|
|
41
|
+
if (match?.[1]) {
|
|
42
|
+
return { patched: true, port: parseInt(match[1], 10) };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
logger.warn(`Could not read OPENAI_BASE_URL: ${String(err)}`);
|
|
48
|
+
}
|
|
49
|
+
return { patched: true };
|
|
50
|
+
}
|
|
51
|
+
export async function patchCodexSettings(options) {
|
|
52
|
+
const { port } = options;
|
|
53
|
+
const exec = options.exec ?? defaultExec;
|
|
54
|
+
const backupFile = options.backupFile ?? defaultCodexBackupPath();
|
|
55
|
+
const baseUrl = `http://localhost:${String(port)}/v1`;
|
|
56
|
+
// Only back up once so a crash doesn't clobber the real originals
|
|
57
|
+
if (!existsSync(backupFile)) {
|
|
58
|
+
const backup = {
|
|
59
|
+
OPENAI_BASE_URL: await launchctlGetenv(exec, "OPENAI_BASE_URL"),
|
|
60
|
+
OPENAI_API_KEY: await launchctlGetenv(exec, "OPENAI_API_KEY"),
|
|
61
|
+
};
|
|
62
|
+
const dir = join(backupFile, "..");
|
|
63
|
+
await mkdir(dir, { recursive: true });
|
|
64
|
+
await writeFile(backupFile, JSON.stringify(backup, null, 2) + "\n", "utf-8");
|
|
65
|
+
}
|
|
66
|
+
await exec("launchctl", ["setenv", "OPENAI_BASE_URL", baseUrl]);
|
|
67
|
+
await exec("launchctl", ["setenv", "OPENAI_API_KEY", "xcode-copilot"]);
|
|
68
|
+
}
|
|
69
|
+
export async function restoreCodexSettings(options) {
|
|
70
|
+
const { logger } = options;
|
|
71
|
+
const exec = options.exec ?? defaultExec;
|
|
72
|
+
const backupFile = options.backupFile ?? defaultCodexBackupPath();
|
|
73
|
+
if (!existsSync(backupFile)) {
|
|
74
|
+
// No backup found, just unset to be safe
|
|
75
|
+
try {
|
|
76
|
+
await exec("launchctl", ["unsetenv", "OPENAI_BASE_URL"]);
|
|
77
|
+
await exec("launchctl", ["unsetenv", "OPENAI_API_KEY"]);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
logger.warn(`Failed to unset env vars: ${String(err)}`);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const raw = await readFile(backupFile, "utf-8");
|
|
86
|
+
const backup = JSON.parse(raw);
|
|
87
|
+
if (backup.OPENAI_BASE_URL != null) {
|
|
88
|
+
await exec("launchctl", ["setenv", "OPENAI_BASE_URL", backup.OPENAI_BASE_URL]);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
await exec("launchctl", ["unsetenv", "OPENAI_BASE_URL"]);
|
|
92
|
+
}
|
|
93
|
+
if (backup.OPENAI_API_KEY != null) {
|
|
94
|
+
await exec("launchctl", ["setenv", "OPENAI_API_KEY", backup.OPENAI_API_KEY]);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await exec("launchctl", ["unsetenv", "OPENAI_API_KEY"]);
|
|
98
|
+
}
|
|
99
|
+
await unlink(backupFile);
|
|
100
|
+
logger.info("Restored env vars from backup");
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
logger.warn(`Failed to restore env vars: ${String(err)}`);
|
|
104
|
+
// Restore failed, just try to unset both
|
|
105
|
+
try {
|
|
106
|
+
await exec("launchctl", ["unsetenv", "OPENAI_BASE_URL"]);
|
|
107
|
+
await exec("launchctl", ["unsetenv", "OPENAI_API_KEY"]);
|
|
108
|
+
}
|
|
109
|
+
catch (unsetErr) {
|
|
110
|
+
logger.warn(`Failed to unset env vars during recovery: ${String(unsetErr)}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/settings-patcher/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import type { ProxyName } from "../providers/index.js";
|
|
3
|
+
export type { SettingsPaths, Settings, PatchResult, PatchOptions, RestoreOptions, DetectOptions, } from "./types.js";
|
|
4
|
+
export { defaultSettingsPaths, detectPatchState, patchClaudeSettings, restoreClaudeSettings, } from "./claude.js";
|
|
5
|
+
export type { ExecFn, CodexPatchOptions, CodexRestoreOptions, CodexDetectOptions, } from "./codex.js";
|
|
6
|
+
export { defaultCodexBackupPath, detectCodexPatchState, patchCodexSettings, restoreCodexSettings, } from "./codex.js";
|
|
7
|
+
export declare const patcherByProxy: Partial<Record<ProxyName, {
|
|
8
|
+
patch: (opts: {
|
|
9
|
+
port: number;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
}) => Promise<void>;
|
|
12
|
+
restore: (opts: {
|
|
13
|
+
logger: Logger;
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
}>>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { patchClaudeSettings, restoreClaudeSettings } from "./claude.js";
|
|
2
|
+
import { patchCodexSettings, restoreCodexSettings } from "./codex.js";
|
|
3
|
+
export { defaultSettingsPaths, detectPatchState, patchClaudeSettings, restoreClaudeSettings, } from "./claude.js";
|
|
4
|
+
export { defaultCodexBackupPath, detectCodexPatchState, patchCodexSettings, restoreCodexSettings, } from "./codex.js";
|
|
5
|
+
export const patcherByProxy = {
|
|
6
|
+
claude: { patch: patchClaudeSettings, restore: restoreClaudeSettings },
|
|
7
|
+
codex: { patch: patchCodexSettings, restore: restoreCodexSettings },
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings-patcher/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAWtE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AASrB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,cAAc,GAGrB;IACJ,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACtE,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,EAAE;CACpE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Logger } from "
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
2
|
export interface SettingsPaths {
|
|
3
3
|
dir: string;
|
|
4
4
|
file: string;
|
|
@@ -22,8 +22,4 @@ export interface PatchOptions extends BaseOptions {
|
|
|
22
22
|
}
|
|
23
23
|
export type RestoreOptions = BaseOptions;
|
|
24
24
|
export type DetectOptions = BaseOptions;
|
|
25
|
-
export declare function defaultSettingsPaths(): SettingsPaths;
|
|
26
|
-
export declare function detectPatchState(options: DetectOptions): Promise<PatchResult>;
|
|
27
|
-
export declare function patchSettings(options: PatchOptions): Promise<void>;
|
|
28
|
-
export declare function restoreSettings(options: RestoreOptions): Promise<void>;
|
|
29
25
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/settings-patcher/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface StartOptions {
|
|
2
|
+
port: string;
|
|
3
|
+
proxy: string;
|
|
4
|
+
logLevel: string;
|
|
5
|
+
version: string;
|
|
6
|
+
defaultConfigPath: string;
|
|
7
|
+
config?: string;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
autoPatch?: true;
|
|
10
|
+
}
|
|
11
|
+
export declare function startServer(options: StartOptions): Promise<void>;
|
package/dist/startup.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
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, validateAutoPatch, } from "./cli-validators.js";
|
|
11
|
+
import { bold, dim, createSpinner, printBanner } from "./ui.js";
|
|
12
|
+
const AGENTS_DIR = join(homedir(), "Library/Developer/Xcode/CodingAssistant/Agents/Versions");
|
|
13
|
+
const AGENT_BINARY_NAMES = {
|
|
14
|
+
claude: "claude",
|
|
15
|
+
codex: "codex",
|
|
16
|
+
};
|
|
17
|
+
function findAgentBinary(proxy) {
|
|
18
|
+
const binaryName = AGENT_BINARY_NAMES[proxy];
|
|
19
|
+
if (!binaryName)
|
|
20
|
+
return null;
|
|
21
|
+
if (!existsSync(AGENTS_DIR))
|
|
22
|
+
return null;
|
|
23
|
+
let versions;
|
|
24
|
+
try {
|
|
25
|
+
versions = readdirSync(AGENTS_DIR);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
for (const version of versions) {
|
|
31
|
+
const binaryPath = join(AGENTS_DIR, version, binaryName);
|
|
32
|
+
if (existsSync(binaryPath))
|
|
33
|
+
return binaryPath;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
export async function startServer(options) {
|
|
38
|
+
const logLevel = parseLogLevel(options.logLevel);
|
|
39
|
+
const logger = new Logger(logLevel);
|
|
40
|
+
const port = parsePort(options.port);
|
|
41
|
+
const proxy = parseProxy(options.proxy);
|
|
42
|
+
const autoPatch = options.autoPatch === true;
|
|
43
|
+
validateAutoPatch(proxy, autoPatch);
|
|
44
|
+
const provider = providers[proxy];
|
|
45
|
+
const configPath = options.config ?? resolveConfigPath(options.cwd, process.cwd(), options.defaultConfigPath);
|
|
46
|
+
const config = await loadConfig(configPath, logger, proxy);
|
|
47
|
+
const cwd = options.cwd;
|
|
48
|
+
const service = new CopilotService({
|
|
49
|
+
logLevel,
|
|
50
|
+
logger,
|
|
51
|
+
cwd,
|
|
52
|
+
});
|
|
53
|
+
const quiet = logLevel === "none";
|
|
54
|
+
if (!quiet) {
|
|
55
|
+
console.log();
|
|
56
|
+
console.log(` ${bold("xcode-copilot-server")} ${dim(`v${options.version}`)}`);
|
|
57
|
+
console.log();
|
|
58
|
+
}
|
|
59
|
+
const bootSpinner = quiet ? null : createSpinner("Initialising Copilot SDK...");
|
|
60
|
+
await service.start();
|
|
61
|
+
bootSpinner?.succeed("Copilot SDK initialised");
|
|
62
|
+
const authSpinner = quiet ? null : createSpinner("Authenticating...");
|
|
63
|
+
const auth = await service.getAuthStatus();
|
|
64
|
+
if (!auth.isAuthenticated) {
|
|
65
|
+
authSpinner?.fail("Not authenticated");
|
|
66
|
+
logger.error("Sign in with the Copilot CLI (copilot login) or GitHub CLI (gh auth login), or set a GITHUB_TOKEN environment variable.");
|
|
67
|
+
await service.stop();
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const login = auth.login ?? "unknown";
|
|
71
|
+
const authType = auth.authType ?? "unknown";
|
|
72
|
+
authSpinner?.succeed(`Authenticated as ${bold(login)} ${dim(`(${authType})`)}`);
|
|
73
|
+
if (autoPatch) {
|
|
74
|
+
const patcher = patcherByProxy[proxy];
|
|
75
|
+
if (patcher) {
|
|
76
|
+
const patchSpinner = quiet ? null : createSpinner("Patching settings...");
|
|
77
|
+
try {
|
|
78
|
+
await patcher.patch({ port, logger });
|
|
79
|
+
patchSpinner?.succeed("Settings patched");
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
patchSpinner?.fail(`Failed to patch settings: ${String(err)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const ctx = { service, logger, config, port };
|
|
87
|
+
const app = await createServer(ctx, provider);
|
|
88
|
+
const listenSpinner = quiet ? null : createSpinner(`Starting server on port ${String(port)}...`);
|
|
89
|
+
const prevPinoLevel = app.log.level;
|
|
90
|
+
app.log.level = "silent";
|
|
91
|
+
await app.listen({ port, host: "127.0.0.1" });
|
|
92
|
+
app.log.level = prevPinoLevel;
|
|
93
|
+
listenSpinner?.succeed(`Listening on ${bold(`http://localhost:${String(port)}`)}`);
|
|
94
|
+
if (!quiet) {
|
|
95
|
+
const binaryName = AGENT_BINARY_NAMES[proxy];
|
|
96
|
+
const bannerBase = {
|
|
97
|
+
port,
|
|
98
|
+
proxy,
|
|
99
|
+
providerName: provider.name,
|
|
100
|
+
routes: provider.routes,
|
|
101
|
+
cwd: service.cwd,
|
|
102
|
+
autoPatch,
|
|
103
|
+
};
|
|
104
|
+
if (binaryName) {
|
|
105
|
+
const agentPath = findAgentBinary(proxy);
|
|
106
|
+
const agentBinary = agentPath
|
|
107
|
+
? { found: true, path: agentPath }
|
|
108
|
+
: { found: false, expected: `${AGENTS_DIR}/<version>/${binaryName}` };
|
|
109
|
+
printBanner({ ...bannerBase, agentBinary });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
printBanner(bannerBase);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
logger.debug(`Config loaded from ${configPath}`);
|
|
116
|
+
const mcpCount = Object.keys(config.mcpServers).length;
|
|
117
|
+
const cliToolsSummary = config.allowedCliTools.includes("*")
|
|
118
|
+
? "all CLI tools allowed"
|
|
119
|
+
: `${String(config.allowedCliTools.length)} allowed CLI tool(s)`;
|
|
120
|
+
logger.debug(`${String(mcpCount)} MCP server(s), ${cliToolsSummary}`);
|
|
121
|
+
const shutdown = async (signal) => {
|
|
122
|
+
logger.info(`Got ${signal}, shutting down...`);
|
|
123
|
+
if (autoPatch) {
|
|
124
|
+
const patcher = patcherByProxy[proxy];
|
|
125
|
+
if (patcher) {
|
|
126
|
+
try {
|
|
127
|
+
await patcher.restore({ logger });
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.error(`Failed to restore settings: ${String(err)}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
await app.close();
|
|
135
|
+
const stopPromise = service.stop().then(() => {
|
|
136
|
+
logger.info("Clean shutdown complete");
|
|
137
|
+
});
|
|
138
|
+
const timeoutPromise = new Promise((resolve) => setTimeout(() => {
|
|
139
|
+
logger.warn("Copilot client didn't stop in time, forcing exit");
|
|
140
|
+
resolve();
|
|
141
|
+
}, 3000));
|
|
142
|
+
await Promise.race([stopPromise, timeoutPromise]);
|
|
143
|
+
process.exit(0);
|
|
144
|
+
};
|
|
145
|
+
const onSignal = (signal) => {
|
|
146
|
+
shutdown(signal).catch((err) => {
|
|
147
|
+
console.error("Shutdown error:", err);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
process.on("SIGINT", () => { onSignal("SIGINT"); });
|
|
152
|
+
process.on("SIGTERM", () => { onSignal("SIGTERM"); });
|
|
153
|
+
}
|
|
154
|
+
//# 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 @@
|
|
|
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:
|
|
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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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
|
-
//
|
|
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
|
|
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";
|