beecork 0.3.1 → 0.3.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.
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +16 -4
- package/dist/cli/commands.js.map +1 -1
- package/dist/daemon.js +13 -0
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/html.d.ts +2 -0
- package/dist/dashboard/html.d.ts.map +1 -0
- package/dist/dashboard/html.js +357 -0
- package/dist/dashboard/html.js.map +1 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +129 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +18 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/extractor.js +4 -1
- package/dist/memory/extractor.js.map +1 -1
- package/dist/pipe/anthropic-client.d.ts +3 -1
- package/dist/pipe/anthropic-client.d.ts.map +1 -1
- package/dist/pipe/anthropic-client.js +6 -4
- package/dist/pipe/anthropic-client.js.map +1 -1
- package/dist/pipe/brain.js +2 -2
- package/dist/pipe/brain.js.map +1 -1
- package/dist/session/manager.d.ts +1 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +8 -7
- package/dist/session/manager.js.map +1 -1
- package/dist/telegram/bot.d.ts.map +1 -1
- package/dist/telegram/bot.js +12 -8
- package/dist/telegram/bot.js.map +1 -1
- package/dist/whatsapp/client.d.ts.map +1 -1
- package/dist/whatsapp/client.js +7 -1
- package/dist/whatsapp/client.js.map +1 -1
- package/dist/whatsapp/formatter.d.ts +2 -1
- package/dist/whatsapp/formatter.d.ts.map +1 -1
- package/dist/whatsapp/formatter.js +6 -2
- package/dist/whatsapp/formatter.js.map +1 -1
- package/package.json +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AA4BA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBjD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBhD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqChD;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB9C;AAED,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB/C;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBlD;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC/E;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhE"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import { spawn, execSync } from 'node:child_process';
|
|
3
4
|
import { getDb, closeDb } from '../db/index.js';
|
|
4
5
|
import { getConfig } from '../config.js';
|
|
@@ -7,6 +8,15 @@ import { getDaemonPid, timeAgo } from './helpers.js';
|
|
|
7
8
|
import { startService, stopService } from '../service/install.js';
|
|
8
9
|
import { getPidPath, getLogsDir } from '../util/paths.js';
|
|
9
10
|
import { VERSION } from '../version.js';
|
|
11
|
+
function requireDb() {
|
|
12
|
+
try {
|
|
13
|
+
return getDb();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
console.error('Database not initialized — run "beecork setup" first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
10
20
|
export async function startDaemon() {
|
|
11
21
|
const existingPid = getDaemonPid();
|
|
12
22
|
if (existingPid) {
|
|
@@ -87,7 +97,7 @@ export async function showStatus() {
|
|
|
87
97
|
console.log('');
|
|
88
98
|
}
|
|
89
99
|
export async function listTabs() {
|
|
90
|
-
const db =
|
|
100
|
+
const db = requireDb();
|
|
91
101
|
const tabs = db.prepare('SELECT * FROM tabs ORDER BY last_activity_at DESC').all();
|
|
92
102
|
closeDb();
|
|
93
103
|
if (tabs.length === 0) {
|
|
@@ -103,7 +113,7 @@ export async function listTabs() {
|
|
|
103
113
|
}
|
|
104
114
|
export async function tailLogs(tabName) {
|
|
105
115
|
const logFile = tabName
|
|
106
|
-
? `${getLogsDir()}/${tabName}.log`
|
|
116
|
+
? `${getLogsDir()}/${path.basename(tabName)}.log`
|
|
107
117
|
: `${getLogsDir()}/daemon.stdout.log`;
|
|
108
118
|
if (!fs.existsSync(logFile)) {
|
|
109
119
|
console.log(`No log file found: ${logFile}`);
|
|
@@ -113,6 +123,7 @@ export async function tailLogs(tabName) {
|
|
|
113
123
|
process.on('SIGINT', () => child.kill());
|
|
114
124
|
}
|
|
115
125
|
export async function listCrons() {
|
|
126
|
+
requireDb(); // Ensure DB exists before CronStore tries to access it
|
|
116
127
|
const store = new CronStore();
|
|
117
128
|
const jobs = store.list();
|
|
118
129
|
if (jobs.length === 0) {
|
|
@@ -129,6 +140,7 @@ export async function listCrons() {
|
|
|
129
140
|
console.log('');
|
|
130
141
|
}
|
|
131
142
|
export async function deleteCron(id) {
|
|
143
|
+
requireDb(); // Ensure DB exists before CronStore tries to access it
|
|
132
144
|
const store = new CronStore();
|
|
133
145
|
if (store.delete(id)) {
|
|
134
146
|
console.log(`Deleted cron job: ${id}`);
|
|
@@ -138,7 +150,7 @@ export async function deleteCron(id) {
|
|
|
138
150
|
}
|
|
139
151
|
}
|
|
140
152
|
export async function listMemories() {
|
|
141
|
-
const db =
|
|
153
|
+
const db = requireDb();
|
|
142
154
|
const memories = db.prepare('SELECT * FROM memories ORDER BY created_at DESC LIMIT 50').all();
|
|
143
155
|
closeDb();
|
|
144
156
|
if (memories.length === 0) {
|
|
@@ -154,7 +166,7 @@ export async function listMemories() {
|
|
|
154
166
|
console.log('');
|
|
155
167
|
}
|
|
156
168
|
export async function deleteMemory(id) {
|
|
157
|
-
const db =
|
|
169
|
+
const db = requireDb();
|
|
158
170
|
const result = db.prepare('DELETE FROM memories WHERE id = ?').run(parseInt(id, 10));
|
|
159
171
|
closeDb();
|
|
160
172
|
if (result.changes > 0) {
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.js
CHANGED
|
@@ -6,7 +6,9 @@ import { BeecorkTelegramBot } from './telegram/bot.js';
|
|
|
6
6
|
import { CronScheduler } from './cron/scheduler.js';
|
|
7
7
|
import { PipeBrain } from './pipe/brain.js';
|
|
8
8
|
import { ensureBeecorkDirs, getPidPath, getBeecorkHome } from './util/paths.js';
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
9
10
|
import { logger } from './util/logger.js';
|
|
11
|
+
import { VERSION } from './version.js';
|
|
10
12
|
let tabManager;
|
|
11
13
|
let telegramBot = null;
|
|
12
14
|
let whatsappClient = null;
|
|
@@ -122,6 +124,8 @@ async function main() {
|
|
|
122
124
|
tabManager.stopAll();
|
|
123
125
|
if (telegramBot)
|
|
124
126
|
telegramBot.stop();
|
|
127
|
+
if (whatsappClient)
|
|
128
|
+
whatsappClient.stop();
|
|
125
129
|
cronScheduler.stopAll();
|
|
126
130
|
closeDb();
|
|
127
131
|
const pidPath = getPidPath();
|
|
@@ -155,6 +159,15 @@ async function main() {
|
|
|
155
159
|
catch (err) {
|
|
156
160
|
logger.warn('Failed to send startup notification:', err);
|
|
157
161
|
}
|
|
162
|
+
// Check for updates (fire and forget — non-critical)
|
|
163
|
+
try {
|
|
164
|
+
const latest = execSync('npm view beecork version', { encoding: 'utf-8' }).trim();
|
|
165
|
+
if (latest && latest !== VERSION) {
|
|
166
|
+
await broadcastNotify(`📦 Update available: v${VERSION} → v${latest}\nRun: beecork update`);
|
|
167
|
+
logger.info(`Update available: v${VERSION} → v${latest}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch { /* offline or npm registry unreachable — skip silently */ }
|
|
158
171
|
}
|
|
159
172
|
async function recoverCrashedTabs() {
|
|
160
173
|
const db = getDb();
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/dashboard/html.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,CAmWzC"}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
export function getDashboardHtml() {
|
|
2
|
+
return `<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Beecork Dashboard</title>
|
|
8
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
9
|
+
<script>
|
|
10
|
+
tailwind.config = {
|
|
11
|
+
theme: {
|
|
12
|
+
extend: {
|
|
13
|
+
colors: {
|
|
14
|
+
honey: { 50: '#fefce8', 100: '#fef9c3', 200: '#fef08a', 300: '#fde047', 400: '#facc15', 500: '#eab308', 600: '#ca8a04', 700: '#a16207' },
|
|
15
|
+
bee: { 900: '#1a1a1a', 800: '#262626', 700: '#333333', 600: '#444444' }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
</script>
|
|
21
|
+
<style>
|
|
22
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
23
|
+
.msg-user { background: #2d2d2d; border-left: 3px solid #facc15; }
|
|
24
|
+
.msg-assistant { background: #1f1f1f; border-left: 3px solid #666; }
|
|
25
|
+
.tab-active { background: #facc1520; border-left: 3px solid #facc15; }
|
|
26
|
+
.cost-bar { background: linear-gradient(to top, #facc15, #eab308); border-radius: 2px 2px 0 0; }
|
|
27
|
+
::-webkit-scrollbar { width: 6px; }
|
|
28
|
+
::-webkit-scrollbar-track { background: #1a1a1a; }
|
|
29
|
+
::-webkit-scrollbar-thumb { background: #444; border-radius: 3px; }
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body class="bg-bee-900 text-gray-200 min-h-screen">
|
|
33
|
+
|
|
34
|
+
<!-- Header -->
|
|
35
|
+
<header class="bg-bee-800 border-b border-bee-600 px-6 py-3 flex items-center justify-between">
|
|
36
|
+
<div class="flex items-center gap-3">
|
|
37
|
+
<span class="text-2xl">🐝</span>
|
|
38
|
+
<h1 class="text-lg font-semibold text-white">Beecork</h1>
|
|
39
|
+
<span id="version" class="text-xs text-gray-500 font-mono"></span>
|
|
40
|
+
<span id="update-badge" class="hidden text-xs bg-honey-500 text-black px-2 py-0.5 rounded-full font-medium"></span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="flex items-center gap-4">
|
|
43
|
+
<div class="flex items-center gap-2">
|
|
44
|
+
<span id="daemon-dot" class="w-2.5 h-2.5 rounded-full bg-gray-600"></span>
|
|
45
|
+
<span id="daemon-status" class="text-sm text-gray-400">checking...</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="text-xs text-gray-500 font-mono" id="stats"></div>
|
|
48
|
+
</div>
|
|
49
|
+
</header>
|
|
50
|
+
|
|
51
|
+
<!-- Navigation -->
|
|
52
|
+
<nav class="bg-bee-800 border-b border-bee-700 px-6">
|
|
53
|
+
<div class="flex gap-1">
|
|
54
|
+
<button onclick="showPanel('tabs')" data-panel="tabs" class="nav-btn px-4 py-2 text-sm rounded-t border-b-2 border-transparent hover:text-white text-gray-400">Tabs</button>
|
|
55
|
+
<button onclick="showPanel('memories')" data-panel="memories" class="nav-btn px-4 py-2 text-sm rounded-t border-b-2 border-transparent hover:text-white text-gray-400">Memories</button>
|
|
56
|
+
<button onclick="showPanel('crons')" data-panel="crons" class="nav-btn px-4 py-2 text-sm rounded-t border-b-2 border-transparent hover:text-white text-gray-400">Cron Jobs</button>
|
|
57
|
+
<button onclick="showPanel('costs')" data-panel="costs" class="nav-btn px-4 py-2 text-sm rounded-t border-b-2 border-transparent hover:text-white text-gray-400">Costs</button>
|
|
58
|
+
</div>
|
|
59
|
+
</nav>
|
|
60
|
+
|
|
61
|
+
<!-- Main content -->
|
|
62
|
+
<main class="p-6">
|
|
63
|
+
|
|
64
|
+
<!-- Tabs Panel -->
|
|
65
|
+
<div id="panel-tabs" class="panel">
|
|
66
|
+
<div class="grid grid-cols-12 gap-6">
|
|
67
|
+
<!-- Tab list -->
|
|
68
|
+
<div class="col-span-4 bg-bee-800 rounded-lg border border-bee-700 overflow-hidden">
|
|
69
|
+
<div class="px-4 py-3 border-b border-bee-700 flex items-center justify-between">
|
|
70
|
+
<h2 class="text-sm font-semibold text-gray-300">Tabs</h2>
|
|
71
|
+
<span id="tab-count" class="text-xs text-gray-500"></span>
|
|
72
|
+
</div>
|
|
73
|
+
<div id="tab-list" class="max-h-[calc(100vh-220px)] overflow-y-auto"></div>
|
|
74
|
+
</div>
|
|
75
|
+
<!-- Messages -->
|
|
76
|
+
<div class="col-span-8 bg-bee-800 rounded-lg border border-bee-700 overflow-hidden">
|
|
77
|
+
<div class="px-4 py-3 border-b border-bee-700 flex items-center justify-between">
|
|
78
|
+
<h2 class="text-sm font-semibold text-gray-300" id="msg-title">Select a tab</h2>
|
|
79
|
+
<span id="msg-count" class="text-xs text-gray-500"></span>
|
|
80
|
+
</div>
|
|
81
|
+
<div id="msg-list" class="max-h-[calc(100vh-220px)] overflow-y-auto p-4 space-y-3">
|
|
82
|
+
<p class="text-gray-500 text-sm text-center py-8">Click a tab to view messages</p>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<!-- Memories Panel -->
|
|
89
|
+
<div id="panel-memories" class="panel hidden">
|
|
90
|
+
<div class="bg-bee-800 rounded-lg border border-bee-700 overflow-hidden">
|
|
91
|
+
<div class="px-4 py-3 border-b border-bee-700 flex items-center justify-between">
|
|
92
|
+
<h2 class="text-sm font-semibold text-gray-300">Memories</h2>
|
|
93
|
+
<div class="flex items-center gap-3">
|
|
94
|
+
<input id="memory-search" type="text" placeholder="Search memories..."
|
|
95
|
+
class="bg-bee-900 border border-bee-600 rounded px-3 py-1 text-sm text-gray-300 w-64 focus:outline-none focus:border-honey-500"
|
|
96
|
+
oninput="debounceMemorySearch()">
|
|
97
|
+
<span id="memory-count" class="text-xs text-gray-500"></span>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
<div id="memory-list" class="max-h-[calc(100vh-220px)] overflow-y-auto"></div>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<!-- Cron Panel -->
|
|
105
|
+
<div id="panel-crons" class="panel hidden">
|
|
106
|
+
<div class="bg-bee-800 rounded-lg border border-bee-700 overflow-hidden">
|
|
107
|
+
<div class="px-4 py-3 border-b border-bee-700">
|
|
108
|
+
<h2 class="text-sm font-semibold text-gray-300">Cron Jobs</h2>
|
|
109
|
+
</div>
|
|
110
|
+
<div id="cron-list" class="max-h-[calc(100vh-220px)] overflow-y-auto"></div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<!-- Costs Panel -->
|
|
115
|
+
<div id="panel-costs" class="panel hidden">
|
|
116
|
+
<div class="bg-bee-800 rounded-lg border border-bee-700 overflow-hidden">
|
|
117
|
+
<div class="px-4 py-3 border-b border-bee-700 flex items-center justify-between">
|
|
118
|
+
<h2 class="text-sm font-semibold text-gray-300">API Costs (Last 30 Days)</h2>
|
|
119
|
+
<span id="total-cost" class="text-sm font-mono text-honey-400"></span>
|
|
120
|
+
</div>
|
|
121
|
+
<div id="cost-chart" class="p-6"></div>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
</main>
|
|
126
|
+
|
|
127
|
+
<script>
|
|
128
|
+
// State
|
|
129
|
+
let selectedTab = null;
|
|
130
|
+
let memorySearchTimer = null;
|
|
131
|
+
|
|
132
|
+
// API helper
|
|
133
|
+
async function api(path) {
|
|
134
|
+
const res = await fetch(path);
|
|
135
|
+
return res.json();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Time formatting
|
|
139
|
+
function timeAgo(iso) {
|
|
140
|
+
if (!iso) return 'never';
|
|
141
|
+
const diff = Date.now() - new Date(iso).getTime();
|
|
142
|
+
const mins = Math.floor(diff / 60000);
|
|
143
|
+
if (mins < 1) return 'just now';
|
|
144
|
+
if (mins < 60) return mins + 'm ago';
|
|
145
|
+
const hours = Math.floor(mins / 60);
|
|
146
|
+
if (hours < 24) return hours + 'h ago';
|
|
147
|
+
return Math.floor(hours / 24) + 'd ago';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Panel switching
|
|
151
|
+
function showPanel(name) {
|
|
152
|
+
document.querySelectorAll('.panel').forEach(p => p.classList.add('hidden'));
|
|
153
|
+
document.getElementById('panel-' + name).classList.remove('hidden');
|
|
154
|
+
document.querySelectorAll('.nav-btn').forEach(b => {
|
|
155
|
+
b.classList.remove('border-honey-500', 'text-white');
|
|
156
|
+
b.classList.add('border-transparent', 'text-gray-400');
|
|
157
|
+
});
|
|
158
|
+
const btn = document.querySelector('[data-panel="' + name + '"]');
|
|
159
|
+
btn.classList.add('border-honey-500', 'text-white');
|
|
160
|
+
btn.classList.remove('border-transparent', 'text-gray-400');
|
|
161
|
+
|
|
162
|
+
if (name === 'memories') loadMemories();
|
|
163
|
+
if (name === 'crons') loadCrons();
|
|
164
|
+
if (name === 'costs') loadCosts();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Status polling
|
|
168
|
+
async function loadStatus() {
|
|
169
|
+
try {
|
|
170
|
+
const s = await api('/api/status');
|
|
171
|
+
document.getElementById('version').textContent = 'v' + s.version;
|
|
172
|
+
const dot = document.getElementById('daemon-dot');
|
|
173
|
+
const status = document.getElementById('daemon-status');
|
|
174
|
+
if (s.daemonPid) {
|
|
175
|
+
dot.className = 'w-2.5 h-2.5 rounded-full bg-green-500';
|
|
176
|
+
status.textContent = 'running (PID ' + s.daemonPid + ')';
|
|
177
|
+
} else {
|
|
178
|
+
dot.className = 'w-2.5 h-2.5 rounded-full bg-red-500';
|
|
179
|
+
status.textContent = 'stopped';
|
|
180
|
+
}
|
|
181
|
+
document.getElementById('stats').textContent =
|
|
182
|
+
s.tabs + ' tabs | ' + s.cronJobs + ' crons | ' + s.memories + ' memories';
|
|
183
|
+
} catch {}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Tabs
|
|
187
|
+
async function loadTabs() {
|
|
188
|
+
const tabs = await api('/api/tabs');
|
|
189
|
+
const list = document.getElementById('tab-list');
|
|
190
|
+
document.getElementById('tab-count').textContent = tabs.length + ' tabs';
|
|
191
|
+
|
|
192
|
+
if (tabs.length === 0) {
|
|
193
|
+
list.innerHTML = '<p class="text-gray-500 text-sm text-center py-8">No tabs</p>';
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
list.innerHTML = tabs.map(t => {
|
|
198
|
+
const statusColors = { idle: 'text-gray-500', running: 'text-green-400', error: 'text-red-400', stopped: 'text-gray-600' };
|
|
199
|
+
const isActive = selectedTab === t.name ? 'tab-active' : '';
|
|
200
|
+
const cost = t.total_cost > 0 ? '$' + t.total_cost.toFixed(4) : '';
|
|
201
|
+
return '<div class="px-4 py-3 border-b border-bee-700 cursor-pointer hover:bg-bee-700 ' + isActive + '" onclick="selectTab(\\''+t.name+'\\')">' +
|
|
202
|
+
'<div class="flex items-center justify-between">' +
|
|
203
|
+
'<span class="text-sm font-medium text-white">' + esc(t.name) + '</span>' +
|
|
204
|
+
'<span class="text-xs ' + (statusColors[t.status] || 'text-gray-500') + '">' + t.status + '</span>' +
|
|
205
|
+
'</div>' +
|
|
206
|
+
'<div class="flex items-center justify-between mt-1">' +
|
|
207
|
+
'<span class="text-xs text-gray-500">' + t.message_count + ' msgs' + (cost ? ' | ' + cost : '') + '</span>' +
|
|
208
|
+
'<span class="text-xs text-gray-600">' + timeAgo(t.last_activity_at) + '</span>' +
|
|
209
|
+
'</div>' +
|
|
210
|
+
'</div>';
|
|
211
|
+
}).join('');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function selectTab(name) {
|
|
215
|
+
selectedTab = name;
|
|
216
|
+
document.getElementById('msg-title').textContent = name;
|
|
217
|
+
loadTabs(); // refresh active highlight
|
|
218
|
+
|
|
219
|
+
const data = await api('/api/tabs/' + encodeURIComponent(name) + '/messages?limit=100');
|
|
220
|
+
const list = document.getElementById('msg-list');
|
|
221
|
+
document.getElementById('msg-count').textContent = data.total + ' messages';
|
|
222
|
+
|
|
223
|
+
if (data.messages.length === 0) {
|
|
224
|
+
list.innerHTML = '<p class="text-gray-500 text-sm text-center py-8">No messages in this tab</p>';
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
list.innerHTML = data.messages.map(m => {
|
|
229
|
+
const cls = m.role === 'user' ? 'msg-user' : 'msg-assistant';
|
|
230
|
+
const label = m.role === 'user' ? 'You' : 'Claude';
|
|
231
|
+
const meta = [];
|
|
232
|
+
if (m.cost_usd > 0) meta.push('$' + m.cost_usd.toFixed(4));
|
|
233
|
+
if (m.tokens_in) meta.push(m.tokens_in.toLocaleString() + ' in');
|
|
234
|
+
if (m.tokens_out) meta.push(m.tokens_out.toLocaleString() + ' out');
|
|
235
|
+
const metaStr = meta.length ? '<span class="text-xs text-gray-600 ml-2">' + meta.join(' | ') + '</span>' : '';
|
|
236
|
+
|
|
237
|
+
// Truncate very long messages
|
|
238
|
+
const content = m.content.length > 2000 ? m.content.slice(0, 2000) + '\\n\\n... (' + m.content.length.toLocaleString() + ' chars total)' : m.content;
|
|
239
|
+
|
|
240
|
+
return '<div class="' + cls + ' rounded p-3">' +
|
|
241
|
+
'<div class="flex items-center justify-between mb-1">' +
|
|
242
|
+
'<span class="text-xs font-semibold ' + (m.role === 'user' ? 'text-honey-400' : 'text-gray-400') + '">' + label + metaStr + '</span>' +
|
|
243
|
+
'<span class="text-xs text-gray-600">' + timeAgo(m.created_at) + '</span>' +
|
|
244
|
+
'</div>' +
|
|
245
|
+
'<pre class="text-sm text-gray-300 whitespace-pre-wrap break-words font-sans">' + esc(content) + '</pre>' +
|
|
246
|
+
'</div>';
|
|
247
|
+
}).join('');
|
|
248
|
+
|
|
249
|
+
list.scrollTop = list.scrollHeight;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Memories
|
|
253
|
+
async function loadMemories(query) {
|
|
254
|
+
const q = query || document.getElementById('memory-search').value || '';
|
|
255
|
+
const data = await api('/api/memories?limit=100&q=' + encodeURIComponent(q));
|
|
256
|
+
const list = document.getElementById('memory-list');
|
|
257
|
+
document.getElementById('memory-count').textContent = data.total + ' memories';
|
|
258
|
+
|
|
259
|
+
if (data.memories.length === 0) {
|
|
260
|
+
list.innerHTML = '<p class="text-gray-500 text-sm text-center py-8">No memories' + (q ? ' matching "' + esc(q) + '"' : '') + '</p>';
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
list.innerHTML = data.memories.map(m => {
|
|
265
|
+
const scope = m.tab_name ? 'tab:' + m.tab_name : 'global';
|
|
266
|
+
return '<div class="px-4 py-3 border-b border-bee-700">' +
|
|
267
|
+
'<div class="flex items-center justify-between mb-1">' +
|
|
268
|
+
'<div class="flex items-center gap-2">' +
|
|
269
|
+
'<span class="text-xs px-1.5 py-0.5 rounded ' + (m.source === 'auto' ? 'bg-blue-900 text-blue-300' : 'bg-purple-900 text-purple-300') + '">' + m.source + '</span>' +
|
|
270
|
+
'<span class="text-xs text-gray-500">' + scope + '</span>' +
|
|
271
|
+
'</div>' +
|
|
272
|
+
'<span class="text-xs text-gray-600">' + timeAgo(m.created_at) + '</span>' +
|
|
273
|
+
'</div>' +
|
|
274
|
+
'<p class="text-sm text-gray-300">' + esc(m.content) + '</p>' +
|
|
275
|
+
'</div>';
|
|
276
|
+
}).join('');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function debounceMemorySearch() {
|
|
280
|
+
clearTimeout(memorySearchTimer);
|
|
281
|
+
memorySearchTimer = setTimeout(() => loadMemories(), 300);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Crons
|
|
285
|
+
async function loadCrons() {
|
|
286
|
+
const crons = await api('/api/crons');
|
|
287
|
+
const list = document.getElementById('cron-list');
|
|
288
|
+
|
|
289
|
+
if (crons.length === 0) {
|
|
290
|
+
list.innerHTML = '<p class="text-gray-500 text-sm text-center py-8">No cron jobs</p>';
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
list.innerHTML = crons.map(c => {
|
|
295
|
+
const enabled = c.enabled === 1;
|
|
296
|
+
return '<div class="px-4 py-3 border-b border-bee-700">' +
|
|
297
|
+
'<div class="flex items-center justify-between">' +
|
|
298
|
+
'<div class="flex items-center gap-2">' +
|
|
299
|
+
'<span class="w-2 h-2 rounded-full ' + (enabled ? 'bg-green-500' : 'bg-gray-600') + '"></span>' +
|
|
300
|
+
'<span class="text-sm font-medium text-white">' + esc(c.name) + '</span>' +
|
|
301
|
+
'</div>' +
|
|
302
|
+
'<span class="text-xs font-mono text-gray-400">' + c.schedule_type + ': ' + esc(c.schedule) + '</span>' +
|
|
303
|
+
'</div>' +
|
|
304
|
+
'<div class="flex items-center justify-between mt-1 pl-4">' +
|
|
305
|
+
'<span class="text-xs text-gray-500">tab: ' + esc(c.tab_name) + ' | message: ' + esc((c.message || '').slice(0, 60)) + '</span>' +
|
|
306
|
+
'<span class="text-xs text-gray-600">last: ' + timeAgo(c.last_run_at) + '</span>' +
|
|
307
|
+
'</div>' +
|
|
308
|
+
'</div>';
|
|
309
|
+
}).join('');
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Costs
|
|
313
|
+
async function loadCosts() {
|
|
314
|
+
const costs = await api('/api/costs');
|
|
315
|
+
const chart = document.getElementById('cost-chart');
|
|
316
|
+
|
|
317
|
+
if (costs.length === 0) {
|
|
318
|
+
chart.innerHTML = '<p class="text-gray-500 text-sm text-center py-8">No cost data yet</p>';
|
|
319
|
+
document.getElementById('total-cost').textContent = '';
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const total = costs.reduce((s, c) => s + c.total_cost, 0);
|
|
324
|
+
document.getElementById('total-cost').textContent = 'Total: $' + total.toFixed(4);
|
|
325
|
+
|
|
326
|
+
const maxCost = Math.max(...costs.map(c => c.total_cost));
|
|
327
|
+
|
|
328
|
+
chart.innerHTML =
|
|
329
|
+
'<div class="flex items-end gap-1 h-48">' +
|
|
330
|
+
costs.map(c => {
|
|
331
|
+
const pct = maxCost > 0 ? (c.total_cost / maxCost * 100) : 0;
|
|
332
|
+
const day = c.day.slice(5); // MM-DD
|
|
333
|
+
return '<div class="flex-1 flex flex-col items-center gap-1">' +
|
|
334
|
+
'<span class="text-xs text-gray-500 font-mono">$' + c.total_cost.toFixed(3) + '</span>' +
|
|
335
|
+
'<div class="w-full cost-bar" style="height:' + Math.max(pct, 2) + '%" title="' + c.day + ': $' + c.total_cost.toFixed(4) + ' (' + c.message_count + ' msgs)"></div>' +
|
|
336
|
+
'<span class="text-xs text-gray-600 font-mono">' + day + '</span>' +
|
|
337
|
+
'</div>';
|
|
338
|
+
}).join('') +
|
|
339
|
+
'</div>';
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// HTML escaping
|
|
343
|
+
function esc(s) {
|
|
344
|
+
if (!s) return '';
|
|
345
|
+
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Init
|
|
349
|
+
showPanel('tabs');
|
|
350
|
+
loadStatus();
|
|
351
|
+
loadTabs();
|
|
352
|
+
setInterval(loadStatus, 5000);
|
|
353
|
+
</script>
|
|
354
|
+
</body>
|
|
355
|
+
</html>`;
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/dashboard/html.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiWD,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAyBA,wBAAgB,oBAAoB,CAAC,IAAI,SAAI,GAAG,IAAI,CAwHnD"}
|