xcode-copilot-server 3.3.2 → 3.4.1

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 (111) hide show
  1. package/dist/banner.d.ts +4 -4
  2. package/dist/banner.js +48 -12
  3. package/dist/banner.js.map +1 -1
  4. package/dist/bridge-constants.d.ts +2 -0
  5. package/dist/bridge-constants.js +3 -0
  6. package/dist/bridge-constants.js.map +1 -0
  7. package/dist/cli-validators.d.ts +2 -2
  8. package/dist/cli-validators.js +7 -2
  9. package/dist/cli-validators.js.map +1 -1
  10. package/dist/config-schema.d.ts +107 -0
  11. package/dist/config-schema.js +53 -0
  12. package/dist/config-schema.js.map +1 -0
  13. package/dist/config.d.ts +8 -28
  14. package/dist/config.js +39 -60
  15. package/dist/config.js.map +1 -1
  16. package/dist/context.d.ts +3 -1
  17. package/dist/conversation-manager.d.ts +9 -4
  18. package/dist/conversation-manager.js +44 -61
  19. package/dist/conversation-manager.js.map +1 -1
  20. package/dist/index.js +31 -12
  21. package/dist/index.js.map +1 -1
  22. package/dist/launchd/agent.d.ts +9 -13
  23. package/dist/launchd/agent.js +33 -26
  24. package/dist/launchd/agent.js.map +1 -1
  25. package/dist/launchd/index.d.ts +3 -3
  26. package/dist/launchd/index.js +1 -1
  27. package/dist/launchd/index.js.map +1 -1
  28. package/dist/launchd/socket.d.ts +2 -1
  29. package/dist/providers/claude/provider.js +40 -64
  30. package/dist/providers/claude/provider.js.map +1 -1
  31. package/dist/providers/claude/streaming.d.ts +10 -1
  32. package/dist/providers/claude/streaming.js +7 -3
  33. package/dist/providers/claude/streaming.js.map +1 -1
  34. package/dist/providers/claude/tool-results.js +1 -1
  35. package/dist/providers/claude/tool-results.js.map +1 -1
  36. package/dist/providers/codex/provider.js +28 -60
  37. package/dist/providers/codex/provider.js.map +1 -1
  38. package/dist/providers/codex/streaming.d.ts +12 -3
  39. package/dist/providers/codex/streaming.js +6 -6
  40. package/dist/providers/codex/streaming.js.map +1 -1
  41. package/dist/providers/codex/tool-results.js +1 -1
  42. package/dist/providers/codex/tool-results.js.map +1 -1
  43. package/dist/providers/index.d.ts +5 -19
  44. package/dist/providers/index.js +25 -0
  45. package/dist/providers/index.js.map +1 -1
  46. package/dist/providers/names.d.ts +4 -0
  47. package/dist/providers/names.js +7 -0
  48. package/dist/providers/names.js.map +1 -0
  49. package/dist/providers/openai/provider.js +5 -14
  50. package/dist/providers/openai/provider.js.map +1 -1
  51. package/dist/providers/shared/continuation.d.ts +10 -0
  52. package/dist/providers/shared/continuation.js +18 -0
  53. package/dist/providers/shared/continuation.js.map +1 -0
  54. package/dist/providers/shared/prompt-utils.d.ts +0 -11
  55. package/dist/providers/shared/prompt-utils.js +0 -11
  56. package/dist/providers/shared/prompt-utils.js.map +1 -1
  57. package/dist/providers/shared/session-config.d.ts +12 -3
  58. package/dist/providers/shared/session-config.js +24 -7
  59. package/dist/providers/shared/session-config.js.map +1 -1
  60. package/dist/providers/shared/streaming-core.d.ts +12 -2
  61. package/dist/providers/shared/streaming-core.js +183 -161
  62. package/dist/providers/shared/streaming-core.js.map +1 -1
  63. package/dist/providers/shared/streaming-orchestrator.d.ts +11 -0
  64. package/dist/providers/shared/streaming-orchestrator.js +11 -0
  65. package/dist/providers/shared/streaming-orchestrator.js.map +1 -0
  66. package/dist/providers/shared/user-agent-guard.d.ts +3 -0
  67. package/dist/providers/shared/user-agent-guard.js +17 -0
  68. package/dist/providers/shared/user-agent-guard.js.map +1 -0
  69. package/dist/settings-patcher/claude.d.ts +1 -2
  70. package/dist/settings-patcher/claude.js +35 -13
  71. package/dist/settings-patcher/claude.js.map +1 -1
  72. package/dist/settings-patcher/codex.d.ts +1 -20
  73. package/dist/settings-patcher/codex.js +58 -31
  74. package/dist/settings-patcher/codex.js.map +1 -1
  75. package/dist/settings-patcher/index.d.ts +5 -14
  76. package/dist/settings-patcher/index.js +26 -6
  77. package/dist/settings-patcher/index.js.map +1 -1
  78. package/dist/settings-patcher/types.d.ts +21 -0
  79. package/dist/settings-patcher/url-utils.d.ts +1 -0
  80. package/dist/settings-patcher/url-utils.js +6 -0
  81. package/dist/settings-patcher/url-utils.js.map +1 -0
  82. package/dist/shutdown.d.ts +16 -0
  83. package/dist/shutdown.js +53 -0
  84. package/dist/shutdown.js.map +1 -0
  85. package/dist/startup.d.ts +1 -1
  86. package/dist/startup.js +74 -133
  87. package/dist/startup.js.map +1 -1
  88. package/dist/tool-bridge/constants.d.ts +4 -2
  89. package/dist/tool-bridge/constants.js +4 -2
  90. package/dist/tool-bridge/constants.js.map +1 -1
  91. package/dist/tool-bridge/index.d.ts +2 -1
  92. package/dist/tool-bridge/index.js +5 -1
  93. package/dist/tool-bridge/index.js.map +1 -1
  94. package/dist/tool-bridge/routes.d.ts +2 -2
  95. package/dist/tool-bridge/routes.js +24 -22
  96. package/dist/tool-bridge/routes.js.map +1 -1
  97. package/dist/tool-bridge/session-lifecycle.js +6 -3
  98. package/dist/tool-bridge/session-lifecycle.js.map +1 -1
  99. package/dist/tool-bridge/state.d.ts +4 -25
  100. package/dist/tool-bridge/state.js +6 -65
  101. package/dist/tool-bridge/state.js.map +1 -1
  102. package/dist/tool-bridge/tool-router.d.ts +1 -0
  103. package/dist/tool-bridge/tool-router.js +26 -19
  104. package/dist/tool-bridge/tool-router.js.map +1 -1
  105. package/dist/utils/child-process.d.ts +2 -0
  106. package/dist/utils/child-process.js +8 -0
  107. package/dist/utils/child-process.js.map +1 -0
  108. package/dist/utils/type-guards.d.ts +2 -0
  109. package/dist/utils/type-guards.js +7 -0
  110. package/dist/utils/type-guards.js.map +1 -0
  111. package/package.json +2 -2
