@ai-devkit/agent-manager 0.11.0 → 0.13.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,329 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCode Adapter
4
+ *
5
+ * Detects running OpenCode agents by:
6
+ * 1. Finding running opencode processes via shared listAgentProcesses()
7
+ * 2. Enriching with CWD and start times via shared enrichProcesses()
8
+ * 3. Querying OpenCode's SQLite DB (~/.local/share/opencode/opencode.db) to
9
+ * find the session matching each process's CWD and read status from message.time.completed
10
+ *
11
+ * sessionFilePath encodes "<dbPath>::<sessionId>" so getConversation() can open the right
12
+ * DB row without extending the AgentAdapter interface.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ var __importDefault = (this && this.__importDefault) || function (mod) {
48
+ return (mod && mod.__esModule) ? mod : { "default": mod };
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.OpenCodeAdapter = void 0;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
55
+ const AgentAdapter_1 = require("./AgentAdapter");
56
+ const process_1 = require("../utils/process");
57
+ const matching_1 = require("../utils/matching");
58
+ const SESSION_REF_SEP = '::';
59
+ function encodeSessionRef(dbPath, sessionId) {
60
+ return `${dbPath}${SESSION_REF_SEP}${sessionId}`;
61
+ }
62
+ function decodeSessionRef(ref) {
63
+ const idx = ref.lastIndexOf(SESSION_REF_SEP);
64
+ if (idx === -1)
65
+ return null;
66
+ return { dbPath: ref.slice(0, idx), sessionId: ref.slice(idx + SESSION_REF_SEP.length) };
67
+ }
68
+ class OpenCodeAdapter {
69
+ constructor() {
70
+ this.type = 'opencode';
71
+ this.db = null;
72
+ this.dbPath = OpenCodeAdapter.resolveDbPath();
73
+ const cleanup = () => this.close();
74
+ process.once('exit', cleanup);
75
+ process.once('SIGINT', cleanup);
76
+ process.once('SIGTERM', cleanup);
77
+ }
78
+ close() {
79
+ if (this.db) {
80
+ try {
81
+ this.db.close();
82
+ }
83
+ catch { /* ignore */ }
84
+ this.db = null;
85
+ }
86
+ }
87
+ static resolveDbPath() {
88
+ const xdg = process.env.XDG_DATA_HOME;
89
+ const home = process.env.HOME || process.env.USERPROFILE || '';
90
+ const base = xdg || path.join(home, '.local', 'share');
91
+ return path.join(base, 'opencode', 'opencode.db');
92
+ }
93
+ canHandle(processInfo) {
94
+ const exe = (processInfo.command.trim().split(/\s+/)[0] || '').toLowerCase();
95
+ const base = path.basename(exe);
96
+ return base === 'opencode' || base === 'opencode.exe';
97
+ }
98
+ async detectAgents() {
99
+ const processes = (0, process_1.enrichProcesses)((0, process_1.listAgentProcesses)('opencode'));
100
+ if (processes.length === 0)
101
+ return [];
102
+ const db = this.openDb();
103
+ if (!db)
104
+ return processes.map((p) => this.mapProcessOnlyAgent(p));
105
+ const agents = [];
106
+ for (const proc of processes) {
107
+ if (!proc.cwd) {
108
+ agents.push(this.mapProcessOnlyAgent(proc));
109
+ continue;
110
+ }
111
+ const session = this.findSessionForDirectory(db, proc.cwd);
112
+ if (!session) {
113
+ agents.push(this.mapProcessOnlyAgent(proc));
114
+ continue;
115
+ }
116
+ const stats = this.getSessionStats(db, session.sessionId);
117
+ agents.push(this.mapSessionToAgent(session, stats, proc));
118
+ }
119
+ return agents;
120
+ }
121
+ getConversation(sessionFilePath, options) {
122
+ const verbose = options?.verbose ?? false;
123
+ const ref = decodeSessionRef(sessionFilePath);
124
+ if (!ref)
125
+ return [];
126
+ const db = this.openDb();
127
+ if (!db)
128
+ return [];
129
+ try {
130
+ const rows = db.prepare(`
131
+ SELECT json_extract(m.data, '$.role') AS role,
132
+ p.data AS partData,
133
+ p.time_created AS timeCreated
134
+ FROM part p
135
+ JOIN message m ON p.message_id = m.id
136
+ WHERE p.session_id = ?
137
+ ORDER BY p.time_created ASC
138
+ `).all(ref.sessionId);
139
+ const messages = [];
140
+ for (const row of rows) {
141
+ let partData = {};
142
+ try {
143
+ partData = JSON.parse(row.partData);
144
+ }
145
+ catch {
146
+ continue;
147
+ }
148
+ const role = row.role === 'user' ? 'user' : 'assistant';
149
+ if (partData.type === 'text' && partData.text) {
150
+ messages.push({ role, content: partData.text });
151
+ }
152
+ else if (partData.type === 'reasoning' && verbose) {
153
+ const text = partData.reasoning || partData.text || '';
154
+ if (text)
155
+ messages.push({ role: 'assistant', content: `[thinking] ${text}` });
156
+ }
157
+ else if (partData.type === 'tool' && verbose) {
158
+ const toolName = partData.tool || 'tool';
159
+ messages.push({ role: 'assistant', content: `[tool: ${toolName}]` });
160
+ }
161
+ }
162
+ return messages;
163
+ }
164
+ catch {
165
+ this.close();
166
+ return [];
167
+ }
168
+ }
169
+ async listSessions(opts) {
170
+ const db = this.openDb();
171
+ if (!db)
172
+ return [];
173
+ try {
174
+ const rows = db.prepare(`
175
+ SELECT id, directory, time_created AS timeCreated
176
+ FROM session
177
+ ORDER BY time_created DESC
178
+ `).all();
179
+ const summaries = [];
180
+ for (const row of rows) {
181
+ if (opts?.cwd !== undefined && row.directory !== opts.cwd)
182
+ continue;
183
+ const stats = this.getSessionStats(db, row.id);
184
+ const lastActive = stats.lastTimeUpdated > 0
185
+ ? new Date(stats.lastTimeUpdated)
186
+ : new Date(row.timeCreated);
187
+ const startedAt = new Date(row.timeCreated);
188
+ summaries.push({
189
+ type: 'opencode',
190
+ sessionId: row.id,
191
+ cwd: row.directory,
192
+ firstUserMessage: stats.summary,
193
+ lastActive,
194
+ startedAt,
195
+ sessionFilePath: encodeSessionRef(this.dbPath, row.id),
196
+ });
197
+ }
198
+ return summaries;
199
+ }
200
+ catch {
201
+ this.close();
202
+ return [];
203
+ }
204
+ }
205
+ findSessionForDirectory(db, directory) {
206
+ try {
207
+ const row = db.prepare(`
208
+ SELECT id, directory, time_created
209
+ FROM session
210
+ WHERE directory = ?
211
+ ORDER BY time_created DESC
212
+ LIMIT 1
213
+ `).get(directory);
214
+ if (!row)
215
+ return null;
216
+ return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };
217
+ }
218
+ catch {
219
+ return null;
220
+ }
221
+ }
222
+ getSessionStats(db, sessionId) {
223
+ const empty = {
224
+ lastRole: null,
225
+ lastTimeUpdated: 0,
226
+ lastAssistantCompleted: false,
227
+ lastAssistantErrored: false,
228
+ summary: '',
229
+ };
230
+ try {
231
+ // Order by time_created — time_updated can lag when OpenCode appends
232
+ // metadata (e.g. summary diffs) to user messages after a turn finishes.
233
+ const last = db.prepare(`
234
+ SELECT json_extract(data, '$.role') AS role,
235
+ time_updated AS timeUpdated
236
+ FROM message
237
+ WHERE session_id = ?
238
+ ORDER BY time_created DESC
239
+ LIMIT 1
240
+ `).get(sessionId);
241
+ const heartbeat = db.prepare(`
242
+ SELECT MAX(time_updated) AS maxUpdated FROM message WHERE session_id = ?
243
+ `).get(sessionId);
244
+ const lastAssistant = db.prepare(`
245
+ SELECT json_extract(data, '$.time.completed') AS completed,
246
+ json_extract(data, '$.time.error') AS errored
247
+ FROM message
248
+ WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'
249
+ ORDER BY time_created DESC
250
+ LIMIT 1
251
+ `).get(sessionId);
252
+ const first = db.prepare(`
253
+ SELECT json_extract(p.data, '$.text') AS text
254
+ FROM part p
255
+ JOIN message m ON p.message_id = m.id
256
+ WHERE p.session_id = ?
257
+ AND json_extract(m.data, '$.role') = 'user'
258
+ AND json_extract(p.data, '$.type') = 'text'
259
+ AND json_extract(p.data, '$.text') IS NOT NULL
260
+ ORDER BY p.time_created ASC
261
+ LIMIT 1
262
+ `).get(sessionId);
263
+ return {
264
+ lastRole: last?.role ?? null,
265
+ lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,
266
+ lastAssistantCompleted: lastAssistant?.completed != null,
267
+ lastAssistantErrored: lastAssistant?.errored != null,
268
+ summary: first?.text?.trim() ?? '',
269
+ };
270
+ }
271
+ catch {
272
+ return empty;
273
+ }
274
+ }
275
+ mapSessionToAgent(session, stats, proc) {
276
+ const lastActive = stats.lastTimeUpdated > 0
277
+ ? new Date(stats.lastTimeUpdated)
278
+ : new Date(session.timeCreated);
279
+ return {
280
+ name: (0, matching_1.generateAgentName)(session.directory || proc.cwd || '', proc.pid),
281
+ type: this.type,
282
+ status: this.determineStatus(stats, lastActive),
283
+ summary: stats.summary || 'OpenCode session active',
284
+ pid: proc.pid,
285
+ projectPath: session.directory || proc.cwd || '',
286
+ sessionId: session.sessionId,
287
+ lastActive,
288
+ sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),
289
+ };
290
+ }
291
+ mapProcessOnlyAgent(proc) {
292
+ return {
293
+ name: (0, matching_1.generateAgentName)(proc.cwd || '', proc.pid),
294
+ type: this.type,
295
+ status: AgentAdapter_1.AgentStatus.RUNNING,
296
+ summary: 'OpenCode process running',
297
+ pid: proc.pid,
298
+ projectPath: proc.cwd || '',
299
+ sessionId: `pid-${proc.pid}`,
300
+ lastActive: new Date(),
301
+ };
302
+ }
303
+ determineStatus(stats, lastActive) {
304
+ const ageMin = (Date.now() - lastActive.getTime()) / 60000;
305
+ if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES)
306
+ return AgentAdapter_1.AgentStatus.IDLE;
307
+ if (stats.lastRole === 'assistant' && !stats.lastAssistantCompleted)
308
+ return AgentAdapter_1.AgentStatus.RUNNING;
309
+ if (stats.lastRole === 'assistant')
310
+ return AgentAdapter_1.AgentStatus.WAITING;
311
+ return AgentAdapter_1.AgentStatus.RUNNING;
312
+ }
313
+ openDb() {
314
+ if (this.db)
315
+ return this.db;
316
+ if (!fs.existsSync(this.dbPath))
317
+ return null;
318
+ try {
319
+ this.db = new better_sqlite3_1.default(this.dbPath, { readonly: true });
320
+ return this.db;
321
+ }
322
+ catch {
323
+ return null;
324
+ }
325
+ }
326
+ }
327
+ exports.OpenCodeAdapter = OpenCodeAdapter;
328
+ OpenCodeAdapter.IDLE_THRESHOLD_MINUTES = 5;
329
+ //# sourceMappingURL=OpenCodeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenCodeAdapter.js","sourceRoot":"","sources":["../../src/adapters/OpenCodeAdapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,oEAAsC;AAStC,iDAA6C;AAC7C,8CAAuE;AACvE,gDAAsD;AAEtD,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,SAAS,gBAAgB,CAAC,MAAc,EAAE,SAAiB;IACvD,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AAC7F,CAAC;AAiBD,MAAa,eAAe;IAQxB;QAPS,SAAI,GAAG,UAAmB,CAAC;QAK5B,OAAE,GAA6B,IAAI,CAAC;QAGxC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACV,IAAI,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACnB,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,aAAa;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,WAAwB;QAC9B,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,cAAc,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,YAAY;QACd,MAAM,SAAS,GAAG,IAAA,yBAAe,EAAC,IAAA,4BAAkB,EAAC,UAAU,CAAC,CAAC,CAAC;QAClE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5C,SAAS;YACb,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5C,SAAS;YACb,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,eAAuB,EAAE,OAA+B;QACpE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QAC1C,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAEnB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAoE;;;;;;;;aAQ1F,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEtB,MAAM,QAAQ,GAA0B,EAAE,CAAC;YAE3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,QAAQ,GAAwE,EAAE,CAAC;gBACvF,IAAI,CAAC;oBACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACL,SAAS;gBACb,CAAC;gBAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;gBAExD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;oBAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;oBACvD,IAAI,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClF,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC;oBACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,QAAQ,GAAG,EAAE,CAAC,CAAC;gBACzE,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA0B;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAEnB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAA6D;;;;aAInF,CAAC,CAAC,GAAG,EAAE,CAAC;YAET,MAAM,SAAS,GAAqB,EAAE,CAAC;YAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,IAAI,EAAE,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC;oBACxC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;oBACjC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAE5C,SAAS,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,GAAG,CAAC,EAAE;oBACjB,GAAG,EAAE,GAAG,CAAC,SAAS;oBAClB,gBAAgB,EAAE,KAAK,CAAC,OAAO;oBAC/B,UAAU;oBACV,SAAS;oBACT,eAAe,EAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;iBACzD,CAAC,CAAC;YACP,CAAC;YAED,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,EAAqB,EAAE,SAAiB;QACpE,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAoE;;;;;;aAMzF,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,EAAqB,EAAE,SAAiB;QAC5D,MAAM,KAAK,GAAyB;YAChC,QAAQ,EAAE,IAAI;YACd,eAAe,EAAE,CAAC;YAClB,sBAAsB,EAAE,KAAK;YAC7B,oBAAoB,EAAE,KAAK;YAC3B,OAAO,EAAE,EAAE;SACd,CAAC;QAEF,IAAI,CAAC;YACD,qEAAqE;YACrE,wEAAwE;YACxE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAkD;;;;;;;aAOxE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAmC;;aAE9D,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAG7B;;;;;;;aAOF,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAA6B;;;;;;;;;;aAUpD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,OAAO;gBACH,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI;gBAC5B,eAAe,EAAE,SAAS,EAAE,UAAU,IAAI,IAAI,EAAE,WAAW,IAAI,CAAC;gBAChE,sBAAsB,EAAE,aAAa,EAAE,SAAS,IAAI,IAAI;gBACxD,oBAAoB,EAAE,aAAa,EAAE,OAAO,IAAI,IAAI;gBACpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;aACrC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEO,iBAAiB,CACrB,OAAwB,EACxB,KAA2B,EAC3B,IAAiB;QAEjB,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC;YACxC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;YACjC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEpC,OAAO;YACH,IAAI,EAAE,IAAA,4BAAiB,EAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;YACtE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC;YAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,yBAAyB;YACnD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE;YAChD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU;YACV,eAAe,EAAE,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;SACpE,CAAC;IACN,CAAC;IAEO,mBAAmB,CAAC,IAAiB;QACzC,OAAO;YACH,IAAI,EAAE,IAAA,4BAAiB,EAAC,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;YACjD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,0BAAW,CAAC,OAAO;YAC3B,OAAO,EAAE,0BAA0B;YACnC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;YAC3B,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE;YAC5B,UAAU,EAAE,IAAI,IAAI,EAAE;SACzB,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,KAA2B,EAAE,UAAgB;QACjE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;QAC3D,IAAI,MAAM,GAAG,eAAe,CAAC,sBAAsB;YAAE,OAAO,0BAAW,CAAC,IAAI,CAAC;QAE7E,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,sBAAsB;YAAE,OAAO,0BAAW,CAAC,OAAO,CAAC;QAChG,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW;YAAE,OAAO,0BAAW,CAAC,OAAO,CAAC;QAC/D,OAAO,0BAAW,CAAC,OAAO,CAAC;IAC/B,CAAC;IAEO,MAAM;QACV,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,IAAI,wBAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;;AA3RL,0CA4RC;AAzR2B,sCAAsB,GAAG,CAAC,AAAJ,CAAK"}
@@ -1,6 +1,7 @@
1
1
  export { ClaudeCodeAdapter } from './ClaudeCodeAdapter';
