@jacques-ai/server 0.0.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/config.d.ts +34 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +32 -0
- package/dist/config/config.js.map +1 -0
- package/dist/connection/applescript.d.ts +46 -0
- package/dist/connection/applescript.d.ts.map +1 -0
- package/dist/connection/applescript.js +62 -0
- package/dist/connection/applescript.js.map +1 -0
- package/dist/connection/applescript.test.d.ts +5 -0
- package/dist/connection/applescript.test.d.ts.map +1 -0
- package/dist/connection/applescript.test.js +64 -0
- package/dist/connection/applescript.test.js.map +1 -0
- package/dist/connection/constants.d.ts +88 -0
- package/dist/connection/constants.d.ts.map +1 -0
- package/dist/connection/constants.js +110 -0
- package/dist/connection/constants.js.map +1 -0
- package/dist/connection/git-info.d.ts +30 -0
- package/dist/connection/git-info.d.ts.map +1 -0
- package/dist/connection/git-info.js +52 -0
- package/dist/connection/git-info.js.map +1 -0
- package/dist/connection/git-info.test.d.ts +5 -0
- package/dist/connection/git-info.test.d.ts.map +1 -0
- package/dist/connection/git-info.test.js +35 -0
- package/dist/connection/git-info.test.js.map +1 -0
- package/dist/connection/index.d.ts +19 -0
- package/dist/connection/index.d.ts.map +1 -0
- package/dist/connection/index.js +36 -0
- package/dist/connection/index.js.map +1 -0
- package/dist/connection/process-detection.d.ts +58 -0
- package/dist/connection/process-detection.d.ts.map +1 -0
- package/dist/connection/process-detection.js +239 -0
- package/dist/connection/process-detection.js.map +1 -0
- package/dist/connection/process-detection.test.d.ts +5 -0
- package/dist/connection/process-detection.test.d.ts.map +1 -0
- package/dist/connection/process-detection.test.js +43 -0
- package/dist/connection/process-detection.test.js.map +1 -0
- package/dist/connection/session-discovery.d.ts +55 -0
- package/dist/connection/session-discovery.d.ts.map +1 -0
- package/dist/connection/session-discovery.js +311 -0
- package/dist/connection/session-discovery.js.map +1 -0
- package/dist/connection/terminal-key.d.ts +126 -0
- package/dist/connection/terminal-key.d.ts.map +1 -0
- package/dist/connection/terminal-key.js +271 -0
- package/dist/connection/terminal-key.js.map +1 -0
- package/dist/connection/terminal-key.test.d.ts +5 -0
- package/dist/connection/terminal-key.test.d.ts.map +1 -0
- package/dist/connection/terminal-key.test.js +221 -0
- package/dist/connection/terminal-key.test.js.map +1 -0
- package/dist/connection/worktree.d.ts +114 -0
- package/dist/connection/worktree.d.ts.map +1 -0
- package/dist/connection/worktree.js +320 -0
- package/dist/connection/worktree.js.map +1 -0
- package/dist/connection/worktree.test.d.ts +5 -0
- package/dist/connection/worktree.test.d.ts.map +1 -0
- package/dist/connection/worktree.test.js +113 -0
- package/dist/connection/worktree.test.js.map +1 -0
- package/dist/focus-watcher.d.ts +51 -0
- package/dist/focus-watcher.d.ts.map +1 -0
- package/dist/focus-watcher.js +169 -0
- package/dist/focus-watcher.js.map +1 -0
- package/dist/handlers/event-handler.d.ts +93 -0
- package/dist/handlers/event-handler.d.ts.map +1 -0
- package/dist/handlers/event-handler.js +196 -0
- package/dist/handlers/event-handler.js.map +1 -0
- package/dist/handlers/event-handler.test.d.ts +5 -0
- package/dist/handlers/event-handler.test.d.ts.map +1 -0
- package/dist/handlers/event-handler.test.js +305 -0
- package/dist/handlers/event-handler.test.js.map +1 -0
- package/dist/handlers/session-handler.d.ts +23 -0
- package/dist/handlers/session-handler.d.ts.map +1 -0
- package/dist/handlers/session-handler.js +104 -0
- package/dist/handlers/session-handler.js.map +1 -0
- package/dist/handlers/session-handler.test.d.ts +5 -0
- package/dist/handlers/session-handler.test.d.ts.map +1 -0
- package/dist/handlers/session-handler.test.js +89 -0
- package/dist/handlers/session-handler.test.js.map +1 -0
- package/dist/handlers/settings-handler.d.ts +32 -0
- package/dist/handlers/settings-handler.d.ts.map +1 -0
- package/dist/handlers/settings-handler.js +127 -0
- package/dist/handlers/settings-handler.js.map +1 -0
- package/dist/handlers/settings-handler.test.d.ts +5 -0
- package/dist/handlers/settings-handler.test.d.ts.map +1 -0
- package/dist/handlers/settings-handler.test.js +105 -0
- package/dist/handlers/settings-handler.test.js.map +1 -0
- package/dist/handlers/window-handler.d.ts +30 -0
- package/dist/handlers/window-handler.d.ts.map +1 -0
- package/dist/handlers/window-handler.js +486 -0
- package/dist/handlers/window-handler.js.map +1 -0
- package/dist/handlers/window-handler.test.d.ts +8 -0
- package/dist/handlers/window-handler.test.d.ts.map +1 -0
- package/dist/handlers/window-handler.test.js +167 -0
- package/dist/handlers/window-handler.test.js.map +1 -0
- package/dist/handlers/worktree-handler.d.ts +28 -0
- package/dist/handlers/worktree-handler.d.ts.map +1 -0
- package/dist/handlers/worktree-handler.js +268 -0
- package/dist/handlers/worktree-handler.js.map +1 -0
- package/dist/handlers/worktree-handler.test.d.ts +8 -0
- package/dist/handlers/worktree-handler.test.d.ts.map +1 -0
- package/dist/handlers/worktree-handler.test.js +118 -0
- package/dist/handlers/worktree-handler.test.js.map +1 -0
- package/dist/handlers/ws-utils.d.ts +12 -0
- package/dist/handlers/ws-utils.d.ts.map +1 -0
- package/dist/handlers/ws-utils.js +16 -0
- package/dist/handlers/ws-utils.js.map +1 -0
- package/dist/http-api.d.ts +26 -0
- package/dist/http-api.d.ts.map +1 -0
- package/dist/http-api.js +148 -0
- package/dist/http-api.js.map +1 -0
- package/dist/logger.d.ts +42 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +147 -0
- package/dist/logger.js.map +1 -0
- package/dist/logging/logger-factory.d.ts +51 -0
- package/dist/logging/logger-factory.d.ts.map +1 -0
- package/dist/logging/logger-factory.js +59 -0
- package/dist/logging/logger-factory.js.map +1 -0
- package/dist/mcp/search-tool.d.ts +65 -0
- package/dist/mcp/search-tool.d.ts.map +1 -0
- package/dist/mcp/search-tool.js +176 -0
- package/dist/mcp/search-tool.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +152 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/process-scanner.d.ts +96 -0
- package/dist/process-scanner.d.ts.map +1 -0
- package/dist/process-scanner.js +194 -0
- package/dist/process-scanner.js.map +1 -0
- package/dist/routes/__tests__/archive-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/archive-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/archive-routes.test.js +158 -0
- package/dist/routes/__tests__/archive-routes.test.js.map +1 -0
- package/dist/routes/__tests__/config-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/config-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/config-routes.test.js +112 -0
- package/dist/routes/__tests__/config-routes.test.js.map +1 -0
- package/dist/routes/__tests__/http-utils.test.d.ts +5 -0
- package/dist/routes/__tests__/http-utils.test.d.ts.map +1 -0
- package/dist/routes/__tests__/http-utils.test.js +102 -0
- package/dist/routes/__tests__/http-utils.test.js.map +1 -0
- package/dist/routes/__tests__/notification-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/notification-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/notification-routes.test.js +91 -0
- package/dist/routes/__tests__/notification-routes.test.js.map +1 -0
- package/dist/routes/__tests__/project-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/project-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/project-routes.test.js +168 -0
- package/dist/routes/__tests__/project-routes.test.js.map +1 -0
- package/dist/routes/__tests__/session-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/session-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/session-routes.test.js +198 -0
- package/dist/routes/__tests__/session-routes.test.js.map +1 -0
- package/dist/routes/__tests__/source-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/source-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/source-routes.test.js +142 -0
- package/dist/routes/__tests__/source-routes.test.js.map +1 -0
- package/dist/routes/__tests__/sync-routes.test.d.ts +5 -0
- package/dist/routes/__tests__/sync-routes.test.d.ts.map +1 -0
- package/dist/routes/__tests__/sync-routes.test.js +77 -0
- package/dist/routes/__tests__/sync-routes.test.js.map +1 -0
- package/dist/routes/__tests__/test-helpers.d.ts +47 -0
- package/dist/routes/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/routes/__tests__/test-helpers.js +97 -0
- package/dist/routes/__tests__/test-helpers.js.map +1 -0
- package/dist/routes/archive-routes.d.ts +15 -0
- package/dist/routes/archive-routes.d.ts.map +1 -0
- package/dist/routes/archive-routes.js +181 -0
- package/dist/routes/archive-routes.js.map +1 -0
- package/dist/routes/claude-routes.d.ts +9 -0
- package/dist/routes/claude-routes.d.ts.map +1 -0
- package/dist/routes/claude-routes.js +47 -0
- package/dist/routes/claude-routes.js.map +1 -0
- package/dist/routes/config-routes.d.ts +9 -0
- package/dist/routes/config-routes.d.ts.map +1 -0
- package/dist/routes/config-routes.js +56 -0
- package/dist/routes/config-routes.js.map +1 -0
- package/dist/routes/config-store.d.ts +41 -0
- package/dist/routes/config-store.d.ts.map +1 -0
- package/dist/routes/config-store.js +52 -0
- package/dist/routes/config-store.js.map +1 -0
- package/dist/routes/http-utils.d.ts +32 -0
- package/dist/routes/http-utils.d.ts.map +1 -0
- package/dist/routes/http-utils.js +123 -0
- package/dist/routes/http-utils.js.map +1 -0
- package/dist/routes/index.d.ts +19 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +17 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/notification-routes.d.ts +10 -0
- package/dist/routes/notification-routes.d.ts.map +1 -0
- package/dist/routes/notification-routes.js +64 -0
- package/dist/routes/notification-routes.js.map +1 -0
- package/dist/routes/project-routes.d.ts +22 -0
- package/dist/routes/project-routes.d.ts.map +1 -0
- package/dist/routes/project-routes.js +415 -0
- package/dist/routes/project-routes.js.map +1 -0
- package/dist/routes/session-routes.d.ts +18 -0
- package/dist/routes/session-routes.d.ts.map +1 -0
- package/dist/routes/session-routes.js +609 -0
- package/dist/routes/session-routes.js.map +1 -0
- package/dist/routes/source-routes.d.ts +12 -0
- package/dist/routes/source-routes.d.ts.map +1 -0
- package/dist/routes/source-routes.js +119 -0
- package/dist/routes/source-routes.js.map +1 -0
- package/dist/routes/static-routes.d.ts +12 -0
- package/dist/routes/static-routes.d.ts.map +1 -0
- package/dist/routes/static-routes.js +52 -0
- package/dist/routes/static-routes.js.map +1 -0
- package/dist/routes/sync-routes.d.ts +9 -0
- package/dist/routes/sync-routes.d.ts.map +1 -0
- package/dist/routes/sync-routes.js +78 -0
- package/dist/routes/sync-routes.js.map +1 -0
- package/dist/routes/tile-routes.d.ts +10 -0
- package/dist/routes/tile-routes.d.ts.map +1 -0
- package/dist/routes/tile-routes.js +108 -0
- package/dist/routes/tile-routes.js.map +1 -0
- package/dist/routes/types.d.ts +17 -0
- package/dist/routes/types.d.ts.map +1 -0
- package/dist/routes/types.js +5 -0
- package/dist/routes/types.js.map +1 -0
- package/dist/routes/usage-routes.d.ts +8 -0
- package/dist/routes/usage-routes.d.ts.map +1 -0
- package/dist/routes/usage-routes.js +18 -0
- package/dist/routes/usage-routes.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +173 -0
- package/dist/server.js.map +1 -0
- package/dist/services/branch-divergence-service.d.ts +48 -0
- package/dist/services/branch-divergence-service.d.ts.map +1 -0
- package/dist/services/branch-divergence-service.js +156 -0
- package/dist/services/branch-divergence-service.js.map +1 -0
- package/dist/services/broadcast-service.d.ts +68 -0
- package/dist/services/broadcast-service.d.ts.map +1 -0
- package/dist/services/broadcast-service.js +78 -0
- package/dist/services/broadcast-service.js.map +1 -0
- package/dist/services/broadcast-service.test.d.ts +5 -0
- package/dist/services/broadcast-service.test.d.ts.map +1 -0
- package/dist/services/broadcast-service.test.js +130 -0
- package/dist/services/broadcast-service.test.js.map +1 -0
- package/dist/services/chat-service.d.ts +72 -0
- package/dist/services/chat-service.d.ts.map +1 -0
- package/dist/services/chat-service.js +342 -0
- package/dist/services/chat-service.js.map +1 -0
- package/dist/services/chat-system-prompt.d.ts +14 -0
- package/dist/services/chat-system-prompt.d.ts.map +1 -0
- package/dist/services/chat-system-prompt.js +68 -0
- package/dist/services/chat-system-prompt.js.map +1 -0
- package/dist/services/notification-service.d.ts +115 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +424 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/notification-service.test.d.ts +5 -0
- package/dist/services/notification-service.test.d.ts.map +1 -0
- package/dist/services/notification-service.test.js +918 -0
- package/dist/services/notification-service.test.js.map +1 -0
- package/dist/session/cleanup-service.d.ts +51 -0
- package/dist/session/cleanup-service.d.ts.map +1 -0
- package/dist/session/cleanup-service.js +98 -0
- package/dist/session/cleanup-service.js.map +1 -0
- package/dist/session/cleanup-service.test.d.ts +5 -0
- package/dist/session/cleanup-service.test.d.ts.map +1 -0
- package/dist/session/cleanup-service.test.js +121 -0
- package/dist/session/cleanup-service.test.js.map +1 -0
- package/dist/session/process-monitor.d.ts +79 -0
- package/dist/session/process-monitor.d.ts.map +1 -0
- package/dist/session/process-monitor.js +270 -0
- package/dist/session/process-monitor.js.map +1 -0
- package/dist/session/process-monitor.test.d.ts +5 -0
- package/dist/session/process-monitor.test.d.ts.map +1 -0
- package/dist/session/process-monitor.test.js +367 -0
- package/dist/session/process-monitor.test.js.map +1 -0
- package/dist/session/session-factory.d.ts +29 -0
- package/dist/session/session-factory.d.ts.map +1 -0
- package/dist/session/session-factory.js +123 -0
- package/dist/session/session-factory.js.map +1 -0
- package/dist/session/session-factory.test.d.ts +5 -0
- package/dist/session/session-factory.test.d.ts.map +1 -0
- package/dist/session/session-factory.test.js +299 -0
- package/dist/session/session-factory.test.js.map +1 -0
- package/dist/session-registry.d.ts +168 -0
- package/dist/session-registry.d.ts.map +1 -0
- package/dist/session-registry.js +626 -0
- package/dist/session-registry.js.map +1 -0
- package/dist/session-registry.test.d.ts +5 -0
- package/dist/session-registry.test.d.ts.map +1 -0
- package/dist/session-registry.test.js +582 -0
- package/dist/session-registry.test.js.map +1 -0
- package/dist/start-server.d.ts +31 -0
- package/dist/start-server.d.ts.map +1 -0
- package/dist/start-server.js +408 -0
- package/dist/start-server.js.map +1 -0
- package/dist/terminal-activator.d.ts +29 -0
- package/dist/terminal-activator.d.ts.map +1 -0
- package/dist/terminal-activator.js +264 -0
- package/dist/terminal-activator.js.map +1 -0
- package/dist/terminal-activator.test.d.ts +9 -0
- package/dist/terminal-activator.test.d.ts.map +1 -0
- package/dist/terminal-activator.test.js +95 -0
- package/dist/terminal-activator.test.js.map +1 -0
- package/dist/terminal-launcher.d.ts +51 -0
- package/dist/terminal-launcher.d.ts.map +1 -0
- package/dist/terminal-launcher.js +298 -0
- package/dist/terminal-launcher.js.map +1 -0
- package/dist/terminal-launcher.test.d.ts +8 -0
- package/dist/terminal-launcher.test.d.ts.map +1 -0
- package/dist/terminal-launcher.test.js +222 -0
- package/dist/terminal-launcher.test.js.map +1 -0
- package/dist/types.d.ts +796 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/unix-socket.d.ts +68 -0
- package/dist/unix-socket.d.ts.map +1 -0
- package/dist/unix-socket.js +180 -0
- package/dist/unix-socket.js.map +1 -0
- package/dist/usage-limits.d.ts +13 -0
- package/dist/usage-limits.d.ts.map +1 -0
- package/dist/usage-limits.js +112 -0
- package/dist/usage-limits.js.map +1 -0
- package/dist/watchers/handoff-watcher.d.ts +74 -0
- package/dist/watchers/handoff-watcher.d.ts.map +1 -0
- package/dist/watchers/handoff-watcher.js +124 -0
- package/dist/watchers/handoff-watcher.js.map +1 -0
- package/dist/watchers/handoff-watcher.test.d.ts +8 -0
- package/dist/watchers/handoff-watcher.test.d.ts.map +1 -0
- package/dist/watchers/handoff-watcher.test.js +142 -0
- package/dist/watchers/handoff-watcher.test.js.map +1 -0
- package/dist/websocket.d.ts +107 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +268 -0
- package/dist/websocket.js.map +1 -0
- package/dist/window-manager/index.d.ts +28 -0
- package/dist/window-manager/index.d.ts.map +1 -0
- package/dist/window-manager/index.js +56 -0
- package/dist/window-manager/index.js.map +1 -0
- package/dist/window-manager/layouts.d.ts +42 -0
- package/dist/window-manager/layouts.d.ts.map +1 -0
- package/dist/window-manager/layouts.js +133 -0
- package/dist/window-manager/layouts.js.map +1 -0
- package/dist/window-manager/linux-manager.d.ts +45 -0
- package/dist/window-manager/linux-manager.d.ts.map +1 -0
- package/dist/window-manager/linux-manager.js +299 -0
- package/dist/window-manager/linux-manager.js.map +1 -0
- package/dist/window-manager/macos-manager.d.ts +103 -0
- package/dist/window-manager/macos-manager.d.ts.map +1 -0
- package/dist/window-manager/macos-manager.js +637 -0
- package/dist/window-manager/macos-manager.js.map +1 -0
- package/dist/window-manager/smart-layouts.d.ts +116 -0
- package/dist/window-manager/smart-layouts.d.ts.map +1 -0
- package/dist/window-manager/smart-layouts.js +188 -0
- package/dist/window-manager/smart-layouts.js.map +1 -0
- package/dist/window-manager/smart-layouts.test.d.ts +8 -0
- package/dist/window-manager/smart-layouts.test.d.ts.map +1 -0
- package/dist/window-manager/smart-layouts.test.js +311 -0
- package/dist/window-manager/smart-layouts.test.js.map +1 -0
- package/dist/window-manager/tile-state.d.ts +87 -0
- package/dist/window-manager/tile-state.d.ts.map +1 -0
- package/dist/window-manager/tile-state.js +136 -0
- package/dist/window-manager/tile-state.js.map +1 -0
- package/dist/window-manager/tile-state.test.d.ts +8 -0
- package/dist/window-manager/tile-state.test.d.ts.map +1 -0
- package/dist/window-manager/tile-state.test.js +179 -0
- package/dist/window-manager/tile-state.test.js.map +1 -0
- package/dist/window-manager/types.d.ts +104 -0
- package/dist/window-manager/types.d.ts.map +1 -0
- package/dist/window-manager/types.js +8 -0
- package/dist/window-manager/types.js.map +1 -0
- package/dist/window-manager/windows-manager.d.ts +44 -0
- package/dist/window-manager/windows-manager.d.ts.map +1 -0
- package/dist/window-manager/windows-manager.js +281 -0
- package/dist/window-manager/windows-manager.js.map +1 -0
- package/dist/window-manager/windows-manager.test.d.ts +8 -0
- package/dist/window-manager/windows-manager.test.d.ts.map +1 -0
- package/dist/window-manager/windows-manager.test.js +183 -0
- package/dist/window-manager/windows-manager.test.js.map +1 -0
- package/gui-dist/assets/index-BmYIHRYe.js +142 -0
- package/gui-dist/assets/index-D_N5RH8O.css +1 -0
- package/gui-dist/assets/vendor-icons-ByXNrcwf.js +336 -0
- package/gui-dist/assets/vendor-markdown-DWPYwU1x.js +22 -0
- package/gui-dist/assets/vendor-react-CpILBTDM.js +59 -0
- package/gui-dist/index.html +17 -0
- package/gui-dist/jacsub.png +0 -0
- package/package.json +67 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Handler Tests
|
|
3
|
+
*/
|
|
4
|
+
import { EventHandler } from './event-handler.js';
|
|
5
|
+
import { SessionRegistry } from '../session-registry.js';
|
|
6
|
+
import { createLogger } from '../logging/logger-factory.js';
|
|
7
|
+
// Mock BroadcastService
|
|
8
|
+
class MockBroadcastService {
|
|
9
|
+
sessionWithFocusCalls = [];
|
|
10
|
+
sessionRemovedWithFocusCalls = [];
|
|
11
|
+
sessionUpdateCalls = [];
|
|
12
|
+
focusChangeCalls = 0;
|
|
13
|
+
broadcastSessionWithFocus(session) {
|
|
14
|
+
this.sessionWithFocusCalls.push(session);
|
|
15
|
+
}
|
|
16
|
+
broadcastSessionRemovedWithFocus(sessionId) {
|
|
17
|
+
this.sessionRemovedWithFocusCalls.push(sessionId);
|
|
18
|
+
}
|
|
19
|
+
broadcastSessionUpdate(session) {
|
|
20
|
+
this.sessionUpdateCalls.push(session);
|
|
21
|
+
}
|
|
22
|
+
broadcastFocusChange() {
|
|
23
|
+
this.focusChangeCalls++;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Mock HandoffWatcher
|
|
27
|
+
class MockHandoffWatcher {
|
|
28
|
+
startWatchingCalls = [];
|
|
29
|
+
stopWatchingCalls = [];
|
|
30
|
+
startWatching(sessionId, projectDir) {
|
|
31
|
+
this.startWatchingCalls.push({ sessionId, projectDir });
|
|
32
|
+
}
|
|
33
|
+
stopWatching(sessionId) {
|
|
34
|
+
this.stopWatchingCalls.push(sessionId);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Mock NotificationService
|
|
38
|
+
class MockNotificationService {
|
|
39
|
+
contextUpdateCalls = [];
|
|
40
|
+
sessionRemovedCalls = [];
|
|
41
|
+
onContextUpdate(session) {
|
|
42
|
+
this.contextUpdateCalls.push(session);
|
|
43
|
+
}
|
|
44
|
+
onSessionRemoved(sessionId) {
|
|
45
|
+
this.sessionRemovedCalls.push(sessionId);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
describe('EventHandler', () => {
|
|
49
|
+
let eventHandler;
|
|
50
|
+
let registry;
|
|
51
|
+
let mockBroadcastService;
|
|
52
|
+
let mockHandoffWatcher;
|
|
53
|
+
let mockNotificationService;
|
|
54
|
+
const silentLogger = createLogger({ silent: true });
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
mockBroadcastService = new MockBroadcastService();
|
|
57
|
+
mockHandoffWatcher = new MockHandoffWatcher();
|
|
58
|
+
mockNotificationService = new MockNotificationService();
|
|
59
|
+
// Wire the registry's onSessionRemoved callback to the mocks,
|
|
60
|
+
// mirroring what start-server.ts does in production
|
|
61
|
+
registry = new SessionRegistry({
|
|
62
|
+
silent: true,
|
|
63
|
+
onSessionRemoved: (session) => {
|
|
64
|
+
mockBroadcastService.broadcastSessionRemovedWithFocus(session.session_id);
|
|
65
|
+
mockNotificationService.onSessionRemoved(session.session_id);
|
|
66
|
+
mockHandoffWatcher.stopWatching(session.session_id);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
eventHandler = new EventHandler({
|
|
70
|
+
registry,
|
|
71
|
+
broadcastService: mockBroadcastService,
|
|
72
|
+
handoffWatcher: mockHandoffWatcher,
|
|
73
|
+
notificationService: mockNotificationService,
|
|
74
|
+
logger: silentLogger,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('handleEvent - session_start', () => {
|
|
78
|
+
it('should register session, broadcast, and start handoff watcher', () => {
|
|
79
|
+
const event = {
|
|
80
|
+
event: 'session_start',
|
|
81
|
+
timestamp: Date.now(),
|
|
82
|
+
session_id: 'test-session',
|
|
83
|
+
session_title: 'Test Session',
|
|
84
|
+
transcript_path: '/path/to/transcript.jsonl',
|
|
85
|
+
cwd: '/Users/test/project',
|
|
86
|
+
project: 'project',
|
|
87
|
+
terminal: null,
|
|
88
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
89
|
+
};
|
|
90
|
+
eventHandler.handleEvent(event);
|
|
91
|
+
// Verify session was registered
|
|
92
|
+
expect(registry.hasSession('test-session')).toBe(true);
|
|
93
|
+
// Verify broadcast was called
|
|
94
|
+
expect(mockBroadcastService.sessionWithFocusCalls).toHaveLength(1);
|
|
95
|
+
expect(mockBroadcastService.sessionWithFocusCalls[0].session_id).toBe('test-session');
|
|
96
|
+
// Verify handoff watcher was started
|
|
97
|
+
expect(mockHandoffWatcher.startWatchingCalls).toHaveLength(1);
|
|
98
|
+
expect(mockHandoffWatcher.startWatchingCalls[0].sessionId).toBe('test-session');
|
|
99
|
+
expect(mockHandoffWatcher.startWatchingCalls[0].projectDir).toBe('/Users/test/project');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('handleEvent - activity', () => {
|
|
103
|
+
it('should update session activity and broadcast', () => {
|
|
104
|
+
// First register a session
|
|
105
|
+
const startEvent = {
|
|
106
|
+
event: 'session_start',
|
|
107
|
+
timestamp: Date.now(),
|
|
108
|
+
session_id: 'test-session',
|
|
109
|
+
session_title: null,
|
|
110
|
+
transcript_path: null,
|
|
111
|
+
cwd: '/test',
|
|
112
|
+
project: 'test',
|
|
113
|
+
terminal: null,
|
|
114
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
115
|
+
};
|
|
116
|
+
eventHandler.handleEvent(startEvent);
|
|
117
|
+
// Clear the mocks
|
|
118
|
+
mockBroadcastService.sessionWithFocusCalls = [];
|
|
119
|
+
// Send activity event
|
|
120
|
+
const activityEvent = {
|
|
121
|
+
event: 'activity',
|
|
122
|
+
timestamp: Date.now() + 1000,
|
|
123
|
+
session_id: 'test-session',
|
|
124
|
+
session_title: 'Updated Title',
|
|
125
|
+
tool_name: 'Read',
|
|
126
|
+
terminal_pid: 12345,
|
|
127
|
+
};
|
|
128
|
+
eventHandler.handleEvent(activityEvent);
|
|
129
|
+
// Verify session was updated
|
|
130
|
+
const session = registry.getSession('test-session');
|
|
131
|
+
expect(session?.status).toBe('working');
|
|
132
|
+
expect(session?.session_title).toBe('Updated Title');
|
|
133
|
+
// Verify broadcast was called (activity uses broadcastSessionUpdate, not broadcastSessionWithFocus)
|
|
134
|
+
expect(mockBroadcastService.sessionUpdateCalls).toHaveLength(1);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('handleEvent - context_update', () => {
|
|
138
|
+
it('should update context metrics and broadcast', () => {
|
|
139
|
+
// First register a session
|
|
140
|
+
const startEvent = {
|
|
141
|
+
event: 'session_start',
|
|
142
|
+
timestamp: Date.now(),
|
|
143
|
+
session_id: 'test-session',
|
|
144
|
+
session_title: null,
|
|
145
|
+
transcript_path: null,
|
|
146
|
+
cwd: '/test',
|
|
147
|
+
project: 'test',
|
|
148
|
+
terminal: null,
|
|
149
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
150
|
+
};
|
|
151
|
+
eventHandler.handleEvent(startEvent);
|
|
152
|
+
// Clear the mocks
|
|
153
|
+
mockBroadcastService.sessionWithFocusCalls = [];
|
|
154
|
+
// Send context update
|
|
155
|
+
const contextEvent = {
|
|
156
|
+
event: 'context_update',
|
|
157
|
+
timestamp: Date.now() + 1000,
|
|
158
|
+
session_id: 'test-session',
|
|
159
|
+
used_percentage: 42.5,
|
|
160
|
+
remaining_percentage: 57.5,
|
|
161
|
+
context_window_size: 200000,
|
|
162
|
+
model: 'claude-opus-4-1',
|
|
163
|
+
cwd: '/test/project',
|
|
164
|
+
};
|
|
165
|
+
eventHandler.handleEvent(contextEvent);
|
|
166
|
+
// Verify context was updated
|
|
167
|
+
const session = registry.getSession('test-session');
|
|
168
|
+
expect(session?.context_metrics?.used_percentage).toBe(42.5);
|
|
169
|
+
// Verify broadcast was called (context_update uses broadcastSessionUpdate, not broadcastSessionWithFocus)
|
|
170
|
+
expect(mockBroadcastService.sessionUpdateCalls).toHaveLength(1);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('handleEvent - idle', () => {
|
|
174
|
+
it('should mark session as idle and broadcast (without focus change)', () => {
|
|
175
|
+
// First register a session
|
|
176
|
+
const startEvent = {
|
|
177
|
+
event: 'session_start',
|
|
178
|
+
timestamp: Date.now(),
|
|
179
|
+
session_id: 'test-session',
|
|
180
|
+
session_title: null,
|
|
181
|
+
transcript_path: null,
|
|
182
|
+
cwd: '/test',
|
|
183
|
+
project: 'test',
|
|
184
|
+
terminal: null,
|
|
185
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
186
|
+
};
|
|
187
|
+
eventHandler.handleEvent(startEvent);
|
|
188
|
+
// Clear the mocks
|
|
189
|
+
mockBroadcastService.sessionWithFocusCalls = [];
|
|
190
|
+
mockBroadcastService.sessionUpdateCalls = [];
|
|
191
|
+
// Send idle event
|
|
192
|
+
const idleEvent = {
|
|
193
|
+
event: 'idle',
|
|
194
|
+
timestamp: Date.now() + 1000,
|
|
195
|
+
session_id: 'test-session',
|
|
196
|
+
terminal_pid: 12345,
|
|
197
|
+
};
|
|
198
|
+
eventHandler.handleEvent(idleEvent);
|
|
199
|
+
// Verify session was marked idle
|
|
200
|
+
const session = registry.getSession('test-session');
|
|
201
|
+
expect(session?.status).toBe('idle');
|
|
202
|
+
// Verify only session update was called (no focus change)
|
|
203
|
+
expect(mockBroadcastService.sessionUpdateCalls).toHaveLength(1);
|
|
204
|
+
expect(mockBroadcastService.sessionWithFocusCalls).toHaveLength(0);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('handleEvent - session_end', () => {
|
|
208
|
+
it('should stop handoff watcher, unregister session, and broadcast removal', () => {
|
|
209
|
+
// First register a session
|
|
210
|
+
const startEvent = {
|
|
211
|
+
event: 'session_start',
|
|
212
|
+
timestamp: Date.now(),
|
|
213
|
+
session_id: 'test-session',
|
|
214
|
+
session_title: null,
|
|
215
|
+
transcript_path: null,
|
|
216
|
+
cwd: '/test/project',
|
|
217
|
+
project: 'project',
|
|
218
|
+
terminal: null,
|
|
219
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
220
|
+
};
|
|
221
|
+
eventHandler.handleEvent(startEvent);
|
|
222
|
+
// Clear the mocks
|
|
223
|
+
mockHandoffWatcher.stopWatchingCalls = [];
|
|
224
|
+
// Send session end event
|
|
225
|
+
const endEvent = {
|
|
226
|
+
event: 'session_end',
|
|
227
|
+
timestamp: Date.now() + 1000,
|
|
228
|
+
session_id: 'test-session',
|
|
229
|
+
terminal_pid: 12345,
|
|
230
|
+
};
|
|
231
|
+
eventHandler.handleEvent(endEvent);
|
|
232
|
+
// Verify handoff watcher was stopped
|
|
233
|
+
expect(mockHandoffWatcher.stopWatchingCalls).toContain('test-session');
|
|
234
|
+
// Verify session was unregistered
|
|
235
|
+
expect(registry.hasSession('test-session')).toBe(false);
|
|
236
|
+
// Verify removal was broadcast
|
|
237
|
+
expect(mockBroadcastService.sessionRemovedWithFocusCalls).toContain('test-session');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe('notification service integration', () => {
|
|
241
|
+
it('should call notificationService.onContextUpdate on context_update', () => {
|
|
242
|
+
// Register session first
|
|
243
|
+
const startEvent = {
|
|
244
|
+
event: 'session_start',
|
|
245
|
+
timestamp: Date.now(),
|
|
246
|
+
session_id: 'test-session',
|
|
247
|
+
session_title: null,
|
|
248
|
+
transcript_path: null,
|
|
249
|
+
cwd: '/test',
|
|
250
|
+
project: 'test',
|
|
251
|
+
terminal: null,
|
|
252
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
253
|
+
};
|
|
254
|
+
eventHandler.handleEvent(startEvent);
|
|
255
|
+
const contextEvent = {
|
|
256
|
+
event: 'context_update',
|
|
257
|
+
timestamp: Date.now() + 1000,
|
|
258
|
+
session_id: 'test-session',
|
|
259
|
+
used_percentage: 55,
|
|
260
|
+
remaining_percentage: 45,
|
|
261
|
+
context_window_size: 200000,
|
|
262
|
+
model: 'claude-opus-4-1',
|
|
263
|
+
cwd: '/test',
|
|
264
|
+
};
|
|
265
|
+
eventHandler.handleEvent(contextEvent);
|
|
266
|
+
expect(mockNotificationService.contextUpdateCalls).toHaveLength(1);
|
|
267
|
+
expect(mockNotificationService.contextUpdateCalls[0].session_id).toBe('test-session');
|
|
268
|
+
});
|
|
269
|
+
it('should call notificationService.onSessionRemoved on session_end', () => {
|
|
270
|
+
// Register session first
|
|
271
|
+
const startEvent = {
|
|
272
|
+
event: 'session_start',
|
|
273
|
+
timestamp: Date.now(),
|
|
274
|
+
session_id: 'test-session',
|
|
275
|
+
session_title: null,
|
|
276
|
+
transcript_path: null,
|
|
277
|
+
cwd: '/test',
|
|
278
|
+
project: 'test',
|
|
279
|
+
terminal: null,
|
|
280
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
281
|
+
};
|
|
282
|
+
eventHandler.handleEvent(startEvent);
|
|
283
|
+
const endEvent = {
|
|
284
|
+
event: 'session_end',
|
|
285
|
+
timestamp: Date.now() + 1000,
|
|
286
|
+
session_id: 'test-session',
|
|
287
|
+
terminal_pid: 12345,
|
|
288
|
+
};
|
|
289
|
+
eventHandler.handleEvent(endEvent);
|
|
290
|
+
expect(mockNotificationService.sessionRemovedCalls).toContain('test-session');
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
describe('handleEvent - unknown event', () => {
|
|
294
|
+
it('should handle unknown event types gracefully', () => {
|
|
295
|
+
const unknownEvent = {
|
|
296
|
+
event: 'unknown_event',
|
|
297
|
+
timestamp: Date.now(),
|
|
298
|
+
session_id: 'test-session',
|
|
299
|
+
};
|
|
300
|
+
// Should not throw
|
|
301
|
+
expect(() => eventHandler.handleEvent(unknownEvent)).not.toThrow();
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
//# sourceMappingURL=event-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler.test.js","sourceRoot":"","sources":["../../src/handlers/event-handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles WebSocket requests for session-level operations:
|
|
5
|
+
* - focus_terminal
|
|
6
|
+
* - launch_session
|
|
7
|
+
*/
|
|
8
|
+
import { WebSocket } from 'ws';
|
|
9
|
+
import type { SessionRegistry } from '../session-registry.js';
|
|
10
|
+
import type { Logger } from '../logging/logger-factory.js';
|
|
11
|
+
import type { FocusTerminalRequest, LaunchSessionRequest } from '../types.js';
|
|
12
|
+
export interface SessionHandlerDeps {
|
|
13
|
+
registry: SessionRegistry;
|
|
14
|
+
logger: Logger;
|
|
15
|
+
}
|
|
16
|
+
export declare class SessionHandler {
|
|
17
|
+
private registry;
|
|
18
|
+
private logger;
|
|
19
|
+
constructor(deps: SessionHandlerDeps);
|
|
20
|
+
handleFocusTerminal(ws: WebSocket, request: FocusTerminalRequest): Promise<void>;
|
|
21
|
+
handleLaunchSession(ws: WebSocket, request: LaunchSessionRequest): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=session-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/session-handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAG3D,OAAO,KAAK,EACV,oBAAoB,EAEpB,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,kBAAkB;IAK9B,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ChF,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmDvF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles WebSocket requests for session-level operations:
|
|
5
|
+
* - focus_terminal
|
|
6
|
+
* - launch_session
|
|
7
|
+
*/
|
|
8
|
+
import { sendWsResponse } from './ws-utils.js';
|
|
9
|
+
import { activateTerminal } from '../terminal-activator.js';
|
|
10
|
+
import { launchTerminalSession } from '../terminal-launcher.js';
|
|
11
|
+
export class SessionHandler {
|
|
12
|
+
registry;
|
|
13
|
+
logger;
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.registry = deps.registry;
|
|
16
|
+
this.logger = deps.logger;
|
|
17
|
+
}
|
|
18
|
+
async handleFocusTerminal(ws, request) {
|
|
19
|
+
const session = this.registry.getSession(request.session_id);
|
|
20
|
+
if (!session) {
|
|
21
|
+
sendWsResponse(ws, {
|
|
22
|
+
type: 'focus_terminal_result',
|
|
23
|
+
session_id: request.session_id,
|
|
24
|
+
success: false,
|
|
25
|
+
method: 'unsupported',
|
|
26
|
+
error: `Session not found: ${request.session_id}`,
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.logger.log(`Focusing terminal for session ${request.session_id} (key: ${session.terminal_key})`);
|
|
31
|
+
if (!session.terminal_key) {
|
|
32
|
+
sendWsResponse(ws, {
|
|
33
|
+
type: 'focus_terminal_result',
|
|
34
|
+
session_id: request.session_id,
|
|
35
|
+
success: false,
|
|
36
|
+
method: 'unsupported',
|
|
37
|
+
error: 'Session has no terminal key',
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const result = await activateTerminal(session.terminal_key);
|
|
42
|
+
sendWsResponse(ws, {
|
|
43
|
+
type: 'focus_terminal_result',
|
|
44
|
+
session_id: request.session_id,
|
|
45
|
+
success: result.success,
|
|
46
|
+
method: result.method,
|
|
47
|
+
error: result.error,
|
|
48
|
+
});
|
|
49
|
+
if (result.success) {
|
|
50
|
+
this.logger.log(`Terminal focused via ${result.method} for session ${request.session_id}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.logger.log(`Terminal focus failed (${result.method}): ${result.error}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async handleLaunchSession(ws, request) {
|
|
57
|
+
const { cwd, preferred_terminal, dangerously_skip_permissions } = request;
|
|
58
|
+
if (!cwd) {
|
|
59
|
+
sendWsResponse(ws, {
|
|
60
|
+
type: 'launch_session_result',
|
|
61
|
+
success: false,
|
|
62
|
+
method: 'unsupported',
|
|
63
|
+
cwd: cwd || '',
|
|
64
|
+
error: 'Missing cwd',
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.logger.log(`Launching new terminal session in ${cwd}`);
|
|
69
|
+
if (dangerously_skip_permissions) {
|
|
70
|
+
this.registry.markPendingBypass(cwd);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const result = await launchTerminalSession({
|
|
74
|
+
cwd,
|
|
75
|
+
preferredTerminal: preferred_terminal,
|
|
76
|
+
dangerouslySkipPermissions: dangerously_skip_permissions,
|
|
77
|
+
});
|
|
78
|
+
sendWsResponse(ws, {
|
|
79
|
+
type: 'launch_session_result',
|
|
80
|
+
success: result.success,
|
|
81
|
+
method: result.method,
|
|
82
|
+
cwd,
|
|
83
|
+
error: result.error,
|
|
84
|
+
});
|
|
85
|
+
if (result.success) {
|
|
86
|
+
this.logger.log(`Launched terminal (${result.method}) in ${cwd}`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.logger.error(`Failed to launch terminal: ${result.error}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
this.logger.error(`Failed to launch terminal: ${err}`);
|
|
94
|
+
sendWsResponse(ws, {
|
|
95
|
+
type: 'launch_session_result',
|
|
96
|
+
success: false,
|
|
97
|
+
method: 'unsupported',
|
|
98
|
+
cwd,
|
|
99
|
+
error: err instanceof Error ? err.message : String(err),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=session-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-handler.js","sourceRoot":"","sources":["../../src/handlers/session-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-handler.test.d.ts","sourceRoot":"","sources":["../../src/handlers/session-handler.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Handler Tests
|
|
3
|
+
*/
|
|
4
|
+
import { SessionHandler } from './session-handler.js';
|
|
5
|
+
import { SessionRegistry } from '../session-registry.js';
|
|
6
|
+
import { createLogger } from '../logging/logger-factory.js';
|
|
7
|
+
function createMockWs() {
|
|
8
|
+
const sent = [];
|
|
9
|
+
return {
|
|
10
|
+
ws: {
|
|
11
|
+
readyState: 1, // WebSocket.OPEN
|
|
12
|
+
send: (data) => { sent.push(data); },
|
|
13
|
+
},
|
|
14
|
+
sent,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe('SessionHandler', () => {
|
|
18
|
+
let handler;
|
|
19
|
+
let registry;
|
|
20
|
+
const silentLogger = createLogger({ silent: true });
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
registry = new SessionRegistry({ silent: true });
|
|
23
|
+
handler = new SessionHandler({
|
|
24
|
+
registry,
|
|
25
|
+
logger: silentLogger,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('handleFocusTerminal', () => {
|
|
29
|
+
it('should return error when session not found', async () => {
|
|
30
|
+
const { ws, sent } = createMockWs();
|
|
31
|
+
const request = {
|
|
32
|
+
type: 'focus_terminal',
|
|
33
|
+
session_id: 'nonexistent-session',
|
|
34
|
+
};
|
|
35
|
+
await handler.handleFocusTerminal(ws, request);
|
|
36
|
+
expect(sent).toHaveLength(1);
|
|
37
|
+
const response = JSON.parse(sent[0]);
|
|
38
|
+
expect(response.type).toBe('focus_terminal_result');
|
|
39
|
+
expect(response.session_id).toBe('nonexistent-session');
|
|
40
|
+
expect(response.success).toBe(false);
|
|
41
|
+
expect(response.error).toBe('Session not found: nonexistent-session');
|
|
42
|
+
});
|
|
43
|
+
it('should return error when session has no terminal_key', async () => {
|
|
44
|
+
const { ws, sent } = createMockWs();
|
|
45
|
+
// Register a session, then clear its terminal_key to simulate no terminal
|
|
46
|
+
registry.registerSession({
|
|
47
|
+
event: 'session_start',
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
session_id: 'no-terminal-session',
|
|
50
|
+
session_title: null,
|
|
51
|
+
transcript_path: null,
|
|
52
|
+
cwd: '/test/project',
|
|
53
|
+
project: 'test',
|
|
54
|
+
terminal: null,
|
|
55
|
+
terminal_key: 'TTY:/dev/ttys001',
|
|
56
|
+
});
|
|
57
|
+
// Clear terminal_key to test the "no terminal key" path
|
|
58
|
+
const session = registry.getSession('no-terminal-session');
|
|
59
|
+
session.terminal_key = '';
|
|
60
|
+
const request = {
|
|
61
|
+
type: 'focus_terminal',
|
|
62
|
+
session_id: 'no-terminal-session',
|
|
63
|
+
};
|
|
64
|
+
await handler.handleFocusTerminal(ws, request);
|
|
65
|
+
expect(sent).toHaveLength(1);
|
|
66
|
+
const response = JSON.parse(sent[0]);
|
|
67
|
+
expect(response.type).toBe('focus_terminal_result');
|
|
68
|
+
expect(response.session_id).toBe('no-terminal-session');
|
|
69
|
+
expect(response.success).toBe(false);
|
|
70
|
+
expect(response.error).toBe('Session has no terminal key');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('handleLaunchSession', () => {
|
|
74
|
+
it('should return error when cwd is missing', async () => {
|
|
75
|
+
const { ws, sent } = createMockWs();
|
|
76
|
+
const request = {
|
|
77
|
+
type: 'launch_session',
|
|
78
|
+
cwd: '',
|
|
79
|
+
};
|
|
80
|
+
await handler.handleLaunchSession(ws, request);
|
|
81
|
+
expect(sent).toHaveLength(1);
|
|
82
|
+
const response = JSON.parse(sent[0]);
|
|
83
|
+
expect(response.type).toBe('launch_session_result');
|
|
84
|
+
expect(response.success).toBe(false);
|
|
85
|
+
expect(response.error).toBe('Missing cwd');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=session-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-handler.test.js","sourceRoot":"","sources":["../../src/handlers/session-handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settings Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles WebSocket requests for settings management:
|
|
5
|
+
* - toggle_autocompact
|
|
6
|
+
* - update_notification_settings
|
|
7
|
+
* - get_handoff_context
|
|
8
|
+
*/
|
|
9
|
+
import { WebSocket } from 'ws';
|
|
10
|
+
import type { SessionRegistry } from '../session-registry.js';
|
|
11
|
+
import type { JacquesWebSocketServer } from '../websocket.js';
|
|
12
|
+
import type { NotificationService } from '../services/notification-service.js';
|
|
13
|
+
import type { Logger } from '../logging/logger-factory.js';
|
|
14
|
+
import type { GetHandoffContextRequest, UpdateNotificationSettingsRequest } from '../types.js';
|
|
15
|
+
export interface SettingsHandlerDeps {
|
|
16
|
+
registry: SessionRegistry;
|
|
17
|
+
wsServer: JacquesWebSocketServer;
|
|
18
|
+
notificationService: NotificationService;
|
|
19
|
+
logger: Logger;
|
|
20
|
+
}
|
|
21
|
+
export declare class SettingsHandler {
|
|
22
|
+
private registry;
|
|
23
|
+
private wsServer;
|
|
24
|
+
private notificationService;
|
|
25
|
+
private logger;
|
|
26
|
+
constructor(deps: SettingsHandlerDeps);
|
|
27
|
+
handleToggleAutoCompact(ws: WebSocket): void;
|
|
28
|
+
handleGetHandoffContext(ws: WebSocket, request: GetHandoffContextRequest): Promise<void>;
|
|
29
|
+
handleUpdateNotificationSettings(ws: WebSocket, request: UpdateNotificationSettingsRequest): void;
|
|
30
|
+
private sendHandoffError;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=settings-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/settings-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAI/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAG3D,OAAO,KAAK,EAEV,wBAAwB,EAGxB,iCAAiC,EAElC,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,mBAAmB;IAOrC,uBAAuB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IA8CtC,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoD9F,gCAAgC,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,iCAAiC,GAAG,IAAI;IAUjG,OAAO,CAAC,gBAAgB;CAQzB"}
|