xcode-copilot-server 3.0.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 (112) hide show
  1. package/dist/cli-validators.d.ts +2 -0
  2. package/dist/cli-validators.js +8 -1
  3. package/dist/cli-validators.js.map +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.js +48 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/launchd/agent.d.ts +52 -0
  9. package/dist/launchd/agent.js +185 -0
  10. package/dist/launchd/agent.js.map +1 -0
  11. package/dist/launchd/index.d.ts +4 -0
  12. package/dist/launchd/index.js +3 -0
  13. package/dist/launchd/index.js.map +1 -0
  14. package/dist/launchd/socket.d.ts +5 -0
  15. package/dist/launchd/socket.js +31 -0
  16. package/dist/launchd/socket.js.map +1 -0
  17. package/dist/launchd-agent.d.ts +50 -0
  18. package/dist/launchd-agent.js +175 -0
  19. package/dist/launchd-agent.js.map +1 -0
  20. package/dist/launchd-socket.d.ts +5 -0
  21. package/dist/launchd-socket.js +33 -0
  22. package/dist/launchd-socket.js.map +1 -0
  23. package/dist/startup.d.ts +2 -0
  24. package/dist/startup.js +44 -5
  25. package/dist/startup.js.map +1 -1
  26. package/package.json +8 -5
  27. package/LICENSE +0 -21
  28. package/README.md +0 -269
  29. package/dist/config-schema.d.ts +0 -85
  30. package/dist/config-schema.js +0 -38
  31. package/dist/config-schema.js.map +0 -1
  32. package/dist/handlers/completions/session-config.d.ts +0 -12
  33. package/dist/handlers/completions/session-config.js +0 -63
  34. package/dist/handlers/completions/session-config.js.map +0 -1
  35. package/dist/handlers/completions/streaming.d.ts +0 -4
  36. package/dist/handlers/completions/streaming.js +0 -121
  37. package/dist/handlers/completions/streaming.js.map +0 -1
  38. package/dist/handlers/completions.d.ts +0 -4
  39. package/dist/handlers/completions.js +0 -120
  40. package/dist/handlers/completions.js.map +0 -1
  41. package/dist/handlers/errors.d.ts +0 -5
  42. package/dist/handlers/errors.js +0 -10
  43. package/dist/handlers/errors.js.map +0 -1
  44. package/dist/handlers/messages/count-tokens.d.ts +0 -3
  45. package/dist/handlers/messages/count-tokens.js +0 -72
  46. package/dist/handlers/messages/count-tokens.js.map +0 -1
  47. package/dist/handlers/messages/streaming.d.ts +0 -6
  48. package/dist/handlers/messages/streaming.js +0 -274
  49. package/dist/handlers/messages/streaming.js.map +0 -1
  50. package/dist/handlers/messages/tool-result-handler.d.ts +0 -4
  51. package/dist/handlers/messages/tool-result-handler.js +0 -19
  52. package/dist/handlers/messages/tool-result-handler.js.map +0 -1
  53. package/dist/handlers/messages.d.ts +0 -4
  54. package/dist/handlers/messages.js +0 -150
  55. package/dist/handlers/messages.js.map +0 -1
  56. package/dist/handlers/models.d.ts +0 -3
  57. package/dist/handlers/models.js +0 -28
  58. package/dist/handlers/models.js.map +0 -1
  59. package/dist/handlers/responses/streaming.d.ts +0 -6
  60. package/dist/handlers/responses/streaming.js +0 -265
  61. package/dist/handlers/responses/streaming.js.map +0 -1
  62. package/dist/handlers/responses/tool-result-handler.d.ts +0 -4
  63. package/dist/handlers/responses/tool-result-handler.js +0 -9
  64. package/dist/handlers/responses/tool-result-handler.js.map +0 -1
  65. package/dist/handlers/responses.d.ts +0 -4
  66. package/dist/handlers/responses.js +0 -164
  67. package/dist/handlers/responses.js.map +0 -1
  68. package/dist/handlers/session-config.d.ts +0 -15
  69. package/dist/handlers/session-config.js +0 -79
  70. package/dist/handlers/session-config.js.map +0 -1
  71. package/dist/handlers/streaming-utils.d.ts +0 -10
  72. package/dist/handlers/streaming-utils.js +0 -22
  73. package/dist/handlers/streaming-utils.js.map +0 -1
  74. package/dist/providers/anthropic.d.ts +0 -5
  75. package/dist/providers/anthropic.js +0 -28
  76. package/dist/providers/anthropic.js.map +0 -1
  77. package/dist/providers/codex.d.ts +0 -5
  78. package/dist/providers/codex.js +0 -24
  79. package/dist/providers/codex.js.map +0 -1
  80. package/dist/providers/openai.d.ts +0 -5
  81. package/dist/providers/openai.js +0 -25
  82. package/dist/providers/openai.js.map +0 -1
  83. package/dist/schemas/anthropic.d.ts +0 -140
  84. package/dist/schemas/anthropic.js +0 -58
  85. package/dist/schemas/anthropic.js.map +0 -1
  86. package/dist/schemas/openai.d.ts +0 -98
  87. package/dist/schemas/openai.js +0 -76
  88. package/dist/schemas/openai.js.map +0 -1
  89. package/dist/schemas/responses.d.ts +0 -122
  90. package/dist/schemas/responses.js +0 -54
  91. package/dist/schemas/responses.js.map +0 -1
  92. package/dist/schemas.d.ts +0 -49
  93. package/dist/schemas.js +0 -75
  94. package/dist/schemas.js.map +0 -1
  95. package/dist/settings-patcher/anthropic.d.ts +0 -5
  96. package/dist/settings-patcher/anthropic.js +0 -75
  97. package/dist/settings-patcher/anthropic.js.map +0 -1
  98. package/dist/types.d.ts +0 -83
  99. package/dist/types.js +0 -2
  100. package/dist/types.js.map +0 -1
  101. package/dist/utils/anthropic-prompt.d.ts +0 -2
  102. package/dist/utils/anthropic-prompt.js +0 -52
  103. package/dist/utils/anthropic-prompt.js.map +0 -1
  104. package/dist/utils/model-resolver.d.ts +0 -3
  105. package/dist/utils/model-resolver.js +0 -45
  106. package/dist/utils/model-resolver.js.map +0 -1
  107. package/dist/utils/prompt.d.ts +0 -3
  108. package/dist/utils/prompt.js +0 -50
  109. package/dist/utils/prompt.js.map +0 -1
  110. package/dist/utils/responses-prompt.d.ts +0 -4
  111. package/dist/utils/responses-prompt.js +0 -58
  112. package/dist/utils/responses-prompt.js.map +0 -1