2
2
  export { CodexAdapter } from './CodexAdapter';
3
3
  export { GeminiCliAdapter } from './GeminiCliAdapter';
4
+ export { OpenCodeAdapter } from './OpenCodeAdapter';
4
5
  export { AgentStatus } from './AgentAdapter';
5
6
  export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo } from './AgentAdapter';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AgentStatus = exports.GeminiCliAdapter = exports.CodexAdapter = exports.ClaudeCodeAdapter = void 0;
3
+ exports.AgentStatus = exports.OpenCodeAdapter = exports.GeminiCliAdapter = exports.CodexAdapter = exports.ClaudeCodeAdapter = void 0;
4
4
  var ClaudeCodeAdapter_1 = require("./ClaudeCodeAdapter");
5
5
  Object.defineProperty(exports, "ClaudeCodeAdapter", { enumerable: true, get: function () { return ClaudeCodeAdapter_1.ClaudeCodeAdapter; } });
6
6
  var CodexAdapter_1 = require("./CodexAdapter");
7
7
  Object.defineProperty(exports, "CodexAdapter", { enumerable: true, get: function () { return CodexAdapter_1.CodexAdapter; } });
8
8
  var GeminiCliAdapter_1 = require("./GeminiCliAdapter");
9
9
  Object.defineProperty(exports, "GeminiCliAdapter", { enumerable: true, get: function () { return GeminiCliAdapter_1.GeminiCliAdapter; } });
