agentpane 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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ process.env.AGENTPANE_DATA_DIR ||= process.cwd()
3
+ import "../dist/index.js"
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { Hono } from "hono";
2
+ import { cors } from "hono/cors";
3
+ import { serve } from "@hono/node-server";
4
+ import { sessionsRoutes } from "./routes/sessions.js";
5
+ const app = new Hono();
6
+ // Private Network Access preflight support (public website → localhost)
7
+ app.use("*", async (c, next) => {
8
+ if (c.req.header("Access-Control-Request-Private-Network") === "true") {
9
+ c.header("Access-Control-Allow-Private-Network", "true");
10
+ }
11
+ await next();
12
+ });
13
+ app.use("*", cors({ origin: "*", credentials: true }));
14
+ app.get("/api/health", (c) => c.json({ app: "agentpane", status: "ok" }));
15
+ app.route("/api/sessions", sessionsRoutes);
16
+ serve({ fetch: app.fetch, port: 3456 }, (info) => {
17
+ console.log(`AgentPane server running on http://localhost:${info.port}`);
18
+ });
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;AAEtB,wEAAwE;AACxE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAC7B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,wCAAwC,CAAC,KAAK,MAAM,EAAE,CAAC;QACtE,CAAC,CAAC,MAAM,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,IAAI,EAAE,CAAA;AACd,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAEtD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAEzE,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,cAAc,CAAC,CAAA;AAE1C,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IAC/C,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;AAC1E,CAAC,CAAC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SessionRepo } from "./session-repo.js";
3
+ import { AcpConnectionError } from "./schema.js";
4
+ import { EventBroadcaster } from "./event-broadcaster.js";
5
+ interface SubscribeResult {
6
+ subscriberId: string;
7
+ stream: ReadableStream<string>;
8
+ prompting: boolean;
9
+ assistantTurnId: string | null;
10
+ latestEventId: number;
11
+ }
12
+ declare const AcpClient_base: Context.TagClass<AcpClient, "@agentpane/AcpClient", {
13
+ readonly connect: (sessionId: string, cwd: string, agentType: string) => Effect.Effect<{
14
+ agentSessionId: string;
15
+ }, AcpConnectionError>;
16
+ readonly prompt: (sessionId: string, content: string) => Effect.Effect<{
17
+ userTurnId: string;
18
+ assistantTurnId: string;
19
+ }, AcpConnectionError>;
20
+ readonly cancel: (sessionId: string) => Effect.Effect<void>;
21
+ readonly disconnect: (sessionId: string) => Effect.Effect<void>;
22
+ readonly isConnected: (sessionId: string) => Effect.Effect<boolean>;
23
+ readonly subscribe: (sessionId: string, afterEventId?: number) => Effect.Effect<SubscribeResult>;
24
+ readonly unsubscribe: (sessionId: string, subscriberId: string) => Effect.Effect<void>;
25
+ readonly connectedSessionIds: () => ReadonlySet<string>;
26
+ readonly promptingSessionIds: () => ReadonlySet<string>;
27
+ readonly ensureBroadcaster: (sessionId: string) => EventBroadcaster;
28
+ readonly removeBroadcaster: (sessionId: string) => void;
29
+ }>;
30
+ export declare class AcpClient extends AcpClient_base {
31
+ static readonly layer: Layer.Layer<AcpClient, never, SessionRepo>;
32
+ }
33
+ export {};
@@ -0,0 +1,464 @@
1
+ import { spawn } from "node:child_process";
2
+ import crypto from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import { Context, Effect, Layer, Runtime } from "effect";
5
+ import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION, RequestError, } from "@agentclientprotocol/sdk";
6
+ import { nodeToWebWritable, nodeToWebReadable } from "@zed-industries/claude-code-acp";
7
+ import { SessionRepo } from "./session-repo.js";
8
+ import { AcpConnectionError } from "./schema.js";
9
+ import { EventBroadcaster } from "./event-broadcaster.js";
10
+ import { resolveProviderBin, PROVIDERS } from "./providers.js";
11
+ export class AcpClient extends Context.Tag("@agentpane/AcpClient")() {
12
+ static layer = Layer.effect(AcpClient, Effect.gen(function* () {
13
+ const repo = yield* SessionRepo;
14
+ const runtime = yield* Effect.runtime();
15
+ const runPromise = Runtime.runPromise(runtime);
16
+ const connections = new Map();
17
+ const promptingSessions = new Set();
18
+ // Session-level broadcasters — separate from connections so they survive disconnects
19
+ const broadcasters = new Map();
20
+ // Pending idle cleanup timers for broadcasters
21
+ const idleTimers = new Map();
22
+ const BROADCASTER_IDLE_MS = 5 * 60 * 1000; // 5 minutes
23
+ const scheduleIdleCleanup = (sessionId) => {
24
+ // Don't schedule if connected or already scheduled
25
+ if (connections.has(sessionId) || idleTimers.has(sessionId))
26
+ return;
27
+ const timer = setTimeout(() => {
28
+ idleTimers.delete(sessionId);
29
+ const broadcaster = broadcasters.get(sessionId);
30
+ // Only remove if still disconnected and no subscribers
31
+ if (broadcaster && !connections.has(sessionId) && broadcaster.subscriberCount === 0) {
32
+ broadcaster.close();
33
+ broadcasters.delete(sessionId);
34
+ }
35
+ }, BROADCASTER_IDLE_MS);
36
+ idleTimers.set(sessionId, timer);
37
+ };
38
+ const cancelIdleCleanup = (sessionId) => {
39
+ const timer = idleTimers.get(sessionId);
40
+ if (timer) {
41
+ clearTimeout(timer);
42
+ idleTimers.delete(sessionId);
43
+ }
44
+ };
45
+ const ensureBroadcaster = (sessionId) => {
46
+ cancelIdleCleanup(sessionId);
47
+ let broadcaster = broadcasters.get(sessionId);
48
+ if (!broadcaster) {
49
+ broadcaster = new EventBroadcaster();
50
+ broadcasters.set(sessionId, broadcaster);
51
+ }
52
+ return broadcaster;
53
+ };
54
+ const removeBroadcaster = (sessionId) => {
55
+ cancelIdleCleanup(sessionId);
56
+ const broadcaster = broadcasters.get(sessionId);
57
+ if (broadcaster) {
58
+ broadcaster.close();
59
+ broadcasters.delete(sessionId);
60
+ }
61
+ };
62
+ const appendOutput = (terminal, chunk) => {
63
+ terminal.output += chunk;
64
+ if (terminal.outputByteLimit !== null &&
65
+ Buffer.byteLength(terminal.output, "utf-8") > terminal.outputByteLimit) {
66
+ const buf = Buffer.from(terminal.output, "utf-8");
67
+ let start = buf.length - terminal.outputByteLimit;
68
+ while (start < buf.length && (buf[start] & 0xc0) === 0x80) {
69
+ start++;
70
+ }
71
+ terminal.output = buf.subarray(start).toString("utf-8");
72
+ terminal.truncated = true;
73
+ }
74
+ };
75
+ const getTerminal = (conn, terminalId) => {
76
+ const terminal = conn.terminals.get(terminalId);
77
+ if (!terminal) {
78
+ throw RequestError.resourceNotFound(terminalId);
79
+ }
80
+ return terminal;
81
+ };
82
+ const cleanupConnection = (sessionId, conn) => {
83
+ if (conn.cleaned)
84
+ return;
85
+ conn.cleaned = true;
86
+ // Broadcast disconnected event via session-level broadcaster
87
+ const broadcaster = broadcasters.get(sessionId);
88
+ if (broadcaster) {
89
+ broadcaster.broadcast({ sessionUpdate: "disconnected" });
90
+ }
91
+ connections.delete(sessionId);
92
+ promptingSessions.delete(sessionId);
93
+ // Kill all terminal subprocesses
94
+ for (const terminal of conn.terminals.values()) {
95
+ if (!terminal.process.killed) {
96
+ terminal.process.kill();
97
+ }
98
+ }
99
+ conn.terminals.clear();
100
+ // Update DB
101
+ runPromise(repo.updateAgentSessionId(sessionId, null).pipe(Effect.orDie)).catch(() => { });
102
+ // Broadcaster survives disconnects but schedule idle cleanup
103
+ scheduleIdleCleanup(sessionId);
104
+ };
105
+ const makeClient = (sessionId, connRef) => {
106
+ return (_agent) => ({
107
+ sessionUpdate: async (params) => {
108
+ const conn = connRef.current;
109
+ if (!conn)
110
+ return;
111
+ const update = params.update;
112
+ const eventType = update.sessionUpdate;
113
+ // Accumulate text for DB persistence
114
+ if (eventType === "agent_message_chunk" &&
115
+ update.content?.type === "text") {
116
+ conn.accumulatedText += update.content.text;
117
+ }
118
+ // Persist tool calls immediately
119
+ if (conn.currentAssistantTurnId &&
120
+ (eventType === "tool_call" || eventType === "tool_call_update")) {
121
+ runPromise(repo.addMessageBlock(conn.currentAssistantTurnId, eventType, JSON.stringify(update))).catch(() => { });
122
+ }
123
+ // Broadcast to all subscribers via session-level broadcaster
124
+ const broadcaster = broadcasters.get(sessionId);
125
+ if (broadcaster) {
126
+ broadcaster.broadcast(update);
127
+ }
128
+ },
129
+ requestPermission: async (params) => {
130
+ const firstOption = params.options[0];
131
+ if (firstOption) {
132
+ return {
133
+ outcome: {
134
+ outcome: "selected",
135
+ optionId: firstOption.optionId,
136
+ },
137
+ };
138
+ }
139
+ return { outcome: { outcome: "cancelled" } };
140
+ },
141
+ readTextFile: async (params) => {
142
+ const content = await fs.readFile(params.path, "utf-8");
143
+ return { content };
144
+ },
145
+ writeTextFile: async (params) => {
146
+ await fs.writeFile(params.path, params.content, "utf-8");
147
+ return {};
148
+ },
149
+ createTerminal: async (params) => {
150
+ const conn = connRef.current;
151
+ const terminalId = crypto.randomUUID();
152
+ const env = { ...process.env };
153
+ if (params.env) {
154
+ for (const v of params.env) {
155
+ env[v.name] = v.value;
156
+ }
157
+ }
158
+ let resolveExit;
159
+ const exitPromise = new Promise((resolve) => {
160
+ resolveExit = resolve;
161
+ });
162
+ const termProc = spawn(params.command, params.args ?? [], {
163
+ cwd: params.cwd ?? conn.cwd,
164
+ env,
165
+ stdio: ["ignore", "pipe", "pipe"],
166
+ shell: true,
167
+ });
168
+ const terminal = {
169
+ process: termProc,
170
+ output: "",
171
+ truncated: false,
172
+ outputByteLimit: params.outputByteLimit ?? null,
173
+ exitStatus: null,
174
+ exitPromise,
175
+ resolveExit,
176
+ };
177
+ termProc.stdout?.on("data", (chunk) => {
178
+ appendOutput(terminal, chunk.toString("utf-8"));
179
+ });
180
+ termProc.stderr?.on("data", (chunk) => {
181
+ appendOutput(terminal, chunk.toString("utf-8"));
182
+ });
183
+ termProc.on("exit", (code, signal) => {
184
+ const status = {
185
+ exitCode: code,
186
+ signal: signal ?? null,
187
+ };
188
+ terminal.exitStatus = status;
189
+ resolveExit(status);
190
+ });
191
+ termProc.on("error", (err) => {
192
+ appendOutput(terminal, `\nProcess error: ${err.message}\n`);
193
+ if (!terminal.exitStatus) {
194
+ const status = { exitCode: 1 };
195
+ terminal.exitStatus = status;
196
+ resolveExit(status);
197
+ }
198
+ });
199
+ conn.terminals.set(terminalId, terminal);
200
+ return { terminalId };
201
+ },
202
+ terminalOutput: async (params) => {
203
+ const conn = connRef.current;
204
+ const terminal = getTerminal(conn, params.terminalId);
205
+ return {
206
+ output: terminal.output,
207
+ truncated: terminal.truncated,
208
+ exitStatus: terminal.exitStatus,
209
+ };
210
+ },
211
+ waitForTerminalExit: async (params) => {
212
+ const conn = connRef.current;
213
+ const terminal = getTerminal(conn, params.terminalId);
214
+ const status = await terminal.exitPromise;
215
+ const result = {};
216
+ if (status.exitCode !== undefined)
217
+ result.exitCode = status.exitCode;
218
+ if (status.signal !== undefined)
219
+ result.signal = status.signal;
220
+ return result;
221
+ },
222
+ killTerminal: async (params) => {
223
+ const conn = connRef.current;
224
+ const terminal = getTerminal(conn, params.terminalId);
225
+ if (!terminal.process.killed) {
226
+ terminal.process.kill();
227
+ }
228
+ return {};
229
+ },
230
+ releaseTerminal: async (params) => {
231
+ const conn = connRef.current;
232
+ const terminal = getTerminal(conn, params.terminalId);
233
+ if (!terminal.process.killed) {
234
+ terminal.process.kill();
235
+ }
236
+ conn.terminals.delete(params.terminalId);
237
+ return {};
238
+ },
239
+ });
240
+ };
241
+ const connect = Effect.fn("AcpClient.connect")(function* (sessionId, cwd, agentType) {
242
+ // If already connected, disconnect first
243
+ if (connections.has(sessionId)) {
244
+ yield* disconnect(sessionId);
245
+ }
246
+ // Ensure broadcaster exists before connecting
247
+ ensureBroadcaster(sessionId);
248
+ const effectiveCwd = cwd === "~" ? process.env.HOME || "/" : cwd;
249
+ const providerName = PROVIDERS[agentType]?.name ?? agentType;
250
+ const binPath = yield* Effect.try({
251
+ try: () => resolveProviderBin(agentType),
252
+ catch: (err) => new AcpConnectionError({
253
+ message: `${providerName}: ${err instanceof Error ? err.message : String(err)}`,
254
+ }),
255
+ });
256
+ const proc = yield* Effect.try({
257
+ try: () => spawn(binPath, [], {
258
+ cwd: effectiveCwd,
259
+ stdio: ["pipe", "pipe", "inherit"],
260
+ env: { ...process.env },
261
+ }),
262
+ catch: (err) => new AcpConnectionError({
263
+ message: `Failed to spawn ${providerName}: ${err}`,
264
+ }),
265
+ });
266
+ if (!proc.stdin || !proc.stdout) {
267
+ proc.kill();
268
+ return yield* new AcpConnectionError({
269
+ message: "Failed to get stdio streams from agent process",
270
+ });
271
+ }
272
+ const writableWeb = nodeToWebWritable(proc.stdin);
273
+ const readableWeb = nodeToWebReadable(proc.stdout);
274
+ const stream = ndJsonStream(writableWeb, readableWeb);
275
+ const connRef = { current: null };
276
+ const clientConnection = new ClientSideConnection(makeClient(sessionId, connRef), stream);
277
+ yield* Effect.tryPromise({
278
+ try: () => clientConnection.initialize({
279
+ protocolVersion: PROTOCOL_VERSION,
280
+ clientCapabilities: {
281
+ fs: { readTextFile: true, writeTextFile: true },
282
+ terminal: true,
283
+ },
284
+ clientInfo: { name: "agentpane", version: "0.1.0" },
285
+ }),
286
+ catch: (err) => {
287
+ proc.kill();
288
+ return new AcpConnectionError({
289
+ message: `ACP initialization failed: ${err}`,
290
+ });
291
+ },
292
+ });
293
+ const sessionResponse = yield* Effect.tryPromise({
294
+ try: () => clientConnection.newSession({
295
+ cwd: effectiveCwd,
296
+ mcpServers: [],
297
+ }),
298
+ catch: (err) => {
299
+ proc.kill();
300
+ return new AcpConnectionError({
301
+ message: `Failed to create agent session: ${err}`,
302
+ });
303
+ },
304
+ });
305
+ const agentSessionId = sessionResponse.sessionId;
306
+ const agentConn = {
307
+ process: proc,
308
+ connection: clientConnection,
309
+ agentSessionId,
310
+ prompting: false,
311
+ currentAssistantTurnId: null,
312
+ accumulatedText: "",
313
+ terminals: new Map(),
314
+ cwd: effectiveCwd,
315
+ cleaned: false,
316
+ };
317
+ connRef.current = agentConn;
318
+ connections.set(sessionId, agentConn);
319
+ // Update session in DB
320
+ yield* repo
321
+ .updateAgentSessionId(sessionId, agentSessionId)
322
+ .pipe(Effect.orDie);
323
+ // Consolidated cleanup for both connection close and process exit
324
+ clientConnection.closed.then(() => {
325
+ cleanupConnection(sessionId, agentConn);
326
+ });
327
+ proc.on("exit", () => {
328
+ cleanupConnection(sessionId, agentConn);
329
+ });
330
+ // Broadcast connected event
331
+ const broadcaster = broadcasters.get(sessionId);
332
+ if (broadcaster) {
333
+ broadcaster.broadcast({ sessionUpdate: "connected" });
334
+ }
335
+ return { agentSessionId };
336
+ });
337
+ const prompt = Effect.fn("AcpClient.prompt")(function* (sessionId, content) {
338
+ const conn = connections.get(sessionId);
339
+ if (!conn) {
340
+ return yield* new AcpConnectionError({
341
+ message: "Agent not connected for this session",
342
+ });
343
+ }
344
+ if (conn.prompting) {
345
+ return yield* new AcpConnectionError({
346
+ message: "A prompt is already in progress for this session",
347
+ });
348
+ }
349
+ // Create user turn + block in DB
350
+ const userTurn = yield* repo.addTurn(sessionId, "user").pipe(Effect.orDie);
351
+ yield* repo.addMessageBlock(userTurn.id, "text", content).pipe(Effect.orDie);
352
+ yield* repo.completeTurn(userTurn.id, "end_turn").pipe(Effect.orDie);
353
+ // Create assistant turn
354
+ const assistantTurn = yield* repo.addTurn(sessionId, "assistant").pipe(Effect.orDie);
355
+ // Set prompting state
356
+ conn.prompting = true;
357
+ promptingSessions.add(sessionId);
358
+ conn.currentAssistantTurnId = assistantTurn.id;
359
+ conn.accumulatedText = "";
360
+ // Broadcast prompt_started via session-level broadcaster
361
+ const broadcaster = broadcasters.get(sessionId);
362
+ if (broadcaster) {
363
+ broadcaster.broadcast({
364
+ sessionUpdate: "prompt_started",
365
+ userTurnId: userTurn.id,
366
+ assistantTurnId: assistantTurn.id,
367
+ });
368
+ }
369
+ // Fire prompt asynchronously
370
+ const persistCompletion = (stopReason) => Effect.gen(function* () {
371
+ if (conn.accumulatedText) {
372
+ yield* repo
373
+ .addMessageBlock(assistantTurn.id, "text", conn.accumulatedText)
374
+ .pipe(Effect.orDie);
375
+ }
376
+ yield* repo
377
+ .completeTurn(assistantTurn.id, stopReason)
378
+ .pipe(Effect.orDie);
379
+ });
380
+ conn.connection
381
+ .prompt({
382
+ sessionId: conn.agentSessionId,
383
+ prompt: [{ type: "text", text: content }],
384
+ })
385
+ .then(async (response) => {
386
+ const reason = response.stopReason || "end_turn";
387
+ await runPromise(persistCompletion(reason));
388
+ const b = broadcasters.get(sessionId);
389
+ if (b) {
390
+ b.broadcast({
391
+ sessionUpdate: "done",
392
+ stopReason: reason,
393
+ });
394
+ }
395
+ })
396
+ .catch(async (err) => {
397
+ await runPromise(persistCompletion("error")).catch(() => { });
398
+ const b = broadcasters.get(sessionId);
399
+ if (b) {
400
+ b.broadcast({
401
+ sessionUpdate: "error",
402
+ message: String(err),
403
+ });
404
+ }
405
+ })
406
+ .finally(() => {
407
+ conn.prompting = false;
408
+ promptingSessions.delete(sessionId);
409
+ conn.currentAssistantTurnId = null;
410
+ conn.accumulatedText = "";
411
+ });
412
+ return { userTurnId: userTurn.id, assistantTurnId: assistantTurn.id };
413
+ });
414
+ const cancel = (sessionId) => {
415
+ const conn = connections.get(sessionId);
416
+ if (!conn)
417
+ return Effect.void;
418
+ return Effect.promise(() => conn.connection.cancel({ sessionId: conn.agentSessionId }));
419
+ };
420
+ const subscribe = (sessionId, afterEventId) => Effect.sync(() => {
421
+ const broadcaster = ensureBroadcaster(sessionId);
422
+ const { subscriberId, stream, latestEventId } = broadcaster.subscribe(afterEventId);
423
+ const conn = connections.get(sessionId);
424
+ return {
425
+ subscriberId,
426
+ stream,
427
+ prompting: conn?.prompting ?? false,
428
+ assistantTurnId: conn?.currentAssistantTurnId ?? null,
429
+ latestEventId,
430
+ };
431
+ });
432
+ const unsubscribe = (sessionId, subscriberId) => Effect.sync(() => {
433
+ const broadcaster = broadcasters.get(sessionId);
434
+ if (broadcaster)
435
+ broadcaster.unsubscribe(subscriberId);
436
+ });
437
+ const disconnect = (sessionId) => Effect.sync(() => {
438
+ const conn = connections.get(sessionId);
439
+ if (!conn)
440
+ return;
441
+ // Kill the main process (triggers cleanupConnection via exit/close handlers,
442
+ // but we call it directly to ensure synchronous cleanup)
443
+ if (!conn.process.killed) {
444
+ conn.process.kill();
445
+ }
446
+ cleanupConnection(sessionId, conn);
447
+ });
448
+ const isConnected = (sessionId) => Effect.succeed(connections.has(sessionId));
449
+ return AcpClient.of({
450
+ connect,
451
+ prompt,
452
+ cancel,
453
+ disconnect,
454
+ isConnected,
455
+ subscribe,
456
+ unsubscribe,
457
+ connectedSessionIds: () => new Set(connections.keys()),
458
+ promptingSessionIds: () => promptingSessions,
459
+ ensureBroadcaster,
460
+ removeBroadcaster,
461
+ });
462
+ }));
463
+ }
464
+ //# sourceMappingURL=acp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../src/lib/acp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import * as SqliteNode from "@effect/sql-sqlite-node/SqliteClient";
2
+ import { SqlClient } from "@effect/sql/SqlClient";
3
+ import { Layer } from "effect";
4
+ export declare const SqliteLive: Layer.Layer<SqlClient | SqliteNode.SqliteClient, import("@effect/sql/SqlError").SqlError | import("effect/ConfigError").ConfigError, never>;
package/dist/lib/db.js ADDED
@@ -0,0 +1,57 @@
1
+ import * as SqliteNode from "@effect/sql-sqlite-node/SqliteClient";
2
+ import { SqlClient } from "@effect/sql/SqlClient";
3
+ import { Effect, Layer } from "effect";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ // AGENTPANE_DATA_DIR overrides the base directory (set by bin script for npx).
7
+ // Default: navigate from import.meta.dirname to monorepo root (works for both src/ and dist/).
8
+ const baseDir = process.env.AGENTPANE_DATA_DIR || path.resolve(import.meta.dirname, "../../../..");
9
+ const dataDir = path.resolve(baseDir, "data");
10
+ if (!fs.existsSync(dataDir)) {
11
+ fs.mkdirSync(dataDir, { recursive: true });
12
+ }
13
+ const migrations = Effect.gen(function* () {
14
+ const sql = yield* SqlClient;
15
+ yield* sql `PRAGMA journal_mode = WAL`;
16
+ yield* sql `PRAGMA busy_timeout = 5000`;
17
+ yield* sql `PRAGMA foreign_keys = ON`;
18
+ yield* sql `
19
+ CREATE TABLE IF NOT EXISTS sessions (
20
+ id TEXT PRIMARY KEY,
21
+ name TEXT NOT NULL,
22
+ cwd TEXT NOT NULL DEFAULT '~',
23
+ agent_type TEXT NOT NULL DEFAULT 'claude-code',
24
+ agent_session_id TEXT,
25
+ created_at INTEGER NOT NULL
26
+ )
27
+ `;
28
+ yield* sql `ALTER TABLE sessions ADD COLUMN agent_type TEXT NOT NULL DEFAULT 'claude-code'`.pipe(Effect.catchAll(() => Effect.void));
29
+ yield* sql `
30
+ CREATE TABLE IF NOT EXISTS turns (
31
+ id TEXT PRIMARY KEY,
32
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
33
+ role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
34
+ stop_reason TEXT,
35
+ created_at INTEGER NOT NULL
36
+ )
37
+ `;
38
+ yield* sql `
39
+ CREATE INDEX IF NOT EXISTS idx_turns_session ON turns(session_id, id)
40
+ `;
41
+ yield* sql `
42
+ CREATE TABLE IF NOT EXISTS message_blocks (
43
+ id TEXT PRIMARY KEY,
44
+ turn_id TEXT NOT NULL REFERENCES turns(id) ON DELETE CASCADE,
45
+ kind TEXT NOT NULL,
46
+ content TEXT NOT NULL,
47
+ created_at INTEGER NOT NULL
48
+ )
49
+ `;
50
+ yield* sql `
51
+ CREATE INDEX IF NOT EXISTS idx_message_blocks_turn ON message_blocks(turn_id, id)
52
+ `;
53
+ });
54
+ const dbPath = path.resolve(baseDir, "data", "agentpane.db");
55
+ const SqliteBaseLive = SqliteNode.layer({ filename: dbPath });
56
+ export const SqliteLive = Layer.effectDiscard(migrations).pipe(Layer.provideMerge(SqliteBaseLive));
57
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,sCAAsC,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,+EAA+E;AAC/E,+FAA+F;AAC/F,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;AAClG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;IAC5B,KAAK,CAAC,CAAC,GAAG,CAAA,2BAA2B,CAAA;IACrC,KAAK,CAAC,CAAC,GAAG,CAAA,4BAA4B,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,0BAA0B,CAAA;IACpC,KAAK,CAAC,CAAC,GAAG,CAAA;;;;;;;;;GAST,CAAA;IACD,KAAK,CAAC,CAAC,GAAG,CAAA,gFAAgF,CAAC,IAAI,CAC7F,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CACnC,CAAA;IACD,KAAK,CAAC,CAAC,GAAG,CAAA;;;;;;;;GAQT,CAAA;IACD,KAAK,CAAC,CAAC,GAAG,CAAA;;GAET,CAAA;IACD,KAAK,CAAC,CAAC,GAAG,CAAA;;;;;;;;GAQT,CAAA;IACD,KAAK,CAAC,CAAC,GAAG,CAAA;;GAET,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;AAE5D,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAC5D,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CACnC,CAAA"}
@@ -0,0 +1,22 @@
1
+ export declare class EventBroadcaster {
2
+ private readonly bufferCapacity;
3
+ private subscribers;
4
+ private nextSubId;
5
+ private eventCounter;
6
+ private ring;
7
+ private head;
8
+ private size;
9
+ constructor(bufferCapacity?: number);
10
+ get latestEventId(): number;
11
+ subscribe(afterEventId?: number): {
12
+ subscriberId: string;
13
+ stream: ReadableStream<string>;
14
+ latestEventId: number;
15
+ };
16
+ broadcast(eventData: unknown): void;
17
+ sendTo(subscriberId: string, eventData: unknown): void;
18
+ unsubscribe(subscriberId: string): void;
19
+ close(): void;
20
+ get subscriberCount(): number;
21
+ private removeSubscriber;
22
+ }