@@ -1,164 +0,0 @@
1
- import { ResponsesRequestSchema, filterFunctionTools } from "../schemas/responses.js";
2
- import { genId } from "../schemas/responses.js";
3
- import { formatResponsesPrompt, extractInstructions, extractFunctionCallOutputs, } from "../utils/responses-prompt.js";
4
- import { resolveModel } from "../utils/model-resolver.js";
5
- import { createSessionConfig } from "./session-config.js";
6
- import { resolveResponsesToolResults } from "./responses/tool-result-handler.js";
7
- import { handleResponsesStreaming, startResponseStream } from "./responses/streaming.js";
8
- import { sendOpenAIError as sendError } from "./errors.js";
9
- export function createResponsesHandler({ service, logger, config, port }, manager) {
10
- return async function handleResponses(request, reply) {
11
- const parseResult = ResponsesRequestSchema.safeParse(request.body);
12
- if (!parseResult.success) {
13
- const firstIssue = parseResult.error.issues[0];
14
- logger.debug(`Request validation failed: ${JSON.stringify(parseResult.error.issues)}`);
15
- logger.debug(`Raw body keys: ${JSON.stringify(Object.keys((request.body ?? {})))}`);
16
- sendError(reply, 400, "invalid_request_error", firstIssue?.message ?? "Invalid request body");
17
- return;
18
- }
19
- const req = parseResult.data;
20
- const callOutputs = extractFunctionCallOutputs(req.input);
21
- logger.debug(`function_call_output items: ${String(callOutputs.length)}${callOutputs.length > 0 ? ` (call_ids: ${callOutputs.map((o) => o.call_id).join(", ")})` : ""}`);
22
- if (callOutputs.length > 0) {
23
- const existingConv = manager.findByContinuationIds(callOutputs.map((o) => o.call_id));
24
- if (existingConv) {
25
- const state = existingConv.state;
26
- logger.info(`Continuation for conversation ${existingConv.id} (hasPending=${String(state.hasPending)}, sessionActive=${String(state.sessionActive)})`);
27
- state.setReply(reply);
28
- startResponseStream(reply, genId("resp"), req.model);
29
- reply.raw.on("close", () => {
30
- if (state.currentReply === reply) {
31
- logger.info("Client disconnected during continuation");
32
- state.cleanup();
33
- state.notifyStreamingDone();
34
- }
35
- });
36
- resolveResponsesToolResults(callOutputs, state, logger);
37
- await state.waitForStreamingDone();
38
- existingConv.sentMessageCount = Array.isArray(req.input) ? req.input.length : 1;
39
- return;
40
- }
41
- }
42
- const { conversation, isReuse } = manager.findForNewRequest();
43
- const state = conversation.state;
44
- state.markSessionActive();
45
- logger.info(isReuse
46
- ? `Reusing primary conversation ${conversation.id}`
47
- : `New conversation ${conversation.id}`);
48
- if (isReuse && conversation.model && conversation.model !== req.model) {
49
- logger.warn(`Model mismatch: session uses "${conversation.model}" but request sent "${req.model}" (SDK does not support mid-session model switching)`);
50
- }
51
- const tools = req.tools ? filterFunctionTools(req.tools) : undefined;
52
- const hasTools = !!tools?.length;
53
- const hasBridge = hasTools && config.toolBridge;
54
- // Responses API tools use `parameters`, bridge uses `input_schema`
55
- if (tools?.length) {
56
- const bridgeTools = tools.map((t) => ({
57
- name: t.name,
58
- description: t.description,
59
- input_schema: (t.parameters ?? {}),
60
- }));
61
- state.cacheTools(bridgeTools);
62
- }
63
- const inputLength = Array.isArray(req.input) ? req.input.length : 1;
64
- const slicedInput = isReuse && Array.isArray(req.input)
65
- ? req.input.slice(conversation.sentMessageCount)
66
- : req.input;
67
- let prompt;
68
- try {
69
- prompt = formatResponsesPrompt(slicedInput, config.excludedFilePatterns);
70
- }
71
- catch (err) {
72
- sendError(reply, 400, "invalid_request_error", err instanceof Error ? err.message : String(err));
73
- if (isReuse) {
74
- state.markSessionInactive();
75
- }
76
- else {
77
- manager.remove(conversation.id);
78
- }
79
- return;
80
- }
81
- logger.debug(`Prompt (${isReuse ? "incremental" : "full"}): ${String(prompt.length)} chars`);
82
- if (!isReuse) {
83
- const systemMessage = req.instructions ?? extractInstructions(req.input);
84
- logger.debug(`System message length: ${String(systemMessage?.length ?? 0)} chars`);
85
- logger.debug(`Tools in request: ${tools ? String(tools.length) : "0"}`);
86
- if (tools) {
87
- logger.debug(`Tool names: ${tools.map((t) => t.name).join(", ")}`);
88
- }
89
- let copilotModel = req.model;
90
- let supportsReasoningEffort = false;
91
- try {
92
- const models = await service.listModels();
93
- const resolved = resolveModel(req.model, models, logger);
94
- if (!resolved) {
95
- sendError(reply, 400, "invalid_request_error", `Model "${req.model}" is not available. Available models: ${models.map((m) => m.id).join(", ")}`);
96
- manager.remove(conversation.id);
97
- return;
98
- }
99
- copilotModel = resolved;
100
- if (config.reasoningEffort) {
101
- const modelInfo = models.find((m) => m.id === copilotModel);
102
- supportsReasoningEffort =
103
- modelInfo?.capabilities.supports.reasoningEffort ?? false;
104
- if (!supportsReasoningEffort) {
105
- logger.debug(`Model "${copilotModel}" does not support reasoning effort, ignoring config`);
106
- }
107
- }
108
- }
109
- catch (err) {
110
- logger.warn("Failed to list models, passing model through as-is:", err);
111
- }
112
- conversation.model = copilotModel;
113
- if (hasBridge) {
114
- logger.info("Tool bridge active (in-process MCP)");
115
- }
116
- const sessionConfig = createSessionConfig({
117
- model: copilotModel,
118
- systemMessage,
119
- logger,
120
- config,
121
- supportsReasoningEffort,
122
- cwd: service.cwd,
123
- hasToolBridge: hasBridge,
124
- port,
125
- conversationId: conversation.id,
126
- });
127
- try {
128
- conversation.session = await service.createSession(sessionConfig);
129
- }
130
- catch (err) {
131
- logger.error("Creating session failed:", err);
132
- sendError(reply, 500, "api_error", "Failed to create session");
133
- manager.remove(conversation.id);
134
- return;
135
- }
136
- }
137
- if (!conversation.session) {
138
- logger.error("Primary conversation has no session, clearing");
139
- manager.clearPrimary();
140
- sendError(reply, 500, "api_error", "Session lost, please retry");
141
- return;
142
- }
143
- state.setReply(reply);
144
- const responseId = genId("resp");
145
- try {
146
- logger.info(`Streaming response for conversation ${conversation.id}`);
147
- await handleResponsesStreaming(state, conversation.session, prompt, req.model, logger, hasBridge, responseId);
148
- conversation.sentMessageCount = inputLength;
149
- if (conversation.isPrimary && state.hadError) {
150
- manager.clearPrimary();
151
- }
152
- }
153
- catch (err) {
154
- logger.error("Request failed:", err);
155
- if (conversation.isPrimary) {
156
- manager.clearPrimary();
157
- }
158
- if (!reply.sent) {
159
- sendError(reply, 500, "api_error", err instanceof Error ? err.message : "Internal error");
160
- }
161
- }
162
- };
163
- }
164
- //# sourceMappingURL=responses.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/handlers/responses.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { SessionConfig } from "@github/copilot-sdk";
2
- import type { ServerConfig } from "../config.js";
3
- import type { Logger } from "../logger.js";
4
- export interface SessionConfigOptions {
5
- model: string;
6
- systemMessage?: string | undefined;
7
- logger: Logger;
8
- config: ServerConfig;
9
- supportsReasoningEffort: boolean;
10
- cwd?: string | undefined;
11
- hasToolBridge?: boolean;
12
- port?: number | undefined;
13
- conversationId?: string | undefined;
14
- }
15
- export declare function createSessionConfig({ model, systemMessage, logger, config, supportsReasoningEffort, cwd, hasToolBridge, port, conversationId, }: SessionConfigOptions): SessionConfig;
@@ -1,79 +0,0 @@
1
- function isApproved(rule, kind) {
2
- if (typeof rule === "boolean")
3
- return rule;
4
- return rule.some((k) => k === kind);
5
- }
6
- export function createSessionConfig({ model, systemMessage, logger, config, supportsReasoningEffort, cwd, hasToolBridge, port, conversationId, }) {
7
- const hasBridge = !!hasToolBridge;
8
- return {
9
- model,
10
- streaming: true,
11
- infiniteSessions: { enabled: true },
12
- workingDirectory: cwd ?? process.cwd(),
13
- ...(systemMessage && {
14
- systemMessage: {
15
- mode: "replace",
16
- content: systemMessage,
17
- },
18
- }),
19
- mcpServers: {
20
- ...Object.fromEntries(Object.entries(config.mcpServers).map(([name, server]) => [
21
- name,
22
- { ...server, tools: ["*"] },
23
- ])),
24
- ...(hasBridge && {
25
- "xcode-bridge": {
26
- type: "http",
27
- url: `http://127.0.0.1:${String(port ?? 8080)}/mcp/${conversationId ?? ""}`,
28
- tools: ["*"],
29
- },
30
- }),
31
- },
32
- // When the tool bridge is active, don't restrict availableTools so the CLI
33
- // can expose the bridged tools to the model. The onPreToolUse hook handles
34
- // permissions instead.
35
- ...(!hasBridge && config.allowedCliTools.length > 0 && {
36
- availableTools: config.allowedCliTools,
37
- }),
38
- ...(config.reasoningEffort && supportsReasoningEffort && {
39
- reasoningEffort: config.reasoningEffort,
40
- }),
41
- onUserInputRequest: (request) => {
42
- logger.debug(`User input requested: "${request.question}"`);
43
- return Promise.resolve({
44
- answer: "User input is not available. Ask your question in your response instead.",
45
- wasFreeform: true,
46
- });
47
- },
48
- onPermissionRequest: (request) => {
49
- const approved = isApproved(config.autoApprovePermissions, request.kind);
50
- logger.debug(`Permission "${request.kind}": ${approved ? "approved" : "denied"}`);
51
- return Promise.resolve(approved
52
- ? { kind: "approved" }
53
- : { kind: "denied-by-rules" });
54
- },
55
- hooks: {
56
- onPreToolUse: (input) => {
57
- const toolName = input.toolName;
58
- if (hasBridge && toolName.startsWith("xcode-bridge-")) {
59
- logger.debug(`Tool "${toolName}": allowed (bridge)`);
60
- return Promise.resolve({ permissionDecision: "allow" });
61
- }
62
- if (config.allowedCliTools.includes("*") || config.allowedCliTools.includes(toolName)) {
63
- logger.debug(`Tool "${toolName}": allowed (CLI)`);
64
- return Promise.resolve({ permissionDecision: "allow" });
65
- }
66
- for (const [serverName, server] of Object.entries(config.mcpServers)) {
67
- const allowlist = server.allowedTools ?? [];
68
- if (allowlist.includes("*") || allowlist.includes(toolName)) {
69
- logger.debug(`Tool "${toolName}": allowed (${serverName})`);
70
- return Promise.resolve({ permissionDecision: "allow" });
71
- }
72
- }
73
- logger.debug(`Tool "${toolName}": denied (not in any allowlist)`);
74
- return Promise.resolve({ permissionDecision: "deny" });
75
- },
76
- },
77
- };
78
- }
79
- //# sourceMappingURL=session-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-config.js","sourceRoot":"","sources":["../../src/handlers/session-config.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { FastifyReply } from "fastify";
2
- export declare const SSE_HEADERS: {
3
- readonly "Content-Type": "text/event-stream";
4
- readonly "Cache-Control": "no-cache";
5
- readonly Connection: "keep-alive";
6
- readonly "X-Accel-Buffering": "no";
7
- };
8
- export declare function sendSSEEvent(reply: FastifyReply, type: string, data: unknown): void;
9
- export declare function sendSSEComment(reply: FastifyReply): void;
10
- export declare function formatCompaction(data: unknown): string;
@@ -1,22 +0,0 @@
1
- export const SSE_HEADERS = {
2
- "Content-Type": "text/event-stream",
3
- "Cache-Control": "no-cache",
4
- Connection: "keep-alive",
5
- "X-Accel-Buffering": "no",
6
- };
7
- export function sendSSEEvent(reply, type, data) {
8
- reply.raw.write(`event: ${type}\ndata: ${JSON.stringify(data)}\n\n`);
9
- }
10
- export function sendSSEComment(reply) {
11
- reply.raw.write(": keepalive\n\n");
12
- }
13
- export function formatCompaction(data) {
14
- if (!data ||
15
- typeof data !== "object" ||
16
- !("preCompactionTokens" in data) ||
17
- !("postCompactionTokens" in data)) {
18
- return "compaction data unavailable";
19
- }
20
- return `${String(data.preCompactionTokens)} to ${String(data.postCompactionTokens)} tokens`;
21
- }
22
- //# sourceMappingURL=streaming-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming-utils.js","sourceRoot":"","sources":["../../src/handlers/streaming-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,cAAc,EAAE,mBAAmB;IACnC,eAAe,EAAE,UAAU;IAC3B,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,IAAI;CACgB,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,IAAY,EAAE,IAAa;IAC3E,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,IACE,CAAC,IAAI;QACL,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,CAAC,qBAAqB,IAAI,IAAI,CAAC;QAChC,CAAC,CAAC,sBAAsB,IAAI,IAAI,CAAC,EACjC,CAAC;QACD,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;AAC9F,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const anthropicProvider: {
2
- name: string;
3
- routes: string[];
4
- register(app: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>, ctx: import("../context.js").AppContext): void;
5
- };
@@ -1,28 +0,0 @@
1
- import { registerToolBridge } from "../tool-bridge/index.js";
2
- import { createMessagesHandler } from "../handlers/messages.js";
3
- import { createCountTokensHandler } from "../handlers/messages/count-tokens.js";
4
- export const anthropicProvider = {
5
- name: "Anthropic",
6
- routes: ["POST /v1/messages", "POST /v1/messages/count_tokens"],
7
- register(app, ctx) {
8
- app.addHook("onRequest", (request, reply, done) => {
9
- // MCP routes come from the SDK's own HTTP client, not from Xcode,
10
- // so they won't have the claude-cli/ user-agent
11
- if (request.url.startsWith("/mcp/")) {
12
- done();
13
- return;
14
- }
15
- const ua = request.headers["user-agent"] ?? "";
16
- if (!ua.startsWith("claude-cli/")) {
17
- ctx.logger.warn(`Rejected request from unexpected user-agent: ${ua}`);
18
- void reply.code(403).type("application/json").send('{"error":"Forbidden"}\n');
19
- return;
20
- }
21
- done();
22
- });
23
- const manager = registerToolBridge(app, ctx.logger);
24
- app.post("/v1/messages", createMessagesHandler(ctx, manager));
25
- app.post("/v1/messages/count_tokens", createCountTokensHandler(ctx));
26
- },
27
- };
28
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;IAE/D,QAAQ,CAAC,GAAG,EAAE,GAAG;QACf,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAChD,kEAAkE;YAClE,gDAAgD;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;gBACtE,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC;CACiB,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const codexProvider: {
2
- name: string;
3
- routes: string[];
4
- register(app: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>, ctx: import("../context.js").AppContext): void;
5
- };
@@ -1,24 +0,0 @@
1
- import { registerToolBridge } from "../tool-bridge/index.js";
2
- import { createResponsesHandler } from "../handlers/responses.js";
3
- export const codexProvider = {
4
- name: "Codex",
5
- routes: ["POST /v1/responses"],
6
- register(app, ctx) {
7
- app.addHook("onRequest", (request, reply, done) => {
8
- if (request.url.startsWith("/mcp/")) {
9
- done();
10
- return;
11
- }
12
- const ua = request.headers["user-agent"] ?? "";
13
- if (!ua.startsWith("Xcode/")) {
14
- ctx.logger.warn(`Rejected request from unexpected user-agent: ${ua}`);
15
- void reply.code(403).type("application/json").send('{"error":"Forbidden"}\n');
16
- return;
17
- }
18
- done();
19
- });
20
- const manager = registerToolBridge(app, ctx.logger);
21
- app.post("/v1/responses", createResponsesHandler(ctx, manager));
22
- },
23
- };
24
- //# sourceMappingURL=codex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/providers/codex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,CAAC,oBAAoB,CAAC;IAE9B,QAAQ,CAAC,GAAG,EAAE,GAAG;QACf,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;gBACtE,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;CACiB,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare const openaiProvider: {
2
- name: string;
3
- routes: string[];
4
- register(app: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>, ctx: import("../context.js").AppContext): void;
5
- };
@@ -1,25 +0,0 @@
1
- import { createModelsHandler } from "../handlers/models.js";
2
- import { createCompletionsHandler } from "../handlers/completions.js";
3
- import { ConversationManager } from "../conversation-manager.js";
4
- export const openaiProvider = {
5
- name: "OpenAI",
6
- routes: ["GET /v1/models", "POST /v1/chat/completions"],
7
- register(app, ctx) {
8
- app.addHook("onRequest", (request, reply, done) => {
9
- const ua = request.headers["user-agent"] ?? "";
10
- if (!ua.startsWith("Xcode/")) {
11
- ctx.logger.warn(`Rejected request from unexpected user-agent: ${ua}`);
12
- void reply
13
- .code(403)
14
- .type("application/json")
15
- .send('{"error":"Forbidden"}\n');
16
- return;
17
- }
18
- done();
19
- });
20
- const manager = new ConversationManager(ctx.logger);
21
- app.get("/v1/models", createModelsHandler(ctx));
22
- app.post("/v1/chat/completions", createCompletionsHandler(ctx, manager));
23
- },
24
- };
25
- //# sourceMappingURL=openai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;IAEvD,QAAQ,CAAC,GAAG,EAAE,GAAG;QACf,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,gDAAgD,EAAE,EAAE,CACrD,CAAC;gBACF,KAAK,KAAK;qBACP,IAAI,CAAC,GAAG,CAAC;qBACT,IAAI,CAAC,kBAAkB,CAAC;qBACxB,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;CACiB,CAAC"}
@@ -1,140 +0,0 @@
1
- import { z } from "zod";
2
- export interface TextBlock {
3
- type: "text";
4
- text: string;
5
- }
6
- export interface ToolUseBlock {
7
- type: "tool_use";
8
- id: string;
9
- name: string;
10
- input: Record<string, unknown>;
11
- }
12
- export interface ToolResultBlock {
13
- type: "tool_result";
14
- tool_use_id: string;
15
- content?: string | TextBlock[] | undefined;
16
- }
17
- export type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock;
18
- export interface AnthropicMessage {
19
- role: "user" | "assistant";
20
- content: string | ContentBlock[];
21
- }
22
- export interface AnthropicToolDefinition {
23
- name: string;
24
- description?: string | undefined;
25
- input_schema: Record<string, unknown>;
26
- }
27
- export interface MessageStartEvent {
28
- type: "message_start";
29
- message: {
30
- id: string;
31
- type: "message";
32
- role: "assistant";
33
- content: [];
34
- model: string;
35
- stop_reason: null;
36
- usage: {
37
- input_tokens: number;
38
- output_tokens: number;
39
- };
40
- };
41
- }
42
- export type TextContentBlock = {
43
- type: "text";
44
- text: "";
45
- };
46
- export type ToolUseContentBlock = {
47
- type: "tool_use";
48
- id: string;
49
- name: string;
50
- input: Record<string, unknown>;
51
- };
52
- export interface ContentBlockStartEvent {
53
- type: "content_block_start";
54
- index: number;
55
- content_block: TextContentBlock | ToolUseContentBlock;
56
- }
57
- export type TextDelta = {
58
- type: "text_delta";
59
- text: string;
60
- };
61
- export type InputJsonDelta = {
62
- type: "input_json_delta";
63
- partial_json: string;
64
- };
65
- export interface ContentBlockDeltaEvent {
66
- type: "content_block_delta";
67
- index: number;
68
- delta: TextDelta | InputJsonDelta;
69
- }
70
- export interface ContentBlockStopEvent {
71
- type: "content_block_stop";
72
- index: number;
73
- }
74
- export interface MessageDeltaEvent {
75
- type: "message_delta";
76
- delta: {
77
- stop_reason: string;
78
- stop_sequence: null;
79
- };
80
- usage: {
81
- output_tokens: number;
82
- };
83
- }
84
- export interface MessageStopEvent {
85
- type: "message_stop";
86
- }
87
- export type AnthropicSSEEvent = MessageStartEvent | ContentBlockStartEvent | ContentBlockDeltaEvent | ContentBlockStopEvent | MessageDeltaEvent | MessageStopEvent;
88
- export interface AnthropicErrorResponse {
89
- type: "error";
90
- error: {
91
- type: "invalid_request_error" | "api_error";
92
- message: string;
93
- };
94
- }
95
- export interface CountTokensResponse {
96
- input_tokens: number;
97
- }
98
- export declare const AnthropicMessagesRequestSchema: z.ZodObject<{
99
- model: z.ZodString;
100
- max_tokens: z.ZodNumber;
101
- system: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodObject<{
102
- type: z.ZodLiteral<"text">;
103
- text: z.ZodString;
104
- }, z.core.$strip>>]>>;
105
- messages: z.ZodArray<z.ZodObject<{
106
- role: z.ZodEnum<{
107
- user: "user";
108
- assistant: "assistant";
109
- }>;
110
- content: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
111
- type: z.ZodLiteral<"text">;
112
- text: z.ZodString;
113
- }, z.core.$strip>, z.ZodObject<{
114
- type: z.ZodLiteral<"tool_use">;
115
- id: z.ZodString;
116
- name: z.ZodString;
117
- input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
118
- }, z.core.$strip>, z.ZodObject<{
119
- type: z.ZodLiteral<"tool_result">;
120
- tool_use_id: z.ZodString;
121
- content: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodObject<{
122
- type: z.ZodLiteral<"text">;
123
- text: z.ZodString;
124
- }, z.core.$strip>>]>>;
125
- }, z.core.$strip>], "type">>]>;
126
- }, z.core.$strip>>;
127
- tools: z.ZodOptional<z.ZodArray<z.ZodObject<{
128
- name: z.ZodString;
129
- description: z.ZodOptional<z.ZodString>;
130
- input_schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
131
- }, z.core.$strip>>>;
132
- stream: z.ZodOptional<z.ZodBoolean>;
133
- temperature: z.ZodOptional<z.ZodNumber>;
134
- top_p: z.ZodOptional<z.ZodNumber>;
135
- top_k: z.ZodOptional<z.ZodNumber>;
136
- stop_sequences: z.ZodOptional<z.ZodArray<z.ZodString>>;
137
- metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
138
- }, z.core.$strip>;
139
- export type AnthropicMessagesRequest = z.infer<typeof AnthropicMessagesRequestSchema>;
140
- export declare function extractAnthropicSystem(system: string | TextBlock[] | undefined): string | undefined;
@@ -1,58 +0,0 @@
1
- import { z } from "zod";
2
- const TextBlockSchema = z.object({
3
- type: z.literal("text"),
4
- text: z.string(),
5
- });
6
- const ToolUseBlockSchema = z.object({
7
- type: z.literal("tool_use"),
8
- id: z.string(),
9
- name: z.string(),
10
- input: z.record(z.string(), z.unknown()),
11
- });
12
- const ToolResultContentSchema = z.union([
13
- z.string(),
14
- z.array(TextBlockSchema),
15
- ]);
16
- const ToolResultBlockSchema = z.object({
17
- type: z.literal("tool_result"),
18
- tool_use_id: z.string(),
19
- content: ToolResultContentSchema.optional(),
20
- });
21
- const ContentBlockSchema = z.discriminatedUnion("type", [
22
- TextBlockSchema,
23
- ToolUseBlockSchema,
24
- ToolResultBlockSchema,
25
- ]);
26
- const AnthropicMessageSchema = z.object({
27
- role: z.enum(["user", "assistant"]),
28
- content: z.union([z.string(), z.array(ContentBlockSchema)]),
29
- });
30
- const AnthropicToolDefinitionSchema = z.object({
31
- name: z.string(),
32
- description: z.string().optional(),
33
- input_schema: z.record(z.string(), z.unknown()),
34
- });
35
- export const AnthropicMessagesRequestSchema = z.object({
36
- model: z.string().min(1, "Model is required"),
37
- max_tokens: z.number().int().positive("max_tokens must be positive"),
38
- system: z.union([z.string(), z.array(TextBlockSchema)]).optional(),
39
- messages: z.array(AnthropicMessageSchema).min(1, "Messages are required"),
40
- tools: z.array(AnthropicToolDefinitionSchema).optional(),
41
- stream: z.boolean().optional(),
42
- temperature: z.number().optional(),
43
- top_p: z.number().optional(),
44
- top_k: z.number().optional(),
45
- stop_sequences: z.array(z.string()).optional(),
46
- metadata: z.record(z.string(), z.unknown()).optional(),
47
- });
48
- // The Anthropic API accepts system as a string or an array of text blocks,
49
- // so we flatten it into a single string for the Copilot SDK.
50
- export function extractAnthropicSystem(system) {
51
- if (system == null)
52
- return undefined;
53
- if (typeof system === "string")
54
- return system;
55
- const text = system.map((b) => b.text).join("\n\n");
56
- return text || undefined;
57
- }
58
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/schemas/anthropic.ts"],"names":[],"mappings":"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"}