@viewportai/daemon 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +176 -0
- package/README.md +157 -0
- package/bin/vpd.js +3 -0
- package/dist/adapters/claude.d.ts +119 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +621 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex-event-normalizers.d.ts +10 -0
- package/dist/adapters/codex-event-normalizers.d.ts.map +1 -0
- package/dist/adapters/codex-event-normalizers.js +208 -0
- package/dist/adapters/codex-event-normalizers.js.map +1 -0
- package/dist/adapters/codex-sdk-loader.d.ts +47 -0
- package/dist/adapters/codex-sdk-loader.d.ts.map +1 -0
- package/dist/adapters/codex-sdk-loader.js +19 -0
- package/dist/adapters/codex-sdk-loader.js.map +1 -0
- package/dist/adapters/codex.d.ts +56 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +267 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-cli.d.ts +49 -0
- package/dist/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/adapters/gemini-cli.js +181 -0
- package/dist/adapters/gemini-cli.js.map +1 -0
- package/dist/adapters/pty.d.ts +56 -0
- package/dist/adapters/pty.d.ts.map +1 -0
- package/dist/adapters/pty.js +223 -0
- package/dist/adapters/pty.js.map +1 -0
- package/dist/agents/aider.d.ts +9 -0
- package/dist/agents/aider.d.ts.map +1 -0
- package/dist/agents/aider.js +37 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/built-in.d.ts +4 -0
- package/dist/agents/built-in.d.ts.map +1 -0
- package/dist/agents/built-in.js +6 -0
- package/dist/agents/built-in.js.map +1 -0
- package/dist/agents/claude.d.ts +12 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +93 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +6 -0
- package/dist/agents/codex.d.ts.map +1 -0
- package/dist/agents/codex.js +64 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/command-detection.d.ts +6 -0
- package/dist/agents/command-detection.d.ts.map +1 -0
- package/dist/agents/command-detection.js +12 -0
- package/dist/agents/command-detection.js.map +1 -0
- package/dist/agents/gemini.d.ts +6 -0
- package/dist/agents/gemini.d.ts.map +1 -0
- package/dist/agents/gemini.js +36 -0
- package/dist/agents/gemini.js.map +1 -0
- package/dist/cli/agent-commands.d.ts +2 -0
- package/dist/cli/agent-commands.d.ts.map +1 -0
- package/dist/cli/agent-commands.js +87 -0
- package/dist/cli/agent-commands.js.map +1 -0
- package/dist/cli/args.d.ts +9 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +34 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/command-shared.d.ts +53 -0
- package/dist/cli/command-shared.d.ts.map +1 -0
- package/dist/cli/command-shared.js +239 -0
- package/dist/cli/command-shared.js.map +1 -0
- package/dist/cli/commands.d.ts +20 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +20 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/daemon-client.d.ts +30 -0
- package/dist/cli/daemon-client.d.ts.map +1 -0
- package/dist/cli/daemon-client.js +161 -0
- package/dist/cli/daemon-client.js.map +1 -0
- package/dist/cli/daemon-lifecycle.d.ts +47 -0
- package/dist/cli/daemon-lifecycle.d.ts.map +1 -0
- package/dist/cli/daemon-lifecycle.js +262 -0
- package/dist/cli/daemon-lifecycle.js.map +1 -0
- package/dist/cli/daemon-settings.d.ts +9 -0
- package/dist/cli/daemon-settings.d.ts.map +1 -0
- package/dist/cli/daemon-settings.js +168 -0
- package/dist/cli/daemon-settings.js.map +1 -0
- package/dist/cli/directory-commands.d.ts +4 -0
- package/dist/cli/directory-commands.d.ts.map +1 -0
- package/dist/cli/directory-commands.js +190 -0
- package/dist/cli/directory-commands.js.map +1 -0
- package/dist/cli/hook-command.d.ts +14 -0
- package/dist/cli/hook-command.d.ts.map +1 -0
- package/dist/cli/hook-command.js +96 -0
- package/dist/cli/hook-command.js.map +1 -0
- package/dist/cli/install-command.d.ts +2 -0
- package/dist/cli/install-command.d.ts.map +1 -0
- package/dist/cli/install-command.js +91 -0
- package/dist/cli/install-command.js.map +1 -0
- package/dist/cli/lifecycle-commands.d.ts +10 -0
- package/dist/cli/lifecycle-commands.d.ts.map +1 -0
- package/dist/cli/lifecycle-commands.js +524 -0
- package/dist/cli/lifecycle-commands.js.map +1 -0
- package/dist/cli/listen-target.d.ts +13 -0
- package/dist/cli/listen-target.d.ts.map +1 -0
- package/dist/cli/listen-target.js +102 -0
- package/dist/cli/listen-target.js.map +1 -0
- package/dist/cli/orchestration-commands.d.ts +8 -0
- package/dist/cli/orchestration-commands.d.ts.map +1 -0
- package/dist/cli/orchestration-commands.js +340 -0
- package/dist/cli/orchestration-commands.js.map +1 -0
- package/dist/cli/permission-commands.d.ts +2 -0
- package/dist/cli/permission-commands.d.ts.map +1 -0
- package/dist/cli/permission-commands.js +138 -0
- package/dist/cli/permission-commands.js.map +1 -0
- package/dist/cli/runtime-toolchain.d.ts +35 -0
- package/dist/cli/runtime-toolchain.d.ts.map +1 -0
- package/dist/cli/runtime-toolchain.js +184 -0
- package/dist/cli/runtime-toolchain.js.map +1 -0
- package/dist/cli/service-commands.d.ts +19 -0
- package/dist/cli/service-commands.d.ts.map +1 -0
- package/dist/cli/service-commands.js +273 -0
- package/dist/cli/service-commands.js.map +1 -0
- package/dist/cli/session-commands.d.ts +3 -0
- package/dist/cli/session-commands.d.ts.map +1 -0
- package/dist/cli/session-commands.js +146 -0
- package/dist/cli/session-commands.js.map +1 -0
- package/dist/cli/setup-command.d.ts +12 -0
- package/dist/cli/setup-command.d.ts.map +1 -0
- package/dist/cli/setup-command.js +223 -0
- package/dist/cli/setup-command.js.map +1 -0
- package/dist/cli/supervisor-protocol.d.ts +20 -0
- package/dist/cli/supervisor-protocol.d.ts.map +1 -0
- package/dist/cli/supervisor-protocol.js +5 -0
- package/dist/cli/supervisor-protocol.js.map +1 -0
- package/dist/cli/supervisor.d.ts +10 -0
- package/dist/cli/supervisor.d.ts.map +1 -0
- package/dist/cli/supervisor.js +218 -0
- package/dist/cli/supervisor.js.map +1 -0
- package/dist/cli/worktree-commands.d.ts +2 -0
- package/dist/cli/worktree-commands.d.ts.map +1 -0
- package/dist/cli/worktree-commands.js +250 -0
- package/dist/cli/worktree-commands.js.map +1 -0
- package/dist/cli/ws-client.d.ts +20 -0
- package/dist/cli/ws-client.d.ts.map +1 -0
- package/dist/cli/ws-client.js +103 -0
- package/dist/cli/ws-client.js.map +1 -0
- package/dist/core/agent-registry.d.ts +128 -0
- package/dist/core/agent-registry.d.ts.map +1 -0
- package/dist/core/agent-registry.js +131 -0
- package/dist/core/agent-registry.js.map +1 -0
- package/dist/core/config-schema.d.ts +77 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +66 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +111 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +244 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/daemon.d.ts +113 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +197 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/discovered-sessions.d.ts +7 -0
- package/dist/core/discovered-sessions.d.ts.map +1 -0
- package/dist/core/discovered-sessions.js +39 -0
- package/dist/core/discovered-sessions.js.map +1 -0
- package/dist/core/error-codes.d.ts +31 -0
- package/dist/core/error-codes.d.ts.map +1 -0
- package/dist/core/error-codes.js +30 -0
- package/dist/core/error-codes.js.map +1 -0
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +43 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +183 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +61 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/interfaces.d.ts +115 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +9 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/logger.d.ts +11 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +17 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/metrics.d.ts +24 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +32 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/output.d.ts +13 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +22 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/permission-coordinator.d.ts +67 -0
- package/dist/core/permission-coordinator.d.ts.map +1 -0
- package/dist/core/permission-coordinator.js +209 -0
- package/dist/core/permission-coordinator.js.map +1 -0
- package/dist/core/session-manager.d.ts +121 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +354 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session-state-file.d.ts +20 -0
- package/dist/core/session-state-file.d.ts.map +1 -0
- package/dist/core/session-state-file.js +49 -0
- package/dist/core/session-state-file.js.map +1 -0
- package/dist/core/types.d.ts +250 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +88 -0
- package/dist/core/types.js.map +1 -0
- package/dist/directories/manager.d.ts +32 -0
- package/dist/directories/manager.d.ts.map +1 -0
- package/dist/directories/manager.js +86 -0
- package/dist/directories/manager.js.map +1 -0
- package/dist/discovery/claude.d.ts +29 -0
- package/dist/discovery/claude.d.ts.map +1 -0
- package/dist/discovery/claude.js +55 -0
- package/dist/discovery/claude.js.map +1 -0
- package/dist/discovery/codex.d.ts +11 -0
- package/dist/discovery/codex.d.ts.map +1 -0
- package/dist/discovery/codex.js +365 -0
- package/dist/discovery/codex.js.map +1 -0
- package/dist/discovery/gemini.d.ts +15 -0
- package/dist/discovery/gemini.d.ts.map +1 -0
- package/dist/discovery/gemini.js +151 -0
- package/dist/discovery/gemini.js.map +1 -0
- package/dist/discovery/jsonl-reader.d.ts +122 -0
- package/dist/discovery/jsonl-reader.d.ts.map +1 -0
- package/dist/discovery/jsonl-reader.js +622 -0
- package/dist/discovery/jsonl-reader.js.map +1 -0
- package/dist/discovery/watcher.d.ts +29 -0
- package/dist/discovery/watcher.d.ts.map +1 -0
- package/dist/discovery/watcher.js +383 -0
- package/dist/discovery/watcher.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/installers/base.d.ts +27 -0
- package/dist/hooks/installers/base.d.ts.map +1 -0
- package/dist/hooks/installers/base.js +9 -0
- package/dist/hooks/installers/base.js.map +1 -0
- package/dist/hooks/installers/claude.d.ts +18 -0
- package/dist/hooks/installers/claude.d.ts.map +1 -0
- package/dist/hooks/installers/claude.js +120 -0
- package/dist/hooks/installers/claude.js.map +1 -0
- package/dist/hooks/router.d.ts +63 -0
- package/dist/hooks/router.d.ts.map +1 -0
- package/dist/hooks/router.js +259 -0
- package/dist/hooks/router.js.map +1 -0
- package/dist/hooks/supervision.d.ts +27 -0
- package/dist/hooks/supervision.d.ts.map +1 -0
- package/dist/hooks/supervision.js +67 -0
- package/dist/hooks/supervision.js.map +1 -0
- package/dist/hooks/types.d.ts +171 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +148 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions/engine.d.ts +23 -0
- package/dist/permissions/engine.d.ts.map +1 -0
- package/dist/permissions/engine.js +43 -0
- package/dist/permissions/engine.js.map +1 -0
- package/dist/plugins/loader.d.ts +44 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +177 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/server/auth.d.ts +32 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +78 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/discovered-watch-key.d.ts +5 -0
- package/dist/server/discovered-watch-key.d.ts.map +1 -0
- package/dist/server/discovered-watch-key.js +31 -0
- package/dist/server/discovered-watch-key.js.map +1 -0
- package/dist/server/hello-builder.d.ts +17 -0
- package/dist/server/hello-builder.d.ts.map +1 -0
- package/dist/server/hello-builder.js +71 -0
- package/dist/server/hello-builder.js.map +1 -0
- package/dist/server/http-server.d.ts +30 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +561 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/message-normalizers.d.ts +11 -0
- package/dist/server/message-normalizers.d.ts.map +1 -0
- package/dist/server/message-normalizers.js +104 -0
- package/dist/server/message-normalizers.js.map +1 -0
- package/dist/server/pairing-offers.d.ts +78 -0
- package/dist/server/pairing-offers.d.ts.map +1 -0
- package/dist/server/pairing-offers.js +502 -0
- package/dist/server/pairing-offers.js.map +1 -0
- package/dist/server/rate-limiter.d.ts +21 -0
- package/dist/server/rate-limiter.d.ts.map +1 -0
- package/dist/server/rate-limiter.js +61 -0
- package/dist/server/rate-limiter.js.map +1 -0
- package/dist/server/ring-buffer.d.ts +34 -0
- package/dist/server/ring-buffer.d.ts.map +1 -0
- package/dist/server/ring-buffer.js +73 -0
- package/dist/server/ring-buffer.js.map +1 -0
- package/dist/server/security.d.ts +22 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +123 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/ws-command-handlers.d.ts +25 -0
- package/dist/server/ws-command-handlers.d.ts.map +1 -0
- package/dist/server/ws-command-handlers.js +218 -0
- package/dist/server/ws-command-handlers.js.map +1 -0
- package/dist/server/ws-daemon-event-bridge.d.ts +22 -0
- package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -0
- package/dist/server/ws-daemon-event-bridge.js +321 -0
- package/dist/server/ws-daemon-event-bridge.js.map +1 -0
- package/dist/server/ws-limits.d.ts +2 -0
- package/dist/server/ws-limits.d.ts.map +1 -0
- package/dist/server/ws-limits.js +12 -0
- package/dist/server/ws-limits.js.map +1 -0
- package/dist/server/ws-protocol.d.ts +248 -0
- package/dist/server/ws-protocol.d.ts.map +1 -0
- package/dist/server/ws-protocol.js +157 -0
- package/dist/server/ws-protocol.js.map +1 -0
- package/dist/server/ws-server.d.ts +26 -0
- package/dist/server/ws-server.d.ts.map +1 -0
- package/dist/server/ws-server.js +290 -0
- package/dist/server/ws-server.js.map +1 -0
- package/dist/startup-agents.d.ts +6 -0
- package/dist/startup-agents.d.ts.map +1 -0
- package/dist/startup-agents.js +97 -0
- package/dist/startup-agents.js.map +1 -0
- package/dist/startup-prereqs.d.ts +29 -0
- package/dist/startup-prereqs.d.ts.map +1 -0
- package/dist/startup-prereqs.js +209 -0
- package/dist/startup-prereqs.js.map +1 -0
- package/dist/startup-watchers.d.ts +7 -0
- package/dist/startup-watchers.d.ts.map +1 -0
- package/dist/startup-watchers.js +196 -0
- package/dist/startup-watchers.js.map +1 -0
- package/dist/startup.d.ts +20 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +335 -0
- package/dist/startup.js.map +1 -0
- package/dist/tracking/git-tracker.d.ts +52 -0
- package/dist/tracking/git-tracker.d.ts.map +1 -0
- package/dist/tracking/git-tracker.js +277 -0
- package/dist/tracking/git-tracker.js.map +1 -0
- package/dist/tracking/noop-tracker.d.ts +27 -0
- package/dist/tracking/noop-tracker.d.ts.map +1 -0
- package/dist/tracking/noop-tracker.js +42 -0
- package/dist/tracking/noop-tracker.js.map +1 -0
- package/docs/configuration.md +75 -0
- package/docs/developer-workflows.md +107 -0
- package/docs/protocol-matrix.json +155 -0
- package/docs/releasing.md +65 -0
- package/docs/security.md +48 -0
- package/docs/testing.md +112 -0
- package/package.json +84 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered configuration system for the Viewport daemon.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (later wins):
|
|
5
|
+
* built-in defaults → global config → directory overrides → session overrides
|
|
6
|
+
*
|
|
7
|
+
* Config file: ~/.viewport/config.json
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import os from 'node:os';
|
|
12
|
+
import { ViewportConfigSchema } from './config-schema.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Built-in defaults — AGENT-AGNOSTIC framework defaults only.
|
|
15
|
+
//
|
|
16
|
+
// Tool names and permission lists come from AgentDefinition.defaults,
|
|
17
|
+
// NOT from here. This keeps the core free of agent-specific knowledge.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export const BUILT_IN_DEFAULTS = {
|
|
20
|
+
agent: 'claude',
|
|
21
|
+
model: undefined,
|
|
22
|
+
gitTracker: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
commitOn: [], // Populated from agent definition
|
|
25
|
+
ignore: ['.env', '.env.*', 'node_modules/**', 'dist/**', '.viewport/**'],
|
|
26
|
+
autoSquashOnComplete: false,
|
|
27
|
+
branchPrefix: 'viewport/session-',
|
|
28
|
+
commitAuthor: 'Viewport Agent <noreply@example.test>',
|
|
29
|
+
maxCommitsPerSession: 500,
|
|
30
|
+
worktreeRoot: '.viewport/worktrees',
|
|
31
|
+
},
|
|
32
|
+
permissions: {
|
|
33
|
+
autoApprove: [], // Populated from agent definition
|
|
34
|
+
requireApproval: [], // Populated from agent definition
|
|
35
|
+
deny: [],
|
|
36
|
+
},
|
|
37
|
+
costCapUsd: undefined,
|
|
38
|
+
trust: 'operator',
|
|
39
|
+
};
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Deep merge utility
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Deep merge objects. Arrays are replaced (not concatenated).
|
|
45
|
+
* `undefined` values in source are skipped (don't overwrite with undefined).
|
|
46
|
+
*/
|
|
47
|
+
export function deepMerge(...sources) {
|
|
48
|
+
const result = {};
|
|
49
|
+
for (const source of sources) {
|
|
50
|
+
if (!source)
|
|
51
|
+
continue;
|
|
52
|
+
for (const [key, value] of Object.entries(source)) {
|
|
53
|
+
if (value === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
const existing = result[key];
|
|
56
|
+
if (isPlainObject(existing) && isPlainObject(value)) {
|
|
57
|
+
result[key] = deepMerge(existing, value);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
result[key] = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
function isPlainObject(value) {
|
|
67
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
68
|
+
}
|
|
69
|
+
export function resolveViewportHome(env = process.env) {
|
|
70
|
+
const explicit = env['VIEWPORT_HOME'] ?? env['VPD_HOME'];
|
|
71
|
+
if (typeof explicit === 'string' && explicit.trim().length > 0) {
|
|
72
|
+
return path.resolve(explicit.trim());
|
|
73
|
+
}
|
|
74
|
+
return path.join(os.homedir(), '.viewport');
|
|
75
|
+
}
|
|
76
|
+
/** Returns the path to the Viewport config directory. */
|
|
77
|
+
export function configDir() {
|
|
78
|
+
return resolveViewportHome();
|
|
79
|
+
}
|
|
80
|
+
/** Returns the path to the Viewport config file. */
|
|
81
|
+
export function configFilePath() {
|
|
82
|
+
return path.join(configDir(), 'config.json');
|
|
83
|
+
}
|
|
84
|
+
/** Load the config file, returning empty config if it doesn't exist. */
|
|
85
|
+
export async function loadConfig() {
|
|
86
|
+
try {
|
|
87
|
+
const raw = await fs.readFile(configFilePath(), 'utf-8');
|
|
88
|
+
let parsedRaw;
|
|
89
|
+
try {
|
|
90
|
+
parsedRaw = JSON.parse(raw);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
throw new Error(`Invalid viewport config JSON at ${configFilePath()}: ${err instanceof Error ? err.message : String(err)}`);
|
|
94
|
+
}
|
|
95
|
+
const parsed = ViewportConfigSchema.safeParse(parsedRaw);
|
|
96
|
+
if (!parsed.success) {
|
|
97
|
+
const detail = parsed.error.issues
|
|
98
|
+
.map((issue) => `${issue.path.join('.') || '<root>'}: ${issue.message}`)
|
|
99
|
+
.join('; ');
|
|
100
|
+
throw new Error(`Invalid viewport config schema at ${configFilePath()}: ${detail}`);
|
|
101
|
+
}
|
|
102
|
+
return parsed.data;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (err?.code === 'ENOENT') {
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
if (err instanceof Error) {
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
return {};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Save the config file, creating the directory if needed. */
|
|
115
|
+
export async function saveConfig(config) {
|
|
116
|
+
const dir = configDir();
|
|
117
|
+
await fs.mkdir(dir, { recursive: true });
|
|
118
|
+
await fs.writeFile(configFilePath(), JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Config resolution
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
/**
|
|
124
|
+
* Resolve the full SessionConfig for a directory, with optional session overrides.
|
|
125
|
+
*
|
|
126
|
+
* Resolution: builtInDefaults ← agentDefaults ← globalDefaults ← directoryConfig ← sessionOverrides
|
|
127
|
+
*
|
|
128
|
+
* Agent defaults inject agent-specific tool names and permissions without
|
|
129
|
+
* polluting the framework-level built-in defaults.
|
|
130
|
+
*/
|
|
131
|
+
export function resolveConfig(agentDefaults, globalDefaults, directoryConfig, sessionOverrides) {
|
|
132
|
+
return deepMerge(BUILT_IN_DEFAULTS, agentDefaults, globalDefaults, directoryConfig, sessionOverrides);
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Config manager (stateful, owns the loaded config)
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
export class ConfigManager {
|
|
138
|
+
config = {};
|
|
139
|
+
loaded = false;
|
|
140
|
+
agentRegistry = null;
|
|
141
|
+
/** Load config from disk. Safe to call multiple times. */
|
|
142
|
+
async load() {
|
|
143
|
+
this.config = await loadConfig();
|
|
144
|
+
this.loaded = true;
|
|
145
|
+
}
|
|
146
|
+
/** Set the agent registry for agent-aware config resolution. */
|
|
147
|
+
setAgentRegistry(registry) {
|
|
148
|
+
this.agentRegistry = registry;
|
|
149
|
+
}
|
|
150
|
+
/** Get the raw viewport config. */
|
|
151
|
+
getConfig() {
|
|
152
|
+
this.ensureLoaded();
|
|
153
|
+
return this.config;
|
|
154
|
+
}
|
|
155
|
+
/** Resolve a full SessionConfig for a directory, with agent-specific defaults. */
|
|
156
|
+
resolveSessionConfig(directoryId, sessionOverrides) {
|
|
157
|
+
this.ensureLoaded();
|
|
158
|
+
const directoryConfig = directoryId
|
|
159
|
+
? this.config.directories?.[directoryId]?.config
|
|
160
|
+
: undefined;
|
|
161
|
+
// Determine which agent this config is for
|
|
162
|
+
const agentId = sessionOverrides?.agent ??
|
|
163
|
+
directoryConfig?.agent ??
|
|
164
|
+
this.config.defaults?.agent ??
|
|
165
|
+
BUILT_IN_DEFAULTS.agent;
|
|
166
|
+
// Get agent-specific defaults from the registry
|
|
167
|
+
const agentDefaults = this.buildAgentDefaults(agentId);
|
|
168
|
+
return resolveConfig(agentDefaults, this.config.defaults, directoryConfig, sessionOverrides);
|
|
169
|
+
}
|
|
170
|
+
/** Build a partial SessionConfig from agent definition defaults. */
|
|
171
|
+
buildAgentDefaults(agentId) {
|
|
172
|
+
if (!this.agentRegistry)
|
|
173
|
+
return undefined;
|
|
174
|
+
const def = this.agentRegistry.get(agentId);
|
|
175
|
+
if (!def)
|
|
176
|
+
return undefined;
|
|
177
|
+
return {
|
|
178
|
+
agent: def.id,
|
|
179
|
+
gitTracker: {
|
|
180
|
+
commitOn: def.defaults.commitOn,
|
|
181
|
+
},
|
|
182
|
+
permissions: {
|
|
183
|
+
autoApprove: def.defaults.autoApprove,
|
|
184
|
+
requireApproval: def.defaults.requireApproval,
|
|
185
|
+
deny: def.defaults.deny,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** Get the relay URL (if configured). */
|
|
190
|
+
getRelayUrl() {
|
|
191
|
+
this.ensureLoaded();
|
|
192
|
+
return this.config.relayUrl;
|
|
193
|
+
}
|
|
194
|
+
/** Get the machine ID. */
|
|
195
|
+
getMachineId() {
|
|
196
|
+
this.ensureLoaded();
|
|
197
|
+
return this.config.machineId ?? os.hostname();
|
|
198
|
+
}
|
|
199
|
+
/** Get daemon runtime settings from config (if any). */
|
|
200
|
+
getDaemonConfig() {
|
|
201
|
+
this.ensureLoaded();
|
|
202
|
+
return this.config.daemon;
|
|
203
|
+
}
|
|
204
|
+
/** Merge daemon runtime settings into config. */
|
|
205
|
+
async setDaemonConfig(daemonConfig) {
|
|
206
|
+
this.ensureLoaded();
|
|
207
|
+
this.config.daemon = deepMerge(this.config.daemon ?? {}, daemonConfig);
|
|
208
|
+
await saveConfig(this.config);
|
|
209
|
+
}
|
|
210
|
+
/** Update global defaults. */
|
|
211
|
+
async setDefaults(defaults) {
|
|
212
|
+
this.ensureLoaded();
|
|
213
|
+
this.config.defaults = deepMerge(this.config.defaults ?? {}, defaults);
|
|
214
|
+
await saveConfig(this.config);
|
|
215
|
+
}
|
|
216
|
+
/** Register a directory with optional config. */
|
|
217
|
+
async registerDirectory(directoryId, dirPath, config) {
|
|
218
|
+
this.ensureLoaded();
|
|
219
|
+
if (!this.config.directories) {
|
|
220
|
+
this.config.directories = {};
|
|
221
|
+
}
|
|
222
|
+
this.config.directories[directoryId] = { path: dirPath, config };
|
|
223
|
+
await saveConfig(this.config);
|
|
224
|
+
}
|
|
225
|
+
/** Unregister a directory. */
|
|
226
|
+
async unregisterDirectory(directoryId) {
|
|
227
|
+
this.ensureLoaded();
|
|
228
|
+
if (this.config.directories) {
|
|
229
|
+
delete this.config.directories[directoryId];
|
|
230
|
+
await saveConfig(this.config);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Get all registered directories. */
|
|
234
|
+
getDirectories() {
|
|
235
|
+
this.ensureLoaded();
|
|
236
|
+
return this.config.directories ?? {};
|
|
237
|
+
}
|
|
238
|
+
ensureLoaded() {
|
|
239
|
+
if (!this.loaded) {
|
|
240
|
+
throw new Error('ConfigManager not loaded. Call load() first.');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon — the orchestrator that wires everything together.
|
|
3
|
+
*
|
|
4
|
+
* Manages adapters, trackers, permissions, sessions, and directories.
|
|
5
|
+
* All external-facing operations go through this class. Internal modules
|
|
6
|
+
* communicate via the typed event bus.
|
|
7
|
+
*
|
|
8
|
+
* Session lifecycle is delegated to SessionManager.
|
|
9
|
+
* Permission handling is delegated to PermissionCoordinator.
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentAdapter, DiscoveredSession, RunTrackerFactory, SessionDiscovery } from './interfaces.js';
|
|
12
|
+
import type { PendingPermissionRequest, SessionAgentMode, SessionConfig, SessionState, PermissionDecision, Step } from './types.js';
|
|
13
|
+
import { TypedEventEmitter } from './events.js';
|
|
14
|
+
import type { DaemonEvents } from './events.js';
|
|
15
|
+
import { ConfigManager } from './config.js';
|
|
16
|
+
import { DirectoryManager } from '../directories/manager.js';
|
|
17
|
+
export declare class Daemon extends TypedEventEmitter<DaemonEvents> {
|
|
18
|
+
readonly configManager: ConfigManager;
|
|
19
|
+
readonly directoryManager: DirectoryManager;
|
|
20
|
+
private adapters;
|
|
21
|
+
private discoveries;
|
|
22
|
+
private trackerFactory;
|
|
23
|
+
private readonly permissionCoordinator;
|
|
24
|
+
private readonly sessionManager;
|
|
25
|
+
/**
|
|
26
|
+
* Discovered sessions from JSONL files, keyed by directoryId.
|
|
27
|
+
* These are historical sessions not launched by the daemon.
|
|
28
|
+
*/
|
|
29
|
+
private discoveredSessions;
|
|
30
|
+
constructor();
|
|
31
|
+
/** Register an agent adapter (e.g. ClaudeAdapter). */
|
|
32
|
+
registerAdapter(adapter: AgentAdapter): void;
|
|
33
|
+
/** Register a session discovery provider (e.g. ClaudeDiscovery). */
|
|
34
|
+
registerDiscovery(discovery: SessionDiscovery): void;
|
|
35
|
+
/** Set the factory used to create RunTrackers for new sessions. */
|
|
36
|
+
setTrackerFactory(factory: RunTrackerFactory): void;
|
|
37
|
+
/** Initialize the daemon — loads config from disk. */
|
|
38
|
+
initialize(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Run discovery for all registered directories.
|
|
41
|
+
* Finds existing sessions from agent-specific sources (e.g. ~/.claude/projects/).
|
|
42
|
+
*/
|
|
43
|
+
runDiscovery(): Promise<void>;
|
|
44
|
+
/** Get discovered sessions for a directory. */
|
|
45
|
+
getDiscoveredSessions(directoryId?: string): Map<string, DiscoveredSession[]>;
|
|
46
|
+
/** Get available agent IDs from registered adapters. */
|
|
47
|
+
getAvailableAgents(): string[];
|
|
48
|
+
/** Launch a new agent session in a registered directory. */
|
|
49
|
+
launchSession(directoryId: string, prompt: string, overrides?: Partial<SessionConfig>): Promise<string>;
|
|
50
|
+
/** Resume a discovered session via the adapter's resume support. */
|
|
51
|
+
resumeSession(originalSessionId: string, directoryId: string, prompt?: string, overrides?: Partial<SessionConfig>): Promise<string>;
|
|
52
|
+
/** Kill an active session. */
|
|
53
|
+
killSession(sessionId: string): Promise<void>;
|
|
54
|
+
/** Roll back a session to a specific commit. */
|
|
55
|
+
rollback(sessionId: string, toSha: string): Promise<void>;
|
|
56
|
+
/** Create a retry branch from a specific commit. */
|
|
57
|
+
branchRetry(sessionId: string, fromSha: string): Promise<string>;
|
|
58
|
+
/** Squash-merge a session's changes into the target branch. */
|
|
59
|
+
squashMerge(sessionId: string, targetBranch: string, commitMessage: string): Promise<void>;
|
|
60
|
+
/** Send a follow-up prompt to a session. */
|
|
61
|
+
sendPrompt(sessionId: string, text: string): Promise<void>;
|
|
62
|
+
/** Get all active session IDs. */
|
|
63
|
+
getActiveSessions(): string[];
|
|
64
|
+
/** Get session state and metadata. */
|
|
65
|
+
getSessionInfo(sessionId: string): {
|
|
66
|
+
state: SessionState;
|
|
67
|
+
directoryId: string;
|
|
68
|
+
agent: string;
|
|
69
|
+
mode: SessionAgentMode;
|
|
70
|
+
steps: ReadonlyArray<Step>;
|
|
71
|
+
};
|
|
72
|
+
listActiveSessions(): Array<{
|
|
73
|
+
sessionId: string;
|
|
74
|
+
directoryId: string;
|
|
75
|
+
agent: string;
|
|
76
|
+
state: SessionState;
|
|
77
|
+
mode: SessionAgentMode;
|
|
78
|
+
startedAt: number;
|
|
79
|
+
}>;
|
|
80
|
+
listWorktrees(sessionId?: string): Array<{
|
|
81
|
+
sessionId: string;
|
|
82
|
+
directoryId: string;
|
|
83
|
+
agent: string;
|
|
84
|
+
state: SessionState;
|
|
85
|
+
mode: SessionAgentMode;
|
|
86
|
+
worktreePath: string;
|
|
87
|
+
stepCount: number;
|
|
88
|
+
lastStepSha: string | null;
|
|
89
|
+
lastStepAt: number | null;
|
|
90
|
+
}>;
|
|
91
|
+
/** Get diffs for a session. */
|
|
92
|
+
getSessionDiffs(sessionId: string): Promise<Array<{
|
|
93
|
+
step: number;
|
|
94
|
+
sha: string;
|
|
95
|
+
diff: string;
|
|
96
|
+
}>>;
|
|
97
|
+
/** Get the total diff across a session. */
|
|
98
|
+
getSessionSummaryDiff(sessionId: string): Promise<string>;
|
|
99
|
+
/** Respond to a pending permission request. */
|
|
100
|
+
respondPermission(sessionId: string, requestId: string, decision: PermissionDecision): Promise<void>;
|
|
101
|
+
/** Add a tool to a session's auto-approve list (for "always allow"). */
|
|
102
|
+
addAutoApprove(sessionId: string, toolName: string): void;
|
|
103
|
+
/** Get the tool name for a pending permission request. */
|
|
104
|
+
getRequestToolName(requestId: string): string | undefined;
|
|
105
|
+
listPendingPermissions(sessionId?: string): PendingPermissionRequest[];
|
|
106
|
+
setSessionMode(sessionId: string, mode: SessionAgentMode): void;
|
|
107
|
+
getSessionMode(sessionId: string): SessionAgentMode;
|
|
108
|
+
/** Gracefully shut down: tear down all active sessions. */
|
|
109
|
+
shutdown(): Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
/** Convenience: create and initialize a Daemon with defaults. */
|
|
112
|
+
export declare function createDaemon(): Promise<Daemon>;
|
|
113
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/core/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAY7D,qBAAa,MAAO,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACzD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,cAAc,CAAkC;IAExD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAwB;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAA0C;;IAiBpE,sDAAsD;IACtD,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAI5C,oEAAoE;IACpE,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAIpD,mEAAmE;IACnE,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAInD,sDAAsD;IAChD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BnC,+CAA+C;IAC/C,qBAAqB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAU7E,wDAAwD;IACxD,kBAAkB,IAAI,MAAM,EAAE;IAQ9B,4DAA4D;IACtD,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAIlB,oEAAoE;IAC9D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAIlB,8BAA8B;IACxB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,gDAAgD;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,oDAAoD;IAC9C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItE,+DAA+D;IACzD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhG,4CAA4C;IACtC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,kCAAkC;IAClC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,sCAAsC;IACtC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;QACjC,KAAK,EAAE,YAAY,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,gBAAgB,CAAC;QACvB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;KAC5B;IAID,kBAAkB,IAAI,KAAK,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,YAAY,CAAC;QACpB,IAAI,EAAE,gBAAgB,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAIF,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,YAAY,CAAC;QACpB,IAAI,EAAE,gBAAgB,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;IAIF,+BAA+B;IACzB,eAAe,CACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI9D,2CAA2C;IACrC,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ/D,+CAA+C;IACzC,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAShB,wEAAwE;IACxE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUzD,0DAA0D;IAC1D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzD,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE;IAItE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAI/D,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAQnD,2DAA2D;IACrD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,iEAAiE;AACjE,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAIpD"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon — the orchestrator that wires everything together.
|
|
3
|
+
*
|
|
4
|
+
* Manages adapters, trackers, permissions, sessions, and directories.
|
|
5
|
+
* All external-facing operations go through this class. Internal modules
|
|
6
|
+
* communicate via the typed event bus.
|
|
7
|
+
*
|
|
8
|
+
* Session lifecycle is delegated to SessionManager.
|
|
9
|
+
* Permission handling is delegated to PermissionCoordinator.
|
|
10
|
+
*/
|
|
11
|
+
import { TypedEventEmitter } from './events.js';
|
|
12
|
+
import { ConfigManager } from './config.js';
|
|
13
|
+
import { DirectoryManager } from '../directories/manager.js';
|
|
14
|
+
import { SessionManager } from './session-manager.js';
|
|
15
|
+
import { PermissionCoordinator } from './permission-coordinator.js';
|
|
16
|
+
import { logger } from './logger.js';
|
|
17
|
+
import { dedupeDiscoveredSessions } from './discovered-sessions.js';
|
|
18
|
+
const log = logger.child({ module: 'daemon' });
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Daemon
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
export class Daemon extends TypedEventEmitter {
|
|
23
|
+
configManager;
|
|
24
|
+
directoryManager;
|
|
25
|
+
adapters = new Map();
|
|
26
|
+
discoveries = new Map();
|
|
27
|
+
trackerFactory = null;
|
|
28
|
+
permissionCoordinator;
|
|
29
|
+
sessionManager;
|
|
30
|
+
/**
|
|
31
|
+
* Discovered sessions from JSONL files, keyed by directoryId.
|
|
32
|
+
* These are historical sessions not launched by the daemon.
|
|
33
|
+
*/
|
|
34
|
+
discoveredSessions = new Map();
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
|
+
this.configManager = new ConfigManager();
|
|
38
|
+
this.directoryManager = new DirectoryManager(this.configManager);
|
|
39
|
+
this.permissionCoordinator = new PermissionCoordinator(this);
|
|
40
|
+
this.sessionManager = new SessionManager(this, this.configManager, this.directoryManager, this.permissionCoordinator, this.adapters, () => this.trackerFactory);
|
|
41
|
+
}
|
|
42
|
+
/** Register an agent adapter (e.g. ClaudeAdapter). */
|
|
43
|
+
registerAdapter(adapter) {
|
|
44
|
+
this.adapters.set(adapter.agentId, adapter);
|
|
45
|
+
}
|
|
46
|
+
/** Register a session discovery provider (e.g. ClaudeDiscovery). */
|
|
47
|
+
registerDiscovery(discovery) {
|
|
48
|
+
this.discoveries.set(discovery.agentId, discovery);
|
|
49
|
+
}
|
|
50
|
+
/** Set the factory used to create RunTrackers for new sessions. */
|
|
51
|
+
setTrackerFactory(factory) {
|
|
52
|
+
this.trackerFactory = factory;
|
|
53
|
+
}
|
|
54
|
+
/** Initialize the daemon — loads config from disk. */
|
|
55
|
+
async initialize() {
|
|
56
|
+
await this.configManager.load();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run discovery for all registered directories.
|
|
60
|
+
* Finds existing sessions from agent-specific sources (e.g. ~/.claude/projects/).
|
|
61
|
+
*/
|
|
62
|
+
async runDiscovery() {
|
|
63
|
+
const directories = this.directoryManager.list();
|
|
64
|
+
const nextDiscovered = new Map();
|
|
65
|
+
for (const dir of directories) {
|
|
66
|
+
const allSessions = [];
|
|
67
|
+
for (const [agentId, discovery] of this.discoveries) {
|
|
68
|
+
try {
|
|
69
|
+
const sessions = await discovery.discoverSessions(dir.path);
|
|
70
|
+
allSessions.push(...sessions);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
log.warn({ err, agentId, directory: dir.path }, 'Discovery failed for directory');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const dedupedSessions = dedupeDiscoveredSessions(allSessions);
|
|
77
|
+
if (dedupedSessions.length > 0) {
|
|
78
|
+
// Sort by most recent first
|
|
79
|
+
nextDiscovered.set(dir.id, dedupedSessions);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Replace atomically so stale entries are removed when sessions disappear.
|
|
83
|
+
this.discoveredSessions = nextDiscovered;
|
|
84
|
+
}
|
|
85
|
+
/** Get discovered sessions for a directory. */
|
|
86
|
+
getDiscoveredSessions(directoryId) {
|
|
87
|
+
if (directoryId) {
|
|
88
|
+
const sessions = this.discoveredSessions.get(directoryId);
|
|
89
|
+
const result = new Map();
|
|
90
|
+
if (sessions)
|
|
91
|
+
result.set(directoryId, sessions);
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
return new Map(this.discoveredSessions);
|
|
95
|
+
}
|
|
96
|
+
/** Get available agent IDs from registered adapters. */
|
|
97
|
+
getAvailableAgents() {
|
|
98
|
+
return [...this.adapters.keys()];
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Session operations — delegated to SessionManager
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
/** Launch a new agent session in a registered directory. */
|
|
104
|
+
async launchSession(directoryId, prompt, overrides) {
|
|
105
|
+
return this.sessionManager.launchSession(directoryId, prompt, overrides);
|
|
106
|
+
}
|
|
107
|
+
/** Resume a discovered session via the adapter's resume support. */
|
|
108
|
+
async resumeSession(originalSessionId, directoryId, prompt, overrides) {
|
|
109
|
+
return this.sessionManager.resumeSession(originalSessionId, directoryId, prompt, overrides);
|
|
110
|
+
}
|
|
111
|
+
/** Kill an active session. */
|
|
112
|
+
async killSession(sessionId) {
|
|
113
|
+
return this.sessionManager.killSession(sessionId);
|
|
114
|
+
}
|
|
115
|
+
/** Roll back a session to a specific commit. */
|
|
116
|
+
async rollback(sessionId, toSha) {
|
|
117
|
+
return this.sessionManager.rollback(sessionId, toSha);
|
|
118
|
+
}
|
|
119
|
+
/** Create a retry branch from a specific commit. */
|
|
120
|
+
async branchRetry(sessionId, fromSha) {
|
|
121
|
+
return this.sessionManager.branchRetry(sessionId, fromSha);
|
|
122
|
+
}
|
|
123
|
+
/** Squash-merge a session's changes into the target branch. */
|
|
124
|
+
async squashMerge(sessionId, targetBranch, commitMessage) {
|
|
125
|
+
return this.sessionManager.squashMerge(sessionId, targetBranch, commitMessage);
|
|
126
|
+
}
|
|
127
|
+
/** Send a follow-up prompt to a session. */
|
|
128
|
+
async sendPrompt(sessionId, text) {
|
|
129
|
+
return this.sessionManager.sendPrompt(sessionId, text);
|
|
130
|
+
}
|
|
131
|
+
/** Get all active session IDs. */
|
|
132
|
+
getActiveSessions() {
|
|
133
|
+
return this.sessionManager.getActiveSessions();
|
|
134
|
+
}
|
|
135
|
+
/** Get session state and metadata. */
|
|
136
|
+
getSessionInfo(sessionId) {
|
|
137
|
+
return this.sessionManager.getSessionInfo(sessionId);
|
|
138
|
+
}
|
|
139
|
+
listActiveSessions() {
|
|
140
|
+
return this.sessionManager.listSessionSummaries();
|
|
141
|
+
}
|
|
142
|
+
listWorktrees(sessionId) {
|
|
143
|
+
return this.sessionManager.listWorktreeSummaries(sessionId);
|
|
144
|
+
}
|
|
145
|
+
/** Get diffs for a session. */
|
|
146
|
+
async getSessionDiffs(sessionId) {
|
|
147
|
+
return this.sessionManager.getSessionDiffs(sessionId);
|
|
148
|
+
}
|
|
149
|
+
/** Get the total diff across a session. */
|
|
150
|
+
async getSessionSummaryDiff(sessionId) {
|
|
151
|
+
return this.sessionManager.getSessionSummaryDiff(sessionId);
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Permission operations — delegated to PermissionCoordinator
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
/** Respond to a pending permission request. */
|
|
157
|
+
async respondPermission(sessionId, requestId, decision) {
|
|
158
|
+
this.permissionCoordinator.respondPermissionForSession(sessionId, requestId, decision, this.sessionManager.hasSession(sessionId));
|
|
159
|
+
}
|
|
160
|
+
/** Add a tool to a session's auto-approve list (for "always allow"). */
|
|
161
|
+
addAutoApprove(sessionId, toolName) {
|
|
162
|
+
const config = this.sessionManager.getSessionConfig(sessionId);
|
|
163
|
+
if (config) {
|
|
164
|
+
const next = this.permissionCoordinator.addAutoApprove(config, toolName);
|
|
165
|
+
if (next !== config) {
|
|
166
|
+
this.sessionManager.updateSessionConfig(sessionId, next);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Get the tool name for a pending permission request. */
|
|
171
|
+
getRequestToolName(requestId) {
|
|
172
|
+
return this.permissionCoordinator.getRequestToolName(requestId);
|
|
173
|
+
}
|
|
174
|
+
listPendingPermissions(sessionId) {
|
|
175
|
+
return this.permissionCoordinator.listPendingPermissions(sessionId);
|
|
176
|
+
}
|
|
177
|
+
setSessionMode(sessionId, mode) {
|
|
178
|
+
this.sessionManager.setSessionMode(sessionId, mode);
|
|
179
|
+
}
|
|
180
|
+
getSessionMode(sessionId) {
|
|
181
|
+
return this.sessionManager.getSessionMode(sessionId);
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Shutdown
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
/** Gracefully shut down: tear down all active sessions. */
|
|
187
|
+
async shutdown() {
|
|
188
|
+
return this.sessionManager.shutdown();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** Convenience: create and initialize a Daemon with defaults. */
|
|
192
|
+
export async function createDaemon() {
|
|
193
|
+
const daemon = new Daemon();
|
|
194
|
+
await daemon.initialize();
|
|
195
|
+
return daemon;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/core/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE/C,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,OAAO,MAAO,SAAQ,iBAA+B;IAChD,aAAa,CAAgB;IAC7B,gBAAgB,CAAmB;IAEpC,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC3C,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,cAAc,GAA6B,IAAI,CAAC;IAEvC,qBAAqB,CAAwB;IAC7C,cAAc,CAAiB;IAEhD;;;OAGG;IACK,kBAAkB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEpE;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CACtC,IAAI,EACJ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,QAAQ,EACb,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAC1B,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,oEAAoE;IACpE,iBAAiB,CAAC,SAA2B;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,mEAAmE;IACnE,iBAAiB,CAAC,OAA0B;QAC1C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAC;QAE9D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAwB,EAAE,CAAC;YAE5C,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpD,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC5D,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAChC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,gCAAgC,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;YAC9D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,4BAA4B;gBAC5B,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;IAC3C,CAAC;IAED,+CAA+C;IAC/C,qBAAqB,CAAC,WAAoB;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;YACtD,IAAI,QAAQ;gBAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC;IAED,wDAAwD;IACxD,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,8EAA8E;IAC9E,mDAAmD;IACnD,8EAA8E;IAE9E,4DAA4D;IAC5D,KAAK,CAAC,aAAa,CACjB,WAAmB,EACnB,MAAc,EACd,SAAkC;QAElC,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,aAAa,CACjB,iBAAyB,EACzB,WAAmB,EACnB,MAAe,EACf,SAAkC;QAElC,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9F,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,KAAa;QAC7C,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QAClD,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,YAAoB,EAAE,aAAqB;QAC9E,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IACjF,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,kCAAkC;IAClC,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC;IACjD,CAAC;IAED,sCAAsC;IACtC,cAAc,CAAC,SAAiB;QAO9B,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB;QAQhB,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;IACpD,CAAC;IAED,aAAa,CAAC,SAAkB;QAW9B,OAAO,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,eAAe,CACnB,SAAiB;QAEjB,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,8EAA8E;IAC9E,6DAA6D;IAC7D,8EAA8E;IAE9E,+CAA+C;IAC/C,KAAK,CAAC,iBAAiB,CACrB,SAAiB,EACjB,SAAiB,EACjB,QAA4B;QAE5B,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,CACpD,SAAS,EACT,SAAS,EACT,QAAQ,EACR,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAC1C,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,cAAc,CAAC,SAAiB,EAAE,QAAgB;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,kBAAkB,CAAC,SAAiB;QAClC,OAAO,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,sBAAsB,CAAC,SAAkB;QACvC,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,IAAsB;QACtD,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAE9E,2DAA2D;IAC3D,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DiscoveredSession } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collapse duplicate discovered sessions by session id.
|
|
4
|
+
* The daemon/UI currently key session identity by directory + session id.
|
|
5
|
+
*/
|
|
6
|
+
export declare function dedupeDiscoveredSessions(sessions: ReadonlyArray<DiscoveredSession>): DiscoveredSession[];
|
|
7
|
+
//# sourceMappingURL=discovered-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovered-sessions.d.ts","sourceRoot":"","sources":["../../src/core/discovered-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAgCzD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACzC,iBAAiB,EAAE,CAOrB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function score(session) {
|
|
2
|
+
return [session.lastModified, session.messageCount ?? 0, session.summary.trim().length];
|
|
3
|
+
}
|
|
4
|
+
function compareScore(a, b) {
|
|
5
|
+
if (a[0] !== b[0])
|
|
6
|
+
return a[0] - b[0];
|
|
7
|
+
if (a[1] !== b[1])
|
|
8
|
+
return a[1] - b[1];
|
|
9
|
+
if (a[2] !== b[2])
|
|
10
|
+
return a[2] - b[2];
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
function mergeSessionPair(existing, incoming) {
|
|
14
|
+
const incomingWins = compareScore(score(incoming), score(existing)) >= 0;
|
|
15
|
+
const winner = incomingWins ? incoming : existing;
|
|
16
|
+
const loser = incomingWins ? existing : incoming;
|
|
17
|
+
return {
|
|
18
|
+
...winner,
|
|
19
|
+
summary: winner.summary.trim().length > 0 ? winner.summary : loser.summary,
|
|
20
|
+
messageCount: Math.max(winner.messageCount ?? 0, loser.messageCount ?? 0),
|
|
21
|
+
resumable: winner.resumable || loser.resumable,
|
|
22
|
+
sourcePath: winner.sourcePath ?? loser.sourcePath,
|
|
23
|
+
gitBranch: winner.gitBranch ?? loser.gitBranch,
|
|
24
|
+
cwd: winner.cwd ?? loser.cwd,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Collapse duplicate discovered sessions by session id.
|
|
29
|
+
* The daemon/UI currently key session identity by directory + session id.
|
|
30
|
+
*/
|
|
31
|
+
export function dedupeDiscoveredSessions(sessions) {
|
|
32
|
+
const bySessionId = new Map();
|
|
33
|
+
for (const session of sessions) {
|
|
34
|
+
const existing = bySessionId.get(session.sessionId);
|
|
35
|
+
bySessionId.set(session.sessionId, existing ? mergeSessionPair(existing, session) : session);
|
|
36
|
+
}
|
|
37
|
+
return [...bySessionId.values()].sort((a, b) => b.lastModified - a.lastModified);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=discovered-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovered-sessions.js","sourceRoot":"","sources":["../../src/core/discovered-sessions.ts"],"names":[],"mappings":"AAEA,SAAS,KAAK,CAAC,OAA0B;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,YAAY,CAAC,CAA2B,EAAE,CAA2B;IAC5E,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CACvB,QAA2B,EAC3B,QAA2B;IAE3B,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEjD,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;QAC1E,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACzE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;QAC9C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU;QACjD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;QAC9C,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAA0C;IAE1C,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;AACnF,CAAC"}
|