10
+ var OpenCodeAdapter_1 = require("./OpenCodeAdapter");
11
+ Object.defineProperty(exports, "OpenCodeAdapter", { enumerable: true, get: function () { return OpenCodeAdapter_1.OpenCodeAdapter; } });
10
12
  var AgentAdapter_1 = require("./AgentAdapter");
11
13
  Object.defineProperty(exports, "AgentStatus", { enumerable: true, get: function () { return AgentAdapter_1.AgentStatus; } });
12
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { AgentManager } from './AgentManager';
2
2
  export { ClaudeCodeAdapter } from './adapters/ClaudeCodeAdapter';
3
3
  export { CodexAdapter } from './adapters/CodexAdapter';
4
4
  export { GeminiCliAdapter } from './adapters/GeminiCliAdapter';
5
+ export { OpenCodeAdapter } from './adapters/OpenCodeAdapter';
5
6
  export { AgentStatus } from './adapters/AgentAdapter';
6
7
  export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, } from './adapters/AgentAdapter';
7
8
  export { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getProcessTty = exports.TtyWriter = exports.TerminalType = exports.TerminalFocusManager = exports.AgentStatus = exports.GeminiCliAdapter = exports.CodexAdapter = exports.ClaudeCodeAdapter = exports.AgentManager = void 0;
3
+ exports.getProcessTty = exports.TtyWriter = exports.TerminalType = exports.TerminalFocusManager = exports.AgentStatus = exports.OpenCodeAdapter = exports.GeminiCliAdapter = exports.CodexAdapter = exports.ClaudeCodeAdapter = exports.AgentManager = void 0;
4
4
  var AgentManager_1 = require("./AgentManager");
5
5
  Object.defineProperty(exports, "AgentManager", { enumerable: true, get: function () { return AgentManager_1.AgentManager; } });
6
6
  var ClaudeCodeAdapter_1 = require("./adapters/ClaudeCodeAdapter");
@@ -9,6 +9,8 @@ var CodexAdapter_1 = require("./adapters/CodexAdapter");
9
9
  Object.defineProperty(exports, "CodexAdapter", { enumerable: true, get: function () { return CodexAdapter_1.CodexAdapter; } });
10
10
  var GeminiCliAdapter_1 = require("./adapters/GeminiCliAdapter");
11
11
  Object.defineProperty(exports, "GeminiCliAdapter", { enumerable: true, get: function () { return GeminiCliAdapter_1.GeminiCliAdapter; } });
12
+ var OpenCodeAdapter_1 = require("./adapters/OpenCodeAdapter");
13
+ Object.defineProperty(exports, "OpenCodeAdapter", { enumerable: true, get: function () { return OpenCodeAdapter_1.OpenCodeAdapter; } });
12
14
  var AgentAdapter_1 = require("./adapters/AgentAdapter");
13
15
  Object.defineProperty(exports, "AgentStatus", { enumerable: true, get: function () { return AgentAdapter_1.AgentStatus; } });
14
16
  var TerminalFocusManager_1 = require("./terminal/TerminalFocusManager");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,kEAAiE;AAAxD,sHAAA,iBAAiB,OAAA;AAC1B,wDAAuD;AAA9C,4GAAA,YAAY,OAAA;AACrB,gEAA+D;AAAtD,oHAAA,gBAAgB,OAAA;AACzB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAWpB,wEAAqF;AAA5E,4HAAA,oBAAoB,OAAA;AAAE,oHAAA,YAAY,OAAA;AAE3C,kDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAElB,2CAAgD;AAAvC,wGAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,kEAAiE;AAAxD,sHAAA,iBAAiB,OAAA;AAC1B,wDAAuD;AAA9C,4GAAA,YAAY,OAAA;AACrB,gEAA+D;AAAtD,oHAAA,gBAAgB,OAAA;AACzB,8DAA6D;AAApD,kHAAA,eAAe,OAAA;AACxB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAWpB,wEAAqF;AAA5E,4HAAA,oBAAoB,OAAA;AAAE,oHAAA,YAAY,OAAA;AAE3C,kDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAElB,2CAAgD;AAAvC,wGAAA,aAAa,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-devkit/agent-manager",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "description": "Standalone agent detection and management utilities for AI DevKit",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,7 +26,11 @@
26
26
  ],
27
27
  "author": "",
28
28
  "license": "MIT",
29
+ "dependencies": {
30
+ "better-sqlite3": "^12.6.2"
31
+ },
29
32
  "devDependencies": {
33
+ "@types/better-sqlite3": "^7.6.11",
30
34
  "@types/jest": "^30.0.0",
31
35
  "@types/node": "^20.11.5",
32
36
  "@typescript-eslint/eslint-plugin": "^6.19.1",