@chrisromp/copilot-bridge 0.6.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/bin/copilot-bridge.js +61 -0
  4. package/config.sample.json +100 -0
  5. package/dist/channels/mattermost/adapter.d.ts +55 -0
  6. package/dist/channels/mattermost/adapter.d.ts.map +1 -0
  7. package/dist/channels/mattermost/adapter.js +524 -0
  8. package/dist/channels/mattermost/adapter.js.map +1 -0
  9. package/dist/channels/mattermost/streaming.d.ts +29 -0
  10. package/dist/channels/mattermost/streaming.d.ts.map +1 -0
  11. package/dist/channels/mattermost/streaming.js +151 -0
  12. package/dist/channels/mattermost/streaming.js.map +1 -0
  13. package/dist/config.d.ts +107 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +817 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/core/bridge.d.ts +73 -0
  18. package/dist/core/bridge.d.ts.map +1 -0
  19. package/dist/core/bridge.js +166 -0
  20. package/dist/core/bridge.js.map +1 -0
  21. package/dist/core/channel-idle.d.ts +40 -0
  22. package/dist/core/channel-idle.d.ts.map +1 -0
  23. package/dist/core/channel-idle.js +120 -0
  24. package/dist/core/channel-idle.js.map +1 -0
  25. package/dist/core/command-handler.d.ts +51 -0
  26. package/dist/core/command-handler.d.ts.map +1 -0
  27. package/dist/core/command-handler.js +393 -0
  28. package/dist/core/command-handler.js.map +1 -0
  29. package/dist/core/inter-agent.d.ts +52 -0
  30. package/dist/core/inter-agent.d.ts.map +1 -0
  31. package/dist/core/inter-agent.js +179 -0
  32. package/dist/core/inter-agent.js.map +1 -0
  33. package/dist/core/onboarding.d.ts +44 -0
  34. package/dist/core/onboarding.d.ts.map +1 -0
  35. package/dist/core/onboarding.js +205 -0
  36. package/dist/core/onboarding.js.map +1 -0
  37. package/dist/core/scheduler.d.ts +38 -0
  38. package/dist/core/scheduler.d.ts.map +1 -0
  39. package/dist/core/scheduler.js +253 -0
  40. package/dist/core/scheduler.js.map +1 -0
  41. package/dist/core/session-manager.d.ts +166 -0
  42. package/dist/core/session-manager.d.ts.map +1 -0
  43. package/dist/core/session-manager.js +1732 -0
  44. package/dist/core/session-manager.js.map +1 -0
  45. package/dist/core/stream-formatter.d.ts +14 -0
  46. package/dist/core/stream-formatter.d.ts.map +1 -0
  47. package/dist/core/stream-formatter.js +198 -0
  48. package/dist/core/stream-formatter.js.map +1 -0
  49. package/dist/core/thread-utils.d.ts +22 -0
  50. package/dist/core/thread-utils.d.ts.map +1 -0
  51. package/dist/core/thread-utils.js +44 -0
  52. package/dist/core/thread-utils.js.map +1 -0
  53. package/dist/core/workspace-manager.d.ts +38 -0
  54. package/dist/core/workspace-manager.d.ts.map +1 -0
  55. package/dist/core/workspace-manager.js +230 -0
  56. package/dist/core/workspace-manager.js.map +1 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +1286 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/logger.d.ts +9 -0
  62. package/dist/logger.d.ts.map +1 -0
  63. package/dist/logger.js +34 -0
  64. package/dist/logger.js.map +1 -0
  65. package/dist/state/store.d.ts +124 -0
  66. package/dist/state/store.d.ts.map +1 -0
  67. package/dist/state/store.js +523 -0
  68. package/dist/state/store.js.map +1 -0
  69. package/dist/types.d.ts +185 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +61 -0
  74. package/scripts/check.ts +267 -0
  75. package/scripts/com.copilot-bridge.plist +41 -0
  76. package/scripts/copilot-bridge.service +30 -0
  77. package/scripts/init.ts +250 -0
  78. package/scripts/install-service.ts +123 -0
  79. package/scripts/lib/config-gen.ts +129 -0
  80. package/scripts/lib/mattermost.ts +109 -0
  81. package/scripts/lib/output.ts +69 -0
  82. package/scripts/lib/prerequisites.ts +86 -0
  83. package/scripts/lib/prompts.ts +65 -0
  84. package/scripts/lib/service.ts +191 -0
  85. package/scripts/uninstall-service.ts +90 -0
  86. package/templates/admin/AGENTS.md +325 -0
  87. package/templates/admin/MEMORY.md +4 -0
  88. package/templates/agents/AGENTS.md +97 -0
  89. package/templates/agents/MEMORY.md +4 -0