@@ -1,90 +1,66 @@
1
- import { registerToolBridge } from "../../tool-bridge/index.js";
1
+ import { resolveToolBridgeManager } from "../../tool-bridge/index.js";
2
2
  import { createMessagesHandler, createCountTokensHandler, } from "copilot-sdk-proxy";
3
+ import { asConversation } from "../../conversation-manager.js";
3
4
  import { resolveToolResults } from "./tool-results.js";
4
5
  import { handleAnthropicStreaming, startReply } from "./streaming.js";
5
- import { createSessionConfig } from "../shared/session-config.js";
6
+ import { createProviderSessionConfig } from "../shared/session-config.js";
6
7
  import { filterExcludedFiles } from "../shared/prompt-utils.js";
8
+ import { addUserAgentGuard } from "../shared/user-agent-guard.js";
9
+ import { handleContinuation } from "../shared/continuation.js";
10
+ import { orchestrateStreaming } from "../shared/streaming-orchestrator.js";
11
+ import { UA_PREFIXES } from "../names.js";
12
+ function extractToolResultIds(messages) {
13
+ const lastMsg = messages[messages.length - 1];
14
+ if (!lastMsg || lastMsg.role !== "user" || typeof lastMsg.content === "string") {
15
+ return [];
16
+ }
17
+ const ids = [];
18
+ for (const block of lastMsg.content) {
19
+ if (block.type === "tool_result") {
20
+ ids.push(block.tool_use_id);
21
+ }
22
+ }
23
+ return ids;
24
+ }
7
25
  export const claudeProvider = {
8
26
  name: "Claude",
9
27
  routes: ["POST /v1/messages", "POST /v1/messages/count_tokens"],
10
28
  register(app, ctx) {
11
- app.addHook("onRequest", (request, reply, done) => {
12
- // MCP routes come from the SDK, not Xcode, so they
13
- // won't have the claude-cli/ user-agent
14
- if (request.url.startsWith("/mcp/")) {
15
- done();
16
- return;
17
- }
18
- const ua = request.headers["user-agent"] ?? "";
19
- if (!ua.startsWith("claude-cli/")) {
20
- ctx.logger.warn(`Rejected request from unexpected user-agent: ${ua}`);
21
- void reply.code(403).type("application/json").send('{"error":"Forbidden"}\n');
22
- return;
23
- }
24
- done();
25
- });
26
- const manager = registerToolBridge(app, ctx.logger);
29
+ addUserAgentGuard(app, UA_PREFIXES.claude, ctx.logger);
30
+ const manager = resolveToolBridgeManager(app, ctx.toolBridgeManager, ctx.logger);
27
31
  const { logger, config, port, stats } = ctx;
28
32
  app.post("/v1/messages", createMessagesHandler(ctx, manager, {
29
33
  beforeHandler: async (req, reply) => {
30
- const existingConv = manager.findByContinuation(req.messages);
34
+ const toolResultIds = extractToolResultIds(req.messages);
35
+ if (toolResultIds.length === 0)
36
+ return false;
37
+ const existingConv = manager.findByContinuationIds(toolResultIds);
31
38
  if (!existingConv)
32
39
  return false;
33
- const state = existingConv.state;
34
- logger.info(`Continuation for conversation ${existingConv.id} (hasPending=${String(state.hasPending)}, sessionActive=${String(state.sessionActive)})`);
35
- state.setReply(reply);
36
- startReply(reply, req.model);
37
- // TODO: the continuation doesn't own the session so we can't abort it
38
- // here. The original streaming handler will let it run to idle harmlessly
39
- // because it guards against null replies, but ideally we'd abort it too.
40
- reply.raw.on("close", () => {
41
- if (state.currentReply === reply) {
42
- logger.info("Client disconnected during continuation");
43
- state.cleanup();
44
- state.notifyStreamingDone();
45
- }
40
+ return handleContinuation(asConversation(existingConv), reply, logger, {
41
+ startStream: () => { startReply(reply, req.model); },
42
+ resolveResults: () => { resolveToolResults(req.messages, existingConv.state, logger); },
43
+ countMessages: () => req.messages.length,
46
44
  });
47
- resolveToolResults(req.messages, state, logger);
48
- await state.waitForStreamingDone();
49
- existingConv.sentMessageCount = req.messages.length;
50
- return true;
51
45
  },
52
46
  onConversationReady: (conversation, req) => {
53
- const { state } = conversation;
47
+ const { state } = asConversation(conversation);
54
48
  const tools = req.tools;
55
49
  if (tools?.length) {
56
- state.cacheTools(tools);
50
+ state.toolCache.cacheTools(tools);
57
51
  }
58
52
  },
59
53
  transformPrompt: (prompt) => filterExcludedFiles(prompt, config.excludedFilePatterns),
60
- createSessionConfig: (baseOptions, conversation, req) => {
61
- const tools = req.tools;
62
- const hasBridge = !!tools?.length && config.toolBridge;
63
- if (tools) {
64
- logger.debug(`Tools in request: ${String(tools.length)}`);
65
- logger.debug(`Tool names: ${tools.map((t) => t.name).join(", ")}`);
66
- }
67
- if (hasBridge) {
68
- logger.info("Tool bridge active (in-process MCP)");
69
- }
70
- return createSessionConfig({
71
- ...baseOptions,
72
- config,
73
- hasToolBridge: hasBridge,
74
- port,
75
- conversationId: conversation.id,
76
- });
77
- },
54
+ createSessionConfig: (baseOptions, conversation, req) => createProviderSessionConfig(baseOptions, { conversationId: conversation.id, tools: req.tools, config, logger, port }),
78
55
  handleStreaming: async ({ conversation, session, prompt, model, reply, req }) => {
79
- const { state } = conversation;
56
+ const conv = asConversation(conversation);
80
57
  const hasBridge = !!req.tools?.length && config.toolBridge;
81
- state.setReply(reply);
82
- logger.info(`Streaming response for conversation ${conversation.id}`);
83
- await handleAnthropicStreaming(state, session, prompt, model, logger, hasBridge, stats);
84
- conversation.sentMessageCount = req.messages.length;
85
- if (conversation.isPrimary && state.hadError) {
86
- manager.clearPrimary();
87
- }
58
+ conv.state.replies.setReply(reply);
59
+ await orchestrateStreaming({
60
+ conversation: conv, logger, manager,
61
+ messageCount: req.messages.length,
62
+ runStreaming: () => handleAnthropicStreaming({ state: conv.state, session, prompt, model, logger, hasBridge, stats }),
63
+ });
88
64
  },
89
65
  }));
90
66
  app.post("/v1/messages/count_tokens", createCountTokensHandler(ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/claude/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/claude/provider.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,13 @@ import type { CopilotSession, Logger, Stats } from "copilot-sdk-proxy";
2
2
  import { startReply } from "copilot-sdk-proxy";
3
3
  import type { ToolBridgeState } from "../../tool-bridge/state.js";
4
4
  export { startReply };
5
- export declare function handleAnthropicStreaming(state: ToolBridgeState, session: CopilotSession, prompt: string, model: string, logger: Logger, hasBridge: boolean, stats: Stats): Promise<void>;
5
+ interface AnthropicStreamingOptions {
6
+ state: ToolBridgeState;
7
+ session: CopilotSession;
8
+ prompt: string;
9
+ model: string;
10
+ logger: Logger;
11
+ hasBridge: boolean;
12
+ stats: Stats;
13
+ }
14
+ export declare function handleAnthropicStreaming(opts: AnthropicStreamingOptions): Promise<void>;
@@ -35,16 +35,20 @@ class BridgeAnthropicProtocol extends AnthropicProtocol {
35
35
  this.emitToolUseBlocks(r, tools);
36
36
  this.sendEpilogue(r, "tool_use");
37
37
  }
38
+ teardown() {
39
+ // Nothing to clean up (unlike ResponsesProtocol), but required by BridgeStreamProtocol.
40
+ }
38
41
  reset() {
39
42
  this.textBlockStarted = false;
40
43
  }
41
44
  }
42
- export async function handleAnthropicStreaming(state, session, prompt, model, logger, hasBridge, stats) {
43
- const reply = state.currentReply;
45
+ export function handleAnthropicStreaming(opts) {
46
+ const { state, session, prompt, model, logger, hasBridge, stats } = opts;
47
+ const reply = state.replies.currentReply;
44
48
  if (!reply)
45
49
  throw new Error("No reply set on bridge state");
46
50
  startReply(reply, model);
47
51
  const protocol = new BridgeAnthropicProtocol();
48
- return runSessionStreaming(state, session, prompt, logger, hasBridge, protocol, reply, stats);
52
+ return runSessionStreaming({ state, session, prompt, logger, hasBridge, protocol, initialReply: reply, stats });
49
53
  }
50
54
  //# sourceMappingURL=streaming.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/providers/claude/streaming.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,IAAI,SAAS,EACzB,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,MAAM,uBAAwB,SAAQ,iBAAiB;IAC7C,iBAAiB,CACvB,CAAe,EACf,YAAmC;QAEnC,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACtB,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,GAAG,UAAU,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,SAAS,CAAC,CAAC,EAAE,qBAAqB,EAAE;gBAClC,IAAI,EAAE,qBAAqB;gBAC3B,KAAK;gBACL,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;aACjF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,SAAS,CAAC,CAAC,EAAE,qBAAqB,EAAE;gBAClC,IAAI,EAAE,qBAAqB;gBAC3B,KAAK;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE;aAC5D,CAAC,CAAC;YAEH,SAAS,CAAC,CAAC,EAAE,oBAAoB,EAAE;gBACjC,IAAI,EAAE,oBAAoB;gBAC1B,KAAK;aAC0B,CAAC,CAAC;YAEnC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,CAAe,EAAE,KAA4B;QAC9D,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAsB,EACtB,OAAuB,EACvB,MAAc,EACd,KAAa,EACb,MAAc,EACd,SAAkB,EAClB,KAAY;IAEZ,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5D,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAC/C,OAAO,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAChG,CAAC"}
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/providers/claude/streaming.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,IAAI,SAAS,EACzB,UAAU,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,MAAM,uBAAwB,SAAQ,iBAAiB;IAC7C,iBAAiB,CACvB,CAAe,EACf,YAAmC;QAEnC,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACtB,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,GAAG,UAAU,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,SAAS,CAAC,CAAC,EAAE,qBAAqB,EAAE;gBAClC,IAAI,EAAE,qBAAqB;gBAC3B,KAAK;gBACL,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;aACjF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,SAAS,CAAC,CAAC,EAAE,qBAAqB,EAAE;gBAClC,IAAI,EAAE,qBAAqB;gBAC3B,KAAK;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE;aAC5D,CAAC,CAAC;YAEH,SAAS,CAAC,CAAC,EAAE,oBAAoB,EAAE;gBACjC,IAAI,EAAE,oBAAoB;gBAC1B,KAAK;aAC0B,CAAC,CAAC;YAEnC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,CAAe,EAAE,KAA4B;QAC9D,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC;IAEQ,QAAQ;QACf,wFAAwF;IAC1F,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;CACF;AAYD,MAAM,UAAU,wBAAwB,CAAC,IAA+B;IACtE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5D,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAC/C,OAAO,mBAAmB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAClH,CAAC"}
@@ -10,7 +10,7 @@ export function resolveToolResults(messages, state, logger) {
10
10
  ? block.content.map((b) => b.text).join("\n")
11
11
  : "";
12
12
  logger.debug(`Resolving tool result for ${block.tool_use_id}`);
13
- if (!state.resolveToolCall(block.tool_use_id, resultText)) {
13
+ if (!state.toolRouter.resolveToolCall(block.tool_use_id, resultText)) {
14
14
  logger.warn(`No pending MCP request for tool_use_id ${block.tool_use_id}`);
15
15
  }
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-results.js","sourceRoot":"","sources":["../../../src/providers/claude/tool-results.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,KAAsB,EACtB,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO;IAEvF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAClD,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tool-results.js","sourceRoot":"","sources":["../../../src/providers/claude/tool-results.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,KAAsB,EACtB,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO;IAEvF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAClD,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,56 +1,40 @@
1
- import { registerToolBridge } from "../../tool-bridge/index.js";
1
+ import { resolveToolBridgeManager } from "../../tool-bridge/index.js";
2
2
  import { createResponsesHandler, extractFunctionCallOutputs, filterFunctionTools, genId, } from "copilot-sdk-proxy";
3
+ import { asConversation } from "../../conversation-manager.js";
3
4
  import { resolveResponsesToolResults } from "./tool-results.js";
4
5
  import { handleResponsesStreaming, startResponseStream } from "./streaming.js";
5
- import { createSessionConfig } from "../shared/session-config.js";
6
+ import { createProviderSessionConfig } from "../shared/session-config.js";
6
7
  import { filterExcludedFiles } from "../shared/prompt-utils.js";
8
+ import { addUserAgentGuard } from "../shared/user-agent-guard.js";
9
+ import { handleContinuation } from "../shared/continuation.js";
10
+ import { orchestrateStreaming } from "../shared/streaming-orchestrator.js";
11
+ import { UA_PREFIXES } from "../names.js";
7
12
  export const codexProvider = {
8
13
  name: "Codex",
9
14
  routes: ["POST /v1/responses"],
10
15
  register(app, ctx) {
11
- app.addHook("onRequest", (request, reply, done) => {
12
- if (request.url.startsWith("/mcp/")) {
13
- done();
14
- return;
15
- }
16
- const ua = request.headers["user-agent"] ?? "";
17
- if (!ua.startsWith("Xcode/")) {
18
- ctx.logger.warn(`Rejected request from unexpected user-agent: ${ua}`);
19
- void reply.code(403).type("application/json").send('{"error":"Forbidden"}\n');
20
- return;
21
- }
22
- done();
23
- });
24
- const manager = registerToolBridge(app, ctx.logger);
16
+ addUserAgentGuard(app, UA_PREFIXES.codex, ctx.logger);
17
+ const manager = resolveToolBridgeManager(app, ctx.toolBridgeManager, ctx.logger);
25
18
  const { logger, config, port, stats } = ctx;
26
19
  app.post("/v1/responses", createResponsesHandler(ctx, manager, {
27
20
  beforeHandler: async (req, reply) => {
28
21
  const callOutputs = extractFunctionCallOutputs(req.input);
29
- logger.debug(`function_call_output items: ${String(callOutputs.length)}${callOutputs.length > 0 ? ` (call_ids: ${callOutputs.map((o) => o.call_id).join(", ")})` : ""}`);
30
22
  if (callOutputs.length === 0)
31
23
  return false;
32
24
  const existingConv = manager.findByContinuationIds(callOutputs.map((o) => o.call_id));
33
25
  if (!existingConv)
34
26
  return false;
35
- const state = existingConv.state;
36
- logger.info(`Continuation for conversation ${existingConv.id} (hasPending=${String(state.hasPending)}, sessionActive=${String(state.sessionActive)})`);
37
- state.setReply(reply);
38
- startResponseStream(reply, genId("resp"), req.model);
39
- reply.raw.on("close", () => {
40
- if (state.currentReply === reply) {
41
- logger.info("Client disconnected during continuation");
42
- state.cleanup();
43
- state.notifyStreamingDone();
44
- }
27
+ return handleContinuation(asConversation(existingConv), reply, logger, {
28
+ startStream: () => startResponseStream(reply, genId("resp"), req.model),
29
+ resolveResults: () => { resolveResponsesToolResults(callOutputs, existingConv.state, logger); },
30
+ countMessages: () => Array.isArray(req.input) ? req.input.length : 1,
45
31
  });
46
- resolveResponsesToolResults(callOutputs, state, logger);
47
- await state.waitForStreamingDone();
48
- existingConv.sentMessageCount = Array.isArray(req.input) ? req.input.length : 1;
49
- return true;
50
32
  },
51
33
  onConversationReady: (conversation, req) => {
52
- const { state } = conversation;
34
+ const { state } = asConversation(conversation);
53
35
  const tools = req.tools ? filterFunctionTools(req.tools) : undefined;
36
+ if (tools)
37
+ state.setFilteredTools(tools);
54
38
  // Responses API tools use `parameters`, bridge uses `input_schema`
55
39
  if (tools?.length) {
56
40
  const bridgeTools = tools.map((t) => ({
@@ -58,40 +42,24 @@ export const codexProvider = {
58
42
  description: t.description,
59
43
  input_schema: t.parameters ?? {},
60
44
  }));
61
- state.cacheTools(bridgeTools);
45
+ state.toolCache.cacheTools(bridgeTools);
62
46
  }
63
47
  },
64
48
  transformPrompt: (prompt) => filterExcludedFiles(prompt, config.excludedFilePatterns),
65
- createSessionConfig: (baseOptions, conversation, req) => {
66
- const tools = req.tools ? filterFunctionTools(req.tools) : undefined;
67
- const hasBridge = !!tools?.length && config.toolBridge;
68
- if (tools) {
69
- logger.debug(`Tools in request: ${String(tools.length)}`);
70
- logger.debug(`Tool names: ${tools.map((t) => t.name).join(", ")}`);
71
- }
72
- if (hasBridge) {
73
- logger.info("Tool bridge active (in-process MCP)");
74
- }
75
- return createSessionConfig({
76
- ...baseOptions,
77
- config,
78
- hasToolBridge: hasBridge,
79
- port,
80
- conversationId: conversation.id,
81
- });
49
+ createSessionConfig: (baseOptions, conversation) => {
50
+ const { state } = asConversation(conversation);
51
+ return createProviderSessionConfig(baseOptions, { conversationId: conversation.id, tools: state.filteredTools, config, logger, port });
82
52
  },
83
53
  handleStreaming: async ({ conversation, session, prompt, model, reply, req, responseId }) => {
84
- const { state } = conversation;
85
- const tools = req.tools ? filterFunctionTools(req.tools) : undefined;
54
+ const conv = asConversation(conversation);
55
+ const tools = conv.state.filteredTools;
86
56
  const hasBridge = !!tools?.length && config.toolBridge;
87
- state.setReply(reply);
88
- const inputLength = Array.isArray(req.input) ? req.input.length : 1;
89
- logger.info(`Streaming response for conversation ${conversation.id}`);
90
- await handleResponsesStreaming(state, session, prompt, model, logger, hasBridge, responseId, stats);
91
- conversation.sentMessageCount = inputLength;
92
- if (conversation.isPrimary && state.hadError) {
93
- manager.clearPrimary();
94
- }
57
+ conv.state.replies.setReply(reply);
58
+ await orchestrateStreaming({
59
+ conversation: conv, logger, manager,
60
+ messageCount: Array.isArray(req.input) ? req.input.length : 1,
61
+ runStreaming: () => handleResponsesStreaming({ state: conv.state, session, prompt, model, logger, hasBridge, responseId, stats }),
62
+ });
95
63
  },
96
64
  }));
97
65
  },
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/codex/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/codex/provider.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,15 @@
1
1
  import type { CopilotSession, Logger, Stats } from "copilot-sdk-proxy";
2
2
  import { startResponseStream } from "copilot-sdk-proxy";
3
- import type { SeqCounter } from "copilot-sdk-proxy";
4
3
  import type { ToolBridgeState } from "../../tool-bridge/state.js";
5
- export { type SeqCounter, startResponseStream };
6
- export declare function handleResponsesStreaming(state: ToolBridgeState, session: CopilotSession, prompt: string, model: string, logger: Logger, hasBridge: boolean, responseId: string, stats: Stats): Promise<void>;
4
+ export { startResponseStream };
5
+ interface ResponsesStreamingOptions {
6
+ state: ToolBridgeState;
7
+ session: CopilotSession;
8
+ prompt: string;
9
+ model: string;
10
+ logger: Logger;
11
+ hasBridge: boolean;
12
+ responseId: string;
13
+ stats: Stats;
14
+ }
15
+ export declare function handleResponsesStreaming(opts: ResponsesStreamingOptions): Promise<void>;
@@ -7,8 +7,7 @@ class BridgeResponsesProtocol extends ResponsesProtocol {
7
7
  constructor(responseId, model, seq, createdAt, getReply) {
8
8
  super(responseId, model, seq, createdAt);
9
9
  this.getReply = getReply;
10
- // Keepalive every 15s so the client doesn't time out while
11
- // waiting for internal tool execution to finish
10
+ // Keepalive every 15s so the client doesn't time out waiting for tool execution.
12
11
  this.keepaliveInterval = setInterval(() => {
13
12
  const r = this.getReply();
14
13
  if (r)
@@ -59,12 +58,13 @@ class BridgeResponsesProtocol extends ResponsesProtocol {
59
58
  // within the same response, so we deliberately leave seq alone.
60
59
  }
61
60
  }
62
- export async function handleResponsesStreaming(state, session, prompt, model, logger, hasBridge, responseId, stats) {
63
- const reply = state.currentReply;
61
+ export function handleResponsesStreaming(opts) {
62
+ const { state, session, prompt, model, logger, hasBridge, responseId, stats } = opts;
63
+ const reply = state.replies.currentReply;
64
64
  if (!reply)
65
65
  throw new Error("No reply set on bridge state");
66
66
  const { seq, createdAt } = startResponseStream(reply, responseId, model);
67
- const protocol = new BridgeResponsesProtocol(responseId, model, seq, createdAt, () => state.currentReply);
68
- return runSessionStreaming(state, session, prompt, logger, hasBridge, protocol, reply, stats);
67
+ const protocol = new BridgeResponsesProtocol(responseId, model, seq, createdAt, () => state.replies.currentReply);
68
+ return runSessionStreaming({ state, session, prompt, logger, hasBridge, protocol, initialReply: reply, stats });
69
69
  }
70
70
  //# sourceMappingURL=streaming.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/providers/codex/streaming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/providers/codex/streaming.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  export function resolveResponsesToolResults(outputs, state, logger) {
2
2
  for (const item of outputs) {
3
3
  logger.debug(`Resolving tool result for ${item.call_id}`);
4
- if (!state.resolveToolCall(item.call_id, item.output)) {
4
+ if (!state.toolRouter.resolveToolCall(item.call_id, item.output)) {
5
5
  logger.warn(`No pending MCP request for call_id ${item.call_id}`);
6
6
  }
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-results.js","sourceRoot":"","sources":["../../../src/providers/codex/tool-results.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,2BAA2B,CACzC,OAAkC,EAClC,KAAsB,EACtB,MAAc;IAEd,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tool-results.js","sourceRoot":"","sources":["../../../src/providers/codex/tool-results.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,2BAA2B,CACzC,OAAkC,EAClC,KAAsB,EACtB,MAAc;IAEd,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,20 +1,6 @@
1
1
  import type { Provider } from "./types.js";
2
- export type { Provider };
3
- export declare const providers: {
4
- openai: {
5
- name: string;
6
- routes: string[];
7
- 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;
8
- };
9
- claude: {
10
- name: string;
11
- routes: string[];
12
- 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;
13
- };
14
- codex: {
15
- name: string;
16
- routes: string[];
17
- 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;
18
- };
19
- };
20
- export type ProxyName = keyof typeof providers;
2
+ import type { ServerConfig } from "../config-schema.js";
3
+ import type { ProxyName } from "./names.js";
4
+ export type { ProxyName, ProxyMode } from "./names.js";
5
+ export declare const providers: Record<ProxyName, Provider>;
6
+ export declare function createAutoProvider(configs: Record<ProxyName, ServerConfig>): Provider;
@@ -1,9 +1,34 @@
1
1
  import { openaiProvider } from "./openai/provider.js";
2
2
  import { claudeProvider } from "./claude/provider.js";
3
3
  import { codexProvider } from "./codex/provider.js";
4
+ import { registerToolBridge } from "../tool-bridge/index.js";
5
+ import { PROVIDER_NAMES } from "./names.js";
4
6
  export const providers = {
5
7
  openai: openaiProvider,
6
8
  claude: claudeProvider,
7
9
  codex: codexProvider,
8
10
  };
11
+ export function createAutoProvider(configs) {
12
+ return {
13
+ name: "Auto",
14
+ routes: Object.values(providers).flatMap((p) => p.routes),
15
+ register(app, baseCtx) {
16
+ // One shared manager + MCP route set so we don't hit
17
+ // Fastify's duplicate-route error across scoped plugins
18
+ const sharedManager = registerToolBridge(app, baseCtx.logger);
19
+ for (const name of PROVIDER_NAMES) {
20
+ const provider = providers[name];
21
+ const ctx = {
22
+ ...baseCtx,
23
+ config: configs[name],
24
+ toolBridgeManager: sharedManager,
25
+ };
26
+ app.register((scoped, _opts, done) => {
27
+ provider.register(scoped, ctx);
28
+ done();
29
+ });
30
+ }
31
+ },
32
+ };
33
+ }
9
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,aAAa;CACc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,OAAwC;IAExC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,QAAQ,CAAC,GAAG,EAAE,OAAO;YACnB,qDAAqD;YACrD,wDAAwD;YACxD,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAE9D,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,GAAe;oBACtB,GAAG,OAAO;oBACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;oBACrB,iBAAiB,EAAE,aAAa;iBACjC,CAAC;gBACF,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACnC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC/B,IAAI,EAAE,CAAC;gBACT,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const PROVIDER_NAMES: readonly ["openai", "claude", "codex"];
2
+ export type ProxyName = (typeof PROVIDER_NAMES)[number];
3
+ export type ProxyMode = ProxyName | "auto";
4
+ export declare const UA_PREFIXES: Record<ProxyName, string>;
@@ -0,0 +1,7 @@
1
+ export const PROVIDER_NAMES = ["openai", "claude", "codex"];
2
+ export const UA_PREFIXES = {
3
+ openai: "Xcode/",
4
+ claude: "claude-cli/",
5
+ codex: "Xcode/",
6
+ };
7
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/providers/names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAKrE,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,QAAQ;CAChB,CAAC"}
@@ -1,23 +1,14 @@
1
1
  import { createModelsHandler, createCompletionsHandler } from "copilot-sdk-proxy";
2
- import { ConversationManager } from "../../conversation-manager.js";
2
+ import { resolveToolBridgeManager } from "../../tool-bridge/index.js";
3
3
  import { filterExcludedFiles } from "../shared/prompt-utils.js";
4
+ import { addUserAgentGuard } from "../shared/user-agent-guard.js";
5
+ import { UA_PREFIXES } from "../names.js";
4
6
  export const openaiProvider = {
5
7
  name: "OpenAI",
6
8
  routes: ["GET /v1/models", "POST /v1/chat/completions"],
7
9
  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);
10
+ addUserAgentGuard(app, UA_PREFIXES.openai, ctx.logger);
11
+ const manager = resolveToolBridgeManager(app, ctx.toolBridgeManager, ctx.logger);
21
12
  app.get("/v1/models", createModelsHandler(ctx));
22
13
  app.post("/v1/chat/completions", createCompletionsHandler(ctx, manager, {
23
14
  transformPrompt: (prompt) => filterExcludedFiles(prompt, ctx.config.excludedFilePatterns),
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,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,EAAE;YACtE,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC;SAC1F,CAAC,CAAC,CAAC;IACN,CAAC;CACiB,CAAC"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;IAEvD,QAAQ,CAAC,GAAG,EAAE,GAAG;QACf,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE;YACtE,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC;SAC1F,CAAC,CAAC,CAAC;IACN,CAAC;CACiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { FastifyReply } from "fastify";
2
+ import type { Logger } from "copilot-sdk-proxy";
3
+ import type { Conversation } from "../../conversation-manager.js";
4
+ interface ContinuationCallbacks {
5
+ startStream: () => void;
6
+ resolveResults: () => void;
7
+ countMessages: () => number;
8
+ }
9
+ export declare function handleContinuation(existingConv: Conversation, reply: FastifyReply, logger: Logger, callbacks: ContinuationCallbacks): Promise<boolean>;
10
+ export {};