xibecode 1.3.11 → 1.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/acp-server.d.ts +20 -0
- package/dist/acp/acp-server.d.ts.map +1 -0
- package/dist/acp/acp-server.js +545 -0
- package/dist/acp/acp-server.js.map +1 -0
- package/dist/acp/acp-types.d.ts +137 -0
- package/dist/acp/acp-types.d.ts.map +1 -0
- package/dist/acp/acp-types.js +32 -0
- package/dist/acp/acp-types.js.map +1 -0
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/ui/claude-style-chat.d.ts.map +1 -1
- package/dist/ui/claude-style-chat.js +68 -13
- package/dist/ui/claude-style-chat.js.map +1 -1
- package/dist/utils/tui-theme.d.ts +2 -0
- package/dist/utils/tui-theme.d.ts.map +1 -1
- package/dist/utils/tui-theme.js +2 -0
- package/dist/utils/tui-theme.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP (Agent Client Protocol) Server.
|
|
3
|
+
*
|
|
4
|
+
* When launched with `--acp`, xibecode runs as a headless JSON-RPC 2.0 server
|
|
5
|
+
* over stdio, ready for direct integration with the Zed editor.
|
|
6
|
+
*
|
|
7
|
+
* All protocol logging goes to stderr so stdout stays clean for JSON messages.
|
|
8
|
+
*
|
|
9
|
+
* @module acp-server
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Start the ACP server.
|
|
13
|
+
*
|
|
14
|
+
* Redirects all diagnostic output to stderr and listens for
|
|
15
|
+
* JSON-RPC 2.0 messages on stdin. Each line is a complete message.
|
|
16
|
+
*
|
|
17
|
+
* Call this when `--acp` is passed on the command line.
|
|
18
|
+
*/
|
|
19
|
+
export declare function startACPServer(profile?: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=acp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-server.d.ts","sourceRoot":"","sources":["../../src/acp/acp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6lBH;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,iBAwGpD"}
|
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP (Agent Client Protocol) Server.
|
|
3
|
+
*
|
|
4
|
+
* When launched with `--acp`, xibecode runs as a headless JSON-RPC 2.0 server
|
|
5
|
+
* over stdio, ready for direct integration with the Zed editor.
|
|
6
|
+
*
|
|
7
|
+
* All protocol logging goes to stderr so stdout stays clean for JSON messages.
|
|
8
|
+
*
|
|
9
|
+
* @module acp-server
|
|
10
|
+
*/
|
|
11
|
+
import * as readline from "node:readline";
|
|
12
|
+
import { createRequire } from "module";
|
|
13
|
+
import { EnhancedAgent, AgentStream, CodingToolExecutor, MCPClientManager, NeuralMemory, SkillManager, SessionMemory, } from "xibecode-core";
|
|
14
|
+
import { ConfigManager } from "../utils/config.js";
|
|
15
|
+
import { builtInSkillsDir } from "../utils/built-in-skills-dir.js";
|
|
16
|
+
import { ACP_ERROR_CODES, ACP_METHODS, } from "./acp-types.js";
|
|
17
|
+
const require = createRequire(import.meta.url);
|
|
18
|
+
const pkg = require("../../package.json");
|
|
19
|
+
const VERSION = pkg.version ?? "0.0.0";
|
|
20
|
+
const NAME = "xibecode";
|
|
21
|
+
// ─── Helpers ───────────────────────────────────────────────
|
|
22
|
+
function sendResponse(id, result, error) {
|
|
23
|
+
const msg = { jsonrpc: "2.0", id };
|
|
24
|
+
if (error) {
|
|
25
|
+
msg.error = error;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
msg.result = result;
|
|
29
|
+
}
|
|
30
|
+
writeJson(msg);
|
|
31
|
+
}
|
|
32
|
+
function sendNotification(method, params) {
|
|
33
|
+
const msg = { jsonrpc: "2.0", method, params };
|
|
34
|
+
writeJson(msg);
|
|
35
|
+
}
|
|
36
|
+
function writeJson(obj) {
|
|
37
|
+
process.stdout.write(JSON.stringify(obj) + "\n");
|
|
38
|
+
}
|
|
39
|
+
let initialized = false;
|
|
40
|
+
let activeChat = null;
|
|
41
|
+
let conversationCounter = 0;
|
|
42
|
+
const sessions = new Map();
|
|
43
|
+
// ─── Request Handler ───────────────────────────────────────
|
|
44
|
+
async function handleRequest(req, config) {
|
|
45
|
+
const { id, method, params } = req;
|
|
46
|
+
try {
|
|
47
|
+
switch (method) {
|
|
48
|
+
case ACP_METHODS.INITIALIZE:
|
|
49
|
+
return handleInitialize(id, params);
|
|
50
|
+
case ACP_METHODS.SESSION_NEW:
|
|
51
|
+
return handleSessionNew(id, params);
|
|
52
|
+
case ACP_METHODS.SESSION_PROMPT:
|
|
53
|
+
return handleSessionPrompt(id, params, config);
|
|
54
|
+
case ACP_METHODS.SESSION_CLOSE:
|
|
55
|
+
return handleSessionClose(id, params);
|
|
56
|
+
case ACP_METHODS.CHAT:
|
|
57
|
+
return handleChat(id, params, config);
|
|
58
|
+
case ACP_METHODS.CANCEL:
|
|
59
|
+
return handleCancel(id);
|
|
60
|
+
case ACP_METHODS.SHUTDOWN:
|
|
61
|
+
return handleShutdown(id);
|
|
62
|
+
default:
|
|
63
|
+
sendResponse(id, undefined, {
|
|
64
|
+
code: ACP_ERROR_CODES.METHOD_NOT_FOUND,
|
|
65
|
+
message: `Unknown method: ${method}`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
console.error("[acp] Error handling request:", method, message);
|
|
72
|
+
sendResponse(id, undefined, {
|
|
73
|
+
code: ACP_ERROR_CODES.INTERNAL_ERROR,
|
|
74
|
+
message,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ─── Initialize ────────────────────────────────────────────
|
|
79
|
+
function handleInitialize(id, params) {
|
|
80
|
+
initialized = true;
|
|
81
|
+
const requestedVersion = typeof params?.protocolVersion === "number" ? params.protocolVersion : 1;
|
|
82
|
+
const result = {
|
|
83
|
+
protocolVersion: requestedVersion === 1 ? 1 : 1,
|
|
84
|
+
agentCapabilities: {
|
|
85
|
+
loadSession: false,
|
|
86
|
+
promptCapabilities: {
|
|
87
|
+
embeddedContext: true,
|
|
88
|
+
},
|
|
89
|
+
mcpCapabilities: {},
|
|
90
|
+
sessionCapabilities: {
|
|
91
|
+
close: {},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
agentInfo: { name: NAME, title: "XibeCode", version: VERSION },
|
|
95
|
+
authMethods: [],
|
|
96
|
+
};
|
|
97
|
+
sendResponse(id, result);
|
|
98
|
+
console.error("[acp] Initialized — ready for requests");
|
|
99
|
+
}
|
|
100
|
+
// ─── Session Handlers ──────────────────────────────────────
|
|
101
|
+
function handleSessionNew(id, params) {
|
|
102
|
+
if (!initialized) {
|
|
103
|
+
sendResponse(id, undefined, {
|
|
104
|
+
code: ACP_ERROR_CODES.AGENT_NOT_READY,
|
|
105
|
+
message: "Server not initialized. Send initialize first.",
|
|
106
|
+
});
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const cwd = params?.cwd;
|
|
110
|
+
if (!cwd || typeof cwd !== "string" || !cwd.startsWith("/")) {
|
|
111
|
+
sendResponse(id, undefined, {
|
|
112
|
+
code: ACP_ERROR_CODES.INVALID_PARAMS,
|
|
113
|
+
message: "session/new requires an absolute cwd.",
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const sessionId = `sess_${Date.now()}_${++conversationCounter}`;
|
|
118
|
+
sessions.set(sessionId, { cwd });
|
|
119
|
+
sendResponse(id, { sessionId });
|
|
120
|
+
}
|
|
121
|
+
async function handleSessionPrompt(id, params, config) {
|
|
122
|
+
if (!initialized) {
|
|
123
|
+
sendResponse(id, undefined, {
|
|
124
|
+
code: ACP_ERROR_CODES.AGENT_NOT_READY,
|
|
125
|
+
message: "Server not initialized. Send initialize first.",
|
|
126
|
+
});
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const sessionId = params?.sessionId;
|
|
130
|
+
const session = sessionId ? sessions.get(sessionId) : undefined;
|
|
131
|
+
if (!sessionId || !session) {
|
|
132
|
+
sendResponse(id, undefined, {
|
|
133
|
+
code: ACP_ERROR_CODES.INVALID_PARAMS,
|
|
134
|
+
message: "Unknown or missing sessionId.",
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const prompt = extractPromptText(params.prompt);
|
|
139
|
+
if (!prompt.trim()) {
|
|
140
|
+
sendResponse(id, undefined, {
|
|
141
|
+
code: ACP_ERROR_CODES.INVALID_PARAMS,
|
|
142
|
+
message: "session/prompt requires at least one text prompt block.",
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
await runAgentTurn({
|
|
148
|
+
prompt,
|
|
149
|
+
workspaceRoot: session.cwd,
|
|
150
|
+
conversationId: sessionId,
|
|
151
|
+
config,
|
|
152
|
+
onText: (text) => sendNotification(ACP_METHODS.SESSION_UPDATE, {
|
|
153
|
+
sessionId,
|
|
154
|
+
update: {
|
|
155
|
+
sessionUpdate: "agent_message_chunk",
|
|
156
|
+
content: { type: "text", text },
|
|
157
|
+
},
|
|
158
|
+
}),
|
|
159
|
+
onThinking: (message) => sendNotification(ACP_METHODS.SESSION_UPDATE, {
|
|
160
|
+
sessionId,
|
|
161
|
+
update: {
|
|
162
|
+
sessionUpdate: "agent_message_chunk",
|
|
163
|
+
content: { type: "text", text: `*${message}*\n` },
|
|
164
|
+
},
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
167
|
+
const result = { stopReason: "end_turn" };
|
|
168
|
+
sendResponse(id, result);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
172
|
+
if (message.toLowerCase().includes("abort")) {
|
|
173
|
+
const result = { stopReason: "cancelled" };
|
|
174
|
+
sendResponse(id, result);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
sendResponse(id, undefined, {
|
|
178
|
+
code: ACP_ERROR_CODES.AGENT_ERROR,
|
|
179
|
+
message,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function handleSessionClose(id, params) {
|
|
184
|
+
if (params?.sessionId) {
|
|
185
|
+
sessions.delete(params.sessionId);
|
|
186
|
+
if (activeChat?.conversationId === params.sessionId) {
|
|
187
|
+
activeChat.abortController.abort();
|
|
188
|
+
activeChat = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
sendResponse(id, {});
|
|
192
|
+
}
|
|
193
|
+
function extractPromptText(prompt) {
|
|
194
|
+
if (!Array.isArray(prompt))
|
|
195
|
+
return "";
|
|
196
|
+
return prompt
|
|
197
|
+
.map((block) => {
|
|
198
|
+
if (block && block.type === "text" && typeof block.text === "string")
|
|
199
|
+
return block.text;
|
|
200
|
+
if (block && block.type === "resource") {
|
|
201
|
+
const resource = block.resource;
|
|
202
|
+
if (typeof resource?.text === "string")
|
|
203
|
+
return `\n\n${resource.text}`;
|
|
204
|
+
}
|
|
205
|
+
return "";
|
|
206
|
+
})
|
|
207
|
+
.filter(Boolean)
|
|
208
|
+
.join("\n");
|
|
209
|
+
}
|
|
210
|
+
async function runAgentTurn(args) {
|
|
211
|
+
if (activeChat) {
|
|
212
|
+
activeChat.abortController.abort();
|
|
213
|
+
activeChat = null;
|
|
214
|
+
}
|
|
215
|
+
const abortController = new AbortController();
|
|
216
|
+
activeChat = { abortController, conversationId: args.conversationId };
|
|
217
|
+
try {
|
|
218
|
+
const apiKey = args.config.getApiKey();
|
|
219
|
+
if (!apiKey) {
|
|
220
|
+
throw new Error("No API key configured. Run xibecode config --set-key YOUR_KEY.");
|
|
221
|
+
}
|
|
222
|
+
const model = args.config.getModel(false);
|
|
223
|
+
const baseUrl = args.config.getBaseUrl();
|
|
224
|
+
const provider = args.config.get("provider");
|
|
225
|
+
const skillManager = new SkillManager(args.workspaceRoot, apiKey, baseUrl, model, provider, builtInSkillsDir);
|
|
226
|
+
await skillManager.loadSkills().catch(() => { });
|
|
227
|
+
const mcpClientManager = new MCPClientManager();
|
|
228
|
+
const memory = new NeuralMemory(args.workspaceRoot);
|
|
229
|
+
await memory.init().catch(() => { });
|
|
230
|
+
const toolExecutor = new CodingToolExecutor(args.workspaceRoot, {
|
|
231
|
+
mcpClientManager,
|
|
232
|
+
skillManager,
|
|
233
|
+
memory,
|
|
234
|
+
});
|
|
235
|
+
const sessionMemory = new SessionMemory(args.workspaceRoot);
|
|
236
|
+
await sessionMemory.loadPreviousLearnings().catch(() => { });
|
|
237
|
+
let defaultSkillsPrompt = "";
|
|
238
|
+
try {
|
|
239
|
+
defaultSkillsPrompt = await skillManager.buildDefaultSkillsPromptForTask(args.prompt, args.workspaceRoot);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// non-critical
|
|
243
|
+
}
|
|
244
|
+
const agent = new EnhancedAgent({
|
|
245
|
+
apiKey,
|
|
246
|
+
baseUrl,
|
|
247
|
+
model,
|
|
248
|
+
maxIterations: 150,
|
|
249
|
+
verbose: false,
|
|
250
|
+
provider,
|
|
251
|
+
requestFormat: "auto",
|
|
252
|
+
defaultSkillsPrompt,
|
|
253
|
+
sessionMemory,
|
|
254
|
+
}, provider);
|
|
255
|
+
const stream = new AgentStream(agent, args.prompt, toolExecutor.getTools(), toolExecutor, {
|
|
256
|
+
signal: abortController.signal,
|
|
257
|
+
});
|
|
258
|
+
let fullContent = "";
|
|
259
|
+
await stream.onEvent((event) => {
|
|
260
|
+
switch (event.type) {
|
|
261
|
+
case "text_delta":
|
|
262
|
+
fullContent += event.text;
|
|
263
|
+
args.onText(event.text);
|
|
264
|
+
break;
|
|
265
|
+
case "thinking":
|
|
266
|
+
args.onThinking?.(event.message);
|
|
267
|
+
break;
|
|
268
|
+
case "error":
|
|
269
|
+
console.error("[acp] Agent error:", event.message);
|
|
270
|
+
break;
|
|
271
|
+
case "warning":
|
|
272
|
+
console.error("[acp] Agent warning:", event.message);
|
|
273
|
+
break;
|
|
274
|
+
default:
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
return undefined;
|
|
278
|
+
});
|
|
279
|
+
await sessionMemory.persist().catch(() => { });
|
|
280
|
+
return fullContent;
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
if (activeChat?.conversationId === args.conversationId) {
|
|
284
|
+
activeChat = null;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ─── Chat Handler ──────────────────────────────────────────
|
|
289
|
+
async function handleChat(id, params, config) {
|
|
290
|
+
if (!initialized) {
|
|
291
|
+
sendResponse(id, undefined, {
|
|
292
|
+
code: ACP_ERROR_CODES.AGENT_NOT_READY,
|
|
293
|
+
message: "Server not initialized. Send initialize first.",
|
|
294
|
+
});
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const workspaceRoot = params.workspaceRoot ?? process.cwd();
|
|
298
|
+
const conversationId = params.conversationId ?? `conv_${Date.now()}_${++conversationCounter}`;
|
|
299
|
+
// Cancel any previous active chat
|
|
300
|
+
if (activeChat) {
|
|
301
|
+
activeChat.abortController.abort();
|
|
302
|
+
activeChat = null;
|
|
303
|
+
}
|
|
304
|
+
const abortController = new AbortController();
|
|
305
|
+
activeChat = { abortController, conversationId };
|
|
306
|
+
// Build the prompt from the user message + optional history
|
|
307
|
+
const userMessage = params.message;
|
|
308
|
+
try {
|
|
309
|
+
const apiKey = config.getApiKey();
|
|
310
|
+
if (!apiKey) {
|
|
311
|
+
sendResponse(id, undefined, {
|
|
312
|
+
code: ACP_ERROR_CODES.AGENT_ERROR,
|
|
313
|
+
message: "No API key configured. Run xibecode config --set-key YOUR_KEY.",
|
|
314
|
+
});
|
|
315
|
+
activeChat = null;
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const model = config.getModel(false);
|
|
319
|
+
const baseUrl = config.getBaseUrl();
|
|
320
|
+
const provider = config.get("provider");
|
|
321
|
+
// Initialize ancillary services
|
|
322
|
+
const skillManager = new SkillManager(workspaceRoot, apiKey, baseUrl, model, provider, builtInSkillsDir);
|
|
323
|
+
await skillManager.loadSkills().catch(() => { });
|
|
324
|
+
const mcpClientManager = new MCPClientManager();
|
|
325
|
+
const memory = new NeuralMemory(workspaceRoot);
|
|
326
|
+
await memory.init().catch(() => { });
|
|
327
|
+
const toolExecutor = new CodingToolExecutor(workspaceRoot, {
|
|
328
|
+
mcpClientManager,
|
|
329
|
+
skillManager,
|
|
330
|
+
memory,
|
|
331
|
+
});
|
|
332
|
+
const sessionMemory = new SessionMemory(workspaceRoot);
|
|
333
|
+
await sessionMemory.loadPreviousLearnings().catch(() => { });
|
|
334
|
+
let defaultSkillsPrompt = "";
|
|
335
|
+
try {
|
|
336
|
+
defaultSkillsPrompt = await skillManager.buildDefaultSkillsPromptForTask(userMessage, workspaceRoot);
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// non-critical
|
|
340
|
+
}
|
|
341
|
+
const agent = new EnhancedAgent({
|
|
342
|
+
apiKey,
|
|
343
|
+
baseUrl,
|
|
344
|
+
model,
|
|
345
|
+
maxIterations: 150,
|
|
346
|
+
verbose: false,
|
|
347
|
+
provider: provider,
|
|
348
|
+
requestFormat: "auto",
|
|
349
|
+
defaultSkillsPrompt,
|
|
350
|
+
sessionMemory,
|
|
351
|
+
}, provider);
|
|
352
|
+
// Build full context from messages history if provided
|
|
353
|
+
let prompt = userMessage;
|
|
354
|
+
if (params.messages && params.messages.length > 0) {
|
|
355
|
+
// Format the conversation history into a single prompt
|
|
356
|
+
const history = params.messages
|
|
357
|
+
.map((m) => {
|
|
358
|
+
const label = m.role === "user"
|
|
359
|
+
? "User"
|
|
360
|
+
: m.role === "assistant"
|
|
361
|
+
? "Assistant"
|
|
362
|
+
: "System";
|
|
363
|
+
return `[${label}]\n${m.content}`;
|
|
364
|
+
})
|
|
365
|
+
.join("\n\n");
|
|
366
|
+
prompt = `${history}\n\n[User]\n${userMessage}`;
|
|
367
|
+
}
|
|
368
|
+
const stream = new AgentStream(agent, prompt, toolExecutor.getTools(), toolExecutor, {
|
|
369
|
+
signal: abortController.signal,
|
|
370
|
+
});
|
|
371
|
+
let fullContent = "";
|
|
372
|
+
await stream.onEvent((event) => {
|
|
373
|
+
switch (event.type) {
|
|
374
|
+
case "text_delta":
|
|
375
|
+
fullContent += event.text;
|
|
376
|
+
// Stream chunk back to Zed immediately
|
|
377
|
+
const delta = {
|
|
378
|
+
content: event.text,
|
|
379
|
+
conversationId,
|
|
380
|
+
};
|
|
381
|
+
sendNotification(ACP_METHODS.CHAT_DELTA, delta);
|
|
382
|
+
break;
|
|
383
|
+
case "thinking":
|
|
384
|
+
// Send thinking as a delta too so Zed can show progress
|
|
385
|
+
const thinkDelta = {
|
|
386
|
+
content: `*${event.message}*\n`,
|
|
387
|
+
conversationId,
|
|
388
|
+
};
|
|
389
|
+
sendNotification(ACP_METHODS.CHAT_DELTA, thinkDelta);
|
|
390
|
+
break;
|
|
391
|
+
case "error":
|
|
392
|
+
console.error("[acp] Agent error:", event.message);
|
|
393
|
+
break;
|
|
394
|
+
case "warning":
|
|
395
|
+
console.error("[acp] Agent warning:", event.message);
|
|
396
|
+
break;
|
|
397
|
+
default:
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
return undefined;
|
|
401
|
+
});
|
|
402
|
+
await sessionMemory.persist().catch(() => { });
|
|
403
|
+
// Send final response
|
|
404
|
+
const result = {
|
|
405
|
+
content: fullContent,
|
|
406
|
+
conversationId,
|
|
407
|
+
};
|
|
408
|
+
// Send a final done delta so Zed knows streaming is complete
|
|
409
|
+
const finalDelta = {
|
|
410
|
+
content: "",
|
|
411
|
+
done: true,
|
|
412
|
+
conversationId,
|
|
413
|
+
};
|
|
414
|
+
sendNotification(ACP_METHODS.CHAT_DELTA, finalDelta);
|
|
415
|
+
sendResponse(id, result);
|
|
416
|
+
}
|
|
417
|
+
catch (err) {
|
|
418
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
419
|
+
console.error("[acp] Chat error:", message);
|
|
420
|
+
sendResponse(id, undefined, {
|
|
421
|
+
code: ACP_ERROR_CODES.AGENT_ERROR,
|
|
422
|
+
message,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
if (activeChat?.conversationId === conversationId) {
|
|
427
|
+
activeChat = null;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// ─── Cancel Handler ────────────────────────────────────────
|
|
432
|
+
function handleCancel(id) {
|
|
433
|
+
if (activeChat) {
|
|
434
|
+
activeChat.abortController.abort();
|
|
435
|
+
activeChat = null;
|
|
436
|
+
console.error("[acp] Chat cancelled");
|
|
437
|
+
}
|
|
438
|
+
sendResponse(id, { cancelled: true });
|
|
439
|
+
}
|
|
440
|
+
// ─── Shutdown Handler ──────────────────────────────────────
|
|
441
|
+
function handleShutdown(id) {
|
|
442
|
+
sendResponse(id, { shuttingDown: true });
|
|
443
|
+
console.error("[acp] Shutting down");
|
|
444
|
+
// Flush and exit after a brief delay so the response goes out
|
|
445
|
+
setImmediate(() => process.exit(0));
|
|
446
|
+
}
|
|
447
|
+
// ─── Entry Point ───────────────────────────────────────────
|
|
448
|
+
/**
|
|
449
|
+
* Start the ACP server.
|
|
450
|
+
*
|
|
451
|
+
* Redirects all diagnostic output to stderr and listens for
|
|
452
|
+
* JSON-RPC 2.0 messages on stdin. Each line is a complete message.
|
|
453
|
+
*
|
|
454
|
+
* Call this when `--acp` is passed on the command line.
|
|
455
|
+
*/
|
|
456
|
+
export async function startACPServer(profile) {
|
|
457
|
+
// Redirect all console.log to stderr so stdout stays clean
|
|
458
|
+
// (console.error already goes to stderr by default)
|
|
459
|
+
const origLog = console.log;
|
|
460
|
+
console.log = (...args) => {
|
|
461
|
+
console.error("[xibecode]", ...args);
|
|
462
|
+
};
|
|
463
|
+
console.error("[acp] Starting ACP server (profile: %s)", profile ?? "default");
|
|
464
|
+
const config = new ConfigManager(profile);
|
|
465
|
+
// Verify API key exists early
|
|
466
|
+
const apiKey = config.getApiKey();
|
|
467
|
+
if (!apiKey) {
|
|
468
|
+
console.error("[acp] FATAL: No API key configured.");
|
|
469
|
+
console.error("[acp] Run `xibecode config --set-key YOUR_KEY` first.");
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
// Read JSON-RPC messages from stdin, one JSON object per line
|
|
473
|
+
const rl = readline.createInterface({
|
|
474
|
+
input: process.stdin,
|
|
475
|
+
output: process.stdout,
|
|
476
|
+
terminal: false,
|
|
477
|
+
});
|
|
478
|
+
rl.on("line", (line) => {
|
|
479
|
+
const trimmed = line.trim();
|
|
480
|
+
if (!trimmed)
|
|
481
|
+
return;
|
|
482
|
+
let req;
|
|
483
|
+
try {
|
|
484
|
+
req = JSON.parse(trimmed);
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
console.error("[acp] Failed to parse JSON:", trimmed.slice(0, 200));
|
|
488
|
+
// Send back a JSON-RPC parse error (no id since we couldn't parse it)
|
|
489
|
+
writeJson({
|
|
490
|
+
jsonrpc: "2.0",
|
|
491
|
+
id: null,
|
|
492
|
+
error: {
|
|
493
|
+
code: ACP_ERROR_CODES.PARSE_ERROR,
|
|
494
|
+
message: "Parse error: invalid JSON",
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (req.jsonrpc !== "2.0" || typeof req.method !== "string") {
|
|
500
|
+
const id = "id" in req ? req.id : null;
|
|
501
|
+
sendResponse(id ?? null, undefined, {
|
|
502
|
+
code: ACP_ERROR_CODES.INVALID_REQUEST,
|
|
503
|
+
message: "Invalid JSON-RPC 2.0 message",
|
|
504
|
+
});
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
// Notifications do not have an id and must not receive a response.
|
|
508
|
+
if (!("id" in req) || req.id === undefined || req.id === null) {
|
|
509
|
+
if (req.method === ACP_METHODS.SESSION_CANCEL ||
|
|
510
|
+
req.method === ACP_METHODS.CANCEL) {
|
|
511
|
+
if (activeChat) {
|
|
512
|
+
activeChat.abortController.abort();
|
|
513
|
+
activeChat = null;
|
|
514
|
+
console.error("[acp] Chat cancelled");
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
handleRequest(req, config);
|
|
520
|
+
});
|
|
521
|
+
rl.on("close", () => {
|
|
522
|
+
console.error("[acp] stdin closed — exiting");
|
|
523
|
+
process.exit(0);
|
|
524
|
+
});
|
|
525
|
+
// Handle SIGINT / SIGTERM gracefully
|
|
526
|
+
process.on("SIGINT", () => {
|
|
527
|
+
console.error("[acp] Received SIGINT — shutting down");
|
|
528
|
+
if (activeChat) {
|
|
529
|
+
activeChat.abortController.abort();
|
|
530
|
+
}
|
|
531
|
+
process.exit(0);
|
|
532
|
+
});
|
|
533
|
+
process.on("SIGTERM", () => {
|
|
534
|
+
console.error("[acp] Received SIGTERM — shutting down");
|
|
535
|
+
if (activeChat) {
|
|
536
|
+
activeChat.abortController.abort();
|
|
537
|
+
}
|
|
538
|
+
process.exit(0);
|
|
539
|
+
});
|
|
540
|
+
// Signal to Zed that the server is ready. Some ACP clients expect
|
|
541
|
+
// an initial response or just wait for the initialize handshake.
|
|
542
|
+
// We do nothing here — Zed will send initialize which we handle.
|
|
543
|
+
console.error("[acp] Listening for JSON-RPC messages on stdin...");
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=acp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-server.js","sourceRoot":"","sources":["../../src/acp/acp-server.ts"],"names":[],"mappings":"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"}
|