beecork 1.2.0 → 1.3.1
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/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/capabilities/index.d.ts +0 -1
- package/dist/capabilities/index.js +0 -1
- package/dist/capabilities/manager.d.ts +0 -1
- package/dist/capabilities/manager.js +0 -1
- package/dist/capabilities/packs.d.ts +0 -1
- package/dist/capabilities/packs.js +7 -8
- package/dist/capabilities/types.d.ts +0 -1
- package/dist/capabilities/types.js +0 -1
- package/dist/channels/command-handler.d.ts +0 -1
- package/dist/channels/command-handler.js +26 -1
- package/dist/channels/discord.d.ts +1 -1
- package/dist/channels/discord.js +36 -47
- package/dist/channels/index.d.ts +0 -1
- package/dist/channels/index.js +0 -1
- package/dist/channels/loader.d.ts +0 -1
- package/dist/channels/loader.js +6 -1
- package/dist/channels/pipeline.d.ts +50 -0
- package/dist/channels/pipeline.js +83 -0
- package/dist/channels/registry.d.ts +0 -1
- package/dist/channels/registry.js +0 -1
- package/dist/channels/telegram.d.ts +1 -1
- package/dist/channels/telegram.js +99 -60
- package/dist/channels/types.d.ts +0 -1
- package/dist/channels/types.js +0 -1
- package/dist/channels/webhook.d.ts +0 -1
- package/dist/channels/webhook.js +0 -1
- package/dist/channels/whatsapp.d.ts +1 -1
- package/dist/channels/whatsapp.js +26 -52
- package/dist/cli/capabilities.d.ts +0 -1
- package/dist/cli/capabilities.js +0 -1
- package/dist/cli/channel.d.ts +0 -1
- package/dist/cli/channel.js +1 -2
- package/dist/cli/commands.d.ts +2 -1
- package/dist/cli/commands.js +49 -15
- package/dist/cli/doctor.d.ts +0 -1
- package/dist/cli/doctor.js +2 -2
- package/dist/cli/handoff.d.ts +0 -1
- package/dist/cli/handoff.js +0 -1
- package/dist/cli/helpers.d.ts +0 -1
- package/dist/cli/helpers.js +0 -1
- package/dist/cli/mcp.d.ts +0 -1
- package/dist/cli/mcp.js +0 -1
- package/dist/cli/media.d.ts +0 -1
- package/dist/cli/media.js +0 -1
- package/dist/cli/setup.d.ts +0 -1
- package/dist/cli/setup.js +13 -12
- package/dist/cli/store.d.ts +3 -0
- package/dist/cli/store.js +91 -0
- package/dist/config.d.ts +0 -1
- package/dist/config.js +0 -1
- package/dist/daemon.d.ts +0 -1
- package/dist/daemon.js +21 -11
- package/dist/dashboard/html.d.ts +0 -1
- package/dist/dashboard/html.js +169 -42
- package/dist/dashboard/server.d.ts +0 -1
- package/dist/dashboard/server.js +166 -35
- package/dist/db/index.d.ts +11 -1
- package/dist/db/index.js +12 -1
- package/dist/db/migrations.d.ts +0 -1
- package/dist/db/migrations.js +44 -1
- package/dist/delegation/manager.d.ts +0 -3
- package/dist/delegation/manager.js +0 -5
- package/dist/index.d.ts +0 -1
- package/dist/index.js +124 -6
- package/dist/knowledge/index.d.ts +2 -0
- package/dist/knowledge/index.js +1 -0
- package/dist/knowledge/manager.d.ts +17 -0
- package/dist/knowledge/manager.js +146 -0
- package/dist/knowledge/types.d.ts +7 -0
- package/dist/knowledge/types.js +1 -0
- package/dist/machines/index.d.ts +1 -3
- package/dist/machines/index.js +1 -3
- package/dist/machines/registry.d.ts +0 -7
- package/dist/machines/registry.js +0 -25
- package/dist/mcp/server.d.ts +0 -1
- package/dist/mcp/server.js +275 -80
- package/dist/media/factory.d.ts +0 -1
- package/dist/media/factory.js +0 -1
- package/dist/media/generators/dall-e.d.ts +0 -1
- package/dist/media/generators/dall-e.js +0 -1
- package/dist/media/generators/elevenlabs-music.d.ts +0 -1
- package/dist/media/generators/elevenlabs-music.js +0 -1
- package/dist/media/generators/elevenlabs-sfx.d.ts +0 -1
- package/dist/media/generators/elevenlabs-sfx.js +0 -1
- package/dist/media/generators/kling.d.ts +0 -1
- package/dist/media/generators/kling.js +14 -20
- package/dist/media/generators/lyria.d.ts +0 -1
- package/dist/media/generators/lyria.js +0 -1
- package/dist/media/generators/nano-banana.d.ts +0 -1
- package/dist/media/generators/nano-banana.js +0 -1
- package/dist/media/generators/poll-util.d.ts +12 -0
- package/dist/media/generators/poll-util.js +22 -0
- package/dist/media/generators/recraft.d.ts +0 -1
- package/dist/media/generators/recraft.js +0 -1
- package/dist/media/generators/runway.d.ts +0 -1
- package/dist/media/generators/runway.js +14 -23
- package/dist/media/generators/stable-diffusion.d.ts +0 -1
- package/dist/media/generators/stable-diffusion.js +0 -1
- package/dist/media/generators/veo.d.ts +0 -1
- package/dist/media/generators/veo.js +0 -1
- package/dist/media/index.d.ts +0 -2
- package/dist/media/index.js +0 -2
- package/dist/media/store.d.ts +0 -1
- package/dist/media/store.js +0 -1
- package/dist/media/types.d.ts +0 -1
- package/dist/media/types.js +0 -1
- package/dist/memory/extractor.d.ts +0 -1
- package/dist/memory/extractor.js +8 -3
- package/dist/notifications/index.d.ts +0 -1
- package/dist/notifications/index.js +0 -1
- package/dist/notifications/ntfy.d.ts +0 -1
- package/dist/notifications/ntfy.js +0 -1
- package/dist/notifications/pushover.d.ts +0 -1
- package/dist/notifications/pushover.js +0 -1
- package/dist/notifications/types.d.ts +0 -1
- package/dist/notifications/types.js +0 -1
- package/dist/notifications/webhook-provider.d.ts +0 -1
- package/dist/notifications/webhook-provider.js +0 -1
- package/dist/observability/analytics.d.ts +0 -1
- package/dist/observability/analytics.js +1 -2
- package/dist/pipe/anthropic-client.d.ts +0 -1
- package/dist/pipe/anthropic-client.js +5 -3
- package/dist/pipe/brain.d.ts +0 -1
- package/dist/pipe/brain.js +0 -1
- package/dist/pipe/memory-store.d.ts +0 -1
- package/dist/pipe/memory-store.js +0 -1
- package/dist/pipe/project-scanner.d.ts +5 -3
- package/dist/pipe/project-scanner.js +21 -90
- package/dist/pipe/types.d.ts +0 -11
- package/dist/pipe/types.js +0 -1
- package/dist/projects/index.d.ts +0 -1
- package/dist/projects/index.js +0 -1
- package/dist/projects/manager.d.ts +0 -1
- package/dist/projects/manager.js +0 -1
- package/dist/projects/router.d.ts +0 -1
- package/dist/projects/router.js +1 -2
- package/dist/projects/types.d.ts +0 -7
- package/dist/projects/types.js +0 -1
- package/dist/service/install.d.ts +0 -1
- package/dist/service/install.js +0 -1
- package/dist/service/templates.d.ts +0 -1
- package/dist/service/templates.js +0 -1
- package/dist/service/windows.d.ts +0 -3
- package/dist/service/windows.js +0 -11
- package/dist/session/circuit-breaker.d.ts +0 -1
- package/dist/session/circuit-breaker.js +0 -1
- package/dist/session/context-monitor.d.ts +0 -1
- package/dist/session/context-monitor.js +0 -1
- package/dist/session/manager.d.ts +0 -1
- package/dist/session/manager.js +18 -6
- package/dist/session/subprocess.d.ts +0 -1
- package/dist/session/subprocess.js +0 -1
- package/dist/session/tool-classifier.d.ts +0 -1
- package/dist/session/tool-classifier.js +0 -1
- package/dist/{cron → tasks}/scheduler.d.ts +5 -4
- package/dist/{cron → tasks}/scheduler.js +31 -29
- package/dist/tasks/store.d.ts +11 -0
- package/dist/{cron → tasks}/store.js +12 -13
- package/dist/timeline/index.d.ts +3 -0
- package/dist/timeline/index.js +2 -0
- package/dist/timeline/logger.d.ts +8 -0
- package/dist/timeline/logger.js +9 -0
- package/dist/timeline/query.d.ts +11 -0
- package/dist/timeline/query.js +57 -0
- package/dist/timeline/types.d.ts +12 -0
- package/dist/timeline/types.js +1 -0
- package/dist/types.d.ts +6 -6
- package/dist/types.js +0 -1
- package/dist/users/index.d.ts +1 -2
- package/dist/users/index.js +1 -2
- package/dist/users/service.d.ts +0 -8
- package/dist/users/service.js +0 -19
- package/dist/util/logger.d.ts +0 -1
- package/dist/util/logger.js +0 -1
- package/dist/util/paths.d.ts +0 -1
- package/dist/util/paths.js +0 -1
- package/dist/util/platform.d.ts +0 -1
- package/dist/util/platform.js +0 -1
- package/dist/util/progress.d.ts +0 -1
- package/dist/util/progress.js +0 -1
- package/dist/util/rate-limiter.d.ts +0 -1
- package/dist/util/rate-limiter.js +0 -1
- package/dist/util/retry.d.ts +0 -1
- package/dist/util/retry.js +1 -2
- package/dist/util/text.d.ts +0 -1
- package/dist/util/text.js +0 -1
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -1
- package/dist/voice/index.d.ts +8 -1
- package/dist/voice/index.js +23 -1
- package/dist/voice/stt.d.ts +2 -1
- package/dist/voice/stt.js +10 -1
- package/dist/voice/tts.d.ts +0 -1
- package/dist/voice/tts.js +0 -1
- package/dist/watchers/evaluator.d.ts +5 -0
- package/dist/watchers/evaluator.js +45 -0
- package/dist/watchers/index.d.ts +4 -0
- package/dist/watchers/index.js +3 -0
- package/dist/watchers/scheduler.d.ts +13 -0
- package/dist/watchers/scheduler.js +133 -0
- package/dist/watchers/store.d.ts +10 -0
- package/dist/watchers/store.js +56 -0
- package/dist/watchers/types.d.ts +15 -0
- package/dist/watchers/types.js +1 -0
- package/package.json +25 -2
- package/dist/capabilities/index.d.ts.map +0 -1
- package/dist/capabilities/index.js.map +0 -1
- package/dist/capabilities/manager.d.ts.map +0 -1
- package/dist/capabilities/manager.js.map +0 -1
- package/dist/capabilities/packs.d.ts.map +0 -1
- package/dist/capabilities/packs.js.map +0 -1
- package/dist/capabilities/types.d.ts.map +0 -1
- package/dist/capabilities/types.js.map +0 -1
- package/dist/channels/command-handler.d.ts.map +0 -1
- package/dist/channels/command-handler.js.map +0 -1
- package/dist/channels/discord.d.ts.map +0 -1
- package/dist/channels/discord.js.map +0 -1
- package/dist/channels/index.d.ts.map +0 -1
- package/dist/channels/index.js.map +0 -1
- package/dist/channels/loader.d.ts.map +0 -1
- package/dist/channels/loader.js.map +0 -1
- package/dist/channels/registry.d.ts.map +0 -1
- package/dist/channels/registry.js.map +0 -1
- package/dist/channels/telegram.d.ts.map +0 -1
- package/dist/channels/telegram.js.map +0 -1
- package/dist/channels/types.d.ts.map +0 -1
- package/dist/channels/types.js.map +0 -1
- package/dist/channels/webhook.d.ts.map +0 -1
- package/dist/channels/webhook.js.map +0 -1
- package/dist/channels/whatsapp.d.ts.map +0 -1
- package/dist/channels/whatsapp.js.map +0 -1
- package/dist/cli/capabilities.d.ts.map +0 -1
- package/dist/cli/capabilities.js.map +0 -1
- package/dist/cli/channel.d.ts.map +0 -1
- package/dist/cli/channel.js.map +0 -1
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/doctor.d.ts.map +0 -1
- package/dist/cli/doctor.js.map +0 -1
- package/dist/cli/handoff.d.ts.map +0 -1
- package/dist/cli/handoff.js.map +0 -1
- package/dist/cli/helpers.d.ts.map +0 -1
- package/dist/cli/helpers.js.map +0 -1
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/media.d.ts.map +0 -1
- package/dist/cli/media.js.map +0 -1
- package/dist/cli/setup.d.ts.map +0 -1
- package/dist/cli/setup.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/cron/scheduler.d.ts.map +0 -1
- package/dist/cron/scheduler.js.map +0 -1
- package/dist/cron/store.d.ts +0 -12
- package/dist/cron/store.d.ts.map +0 -1
- package/dist/cron/store.js.map +0 -1
- package/dist/daemon.d.ts.map +0 -1
- package/dist/daemon.js.map +0 -1
- package/dist/dashboard/html.d.ts.map +0 -1
- package/dist/dashboard/html.js.map +0 -1
- package/dist/dashboard/server.d.ts.map +0 -1
- package/dist/dashboard/server.js.map +0 -1
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/index.js.map +0 -1
- package/dist/db/migrations.d.ts.map +0 -1
- package/dist/db/migrations.js.map +0 -1
- package/dist/delegation/manager.d.ts.map +0 -1
- package/dist/delegation/manager.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/machines/forwarder.d.ts +0 -7
- package/dist/machines/forwarder.d.ts.map +0 -1
- package/dist/machines/forwarder.js +0 -35
- package/dist/machines/forwarder.js.map +0 -1
- package/dist/machines/index.d.ts.map +0 -1
- package/dist/machines/index.js.map +0 -1
- package/dist/machines/registry.d.ts.map +0 -1
- package/dist/machines/registry.js.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js.map +0 -1
- package/dist/media/factory.d.ts.map +0 -1
- package/dist/media/factory.js.map +0 -1
- package/dist/media/generators/dall-e.d.ts.map +0 -1
- package/dist/media/generators/dall-e.js.map +0 -1
- package/dist/media/generators/elevenlabs-music.d.ts.map +0 -1
- package/dist/media/generators/elevenlabs-music.js.map +0 -1
- package/dist/media/generators/elevenlabs-sfx.d.ts.map +0 -1
- package/dist/media/generators/elevenlabs-sfx.js.map +0 -1
- package/dist/media/generators/kling.d.ts.map +0 -1
- package/dist/media/generators/kling.js.map +0 -1
- package/dist/media/generators/lyria.d.ts.map +0 -1
- package/dist/media/generators/lyria.js.map +0 -1
- package/dist/media/generators/nano-banana.d.ts.map +0 -1
- package/dist/media/generators/nano-banana.js.map +0 -1
- package/dist/media/generators/recraft.d.ts.map +0 -1
- package/dist/media/generators/recraft.js.map +0 -1
- package/dist/media/generators/runway.d.ts.map +0 -1
- package/dist/media/generators/runway.js.map +0 -1
- package/dist/media/generators/stable-diffusion.d.ts.map +0 -1
- package/dist/media/generators/stable-diffusion.js.map +0 -1
- package/dist/media/generators/veo.d.ts.map +0 -1
- package/dist/media/generators/veo.js.map +0 -1
- package/dist/media/index.d.ts.map +0 -1
- package/dist/media/index.js.map +0 -1
- package/dist/media/loader.d.ts +0 -8
- package/dist/media/loader.d.ts.map +0 -1
- package/dist/media/loader.js +0 -46
- package/dist/media/loader.js.map +0 -1
- package/dist/media/store.d.ts.map +0 -1
- package/dist/media/store.js.map +0 -1
- package/dist/media/types.d.ts.map +0 -1
- package/dist/media/types.js.map +0 -1
- package/dist/memory/extractor.d.ts.map +0 -1
- package/dist/memory/extractor.js.map +0 -1
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/ntfy.d.ts.map +0 -1
- package/dist/notifications/ntfy.js.map +0 -1
- package/dist/notifications/pushover.d.ts.map +0 -1
- package/dist/notifications/pushover.js.map +0 -1
- package/dist/notifications/types.d.ts.map +0 -1
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/webhook-provider.d.ts.map +0 -1
- package/dist/notifications/webhook-provider.js.map +0 -1
- package/dist/observability/analytics.d.ts.map +0 -1
- package/dist/observability/analytics.js.map +0 -1
- package/dist/pipe/anthropic-client.d.ts.map +0 -1
- package/dist/pipe/anthropic-client.js.map +0 -1
- package/dist/pipe/brain.d.ts.map +0 -1
- package/dist/pipe/brain.js.map +0 -1
- package/dist/pipe/memory-store.d.ts.map +0 -1
- package/dist/pipe/memory-store.js.map +0 -1
- package/dist/pipe/project-scanner.d.ts.map +0 -1
- package/dist/pipe/project-scanner.js.map +0 -1
- package/dist/pipe/types.d.ts.map +0 -1
- package/dist/pipe/types.js.map +0 -1
- package/dist/projects/index.d.ts.map +0 -1
- package/dist/projects/index.js.map +0 -1
- package/dist/projects/manager.d.ts.map +0 -1
- package/dist/projects/manager.js.map +0 -1
- package/dist/projects/router.d.ts.map +0 -1
- package/dist/projects/router.js.map +0 -1
- package/dist/projects/types.d.ts.map +0 -1
- package/dist/projects/types.js.map +0 -1
- package/dist/service/install.d.ts.map +0 -1
- package/dist/service/install.js.map +0 -1
- package/dist/service/templates.d.ts.map +0 -1
- package/dist/service/templates.js.map +0 -1
- package/dist/service/windows.d.ts.map +0 -1
- package/dist/service/windows.js.map +0 -1
- package/dist/session/circuit-breaker.d.ts.map +0 -1
- package/dist/session/circuit-breaker.js.map +0 -1
- package/dist/session/context-monitor.d.ts.map +0 -1
- package/dist/session/context-monitor.js.map +0 -1
- package/dist/session/manager.d.ts.map +0 -1
- package/dist/session/manager.js.map +0 -1
- package/dist/session/subprocess.d.ts.map +0 -1
- package/dist/session/subprocess.js.map +0 -1
- package/dist/session/tool-classifier.d.ts.map +0 -1
- package/dist/session/tool-classifier.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/users/index.d.ts.map +0 -1
- package/dist/users/index.js.map +0 -1
- package/dist/users/service.d.ts.map +0 -1
- package/dist/users/service.js.map +0 -1
- package/dist/util/logger.d.ts.map +0 -1
- package/dist/util/logger.js.map +0 -1
- package/dist/util/paths.d.ts.map +0 -1
- package/dist/util/paths.js.map +0 -1
- package/dist/util/platform.d.ts.map +0 -1
- package/dist/util/platform.js.map +0 -1
- package/dist/util/progress.d.ts.map +0 -1
- package/dist/util/progress.js.map +0 -1
- package/dist/util/rate-limiter.d.ts.map +0 -1
- package/dist/util/rate-limiter.js.map +0 -1
- package/dist/util/retry.d.ts.map +0 -1
- package/dist/util/retry.js.map +0 -1
- package/dist/util/text.d.ts.map +0 -1
- package/dist/util/text.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js.map +0 -1
- package/dist/voice/index.d.ts.map +0 -1
- package/dist/voice/index.js.map +0 -1
- package/dist/voice/stt.d.ts.map +0 -1
- package/dist/voice/stt.js.map +0 -1
- package/dist/voice/tts.d.ts.map +0 -1
- package/dist/voice/tts.js.map +0 -1
package/dist/dashboard/server.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import http from 'node:http';
|
|
2
2
|
import crypto from 'node:crypto';
|
|
3
|
-
import { execFile } from 'node:child_process';
|
|
3
|
+
import { execFile, exec } from 'node:child_process';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
4
5
|
import { platform } from 'node:os';
|
|
5
6
|
import Database from 'better-sqlite3';
|
|
6
7
|
import { getDbPath } from '../util/paths.js';
|
|
@@ -8,6 +9,7 @@ import { getDashboardHtml } from './html.js';
|
|
|
8
9
|
import { VERSION } from '../version.js';
|
|
9
10
|
import { getDaemonPid } from '../cli/helpers.js';
|
|
10
11
|
import { validateTabName } from '../config.js';
|
|
12
|
+
import { createTabRecord } from '../db/index.js';
|
|
11
13
|
let cachedDashDb = null;
|
|
12
14
|
function getDashDb() {
|
|
13
15
|
if (!cachedDashDb) {
|
|
@@ -16,22 +18,32 @@ function getDashDb() {
|
|
|
16
18
|
}
|
|
17
19
|
return cachedDashDb;
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
finally {
|
|
25
|
-
db.close();
|
|
21
|
+
let cachedWriteDb = null;
|
|
22
|
+
function getWriteDb() {
|
|
23
|
+
if (!cachedWriteDb) {
|
|
24
|
+
cachedWriteDb = new Database(getDbPath());
|
|
25
|
+
cachedWriteDb.pragma('journal_mode = WAL');
|
|
26
26
|
}
|
|
27
|
+
return cachedWriteDb;
|
|
28
|
+
}
|
|
29
|
+
function withWriteDb(fn) {
|
|
30
|
+
return fn(getWriteDb());
|
|
27
31
|
}
|
|
28
32
|
function json(res, data, status = 200) {
|
|
29
33
|
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
30
34
|
res.end(JSON.stringify(data));
|
|
31
35
|
}
|
|
32
36
|
function openBrowser(url) {
|
|
33
|
-
const
|
|
34
|
-
|
|
37
|
+
const p = platform();
|
|
38
|
+
if (p === 'darwin') {
|
|
39
|
+
execFile('open', [url]);
|
|
40
|
+
}
|
|
41
|
+
else if (p === 'win32') {
|
|
42
|
+
execFile('cmd', ['/c', 'start', url]);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
execFile('xdg-open', [url]);
|
|
46
|
+
}
|
|
35
47
|
}
|
|
36
48
|
export function startDashboardServer(port = 0) {
|
|
37
49
|
// Generate auth token at server start
|
|
@@ -53,7 +65,11 @@ export function startDashboardServer(port = 0) {
|
|
|
53
65
|
res.end('Forbidden');
|
|
54
66
|
return;
|
|
55
67
|
}
|
|
56
|
-
res.writeHead(200, {
|
|
68
|
+
res.writeHead(200, {
|
|
69
|
+
'Content-Type': 'text/html',
|
|
70
|
+
'Referrer-Policy': 'no-referrer',
|
|
71
|
+
'Set-Cookie': `beecork_dash=${authToken}; HttpOnly; SameSite=Strict; Path=/`,
|
|
72
|
+
});
|
|
57
73
|
res.end(getDashboardHtml(authToken));
|
|
58
74
|
return;
|
|
59
75
|
}
|
|
@@ -61,7 +77,8 @@ export function startDashboardServer(port = 0) {
|
|
|
61
77
|
if (path.startsWith('/api/')) {
|
|
62
78
|
const authHeader = req.headers.authorization;
|
|
63
79
|
const queryToken = url.searchParams.get('token');
|
|
64
|
-
const
|
|
80
|
+
const cookieToken = req.headers.cookie?.split(';').map(c => c.trim()).find(c => c.startsWith('beecork_dash='))?.split('=')[1];
|
|
81
|
+
const providedToken = authHeader?.replace('Bearer ', '') || queryToken || cookieToken;
|
|
65
82
|
if (providedToken !== authToken) {
|
|
66
83
|
json(res, { error: 'Unauthorized' }, 401);
|
|
67
84
|
return;
|
|
@@ -115,8 +132,9 @@ export function startDashboardServer(port = 0) {
|
|
|
115
132
|
return;
|
|
116
133
|
}
|
|
117
134
|
const tabName = decodeURIComponent(path.split('/')[3]);
|
|
118
|
-
|
|
119
|
-
|
|
135
|
+
const tabErr = validateTabName(tabName);
|
|
136
|
+
if (tabErr) {
|
|
137
|
+
json(res, { error: tabErr }, 400);
|
|
120
138
|
return;
|
|
121
139
|
}
|
|
122
140
|
withWriteDb(db => db.prepare('INSERT INTO pending_messages (tab_name, message, type) VALUES (?, ?, ?)').run(tabName, message, 'user'));
|
|
@@ -146,12 +164,12 @@ export function startDashboardServer(port = 0) {
|
|
|
146
164
|
json(res, { error: 'Missing tab name' }, 400);
|
|
147
165
|
return;
|
|
148
166
|
}
|
|
149
|
-
|
|
150
|
-
|
|
167
|
+
const nameErr = validateTabName(name);
|
|
168
|
+
if (nameErr) {
|
|
169
|
+
json(res, { error: nameErr }, 400);
|
|
151
170
|
return;
|
|
152
171
|
}
|
|
153
|
-
|
|
154
|
-
withWriteDb(db => db.prepare('INSERT OR IGNORE INTO tabs (id, name, session_id, status, working_dir, system_prompt) VALUES (?, ?, ?, ?, ?, ?)').run(id, name, crypto.randomUUID(), 'idle', workingDir || process.env.HOME || '/', systemPrompt || null));
|
|
172
|
+
withWriteDb(db => createTabRecord(db, { name, workingDir, systemPrompt }));
|
|
155
173
|
json(res, { success: true, name });
|
|
156
174
|
return;
|
|
157
175
|
}
|
|
@@ -168,8 +186,8 @@ export function startDashboardServer(port = 0) {
|
|
|
168
186
|
json(res, { success: true });
|
|
169
187
|
return;
|
|
170
188
|
}
|
|
171
|
-
// POST: Create
|
|
172
|
-
if (path === '/api/crons' && req.method === 'POST') {
|
|
189
|
+
// POST: Create task (supports both /api/tasks and /api/crons)
|
|
190
|
+
if ((path === '/api/tasks' || path === '/api/crons') && req.method === 'POST') {
|
|
173
191
|
let body = '';
|
|
174
192
|
for await (const chunk of req) {
|
|
175
193
|
body += chunk;
|
|
@@ -192,19 +210,33 @@ export function startDashboardServer(port = 0) {
|
|
|
192
210
|
return;
|
|
193
211
|
}
|
|
194
212
|
const effectiveTab = tabName || 'default';
|
|
195
|
-
|
|
196
|
-
|
|
213
|
+
const cronTabErr = validateTabName(effectiveTab);
|
|
214
|
+
if (cronTabErr) {
|
|
215
|
+
json(res, { error: cronTabErr }, 400);
|
|
197
216
|
return;
|
|
198
217
|
}
|
|
199
218
|
const id = crypto.randomUUID();
|
|
200
|
-
withWriteDb(db => db.prepare('INSERT INTO
|
|
219
|
+
withWriteDb(db => db.prepare('INSERT INTO tasks (id, name, schedule_type, schedule, tab_name, message, enabled) VALUES (?, ?, ?, ?, ?, ?, 1)').run(id, name, scheduleType || 'every', schedule, effectiveTab, message));
|
|
201
220
|
json(res, { success: true, id });
|
|
202
221
|
return;
|
|
203
222
|
}
|
|
204
|
-
// DELETE: Delete
|
|
205
|
-
if (path.match(/^\/api\/crons\/[^/]+$/) && req.method === 'DELETE') {
|
|
206
|
-
const
|
|
207
|
-
withWriteDb(db => db.prepare('DELETE FROM
|
|
223
|
+
// DELETE: Delete task (supports both /api/tasks and /api/crons)
|
|
224
|
+
if ((path.match(/^\/api\/tasks\/[^/]+$/) || path.match(/^\/api\/crons\/[^/]+$/)) && req.method === 'DELETE') {
|
|
225
|
+
const taskId = decodeURIComponent(path.split('/')[3]);
|
|
226
|
+
withWriteDb(db => db.prepare('DELETE FROM tasks WHERE id = ?').run(taskId));
|
|
227
|
+
json(res, { success: true });
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// GET: List watchers
|
|
231
|
+
if (path === '/api/watchers' && req.method === 'GET') {
|
|
232
|
+
const watchers = getDashDb().prepare('SELECT * FROM watchers ORDER BY created_at').all();
|
|
233
|
+
json(res, watchers);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// DELETE: Delete watcher
|
|
237
|
+
if (path.match(/^\/api\/watchers\/[^/]+$/) && req.method === 'DELETE') {
|
|
238
|
+
const watcherId = decodeURIComponent(path.split('/')[3]);
|
|
239
|
+
withWriteDb(db => db.prepare('DELETE FROM watchers WHERE id = ?').run(watcherId));
|
|
208
240
|
json(res, { success: true });
|
|
209
241
|
return;
|
|
210
242
|
}
|
|
@@ -268,8 +300,13 @@ export function startDashboardServer(port = 0) {
|
|
|
268
300
|
}
|
|
269
301
|
if (path === '/api/computer-use' && req.method === 'POST') {
|
|
270
302
|
let body = '';
|
|
271
|
-
for await (const chunk of req)
|
|
303
|
+
for await (const chunk of req) {
|
|
272
304
|
body += chunk;
|
|
305
|
+
if (body.length > 1_000_000) {
|
|
306
|
+
json(res, { error: 'Payload too large' }, 413);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
273
310
|
let parsedCU;
|
|
274
311
|
try {
|
|
275
312
|
parsedCU = JSON.parse(body);
|
|
@@ -292,12 +329,20 @@ export function startDashboardServer(port = 0) {
|
|
|
292
329
|
json(res, { enabled: !!config.claudeCode.computerUse });
|
|
293
330
|
return;
|
|
294
331
|
}
|
|
332
|
+
if (path === '/api/timeline') {
|
|
333
|
+
const { getTimeline } = await import('../timeline/index.js');
|
|
334
|
+
const date = url.searchParams.get('date') || new Date().toISOString().slice(0, 10);
|
|
335
|
+
const limit = parseInt(url.searchParams.get('limit') || '50');
|
|
336
|
+
const events = getTimeline({ date, limit });
|
|
337
|
+
json(res, { events });
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
295
340
|
const db = getDashDb();
|
|
296
341
|
if (path === '/api/status') {
|
|
297
342
|
const pid = getDaemonPid();
|
|
298
343
|
const tabCount = db.prepare('SELECT COUNT(*) as c FROM tabs').get().c;
|
|
299
344
|
const activeCount = db.prepare("SELECT COUNT(*) as c FROM tabs WHERE status = 'running'").get().c;
|
|
300
|
-
const cronCount = db.prepare("SELECT COUNT(*) as c FROM
|
|
345
|
+
const cronCount = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE enabled = 1").get().c;
|
|
301
346
|
const memoryCount = db.prepare('SELECT COUNT(*) as c FROM memories').get().c;
|
|
302
347
|
json(res, { version: VERSION, daemonPid: pid, tabs: tabCount, activeTabs: activeCount, cronJobs: cronCount, memories: memoryCount });
|
|
303
348
|
return;
|
|
@@ -343,8 +388,8 @@ export function startDashboardServer(port = 0) {
|
|
|
343
388
|
json(res, { memories, total, limit, offset });
|
|
344
389
|
return;
|
|
345
390
|
}
|
|
346
|
-
if (path === '/api/crons' && req.method === 'GET') {
|
|
347
|
-
const crons = db.prepare('SELECT * FROM
|
|
391
|
+
if ((path === '/api/tasks' || path === '/api/crons') && req.method === 'GET') {
|
|
392
|
+
const crons = db.prepare('SELECT * FROM tasks ORDER BY created_at').all();
|
|
348
393
|
json(res, crons);
|
|
349
394
|
return;
|
|
350
395
|
}
|
|
@@ -362,6 +407,80 @@ export function startDashboardServer(port = 0) {
|
|
|
362
407
|
json(res, costs);
|
|
363
408
|
return;
|
|
364
409
|
}
|
|
410
|
+
// GET /api/update/status — check versions for beecork, claude code, and other packages
|
|
411
|
+
if (path === '/api/update/status') {
|
|
412
|
+
const execAsync = promisify(exec);
|
|
413
|
+
async function checkPackage(name, installCmd) {
|
|
414
|
+
const pkg = { name };
|
|
415
|
+
try {
|
|
416
|
+
const { stdout } = await execAsync(`${installCmd || name} --version`, { timeout: 10000 });
|
|
417
|
+
pkg.installed = stdout.trim().replace(/^v/, '');
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
pkg.installed = null;
|
|
421
|
+
}
|
|
422
|
+
try {
|
|
423
|
+
const { stdout } = await execAsync(`npm view ${name} version`, { timeout: 10000 });
|
|
424
|
+
pkg.latest = stdout.trim();
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
pkg.latest = null;
|
|
428
|
+
}
|
|
429
|
+
pkg.updateAvailable = !!(pkg.installed && pkg.latest && pkg.installed !== pkg.latest);
|
|
430
|
+
return pkg;
|
|
431
|
+
}
|
|
432
|
+
const packages = await Promise.all([
|
|
433
|
+
(async () => {
|
|
434
|
+
const p = await checkPackage('beecork');
|
|
435
|
+
p.installed = VERSION; // use our known version, more reliable
|
|
436
|
+
p.updateAvailable = !!(p.latest && p.installed !== p.latest);
|
|
437
|
+
return p;
|
|
438
|
+
})(),
|
|
439
|
+
(async () => {
|
|
440
|
+
const p = { name: '@anthropic-ai/claude-code' };
|
|
441
|
+
try {
|
|
442
|
+
const { stdout } = await execAsync('claude --version', { timeout: 10000 });
|
|
443
|
+
p.installed = stdout.trim().replace(/^.*?(\d+\.\d+\.\d+).*$/, '$1');
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
p.installed = null;
|
|
447
|
+
}
|
|
448
|
+
try {
|
|
449
|
+
const { stdout } = await execAsync('npm view @anthropic-ai/claude-code version', { timeout: 10000 });
|
|
450
|
+
p.latest = stdout.trim();
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
p.latest = null;
|
|
454
|
+
}
|
|
455
|
+
p.updateAvailable = !!(p.installed && p.latest && p.installed !== p.latest);
|
|
456
|
+
return p;
|
|
457
|
+
})(),
|
|
458
|
+
]);
|
|
459
|
+
json(res, { packages });
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
// POST /api/update/:package — update a specific package
|
|
463
|
+
if (path.match(/^\/api\/update\/[^/]+$/) && req.method === 'POST') {
|
|
464
|
+
const pkgName = decodeURIComponent(path.split('/')[3]);
|
|
465
|
+
const execAsync = promisify(exec);
|
|
466
|
+
const allowedPackages = {
|
|
467
|
+
'beecork': 'npm install -g beecork@latest',
|
|
468
|
+
'@anthropic-ai/claude-code': 'npm install -g @anthropic-ai/claude-code@latest',
|
|
469
|
+
};
|
|
470
|
+
const cmd = allowedPackages[pkgName];
|
|
471
|
+
if (!cmd) {
|
|
472
|
+
json(res, { error: `Package "${pkgName}" is not in the allowed update list.` }, 400);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const { stdout } = await execAsync(cmd, { timeout: 120000 });
|
|
477
|
+
json(res, { success: true, package: pkgName, output: stdout.trim() });
|
|
478
|
+
}
|
|
479
|
+
catch (err) {
|
|
480
|
+
json(res, { error: err instanceof Error ? err.message : String(err) }, 500);
|
|
481
|
+
}
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
365
484
|
// GET /api/capabilities — list all packs + enabled status
|
|
366
485
|
if (path === '/api/capabilities') {
|
|
367
486
|
const { getAvailablePacks, isEnabled } = await import('../capabilities/index.js');
|
|
@@ -378,16 +497,29 @@ export function startDashboardServer(port = 0) {
|
|
|
378
497
|
if (path.match(/^\/api\/capabilities\/[^/]+\/enable$/) && req.method === 'POST') {
|
|
379
498
|
const packId = path.split('/')[3];
|
|
380
499
|
let body = '';
|
|
381
|
-
for await (const chunk of req)
|
|
500
|
+
for await (const chunk of req) {
|
|
382
501
|
body += chunk;
|
|
383
|
-
|
|
502
|
+
if (body.length > 1_000_000) {
|
|
503
|
+
json(res, { error: 'Payload too large' }, 413);
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
let parsedCap;
|
|
508
|
+
try {
|
|
509
|
+
parsedCap = JSON.parse(body);
|
|
510
|
+
}
|
|
511
|
+
catch {
|
|
512
|
+
json(res, { error: 'Invalid JSON' }, 400);
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
const { apiKey } = parsedCap;
|
|
384
516
|
const { enablePack } = await import('../capabilities/index.js');
|
|
385
517
|
try {
|
|
386
518
|
enablePack(packId, apiKey);
|
|
387
519
|
json(res, { success: true, message: 'Restart daemon to activate.' });
|
|
388
520
|
}
|
|
389
521
|
catch (err) {
|
|
390
|
-
json(res, { error: err.message }, 400);
|
|
522
|
+
json(res, { error: err instanceof Error ? err.message : String(err) }, 400);
|
|
391
523
|
}
|
|
392
524
|
return;
|
|
393
525
|
}
|
|
@@ -421,4 +553,3 @@ export function startDashboardServer(port = 0) {
|
|
|
421
553
|
process.exit(0);
|
|
422
554
|
});
|
|
423
555
|
}
|
|
424
|
-
//# sourceMappingURL=server.js.map
|
package/dist/db/index.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
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
|
+
};
|
|
3
14
|
export declare function closeDb(): void;
|
|
4
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/db/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
1
2
|
import Database from 'better-sqlite3';
|
|
2
3
|
import { getDbPath, ensureBeecorkDirs } from '../util/paths.js';
|
|
3
4
|
import { runMigrations } from './migrations.js';
|
|
@@ -65,6 +66,7 @@ export function getDb() {
|
|
|
65
66
|
// Prune old routing/permission history (keep last 1000 entries)
|
|
66
67
|
db?.exec('DELETE FROM routing_history WHERE created_at < (SELECT created_at FROM routing_history ORDER BY created_at DESC LIMIT 1 OFFSET 999)');
|
|
67
68
|
db?.exec('DELETE FROM permission_history WHERE created_at < (SELECT created_at FROM permission_history ORDER BY created_at DESC LIMIT 1 OFFSET 999)');
|
|
69
|
+
db?.exec("DELETE FROM activity_log WHERE created_at < datetime('now', '-90 days')");
|
|
68
70
|
}
|
|
69
71
|
catch (err) {
|
|
70
72
|
logger.warn('WAL checkpoint/cleanup error:', err);
|
|
@@ -72,6 +74,16 @@ export function getDb() {
|
|
|
72
74
|
}, 30 * 60 * 1000); // every 30 minutes
|
|
73
75
|
return db;
|
|
74
76
|
}
|
|
77
|
+
/** Shared tab record creation — used by dashboard, MCP, and TabManager */
|
|
78
|
+
export function createTabRecord(db, opts) {
|
|
79
|
+
const existing = db.prepare('SELECT name FROM tabs WHERE name = ?').get(opts.name);
|
|
80
|
+
if (existing)
|
|
81
|
+
return { id: '', name: opts.name, created: false };
|
|
82
|
+
const id = crypto.randomUUID();
|
|
83
|
+
const dir = opts.workingDir || process.env.HOME || '/';
|
|
84
|
+
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);
|
|
85
|
+
return { id, name: opts.name, created: true };
|
|
86
|
+
}
|
|
75
87
|
export function closeDb() {
|
|
76
88
|
if (walInterval) {
|
|
77
89
|
clearInterval(walInterval);
|
|
@@ -82,4 +94,3 @@ export function closeDb() {
|
|
|
82
94
|
db = null;
|
|
83
95
|
}
|
|
84
96
|
}
|
|
85
|
-
//# sourceMappingURL=index.js.map
|
package/dist/db/migrations.d.ts
CHANGED
package/dist/db/migrations.js
CHANGED
|
@@ -195,6 +195,50 @@ const MIGRATIONS = [
|
|
|
195
195
|
description: 'Add index on messages.created_at for date-range cost queries',
|
|
196
196
|
up: 'CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)',
|
|
197
197
|
},
|
|
198
|
+
{
|
|
199
|
+
version: 18,
|
|
200
|
+
description: 'Rename cron_jobs table to tasks',
|
|
201
|
+
up: 'ALTER TABLE cron_jobs RENAME TO tasks',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
version: 19,
|
|
205
|
+
description: 'Add watchers table',
|
|
206
|
+
up: `CREATE TABLE IF NOT EXISTS watchers (
|
|
207
|
+
id TEXT PRIMARY KEY,
|
|
208
|
+
name TEXT NOT NULL,
|
|
209
|
+
description TEXT,
|
|
210
|
+
check_command TEXT NOT NULL,
|
|
211
|
+
condition TEXT NOT NULL,
|
|
212
|
+
action TEXT NOT NULL DEFAULT 'notify',
|
|
213
|
+
action_details TEXT,
|
|
214
|
+
schedule TEXT NOT NULL,
|
|
215
|
+
last_check_at TEXT,
|
|
216
|
+
last_triggered_at TEXT,
|
|
217
|
+
trigger_count INTEGER DEFAULT 0,
|
|
218
|
+
enabled INTEGER DEFAULT 1,
|
|
219
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
220
|
+
)`,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
version: 20,
|
|
224
|
+
description: 'Add activity_log table for timeline',
|
|
225
|
+
up: `CREATE TABLE IF NOT EXISTS activity_log (
|
|
226
|
+
id TEXT PRIMARY KEY,
|
|
227
|
+
event_type TEXT NOT NULL,
|
|
228
|
+
project_name TEXT,
|
|
229
|
+
tab_name TEXT,
|
|
230
|
+
summary TEXT NOT NULL,
|
|
231
|
+
details TEXT,
|
|
232
|
+
duration_ms INTEGER,
|
|
233
|
+
cost_usd REAL,
|
|
234
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
235
|
+
)`,
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
version: 21,
|
|
239
|
+
description: 'Add index on activity_log.created_at',
|
|
240
|
+
up: 'CREATE INDEX IF NOT EXISTS idx_activity_log_created ON activity_log(created_at)',
|
|
241
|
+
},
|
|
198
242
|
];
|
|
199
243
|
export function runMigrations(db) {
|
|
200
244
|
// Ensure schema_version table exists
|
|
@@ -247,4 +291,3 @@ export function runMigrations(db) {
|
|
|
247
291
|
db.prepare('UPDATE schema_version SET version = ?').run(migration.version);
|
|
248
292
|
}
|
|
249
293
|
}
|
|
250
|
-
//# sourceMappingURL=migrations.js.map
|
|
@@ -12,10 +12,7 @@ export interface Delegation {
|
|
|
12
12
|
}
|
|
13
13
|
/** Create a new delegation */
|
|
14
14
|
export declare function createDelegation(sourceTab: string, targetTab: string, message: string, returnToTab?: string): Delegation;
|
|
15
|
-
/** Mark a delegation as running */
|
|
16
|
-
export declare function markDelegationRunning(id: string): void;
|
|
17
15
|
/** Complete a delegation with a result */
|
|
18
16
|
export declare function completeDelegation(targetTab: string, result: string): Delegation | null;
|
|
19
17
|
/** Get pending delegations for a tab */
|
|
20
18
|
export declare function getPendingDelegations(tabName?: string): Delegation[];
|
|
21
|
-
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -33,10 +33,6 @@ export function createDelegation(sourceTab, targetTab, message, returnToTab) {
|
|
|
33
33
|
logger.info(`Delegation created: ${sourceTab} → ${targetTab} (depth ${delegation.depth})`);
|
|
34
34
|
return delegation;
|
|
35
35
|
}
|
|
36
|
-
/** Mark a delegation as running */
|
|
37
|
-
export function markDelegationRunning(id) {
|
|
38
|
-
getDb().prepare("UPDATE delegations SET status = 'running' WHERE id = ?").run(id);
|
|
39
|
-
}
|
|
40
36
|
/** Complete a delegation with a result */
|
|
41
37
|
export function completeDelegation(targetTab, result) {
|
|
42
38
|
const db = getDb();
|
|
@@ -85,4 +81,3 @@ function getCurrentDepth(tabName) {
|
|
|
85
81
|
const row = db.prepare("SELECT MAX(depth) as d FROM delegations WHERE source_tab = ? AND status IN ('pending', 'running')").get(tabName);
|
|
86
82
|
return row.d ?? 0;
|
|
87
83
|
}
|
|
88
|
-
//# sourceMappingURL=manager.js.map
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ program
|
|
|
27
27
|
.action(stopDaemon);
|
|
28
28
|
program
|
|
29
29
|
.command('status')
|
|
30
|
-
.description('Show daemon status, running tabs, and
|
|
30
|
+
.description('Show daemon status, running tabs, and tasks')
|
|
31
31
|
.action(showStatus);
|
|
32
32
|
program
|
|
33
33
|
.command('tabs')
|
|
@@ -37,9 +37,35 @@ program
|
|
|
37
37
|
.command('logs [tab]')
|
|
38
38
|
.description('Tail logs for a tab (default: daemon logs)')
|
|
39
39
|
.action(tailLogs);
|
|
40
|
+
// Tasks (new name)
|
|
41
|
+
const taskCmd = program
|
|
42
|
+
.command('tasks')
|
|
43
|
+
.description('Manage scheduled tasks');
|
|
44
|
+
taskCmd
|
|
45
|
+
.command('list')
|
|
46
|
+
.description('List all tasks')
|
|
47
|
+
.action(listCrons);
|
|
48
|
+
taskCmd
|
|
49
|
+
.command('delete <id>')
|
|
50
|
+
.description('Delete a task by ID')
|
|
51
|
+
.action(deleteCron);
|
|
52
|
+
program
|
|
53
|
+
.command('task')
|
|
54
|
+
.description('Alias for tasks')
|
|
55
|
+
.argument('[subcommand]', 'Subcommand (list, delete)')
|
|
56
|
+
.argument('[id]', 'Task ID (for delete)')
|
|
57
|
+
.action(async (sub, id) => {
|
|
58
|
+
if (sub === 'delete' && id) {
|
|
59
|
+
await deleteCron(id);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await listCrons();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Backward-compatible cron aliases (hidden)
|
|
40
66
|
const cronCmd = program
|
|
41
|
-
.command('cron')
|
|
42
|
-
.description('Manage cron jobs');
|
|
67
|
+
.command('cron', { hidden: true })
|
|
68
|
+
.description('Manage cron jobs (alias for tasks)');
|
|
43
69
|
cronCmd
|
|
44
70
|
.command('list')
|
|
45
71
|
.description('List all cron jobs')
|
|
@@ -48,6 +74,28 @@ cronCmd
|
|
|
48
74
|
.command('delete <id>')
|
|
49
75
|
.description('Delete a cron job by ID')
|
|
50
76
|
.action(deleteCron);
|
|
77
|
+
// Watcher commands
|
|
78
|
+
program
|
|
79
|
+
.command('watches')
|
|
80
|
+
.description('List all watchers')
|
|
81
|
+
.action(async () => {
|
|
82
|
+
const { listWatchers } = await import('./cli/commands.js');
|
|
83
|
+
await listWatchers();
|
|
84
|
+
});
|
|
85
|
+
program
|
|
86
|
+
.command('watch')
|
|
87
|
+
.description('Manage watchers')
|
|
88
|
+
.argument('[subcommand]', 'Subcommand (list, delete)')
|
|
89
|
+
.argument('[id]', 'Watcher ID (for delete)')
|
|
90
|
+
.action(async (sub, id) => {
|
|
91
|
+
const { listWatchers, deleteWatcher } = await import('./cli/commands.js');
|
|
92
|
+
if (sub === 'delete' && id) {
|
|
93
|
+
await deleteWatcher(id);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
await listWatchers();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
51
99
|
const memoryCmd = program
|
|
52
100
|
.command('memory')
|
|
53
101
|
.description('Manage long-term memories');
|
|
@@ -192,7 +240,7 @@ program
|
|
|
192
240
|
console.log('\nClaude can now control your mouse, keyboard, and screen.');
|
|
193
241
|
console.log('Make sure you have granted permissions:');
|
|
194
242
|
console.log(' macOS: System Settings → Privacy → Screen Recording + Accessibility');
|
|
195
|
-
console.log(' Guide: https://
|
|
243
|
+
console.log(' Guide: https://github.com/beecork/beecork/blob/main/docs/troubleshooting.md');
|
|
196
244
|
}
|
|
197
245
|
console.log('\nRestart daemon to apply: beecork stop && beecork start\n');
|
|
198
246
|
});
|
|
@@ -224,7 +272,8 @@ Useful commands:
|
|
|
224
272
|
beecork logs \u2014 View daemon logs
|
|
225
273
|
beecork doctor \u2014 Run diagnostics
|
|
226
274
|
beecork dashboard \u2014 Open web dashboard
|
|
227
|
-
beecork
|
|
275
|
+
beecork tasks list \u2014 View scheduled tasks
|
|
276
|
+
beecork watches \u2014 View active watchers
|
|
228
277
|
|
|
229
278
|
${os === 'darwin' ? 'On macOS: beecork runs as a launchd service.\n Check: launchctl list | grep beecork' : ''}${os === 'linux' ? 'On Linux: beecork runs as a systemd service.\n Check: systemctl --user status beecork' : ''}
|
|
230
279
|
`);
|
|
@@ -406,5 +455,74 @@ program
|
|
|
406
455
|
const { listCapabilities } = await import('./cli/capabilities.js');
|
|
407
456
|
await listCapabilities();
|
|
408
457
|
});
|
|
458
|
+
program
|
|
459
|
+
.command('history [date]')
|
|
460
|
+
.description('Show activity timeline (default: today, or "yesterday", or YYYY-MM-DD)')
|
|
461
|
+
.action(async (dateArg) => {
|
|
462
|
+
const { getTimeline, formatTimeline } = await import('./timeline/index.js');
|
|
463
|
+
let date;
|
|
464
|
+
if (dateArg === 'yesterday') {
|
|
465
|
+
date = new Date(Date.now() - 86400000).toISOString().slice(0, 10);
|
|
466
|
+
}
|
|
467
|
+
else if (dateArg) {
|
|
468
|
+
date = dateArg;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
date = new Date().toISOString().slice(0, 10);
|
|
472
|
+
}
|
|
473
|
+
const events = getTimeline({ date });
|
|
474
|
+
console.log(formatTimeline(events));
|
|
475
|
+
});
|
|
476
|
+
program
|
|
477
|
+
.command('knowledge [scope]')
|
|
478
|
+
.description('List stored knowledge (global, project <path>, or all)')
|
|
479
|
+
.action(async (scope) => {
|
|
480
|
+
const { getGlobalKnowledge, getProjectKnowledge, getAllKnowledge, formatKnowledgeForContext } = await import('./knowledge/index.js');
|
|
481
|
+
let entries;
|
|
482
|
+
if (scope === 'global') {
|
|
483
|
+
entries = getGlobalKnowledge();
|
|
484
|
+
}
|
|
485
|
+
else if (scope?.startsWith('project')) {
|
|
486
|
+
const projectPath = scope.split(' ').slice(1).join(' ') || process.cwd();
|
|
487
|
+
entries = getProjectKnowledge(projectPath);
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
entries = getAllKnowledge();
|
|
491
|
+
}
|
|
492
|
+
if (entries.length === 0) {
|
|
493
|
+
console.log('No knowledge stored yet.');
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
console.log(formatKnowledgeForContext(entries));
|
|
497
|
+
});
|
|
498
|
+
const storeCmd = program
|
|
499
|
+
.command('store')
|
|
500
|
+
.description('Browse and install community extensions');
|
|
501
|
+
storeCmd
|
|
502
|
+
.command('search <query>')
|
|
503
|
+
.description('Search for beecork packages on npm')
|
|
504
|
+
.action(async (query) => {
|
|
505
|
+
const { storeSearch } = await import('./cli/store.js');
|
|
506
|
+
await storeSearch(query);
|
|
507
|
+
});
|
|
508
|
+
storeCmd
|
|
509
|
+
.command('install <package>')
|
|
510
|
+
.description('Install a community package')
|
|
511
|
+
.action(async (pkg) => {
|
|
512
|
+
const { storeInstall } = await import('./cli/store.js');
|
|
513
|
+
storeInstall(pkg);
|
|
514
|
+
});
|
|
515
|
+
storeCmd
|
|
516
|
+
.command('info <package>')
|
|
517
|
+
.description('Show package details')
|
|
518
|
+
.action(async (pkg) => {
|
|
519
|
+
const { storeInfo } = await import('./cli/store.js');
|
|
520
|
+
await storeInfo(pkg);
|
|
521
|
+
});
|
|
522
|
+
program
|
|
523
|
+
.command('help')
|
|
524
|
+
.description('Show help')
|
|
525
|
+
.action(() => {
|
|
526
|
+
program.outputHelp();
|
|
527
|
+
});
|
|
409
528
|
program.parse();
|
|
410
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getGlobalKnowledge, addGlobalKnowledge, getProjectKnowledge, addProjectKnowledge, getTabKnowledge, getAllKnowledge, formatKnowledgeForContext, addKnowledge, searchKnowledge, } from './manager.js';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { KnowledgeEntry, KnowledgeScope } from './types.js';
|
|
2
|
+
export declare function getGlobalKnowledge(): KnowledgeEntry[];
|
|
3
|
+
export declare function addGlobalKnowledge(content: string, category?: string): void;
|
|
4
|
+
export declare function getProjectKnowledge(projectPath: string): KnowledgeEntry[];
|
|
5
|
+
export declare function addProjectKnowledge(projectPath: string, content: string): void;
|
|
6
|
+
export declare function getTabKnowledge(tabName: string): KnowledgeEntry[];
|
|
7
|
+
export declare function getAllKnowledge(projectPath?: string, tabName?: string): KnowledgeEntry[];
|
|
8
|
+
/** Format knowledge for injection into Claude's context */
|
|
9
|
+
export declare function formatKnowledgeForContext(entries: KnowledgeEntry[]): string;
|
|
10
|
+
/** Add knowledge to the right scope */
|
|
11
|
+
export declare function addKnowledge(content: string, scope: KnowledgeScope, options?: {
|
|
12
|
+
projectPath?: string;
|
|
13
|
+
tabName?: string;
|
|
14
|
+
category?: string;
|
|
15
|
+
}): void;
|
|
16
|
+
/** Search knowledge across all layers */
|
|
17
|
+
export declare function searchKnowledge(query: string, projectPath?: string, tabName?: string): KnowledgeEntry[];
|