codebuff-agent-acp 0.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.
package/dist/agent.js ADDED
@@ -0,0 +1,544 @@
1
+ /**
2
+ * Codebuff → ACP adapter.
3
+ *
4
+ * Each ACP session owns one `CodebuffClient`. A `session/prompt` is a single
5
+ * `client.run()`; Codebuff's streamed events are translated on the fly into
6
+ * ACP `session/update` notifications (agent message chunks, tool calls,
7
+ * sub-agent nesting, reasoning, and plan/todos), and permission prompts are
8
+ * routed back to the client via `session/request_permission`.
9
+ *
10
+ * Resumable `RunState` is persisted to disk so sessions survive restarts and
11
+ * can be listed / resumed / forked.
12
+ */
13
+ import * as crypto from "node:crypto";
14
+ import * as acp from "@agentclientprotocol/sdk";
15
+ import { CodebuffClient, } from "@codebuff/sdk";
16
+ import { promptToCodebuff, textFromOutput } from "./converters.js";
17
+ import { isGatedTool, toolKind, toolLocations, toolScopeDescription, toolTitle, } from "./mapping.js";
18
+ import { deleteSession, listSessionRecords, loadSessionRecord, saveSession, titleFromPrompt, } from "./sessions.js";
19
+ const VERSION = "0.1.0";
20
+ const DEFAULT_AGENT_ID = process.env.CODEBUFF_AGENT ?? "base";
21
+ function newId(prefix) {
22
+ return `${prefix}_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
23
+ }
24
+ export class CodebuffAcpAgent {
25
+ sessions = new Map();
26
+ clientFactory;
27
+ apiKey = process.env.CODEBUFF_API_KEY ?? "";
28
+ constructor(opts = {}) {
29
+ this.clientFactory =
30
+ opts.clientFactory ??
31
+ ((o) => new CodebuffClient(o));
32
+ }
33
+ /** ---- lifecycle handlers ---- */
34
+ async initialize(_params) {
35
+ return {
36
+ protocolVersion: acp.PROTOCOL_VERSION,
37
+ agentCapabilities: {
38
+ loadSession: true,
39
+ promptCapabilities: {
40
+ image: true,
41
+ audio: false,
42
+ embeddedContext: true,
43
+ },
44
+ mcpCapabilities: { http: false, sse: false, acp: false },
45
+ sessionCapabilities: {
46
+ list: {},
47
+ delete: {},
48
+ resume: {},
49
+ close: {},
50
+ fork: {},
51
+ },
52
+ },
53
+ agentInfo: {
54
+ name: "codebuff-agent-acp",
55
+ title: "Codebuff",
56
+ version: VERSION,
57
+ },
58
+ authMethods: [],
59
+ };
60
+ }
61
+ async authenticate(params) {
62
+ const key = params._meta
63
+ ?.codebuff?.apiKey;
64
+ if (key)
65
+ this.apiKey = key;
66
+ return {};
67
+ }
68
+ async newSession(params) {
69
+ const sessionId = newId("s");
70
+ const cwd = params.cwd ?? process.cwd();
71
+ const createdAt = Date.now();
72
+ const session = { sessionId, cwd, createdAt, title: null };
73
+ this.sessions.set(sessionId, session);
74
+ await saveSession({
75
+ sessionId,
76
+ cwd,
77
+ title: null,
78
+ createdAt,
79
+ updatedAt: createdAt,
80
+ });
81
+ return { sessionId };
82
+ }
83
+ /** ---- the main turn ---- */
84
+ async prompt(params, client, ctx) {
85
+ const session = this.requireSession(params.sessionId);
86
+ const { prompt: promptString, content } = promptToCodebuff(params.prompt);
87
+ const controller = new AbortController();
88
+ session.abortController = controller;
89
+ const onParentAbort = () => controller.abort();
90
+ ctx.signal.addEventListener("abort", onParentAbort, { once: true });
91
+ let aborted = false;
92
+ controller.signal.addEventListener("abort", () => {
93
+ aborted = true;
94
+ }, { once: true });
95
+ const perm = {
96
+ rejected: new Set(),
97
+ allowAlways: new Set(),
98
+ };
99
+ const subagentMessageIds = new Map();
100
+ const mainMessageId = newId("m");
101
+ const thoughtMessageId = newId("th");
102
+ let emittedAnyText = false;
103
+ // True once the main agent's text has been delivered token-by-token via
104
+ // handleStreamChunk. When set, subsequent `text` events (the consolidated
105
+ // message) are suppressed to avoid duplicating already-streamed content.
106
+ let streamedText = false;
107
+ const notify = (update) => client.notify(acp.methods.client.session.update, {
108
+ sessionId: session.sessionId,
109
+ update,
110
+ });
111
+ const handleEvent = async (event) => {
112
+ switch (event.type) {
113
+ case "text":
114
+ // Codebuff's base agent delivers assistant text through these `text`
115
+ // events (token streaming via handleStreamChunk doesn't always fire).
116
+ // Emit each as a chunk so the message appears as it's produced rather
117
+ // than only at turn-end. Skip when we already streamed this message
118
+ // token-by-token, to avoid duplicating the same content.
119
+ if (streamedText)
120
+ return;
121
+ emittedAnyText = true;
122
+ await notify({
123
+ sessionUpdate: "agent_message_chunk",
124
+ content: { type: "text", text: event.text },
125
+ messageId: mainMessageId,
126
+ });
127
+ return;
128
+ case "reasoning_delta":
129
+ await notify({
130
+ sessionUpdate: "agent_thought_chunk",
131
+ content: { type: "text", text: event.text },
132
+ messageId: thoughtMessageId,
133
+ });
134
+ return;
135
+ case "tool_call": {
136
+ const { toolCallId, toolName, input, agentId, parentAgentId } = event;
137
+ const kind = toolKind(toolName);
138
+ const title = toolTitle(toolName, input ?? {});
139
+ const locations = toolLocations(toolName, input ?? {});
140
+ const meta = {};
141
+ if (agentId)
142
+ meta.agentId = agentId;
143
+ if (parentAgentId)
144
+ meta.parentToolCallId = `subagent:${parentAgentId}`;
145
+ await notify({
146
+ sessionUpdate: "tool_call",
147
+ toolCallId,
148
+ title,
149
+ kind,
150
+ status: "pending",
151
+ locations,
152
+ rawInput: input,
153
+ _meta: Object.keys(meta).length ? { codebuff: meta } : undefined,
154
+ });
155
+ // Surface the model's own plan as an ACP plan update.
156
+ if (toolName === "write_todos" && Array.isArray(input?.todos)) {
157
+ await notify({
158
+ sessionUpdate: "plan",
159
+ entries: input.todos
160
+ .filter((t) => typeof t.task === "string")
161
+ .map((t) => ({
162
+ content: t.task,
163
+ priority: "medium",
164
+ status: t.completed
165
+ ? "completed"
166
+ : "in_progress",
167
+ })),
168
+ });
169
+ }
170
+ if (isGatedTool(toolName)) {
171
+ const scope = toolScopeDescription(toolName, input ?? {});
172
+ const response = await client.request(acp.methods.client.session.requestPermission, {
173
+ sessionId: session.sessionId,
174
+ toolCall: {
175
+ toolCallId,
176
+ title,
177
+ kind,
178
+ status: "pending",
179
+ locations,
180
+ rawInput: input,
181
+ },
182
+ options: [
183
+ {
184
+ optionId: "allow",
185
+ name: `Allow (${scope})`,
186
+ kind: "allow_once",
187
+ },
188
+ {
189
+ optionId: "allow_always",
190
+ name: "Always allow this tool",
191
+ kind: "allow_always",
192
+ },
193
+ { optionId: "reject", name: "Reject", kind: "reject_once" },
194
+ {
195
+ optionId: "reject_always",
196
+ name: "Always reject this tool",
197
+ kind: "reject_always",
198
+ },
199
+ ],
200
+ });
201
+ if (response.outcome.outcome === "cancelled") {
202
+ controller.abort();
203
+ return;
204
+ }
205
+ if (response.outcome.outcome === "selected" &&
206
+ String(response.outcome.optionId).startsWith("reject")) {
207
+ perm.rejected.add(toolCallId);
208
+ await notify({
209
+ sessionUpdate: "tool_call_update",
210
+ toolCallId,
211
+ status: "failed",
212
+ rawOutput: { rejected: true },
213
+ });
214
+ }
215
+ else if (response.outcome.outcome === "selected" &&
216
+ response.outcome.optionId === "allow_always") {
217
+ perm.allowAlways.add(toolName);
218
+ }
219
+ }
220
+ return;
221
+ }
222
+ case "tool_result": {
223
+ if (perm.rejected.has(event.toolCallId))
224
+ return;
225
+ const rawOutput = (event.output ?? []).map((o) => o.type === "json"
226
+ ? o.value
227
+ : { media: o.data, mediaType: o.mediaType });
228
+ await notify({
229
+ sessionUpdate: "tool_call_update",
230
+ toolCallId: event.toolCallId,
231
+ status: "completed",
232
+ rawOutput,
233
+ });
234
+ return;
235
+ }
236
+ case "subagent_start": {
237
+ const toolCallId = `subagent:${event.agentId}`;
238
+ await notify({
239
+ sessionUpdate: "tool_call",
240
+ toolCallId,
241
+ title: event.displayName ?? event.agentType ?? "Sub-agent",
242
+ kind: "other",
243
+ status: "pending",
244
+ locations: [],
245
+ rawInput: {
246
+ agentType: event.agentType,
247
+ prompt: event.prompt,
248
+ params: event.params,
249
+ },
250
+ _meta: {
251
+ codebuff: {
252
+ subagent: true,
253
+ agentId: event.agentId,
254
+ parentAgentId: event.parentAgentId,
255
+ },
256
+ },
257
+ });
258
+ return;
259
+ }
260
+ case "subagent_finish": {
261
+ await notify({
262
+ sessionUpdate: "tool_call_update",
263
+ toolCallId: `subagent:${event.agentId}`,
264
+ status: "completed",
265
+ rawOutput: { agentType: event.agentType },
266
+ });
267
+ return;
268
+ }
269
+ case "error":
270
+ emittedAnyText = true;
271
+ await notify({
272
+ sessionUpdate: "agent_message_chunk",
273
+ content: { type: "text", text: `⚠️ ${event.message}` },
274
+ messageId: mainMessageId,
275
+ });
276
+ return;
277
+ case "start":
278
+ case "finish":
279
+ case "download":
280
+ return;
281
+ default:
282
+ return;
283
+ }
284
+ };
285
+ const handleStreamChunk = (chunk) => {
286
+ if (typeof chunk === "string") {
287
+ if (chunk) {
288
+ streamedText = true;
289
+ emittedAnyText = true;
290
+ void notify({
291
+ sessionUpdate: "agent_message_chunk",
292
+ content: { type: "text", text: chunk },
293
+ messageId: mainMessageId,
294
+ });
295
+ }
296
+ return;
297
+ }
298
+ if (chunk.type === "subagent_chunk") {
299
+ const messageId = subagentMessageIds.get(chunk.agentId) ?? newId("sm");
300
+ subagentMessageIds.set(chunk.agentId, messageId);
301
+ void notify({
302
+ sessionUpdate: "agent_message_chunk",
303
+ content: { type: "text", text: chunk.chunk },
304
+ messageId,
305
+ _meta: {
306
+ codebuff: {
307
+ subagentAgentId: chunk.agentId,
308
+ agentType: chunk.agentType,
309
+ },
310
+ },
311
+ });
312
+ return;
313
+ }
314
+ // reasoning_chunk: surfaced via the reasoning_delta event instead.
315
+ };
316
+ let result;
317
+ try {
318
+ // Lazily construct the Codebuff client on first prompt so that sessions
319
+ // can be created without an API key (the error surfaces only when the
320
+ // user actually sends a message).
321
+ const cb = (session.client ??= this.buildClient(session.cwd));
322
+ result = await cb.run({
323
+ agent: DEFAULT_AGENT_ID,
324
+ prompt: promptString,
325
+ content: content.length > 0 ? content : undefined,
326
+ previousRun: session.previousRun,
327
+ signal: controller.signal,
328
+ handleEvent,
329
+ handleStreamChunk,
330
+ });
331
+ }
332
+ catch (err) {
333
+ ctx.signal.removeEventListener("abort", onParentAbort);
334
+ if (aborted || controller.signal.aborted) {
335
+ return { stopReason: "cancelled" };
336
+ }
337
+ const message = err instanceof Error ? err.message : String(err);
338
+ await notify({
339
+ sessionUpdate: "agent_message_chunk",
340
+ content: { type: "text", text: `⚠️ Codebuff error: ${message}` },
341
+ messageId: mainMessageId,
342
+ });
343
+ return { stopReason: "end_turn" };
344
+ }
345
+ ctx.signal.removeEventListener("abort", onParentAbort);
346
+ if (aborted || controller.signal.aborted) {
347
+ return { stopReason: "cancelled" };
348
+ }
349
+ // Fallback for the case where the run produced output but emitted neither
350
+ // stream chunks nor `text` events (so nothing was shown during the turn).
351
+ if (!emittedAnyText) {
352
+ const text = textFromOutput(result.output);
353
+ if (text) {
354
+ await notify({
355
+ sessionUpdate: "agent_message_chunk",
356
+ content: { type: "text", text },
357
+ messageId: mainMessageId,
358
+ });
359
+ }
360
+ }
361
+ // Persist resumable state.
362
+ session.previousRun = result;
363
+ if (!session.title)
364
+ session.title = titleFromPrompt(promptString);
365
+ const record = {
366
+ sessionId: session.sessionId,
367
+ cwd: session.cwd,
368
+ title: session.title,
369
+ createdAt: session.createdAt,
370
+ updatedAt: Date.now(),
371
+ runState: result,
372
+ };
373
+ await saveSession(record).catch((err) => console.error("Failed to persist session:", err));
374
+ return { stopReason: "end_turn" };
375
+ }
376
+ async cancel(params) {
377
+ this.sessions.get(params.sessionId)?.abortController?.abort();
378
+ }
379
+ /** ---- session management (backed by the disk store) ---- */
380
+ async loadSession(params, client) {
381
+ const record = await loadSessionRecord(params.sessionId);
382
+ if (!record) {
383
+ throw acp.RequestError.internalError(undefined, `Session ${params.sessionId} not found`);
384
+ }
385
+ const cwd = params.cwd ?? record.cwd;
386
+ const session = {
387
+ sessionId: record.sessionId,
388
+ cwd,
389
+ createdAt: record.createdAt ?? Date.now(),
390
+ previousRun: record.runState,
391
+ title: record.title,
392
+ };
393
+ this.sessions.set(session.sessionId, session);
394
+ // Best-effort replay of prior conversation as agent/user message chunks.
395
+ await this.replayHistory(session, client);
396
+ return {};
397
+ }
398
+ async listSessions(_params) {
399
+ const records = await listSessionRecords();
400
+ return {
401
+ sessions: records.map((r) => ({
402
+ sessionId: r.sessionId,
403
+ cwd: r.cwd,
404
+ title: r.title,
405
+ updatedAt: new Date(r.updatedAt).toISOString(),
406
+ })),
407
+ };
408
+ }
409
+ async forkSession(params) {
410
+ const parent = this.sessions.get(params.sessionId) ??
411
+ (await loadSessionRecord(params.sessionId)) ??
412
+ undefined;
413
+ if (!parent) {
414
+ throw acp.RequestError.internalError(undefined, `Session ${params.sessionId} not found`);
415
+ }
416
+ const cwd = "cwd" in parent ? parent.cwd : process.cwd();
417
+ const previousRun = "previousRun" in parent ? parent.previousRun : undefined;
418
+ const createdAt = "createdAt" in parent ? parent.createdAt : Date.now();
419
+ const title = "title" in parent ? parent.title : null;
420
+ const sessionId = newId("s");
421
+ const session = {
422
+ sessionId,
423
+ cwd,
424
+ createdAt: Date.now(),
425
+ previousRun: previousRun
426
+ ? structuredCloneSafe(previousRun)
427
+ : undefined,
428
+ title: title ? `${title} (fork)` : null,
429
+ };
430
+ this.sessions.set(sessionId, session);
431
+ await saveSession({
432
+ sessionId,
433
+ cwd,
434
+ title: session.title,
435
+ createdAt,
436
+ updatedAt: Date.now(),
437
+ runState: session.previousRun,
438
+ });
439
+ return { sessionId };
440
+ }
441
+ async resumeSession(params) {
442
+ const record = await loadSessionRecord(params.sessionId);
443
+ if (!record) {
444
+ throw acp.RequestError.internalError(undefined, `Session ${params.sessionId} not found`);
445
+ }
446
+ this.sessions.set(params.sessionId, {
447
+ sessionId: params.sessionId,
448
+ cwd: record.cwd,
449
+ createdAt: record.createdAt ?? Date.now(),
450
+ previousRun: record.runState,
451
+ title: record.title,
452
+ });
453
+ return {};
454
+ }
455
+ async closeSession(_params) {
456
+ // State is already persisted on each turn; just drop the in-memory client.
457
+ return {};
458
+ }
459
+ async deleteSession(params) {
460
+ this.sessions.delete(params.sessionId);
461
+ await deleteSession(params.sessionId);
462
+ return {};
463
+ }
464
+ async setSessionMode(_params) {
465
+ // Mode switching isn't exposed by the Codebuff SDK; accept silently.
466
+ return {};
467
+ }
468
+ /** ---- internals ---- */
469
+ requireSession(sessionId) {
470
+ const session = this.sessions.get(sessionId);
471
+ if (!session) {
472
+ throw acp.RequestError.internalError(undefined, `Session ${sessionId} not found`);
473
+ }
474
+ return session;
475
+ }
476
+ buildClient(cwd) {
477
+ return this.clientFactory({ apiKey: this.apiKey, cwd });
478
+ }
479
+ async replayHistory(session, client) {
480
+ const history = session.previousRun?.sessionState?.mainAgentState
481
+ ?.messageHistory;
482
+ if (!Array.isArray(history))
483
+ return;
484
+ for (const message of history) {
485
+ const text = (message.content ?? [])
486
+ .filter((p) => p.type === "text" && typeof p.text === "string")
487
+ .map((p) => p.text)
488
+ .join("");
489
+ if (!text)
490
+ continue;
491
+ const isAgent = message.role === "assistant";
492
+ await client.notify(acp.methods.client.session.update, {
493
+ sessionId: session.sessionId,
494
+ update: {
495
+ sessionUpdate: isAgent ? "agent_message_chunk" : "user_message_chunk",
496
+ content: { type: "text", text },
497
+ },
498
+ });
499
+ }
500
+ }
501
+ /** Abort any in-flight turns; called on shutdown. */
502
+ dispose() {
503
+ for (const session of this.sessions.values()) {
504
+ session.abortController?.abort();
505
+ }
506
+ }
507
+ }
508
+ /** structuredClone with a JSON fallback for older runtimes / non-cloneable values. */
509
+ function structuredCloneSafe(value) {
510
+ if (typeof structuredClone === "function") {
511
+ try {
512
+ return structuredClone(value);
513
+ }
514
+ catch {
515
+ // fall through
516
+ }
517
+ }
518
+ return JSON.parse(JSON.stringify(value));
519
+ }
520
+ /** Register every ACP handler on an `AgentApp`. Exported so tests can wire the
521
+ * same handlers onto an in-process app driven by a fake client. */
522
+ export function registerAcpHandlers(agent, app) {
523
+ return app
524
+ .onRequest("initialize", (ctx) => agent.initialize(ctx.params))
525
+ .onRequest("authenticate", (ctx) => agent.authenticate(ctx.params))
526
+ .onRequest("session/new", (ctx) => agent.newSession(ctx.params))
527
+ .onRequest("session/load", (ctx) => agent.loadSession(ctx.params, ctx.client))
528
+ .onRequest("session/list", (ctx) => agent.listSessions(ctx.params))
529
+ .onRequest("session/fork", (ctx) => agent.forkSession(ctx.params))
530
+ .onRequest("session/resume", (ctx) => agent.resumeSession(ctx.params))
531
+ .onRequest("session/close", (ctx) => agent.closeSession(ctx.params))
532
+ .onRequest("session/delete", (ctx) => agent.deleteSession(ctx.params))
533
+ .onRequest("session/set_mode", (ctx) => agent.setSessionMode(ctx.params))
534
+ .onRequest("session/prompt", (ctx) => agent.prompt(ctx.params, ctx.client, ctx))
535
+ .onNotification("session/cancel", (ctx) => agent.cancel(ctx.params));
536
+ }
537
+ /** Wire the agent onto an ACP AgentApp over the given stream. */
538
+ export function runAcp(stream) {
539
+ const agent = new CodebuffAcpAgent();
540
+ const app = registerAcpHandlers(agent, acp.agent({ name: "codebuff-agent-acp" }));
541
+ const connection = app.connect(stream);
542
+ return { connection, app, agent };
543
+ }
544
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pure conversions between ACP content and Codebuff's message model.
3
+ *
4
+ * Kept side-effect-free and isolated from the agent so they're trivial to test.
5
+ */
6
+ import type { ContentBlock } from "@agentclientprotocol/sdk";
7
+ import type { MessageContent, RunState } from "@codebuff/sdk";
8
+ /** Codebuff's run output discriminated union (derived from `RunState`). */
9
+ export type AgentOutput = RunState["output"];
10
+ /**
11
+ * Convert an ACP user prompt (a list of content blocks) into Codebuff's
12
+ * `{ prompt, content }`. Text / resource references become the prompt string;
13
+ * images become Codebuff multimodal `content`.
14
+ */
15
+ export declare function promptToCodebuff(blocks: Array<ContentBlock>): {
16
+ prompt: string;
17
+ content: MessageContent[];
18
+ };
19
+ /** Extract readable text from a Codebuff run output. */
20
+ export declare function textFromOutput(output: AgentOutput): string | undefined;
21
+ /** Flatten Codebuff message content parts into a single text string. */
22
+ export declare function partsToText(value: unknown): string | undefined;
23
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9D,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B,CA0CA;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAuBtE;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAU9D"}