@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,626 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages active AI sessions from multiple sources (Claude Code, Cursor, etc.)
|
|
5
|
+
* with focus detection. Focus is determined by terminal focus watcher.
|
|
6
|
+
*
|
|
7
|
+
* Delegates to:
|
|
8
|
+
* - SessionFactory: Session object creation from hooks, discovery, and context updates
|
|
9
|
+
* - ProcessMonitor: Process verification, bypass detection, PID management
|
|
10
|
+
* - CleanupService: Recently-ended tracking and stale session cleanup
|
|
11
|
+
*/
|
|
12
|
+
import { createLogger } from './logging/logger-factory.js';
|
|
13
|
+
import { readFile } from 'fs/promises';
|
|
14
|
+
import { parseJSONL } from '@jacques-ai/core/session';
|
|
15
|
+
import { detectModeAndPlans } from '@jacques-ai/core/cache';
|
|
16
|
+
import { matchTerminalKeys } from './connection/terminal-key.js';
|
|
17
|
+
import { createFromHook, createFromDiscovered, createFromContextUpdate, } from './session/session-factory.js';
|
|
18
|
+
import { ProcessMonitor } from './session/process-monitor.js';
|
|
19
|
+
import { CleanupService } from './session/cleanup-service.js';
|
|
20
|
+
/**
|
|
21
|
+
* SessionRegistry - tracks all active AI sessions from all sources
|
|
22
|
+
*
|
|
23
|
+
* Key behaviors:
|
|
24
|
+
* - Sessions are indexed by session_id
|
|
25
|
+
* - Sessions track their source (claude_code, cursor, etc.)
|
|
26
|
+
* - Focus is determined by terminal focus watcher (macOS AppleScript)
|
|
27
|
+
* - New session registration auto-focuses
|
|
28
|
+
* - Sessions can be manually focused via setFocusedSession
|
|
29
|
+
*/
|
|
30
|
+
export class SessionRegistry {
|
|
31
|
+
sessions = new Map();
|
|
32
|
+
focusedSessionId = null;
|
|
33
|
+
logger;
|
|
34
|
+
onSessionRemovedCallback;
|
|
35
|
+
// Debounce timers for awaiting status (PreToolUse → PostToolUse gap)
|
|
36
|
+
awaitingTimers = new Map();
|
|
37
|
+
// Delegates
|
|
38
|
+
processMonitor;
|
|
39
|
+
cleanupService;
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
// Support both old silent flag and new logger injection
|
|
42
|
+
this.logger = options.logger ?? createLogger({ silent: options.silent });
|
|
43
|
+
this.onSessionRemovedCallback = options.onSessionRemoved;
|
|
44
|
+
// Initialize delegates with callbacks into this registry
|
|
45
|
+
this.processMonitor = new ProcessMonitor({
|
|
46
|
+
callbacks: {
|
|
47
|
+
getSession: (id) => this.sessions.get(id),
|
|
48
|
+
getAllSessions: () => Array.from(this.sessions.entries()),
|
|
49
|
+
removeSession: (id) => this.unregisterSession(id),
|
|
50
|
+
},
|
|
51
|
+
logger: this.logger,
|
|
52
|
+
});
|
|
53
|
+
this.cleanupService = new CleanupService({
|
|
54
|
+
callbacks: {
|
|
55
|
+
getAllSessions: () => Array.from(this.sessions.entries()),
|
|
56
|
+
removeSession: (id) => this.unregisterSession(id),
|
|
57
|
+
},
|
|
58
|
+
logger: this.logger,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Convenience accessors for logging (messages already include [Registry] prefix)
|
|
62
|
+
get log() { return this.logger.log.bind(this.logger); }
|
|
63
|
+
get warn() { return this.logger.warn.bind(this.logger); }
|
|
64
|
+
/**
|
|
65
|
+
* Detect session mode (planning/execution) from JSONL transcript.
|
|
66
|
+
*
|
|
67
|
+
* For plan mode detection, scans raw JSONL text for EnterPlanMode/ExitPlanMode
|
|
68
|
+
* tool names. This is more reliable than parsed entries because the parser only
|
|
69
|
+
* captures the first tool_use block per assistant message — ExitPlanMode can be
|
|
70
|
+
* bundled with other tools (Edit, Write) and get silently dropped.
|
|
71
|
+
*/
|
|
72
|
+
async detectSessionMode(transcriptPath) {
|
|
73
|
+
if (!transcriptPath)
|
|
74
|
+
return null;
|
|
75
|
+
try {
|
|
76
|
+
// Raw text scan for plan mode — catches all tool_use blocks regardless of position
|
|
77
|
+
const raw = await readFile(transcriptPath, 'utf-8');
|
|
78
|
+
const enterPlanIdx = raw.lastIndexOf('"name":"EnterPlanMode"');
|
|
79
|
+
const exitPlanIdx = raw.lastIndexOf('"name":"ExitPlanMode"');
|
|
80
|
+
// Also check spaced variant: "name": "EnterPlanMode"
|
|
81
|
+
const enterPlanIdxSpaced = raw.lastIndexOf('"name": "EnterPlanMode"');
|
|
82
|
+
const exitPlanIdxSpaced = raw.lastIndexOf('"name": "ExitPlanMode"');
|
|
83
|
+
const lastEnter = Math.max(enterPlanIdx, enterPlanIdxSpaced);
|
|
84
|
+
const lastExit = Math.max(exitPlanIdx, exitPlanIdxSpaced);
|
|
85
|
+
if (lastEnter > lastExit) {
|
|
86
|
+
return 'planning';
|
|
87
|
+
}
|
|
88
|
+
// Fall back to parsed detection for execution mode
|
|
89
|
+
const entries = await parseJSONL(transcriptPath);
|
|
90
|
+
if (entries.length === 0)
|
|
91
|
+
return null;
|
|
92
|
+
const { mode } = detectModeAndPlans(entries);
|
|
93
|
+
// If plan mode was explicitly exited (ExitPlanMode in JSONL) but parsed
|
|
94
|
+
// detection found no specific mode, return 'default' to clear stale 'planning'
|
|
95
|
+
if (!mode && lastExit !== -1 && lastExit > lastEnter) {
|
|
96
|
+
return 'default';
|
|
97
|
+
}
|
|
98
|
+
return mode;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
this.warn(`[Registry] Failed to detect mode from JSONL: ${err}`);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Register a session discovered at startup from process scanning
|
|
107
|
+
* Creates a session with DISCOVERED: terminal key prefix
|
|
108
|
+
* @param discovered Detected session from process scanner
|
|
109
|
+
* @returns The created session, or existing session if already registered
|
|
110
|
+
*/
|
|
111
|
+
registerDiscoveredSession(discovered) {
|
|
112
|
+
// Check if session already exists (registered via hooks before scanner finished)
|
|
113
|
+
const existing = this.sessions.get(discovered.sessionId);
|
|
114
|
+
if (existing) {
|
|
115
|
+
this.log(`[Registry] Session already registered, skipping discovery: ${discovered.sessionId}`);
|
|
116
|
+
return existing;
|
|
117
|
+
}
|
|
118
|
+
const session = createFromDiscovered(discovered);
|
|
119
|
+
this.sessions.set(discovered.sessionId, session);
|
|
120
|
+
// Auto-focus if this is the only session
|
|
121
|
+
if (this.sessions.size === 1) {
|
|
122
|
+
this.focusedSessionId = discovered.sessionId;
|
|
123
|
+
}
|
|
124
|
+
const contextInfo = session.context_metrics
|
|
125
|
+
? `~${session.context_metrics.used_percentage.toFixed(1)}%`
|
|
126
|
+
: 'unknown';
|
|
127
|
+
const terminalInfo = discovered.terminalType || 'Unknown terminal';
|
|
128
|
+
const gitInfo = session.git_branch
|
|
129
|
+
? ` [${session.git_branch}${session.git_worktree ? `@${session.git_worktree}` : ''}]`
|
|
130
|
+
: '';
|
|
131
|
+
const modeInfo = session.mode ? ` mode=${session.mode}` : '';
|
|
132
|
+
this.log(`[Registry] Discovered session: ${discovered.sessionId} [${discovered.project}]${gitInfo}${modeInfo} - ${contextInfo} (${terminalInfo})`);
|
|
133
|
+
this.log(`[Registry] Terminal key: ${session.terminal_key}`);
|
|
134
|
+
return session;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Register a new session or update an existing auto-registered one
|
|
138
|
+
* @param event SessionStart event data
|
|
139
|
+
* @returns The created/updated session
|
|
140
|
+
*/
|
|
141
|
+
registerSession(event) {
|
|
142
|
+
// Clean up any existing sessions with the same terminal_key (different session_id)
|
|
143
|
+
// This handles the case where a new session starts in the same terminal tab
|
|
144
|
+
if (event.terminal_key) {
|
|
145
|
+
for (const [id, session] of this.sessions) {
|
|
146
|
+
if (id !== event.session_id && session.terminal_key === event.terminal_key) {
|
|
147
|
+
this.log(`[Registry] Removing stale session ${id} (same terminal_key as new session ${event.session_id})`);
|
|
148
|
+
this.unregisterSession(id);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Check if session was already auto-registered from context_update or discovered at startup
|
|
153
|
+
const existing = this.sessions.get(event.session_id);
|
|
154
|
+
if (existing) {
|
|
155
|
+
// Check if upgrading from a discovered session
|
|
156
|
+
const wasDiscovered = existing.terminal_key?.startsWith('DISCOVERED:');
|
|
157
|
+
// Update the existing session with terminal identity info
|
|
158
|
+
this.log(`[Registry] Updating ${wasDiscovered ? 'discovered' : 'auto-registered'} session with terminal info: ${event.session_id}`);
|
|
159
|
+
existing.terminal = event.terminal;
|
|
160
|
+
existing.terminal_key = event.terminal_key;
|
|
161
|
+
const newTitle = event.session_title?.trim();
|
|
162
|
+
if (newTitle && !newTitle.startsWith('<local-command') && !newTitle.startsWith('<command-')) {
|
|
163
|
+
existing.session_title = event.session_title;
|
|
164
|
+
}
|
|
165
|
+
existing.transcript_path = event.transcript_path || existing.transcript_path;
|
|
166
|
+
if (event.autocompact) {
|
|
167
|
+
existing.autocompact = event.autocompact;
|
|
168
|
+
}
|
|
169
|
+
if (event.git_branch !== undefined) {
|
|
170
|
+
existing.git_branch = event.git_branch || null;
|
|
171
|
+
existing.git_worktree = event.git_worktree || null;
|
|
172
|
+
}
|
|
173
|
+
if (event.git_repo_root !== undefined) {
|
|
174
|
+
existing.git_repo_root = event.git_repo_root || null;
|
|
175
|
+
}
|
|
176
|
+
this.log(`[Registry] Terminal key updated: ${existing.terminal_key}`);
|
|
177
|
+
return existing;
|
|
178
|
+
}
|
|
179
|
+
const session = createFromHook(event);
|
|
180
|
+
this.sessions.set(event.session_id, session);
|
|
181
|
+
// Check if this session was launched with --dangerously-skip-permissions
|
|
182
|
+
if (this.processMonitor.consumePendingBypass(session.cwd)) {
|
|
183
|
+
session.is_bypass = true;
|
|
184
|
+
this.log(`[Registry] Session marked as bypass (launched with --dangerously-skip-permissions): ${event.session_id}`);
|
|
185
|
+
}
|
|
186
|
+
// Set mode from permission_mode if available (bypass is orthogonal to mode)
|
|
187
|
+
this.updateModeFromPermission(session, event.permission_mode);
|
|
188
|
+
// Auto-focus new session
|
|
189
|
+
this.focusedSessionId = event.session_id;
|
|
190
|
+
// Log autocompact status if present
|
|
191
|
+
const acStatus = session.autocompact
|
|
192
|
+
? `AC:${session.autocompact.enabled ? 'ON' : 'OFF'}@${session.autocompact.threshold}%`
|
|
193
|
+
: 'AC:unknown';
|
|
194
|
+
this.log(`[Registry] Session registered: ${event.session_id} [${session.source}] - "${session.session_title || 'Untitled'}" (${acStatus})`);
|
|
195
|
+
this.log(`[Registry] Terminal key: ${session.terminal_key}`);
|
|
196
|
+
return session;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Update session with activity event
|
|
200
|
+
* @param event Activity event data
|
|
201
|
+
* @returns Updated session or null if session not found
|
|
202
|
+
*/
|
|
203
|
+
updateActivity(event) {
|
|
204
|
+
const session = this.sessions.get(event.session_id);
|
|
205
|
+
if (!session) {
|
|
206
|
+
this.warn(`[Registry] Activity for unknown session: ${event.session_id}`);
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
// Cancel any pending awaiting timer (PostToolUse means tool was approved/completed)
|
|
210
|
+
this.cancelAwaitingTimer(event.session_id);
|
|
211
|
+
session.last_activity = event.timestamp;
|
|
212
|
+
session.status = 'working';
|
|
213
|
+
session.last_tool_name = event.tool_name || null;
|
|
214
|
+
// Store terminal_pid if not already known (enables bypass detection for auto-registered sessions)
|
|
215
|
+
this.processMonitor.storeTerminalPid(session, event.terminal_pid);
|
|
216
|
+
// Update mode from permission_mode if available
|
|
217
|
+
this.updateModeFromPermission(session, event.permission_mode);
|
|
218
|
+
// Update title if changed (filter internal command titles to prevent flickering)
|
|
219
|
+
if (event.session_title && event.session_title !== session.session_title) {
|
|
220
|
+
const trimmed = event.session_title.trim();
|
|
221
|
+
if (!trimmed.startsWith('<local-command') && !trimmed.startsWith('<command-')) {
|
|
222
|
+
session.session_title = event.session_title;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Update context metrics if provided
|
|
226
|
+
if (event.context_metrics) {
|
|
227
|
+
session.context_metrics = event.context_metrics;
|
|
228
|
+
}
|
|
229
|
+
return session;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Update session with context data from statusLine or preCompact
|
|
233
|
+
* @param event Context update event data
|
|
234
|
+
* @returns Updated session (auto-creates if not found)
|
|
235
|
+
*/
|
|
236
|
+
updateContext(event) {
|
|
237
|
+
let session = this.sessions.get(event.session_id);
|
|
238
|
+
let isNewSession = false;
|
|
239
|
+
// Auto-register session if it doesn't exist
|
|
240
|
+
// This handles the timing issue where statusLine/preCompact fires before SessionStart
|
|
241
|
+
if (!session) {
|
|
242
|
+
// Check if this session was recently ended - don't auto-register
|
|
243
|
+
if (this.cleanupService.wasRecentlyEnded(event.session_id)) {
|
|
244
|
+
this.log(`[Registry] Ignoring context_update for recently ended session: ${event.session_id}`);
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
// Determine source from event, default to claude_code for backward compatibility
|
|
248
|
+
const source = event.source || 'claude_code';
|
|
249
|
+
this.log(`[Registry] Auto-registering session from context_update: ${event.session_id} [${source}]`);
|
|
250
|
+
session = createFromContextUpdate(event);
|
|
251
|
+
// Check if this session was launched with --dangerously-skip-permissions
|
|
252
|
+
if (this.processMonitor.consumePendingBypass(session.cwd)) {
|
|
253
|
+
session.is_bypass = true;
|
|
254
|
+
this.log(`[Registry] Auto-registered session marked as bypass: ${event.session_id}`);
|
|
255
|
+
}
|
|
256
|
+
this.sessions.set(event.session_id, session);
|
|
257
|
+
isNewSession = true;
|
|
258
|
+
}
|
|
259
|
+
// Update source if provided and not already set (or was auto-detected)
|
|
260
|
+
if (event.source && (!session.source || session.source === 'claude_code')) {
|
|
261
|
+
session.source = event.source;
|
|
262
|
+
}
|
|
263
|
+
session.last_activity = event.timestamp;
|
|
264
|
+
// context_update implies Claude is actively processing (statusLine fires during generation)
|
|
265
|
+
// Transition active → working so discovered sessions don't stay stuck on "Starting..."
|
|
266
|
+
if (session.status === 'active') {
|
|
267
|
+
session.status = 'working';
|
|
268
|
+
this.log(`[Registry] Session status: active → working (from context_update)`);
|
|
269
|
+
}
|
|
270
|
+
// Update context metrics
|
|
271
|
+
const metrics = {
|
|
272
|
+
used_percentage: event.used_percentage ?? 0,
|
|
273
|
+
remaining_percentage: event.remaining_percentage ?? 100,
|
|
274
|
+
context_window_size: event.context_window_size ?? 0,
|
|
275
|
+
total_input_tokens: event.total_input_tokens ?? 0,
|
|
276
|
+
total_output_tokens: event.total_output_tokens ?? 0,
|
|
277
|
+
is_estimate: event.is_estimate ?? false,
|
|
278
|
+
};
|
|
279
|
+
session.context_metrics = metrics;
|
|
280
|
+
// Debug: log context update details (show ~ for estimates)
|
|
281
|
+
const estimateMarker = metrics.is_estimate ? '~' : '';
|
|
282
|
+
this.log(`[Registry] Context updated for ${event.session_id}: ${estimateMarker}${metrics.used_percentage.toFixed(1)}% used, model: ${event.model || 'unchanged'}`);
|
|
283
|
+
// Update autocompact status if provided
|
|
284
|
+
if (event.autocompact) {
|
|
285
|
+
session.autocompact = event.autocompact;
|
|
286
|
+
}
|
|
287
|
+
// Update model if provided
|
|
288
|
+
if (event.model) {
|
|
289
|
+
session.model = {
|
|
290
|
+
id: event.model,
|
|
291
|
+
display_name: event.model_display_name || event.model,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
// Update workspace info - prefer project_dir for project name
|
|
295
|
+
if (event.project_dir) {
|
|
296
|
+
session.workspace = {
|
|
297
|
+
current_dir: event.cwd || session.cwd,
|
|
298
|
+
project_dir: event.project_dir,
|
|
299
|
+
};
|
|
300
|
+
// Use project_dir for project name (more accurate than cwd)
|
|
301
|
+
const projectName = event.project_dir.split('/').filter(Boolean).pop();
|
|
302
|
+
if (projectName) {
|
|
303
|
+
session.project = projectName;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
else if (event.cwd) {
|
|
307
|
+
session.cwd = event.cwd;
|
|
308
|
+
// Only use cwd for project name if we don't have project_dir
|
|
309
|
+
if (!session.workspace?.project_dir) {
|
|
310
|
+
session.project = event.cwd.split('/').filter(Boolean).pop() || event.cwd;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Focus is driven by terminal focus watcher, not by events
|
|
314
|
+
// Update terminal_key if provided (from statusLine hook)
|
|
315
|
+
// Allow upgrading AUTO: (hook-registered) and DISCOVERED: (process-scanner) keys
|
|
316
|
+
const canUpgradeKey = session.terminal_key.startsWith('AUTO:') || session.terminal_key.startsWith('DISCOVERED:');
|
|
317
|
+
if (event.terminal_key && event.terminal_key !== '' && canUpgradeKey) {
|
|
318
|
+
this.log(`[Registry] Updating terminal_key from context_update: ${session.terminal_key} -> ${event.terminal_key}`);
|
|
319
|
+
// Clean up any existing sessions with the same terminal_key (same logic as registerSession)
|
|
320
|
+
for (const [id, existingSession] of this.sessions) {
|
|
321
|
+
if (id !== event.session_id && existingSession.terminal_key === event.terminal_key) {
|
|
322
|
+
this.log(`[Registry] Removing stale session ${id} (same terminal_key as updated session ${event.session_id})`);
|
|
323
|
+
this.unregisterSession(id);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
session.terminal_key = event.terminal_key;
|
|
327
|
+
}
|
|
328
|
+
// Update session_title if provided and different (from statusLine hook reading transcript)
|
|
329
|
+
// Filter internal command titles to prevent flickering with "Active Session"
|
|
330
|
+
if (event.session_title && event.session_title.trim() !== '' && event.session_title !== session.session_title
|
|
331
|
+
&& !event.session_title.trim().startsWith('<local-command') && !event.session_title.trim().startsWith('<command-')) {
|
|
332
|
+
const oldTitle = session.session_title;
|
|
333
|
+
session.session_title = event.session_title.trim();
|
|
334
|
+
this.log(`[Registry] Session title updated: "${oldTitle}" -> "${session.session_title}"`);
|
|
335
|
+
}
|
|
336
|
+
// Update transcript_path if provided and not already set (from statusLine hook)
|
|
337
|
+
if (event.transcript_path && !session.transcript_path) {
|
|
338
|
+
session.transcript_path = event.transcript_path;
|
|
339
|
+
this.log(`[Registry] Transcript path set: ${session.transcript_path}`);
|
|
340
|
+
}
|
|
341
|
+
// Update git branch if provided AND non-empty (from statusLine hook)
|
|
342
|
+
if (event.git_branch !== undefined && event.git_branch) {
|
|
343
|
+
if (event.git_branch !== session.git_branch) {
|
|
344
|
+
this.log(`[Registry] Git branch updated: "${session.git_branch}" -> "${event.git_branch}"`);
|
|
345
|
+
}
|
|
346
|
+
session.git_branch = event.git_branch;
|
|
347
|
+
}
|
|
348
|
+
if (event.git_worktree !== undefined && event.git_worktree) {
|
|
349
|
+
session.git_worktree = event.git_worktree;
|
|
350
|
+
}
|
|
351
|
+
// Update git_repo_root if provided AND non-empty (from statusLine hook)
|
|
352
|
+
if (event.git_repo_root !== undefined && event.git_repo_root) {
|
|
353
|
+
if (event.git_repo_root !== session.git_repo_root) {
|
|
354
|
+
this.log(`[Registry] Git repo root updated: "${session.git_repo_root}" -> "${event.git_repo_root}"`);
|
|
355
|
+
}
|
|
356
|
+
session.git_repo_root = event.git_repo_root;
|
|
357
|
+
}
|
|
358
|
+
// Store terminal_pid for bypass detection (statusLine sends PID)
|
|
359
|
+
if (event.terminal_pid) {
|
|
360
|
+
this.processMonitor.storeTerminalPid(session, event.terminal_pid);
|
|
361
|
+
}
|
|
362
|
+
if (isNewSession) {
|
|
363
|
+
// Auto-focus newly registered sessions (same as registerSession)
|
|
364
|
+
this.focusedSessionId = event.session_id;
|
|
365
|
+
this.log(`[Registry] Session auto-registered: ${event.session_id} - Project: "${session.project}"`);
|
|
366
|
+
}
|
|
367
|
+
return session;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Update session mode by detecting from JSONL transcript.
|
|
371
|
+
*/
|
|
372
|
+
async updateSessionMode(sessionId) {
|
|
373
|
+
const session = this.sessions.get(sessionId);
|
|
374
|
+
if (!session) {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
if (!session.transcript_path) {
|
|
378
|
+
return session;
|
|
379
|
+
}
|
|
380
|
+
try {
|
|
381
|
+
const newMode = await this.detectSessionMode(session.transcript_path);
|
|
382
|
+
if (newMode && newMode !== session.mode) {
|
|
383
|
+
const oldMode = session.mode;
|
|
384
|
+
session.mode = newMode;
|
|
385
|
+
if (newMode) {
|
|
386
|
+
this.log(`[Registry] Session mode changed: ${sessionId} - ${oldMode || 'null'} -> ${newMode}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
this.warn(`[Registry] Failed to update mode for ${sessionId}: ${err}`);
|
|
392
|
+
}
|
|
393
|
+
return session;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Mark session as idle
|
|
397
|
+
*/
|
|
398
|
+
setSessionIdle(sessionId, permissionMode, terminalPid) {
|
|
399
|
+
const session = this.sessions.get(sessionId);
|
|
400
|
+
if (!session) {
|
|
401
|
+
this.warn(`[Registry] Idle event for unknown session: ${sessionId}`);
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
if (terminalPid) {
|
|
405
|
+
this.processMonitor.storeTerminalPid(session, terminalPid);
|
|
406
|
+
}
|
|
407
|
+
this.cancelAwaitingTimer(sessionId);
|
|
408
|
+
session.status = 'idle';
|
|
409
|
+
this.updateModeFromPermission(session, permissionMode);
|
|
410
|
+
this.log(`[Registry] Session idle: ${sessionId}`);
|
|
411
|
+
return session;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Start debounced awaiting status for a session.
|
|
415
|
+
*/
|
|
416
|
+
setSessionAwaiting(sessionId, toolName, permissionMode, onTimeout, terminalPid) {
|
|
417
|
+
const session = this.sessions.get(sessionId);
|
|
418
|
+
if (!session) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
if (terminalPid) {
|
|
422
|
+
this.processMonitor.storeTerminalPid(session, terminalPid);
|
|
423
|
+
}
|
|
424
|
+
this.updateModeFromPermission(session, permissionMode);
|
|
425
|
+
this.cancelAwaitingTimer(sessionId);
|
|
426
|
+
const timer = setTimeout(() => {
|
|
427
|
+
this.awaitingTimers.delete(sessionId);
|
|
428
|
+
const currentSession = this.sessions.get(sessionId);
|
|
429
|
+
if (currentSession && (currentSession.status === 'working' || currentSession.status === 'active')) {
|
|
430
|
+
currentSession.status = 'awaiting';
|
|
431
|
+
currentSession.last_tool_name = toolName;
|
|
432
|
+
this.log(`[Registry] Session awaiting approval: ${sessionId} (${toolName})`);
|
|
433
|
+
onTimeout(currentSession);
|
|
434
|
+
}
|
|
435
|
+
}, 1000);
|
|
436
|
+
this.awaitingTimers.set(sessionId, timer);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Cancel a pending awaiting timer for a session
|
|
440
|
+
*/
|
|
441
|
+
cancelAwaitingTimer(sessionId) {
|
|
442
|
+
const timer = this.awaitingTimers.get(sessionId);
|
|
443
|
+
if (timer) {
|
|
444
|
+
clearTimeout(timer);
|
|
445
|
+
this.awaitingTimers.delete(sessionId);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Update session mode from permission_mode hook field.
|
|
450
|
+
*/
|
|
451
|
+
updateModeFromPermission(session, permissionMode) {
|
|
452
|
+
if (!permissionMode)
|
|
453
|
+
return;
|
|
454
|
+
const validModes = ['default', 'plan', 'acceptEdits', 'dontAsk', 'bypassPermissions'];
|
|
455
|
+
if (!validModes.includes(permissionMode))
|
|
456
|
+
return;
|
|
457
|
+
if (permissionMode === 'bypassPermissions') {
|
|
458
|
+
if (!session.is_bypass) {
|
|
459
|
+
session.is_bypass = true;
|
|
460
|
+
this.log(`[Registry] Session marked as bypass from permission_mode: ${session.session_id}`);
|
|
461
|
+
}
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (session.is_bypass && permissionMode !== 'plan')
|
|
465
|
+
return;
|
|
466
|
+
const newMode = permissionMode === 'plan' ? 'plan'
|
|
467
|
+
: permissionMode === 'acceptEdits' ? 'acceptEdits'
|
|
468
|
+
: 'default';
|
|
469
|
+
if (newMode !== session.mode) {
|
|
470
|
+
const oldMode = session.mode;
|
|
471
|
+
session.mode = newMode;
|
|
472
|
+
this.log(`[Registry] Session mode changed: ${session.session_id} - ${oldMode || 'null'} -> ${newMode} (from permission_mode: ${permissionMode})`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Mark a CWD as expecting a bypass session.
|
|
477
|
+
* Delegates to ProcessMonitor.
|
|
478
|
+
*/
|
|
479
|
+
markPendingBypass(cwd) {
|
|
480
|
+
this.processMonitor.markPendingBypass(cwd);
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Unregister a session
|
|
484
|
+
*/
|
|
485
|
+
unregisterSession(sessionId) {
|
|
486
|
+
const session = this.sessions.get(sessionId);
|
|
487
|
+
if (!session) {
|
|
488
|
+
this.warn(`[Registry] Unregister for unknown session: ${sessionId}`);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
this.cancelAwaitingTimer(sessionId);
|
|
492
|
+
// Track this session as recently ended to prevent re-registration
|
|
493
|
+
this.cleanupService.markRecentlyEnded(sessionId);
|
|
494
|
+
// Call the removal callback before deleting (for catalog extraction, etc.)
|
|
495
|
+
if (this.onSessionRemovedCallback) {
|
|
496
|
+
try {
|
|
497
|
+
this.onSessionRemovedCallback(session);
|
|
498
|
+
}
|
|
499
|
+
catch (err) {
|
|
500
|
+
this.warn(`[Registry] onSessionRemoved callback error: ${err}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
this.sessions.delete(sessionId);
|
|
504
|
+
this.log(`[Registry] Session removed: ${sessionId}`);
|
|
505
|
+
// Clear focus if this was the focused session
|
|
506
|
+
if (this.focusedSessionId === sessionId) {
|
|
507
|
+
const remaining = Array.from(this.sessions.values())
|
|
508
|
+
.sort((a, b) => b.last_activity - a.last_activity);
|
|
509
|
+
this.focusedSessionId = remaining[0]?.session_id || null;
|
|
510
|
+
if (this.focusedSessionId) {
|
|
511
|
+
this.log(`[Registry] Focus shifted to: ${this.focusedSessionId}`);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Get a session by ID
|
|
517
|
+
*/
|
|
518
|
+
getSession(sessionId) {
|
|
519
|
+
return this.sessions.get(sessionId);
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Get all sessions sorted by last activity (most recent first)
|
|
523
|
+
*/
|
|
524
|
+
getAllSessions() {
|
|
525
|
+
return Array.from(this.sessions.values())
|
|
526
|
+
.sort((a, b) => b.last_activity - a.last_activity);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Get the focused session ID
|
|
530
|
+
*/
|
|
531
|
+
getFocusedSessionId() {
|
|
532
|
+
return this.focusedSessionId;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Get the focused session
|
|
536
|
+
*/
|
|
537
|
+
getFocusedSession() {
|
|
538
|
+
if (!this.focusedSessionId)
|
|
539
|
+
return null;
|
|
540
|
+
return this.sessions.get(this.focusedSessionId) || null;
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Manually set the focused session
|
|
544
|
+
*/
|
|
545
|
+
setFocusedSession(sessionId) {
|
|
546
|
+
if (!this.sessions.has(sessionId)) {
|
|
547
|
+
this.warn(`[Registry] Cannot focus unknown session: ${sessionId}`);
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
this.focusedSessionId = sessionId;
|
|
551
|
+
this.log(`[Registry] Focus set to: ${sessionId}`);
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Get the number of active sessions
|
|
556
|
+
*/
|
|
557
|
+
getSessionCount() {
|
|
558
|
+
return this.sessions.size;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Check if a session exists
|
|
562
|
+
*/
|
|
563
|
+
hasSession(sessionId) {
|
|
564
|
+
return this.sessions.has(sessionId);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Find a session by terminal key
|
|
568
|
+
*/
|
|
569
|
+
findSessionByTerminalKey(terminalKey) {
|
|
570
|
+
for (const session of this.sessions.values()) {
|
|
571
|
+
if (session.terminal_key && matchTerminalKeys(session.terminal_key, terminalKey)) {
|
|
572
|
+
return session;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Clear all sessions (for testing or reset)
|
|
579
|
+
*/
|
|
580
|
+
clear() {
|
|
581
|
+
for (const timer of this.awaitingTimers.values()) {
|
|
582
|
+
clearTimeout(timer);
|
|
583
|
+
}
|
|
584
|
+
this.awaitingTimers.clear();
|
|
585
|
+
this.sessions.clear();
|
|
586
|
+
this.cleanupService.clear();
|
|
587
|
+
this.focusedSessionId = null;
|
|
588
|
+
this.log('[Registry] All sessions cleared');
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Start periodic cleanup of stale sessions.
|
|
592
|
+
* Delegates to CleanupService.
|
|
593
|
+
*/
|
|
594
|
+
startCleanup(maxIdleMinutes = 60) {
|
|
595
|
+
this.cleanupService.startCleanup(maxIdleMinutes);
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Stop periodic cleanup of stale sessions.
|
|
599
|
+
*/
|
|
600
|
+
stopCleanup() {
|
|
601
|
+
this.cleanupService.stopCleanup();
|
|
602
|
+
this.processMonitor.stopProcessVerification();
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Verify sessions are still valid.
|
|
606
|
+
* Delegates to ProcessMonitor.
|
|
607
|
+
*/
|
|
608
|
+
async verifyProcesses() {
|
|
609
|
+
return this.processMonitor.verifyProcesses();
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Detect bypass sessions by checking process command lines.
|
|
613
|
+
* Delegates to ProcessMonitor.
|
|
614
|
+
*/
|
|
615
|
+
async detectBypassSessions() {
|
|
616
|
+
return this.processMonitor.detectBypassSessions();
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Start periodic process verification.
|
|
620
|
+
* Delegates to ProcessMonitor.
|
|
621
|
+
*/
|
|
622
|
+
startProcessVerification(intervalMs) {
|
|
623
|
+
this.processMonitor.startProcessVerification(intervalMs);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.test.d.ts","sourceRoot":"","sources":["../src/session-registry.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|