@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 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE,KAAG,IAAI;qBAGf,OAAO,EAAE,KAAG,IAAI;qBAGhB,OAAO,EAAE,KAAG,IAAI;sBAGf,OAAO,EAAE,KAAG,IAAI;CAGnC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
/**
|
|
3
|
+
* Unified process output facade for CLI/runtime messaging.
|
|
4
|
+
*
|
|
5
|
+
* Keep direct console usage centralized here so call sites can migrate
|
|
6
|
+
* without changing user-visible behavior.
|
|
7
|
+
*/
|
|
8
|
+
export const logger = {
|
|
9
|
+
log: (...parts) => {
|
|
10
|
+
console.log(...parts);
|
|
11
|
+
},
|
|
12
|
+
info: (...parts) => {
|
|
13
|
+
console.info(...parts);
|
|
14
|
+
},
|
|
15
|
+
warn: (...parts) => {
|
|
16
|
+
console.warn(...parts);
|
|
17
|
+
},
|
|
18
|
+
error: (...parts) => {
|
|
19
|
+
console.error(...parts);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,KAAgB,EAAQ,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PermissionCoordinator — handles permission resolution and async approval flow.
|
|
3
|
+
*
|
|
4
|
+
* Builds the canUseTool handler that adapters receive, resolves auto-approve/deny
|
|
5
|
+
* from config, and waits for user responses via the event bus for require-approval.
|
|
6
|
+
*/
|
|
7
|
+
import type { TypedEventEmitter } from './events.js';
|
|
8
|
+
import type { DaemonEvents } from './events.js';
|
|
9
|
+
import type { SessionConfig, PermissionDecision, PendingPermissionRequest, SessionAgentMode } from './types.js';
|
|
10
|
+
export declare class PermissionCoordinator {
|
|
11
|
+
private readonly eventBus;
|
|
12
|
+
private readonly timeoutMs;
|
|
13
|
+
/** Tracks pending permission requests per session: sessionId -> Set<requestId>. */
|
|
14
|
+
private pendingPermissions;
|
|
15
|
+
/** Maps requestId -> toolName for resolving allow-always. */
|
|
16
|
+
private requestToolNames;
|
|
17
|
+
/** Maps requestId -> full pending request metadata (for operator tooling). */
|
|
18
|
+
private pendingRequestDetails;
|
|
19
|
+
/** Per-session operator mode. */
|
|
20
|
+
private sessionModes;
|
|
21
|
+
constructor(eventBus: TypedEventEmitter<DaemonEvents>, timeoutMs?: number);
|
|
22
|
+
/**
|
|
23
|
+
* Create the async permission handler for an agent session.
|
|
24
|
+
*
|
|
25
|
+
* The returned function matches the SDK's canUseTool signature. It:
|
|
26
|
+
* 1. Checks the config for auto-approve / deny
|
|
27
|
+
* 2. For require-approval, emits a permission:requested event and
|
|
28
|
+
* waits for permission:responded on the event bus
|
|
29
|
+
*/
|
|
30
|
+
createPermissionHandler(sessionId: string, configOrGetter: SessionConfig | (() => SessionConfig)): (toolName: string, input: Record<string, unknown>, context: {
|
|
31
|
+
signal: AbortSignal;
|
|
32
|
+
toolUseId: string;
|
|
33
|
+
decisionReason?: string;
|
|
34
|
+
}) => Promise<PermissionDecision>;
|
|
35
|
+
/**
|
|
36
|
+
* Respond to a pending permission request by emitting the responded event.
|
|
37
|
+
*
|
|
38
|
+
* The daemon's createPermissionHandler listens for this event to resolve
|
|
39
|
+
* the pending promise.
|
|
40
|
+
*/
|
|
41
|
+
respondPermission(sessionId: string, requestId: string, decision: PermissionDecision): void;
|
|
42
|
+
/**
|
|
43
|
+
* Reject any pending permission promises for a session.
|
|
44
|
+
*
|
|
45
|
+
* Called on session end/error to prevent dangling promises. Emits a deny
|
|
46
|
+
* response for each pending request, which resolves the waiting promises
|
|
47
|
+
* in the permission handlers.
|
|
48
|
+
*/
|
|
49
|
+
rejectPendingPermissions(sessionId: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Validate that a session exists before responding to a permission.
|
|
52
|
+
* Throws SESSION_NOT_FOUND if the session is not active.
|
|
53
|
+
*/
|
|
54
|
+
respondPermissionForSession(sessionId: string, requestId: string, decision: PermissionDecision, sessionExists: boolean): void;
|
|
55
|
+
/** Get the tool name for a pending permission request. */
|
|
56
|
+
getRequestToolName(requestId: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Add a tool to a session's auto-approve list at runtime.
|
|
59
|
+
* Used when the user selects "Always Allow" for a tool.
|
|
60
|
+
*/
|
|
61
|
+
addAutoApprove(config: SessionConfig, toolName: string): SessionConfig;
|
|
62
|
+
setSessionMode(sessionId: string, mode: SessionAgentMode): void;
|
|
63
|
+
getSessionMode(sessionId: string): SessionAgentMode;
|
|
64
|
+
clearSessionMode(sessionId: string): void;
|
|
65
|
+
listPendingPermissions(sessionId?: string): PendingPermissionRequest[];
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=permission-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-coordinator.d.ts","sourceRoot":"","sources":["../../src/core/permission-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAElB,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAOpB,qBAAa,qBAAqB;IAW9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAX5B,mFAAmF;IACnF,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB,CAA6B;IACrD,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB,CAA+C;IAC5E,iCAAiC;IACjC,OAAO,CAAC,YAAY,CAAuC;gBAGxC,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,EACzC,SAAS,GAAE,MAA8B;IAG5D;;;;;;;OAOG;IACH,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,aAAa,GAAG,CAAC,MAAM,aAAa,CAAC,GACpD,CACD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KACzE,OAAO,CAAC,kBAAkB,CAAC;IA+GhC;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI3F;;;;;;OAMG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAsBjD;;;OAGG;IACH,2BAA2B,CACzB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,aAAa,EAAE,OAAO,GACrB,IAAI;IAOP,0DAA0D;IAC1D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa;IAatE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAI/D,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAInD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIzC,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE;CAUvE"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PermissionCoordinator — handles permission resolution and async approval flow.
|
|
3
|
+
*
|
|
4
|
+
* Builds the canUseTool handler that adapters receive, resolves auto-approve/deny
|
|
5
|
+
* from config, and waits for user responses via the event bus for require-approval.
|
|
6
|
+
*/
|
|
7
|
+
import { resolvePermission } from '../permissions/engine.js';
|
|
8
|
+
import { ViewportError } from './errors.js';
|
|
9
|
+
/** Default timeout for permission requests (5 minutes). */
|
|
10
|
+
const PERMISSION_TIMEOUT_MS = 5 * 60 * 1000;
|
|
11
|
+
export class PermissionCoordinator {
|
|
12
|
+
eventBus;
|
|
13
|
+
timeoutMs;
|
|
14
|
+
/** Tracks pending permission requests per session: sessionId -> Set<requestId>. */
|
|
15
|
+
pendingPermissions = new Map();
|
|
16
|
+
/** Maps requestId -> toolName for resolving allow-always. */
|
|
17
|
+
requestToolNames = new Map();
|
|
18
|
+
/** Maps requestId -> full pending request metadata (for operator tooling). */
|
|
19
|
+
pendingRequestDetails = new Map();
|
|
20
|
+
/** Per-session operator mode. */
|
|
21
|
+
sessionModes = new Map();
|
|
22
|
+
constructor(eventBus, timeoutMs = PERMISSION_TIMEOUT_MS) {
|
|
23
|
+
this.eventBus = eventBus;
|
|
24
|
+
this.timeoutMs = timeoutMs;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create the async permission handler for an agent session.
|
|
28
|
+
*
|
|
29
|
+
* The returned function matches the SDK's canUseTool signature. It:
|
|
30
|
+
* 1. Checks the config for auto-approve / deny
|
|
31
|
+
* 2. For require-approval, emits a permission:requested event and
|
|
32
|
+
* waits for permission:responded on the event bus
|
|
33
|
+
*/
|
|
34
|
+
createPermissionHandler(sessionId, configOrGetter) {
|
|
35
|
+
const getConfig = () => typeof configOrGetter === 'function' ? configOrGetter() : configOrGetter;
|
|
36
|
+
return async (toolName, input, context) => {
|
|
37
|
+
if (this.sessionModes.get(sessionId) === 'bypass') {
|
|
38
|
+
return { behavior: 'allow' };
|
|
39
|
+
}
|
|
40
|
+
const resolution = resolvePermission(toolName, input, getConfig().permissions);
|
|
41
|
+
if (resolution === 'auto-approve') {
|
|
42
|
+
return { behavior: 'allow' };
|
|
43
|
+
}
|
|
44
|
+
if (resolution === 'deny') {
|
|
45
|
+
return { behavior: 'deny', message: `Tool "${toolName}" is denied by policy` };
|
|
46
|
+
}
|
|
47
|
+
// require-approval — emit event and wait for response
|
|
48
|
+
const request = {
|
|
49
|
+
requestId: context.toolUseId,
|
|
50
|
+
toolName,
|
|
51
|
+
description: `${toolName} wants to execute`,
|
|
52
|
+
input,
|
|
53
|
+
decisionReason: context.decisionReason,
|
|
54
|
+
};
|
|
55
|
+
this.eventBus.emit('permission:requested', { sessionId, request });
|
|
56
|
+
// Track this pending permission
|
|
57
|
+
if (!this.pendingPermissions.has(sessionId)) {
|
|
58
|
+
this.pendingPermissions.set(sessionId, new Set());
|
|
59
|
+
}
|
|
60
|
+
this.pendingPermissions.get(sessionId).add(context.toolUseId);
|
|
61
|
+
this.requestToolNames.set(context.toolUseId, toolName);
|
|
62
|
+
this.pendingRequestDetails.set(context.toolUseId, {
|
|
63
|
+
sessionId,
|
|
64
|
+
requestId: context.toolUseId,
|
|
65
|
+
toolName,
|
|
66
|
+
description: request.description,
|
|
67
|
+
input: request.input,
|
|
68
|
+
decisionReason: request.decisionReason,
|
|
69
|
+
blockedPath: request.blockedPath,
|
|
70
|
+
createdAt: Date.now(),
|
|
71
|
+
});
|
|
72
|
+
// Return a promise that resolves when respondPermission is called
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
let resolved = false;
|
|
75
|
+
const cleanup = () => {
|
|
76
|
+
const pending = this.pendingPermissions.get(sessionId);
|
|
77
|
+
if (pending) {
|
|
78
|
+
pending.delete(context.toolUseId);
|
|
79
|
+
if (pending.size === 0) {
|
|
80
|
+
this.pendingPermissions.delete(sessionId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
this.requestToolNames.delete(context.toolUseId);
|
|
84
|
+
this.pendingRequestDetails.delete(context.toolUseId);
|
|
85
|
+
};
|
|
86
|
+
const resolveOnce = (decision) => {
|
|
87
|
+
if (resolved)
|
|
88
|
+
return;
|
|
89
|
+
resolved = true;
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
this.eventBus.off('permission:responded', handler);
|
|
92
|
+
cleanup();
|
|
93
|
+
resolve(decision);
|
|
94
|
+
};
|
|
95
|
+
// Auto-deny after timeout
|
|
96
|
+
const timer = setTimeout(() => {
|
|
97
|
+
this.eventBus.emit('session:attention', {
|
|
98
|
+
sessionId,
|
|
99
|
+
attention: {
|
|
100
|
+
requiresAttention: true,
|
|
101
|
+
reason: 'idle_timeout',
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
resolveOnce({
|
|
106
|
+
behavior: 'deny',
|
|
107
|
+
message: `Permission request timed out after ${this.timeoutMs / 1000}s`,
|
|
108
|
+
});
|
|
109
|
+
}, this.timeoutMs);
|
|
110
|
+
const handler = (data) => {
|
|
111
|
+
if (data.sessionId === sessionId && data.requestId === context.toolUseId) {
|
|
112
|
+
resolveOnce(data.decision);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
this.eventBus.on('permission:responded', handler);
|
|
116
|
+
// Abort signal cancellation
|
|
117
|
+
context.signal.addEventListener('abort', () => {
|
|
118
|
+
resolveOnce({ behavior: 'deny', message: 'Request cancelled' });
|
|
119
|
+
}, { once: true });
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Respond to a pending permission request by emitting the responded event.
|
|
125
|
+
*
|
|
126
|
+
* The daemon's createPermissionHandler listens for this event to resolve
|
|
127
|
+
* the pending promise.
|
|
128
|
+
*/
|
|
129
|
+
respondPermission(sessionId, requestId, decision) {
|
|
130
|
+
this.eventBus.emit('permission:responded', { sessionId, requestId, decision });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Reject any pending permission promises for a session.
|
|
134
|
+
*
|
|
135
|
+
* Called on session end/error to prevent dangling promises. Emits a deny
|
|
136
|
+
* response for each pending request, which resolves the waiting promises
|
|
137
|
+
* in the permission handlers.
|
|
138
|
+
*/
|
|
139
|
+
rejectPendingPermissions(sessionId) {
|
|
140
|
+
const pending = this.pendingPermissions.get(sessionId);
|
|
141
|
+
if (!pending || pending.size === 0)
|
|
142
|
+
return;
|
|
143
|
+
// Copy the set since respondPermission will modify it via the handler cleanup
|
|
144
|
+
const requestIds = [...pending];
|
|
145
|
+
for (const requestId of requestIds) {
|
|
146
|
+
this.respondPermission(sessionId, requestId, {
|
|
147
|
+
behavior: 'deny',
|
|
148
|
+
message: 'Session ended',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Ensure cleanup even if handlers didn't fire
|
|
152
|
+
this.pendingPermissions.delete(sessionId);
|
|
153
|
+
for (const [requestId, detail] of this.pendingRequestDetails) {
|
|
154
|
+
if (detail.sessionId === sessionId) {
|
|
155
|
+
this.pendingRequestDetails.delete(requestId);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate that a session exists before responding to a permission.
|
|
161
|
+
* Throws SESSION_NOT_FOUND if the session is not active.
|
|
162
|
+
*/
|
|
163
|
+
respondPermissionForSession(sessionId, requestId, decision, sessionExists) {
|
|
164
|
+
if (!sessionExists) {
|
|
165
|
+
throw new ViewportError('SESSION_NOT_FOUND', `No active session: ${sessionId}`);
|
|
166
|
+
}
|
|
167
|
+
this.respondPermission(sessionId, requestId, decision);
|
|
168
|
+
}
|
|
169
|
+
/** Get the tool name for a pending permission request. */
|
|
170
|
+
getRequestToolName(requestId) {
|
|
171
|
+
return this.requestToolNames.get(requestId);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Add a tool to a session's auto-approve list at runtime.
|
|
175
|
+
* Used when the user selects "Always Allow" for a tool.
|
|
176
|
+
*/
|
|
177
|
+
addAutoApprove(config, toolName) {
|
|
178
|
+
if (!config.permissions.autoApprove.includes(toolName)) {
|
|
179
|
+
return {
|
|
180
|
+
...config,
|
|
181
|
+
permissions: {
|
|
182
|
+
...config.permissions,
|
|
183
|
+
autoApprove: [...config.permissions.autoApprove, toolName],
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return config;
|
|
188
|
+
}
|
|
189
|
+
setSessionMode(sessionId, mode) {
|
|
190
|
+
this.sessionModes.set(sessionId, mode);
|
|
191
|
+
}
|
|
192
|
+
getSessionMode(sessionId) {
|
|
193
|
+
return this.sessionModes.get(sessionId) ?? 'detect';
|
|
194
|
+
}
|
|
195
|
+
clearSessionMode(sessionId) {
|
|
196
|
+
this.sessionModes.delete(sessionId);
|
|
197
|
+
}
|
|
198
|
+
listPendingPermissions(sessionId) {
|
|
199
|
+
const out = [];
|
|
200
|
+
for (const detail of this.pendingRequestDetails.values()) {
|
|
201
|
+
if (!sessionId || detail.sessionId === sessionId) {
|
|
202
|
+
out.push({ ...detail });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
out.sort((a, b) => a.createdAt - b.createdAt);
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=permission-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-coordinator.js","sourceRoot":"","sources":["../../src/core/permission-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager — manages the lifecycle of active agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Owns session storage, launch/resume/kill, event wiring, and tracker setup.
|
|
5
|
+
* Uses the daemon's event bus for all inter-module communication.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentAdapter, RunTracker, RunTrackerFactory, Session } from './interfaces.js';
|
|
8
|
+
import type { SessionAgentMode, SessionConfig, SessionMessage, SessionState, Step } from './types.js';
|
|
9
|
+
import type { TypedEventEmitter } from './events.js';
|
|
10
|
+
import type { DaemonEvents } from './events.js';
|
|
11
|
+
import type { ConfigManager } from './config.js';
|
|
12
|
+
import type { DirectoryManager } from '../directories/manager.js';
|
|
13
|
+
import type { PermissionCoordinator } from './permission-coordinator.js';
|
|
14
|
+
/** Listener references for cleanup on session end / shutdown. */
|
|
15
|
+
interface SessionListeners {
|
|
16
|
+
onMessage: (msg: SessionMessage) => void;
|
|
17
|
+
onStateChange: (state: SessionState) => void;
|
|
18
|
+
onEnded: (reason: string) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface ActiveSession {
|
|
21
|
+
session: Session;
|
|
22
|
+
tracker: RunTracker;
|
|
23
|
+
config: SessionConfig;
|
|
24
|
+
startedAt: number;
|
|
25
|
+
directoryId: string;
|
|
26
|
+
worktreePath: string;
|
|
27
|
+
listeners?: SessionListeners;
|
|
28
|
+
}
|
|
29
|
+
export declare class SessionManager {
|
|
30
|
+
private readonly eventBus;
|
|
31
|
+
private readonly configManager;
|
|
32
|
+
private readonly directoryManager;
|
|
33
|
+
private readonly permissionCoordinator;
|
|
34
|
+
private readonly adapters;
|
|
35
|
+
private readonly getTrackerFactory;
|
|
36
|
+
private sessions;
|
|
37
|
+
private sessionModes;
|
|
38
|
+
constructor(eventBus: TypedEventEmitter<DaemonEvents>, configManager: ConfigManager, directoryManager: DirectoryManager, permissionCoordinator: PermissionCoordinator, adapters: Map<string, AgentAdapter>, getTrackerFactory: () => RunTrackerFactory | null);
|
|
39
|
+
/**
|
|
40
|
+
* Launch a new agent session in a registered directory.
|
|
41
|
+
*
|
|
42
|
+
* 1. Resolves config (global -> directory -> session overrides)
|
|
43
|
+
* 2. Creates a tracker (git or noop)
|
|
44
|
+
* 3. Sets up the tracker (creates worktree if git-backed)
|
|
45
|
+
* 4. Wires permission handler
|
|
46
|
+
* 5. Starts the session via the adapter
|
|
47
|
+
* 6. Wires events
|
|
48
|
+
*/
|
|
49
|
+
launchSession(directoryId: string, prompt: string, overrides?: Partial<SessionConfig>): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Resume a discovered session via the adapter's resume support.
|
|
52
|
+
*
|
|
53
|
+
* Uses the original sessionId so the SDK can load the existing conversation.
|
|
54
|
+
*/
|
|
55
|
+
resumeSession(originalSessionId: string, directoryId: string, prompt?: string, overrides?: Partial<SessionConfig>): Promise<string>;
|
|
56
|
+
/** Kill an active session. */
|
|
57
|
+
killSession(sessionId: string): Promise<void>;
|
|
58
|
+
/** Send a follow-up prompt to a session. */
|
|
59
|
+
sendPrompt(sessionId: string, text: string): Promise<void>;
|
|
60
|
+
/** Get all active session IDs. */
|
|
61
|
+
getActiveSessions(): string[];
|
|
62
|
+
/** Get session state and metadata. */
|
|
63
|
+
getSessionInfo(sessionId: string): {
|
|
64
|
+
state: SessionState;
|
|
65
|
+
directoryId: string;
|
|
66
|
+
agent: string;
|
|
67
|
+
mode: SessionAgentMode;
|
|
68
|
+
steps: ReadonlyArray<Step>;
|
|
69
|
+
};
|
|
70
|
+
listSessionSummaries(): Array<{
|
|
71
|
+
sessionId: string;
|
|
72
|
+
directoryId: string;
|
|
73
|
+
agent: string;
|
|
74
|
+
state: SessionState;
|
|
75
|
+
mode: SessionAgentMode;
|
|
76
|
+
startedAt: number;
|
|
77
|
+
}>;
|
|
78
|
+
listWorktreeSummaries(sessionId?: string): Array<{
|
|
79
|
+
sessionId: string;
|
|
80
|
+
directoryId: string;
|
|
81
|
+
agent: string;
|
|
82
|
+
state: SessionState;
|
|
83
|
+
mode: SessionAgentMode;
|
|
84
|
+
worktreePath: string;
|
|
85
|
+
stepCount: number;
|
|
86
|
+
lastStepSha: string | null;
|
|
87
|
+
lastStepAt: number | null;
|
|
88
|
+
}>;
|
|
89
|
+
/** Get diffs for a session. */
|
|
90
|
+
getSessionDiffs(sessionId: string): Promise<Array<{
|
|
91
|
+
step: number;
|
|
92
|
+
sha: string;
|
|
93
|
+
diff: string;
|
|
94
|
+
}>>;
|
|
95
|
+
/** Get the total diff across a session. */
|
|
96
|
+
getSessionSummaryDiff(sessionId: string): Promise<string>;
|
|
97
|
+
/** Roll back a session to a specific commit. */
|
|
98
|
+
rollback(sessionId: string, toSha: string): Promise<void>;
|
|
99
|
+
/** Create a retry branch from a specific commit. */
|
|
100
|
+
branchRetry(sessionId: string, fromSha: string): Promise<string>;
|
|
101
|
+
/** Squash-merge a session's changes into the target branch. */
|
|
102
|
+
squashMerge(sessionId: string, targetBranch: string, commitMessage: string): Promise<void>;
|
|
103
|
+
/** Check if a session exists. */
|
|
104
|
+
hasSession(sessionId: string): boolean;
|
|
105
|
+
/** Get the session config (for runtime permission updates). */
|
|
106
|
+
getSessionConfig(sessionId: string): SessionConfig | undefined;
|
|
107
|
+
updateSessionConfig(sessionId: string, config: SessionConfig): void;
|
|
108
|
+
setSessionMode(sessionId: string, mode: SessionAgentMode): void;
|
|
109
|
+
getSessionMode(sessionId: string): SessionAgentMode;
|
|
110
|
+
/** Gracefully shut down: tear down all active sessions. */
|
|
111
|
+
shutdown(): Promise<void>;
|
|
112
|
+
private getActiveSession;
|
|
113
|
+
/**
|
|
114
|
+
* Create and set up a tracker. If GitTracker setup fails (e.g. directory
|
|
115
|
+
* isn't a git repo), falls back to NoopTracker and logs a warning.
|
|
116
|
+
*/
|
|
117
|
+
private setupTracker;
|
|
118
|
+
private wireSessionEvents;
|
|
119
|
+
}
|
|
120
|
+
export {};
|
|
121
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|