@@ -0,0 +1,523 @@
1
+ import Database from 'better-sqlite3';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import fs from 'node:fs';
5
+ const DB_PATH = path.join(os.homedir(), '.copilot-bridge', 'state.db');
6
+ let _db = null;
7
+ /** Migrate channel_prefs: drop NOT NULL on columns that should be nullable. */
8
+ function migrateChannelPrefsNullable(db) {
9
+ const cols = db.prepare("PRAGMA table_info('channel_prefs')").all();
10
+ const nullableTargets = new Set(['verbose', 'trigger_mode', 'threaded_replies', 'permission_mode']);
11
+ const needsMigration = cols.some((c) => nullableTargets.has(c.name) && c.notnull === 1);
12
+ if (!needsMigration)
13
+ return;
14
+ // Build dynamic column definitions preserving all existing columns
15
+ const columnDefs = [];
16
+ const selectExprs = [];
17
+ for (const c of cols) {
18
+ const name = c.name;
19
+ const parts = [`"${name}"`];
20
+ if (c.type)
21
+ parts.push(c.type);
22
+ if (c.pk === 1)
23
+ parts.push('PRIMARY KEY');
24
+ // Drop NOT NULL only for targeted columns; preserve for others
25
+ if (c.notnull === 1 && !nullableTargets.has(name))
26
+ parts.push('NOT NULL');
27
+ if (c.dflt_value !== null && c.dflt_value !== undefined)
28
+ parts.push(`DEFAULT ${c.dflt_value}`);
29
+ columnDefs.push(parts.join(' '));
30
+ // Ensure updated_at is non-NULL during copy
31
+ if (name === 'updated_at') {
32
+ selectExprs.push("COALESCE(updated_at, datetime('now'))");
33
+ }
34
+ else {
35
+ selectExprs.push(`"${name}"`);
36
+ }
37
+ }
38
+ // Capture existing indexes/triggers to recreate after rebuild
39
+ const schemaObjects = db.prepare("SELECT sql FROM sqlite_master WHERE tbl_name = 'channel_prefs' AND type IN ('index','trigger') AND sql IS NOT NULL").all();
40
+ const migrate = db.transaction(() => {
41
+ db.exec(`DROP TABLE IF EXISTS channel_prefs_new`);
42
+ db.exec(`CREATE TABLE channel_prefs_new (${columnDefs.join(', ')})`);
43
+ db.exec(`
44
+ INSERT INTO channel_prefs_new SELECT ${selectExprs.join(', ')} FROM channel_prefs;
45
+ DROP TABLE channel_prefs;
46
+ ALTER TABLE channel_prefs_new RENAME TO channel_prefs;
47
+ `);
48
+ for (const obj of schemaObjects) {
49
+ if (obj.sql)
50
+ db.exec(obj.sql);
51
+ }
52
+ });
53
+ migrate();
54
+ }
55
+ function getDb() {
56
+ if (_db)
57
+ return _db;
58
+ const dir = path.dirname(DB_PATH);
59
+ if (!fs.existsSync(dir)) {
60
+ fs.mkdirSync(dir, { recursive: true });
61
+ }
62
+ _db = new Database(DB_PATH);
63
+ _db.pragma('journal_mode = WAL');
64
+ _db.pragma('foreign_keys = ON');
65
+ // Create tables
66
+ _db.exec(`
67
+ CREATE TABLE IF NOT EXISTS channel_sessions (
68
+ channel_id TEXT PRIMARY KEY,
69
+ session_id TEXT NOT NULL,
70
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
71
+ );
72
+
73
+ CREATE TABLE IF NOT EXISTS channel_prefs (
74
+ channel_id TEXT PRIMARY KEY,
75
+ model TEXT,
76
+ agent TEXT,
77
+ verbose INTEGER,
78
+ trigger_mode TEXT,
79
+ threaded_replies INTEGER,
80
+ permission_mode TEXT,
81
+ reasoning_effort TEXT,
82
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
83
+ );
84
+
85
+ CREATE TABLE IF NOT EXISTS permission_rules (
86
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
87
+ scope TEXT NOT NULL DEFAULT 'global',
88
+ tool TEXT NOT NULL,
89
+ command_pattern TEXT NOT NULL DEFAULT '*',
90
+ action TEXT NOT NULL CHECK (action IN ('allow', 'deny')),
91
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
92
+ );
93
+
94
+ CREATE INDEX IF NOT EXISTS idx_perm_scope ON permission_rules(scope);
95
+ CREATE INDEX IF NOT EXISTS idx_perm_tool ON permission_rules(tool);
96
+
97
+ CREATE TABLE IF NOT EXISTS workspace_overrides (
98
+ bot_name TEXT PRIMARY KEY,
99
+ working_directory TEXT NOT NULL,
100
+ allow_paths TEXT NOT NULL DEFAULT '[]',
101
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
102
+ );
103
+
104
+ CREATE TABLE IF NOT EXISTS settings (
105
+ key TEXT PRIMARY KEY,
106
+ value TEXT NOT NULL
107
+ );
108
+
109
+ CREATE TABLE IF NOT EXISTS dynamic_channels (
110
+ channel_id TEXT PRIMARY KEY,
111
+ platform TEXT NOT NULL,
112
+ name TEXT NOT NULL DEFAULT '',
113
+ bot TEXT,
114
+ working_directory TEXT NOT NULL,
115
+ agent TEXT,
116
+ model TEXT,
117
+ trigger_mode TEXT,
118
+ threaded_replies INTEGER,
119
+ verbose INTEGER,
120
+ is_dm INTEGER NOT NULL DEFAULT 0,
121
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
122
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
123
+ );
124
+
125
+ CREATE TABLE IF NOT EXISTS agent_calls (
126
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
127
+ caller_bot TEXT NOT NULL,
128
+ target_bot TEXT NOT NULL,
129
+ target_agent TEXT,
130
+ message_summary TEXT,
131
+ response_summary TEXT,
132
+ duration_ms INTEGER,
133
+ success INTEGER NOT NULL DEFAULT 0,
134
+ error TEXT,
135
+ chain_id TEXT,
136
+ depth INTEGER DEFAULT 0,
137
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
138
+ );
139
+
140
+ CREATE INDEX IF NOT EXISTS idx_agent_calls_created ON agent_calls(created_at);
141
+ CREATE INDEX IF NOT EXISTS idx_agent_calls_chain ON agent_calls(chain_id);
142
+
143
+ CREATE TABLE IF NOT EXISTS scheduled_tasks (
144
+ id TEXT PRIMARY KEY,
145
+ channel_id TEXT NOT NULL,
146
+ bot_name TEXT NOT NULL,
147
+ prompt TEXT NOT NULL,
148
+ cron_expr TEXT,
149
+ run_at TEXT,
150
+ timezone TEXT NOT NULL DEFAULT 'UTC',
151
+ created_by TEXT,
152
+ description TEXT,
153
+ enabled INTEGER NOT NULL DEFAULT 1,
154
+ last_run TEXT,
155
+ next_run TEXT,
156
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
157
+ );
158
+
159
+ CREATE INDEX IF NOT EXISTS idx_sched_channel ON scheduled_tasks(channel_id);
160
+ CREATE INDEX IF NOT EXISTS idx_sched_enabled ON scheduled_tasks(enabled);
161
+
162
+ CREATE TABLE IF NOT EXISTS scheduled_task_history (
163
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
164
+ task_id TEXT NOT NULL,
165
+ channel_id TEXT NOT NULL,
166
+ prompt TEXT NOT NULL,
167
+ description TEXT,
168
+ timezone TEXT NOT NULL DEFAULT 'UTC',
169
+ status TEXT NOT NULL DEFAULT 'success',
170
+ fired_at TEXT NOT NULL DEFAULT (datetime('now')),
171
+ error TEXT
172
+ );
173
+
174
+ CREATE INDEX IF NOT EXISTS idx_sched_hist_task ON scheduled_task_history(task_id);
175
+ CREATE INDEX IF NOT EXISTS idx_sched_hist_channel ON scheduled_task_history(channel_id);
176
+ `);
177
+ // Migration: ensure channel_prefs columns are nullable (fixes NOT NULL constraints from older schema)
178
+ migrateChannelPrefsNullable(_db);
179
+ // Schema migrations for existing DBs
180
+ try {
181
+ _db.exec(`ALTER TABLE channel_prefs ADD COLUMN reasoning_effort TEXT`);
182
+ }
183
+ catch {
184
+ // Column already exists
185
+ }
186
+ try {
187
+ _db.exec(`ALTER TABLE scheduled_task_history ADD COLUMN timezone TEXT NOT NULL DEFAULT 'UTC'`);
188
+ }
189
+ catch {
190
+ // Column already exists
191
+ }
192
+ return _db;
193
+ }
194
+ // --- Channel Sessions ---
195
+ export function getChannelSession(channelId) {
196
+ const db = getDb();
197
+ const row = db.prepare('SELECT session_id FROM channel_sessions WHERE channel_id = ?').get(channelId);
198
+ return row?.session_id ?? null;
199
+ }
200
+ export function setChannelSession(channelId, sessionId) {
201
+ const db = getDb();
202
+ db.prepare('INSERT OR REPLACE INTO channel_sessions (channel_id, session_id, created_at) VALUES (?, ?, datetime(\'now\'))').run(channelId, sessionId);
203
+ }
204
+ export function clearChannelSession(channelId) {
205
+ const db = getDb();
206
+ db.prepare('DELETE FROM channel_sessions WHERE channel_id = ?').run(channelId);
207
+ }
208
+ export function getAllChannelSessions() {
209
+ const db = getDb();
210
+ const rows = db.prepare('SELECT channel_id, session_id FROM channel_sessions').all();
211
+ return rows.map(r => ({ channelId: r.channel_id, sessionId: r.session_id }));
212
+ }
213
+ export function getChannelPrefs(channelId) {
214
+ const db = getDb();
215
+ const row = db.prepare('SELECT * FROM channel_prefs WHERE channel_id = ?').get(channelId);
216
+ if (!row)
217
+ return null;
218
+ return {
219
+ model: row.model ?? undefined,
220
+ agent: row.agent,
221
+ verbose: row.verbose != null ? !!row.verbose : undefined,
222
+ threadedReplies: row.threaded_replies != null ? !!row.threaded_replies : undefined,
223
+ permissionMode: row.permission_mode ?? undefined,
224
+ reasoningEffort: row.reasoning_effort ?? null,
225
+ };
226
+ }
227
+ export function setChannelPrefs(channelId, prefs) {
228
+ const db = getDb();
229
+ const existing = getChannelPrefs(channelId);
230
+ if (existing) {
231
+ const updates = [];
232
+ const values = [];
233
+ if (prefs.model !== undefined) {
234
+ updates.push('model = ?');
235
+ values.push(prefs.model);
236
+ }
237
+ if (prefs.agent !== undefined) {
238
+ updates.push('agent = ?');
239
+ values.push(prefs.agent);
240
+ }
241
+ if (prefs.verbose !== undefined) {
242
+ updates.push('verbose = ?');
243
+ values.push(prefs.verbose ? 1 : 0);
244
+ }
245
+ if (prefs.threadedReplies !== undefined) {
246
+ updates.push('threaded_replies = ?');
247
+ values.push(prefs.threadedReplies ? 1 : 0);
248
+ }
249
+ if (prefs.permissionMode !== undefined) {
250
+ updates.push('permission_mode = ?');
251
+ values.push(prefs.permissionMode);
252
+ }
253
+ if (prefs.reasoningEffort !== undefined) {
254
+ updates.push('reasoning_effort = ?');
255
+ values.push(prefs.reasoningEffort);
256
+ }
257
+ if (updates.length > 0) {
258
+ updates.push("updated_at = datetime('now')");
259
+ values.push(channelId);
260
+ db.prepare(`UPDATE channel_prefs SET ${updates.join(', ')} WHERE channel_id = ?`).run(...values);
261
+ }
262
+ }
263
+ else {
264
+ db.prepare(`INSERT INTO channel_prefs (channel_id, model, agent, verbose, threaded_replies, permission_mode, reasoning_effort)
265
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(channelId, prefs.model ?? null, prefs.agent ?? null, prefs.verbose != null ? (prefs.verbose ? 1 : 0) : null, prefs.threadedReplies != null ? (prefs.threadedReplies ? 1 : 0) : null, prefs.permissionMode ?? null, prefs.reasoningEffort ?? null);
266
+ }
267
+ }
268
+ export function getPermissionRules(scope, tool) {
269
+ const db = getDb();
270
+ const rows = db.prepare('SELECT * FROM permission_rules WHERE (scope = ? OR scope = \'global\') AND tool = ? ORDER BY scope DESC, id DESC').all(scope, tool);
271
+ return rows.map(r => ({
272
+ id: r.id,
273
+ scope: r.scope,
274
+ tool: r.tool,
275
+ commandPattern: r.command_pattern,
276
+ action: r.action,
277
+ createdAt: r.created_at,
278
+ }));
279
+ }
280
+ export function addPermissionRule(scope, tool, commandPattern, action) {
281
+ const db = getDb();
282
+ // Remove existing rule for same scope+tool+pattern before inserting
283
+ db.prepare('DELETE FROM permission_rules WHERE scope = ? AND tool = ? AND command_pattern = ?').run(scope, tool, commandPattern);
284
+ db.prepare('INSERT INTO permission_rules (scope, tool, command_pattern, action) VALUES (?, ?, ?, ?)').run(scope, tool, commandPattern, action);
285
+ }
286
+ export function clearPermissionRules(scope) {
287
+ const db = getDb();
288
+ db.prepare('DELETE FROM permission_rules WHERE scope = ?').run(scope);
289
+ }
290
+ /** Remove a specific permission rule by scope + tool + command_pattern. */
291
+ export function removePermissionRule(scope, tool, commandPattern) {
292
+ const db = getDb();
293
+ const result = db.prepare('DELETE FROM permission_rules WHERE scope = ? AND tool = ? AND command_pattern = ?').run(scope, tool, commandPattern);
294
+ return result.changes > 0;
295
+ }
296
+ /** List all permission rules for a scope. */
297
+ export function listPermissionRulesForScope(scope) {
298
+ const db = getDb();
299
+ const rows = db.prepare('SELECT * FROM permission_rules WHERE scope = ? ORDER BY tool, command_pattern').all(scope);
300
+ return rows.map(r => ({
301
+ id: r.id,
302
+ scope: r.scope,
303
+ tool: r.tool,
304
+ commandPattern: r.command_pattern,
305
+ action: r.action,
306
+ createdAt: r.created_at,
307
+ }));
308
+ }
309
+ /**
310
+ * Check if a tool+command is allowed by existing rules.
311
+ * Returns 'allow', 'deny', or null (no matching rule — need to ask).
312
+ */
313
+ export function checkPermission(scope, tool, command) {
314
+ const rules = getPermissionRules(scope, tool);
315
+ for (const rule of rules) {
316
+ // Exact match or wildcard
317
+ if (rule.commandPattern === '*' || rule.commandPattern === command) {
318
+ return rule.action;
319
+ }
320
+ }
321
+ return null;
322
+ }
323
+ function safeParseAllowPaths(raw) {
324
+ try {
325
+ const parsed = JSON.parse(raw);
326
+ return Array.isArray(parsed) ? parsed : [];
327
+ }
328
+ catch {
329
+ return [];
330
+ }
331
+ }
332
+ export function getWorkspaceOverride(botName) {
333
+ const db = getDb();
334
+ const row = db.prepare('SELECT * FROM workspace_overrides WHERE bot_name = ?').get(botName);
335
+ if (!row)
336
+ return null;
337
+ return {
338
+ botName: row.bot_name,
339
+ workingDirectory: row.working_directory,
340
+ allowPaths: safeParseAllowPaths(row.allow_paths),
341
+ createdAt: row.created_at,
342
+ };
343
+ }
344
+ export function setWorkspaceOverride(botName, workingDirectory, allowPaths) {
345
+ const db = getDb();
346
+ db.prepare(`INSERT INTO workspace_overrides (bot_name, working_directory, allow_paths, created_at)
347
+ VALUES (?, ?, ?, datetime('now'))
348
+ ON CONFLICT(bot_name) DO UPDATE SET
349
+ working_directory = excluded.working_directory,
350
+ allow_paths = excluded.allow_paths`).run(botName, workingDirectory, JSON.stringify(allowPaths ?? []));
351
+ }
352
+ export function removeWorkspaceOverride(botName) {
353
+ const db = getDb();
354
+ db.prepare('DELETE FROM workspace_overrides WHERE bot_name = ?').run(botName);
355
+ }
356
+ export function listWorkspaceOverrides() {
357
+ const db = getDb();
358
+ const rows = db.prepare('SELECT * FROM workspace_overrides').all();
359
+ return rows.map(row => ({
360
+ botName: row.bot_name,
361
+ workingDirectory: row.working_directory,
362
+ allowPaths: safeParseAllowPaths(row.allow_paths),
363
+ createdAt: row.created_at,
364
+ }));
365
+ }
366
+ // --- Global Settings ---
367
+ export function getGlobalSetting(key) {
368
+ const db = getDb();
369
+ const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key);
370
+ return row?.value ?? null;
371
+ }
372
+ export function setGlobalSetting(key, value) {
373
+ const db = getDb();
374
+ db.prepare(`INSERT INTO settings (key, value) VALUES (?, ?)
375
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(key, value);
376
+ }
377
+ export function addDynamicChannel(channel) {
378
+ const db = getDb();
379
+ db.prepare(`INSERT INTO dynamic_channels (channel_id, platform, name, bot, working_directory, agent, model, trigger_mode, threaded_replies, verbose, is_dm)
380
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
381
+ ON CONFLICT(channel_id) DO UPDATE SET
382
+ platform = excluded.platform, name = excluded.name, bot = excluded.bot,
383
+ working_directory = excluded.working_directory, agent = excluded.agent,
384
+ model = excluded.model, trigger_mode = excluded.trigger_mode,
385
+ threaded_replies = excluded.threaded_replies, verbose = excluded.verbose,
386
+ is_dm = excluded.is_dm, updated_at = datetime('now')`).run(channel.channelId, channel.platform, channel.name ?? '', channel.bot ?? null, channel.workingDirectory, channel.agent ?? null, channel.model ?? null, channel.triggerMode ?? null, channel.threadedReplies != null ? (channel.threadedReplies ? 1 : 0) : null, channel.verbose != null ? (channel.verbose ? 1 : 0) : null, channel.isDM ? 1 : 0);
387
+ }
388
+ export function removeDynamicChannel(channelId) {
389
+ const db = getDb();
390
+ db.prepare('DELETE FROM dynamic_channels WHERE channel_id = ?').run(channelId);
391
+ }
392
+ export function getDynamicChannel(channelId) {
393
+ const db = getDb();
394
+ const row = db.prepare('SELECT * FROM dynamic_channels WHERE channel_id = ?').get(channelId);
395
+ if (!row)
396
+ return null;
397
+ return mapDynamicChannelRow(row);
398
+ }
399
+ export function getDynamicChannels() {
400
+ const db = getDb();
401
+ const rows = db.prepare('SELECT * FROM dynamic_channels ORDER BY created_at').all();
402
+ return rows.map(mapDynamicChannelRow);
403
+ }
404
+ function mapDynamicChannelRow(row) {
405
+ return {
406
+ channelId: row.channel_id,
407
+ platform: row.platform,
408
+ name: row.name,
409
+ bot: row.bot ?? undefined,
410
+ workingDirectory: row.working_directory,
411
+ agent: row.agent,
412
+ model: row.model ?? undefined,
413
+ triggerMode: row.trigger_mode,
414
+ threadedReplies: row.threaded_replies != null ? !!row.threaded_replies : undefined,
415
+ verbose: row.verbose != null ? !!row.verbose : undefined,
416
+ isDM: !!row.is_dm,
417
+ createdAt: row.created_at,
418
+ updatedAt: row.updated_at,
419
+ };
420
+ }
421
+ export function recordAgentCall(record) {
422
+ const db = getDb();
423
+ db.prepare(`INSERT INTO agent_calls (caller_bot, target_bot, target_agent, message_summary, response_summary, duration_ms, success, error, chain_id, depth)
424
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(record.callerBot, record.targetBot, record.targetAgent ?? null, record.messageSummary ?? null, record.responseSummary ?? null, record.durationMs ?? null, record.success ? 1 : 0, record.error ?? null, record.chainId ?? null, record.depth ?? 0);
425
+ }
426
+ export function getRecentAgentCalls(limit = 20) {
427
+ const db = getDb();
428
+ const rows = db.prepare('SELECT * FROM agent_calls ORDER BY created_at DESC LIMIT ?').all(limit);
429
+ return rows.map(r => ({
430
+ id: r.id,
431
+ callerBot: r.caller_bot,
432
+ targetBot: r.target_bot,
433
+ targetAgent: r.target_agent ?? undefined,
434
+ messageSummary: r.message_summary ?? undefined,
435
+ responseSummary: r.response_summary ?? undefined,
436
+ durationMs: r.duration_ms ?? undefined,
437
+ success: !!r.success,
438
+ error: r.error ?? undefined,
439
+ chainId: r.chain_id ?? undefined,
440
+ depth: r.depth ?? 0,
441
+ createdAt: r.created_at,
442
+ }));
443
+ }
444
+ export function insertScheduledTask(task) {
445
+ const db = getDb();
446
+ db.prepare(`
447
+ INSERT INTO scheduled_tasks (id, channel_id, bot_name, prompt, cron_expr, run_at, timezone, created_by, description, enabled, next_run)
448
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
449
+ `).run(task.id, task.channelId, task.botName, task.prompt, task.cronExpr ?? null, task.runAt ?? null, task.timezone, task.createdBy ?? null, task.description ?? null, task.enabled ? 1 : 0, task.nextRun ?? null);
450
+ }
451
+ export function getScheduledTask(id) {
452
+ const db = getDb();
453
+ const row = db.prepare('SELECT * FROM scheduled_tasks WHERE id = ?').get(id);
454
+ return row ? mapTaskRow(row) : null;
455
+ }
456
+ export function getScheduledTasksForChannel(channelId) {
457
+ const db = getDb();
458
+ // Show enabled tasks + paused recurring tasks (exclude disabled one-offs — they're finished)
459
+ const rows = db.prepare('SELECT * FROM scheduled_tasks WHERE channel_id = ? AND (enabled = 1 OR cron_expr IS NOT NULL) ORDER BY created_at DESC').all(channelId);
460
+ return rows.map(mapTaskRow);
461
+ }
462
+ export function getEnabledScheduledTasks() {
463
+ const db = getDb();
464
+ const rows = db.prepare('SELECT * FROM scheduled_tasks WHERE enabled = 1').all();
465
+ return rows.map(mapTaskRow);
466
+ }
467
+ export function updateScheduledTaskEnabled(id, enabled) {
468
+ const db = getDb();
469
+ db.prepare('UPDATE scheduled_tasks SET enabled = ? WHERE id = ?').run(enabled ? 1 : 0, id);
470
+ }
471
+ export function updateScheduledTaskLastRun(id, lastRun, nextRun) {
472
+ const db = getDb();
473
+ db.prepare('UPDATE scheduled_tasks SET last_run = ?, next_run = ? WHERE id = ?').run(lastRun, nextRun ?? null, id);
474
+ }
475
+ export function deleteScheduledTask(id) {
476
+ const db = getDb();
477
+ db.prepare('DELETE FROM scheduled_tasks WHERE id = ?').run(id);
478
+ }
479
+ function mapTaskRow(r) {
480
+ return {
481
+ id: r.id,
482
+ channelId: r.channel_id,
483
+ botName: r.bot_name,
484
+ prompt: r.prompt,
485
+ cronExpr: r.cron_expr ?? undefined,
486
+ runAt: r.run_at ?? undefined,
487
+ timezone: r.timezone,
488
+ createdBy: r.created_by ?? undefined,
489
+ description: r.description ?? undefined,
490
+ enabled: !!r.enabled,
491
+ lastRun: r.last_run ?? undefined,
492
+ nextRun: r.next_run ?? undefined,
493
+ createdAt: r.created_at,
494
+ };
495
+ }
496
+ export function insertTaskHistory(entry) {
497
+ const db = getDb();
498
+ db.prepare(`
499
+ INSERT INTO scheduled_task_history (task_id, channel_id, prompt, description, timezone, status, fired_at, error)
500
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'), ?)
501
+ `).run(entry.taskId, entry.channelId, entry.prompt, entry.description ?? null, entry.timezone, entry.status, entry.error ?? null);
502
+ }
503
+ export function getTaskHistory(channelId, limit = 20) {
504
+ const db = getDb();
505
+ const rows = db.prepare('SELECT * FROM scheduled_task_history WHERE channel_id = ? ORDER BY fired_at DESC LIMIT ?').all(channelId, limit);
506
+ return rows.map(r => ({
507
+ id: r.id,
508
+ taskId: r.task_id,
509
+ channelId: r.channel_id,
510
+ prompt: r.prompt,
511
+ description: r.description ?? undefined,
512
+ timezone: r.timezone ?? 'UTC',
513
+ status: r.status,
514
+ firedAt: r.fired_at,
515
+ error: r.error ?? undefined,
516
+ }));
517
+ }
518
+ // --- Cleanup ---
519
+ export function closeDb() {
520
+ _db?.close();
521
+ _db = null;
522
+ }
523
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"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"}