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
|
@@ -6,6 +6,3 @@ export declare function startWindowsService(): void;
|
|
|
6
6
|
export declare function stopWindowsService(): void;
|
|
7
7
|
/** Uninstall the Windows service */
|
|
8
8
|
export declare function uninstallWindowsService(): void;
|
|
9
|
-
/** Check if the Windows service is installed */
|
|
10
|
-
export declare function isWindowsServiceInstalled(): boolean;
|
|
11
|
-
//# sourceMappingURL=windows.d.ts.map
|
package/dist/service/windows.js
CHANGED
|
@@ -57,14 +57,3 @@ export function uninstallWindowsService() {
|
|
|
57
57
|
console.error('Failed to uninstall service.');
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
/** Check if the Windows service is installed */
|
|
61
|
-
export function isWindowsServiceInstalled() {
|
|
62
|
-
try {
|
|
63
|
-
execSync(`schtasks /Query /TN "${TASK_NAME}" 2>nul`, { stdio: 'ignore' });
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=windows.js.map
|
package/dist/session/manager.js
CHANGED
|
@@ -6,6 +6,8 @@ import { getDb } from '../db/index.js';
|
|
|
6
6
|
import { resolveWorkingDir, validateTabName } from '../config.js';
|
|
7
7
|
import { logger } from '../util/logger.js';
|
|
8
8
|
import { extractMemories, getRelevantMemories } from '../memory/extractor.js';
|
|
9
|
+
import { logActivity } from '../timeline/index.js';
|
|
10
|
+
import { getAllKnowledge, formatKnowledgeForContext } from '../knowledge/index.js';
|
|
9
11
|
function rowToTab(row) {
|
|
10
12
|
return {
|
|
11
13
|
id: row.id,
|
|
@@ -128,7 +130,7 @@ export class TabManager {
|
|
|
128
130
|
if (pendingPollCount % 100 === 0) {
|
|
129
131
|
db.prepare("DELETE FROM pending_messages WHERE processed = 1 AND created_at < datetime('now', '-1 day')").run();
|
|
130
132
|
}
|
|
131
|
-
const pending = db.prepare('SELECT * FROM pending_messages WHERE processed = 0 ORDER BY created_at ASC').all();
|
|
133
|
+
const pending = db.prepare('SELECT * FROM pending_messages WHERE processed = 0 ORDER BY created_at ASC LIMIT 50').all();
|
|
132
134
|
if (pending.length === 0)
|
|
133
135
|
return;
|
|
134
136
|
for (const msg of pending) {
|
|
@@ -147,6 +149,7 @@ export class TabManager {
|
|
|
147
149
|
}
|
|
148
150
|
async executeMessage(tab, prompt, resume, onTextChunk, skipExtraction, onToolUse, compactionDepth) {
|
|
149
151
|
const db = getDb();
|
|
152
|
+
logActivity('task_started', 'Processing message', { tabName: tab.name, details: prompt.slice(0, 500) });
|
|
150
153
|
// Budget check before spawning
|
|
151
154
|
if (this.config.claudeCode.maxBudgetUsd) {
|
|
152
155
|
const tabSpend = db.prepare('SELECT COALESCE(SUM(cost_usd), 0) as total FROM messages WHERE tab_id = ?').get(tab.id).total;
|
|
@@ -165,12 +168,20 @@ export class TabManager {
|
|
|
165
168
|
if (tabConfig?.approvalMode && tabConfig.approvalMode !== 'yolo') {
|
|
166
169
|
logger.warn(`Tab "${tab.name}" has approvalMode="${tabConfig.approvalMode}" ā interactive approval not yet implemented, running in yolo mode`);
|
|
167
170
|
}
|
|
168
|
-
// Inject
|
|
169
|
-
const
|
|
171
|
+
// Inject knowledge from all three layers
|
|
172
|
+
const knowledge = getAllKnowledge(tab.workingDir, tab.name);
|
|
173
|
+
const knowledgeContext = formatKnowledgeForContext(knowledge);
|
|
170
174
|
let enrichedPrompt = prompt;
|
|
175
|
+
if (knowledgeContext) {
|
|
176
|
+
enrichedPrompt = `${knowledgeContext}\n\n${prompt}`;
|
|
177
|
+
}
|
|
178
|
+
// Also inject relevant memories as fallback (additive)
|
|
179
|
+
const memories = getRelevantMemories(tab.name);
|
|
171
180
|
if (memories.length > 0) {
|
|
172
181
|
const memoryContext = memories.map(m => `- ${m}`).join('\n');
|
|
173
|
-
|
|
182
|
+
if (!knowledgeContext) {
|
|
183
|
+
enrichedPrompt = `[Context from memory:\n${memoryContext}\n]\n\n${prompt}`;
|
|
184
|
+
}
|
|
174
185
|
}
|
|
175
186
|
// Store user message
|
|
176
187
|
db.prepare('INSERT INTO messages (tab_id, role, content) VALUES (?, ?, ?)')
|
|
@@ -252,7 +263,7 @@ export class TabManager {
|
|
|
252
263
|
error: resultEvent?.is_error ?? (code !== 0),
|
|
253
264
|
};
|
|
254
265
|
// Handle resume failure (session expired/not found) ā retry with fresh session + context
|
|
255
|
-
if (result.error && shouldResume && result.text.
|
|
266
|
+
if (result.error && shouldResume && result.text.match(/session (not found|expired|invalid)/i)) {
|
|
256
267
|
logger.info(`[${tab.name}] Session resume failed, retrying with context injection`);
|
|
257
268
|
const recentMsgs = db.prepare('SELECT role, content FROM messages WHERE tab_id = ? ORDER BY created_at DESC LIMIT 5').all(tab.id);
|
|
258
269
|
const context = recentMsgs.reverse().map(m => `${m.role}: ${m.content.slice(0, 200)}`).join('\n');
|
|
@@ -269,6 +280,7 @@ export class TabManager {
|
|
|
269
280
|
// Update tab
|
|
270
281
|
db.prepare('UPDATE tabs SET status = ?, last_activity_at = ?, pid = NULL WHERE name = ?')
|
|
271
282
|
.run('idle', new Date().toISOString(), tab.name);
|
|
283
|
+
logActivity('task_completed', 'Message processed', { tabName: tab.name, durationMs: result.durationMs, costUsd: result.costUsd, details: result.text.slice(0, 500) });
|
|
272
284
|
// Context window compaction: if checkpoint was triggered, restart with summary
|
|
273
285
|
const currentDepth = compactionDepth ?? 0;
|
|
274
286
|
if (checkpointTriggered && !result.error && result.text && currentDepth < 2) {
|
|
@@ -325,6 +337,7 @@ export class TabManager {
|
|
|
325
337
|
this.subprocesses.delete(tab.name);
|
|
326
338
|
this.circuitBreakers.delete(tab.name);
|
|
327
339
|
this.updateTabStatus(tab.name, 'error');
|
|
340
|
+
logActivity('task_failed', 'Message failed', { tabName: tab.name, details: err instanceof Error ? err.message : String(err) });
|
|
328
341
|
reject(err);
|
|
329
342
|
this.processNextInQueue(tab.name);
|
|
330
343
|
},
|
|
@@ -363,4 +376,3 @@ export class TabManager {
|
|
|
363
376
|
}
|
|
364
377
|
}
|
|
365
378
|
}
|
|
366
|
-
//# sourceMappingURL=manager.js.map
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
1
2
|
import type { TabManager, NotifyCallback } from '../session/manager.js';
|
|
2
|
-
export declare
|
|
3
|
+
export declare const execAsync: typeof exec.__promisify__;
|
|
4
|
+
export declare class TaskScheduler {
|
|
3
5
|
private tabManager;
|
|
4
6
|
private onNotify;
|
|
5
7
|
private scheduledJobs;
|
|
6
8
|
private store;
|
|
7
9
|
constructor(tabManager: TabManager, onNotify: NotifyCallback | null);
|
|
8
|
-
/** Load all
|
|
10
|
+
/** Load all tasks from store and schedule them */
|
|
9
11
|
loadAndSchedule(): void;
|
|
10
12
|
/** Check for the reload signal file and reload if present */
|
|
11
13
|
checkForReload(): void;
|
|
12
|
-
/** Stop all scheduled
|
|
14
|
+
/** Stop all scheduled tasks */
|
|
13
15
|
stopAll(): void;
|
|
14
16
|
private scheduleJob;
|
|
15
17
|
private fireJob;
|
|
@@ -19,4 +21,3 @@ export declare class CronScheduler {
|
|
|
19
21
|
export declare function intervalToMs(interval: string): number | null;
|
|
20
22
|
/** Convert human interval (30m, 2h, 1d, 1h30m, 2w) to cron expression */
|
|
21
23
|
export declare function intervalToCron(interval: string): string | null;
|
|
22
|
-
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import cron from 'node-cron';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import {
|
|
4
|
+
import { exec } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { TaskStore } from './store.js';
|
|
5
7
|
import { getCronReloadSignalPath, getLogsDir } from '../util/paths.js';
|
|
6
8
|
import { logger } from '../util/logger.js';
|
|
7
|
-
export
|
|
9
|
+
export const execAsync = promisify(exec);
|
|
10
|
+
export class TaskScheduler {
|
|
8
11
|
tabManager;
|
|
9
12
|
onNotify;
|
|
10
13
|
scheduledJobs = new Map();
|
|
11
|
-
store = new
|
|
14
|
+
store = new TaskStore();
|
|
12
15
|
constructor(tabManager, onNotify) {
|
|
13
16
|
this.tabManager = tabManager;
|
|
14
17
|
this.onNotify = onNotify;
|
|
15
18
|
}
|
|
16
|
-
/** Load all
|
|
19
|
+
/** Load all tasks from store and schedule them */
|
|
17
20
|
loadAndSchedule() {
|
|
18
21
|
// Cancel existing
|
|
19
22
|
for (const [, task] of this.scheduledJobs) {
|
|
@@ -30,7 +33,7 @@ export class CronScheduler {
|
|
|
30
33
|
if (job.scheduleType === 'at' && !job.lastRunAt) {
|
|
31
34
|
const targetTime = new Date(job.schedule).getTime();
|
|
32
35
|
if (targetTime <= Date.now()) {
|
|
33
|
-
logger.warn(`
|
|
36
|
+
logger.warn(`Task: missed fire detected for "${job.name}" (was scheduled for ${job.schedule}), firing now`);
|
|
34
37
|
missedFires++;
|
|
35
38
|
this.fireJob(job);
|
|
36
39
|
this.store.update(job.id, { enabled: false }); // Disable after one-time execution
|
|
@@ -40,7 +43,7 @@ export class CronScheduler {
|
|
|
40
43
|
this.scheduleJob(job);
|
|
41
44
|
scheduled++;
|
|
42
45
|
}
|
|
43
|
-
logger.info(`
|
|
46
|
+
logger.info(`Tasks: loaded ${scheduled} active tasks (${jobs.length} total)${missedFires > 0 ? `, fired ${missedFires} missed` : ''}`);
|
|
44
47
|
}
|
|
45
48
|
/** Check for the reload signal file and reload if present */
|
|
46
49
|
checkForReload() {
|
|
@@ -50,11 +53,11 @@ export class CronScheduler {
|
|
|
50
53
|
fs.unlinkSync(signalPath);
|
|
51
54
|
}
|
|
52
55
|
catch { /* race condition, ok */ }
|
|
53
|
-
logger.info('
|
|
56
|
+
logger.info('Tasks: reload signal detected, reloading schedules');
|
|
54
57
|
this.loadAndSchedule();
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
|
-
/** Stop all scheduled
|
|
60
|
+
/** Stop all scheduled tasks */
|
|
58
61
|
stopAll() {
|
|
59
62
|
for (const [, task] of this.scheduledJobs) {
|
|
60
63
|
task.stop();
|
|
@@ -65,7 +68,7 @@ export class CronScheduler {
|
|
|
65
68
|
switch (job.scheduleType) {
|
|
66
69
|
case 'cron': {
|
|
67
70
|
if (!cron.validate(job.schedule)) {
|
|
68
|
-
logger.error(`
|
|
71
|
+
logger.error(`Task: invalid expression for "${job.name}": ${job.schedule}`);
|
|
69
72
|
return;
|
|
70
73
|
}
|
|
71
74
|
const task = cron.schedule(job.schedule, () => this.fireJob(job));
|
|
@@ -76,7 +79,7 @@ export class CronScheduler {
|
|
|
76
79
|
const cronExpr = intervalToCron(job.schedule);
|
|
77
80
|
if (cronExpr) {
|
|
78
81
|
if (!cron.validate(cronExpr)) {
|
|
79
|
-
logger.error(`
|
|
82
|
+
logger.error(`Task: invalid cron expression for "${job.name}": ${cronExpr}`);
|
|
80
83
|
return;
|
|
81
84
|
}
|
|
82
85
|
const task = cron.schedule(cronExpr, () => this.fireJob(job));
|
|
@@ -90,7 +93,7 @@ export class CronScheduler {
|
|
|
90
93
|
this.scheduledJobs.set(job.id, { stop: () => clearInterval(timer) });
|
|
91
94
|
}
|
|
92
95
|
else {
|
|
93
|
-
logger.error(`
|
|
96
|
+
logger.error(`Task: invalid interval for "${job.name}": ${job.schedule}`);
|
|
94
97
|
}
|
|
95
98
|
}
|
|
96
99
|
break;
|
|
@@ -99,7 +102,7 @@ export class CronScheduler {
|
|
|
99
102
|
const targetTime = new Date(job.schedule).getTime();
|
|
100
103
|
const delay = targetTime - Date.now();
|
|
101
104
|
if (delay <= 0) {
|
|
102
|
-
logger.warn(`
|
|
105
|
+
logger.warn(`Task: one-time task "${job.name}" is in the past, skipping`);
|
|
103
106
|
return;
|
|
104
107
|
}
|
|
105
108
|
const timer = setTimeout(() => {
|
|
@@ -112,19 +115,19 @@ export class CronScheduler {
|
|
|
112
115
|
}
|
|
113
116
|
}
|
|
114
117
|
async fireJob(job) {
|
|
115
|
-
logger.info(`
|
|
116
|
-
const logFile = path.join(getLogsDir(), `
|
|
117
|
-
// Handle systemEvent
|
|
118
|
+
logger.info(`Task firing: "${job.name}" (${job.payloadType || 'agentTurn'}) -> tab:${job.tabName}`);
|
|
119
|
+
const logFile = path.join(getLogsDir(), `task-${job.name}.log`);
|
|
120
|
+
// Handle systemEvent -- internal Beecork actions, not Claude Code
|
|
118
121
|
if (job.payloadType === 'systemEvent') {
|
|
119
122
|
try {
|
|
120
123
|
await this.handleSystemEvent(job);
|
|
121
124
|
this.store.update(job.id, { lastRunAt: new Date().toISOString() });
|
|
122
|
-
fs.
|
|
125
|
+
await fs.promises.appendFile(logFile, `[${new Date().toISOString()}] SYSTEM: ${job.message}\n`);
|
|
123
126
|
}
|
|
124
127
|
catch (err) {
|
|
125
128
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
126
129
|
logger.error(`System event "${job.name}" failed:`, err);
|
|
127
|
-
fs.
|
|
130
|
+
await fs.promises.appendFile(logFile, `[${new Date().toISOString()}] ERROR: ${errMsg}\n`);
|
|
128
131
|
}
|
|
129
132
|
return;
|
|
130
133
|
}
|
|
@@ -134,28 +137,28 @@ export class CronScheduler {
|
|
|
134
137
|
this.store.update(job.id, { lastRunAt: new Date().toISOString() });
|
|
135
138
|
const firstLine = result.text.split('\n')[0]?.slice(0, 200) || '(no output)';
|
|
136
139
|
// Log result
|
|
137
|
-
fs.
|
|
138
|
-
// Notify (separate try/catch
|
|
140
|
+
await fs.promises.appendFile(logFile, `[${new Date().toISOString()}] SUCCESS: ${firstLine}\n`);
|
|
141
|
+
// Notify (separate try/catch -- notification failure shouldn't be reported as job failure)
|
|
139
142
|
try {
|
|
140
143
|
if (this.onNotify) {
|
|
141
144
|
if (result.error) {
|
|
142
|
-
await this.onNotify(
|
|
145
|
+
await this.onNotify(`[${job.name}] Failed -- ${firstLine}`);
|
|
143
146
|
}
|
|
144
147
|
else {
|
|
145
|
-
await this.onNotify(
|
|
148
|
+
await this.onNotify(`[${job.name}] Done -- ${firstLine}`);
|
|
146
149
|
}
|
|
147
150
|
}
|
|
148
151
|
}
|
|
149
152
|
catch (notifyErr) {
|
|
150
|
-
logger.warn(`
|
|
153
|
+
logger.warn(`Task "${job.name}" notification failed:`, notifyErr);
|
|
151
154
|
}
|
|
152
155
|
}
|
|
153
156
|
catch (err) {
|
|
154
157
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
155
|
-
logger.error(`
|
|
156
|
-
fs.
|
|
158
|
+
logger.error(`Task "${job.name}" failed:`, err);
|
|
159
|
+
await fs.promises.appendFile(logFile, `[${new Date().toISOString()}] ERROR: ${errMsg}\n`);
|
|
157
160
|
try {
|
|
158
|
-
await this.onNotify?.(
|
|
161
|
+
await this.onNotify?.(`[${job.name}] Failed -- ${errMsg}`);
|
|
159
162
|
}
|
|
160
163
|
catch { /* notification best-effort */ }
|
|
161
164
|
}
|
|
@@ -163,9 +166,9 @@ export class CronScheduler {
|
|
|
163
166
|
async handleSystemEvent(job) {
|
|
164
167
|
switch (job.message) {
|
|
165
168
|
case 'health_check':
|
|
166
|
-
logger.info('System event: health check
|
|
169
|
+
logger.info('System event: health check -- daemon alive');
|
|
167
170
|
if (this.onNotify) {
|
|
168
|
-
await this.onNotify('
|
|
171
|
+
await this.onNotify('Beecork health check: all systems operational');
|
|
169
172
|
}
|
|
170
173
|
break;
|
|
171
174
|
case 'memory_compaction':
|
|
@@ -214,7 +217,6 @@ export function intervalToCron(interval) {
|
|
|
214
217
|
// Weekly intervals
|
|
215
218
|
if (mins === 0 && hours === 0 && days === 0 && weeks > 0)
|
|
216
219
|
return `0 0 * * 0`;
|
|
217
|
-
// Combined or large intervals
|
|
220
|
+
// Combined or large intervals -- return null, handled by setInterval in scheduleJob
|
|
218
221
|
return null;
|
|
219
222
|
}
|
|
220
|
-
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Task } from '../types.js';
|
|
2
|
+
export declare class TaskStore {
|
|
3
|
+
constructor();
|
|
4
|
+
list(): Task[];
|
|
5
|
+
get(id: string): Task | undefined;
|
|
6
|
+
add(job: Task): void;
|
|
7
|
+
update(id: string, updates: Partial<Task>): boolean;
|
|
8
|
+
delete(id: string): boolean;
|
|
9
|
+
/** One-time migration from crontab.json to SQLite */
|
|
10
|
+
private migrateFromJson;
|
|
11
|
+
}
|
|
@@ -2,7 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import { getDb } from '../db/index.js';
|
|
3
3
|
import { getCrontabPath } from '../util/paths.js';
|
|
4
4
|
import { logger } from '../util/logger.js';
|
|
5
|
-
function
|
|
5
|
+
function rowToTask(row) {
|
|
6
6
|
return {
|
|
7
7
|
id: row.id, name: row.name,
|
|
8
8
|
scheduleType: row.schedule_type,
|
|
@@ -12,22 +12,22 @@ function rowToJob(row) {
|
|
|
12
12
|
lastRunAt: row.last_run_at, nextRunAt: row.next_run_at,
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
export class
|
|
15
|
+
export class TaskStore {
|
|
16
16
|
constructor() {
|
|
17
17
|
this.migrateFromJson();
|
|
18
18
|
}
|
|
19
19
|
list() {
|
|
20
20
|
const db = getDb();
|
|
21
|
-
return db.prepare('SELECT * FROM
|
|
21
|
+
return db.prepare('SELECT * FROM tasks WHERE user_id = ? ORDER BY created_at').all('local').map(rowToTask);
|
|
22
22
|
}
|
|
23
23
|
get(id) {
|
|
24
24
|
const db = getDb();
|
|
25
|
-
const row = db.prepare('SELECT * FROM
|
|
26
|
-
return row ?
|
|
25
|
+
const row = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
|
|
26
|
+
return row ? rowToTask(row) : undefined;
|
|
27
27
|
}
|
|
28
28
|
add(job) {
|
|
29
29
|
const db = getDb();
|
|
30
|
-
db.prepare(`INSERT INTO
|
|
30
|
+
db.prepare(`INSERT INTO tasks (id, name, schedule_type, schedule, tab_name, message, payload_type, enabled, user_id, created_at, last_run_at, next_run_at)
|
|
31
31
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(job.id, job.name, job.scheduleType, job.schedule, job.tabName, job.message, job.payloadType || 'agentTurn', job.enabled ? 1 : 0, 'local', job.createdAt, job.lastRunAt, job.nextRunAt);
|
|
32
32
|
}
|
|
33
33
|
update(id, updates) {
|
|
@@ -36,12 +36,12 @@ export class CronStore {
|
|
|
36
36
|
if (!existing)
|
|
37
37
|
return false;
|
|
38
38
|
const merged = { ...existing, ...updates };
|
|
39
|
-
db.prepare(`UPDATE
|
|
39
|
+
db.prepare(`UPDATE tasks SET name=?, schedule_type=?, schedule=?, tab_name=?, message=?, enabled=?, last_run_at=?, next_run_at=? WHERE id=?`).run(merged.name, merged.scheduleType, merged.schedule, merged.tabName, merged.message, merged.enabled ? 1 : 0, merged.lastRunAt, merged.nextRunAt, id);
|
|
40
40
|
return true;
|
|
41
41
|
}
|
|
42
42
|
delete(id) {
|
|
43
43
|
const db = getDb();
|
|
44
|
-
const result = db.prepare('DELETE FROM
|
|
44
|
+
const result = db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
|
|
45
45
|
return result.changes > 0;
|
|
46
46
|
}
|
|
47
47
|
/** One-time migration from crontab.json to SQLite */
|
|
@@ -50,7 +50,7 @@ export class CronStore {
|
|
|
50
50
|
if (!fs.existsSync(jsonPath))
|
|
51
51
|
return;
|
|
52
52
|
const db = getDb();
|
|
53
|
-
const count = db.prepare('SELECT COUNT(*) as count FROM
|
|
53
|
+
const count = db.prepare('SELECT COUNT(*) as count FROM tasks').get();
|
|
54
54
|
if (count.count > 0) {
|
|
55
55
|
// Already migrated, clean up JSON
|
|
56
56
|
try {
|
|
@@ -64,7 +64,7 @@ export class CronStore {
|
|
|
64
64
|
const jobs = data.jobs || [];
|
|
65
65
|
if (jobs.length === 0)
|
|
66
66
|
return;
|
|
67
|
-
const insert = db.prepare(`INSERT OR IGNORE INTO
|
|
67
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO tasks (id, name, schedule_type, schedule, tab_name, message, enabled, user_id, created_at, last_run_at, next_run_at)
|
|
68
68
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
69
69
|
const tx = db.transaction(() => {
|
|
70
70
|
for (const j of jobs) {
|
|
@@ -73,11 +73,10 @@ export class CronStore {
|
|
|
73
73
|
});
|
|
74
74
|
tx();
|
|
75
75
|
fs.renameSync(jsonPath, jsonPath + '.bak');
|
|
76
|
-
logger.info(`Migrated ${jobs.length}
|
|
76
|
+
logger.info(`Migrated ${jobs.length} tasks from JSON to SQLite`);
|
|
77
77
|
}
|
|
78
78
|
catch (err) {
|
|
79
|
-
logger.error('Failed to migrate
|
|
79
|
+
logger.error('Failed to migrate tasks from JSON:', err);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { getDb } from '../db/index.js';
|
|
3
|
+
export function logActivity(eventType, summary, options) {
|
|
4
|
+
try {
|
|
5
|
+
const db = getDb();
|
|
6
|
+
db.prepare('INSERT INTO activity_log (id, event_type, project_name, tab_name, summary, details, duration_ms, cost_usd) VALUES (?, ?, ?, ?, ?, ?, ?, ?)').run(uuidv4(), eventType, options?.projectName || null, options?.tabName || null, summary, options?.details || null, options?.durationMs || null, options?.costUsd || null);
|
|
7
|
+
}
|
|
8
|
+
catch { /* non-critical ā don't crash if logging fails */ }
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ActivityEvent } from './types.js';
|
|
2
|
+
export declare function getTimeline(options?: {
|
|
3
|
+
date?: string;
|
|
4
|
+
tabName?: string;
|
|
5
|
+
limit?: number;
|
|
6
|
+
}): ActivityEvent[];
|
|
7
|
+
export declare function formatTimeline(events: ActivityEvent[]): string;
|
|
8
|
+
export declare function getReplayInfo(eventId: string): {
|
|
9
|
+
tabName: string;
|
|
10
|
+
message: string;
|
|
11
|
+
} | null;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getDb } from '../db/index.js';
|
|
2
|
+
function rowToEvent(r) {
|
|
3
|
+
return {
|
|
4
|
+
id: r.id, eventType: r.event_type, projectName: r.project_name,
|
|
5
|
+
tabName: r.tab_name, summary: r.summary, details: r.details,
|
|
6
|
+
durationMs: r.duration_ms, costUsd: r.cost_usd, createdAt: r.created_at,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function getTimeline(options) {
|
|
10
|
+
const db = getDb();
|
|
11
|
+
let query = 'SELECT * FROM activity_log';
|
|
12
|
+
const conditions = [];
|
|
13
|
+
const params = [];
|
|
14
|
+
if (options?.date) {
|
|
15
|
+
conditions.push('date(created_at) = ?');
|
|
16
|
+
params.push(options.date);
|
|
17
|
+
}
|
|
18
|
+
if (options?.tabName) {
|
|
19
|
+
conditions.push('tab_name = ?');
|
|
20
|
+
params.push(options.tabName);
|
|
21
|
+
}
|
|
22
|
+
if (conditions.length > 0)
|
|
23
|
+
query += ' WHERE ' + conditions.join(' AND ');
|
|
24
|
+
query += ' ORDER BY created_at DESC';
|
|
25
|
+
query += ' LIMIT ?';
|
|
26
|
+
params.push(options?.limit || 50);
|
|
27
|
+
return db.prepare(query).all(...params).map(rowToEvent);
|
|
28
|
+
}
|
|
29
|
+
export function formatTimeline(events) {
|
|
30
|
+
if (events.length === 0)
|
|
31
|
+
return 'No activity recorded.';
|
|
32
|
+
const byDate = new Map();
|
|
33
|
+
for (const event of events.reverse()) {
|
|
34
|
+
const date = event.createdAt.slice(0, 10);
|
|
35
|
+
if (!byDate.has(date))
|
|
36
|
+
byDate.set(date, []);
|
|
37
|
+
byDate.get(date).push(event);
|
|
38
|
+
}
|
|
39
|
+
const lines = [];
|
|
40
|
+
for (const [date, dayEvents] of byDate) {
|
|
41
|
+
lines.push(`\nš
${date}`);
|
|
42
|
+
for (const e of dayEvents) {
|
|
43
|
+
const time = e.createdAt.slice(11, 16);
|
|
44
|
+
const tab = e.tabName ? `[${e.tabName}]` : '';
|
|
45
|
+
const cost = e.costUsd ? ` $${e.costUsd.toFixed(4)}` : '';
|
|
46
|
+
lines.push(` ${time} ${tab} ${e.summary}${cost}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
export function getReplayInfo(eventId) {
|
|
52
|
+
const db = getDb();
|
|
53
|
+
const event = db.prepare('SELECT * FROM activity_log WHERE id = ?').get(eventId);
|
|
54
|
+
if (!event || !event.tab_name || !event.details)
|
|
55
|
+
return null;
|
|
56
|
+
return { tabName: event.tab_name, message: event.details };
|
|
57
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type EventType = 'task_started' | 'task_completed' | 'task_failed' | 'watcher_triggered' | 'media_generated' | 'delegation_completed' | 'user_command' | 'system_event';
|
|
2
|
+
export interface ActivityEvent {
|
|
3
|
+
id: string;
|
|
4
|
+
eventType: EventType;
|
|
5
|
+
projectName: string | null;
|
|
6
|
+
tabName: string | null;
|
|
7
|
+
summary: string;
|
|
8
|
+
details: string | null;
|
|
9
|
+
durationMs: number | null;
|
|
10
|
+
costUsd: number | null;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/types.d.ts
CHANGED
|
@@ -95,6 +95,7 @@ export interface BeecorkConfig {
|
|
|
95
95
|
groups?: GroupConfig;
|
|
96
96
|
notifications?: NotificationConfig[];
|
|
97
97
|
mediaGenerators?: MediaGeneratorConfig[];
|
|
98
|
+
communityChannels?: string[];
|
|
98
99
|
deployment: 'local' | 'vps';
|
|
99
100
|
}
|
|
100
101
|
export type TabStatus = 'idle' | 'running' | 'error' | 'stopped';
|
|
@@ -161,16 +162,16 @@ export interface StreamUsage {
|
|
|
161
162
|
cache_read_input_tokens: number;
|
|
162
163
|
}
|
|
163
164
|
export type StreamEvent = StreamInit | StreamAssistant | StreamResult;
|
|
164
|
-
export type
|
|
165
|
-
export type
|
|
166
|
-
export interface
|
|
165
|
+
export type TaskScheduleType = 'at' | 'every' | 'cron';
|
|
166
|
+
export type TaskPayloadType = 'agentTurn' | 'systemEvent';
|
|
167
|
+
export interface Task {
|
|
167
168
|
id: string;
|
|
168
169
|
name: string;
|
|
169
|
-
scheduleType:
|
|
170
|
+
scheduleType: TaskScheduleType;
|
|
170
171
|
schedule: string;
|
|
171
172
|
tabName: string;
|
|
172
173
|
message: string;
|
|
173
|
-
payloadType:
|
|
174
|
+
payloadType: TaskPayloadType;
|
|
174
175
|
enabled: boolean;
|
|
175
176
|
createdAt: string;
|
|
176
177
|
lastRunAt: string | null;
|
|
@@ -187,4 +188,3 @@ export interface CircuitBreakerConfig {
|
|
|
187
188
|
maxRepeats: number;
|
|
188
189
|
windowSize: number;
|
|
189
190
|
}
|
|
190
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.js
CHANGED
package/dist/users/index.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export { resolveUser, registerUser, linkIdentity, listUsers, hasAdmin
|
|
1
|
+
export { resolveUser, registerUser, linkIdentity, listUsers, hasAdmin } from './service.js';
|
|
2
2
|
export type { User } from './service.js';
|
|
3
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/users/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export { resolveUser, registerUser, linkIdentity, listUsers, hasAdmin
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { resolveUser, registerUser, linkIdentity, listUsers, hasAdmin } from './service.js';
|
package/dist/users/service.d.ts
CHANGED
|
@@ -15,11 +15,3 @@ export declare function linkIdentity(userId: string, channelId: string, peerId:
|
|
|
15
15
|
export declare function listUsers(): User[];
|
|
16
16
|
/** Check if any admin exists */
|
|
17
17
|
export declare function hasAdmin(): boolean;
|
|
18
|
-
/** Get user's identities across channels */
|
|
19
|
-
export declare function getUserIdentities(userId: string): Array<{
|
|
20
|
-
channelId: string;
|
|
21
|
-
peerId: string;
|
|
22
|
-
}>;
|
|
23
|
-
/** Auto-create admin user from config's allowed IDs (migration helper) */
|
|
24
|
-
export declare function ensureAdminFromConfig(channelId: string, peerIds: Array<string | number>): void;
|
|
25
|
-
//# sourceMappingURL=service.d.ts.map
|