beecork 1.7.1 → 2.0.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/README.md +52 -111
- package/dist/index.js +1394 -581
- package/package.json +26 -54
- package/dist/capabilities/index.d.ts +0 -3
- package/dist/capabilities/index.js +0 -2
- package/dist/capabilities/manager.d.ts +0 -13
- package/dist/capabilities/manager.js +0 -115
- package/dist/capabilities/packs.d.ts +0 -2
- package/dist/capabilities/packs.js +0 -54
- package/dist/capabilities/types.d.ts +0 -21
- package/dist/capabilities/types.js +0 -1
- package/dist/channels/admin.d.ts +0 -10
- package/dist/channels/admin.js +0 -20
- package/dist/channels/command-handler.d.ts +0 -19
- package/dist/channels/command-handler.js +0 -235
- package/dist/channels/discord.d.ts +0 -17
- package/dist/channels/discord.js +0 -266
- package/dist/channels/index.d.ts +0 -7
- package/dist/channels/index.js +0 -6
- package/dist/channels/loader.d.ts +0 -7
- package/dist/channels/loader.js +0 -87
- package/dist/channels/pipeline.d.ts +0 -50
- package/dist/channels/pipeline.js +0 -92
- package/dist/channels/registry.d.ts +0 -36
- package/dist/channels/registry.js +0 -80
- package/dist/channels/send-helpers.d.ts +0 -19
- package/dist/channels/send-helpers.js +0 -21
- package/dist/channels/telegram.d.ts +0 -47
- package/dist/channels/telegram.js +0 -649
- package/dist/channels/types.d.ts +0 -41
- package/dist/channels/types.js +0 -1
- package/dist/channels/voice-state.d.ts +0 -29
- package/dist/channels/voice-state.js +0 -45
- package/dist/channels/webhook.d.ts +0 -16
- package/dist/channels/webhook.js +0 -222
- package/dist/channels/whatsapp.d.ts +0 -28
- package/dist/channels/whatsapp.js +0 -323
- package/dist/cli/capabilities.d.ts +0 -3
- package/dist/cli/capabilities.js +0 -72
- package/dist/cli/channel.d.ts +0 -3
- package/dist/cli/channel.js +0 -202
- package/dist/cli/commands.d.ts +0 -15
- package/dist/cli/commands.js +0 -279
- package/dist/cli/doctor.d.ts +0 -1
- package/dist/cli/doctor.js +0 -208
- package/dist/cli/handoff.d.ts +0 -8
- package/dist/cli/handoff.js +0 -33
- package/dist/cli/helpers.d.ts +0 -2
- package/dist/cli/helpers.js +0 -21
- package/dist/cli/mcp.d.ts +0 -3
- package/dist/cli/mcp.js +0 -47
- package/dist/cli/media.d.ts +0 -2
- package/dist/cli/media.js +0 -125
- package/dist/cli/setup.d.ts +0 -1
- package/dist/cli/setup.js +0 -239
- package/dist/cli/store.d.ts +0 -3
- package/dist/cli/store.js +0 -108
- package/dist/config.d.ts +0 -11
- package/dist/config.js +0 -115
- package/dist/cron/scheduler.d.ts +0 -22
- package/dist/cron/scheduler.js +0 -220
- package/dist/cron/store.d.ts +0 -12
- package/dist/cron/store.js +0 -83
- package/dist/daemon.d.ts +0 -1
- package/dist/daemon.js +0 -345
- package/dist/dashboard/html.d.ts +0 -1
- package/dist/dashboard/html.js +0 -849
- package/dist/dashboard/routes.d.ts +0 -17
- package/dist/dashboard/routes.js +0 -623
- package/dist/dashboard/server.d.ts +0 -1
- package/dist/dashboard/server.js +0 -104
- package/dist/db/connection.d.ts +0 -29
- package/dist/db/connection.js +0 -37
- package/dist/db/index.d.ts +0 -14
- package/dist/db/index.js +0 -127
- package/dist/db/migrations.d.ts +0 -2
- package/dist/db/migrations.js +0 -384
- package/dist/delegation/manager.d.ts +0 -18
- package/dist/delegation/manager.js +0 -89
- package/dist/index.d.ts +0 -2
- package/dist/knowledge/index.d.ts +0 -2
- package/dist/knowledge/index.js +0 -1
- package/dist/knowledge/manager.d.ts +0 -17
- package/dist/knowledge/manager.js +0 -160
- package/dist/knowledge/types.d.ts +0 -7
- package/dist/knowledge/types.js +0 -1
- package/dist/machines/forwarder.d.ts +0 -7
- package/dist/machines/forwarder.js +0 -35
- package/dist/machines/index.d.ts +0 -1
- package/dist/machines/index.js +0 -1
- package/dist/machines/registry.d.ts +0 -15
- package/dist/machines/registry.js +0 -46
- package/dist/mcp/handlers.d.ts +0 -37
- package/dist/mcp/handlers.js +0 -520
- package/dist/mcp/server.d.ts +0 -2
- package/dist/mcp/server.js +0 -86
- package/dist/mcp/tool-definitions.d.ts +0 -1225
- package/dist/mcp/tool-definitions.js +0 -412
- package/dist/mcp/validate.d.ts +0 -23
- package/dist/mcp/validate.js +0 -65
- package/dist/media/factory.d.ts +0 -6
- package/dist/media/factory.js +0 -36
- package/dist/media/generators/dall-e.d.ts +0 -10
- package/dist/media/generators/dall-e.js +0 -41
- package/dist/media/generators/elevenlabs-music.d.ts +0 -9
- package/dist/media/generators/elevenlabs-music.js +0 -34
- package/dist/media/generators/elevenlabs-sfx.d.ts +0 -9
- package/dist/media/generators/elevenlabs-sfx.js +0 -33
- package/dist/media/generators/kling.d.ts +0 -9
- package/dist/media/generators/kling.js +0 -47
- package/dist/media/generators/lyria.d.ts +0 -10
- package/dist/media/generators/lyria.js +0 -41
- package/dist/media/generators/nano-banana.d.ts +0 -10
- package/dist/media/generators/nano-banana.js +0 -45
- package/dist/media/generators/poll-util.d.ts +0 -12
- package/dist/media/generators/poll-util.js +0 -22
- package/dist/media/generators/recraft.d.ts +0 -9
- package/dist/media/generators/recraft.js +0 -52
- package/dist/media/generators/runway.d.ts +0 -9
- package/dist/media/generators/runway.js +0 -49
- package/dist/media/generators/stable-diffusion.d.ts +0 -9
- package/dist/media/generators/stable-diffusion.js +0 -35
- package/dist/media/generators/veo.d.ts +0 -9
- package/dist/media/generators/veo.js +0 -32
- package/dist/media/index.d.ts +0 -6
- package/dist/media/index.js +0 -8
- package/dist/media/loader.d.ts +0 -8
- package/dist/media/loader.js +0 -46
- package/dist/media/store.d.ts +0 -17
- package/dist/media/store.js +0 -69
- package/dist/media/types.d.ts +0 -43
- package/dist/media/types.js +0 -1
- package/dist/memory/extractor.d.ts +0 -5
- package/dist/memory/extractor.js +0 -157
- package/dist/notifications/index.d.ts +0 -4
- package/dist/notifications/index.js +0 -21
- package/dist/notifications/ntfy.d.ts +0 -9
- package/dist/notifications/ntfy.js +0 -25
- package/dist/notifications/pushover.d.ts +0 -9
- package/dist/notifications/pushover.js +0 -26
- package/dist/notifications/types.d.ts +0 -5
- package/dist/notifications/types.js +0 -1
- package/dist/notifications/webhook-provider.d.ts +0 -9
- package/dist/notifications/webhook-provider.js +0 -24
- package/dist/observability/analytics.d.ts +0 -30
- package/dist/observability/analytics.js +0 -118
- package/dist/pipe/anthropic-client.d.ts +0 -9
- package/dist/pipe/anthropic-client.js +0 -50
- package/dist/pipe/brain.d.ts +0 -16
- package/dist/pipe/brain.js +0 -89
- package/dist/pipe/memory-store.d.ts +0 -8
- package/dist/pipe/memory-store.js +0 -39
- package/dist/pipe/project-scanner.d.ts +0 -6
- package/dist/pipe/project-scanner.js +0 -26
- package/dist/pipe/types.d.ts +0 -34
- package/dist/pipe/types.js +0 -1
- package/dist/projects/index.d.ts +0 -4
- package/dist/projects/index.js +0 -2
- package/dist/projects/manager.d.ts +0 -13
- package/dist/projects/manager.js +0 -166
- package/dist/projects/router.d.ts +0 -17
- package/dist/projects/router.js +0 -246
- package/dist/projects/types.d.ts +0 -19
- package/dist/projects/types.js +0 -1
- package/dist/service/install.d.ts +0 -4
- package/dist/service/install.js +0 -146
- package/dist/service/templates.d.ts +0 -4
- package/dist/service/templates.js +0 -52
- package/dist/service/windows.d.ts +0 -8
- package/dist/service/windows.js +0 -59
- package/dist/session/budget-guard.d.ts +0 -20
- package/dist/session/budget-guard.js +0 -31
- package/dist/session/circuit-breaker.d.ts +0 -19
- package/dist/session/circuit-breaker.js +0 -91
- package/dist/session/context-compactor.d.ts +0 -32
- package/dist/session/context-compactor.js +0 -45
- package/dist/session/context-monitor.d.ts +0 -15
- package/dist/session/context-monitor.js +0 -44
- package/dist/session/handoff.d.ts +0 -21
- package/dist/session/handoff.js +0 -50
- package/dist/session/manager.d.ts +0 -60
- package/dist/session/manager.js +0 -416
- package/dist/session/memory-store.d.ts +0 -29
- package/dist/session/memory-store.js +0 -45
- package/dist/session/message-queue.d.ts +0 -28
- package/dist/session/message-queue.js +0 -52
- package/dist/session/pending-dispatcher.d.ts +0 -31
- package/dist/session/pending-dispatcher.js +0 -120
- package/dist/session/pending-store.d.ts +0 -60
- package/dist/session/pending-store.js +0 -118
- package/dist/session/stale-session.d.ts +0 -31
- package/dist/session/stale-session.js +0 -45
- package/dist/session/subprocess.d.ts +0 -32
- package/dist/session/subprocess.js +0 -230
- package/dist/session/tab-store.d.ts +0 -28
- package/dist/session/tab-store.js +0 -78
- package/dist/session/tool-classifier.d.ts +0 -4
- package/dist/session/tool-classifier.js +0 -56
- package/dist/tasks/scheduler.d.ts +0 -45
- package/dist/tasks/scheduler.js +0 -329
- package/dist/tasks/store.d.ts +0 -11
- package/dist/tasks/store.js +0 -103
- package/dist/timeline/index.d.ts +0 -3
- package/dist/timeline/index.js +0 -2
- package/dist/timeline/logger.d.ts +0 -8
- package/dist/timeline/logger.js +0 -11
- package/dist/timeline/query.d.ts +0 -11
- package/dist/timeline/query.js +0 -67
- package/dist/timeline/types.d.ts +0 -12
- package/dist/timeline/types.js +0 -1
- package/dist/types.d.ts +0 -225
- package/dist/types.js +0 -3
- package/dist/users/index.d.ts +0 -2
- package/dist/users/index.js +0 -1
- package/dist/users/service.d.ts +0 -17
- package/dist/users/service.js +0 -46
- package/dist/util/auto-heal.d.ts +0 -43
- package/dist/util/auto-heal.js +0 -107
- package/dist/util/install-info.d.ts +0 -37
- package/dist/util/install-info.js +0 -80
- package/dist/util/logger.d.ts +0 -18
- package/dist/util/logger.js +0 -118
- package/dist/util/paths.d.ts +0 -13
- package/dist/util/paths.js +0 -55
- package/dist/util/platform.d.ts +0 -2
- package/dist/util/platform.js +0 -11
- package/dist/util/progress.d.ts +0 -34
- package/dist/util/progress.js +0 -133
- package/dist/util/rate-limiter.d.ts +0 -14
- package/dist/util/rate-limiter.js +0 -50
- package/dist/util/retry.d.ts +0 -2
- package/dist/util/retry.js +0 -18
- package/dist/util/text.d.ts +0 -32
- package/dist/util/text.js +0 -101
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -4
- package/dist/voice/index.d.ts +0 -17
- package/dist/voice/index.js +0 -42
- package/dist/voice/stt.d.ts +0 -16
- package/dist/voice/stt.js +0 -57
- package/dist/voice/tts.d.ts +0 -23
- package/dist/voice/tts.js +0 -84
- package/dist/watchers/evaluator.d.ts +0 -5
- package/dist/watchers/evaluator.js +0 -45
- package/dist/watchers/index.d.ts +0 -4
- package/dist/watchers/index.js +0 -3
- package/dist/watchers/scheduler.d.ts +0 -20
- package/dist/watchers/scheduler.js +0 -183
- package/dist/watchers/store.d.ts +0 -10
- package/dist/watchers/store.js +0 -56
- package/dist/watchers/types.d.ts +0 -15
- package/dist/watchers/types.js +0 -1
- package/scripts/postinstall.mjs +0 -50
package/dist/dashboard/server.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import http from 'node:http';
|
|
2
|
-
import crypto from 'node:crypto';
|
|
3
|
-
import { execFile } from 'node:child_process';
|
|
4
|
-
import { platform } from 'node:os';
|
|
5
|
-
import { getDashboardHtml } from './html.js';
|
|
6
|
-
import { logger } from '../util/logger.js';
|
|
7
|
-
import { dispatch, json } from './routes.js';
|
|
8
|
-
function safeEqualToken(provided, expected) {
|
|
9
|
-
if (!provided)
|
|
10
|
-
return false;
|
|
11
|
-
const a = Buffer.from(provided);
|
|
12
|
-
const b = Buffer.from(expected);
|
|
13
|
-
if (a.length !== b.length)
|
|
14
|
-
return false;
|
|
15
|
-
try {
|
|
16
|
-
return crypto.timingSafeEqual(a, b);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function openBrowser(url) {
|
|
23
|
-
const p = platform();
|
|
24
|
-
if (p === 'darwin')
|
|
25
|
-
execFile('open', [url]);
|
|
26
|
-
else if (p === 'win32')
|
|
27
|
-
execFile('cmd', ['/c', 'start', url]);
|
|
28
|
-
else
|
|
29
|
-
execFile('xdg-open', [url]);
|
|
30
|
-
}
|
|
31
|
-
const SECURITY_HEADERS = {
|
|
32
|
-
'X-Frame-Options': 'DENY',
|
|
33
|
-
'X-Content-Type-Options': 'nosniff',
|
|
34
|
-
'Referrer-Policy': 'no-referrer',
|
|
35
|
-
};
|
|
36
|
-
export function startDashboardServer(port = 0) {
|
|
37
|
-
// Generate auth token at server start (24 random bytes → 192-bit base64url).
|
|
38
|
-
const authToken = crypto.randomBytes(24).toString('base64url');
|
|
39
|
-
const server = http.createServer(async (req, res) => {
|
|
40
|
-
const url = new URL(req.url || '/', `http://localhost`);
|
|
41
|
-
const path = url.pathname;
|
|
42
|
-
// Serve HTML
|
|
43
|
-
if (path === '/' || path === '/index.html') {
|
|
44
|
-
const token = url.searchParams.get('token');
|
|
45
|
-
if (!token) {
|
|
46
|
-
res.writeHead(302, { Location: `/?token=${authToken}` });
|
|
47
|
-
res.end();
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
if (!safeEqualToken(token, authToken)) {
|
|
51
|
-
res.writeHead(403, { 'Content-Type': 'text/plain', ...SECURITY_HEADERS });
|
|
52
|
-
res.end('Forbidden');
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
res.writeHead(200, {
|
|
56
|
-
'Content-Type': 'text/html',
|
|
57
|
-
...SECURITY_HEADERS,
|
|
58
|
-
'Set-Cookie': `beecork_dash=${authToken}; HttpOnly; SameSite=Strict; Path=/`,
|
|
59
|
-
});
|
|
60
|
-
res.end(getDashboardHtml(authToken));
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
// Auth check for API routes (constant-time compare)
|
|
64
|
-
if (path.startsWith('/api/')) {
|
|
65
|
-
const authHeader = req.headers.authorization;
|
|
66
|
-
const queryToken = url.searchParams.get('token');
|
|
67
|
-
const cookieToken = req.headers.cookie
|
|
68
|
-
?.split(';')
|
|
69
|
-
.map((c) => c.trim())
|
|
70
|
-
.find((c) => c.startsWith('beecork_dash='))
|
|
71
|
-
?.split('=')[1];
|
|
72
|
-
const providedToken = authHeader?.replace('Bearer ', '') || queryToken || cookieToken;
|
|
73
|
-
if (!safeEqualToken(providedToken, authToken)) {
|
|
74
|
-
json(res, { error: 'Unauthorized' }, 401);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
const route = dispatch(req.method || 'GET', path);
|
|
80
|
-
if (!route) {
|
|
81
|
-
json(res, { error: 'Not found' }, 404);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
await route.handler({ req, res, url, path });
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
logger.error('Dashboard error:', err);
|
|
88
|
-
json(res, { error: 'Internal server error' }, 500);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
server.listen(port, '127.0.0.1', () => {
|
|
92
|
-
const addr = server.address();
|
|
93
|
-
if (addr && typeof addr === 'object') {
|
|
94
|
-
const url = `http://localhost:${addr.port}?token=${authToken}`;
|
|
95
|
-
console.log(`\nBeecork Dashboard: ${url}\n`);
|
|
96
|
-
console.log('Press Ctrl+C to stop.\n');
|
|
97
|
-
openBrowser(url);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
process.on('SIGINT', () => {
|
|
101
|
-
server.close();
|
|
102
|
-
process.exit(0);
|
|
103
|
-
});
|
|
104
|
-
}
|
package/dist/db/connection.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Single source of truth for opening the Beecork SQLite database.
|
|
3
|
-
*
|
|
4
|
-
* Previously three sites each opened the DB with their own pragma setup:
|
|
5
|
-
* - daemon side (db/index.ts) — applied migrations + WAL checkpoint interval
|
|
6
|
-
* - MCP side (mcp/server.ts) — read-only-ish singleton, no migrations
|
|
7
|
-
* - doctor (cli/doctor.ts) — ad-hoc read-only handle
|
|
8
|
-
*
|
|
9
|
-
* The pragmas matched today but the duplication was silent-drift bait. This
|
|
10
|
-
* helper centralizes pragma setup so future tweaks land in one place.
|
|
11
|
-
*/
|
|
12
|
-
import Database from 'better-sqlite3';
|
|
13
|
-
export interface OpenDbOptions {
|
|
14
|
-
/** Open the file read-only (used by `beecork doctor` for status snapshots). */
|
|
15
|
-
readonly?: boolean;
|
|
16
|
-
/**
|
|
17
|
-
* If true, restrict file mode to 0o600 after open. Daemon side wants this;
|
|
18
|
-
* read-only sidecar handles don't need to retouch perms.
|
|
19
|
-
*/
|
|
20
|
-
enforcePerms?: boolean;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Open a Beecork SQLite database with consistent pragmas.
|
|
24
|
-
*
|
|
25
|
-
* Migrations are NOT applied here — the daemon's `getDb()` runs migrations
|
|
26
|
-
* separately, so this helper can be reused by the MCP child + doctor without
|
|
27
|
-
* accidentally double-applying migrations.
|
|
28
|
-
*/
|
|
29
|
-
export declare function openDb(dbPath: string, opts?: OpenDbOptions): Database.Database;
|
package/dist/db/connection.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Single source of truth for opening the Beecork SQLite database.
|
|
3
|
-
*
|
|
4
|
-
* Previously three sites each opened the DB with their own pragma setup:
|
|
5
|
-
* - daemon side (db/index.ts) — applied migrations + WAL checkpoint interval
|
|
6
|
-
* - MCP side (mcp/server.ts) — read-only-ish singleton, no migrations
|
|
7
|
-
* - doctor (cli/doctor.ts) — ad-hoc read-only handle
|
|
8
|
-
*
|
|
9
|
-
* The pragmas matched today but the duplication was silent-drift bait. This
|
|
10
|
-
* helper centralizes pragma setup so future tweaks land in one place.
|
|
11
|
-
*/
|
|
12
|
-
import Database from 'better-sqlite3';
|
|
13
|
-
import fs from 'node:fs';
|
|
14
|
-
/**
|
|
15
|
-
* Open a Beecork SQLite database with consistent pragmas.
|
|
16
|
-
*
|
|
17
|
-
* Migrations are NOT applied here — the daemon's `getDb()` runs migrations
|
|
18
|
-
* separately, so this helper can be reused by the MCP child + doctor without
|
|
19
|
-
* accidentally double-applying migrations.
|
|
20
|
-
*/
|
|
21
|
-
export function openDb(dbPath, opts = {}) {
|
|
22
|
-
const db = new Database(dbPath, opts.readonly ? { readonly: true } : undefined);
|
|
23
|
-
db.pragma('journal_mode = WAL');
|
|
24
|
-
db.pragma('foreign_keys = ON');
|
|
25
|
-
db.pragma('busy_timeout = 5000');
|
|
26
|
-
if (opts.enforcePerms && !opts.readonly) {
|
|
27
|
-
for (const p of [dbPath, dbPath + '-wal', dbPath + '-shm']) {
|
|
28
|
-
try {
|
|
29
|
-
fs.chmodSync(p, 0o600);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
/* sidecar may not exist yet */
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return db;
|
|
37
|
-
}
|
package/dist/db/index.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
export declare function getDb(): Database.Database;
|
|
3
|
-
export interface CreateTabOptions {
|
|
4
|
-
name: string;
|
|
5
|
-
workingDir?: string;
|
|
6
|
-
systemPrompt?: string | null;
|
|
7
|
-
}
|
|
8
|
-
/** Shared tab record creation — used by dashboard, MCP, and TabManager */
|
|
9
|
-
export declare function createTabRecord(db: Database.Database, opts: CreateTabOptions): {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
created: boolean;
|
|
13
|
-
};
|
|
14
|
-
export declare function closeDb(): void;
|
package/dist/db/index.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { getDbPath, ensureBeecorkDirs, expandHome } from '../util/paths.js';
|
|
5
|
-
import { runMigrations } from './migrations.js';
|
|
6
|
-
import { openDb } from './connection.js';
|
|
7
|
-
import { logger } from '../util/logger.js';
|
|
8
|
-
const SCHEMA = `
|
|
9
|
-
CREATE TABLE IF NOT EXISTS tabs (
|
|
10
|
-
id TEXT PRIMARY KEY,
|
|
11
|
-
name TEXT UNIQUE NOT NULL,
|
|
12
|
-
session_id TEXT NOT NULL,
|
|
13
|
-
status TEXT NOT NULL DEFAULT 'idle',
|
|
14
|
-
working_dir TEXT NOT NULL,
|
|
15
|
-
pid INTEGER,
|
|
16
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
17
|
-
last_activity_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
CREATE TABLE IF NOT EXISTS messages (
|
|
21
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
22
|
-
tab_id TEXT NOT NULL REFERENCES tabs(id),
|
|
23
|
-
role TEXT NOT NULL,
|
|
24
|
-
content TEXT NOT NULL,
|
|
25
|
-
cost_usd REAL,
|
|
26
|
-
tokens_in INTEGER,
|
|
27
|
-
tokens_out INTEGER,
|
|
28
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
CREATE INDEX IF NOT EXISTS idx_messages_tab ON messages(tab_id, created_at);
|
|
32
|
-
|
|
33
|
-
CREATE TABLE IF NOT EXISTS memories (
|
|
34
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
-
content TEXT NOT NULL,
|
|
36
|
-
tab_name TEXT,
|
|
37
|
-
source TEXT NOT NULL DEFAULT 'tool',
|
|
38
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
CREATE TABLE IF NOT EXISTS pending_messages (
|
|
42
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
43
|
-
tab_name TEXT NOT NULL,
|
|
44
|
-
message TEXT NOT NULL,
|
|
45
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
46
|
-
processed INTEGER NOT NULL DEFAULT 0
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
CREATE INDEX IF NOT EXISTS idx_pending_unprocessed ON pending_messages(processed, created_at);
|
|
50
|
-
`;
|
|
51
|
-
let db = null;
|
|
52
|
-
let walInterval = null;
|
|
53
|
-
export function getDb() {
|
|
54
|
-
if (db)
|
|
55
|
-
return db;
|
|
56
|
-
ensureBeecorkDirs();
|
|
57
|
-
const dbPath = getDbPath();
|
|
58
|
-
db = openDb(dbPath, { enforcePerms: true });
|
|
59
|
-
db.exec(SCHEMA);
|
|
60
|
-
runMigrations(db);
|
|
61
|
-
// Periodic WAL checkpointing + table cleanup. Cheap precheck `LIMIT 1`
|
|
62
|
-
// SELECTs skip the DELETE entirely when nothing matches — saves the WAL
|
|
63
|
-
// write on a quiet system.
|
|
64
|
-
walInterval = setInterval(() => {
|
|
65
|
-
try {
|
|
66
|
-
db?.pragma('wal_checkpoint(PASSIVE)');
|
|
67
|
-
if (!db)
|
|
68
|
-
return;
|
|
69
|
-
// Prune old permission history (keep last 1000 entries). Two-pass: count
|
|
70
|
-
// first, then bulk-delete the oldest N. The previous correlated-subquery
|
|
71
|
-
// version re-evaluated the OFFSET 999 row per candidate, which scaled
|
|
72
|
-
// poorly past ~5k rows.
|
|
73
|
-
const permCount = db.prepare('SELECT COUNT(*) as c FROM permission_history').get().c;
|
|
74
|
-
if (permCount > 1000) {
|
|
75
|
-
db.prepare(`DELETE FROM permission_history WHERE id IN (
|
|
76
|
-
SELECT id FROM permission_history ORDER BY created_at ASC LIMIT ?
|
|
77
|
-
)`).run(permCount - 1000);
|
|
78
|
-
}
|
|
79
|
-
// Activity log: only DELETE if a candidate row exists, otherwise no-op.
|
|
80
|
-
const oldActivity = db
|
|
81
|
-
.prepare("SELECT 1 FROM activity_log WHERE created_at < datetime('now', '-90 days') LIMIT 1")
|
|
82
|
-
.get();
|
|
83
|
-
if (oldActivity)
|
|
84
|
-
db.exec("DELETE FROM activity_log WHERE created_at < datetime('now', '-90 days')");
|
|
85
|
-
// Routing preferences: same precheck pattern.
|
|
86
|
-
const stalePref = db
|
|
87
|
-
.prepare("SELECT 1 FROM routing_preferences WHERE hit_count < 3 AND created_at < datetime('now', '-30 days') LIMIT 1")
|
|
88
|
-
.get();
|
|
89
|
-
if (stalePref) {
|
|
90
|
-
db.exec("DELETE FROM routing_preferences WHERE hit_count < 3 AND created_at < datetime('now', '-30 days')");
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
logger.warn('WAL checkpoint/cleanup error:', err);
|
|
95
|
-
}
|
|
96
|
-
}, 30 * 60 * 1000); // every 30 minutes
|
|
97
|
-
return db;
|
|
98
|
-
}
|
|
99
|
-
/** Shared tab record creation — used by dashboard, MCP, and TabManager */
|
|
100
|
-
export function createTabRecord(db, opts) {
|
|
101
|
-
const existing = db.prepare('SELECT name FROM tabs WHERE name = ?').get(opts.name);
|
|
102
|
-
if (existing)
|
|
103
|
-
return { id: '', name: opts.name, created: false };
|
|
104
|
-
// Resolve and validate workingDir. Done here so every caller (CLI, dashboard, MCP)
|
|
105
|
-
// gets the same checks instead of each rolling its own.
|
|
106
|
-
let dir = opts.workingDir || process.env.HOME || '/';
|
|
107
|
-
dir = path.resolve(expandHome(dir));
|
|
108
|
-
if (!fs.existsSync(dir)) {
|
|
109
|
-
throw new Error(`workingDir does not exist: ${dir}`);
|
|
110
|
-
}
|
|
111
|
-
if (!fs.statSync(dir).isDirectory()) {
|
|
112
|
-
throw new Error(`workingDir is not a directory: ${dir}`);
|
|
113
|
-
}
|
|
114
|
-
const id = crypto.randomUUID();
|
|
115
|
-
db.prepare('INSERT INTO tabs (id, name, session_id, status, working_dir, system_prompt) VALUES (?, ?, ?, ?, ?, ?)').run(id, opts.name, crypto.randomUUID(), 'idle', dir, opts.systemPrompt || null);
|
|
116
|
-
return { id, name: opts.name, created: true };
|
|
117
|
-
}
|
|
118
|
-
export function closeDb() {
|
|
119
|
-
if (walInterval) {
|
|
120
|
-
clearInterval(walInterval);
|
|
121
|
-
walInterval = null;
|
|
122
|
-
}
|
|
123
|
-
if (db) {
|
|
124
|
-
db.close();
|
|
125
|
-
db = null;
|
|
126
|
-
}
|
|
127
|
-
}
|
package/dist/db/migrations.d.ts
DELETED