@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
package/dist/server.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jacques Server
|
|
3
|
+
*
|
|
4
|
+
* Standalone entry point for the Jacques server.
|
|
5
|
+
* Uses the embeddable server module for the actual implementation.
|
|
6
|
+
*/
|
|
7
|
+
import { startEmbeddedServer } from './start-server.js';
|
|
8
|
+
import { writeFileSync, unlinkSync, existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { createServer, connect } from 'net';
|
|
12
|
+
const PID_FILE = join(homedir(), '.jacques', 'server.pid');
|
|
13
|
+
const SOCKET_PATH = '/tmp/jacques.sock';
|
|
14
|
+
const WS_PORT = parseInt(process.env.JACQUES_WS_PORT || '4242', 10);
|
|
15
|
+
const HTTP_PORT = parseInt(process.env.JACQUES_HTTP_PORT || '4243', 10);
|
|
16
|
+
let server = null;
|
|
17
|
+
/**
|
|
18
|
+
* Write PID file for process management
|
|
19
|
+
*/
|
|
20
|
+
function writePidFile() {
|
|
21
|
+
try {
|
|
22
|
+
const dir = join(homedir(), '.jacques');
|
|
23
|
+
if (!existsSync(dir)) {
|
|
24
|
+
const { mkdirSync } = require('fs');
|
|
25
|
+
mkdirSync(dir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
writeFileSync(PID_FILE, String(process.pid));
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
console.error(`[Server] Warning: Could not write PID file: ${err}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Remove PID file on shutdown
|
|
35
|
+
*/
|
|
36
|
+
function removePidFile() {
|
|
37
|
+
try {
|
|
38
|
+
if (existsSync(PID_FILE)) {
|
|
39
|
+
unlinkSync(PID_FILE);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Ignore errors when removing PID file
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if a Unix socket has an active listener
|
|
48
|
+
*/
|
|
49
|
+
function isSocketAlive(path) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const client = connect({ path }, () => {
|
|
52
|
+
client.end();
|
|
53
|
+
resolve(true);
|
|
54
|
+
});
|
|
55
|
+
client.on('error', () => resolve(false));
|
|
56
|
+
const timeout = setTimeout(() => { client.destroy(); resolve(false); }, 1000);
|
|
57
|
+
client.on('close', () => clearTimeout(timeout));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a TCP port is available
|
|
62
|
+
*/
|
|
63
|
+
function isPortFree(port) {
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
const srv = createServer();
|
|
66
|
+
srv.once('error', () => resolve(false));
|
|
67
|
+
srv.once('listening', () => {
|
|
68
|
+
srv.close(() => resolve(true));
|
|
69
|
+
});
|
|
70
|
+
srv.listen(port);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Pre-flight: ensure no other Jacques server is running
|
|
75
|
+
*/
|
|
76
|
+
async function ensureServerNotRunning() {
|
|
77
|
+
// 1. Check PID file
|
|
78
|
+
if (existsSync(PID_FILE)) {
|
|
79
|
+
try {
|
|
80
|
+
const pid = parseInt(readFileSync(PID_FILE, 'utf-8').trim(), 10);
|
|
81
|
+
if (!isNaN(pid)) {
|
|
82
|
+
try {
|
|
83
|
+
process.kill(pid, 0); // Throws if process doesn't exist
|
|
84
|
+
console.error(`[Server] Jacques server already running (PID: ${pid}).`);
|
|
85
|
+
console.error(`[Server] Stop it first: npm run stop:server`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Process doesn't exist — stale PID file
|
|
90
|
+
unlinkSync(PID_FILE);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Can't read PID file — remove it
|
|
96
|
+
try {
|
|
97
|
+
unlinkSync(PID_FILE);
|
|
98
|
+
}
|
|
99
|
+
catch { /* ignore */ }
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// 2. Check if socket is actively listened on
|
|
103
|
+
if (existsSync(SOCKET_PATH)) {
|
|
104
|
+
if (await isSocketAlive(SOCKET_PATH)) {
|
|
105
|
+
console.error(`[Server] Another server is listening on ${SOCKET_PATH}.`);
|
|
106
|
+
console.error(`[Server] Stop it first: npm run stop:server`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
// Stale socket — will be cleaned up by UnixSocketServer.start()
|
|
110
|
+
}
|
|
111
|
+
// 3. Check port availability
|
|
112
|
+
for (const port of [WS_PORT, HTTP_PORT]) {
|
|
113
|
+
if (!(await isPortFree(port))) {
|
|
114
|
+
console.error(`[Server] Port ${port} is already in use.`);
|
|
115
|
+
console.error(`[Server] Stop the existing server: npm run stop:server`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Start the server
|
|
122
|
+
*/
|
|
123
|
+
async function start() {
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('╔═══════════════════════════════════════════════════════╗');
|
|
126
|
+
console.log('║ JACQUES - Claude Code Context Monitor ║');
|
|
127
|
+
console.log('╚═══════════════════════════════════════════════════════╝');
|
|
128
|
+
console.log('');
|
|
129
|
+
// Pre-flight: ensure no other server is running
|
|
130
|
+
await ensureServerNotRunning();
|
|
131
|
+
try {
|
|
132
|
+
// Write PID file for process management
|
|
133
|
+
writePidFile();
|
|
134
|
+
console.log(`[Server] PID: ${process.pid} (written to ${PID_FILE})`);
|
|
135
|
+
server = await startEmbeddedServer({ silent: false });
|
|
136
|
+
console.log('[Server] Waiting for Claude Code sessions...');
|
|
137
|
+
console.log('[Server] Press Ctrl+C to stop');
|
|
138
|
+
console.log('');
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
console.error(`[Server] Failed to start: ${err}`);
|
|
142
|
+
removePidFile();
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Graceful shutdown
|
|
148
|
+
*/
|
|
149
|
+
async function shutdown() {
|
|
150
|
+
console.log('');
|
|
151
|
+
if (server) {
|
|
152
|
+
await server.stop();
|
|
153
|
+
}
|
|
154
|
+
// Clean up PID file
|
|
155
|
+
removePidFile();
|
|
156
|
+
process.exit(0);
|
|
157
|
+
}
|
|
158
|
+
// Register shutdown handlers
|
|
159
|
+
process.on('SIGINT', shutdown);
|
|
160
|
+
process.on('SIGTERM', shutdown);
|
|
161
|
+
// Handle uncaught errors
|
|
162
|
+
process.on('uncaughtException', (err) => {
|
|
163
|
+
console.error(`[Server] Uncaught exception: ${err.message}`);
|
|
164
|
+
console.error(err.stack);
|
|
165
|
+
shutdown();
|
|
166
|
+
});
|
|
167
|
+
process.on('unhandledRejection', (reason) => {
|
|
168
|
+
console.error(`[Server] Unhandled rejection: ${reason}`);
|
|
169
|
+
shutdown();
|
|
170
|
+
});
|
|
171
|
+
// Start the server
|
|
172
|
+
start();
|
|
173
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACpE,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAExE,IAAI,MAAM,GAA2D,IAAI,CAAC;AAE1E;;GAEG;AACH,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YACzB,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB;IACnC,oBAAoB;IACpB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,kCAAkC;oBACxD,OAAO,CAAC,KAAK,CAAC,iDAAiD,GAAG,IAAI,CAAC,CAAC;oBACxE,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;oBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,yCAAyC;oBACzC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;YAClC,IAAI,CAAC;gBAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,MAAM,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,2CAA2C,WAAW,GAAG,CAAC,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,gEAAgE;IAClE,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,KAAK;IAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,gDAAgD;IAChD,MAAM,sBAAsB,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,wCAAwC;QACxC,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,GAAG,gBAAgB,QAAQ,GAAG,CAAC,CAAC;QAErE,MAAM,GAAG,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QAClD,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,oBAAoB;IACpB,aAAa,EAAE,CAAC;IAEhB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,6BAA6B;AAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;IACzD,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch Divergence Service
|
|
3
|
+
*
|
|
4
|
+
* Periodically computes ahead/behind counts and dirty status for all active sessions.
|
|
5
|
+
* Groups by (repoRoot, branch) to avoid duplicate git calls for sessions on the same branch.
|
|
6
|
+
*/
|
|
7
|
+
import type { Session } from '../types.js';
|
|
8
|
+
import type { Logger } from '../logging/logger-factory.js';
|
|
9
|
+
export interface BranchDivergenceServiceOptions {
|
|
10
|
+
getAllSessions: () => Session[];
|
|
11
|
+
broadcastSessionUpdate: (session: Session) => void;
|
|
12
|
+
logger?: Logger;
|
|
13
|
+
}
|
|
14
|
+
export declare class BranchDivergenceService {
|
|
15
|
+
private interval;
|
|
16
|
+
private debounceTimer;
|
|
17
|
+
private checking;
|
|
18
|
+
private getAllSessions;
|
|
19
|
+
private broadcastSessionUpdate;
|
|
20
|
+
private logger;
|
|
21
|
+
private static readonly DEBOUNCE_MS;
|
|
22
|
+
/** Cache of default branch per repo root (cleared each cycle) */
|
|
23
|
+
private defaultBranchCache;
|
|
24
|
+
constructor(options: BranchDivergenceServiceOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Start periodic divergence checking.
|
|
27
|
+
*/
|
|
28
|
+
start(intervalMs?: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Stop periodic checking.
|
|
31
|
+
*/
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Schedule a debounced divergence check.
|
|
35
|
+
* Multiple calls within DEBOUNCE_MS coalesce into one check.
|
|
36
|
+
*/
|
|
37
|
+
scheduleCheck(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Run a single divergence check across all active sessions.
|
|
40
|
+
*/
|
|
41
|
+
private check;
|
|
42
|
+
private runCheck;
|
|
43
|
+
/**
|
|
44
|
+
* Get default branch for a repo, with per-cycle caching.
|
|
45
|
+
*/
|
|
46
|
+
private getDefaultBranch;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=branch-divergence-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-divergence-service.d.ts","sourceRoot":"","sources":["../../src/services/branch-divergence-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAM3D,MAAM,WAAW,8BAA8B;IAC7C,cAAc,EAAE,MAAM,OAAO,EAAE,CAAC;IAChC,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAQ;IAE3C,iEAAiE;IACjE,OAAO,CAAC,kBAAkB,CAA6B;gBAE3C,OAAO,EAAE,8BAA8B;IAMnD;;OAEG;IACH,KAAK,CAAC,UAAU,GAAE,MAAsC,GAAG,IAAI;IAkB/D;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;;OAGG;IACH,aAAa,IAAI,IAAI;IAYrB;;OAEG;YACW,KAAK;YAUL,QAAQ;IAoEtB;;OAEG;YACW,gBAAgB;CAQ/B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch Divergence Service
|
|
3
|
+
*
|
|
4
|
+
* Periodically computes ahead/behind counts and dirty status for all active sessions.
|
|
5
|
+
* Groups by (repoRoot, branch) to avoid duplicate git calls for sessions on the same branch.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../logging/logger-factory.js';
|
|
8
|
+
import { computeBranchDivergence, checkDirtyStatus } from '@jacques-ai/core';
|
|
9
|
+
import { detectDefaultBranch } from '../connection/worktree.js';
|
|
10
|
+
import { BRANCH_DIVERGENCE_INTERVAL_MS } from '../connection/constants.js';
|
|
11
|
+
export class BranchDivergenceService {
|
|
12
|
+
interval = null;
|
|
13
|
+
debounceTimer = null;
|
|
14
|
+
checking = false;
|
|
15
|
+
getAllSessions;
|
|
16
|
+
broadcastSessionUpdate;
|
|
17
|
+
logger;
|
|
18
|
+
static DEBOUNCE_MS = 3000;
|
|
19
|
+
/** Cache of default branch per repo root (cleared each cycle) */
|
|
20
|
+
defaultBranchCache = new Map();
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.getAllSessions = options.getAllSessions;
|
|
23
|
+
this.broadcastSessionUpdate = options.broadcastSessionUpdate;
|
|
24
|
+
this.logger = options.logger ?? createLogger({ silent: true });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Start periodic divergence checking.
|
|
28
|
+
*/
|
|
29
|
+
start(intervalMs = BRANCH_DIVERGENCE_INTERVAL_MS) {
|
|
30
|
+
if (this.interval)
|
|
31
|
+
return;
|
|
32
|
+
// Run immediately
|
|
33
|
+
this.check().catch((err) => {
|
|
34
|
+
this.logger.warn(`[Divergence] Check failed: ${err}`);
|
|
35
|
+
});
|
|
36
|
+
// Then periodically
|
|
37
|
+
this.interval = setInterval(() => {
|
|
38
|
+
this.check().catch((err) => {
|
|
39
|
+
this.logger.warn(`[Divergence] Check failed: ${err}`);
|
|
40
|
+
});
|
|
41
|
+
}, intervalMs);
|
|
42
|
+
this.logger.log(`[Divergence] Started (interval: ${intervalMs / 1000}s)`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stop periodic checking.
|
|
46
|
+
*/
|
|
47
|
+
stop() {
|
|
48
|
+
if (this.interval) {
|
|
49
|
+
clearInterval(this.interval);
|
|
50
|
+
this.interval = null;
|
|
51
|
+
}
|
|
52
|
+
if (this.debounceTimer) {
|
|
53
|
+
clearTimeout(this.debounceTimer);
|
|
54
|
+
this.debounceTimer = null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Schedule a debounced divergence check.
|
|
59
|
+
* Multiple calls within DEBOUNCE_MS coalesce into one check.
|
|
60
|
+
*/
|
|
61
|
+
scheduleCheck() {
|
|
62
|
+
if (this.debounceTimer) {
|
|
63
|
+
clearTimeout(this.debounceTimer);
|
|
64
|
+
}
|
|
65
|
+
this.debounceTimer = setTimeout(() => {
|
|
66
|
+
this.debounceTimer = null;
|
|
67
|
+
this.check().catch((err) => {
|
|
68
|
+
this.logger.warn(`[Divergence] Scheduled check failed: ${err}`);
|
|
69
|
+
});
|
|
70
|
+
}, BranchDivergenceService.DEBOUNCE_MS);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Run a single divergence check across all active sessions.
|
|
74
|
+
*/
|
|
75
|
+
async check() {
|
|
76
|
+
if (this.checking)
|
|
77
|
+
return;
|
|
78
|
+
this.checking = true;
|
|
79
|
+
try {
|
|
80
|
+
await this.runCheck();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
this.checking = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async runCheck() {
|
|
87
|
+
const sessions = this.getAllSessions();
|
|
88
|
+
if (sessions.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
// Clear default branch cache each cycle
|
|
91
|
+
this.defaultBranchCache.clear();
|
|
92
|
+
// Group sessions by (repoRoot, branch) for divergence
|
|
93
|
+
const divergenceGroups = new Map();
|
|
94
|
+
// Group sessions by cwd for dirty status
|
|
95
|
+
const dirtyGroups = new Map();
|
|
96
|
+
for (const session of sessions) {
|
|
97
|
+
if (session.git_repo_root && session.git_branch) {
|
|
98
|
+
const key = `${session.git_repo_root}\0${session.git_branch}`;
|
|
99
|
+
const group = divergenceGroups.get(key) || [];
|
|
100
|
+
group.push(session);
|
|
101
|
+
divergenceGroups.set(key, group);
|
|
102
|
+
}
|
|
103
|
+
if (session.cwd) {
|
|
104
|
+
const group = dirtyGroups.get(session.cwd) || [];
|
|
105
|
+
group.push(session);
|
|
106
|
+
dirtyGroups.set(session.cwd, group);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Compute divergence per unique (repoRoot, branch)
|
|
110
|
+
for (const [key, groupSessions] of divergenceGroups) {
|
|
111
|
+
const [repoRoot, branch] = key.split('\0');
|
|
112
|
+
const defaultBranch = await this.getDefaultBranch(repoRoot);
|
|
113
|
+
// Skip if this IS the default branch
|
|
114
|
+
if (branch === defaultBranch) {
|
|
115
|
+
for (const session of groupSessions) {
|
|
116
|
+
if (session.git_ahead !== 0 || session.git_behind !== 0) {
|
|
117
|
+
session.git_ahead = 0;
|
|
118
|
+
session.git_behind = 0;
|
|
119
|
+
this.broadcastSessionUpdate(session);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const { ahead, behind } = await computeBranchDivergence(repoRoot, branch, defaultBranch);
|
|
125
|
+
for (const session of groupSessions) {
|
|
126
|
+
if (session.git_ahead !== ahead || session.git_behind !== behind) {
|
|
127
|
+
session.git_ahead = ahead;
|
|
128
|
+
session.git_behind = behind;
|
|
129
|
+
this.broadcastSessionUpdate(session);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Compute dirty status per unique cwd
|
|
134
|
+
for (const [cwd, groupSessions] of dirtyGroups) {
|
|
135
|
+
const dirty = await checkDirtyStatus(cwd);
|
|
136
|
+
for (const session of groupSessions) {
|
|
137
|
+
if (session.git_dirty !== dirty) {
|
|
138
|
+
session.git_dirty = dirty;
|
|
139
|
+
this.broadcastSessionUpdate(session);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get default branch for a repo, with per-cycle caching.
|
|
146
|
+
*/
|
|
147
|
+
async getDefaultBranch(repoRoot) {
|
|
148
|
+
const cached = this.defaultBranchCache.get(repoRoot);
|
|
149
|
+
if (cached)
|
|
150
|
+
return cached;
|
|
151
|
+
const branch = await detectDefaultBranch(repoRoot);
|
|
152
|
+
this.defaultBranchCache.set(repoRoot, branch);
|
|
153
|
+
return branch;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=branch-divergence-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-divergence-service.js","sourceRoot":"","sources":["../../src/services/branch-divergence-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast Service
|
|
3
|
+
*
|
|
4
|
+
* Unified broadcasting service that combines session updates
|
|
5
|
+
* with focus change notifications. Eliminates repeated broadcast
|
|
6
|
+
* patterns in event handlers.
|
|
7
|
+
*/
|
|
8
|
+
import type { Session } from '../types.js';
|
|
9
|
+
import type { JacquesWebSocketServer } from '../websocket.js';
|
|
10
|
+
import type { SessionRegistry } from '../session-registry.js';
|
|
11
|
+
import type { Logger } from '../logging/logger-factory.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for the BroadcastService
|
|
14
|
+
*/
|
|
15
|
+
export interface BroadcastServiceConfig {
|
|
16
|
+
/** WebSocket server for broadcasting */
|
|
17
|
+
wsServer: JacquesWebSocketServer;
|
|
18
|
+
/** Session registry for focus information */
|
|
19
|
+
registry: SessionRegistry;
|
|
20
|
+
/** Optional logger */
|
|
21
|
+
logger?: Logger;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* BroadcastService - handles unified session and focus broadcasting
|
|
25
|
+
*
|
|
26
|
+
* Instead of calling:
|
|
27
|
+
* wsServer.broadcastSessionUpdate(session);
|
|
28
|
+
* broadcastFocusChange();
|
|
29
|
+
*
|
|
30
|
+
* Use:
|
|
31
|
+
* broadcastService.broadcastSessionWithFocus(session);
|
|
32
|
+
*/
|
|
33
|
+
export declare class BroadcastService {
|
|
34
|
+
private wsServer;
|
|
35
|
+
private registry;
|
|
36
|
+
private logger;
|
|
37
|
+
private lastBroadcastedFocusId;
|
|
38
|
+
constructor(config: BroadcastServiceConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Broadcast a session update along with focus change
|
|
41
|
+
*
|
|
42
|
+
* @param session The session that was updated
|
|
43
|
+
*/
|
|
44
|
+
broadcastSessionWithFocus(session: Session): void;
|
|
45
|
+
/**
|
|
46
|
+
* Broadcast session removal along with focus change
|
|
47
|
+
*
|
|
48
|
+
* @param sessionId The ID of the removed session
|
|
49
|
+
*/
|
|
50
|
+
broadcastSessionRemovedWithFocus(sessionId: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Broadcast only the session update (no focus change)
|
|
53
|
+
*
|
|
54
|
+
* Use when focus should not be affected (e.g., idle status)
|
|
55
|
+
*
|
|
56
|
+
* @param session The session that was updated
|
|
57
|
+
*/
|
|
58
|
+
broadcastSessionUpdate(session: Session): void;
|
|
59
|
+
/**
|
|
60
|
+
* Broadcast only the focus change (skips if focus hasn't changed)
|
|
61
|
+
*/
|
|
62
|
+
broadcastFocusChange(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Force broadcast focus change (used when focus must be re-sent, e.g. session removal)
|
|
65
|
+
*/
|
|
66
|
+
forceBroadcastFocusChange(): void;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=broadcast-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-service.d.ts","sourceRoot":"","sources":["../../src/services/broadcast-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,6CAA6C;IAC7C,QAAQ,EAAE,eAAe,CAAC;IAC1B,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,sBAAsB,CAAwC;gBAE1D,MAAM,EAAE,sBAAsB;IAM1C;;;;OAIG;IACH,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKjD;;;;OAIG;IACH,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzD;;;;;;OAMG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI9C;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAQ5B;;OAEG;IACH,yBAAyB,IAAI,IAAI;CAMlC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast Service
|
|
3
|
+
*
|
|
4
|
+
* Unified broadcasting service that combines session updates
|
|
5
|
+
* with focus change notifications. Eliminates repeated broadcast
|
|
6
|
+
* patterns in event handlers.
|
|
7
|
+
*/
|
|
8
|
+
import { createLogger } from '../logging/logger-factory.js';
|
|
9
|
+
/**
|
|
10
|
+
* BroadcastService - handles unified session and focus broadcasting
|
|
11
|
+
*
|
|
12
|
+
* Instead of calling:
|
|
13
|
+
* wsServer.broadcastSessionUpdate(session);
|
|
14
|
+
* broadcastFocusChange();
|
|
15
|
+
*
|
|
16
|
+
* Use:
|
|
17
|
+
* broadcastService.broadcastSessionWithFocus(session);
|
|
18
|
+
*/
|
|
19
|
+
export class BroadcastService {
|
|
20
|
+
wsServer;
|
|
21
|
+
registry;
|
|
22
|
+
logger;
|
|
23
|
+
lastBroadcastedFocusId = undefined;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.wsServer = config.wsServer;
|
|
26
|
+
this.registry = config.registry;
|
|
27
|
+
this.logger = config.logger ?? createLogger({ silent: true });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Broadcast a session update along with focus change
|
|
31
|
+
*
|
|
32
|
+
* @param session The session that was updated
|
|
33
|
+
*/
|
|
34
|
+
broadcastSessionWithFocus(session) {
|
|
35
|
+
this.wsServer.broadcastSessionUpdate(session);
|
|
36
|
+
this.broadcastFocusChange();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Broadcast session removal along with focus change
|
|
40
|
+
*
|
|
41
|
+
* @param sessionId The ID of the removed session
|
|
42
|
+
*/
|
|
43
|
+
broadcastSessionRemovedWithFocus(sessionId) {
|
|
44
|
+
this.wsServer.broadcastSessionRemoved(sessionId);
|
|
45
|
+
this.forceBroadcastFocusChange();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Broadcast only the session update (no focus change)
|
|
49
|
+
*
|
|
50
|
+
* Use when focus should not be affected (e.g., idle status)
|
|
51
|
+
*
|
|
52
|
+
* @param session The session that was updated
|
|
53
|
+
*/
|
|
54
|
+
broadcastSessionUpdate(session) {
|
|
55
|
+
this.wsServer.broadcastSessionUpdate(session);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Broadcast only the focus change (skips if focus hasn't changed)
|
|
59
|
+
*/
|
|
60
|
+
broadcastFocusChange() {
|
|
61
|
+
const focusedId = this.registry.getFocusedSessionId();
|
|
62
|
+
if (focusedId === this.lastBroadcastedFocusId)
|
|
63
|
+
return;
|
|
64
|
+
this.lastBroadcastedFocusId = focusedId;
|
|
65
|
+
const focusedSession = focusedId ? this.registry.getSession(focusedId) ?? null : null;
|
|
66
|
+
this.wsServer.broadcastFocusChange(focusedId, focusedSession);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Force broadcast focus change (used when focus must be re-sent, e.g. session removal)
|
|
70
|
+
*/
|
|
71
|
+
forceBroadcastFocusChange() {
|
|
72
|
+
const focusedId = this.registry.getFocusedSessionId();
|
|
73
|
+
this.lastBroadcastedFocusId = focusedId;
|
|
74
|
+
const focusedSession = focusedId ? this.registry.getSession(focusedId) ?? null : null;
|
|
75
|
+
this.wsServer.broadcastFocusChange(focusedId, focusedSession);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=broadcast-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-service.js","sourceRoot":"","sources":["../../src/services/broadcast-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAc5D;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAgB;IACnB,QAAQ,CAAyB;IACjC,QAAQ,CAAkB;IAC1B,MAAM,CAAS;IACf,sBAAsB,GAA8B,SAAS,CAAC;IAEtE,YAAY,MAA8B;QACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACH,yBAAyB,CAAC,OAAgB;QACxC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,gCAAgC,CAAC,SAAiB;QAChD,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,yBAAyB,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,OAAgB;QACrC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QACtD,IAAI,SAAS,KAAK,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACtD,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QACxC,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,yBAAyB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QACtD,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QACxC,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-service.test.d.ts","sourceRoot":"","sources":["../../src/services/broadcast-service.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|