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,120 +0,0 @@
1
- import { ChatCompletionRequestSchema, extractContentText } from "../schemas/openai.js";
2
- import { formatPrompt } from "../utils/prompt.js";
3
- import { createSessionConfig } from "./session-config.js";
4
- import { handleStreaming } from "./completions/streaming.js";
5
- import { sendOpenAIError as sendError } from "./errors.js";
6
- export function createCompletionsHandler({ service, logger, config }, manager) {
7
- return async function handleCompletions(request, reply) {
8
- const parseResult = ChatCompletionRequestSchema.safeParse(request.body);
9
- if (!parseResult.success) {
10
- const firstIssue = parseResult.error.issues[0];
11
- sendError(reply, 400, "invalid_request_error", firstIssue?.message ?? "Invalid request body");
12
- return;
13
- }
14
- const req = parseResult.data;
15
- const messages = req.messages;
16
- const { conversation, isReuse } = manager.findForNewRequest();
17
- const state = conversation.state;
18
- state.markSessionActive();
19
- logger.info(isReuse
20
- ? `Reusing primary conversation ${conversation.id}`
21
- : `New conversation ${conversation.id}`);
22
- const systemParts = [];
23
- for (const msg of messages) {
24
- if (msg.role === "system" || msg.role === "developer") {
25
- try {
26
- systemParts.push(extractContentText(msg.content));
27
- }
28
- catch (err) {
29
- sendError(reply, 400, "invalid_request_error", err instanceof Error ? err.message : String(err));
30
- if (isReuse) {
31
- state.markSessionInactive();
32
- }
33
- else {
34
- manager.remove(conversation.id);
35
- }
36
- return;
37
- }
38
- }
39
- }
40
- let prompt;
41
- try {
42
- prompt = formatPrompt(messages.slice(conversation.sentMessageCount), config.excludedFilePatterns);
43
- }
44
- catch (err) {
45
- sendError(reply, 400, "invalid_request_error", err instanceof Error ? err.message : String(err));
46
- if (isReuse) {
47
- state.markSessionInactive();
48
- }
49
- else {
50
- manager.remove(conversation.id);
51
- }
52
- return;
53
- }
54
- if (!isReuse) {
55
- const systemMessage = systemParts.length > 0 ? systemParts.join("\n\n") : undefined;
56
- let supportsReasoningEffort = false;
57
- if (config.reasoningEffort) {
58
- try {
59
- const models = await service.listModels();
60
- const modelInfo = models.find((m) => m.id === req.model);
61
- supportsReasoningEffort =
62
- modelInfo?.capabilities.supports.reasoningEffort ?? false;
63
- if (!supportsReasoningEffort) {
64
- logger.debug(`Model "${req.model}" does not support reasoning effort, ignoring config`);
65
- }
66
- }
67
- catch (err) {
68
- logger.warn("Failed to check model capabilities:", err);
69
- }
70
- }
71
- // No resolveModel() needed here because Xcode picks from the
72
- // /v1/models response which already has Copilot's exact IDs
73
- const sessionConfig = createSessionConfig({
74
- model: req.model,
75
- systemMessage,
76
- logger,
77
- config,
78
- supportsReasoningEffort,
79
- cwd: service.cwd,
80
- });
81
- try {
82
- conversation.session = await service.createSession(sessionConfig);
83
- }
84
- catch (err) {
85
- logger.error("Creating session failed:", err);
86
- sendError(reply, 500, "api_error", "Failed to create session");
87
- manager.remove(conversation.id);
88
- return;
89
- }
90
- }
91
- if (!conversation.session) {
92
- logger.error("Primary conversation has no session, clearing");
93
- manager.clearPrimary();
94
- sendError(reply, 500, "api_error", "Session lost, please retry");
95
- return;
96
- }
97
- try {
98
- logger.info("Streaming response");
99
- const healthy = await handleStreaming(reply, conversation.session, prompt, req.model, logger);
100
- state.markSessionInactive();
101
- if (healthy) {
102
- conversation.sentMessageCount = req.messages.length;
103
- }
104
- else if (conversation.isPrimary) {
105
- manager.clearPrimary();
106
- }
107
- }
108
- catch (err) {
109
- logger.error("Request failed:", err);
110
- state.markSessionInactive();
111
- if (conversation.isPrimary) {
112
- manager.clearPrimary();
113
- }
114
- if (!reply.sent) {
115
- sendError(reply, 500, "api_error", err instanceof Error ? err.message : "Internal error");
116
- }
117
- }
118
- };
119
- }
120
- //# sourceMappingURL=completions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/handlers/completions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,wBAAwB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAc,EAAE,OAA4B;IAC5G,OAAO,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,KAAmB;QAEnB,MAAM,WAAW,GAAG,2BAA2B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/C,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,UAAU,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;QACjC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,MAAM,CAAC,IAAI,CACT,OAAO;YACL,CAAC,CAAC,gCAAgC,YAAY,CAAC,EAAE,EAAE;YACnD,CAAC,CAAC,oBAAoB,YAAY,CAAC,EAAE,EAAE,CAC1C,CAAC;QAEF,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtD,IAAI,CAAC;oBACH,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBACjG,IAAI,OAAO,EAAE,CAAC;wBACZ,KAAK,CAAC,mBAAmB,EAAE,CAAC;oBAC9B,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBAClC,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACjG,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,aAAa,GACjB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEhE,IAAI,uBAAuB,GAAG,KAAK,CAAC;YACpC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;oBACzD,uBAAuB;wBACrB,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,eAAe,IAAI,KAAK,CAAC;oBAC5D,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBAC7B,MAAM,CAAC,KAAK,CACV,UAAU,GAAG,CAAC,KAAK,sDAAsD,CAC1E,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,6DAA6D;YAC7D,4DAA4D;YAC5D,MAAM,aAAa,GAAG,mBAAmB,CAAC;gBACxC,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,aAAa;gBACb,MAAM;gBACN,MAAM;gBACN,uBAAuB;gBACvB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;gBAC9C,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,0BAA0B,CAAC,CAAC;gBAC/D,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9D,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,4BAA4B,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC9F,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtD,CAAC;iBAAM,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACrC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC5B,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { FastifyReply } from "fastify";
2
- type ErrorType = "invalid_request_error" | "api_error";
3
- export declare function sendOpenAIError(reply: FastifyReply, status: number, type: ErrorType, message: string): void;
4
- export declare function sendAnthropicError(reply: FastifyReply, status: number, type: ErrorType, message: string): void;
5
- export {};
@@ -1,10 +0,0 @@
1
- export function sendOpenAIError(reply, status, type, message) {
2
- reply.status(status).send({ error: { message, type } });
3
- }
4
- export function sendAnthropicError(reply, status, type, message) {
5
- reply.status(status).send({
6
- type: "error",
7
- error: { type, message },
8
- });
9
- }
10
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/handlers/errors.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,eAAe,CAC7B,KAAmB,EACnB,MAAc,EACd,IAAe,EACf,OAAe;IAEf,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAmB,EACnB,MAAc,EACd,IAAe,EACf,OAAe;IAEf,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACzB,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { FastifyRequest, FastifyReply } from "fastify";
2
- import type { AppContext } from "../../context.js";
3
- export declare function createCountTokensHandler({ logger }: AppContext): (request: FastifyRequest, reply: FastifyReply) => void;
@@ -1,72 +0,0 @@
1
- import { estimateTokenCount } from "tokenx";
2
- import { AnthropicMessagesRequestSchema, } from "../../schemas/anthropic.js";
3
- import { sendAnthropicError } from "../errors.js";
4
- // The token estimator needs a single string, so we pull all text out of
5
- // the structured request.
6
- function extractAllText(req) {
7
- const parts = [];
8
- if (req.system != null) {
9
- if (typeof req.system === "string") {
10
- parts.push(req.system);
11
- }
12
- else {
13
- for (const block of req.system) {
14
- parts.push(block.text);
15
- }
16
- }
17
- }
18
- for (const msg of req.messages) {
19
- if (typeof msg.content === "string") {
20
- parts.push(msg.content);
21
- }
22
- else {
23
- for (const block of msg.content) {
24
- switch (block.type) {
25
- case "text":
26
- parts.push(block.text);
27
- break;
28
- case "tool_use":
29
- parts.push(block.name);
30
- parts.push(JSON.stringify(block.input));
31
- break;
32
- case "tool_result":
33
- if (typeof block.content === "string") {
34
- parts.push(block.content);
35
- }
36
- else if (Array.isArray(block.content)) {
37
- for (const tb of block.content) {
38
- parts.push(tb.text);
39
- }
40
- }
41
- break;
42
- default:
43
- throw block;
44
- }
45
- }
46
- }
47
- }
48
- if (req.tools) {
49
- for (const tool of req.tools) {
50
- parts.push(tool.name);
51
- if (tool.description)
52
- parts.push(tool.description);
53
- parts.push(JSON.stringify(tool.input_schema));
54
- }
55
- }
56
- return parts.join(" ");
57
- }
58
- export function createCountTokensHandler({ logger }) {
59
- return function handleCountTokens(request, reply) {
60
- const parseResult = AnthropicMessagesRequestSchema.safeParse(request.body);
61
- if (!parseResult.success) {
62
- const firstIssue = parseResult.error.issues[0];
63
- sendAnthropicError(reply, 400, "invalid_request_error", firstIssue?.message ?? "Invalid request body");
64
- return;
65
- }
66
- const allText = extractAllText(parseResult.data);
67
- const inputTokens = estimateTokenCount(allText);
68
- logger.debug(`Token count estimate: ${String(inputTokens)}`);
69
- void reply.send({ input_tokens: inputTokens });
70
- };
71
- }
72
- //# sourceMappingURL=count-tokens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../../src/handlers/messages/count-tokens.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EACL,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,wEAAwE;AACxE,0BAA0B;AAC1B,SAAS,cAAc,CAAC,GAA6B;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,MAAM;wBACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACvB,MAAM;oBACR,KAAK,UAAU;wBACb,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;wBACxC,MAAM;oBACR,KAAK,aAAa;wBAChB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;4BACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC5B,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;4BACxC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gCAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;4BACtB,CAAC;wBACH,CAAC;wBACD,MAAM;oBACR;wBACE,MAAM,KAAqB,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EAAE,MAAM,EAAc;IAC7D,OAAO,SAAS,iBAAiB,CAC/B,OAAuB,EACvB,KAAmB;QAEnB,MAAM,WAAW,GAAG,8BAA8B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/C,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,UAAU,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7D,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { FastifyReply } from "fastify";
2
- import type { CopilotSession } from "@github/copilot-sdk";
3
- import type { Logger } from "../../logger.js";
4
- import type { ToolBridgeState } from "../../tool-bridge/state.js";
5
- export declare function startReply(reply: FastifyReply, model: string): void;
6
- export declare function handleAnthropicStreaming(state: ToolBridgeState, session: CopilotSession, prompt: string, model: string, logger: Logger, hasBridge?: boolean): Promise<void>;
@@ -1,274 +0,0 @@
1
- import { formatCompaction, SSE_HEADERS, sendSSEEvent as sendEvent } from "../streaming-utils.js";
2
- const MCP_PREFIX = "xcode-bridge-";
3
- // Xcode doesn't know about the "xcode-bridge-" prefix the CLI adds
4
- function stripMCPPrefix(name) {
5
- return name.startsWith(MCP_PREFIX) ? name.slice(MCP_PREFIX.length) : name;
6
- }
7
- export function startReply(reply, model) {
8
- reply.raw.writeHead(200, SSE_HEADERS);
9
- const messageStart = {
10
- type: "message_start",
11
- message: {
12
- id: `msg_${String(Date.now())}`,
13
- type: "message",
14
- role: "assistant",
15
- content: [],
16
- model,
17
- stop_reason: null,
18
- usage: { input_tokens: 0, output_tokens: 0 },
19
- },
20
- };
21
- sendEvent(reply, "message_start", messageStart);
22
- }
23
- export async function handleAnthropicStreaming(state, session, prompt, model, logger, hasBridge = false) {
24
- const reply = state.currentReply;
25
- if (!reply)
26
- throw new Error("No reply set on bridge state");
27
- startReply(reply, model);
28
- state.markSessionActive();
29
- let pendingDeltas = [];
30
- let sessionDone = false;
31
- let textBlockStarted = false;
32
- const toolNames = new Map();
33
- // This listener outlives the initial HTTP response because during a
34
- // tool_use flow the reply gets ended, then Xcode sends a continuation
35
- // request that sets a new reply on state. So, we read state.currentReply
36
- // each time instead of closing over the original reply variable.
37
- function getReply() {
38
- return state.currentReply;
39
- }
40
- function ensureTextBlock(r) {
41
- if (!textBlockStarted) {
42
- const blockStart = {
43
- type: "content_block_start",
44
- index: 0,
45
- content_block: { type: "text", text: "" },
46
- };
47
- sendEvent(r, "content_block_start", blockStart);
48
- textBlockStarted = true;
49
- }
50
- }
51
- function flushPending() {
52
- const r = getReply();
53
- if (!r || pendingDeltas.length === 0)
54
- return;
55
- ensureTextBlock(r);
56
- for (const text of pendingDeltas) {
57
- const delta = {
58
- type: "content_block_delta",
59
- index: 0,
60
- delta: { type: "text_delta", text },
61
- };
62
- sendEvent(r, "content_block_delta", delta);
63
- }
64
- pendingDeltas = [];
65
- }
66
- function sendEpilogue(r, stopReason) {
67
- const messageDelta = {
68
- type: "message_delta",
69
- delta: { stop_reason: stopReason, stop_sequence: null },
70
- usage: { output_tokens: 0 },
71
- };
72
- sendEvent(r, "message_delta", messageDelta);
73
- sendEvent(r, "message_stop", { type: "message_stop" });
74
- }
75
- function emitToolUseBlocks(r, toolRequests) {
76
- let startIndex;
77
- if (textBlockStarted) {
78
- sendEvent(r, "content_block_stop", {
79
- type: "content_block_stop",
80
- index: 0,
81
- });
82
- startIndex = 1;
83
- }
84
- else {
85
- startIndex = 0;
86
- }
87
- let index = startIndex;
88
- for (const tr of toolRequests) {
89
- sendEvent(r, "content_block_start", {
90
- type: "content_block_start",
91
- index,
92
- content_block: { type: "tool_use", id: tr.toolCallId, name: tr.name, input: {} },
93
- });
94
- const argsJson = tr.arguments != null ? JSON.stringify(tr.arguments) : "{}";
95
- sendEvent(r, "content_block_delta", {
96
- type: "content_block_delta",
97
- index,
98
- delta: { type: "input_json_delta", partial_json: argsJson },
99
- });
100
- sendEvent(r, "content_block_stop", {
101
- type: "content_block_stop",
102
- index,
103
- });
104
- index++;
105
- }
106
- }
107
- function finishReply(r, stopReason) {
108
- if (stopReason === "end_turn" && textBlockStarted) {
109
- sendEvent(r, "content_block_stop", {
110
- type: "content_block_stop",
111
- index: 0,
112
- });
113
- }
114
- sendEpilogue(r, stopReason);
115
- r.raw.end();
116
- state.clearReply();
117
- state.notifyStreamingDone();
118
- textBlockStarted = false;
119
- }
120
- const unsubscribe = session.on((event) => {
121
- logger.debug(`Session event: ${event.type}`);
122
- if (event.type === "tool.execution_start") {
123
- const d = event.data;
124
- toolNames.set(d.toolCallId, d.toolName);
125
- logger.debug(`Running ${d.toolName} (id=${d.toolCallId}, args=${JSON.stringify(d.arguments)})`);
126
- return;
127
- }
128
- if (event.type === "tool.execution_complete") {
129
- const d = event.data;
130
- const name = toolNames.get(d.toolCallId) ?? d.toolCallId;
131
- toolNames.delete(d.toolCallId);
132
- const detail = d.success
133
- ? JSON.stringify(d.result?.content)
134
- : d.error?.message ?? "failed";
135
- logger.debug(`${name} done (success=${String(d.success)}, ${detail})`);
136
- return;
137
- }
138
- switch (event.type) {
139
- case "assistant.message_delta":
140
- if (event.data.deltaContent) {
141
- logger.debug(`Delta: ${event.data.deltaContent}`);
142
- pendingDeltas.push(event.data.deltaContent);
143
- }
144
- break;
145
- case "assistant.message": {
146
- logger.debug(`assistant.message: toolRequests=${String(event.data.toolRequests?.length ?? 0)}, content=${JSON.stringify(event.data)}`);
147
- if (event.data.toolRequests && event.data.toolRequests.length > 0) {
148
- // non-bridge tools (e.g. report_intent) are handled internally by the CLI
149
- const bridgeRequests = hasBridge
150
- ? event.data.toolRequests.filter((tr) => tr.name.startsWith(MCP_PREFIX))
151
- : event.data.toolRequests;
152
- if (hasBridge && bridgeRequests.length < event.data.toolRequests.length) {
153
- const skipped = event.data.toolRequests.length - bridgeRequests.length;
154
- logger.debug(`Skipped ${String(skipped)} non-bridge tool request(s) (handled internally by CLI)`);
155
- }
156
- // Xcode needs to see the names it originally sent, and the args
157
- // need to match the schema because the Copilot model sometimes
158
- // uses different naming conventions (e.g. "ignoreCase" vs "-i")
159
- const stripped = bridgeRequests.map((tr) => {
160
- const resolved = state.resolveToolName(stripMCPPrefix(tr.name));
161
- return {
162
- ...tr,
163
- name: resolved,
164
- arguments: state.normalizeArgs(resolved, (tr.arguments ?? {})),
165
- };
166
- });
167
- if (stripped.length > 0) {
168
- // register even without a reply because the model might have retried
169
- // a tool after an internal failure
170
- for (const tr of stripped) {
171
- logger.info(`Tool request: name="${tr.name}", id="${tr.toolCallId}", args=${JSON.stringify(tr.arguments)}`);
172
- state.registerExpected(tr.toolCallId, tr.name);
173
- }
174
- const r = getReply();
175
- if (r) {
176
- flushPending();
177
- emitToolUseBlocks(r, stripped);
178
- finishReply(r, "tool_use");
179
- }
180
- else {
181
- logger.debug("assistant.message with tool requests but no reply (internal retry), registered expected tools");
182
- }
183
- }
184
- else {
185
- logger.debug("All tool requests were non-bridge, no tool_use blocks emitted");
186
- }
187
- }
188
- else {
189
- const r = getReply();
190
- if (r) {
191
- logger.debug(`assistant.message with no tool requests, flushing ${String(pendingDeltas.length)} pending deltas`);
192
- flushPending();
193
- }
194
- }
195
- break;
196
- }
197
- case "session.idle": {
198
- logger.info(`Done, wrapping up stream (pendingDeltas=${String(pendingDeltas.length)})`);
199
- sessionDone = true;
200
- state.markSessionInactive();
201
- flushPending();
202
- const r = getReply();
203
- if (r) {
204
- // spec requires at least one content block
205
- if (!textBlockStarted) {
206
- ensureTextBlock(r);
207
- }
208
- finishReply(r, "end_turn");
209
- }
210
- unsubscribe();
211
- break;
212
- }
213
- case "session.compaction_start":
214
- logger.info("Compacting context...");
215
- break;
216
- case "session.compaction_complete":
217
- logger.info(`Context compacted: ${formatCompaction(event.data)}`);
218
- break;
219
- case "session.error": {
220
- logger.error(`Session error: ${event.data.message}`);
221
- sessionDone = true;
222
- state.markSessionErrored();
223
- state.markSessionInactive();
224
- const r = getReply();
225
- if (r) {
226
- if (textBlockStarted) {
227
- sendEvent(r, "content_block_stop", {
228
- type: "content_block_stop",
229
- index: 0,
230
- });
231
- }
232
- sendEpilogue(r, "end_turn");
233
- r.raw.end();
234
- state.clearReply();
235
- }
236
- textBlockStarted = false;
237
- unsubscribe();
238
- state.notifyStreamingDone();
239
- break;
240
- }
241
- default:
242
- logger.debug(`Unhandled event: ${event.type}, data=${JSON.stringify(event.data)}`);
243
- break;
244
- }
245
- });
246
- reply.raw.on("close", () => {
247
- if (!sessionDone && state.currentReply === reply) {
248
- logger.info("Client disconnected, aborting session");
249
- textBlockStarted = false;
250
- state.markSessionErrored();
251
- state.cleanup();
252
- unsubscribe();
253
- session.abort().catch((err) => {
254
- logger.error("Failed to abort session:", err);
255
- });
256
- state.notifyStreamingDone();
257
- }
258
- });
259
- const done = state.waitForStreamingDone();
260
- session.send({ prompt }).catch((err) => {
261
- logger.error("Failed to send prompt:", err);
262
- sessionDone = true;
263
- textBlockStarted = false;
264
- const r = getReply();
265
- if (r) {
266
- r.raw.end();
267
- state.clearReply();
268
- }
269
- unsubscribe();
270
- state.notifyStreamingDone();
271
- });
272
- return done;
273
- }
274
- //# sourceMappingURL=streaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/handlers/messages/streaming.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { AnthropicMessage } from "../../schemas/anthropic.js";
2
- import type { ToolBridgeState } from "../../tool-bridge/state.js";
3
- import type { Logger } from "../../logger.js";
4
- export declare function resolveToolResults(messages: AnthropicMessage[], state: ToolBridgeState, logger: Logger): void;
@@ -1,19 +0,0 @@
1
- export function resolveToolResults(messages, state, logger) {
2
- const lastMsg = messages[messages.length - 1];
3
- if (!lastMsg || lastMsg.role !== "user" || typeof lastMsg.content === "string")
4
- return;
5
- for (const block of lastMsg.content) {
6
- if (block.type === "tool_result") {
7
- const resultText = typeof block.content === "string"
8
- ? block.content
9
- : Array.isArray(block.content)
10
- ? block.content.map((b) => b.text).join("\n")
11
- : "";
12
- logger.debug(`Resolving tool result for ${block.tool_use_id}`);
13
- if (!state.resolveToolCall(block.tool_use_id, resultText)) {
14
- logger.warn(`No pending MCP request for tool_use_id ${block.tool_use_id}`);
15
- }
16
- }
17
- }
18
- }
19
- //# sourceMappingURL=tool-result-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-result-handler.js","sourceRoot":"","sources":["../../../src/handlers/messages/tool-result-handler.ts"],"names":[],"mappings":"AAIA,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,4 +0,0 @@
1
- import type { FastifyRequest, FastifyReply } from "fastify";
2
- import type { AppContext } from "../context.js";
3
- import type { ConversationManager } from "../conversation-manager.js";
4
- export declare function createMessagesHandler({ service, logger, config, port }: AppContext, manager: ConversationManager): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;