@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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Calculations
|
|
3
|
+
*
|
|
4
|
+
* Functions to calculate window geometry for various tiling layouts.
|
|
5
|
+
* All calculations account for work area (excluding dock/taskbar).
|
|
6
|
+
*/
|
|
7
|
+
import type { WindowGeometry, TileLayout } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Calculate window geometry for a tile position within a layout
|
|
10
|
+
*
|
|
11
|
+
* @param workArea - The usable work area of the display
|
|
12
|
+
* @param layout - The tile layout type
|
|
13
|
+
* @param position - The position index (0-based)
|
|
14
|
+
* @param total - Total number of windows being tiled
|
|
15
|
+
*/
|
|
16
|
+
export declare function calculateTileGeometry(workArea: WindowGeometry, layout: TileLayout, position: number, total: number): WindowGeometry;
|
|
17
|
+
/**
|
|
18
|
+
* Determine the best layout for a given number of windows
|
|
19
|
+
*
|
|
20
|
+
* @param windowCount - Number of windows to tile
|
|
21
|
+
*/
|
|
22
|
+
export declare function suggestLayout(windowCount: number): TileLayout;
|
|
23
|
+
/**
|
|
24
|
+
* Get the maximum windows supported by a layout
|
|
25
|
+
*/
|
|
26
|
+
export declare function getLayoutCapacity(layout: TileLayout): number;
|
|
27
|
+
/**
|
|
28
|
+
* Validate that a layout can accommodate the given number of windows
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateLayout(layout: TileLayout, windowCount: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate geometry for browser + terminal(s) layout
|
|
33
|
+
*
|
|
34
|
+
* @param workArea - The usable work area of the display
|
|
35
|
+
* @param layout - The browser layout type
|
|
36
|
+
* @returns Geometry for browser window and terminal window(s)
|
|
37
|
+
*/
|
|
38
|
+
export declare function calculateBrowserLayout(workArea: WindowGeometry, layout: 'browser-terminal' | 'browser-two-terminals'): {
|
|
39
|
+
browser: WindowGeometry;
|
|
40
|
+
terminals: WindowGeometry[];
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=layouts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.d.ts","sourceRoot":"","sources":["../../src/window-manager/layouts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,cAAc,CAmDhB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAQ7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAa5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,kBAAkB,GAAG,uBAAuB,GACnD;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,cAAc,EAAE,CAAA;CAAE,CAwB1D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Calculations
|
|
3
|
+
*
|
|
4
|
+
* Functions to calculate window geometry for various tiling layouts.
|
|
5
|
+
* All calculations account for work area (excluding dock/taskbar).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculate window geometry for a tile position within a layout
|
|
9
|
+
*
|
|
10
|
+
* @param workArea - The usable work area of the display
|
|
11
|
+
* @param layout - The tile layout type
|
|
12
|
+
* @param position - The position index (0-based)
|
|
13
|
+
* @param total - Total number of windows being tiled
|
|
14
|
+
*/
|
|
15
|
+
export function calculateTileGeometry(workArea, layout, position, total) {
|
|
16
|
+
const { x, y, width, height } = workArea;
|
|
17
|
+
switch (layout) {
|
|
18
|
+
case 'side-by-side': {
|
|
19
|
+
// 2 windows, split horizontally
|
|
20
|
+
const halfW = Math.floor(width / 2);
|
|
21
|
+
if (position === 0) {
|
|
22
|
+
return { x, y, width: halfW, height };
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Right side gets remaining width (handles odd pixels)
|
|
26
|
+
return { x: x + halfW, y, width: width - halfW, height };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
case 'thirds': {
|
|
30
|
+
// 3 windows, equal thirds
|
|
31
|
+
const thirdW = Math.floor(width / 3);
|
|
32
|
+
if (position === 0) {
|
|
33
|
+
return { x, y, width: thirdW, height };
|
|
34
|
+
}
|
|
35
|
+
else if (position === 1) {
|
|
36
|
+
return { x: x + thirdW, y, width: thirdW, height };
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Last third gets remaining width (handles uneven division)
|
|
40
|
+
return { x: x + thirdW * 2, y, width: width - thirdW * 2, height };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
case '2x2': {
|
|
44
|
+
// 4 windows in a 2x2 grid
|
|
45
|
+
const halfW = Math.floor(width / 2);
|
|
46
|
+
const halfH = Math.floor(height / 2);
|
|
47
|
+
const row = Math.floor(position / 2); // 0 or 1
|
|
48
|
+
const col = position % 2; // 0 or 1
|
|
49
|
+
// Handle odd pixels by giving extra to right/bottom
|
|
50
|
+
const cellW = col === 1 ? width - halfW : halfW;
|
|
51
|
+
const cellH = row === 1 ? height - halfH : halfH;
|
|
52
|
+
return {
|
|
53
|
+
x: x + col * halfW,
|
|
54
|
+
y: y + row * halfH,
|
|
55
|
+
width: cellW,
|
|
56
|
+
height: cellH,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
// Fallback: just return the full work area
|
|
61
|
+
return workArea;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Determine the best layout for a given number of windows
|
|
66
|
+
*
|
|
67
|
+
* @param windowCount - Number of windows to tile
|
|
68
|
+
*/
|
|
69
|
+
export function suggestLayout(windowCount) {
|
|
70
|
+
if (windowCount <= 2) {
|
|
71
|
+
return 'side-by-side';
|
|
72
|
+
}
|
|
73
|
+
else if (windowCount === 3) {
|
|
74
|
+
return 'thirds';
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return 'smart';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the maximum windows supported by a layout
|
|
82
|
+
*/
|
|
83
|
+
export function getLayoutCapacity(layout) {
|
|
84
|
+
switch (layout) {
|
|
85
|
+
case 'side-by-side':
|
|
86
|
+
return 2;
|
|
87
|
+
case 'thirds':
|
|
88
|
+
return 3;
|
|
89
|
+
case '2x2':
|
|
90
|
+
return 4;
|
|
91
|
+
case 'smart':
|
|
92
|
+
return 8;
|
|
93
|
+
default:
|
|
94
|
+
return 2;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Validate that a layout can accommodate the given number of windows
|
|
99
|
+
*/
|
|
100
|
+
export function validateLayout(layout, windowCount) {
|
|
101
|
+
return windowCount <= getLayoutCapacity(layout);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Calculate geometry for browser + terminal(s) layout
|
|
105
|
+
*
|
|
106
|
+
* @param workArea - The usable work area of the display
|
|
107
|
+
* @param layout - The browser layout type
|
|
108
|
+
* @returns Geometry for browser window and terminal window(s)
|
|
109
|
+
*/
|
|
110
|
+
export function calculateBrowserLayout(workArea, layout) {
|
|
111
|
+
const { x, y, width, height } = workArea;
|
|
112
|
+
if (layout === 'browser-terminal') {
|
|
113
|
+
// Browser takes 5/7, terminal takes 2/7
|
|
114
|
+
const browserW = Math.floor(width * 5 / 7);
|
|
115
|
+
const terminalW = width - browserW;
|
|
116
|
+
return {
|
|
117
|
+
browser: { x, y, width: browserW, height },
|
|
118
|
+
terminals: [{ x: x + browserW, y, width: terminalW, height }],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// browser-two-terminals: browser on left (5/7), two terminals stacked on right (2/7)
|
|
122
|
+
const browserW = Math.floor(width * 5 / 7);
|
|
123
|
+
const terminalW = width - browserW;
|
|
124
|
+
const halfH = Math.floor(height / 2);
|
|
125
|
+
return {
|
|
126
|
+
browser: { x, y, width: browserW, height },
|
|
127
|
+
terminals: [
|
|
128
|
+
{ x: x + browserW, y, width: terminalW, height: halfH },
|
|
129
|
+
{ x: x + browserW, y: y + halfH, width: terminalW, height: height - halfH },
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=layouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.js","sourceRoot":"","sources":["../../src/window-manager/layouts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux Window Manager
|
|
3
|
+
*
|
|
4
|
+
* Implements window positioning and tiling using wmctrl and xrandr for X11.
|
|
5
|
+
* Note: Wayland does not support window positioning by design.
|
|
6
|
+
*/
|
|
7
|
+
import type { WindowManager, WindowGeometry, Display, TileLayout, PositionResult, TileResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Linux Window Manager using wmctrl and xrandr
|
|
10
|
+
*/
|
|
11
|
+
export declare class LinuxWindowManager implements WindowManager {
|
|
12
|
+
private wmctrlAvailable;
|
|
13
|
+
private xdotoolAvailable;
|
|
14
|
+
getPlatform(): string;
|
|
15
|
+
isSupported(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Check if wmctrl is available (lazy check)
|
|
18
|
+
*/
|
|
19
|
+
private checkWmctrl;
|
|
20
|
+
/**
|
|
21
|
+
* Check if xdotool is available (lazy check)
|
|
22
|
+
*/
|
|
23
|
+
private checkXdotool;
|
|
24
|
+
/**
|
|
25
|
+
* Get all displays using xrandr
|
|
26
|
+
*/
|
|
27
|
+
getDisplays(): Promise<Display[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Position a terminal window by its terminal key
|
|
30
|
+
*/
|
|
31
|
+
positionWindow(terminalKey: string, geometry: WindowGeometry): Promise<PositionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Position a window by X11 window ID using wmctrl
|
|
34
|
+
*/
|
|
35
|
+
private positionByWindowId;
|
|
36
|
+
/**
|
|
37
|
+
* Position a window by process ID
|
|
38
|
+
*/
|
|
39
|
+
private positionByPid;
|
|
40
|
+
/**
|
|
41
|
+
* Tile multiple terminal windows
|
|
42
|
+
*/
|
|
43
|
+
tileWindows(terminalKeys: string[], layout: TileLayout, display?: Display): Promise<TileResult>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=linux-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linux-manager.d.ts","sourceRoot":"","sources":["../../src/window-manager/linux-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AAyBpB;;GAEG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,WAAW,IAAI,MAAM;IAIrB,WAAW,IAAI,OAAO;IAKtB;;OAEG;YACW,WAAW;IAOzB;;OAEG;YACW,YAAY;IAO1B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA4EvC;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAuC5F;;OAEG;YACW,kBAAkB;IAsBhC;;OAEG;YACW,aAAa;IAuD3B;;OAEG;IACG,WAAW,CACf,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC;CAoEvB"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux Window Manager
|
|
3
|
+
*
|
|
4
|
+
* Implements window positioning and tiling using wmctrl and xrandr for X11.
|
|
5
|
+
* Note: Wayland does not support window positioning by design.
|
|
6
|
+
*/
|
|
7
|
+
import { exec as execCb } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { calculateAllSlots } from './smart-layouts.js';
|
|
10
|
+
const execAsync = promisify(execCb);
|
|
11
|
+
/**
|
|
12
|
+
* Check if a command exists on the system
|
|
13
|
+
*/
|
|
14
|
+
async function commandExists(cmd) {
|
|
15
|
+
try {
|
|
16
|
+
await execAsync(`which ${cmd}`);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if running under Wayland
|
|
25
|
+
*/
|
|
26
|
+
function isWayland() {
|
|
27
|
+
return process.env.XDG_SESSION_TYPE === 'wayland' ||
|
|
28
|
+
process.env.WAYLAND_DISPLAY !== undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Linux Window Manager using wmctrl and xrandr
|
|
32
|
+
*/
|
|
33
|
+
export class LinuxWindowManager {
|
|
34
|
+
wmctrlAvailable = null;
|
|
35
|
+
xdotoolAvailable = null;
|
|
36
|
+
getPlatform() {
|
|
37
|
+
return 'linux';
|
|
38
|
+
}
|
|
39
|
+
isSupported() {
|
|
40
|
+
// Linux is supported, but Wayland has limitations
|
|
41
|
+
return process.platform === 'linux';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if wmctrl is available (lazy check)
|
|
45
|
+
*/
|
|
46
|
+
async checkWmctrl() {
|
|
47
|
+
if (this.wmctrlAvailable === null) {
|
|
48
|
+
this.wmctrlAvailable = await commandExists('wmctrl');
|
|
49
|
+
}
|
|
50
|
+
return this.wmctrlAvailable;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if xdotool is available (lazy check)
|
|
54
|
+
*/
|
|
55
|
+
async checkXdotool() {
|
|
56
|
+
if (this.xdotoolAvailable === null) {
|
|
57
|
+
this.xdotoolAvailable = await commandExists('xdotool');
|
|
58
|
+
}
|
|
59
|
+
return this.xdotoolAvailable;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all displays using xrandr
|
|
63
|
+
*/
|
|
64
|
+
async getDisplays() {
|
|
65
|
+
if (isWayland()) {
|
|
66
|
+
// Wayland doesn't provide standard display enumeration
|
|
67
|
+
// Return a single display with estimated dimensions
|
|
68
|
+
return [
|
|
69
|
+
{
|
|
70
|
+
id: 'wayland-primary',
|
|
71
|
+
bounds: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
72
|
+
workArea: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
73
|
+
isPrimary: true,
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const { stdout } = await execAsync('xrandr --query');
|
|
79
|
+
const displays = [];
|
|
80
|
+
// Parse xrandr output
|
|
81
|
+
// Example: "DP-1 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis)"
|
|
82
|
+
const lines = stdout.split('\n');
|
|
83
|
+
let displayIndex = 0;
|
|
84
|
+
for (const line of lines) {
|
|
85
|
+
const match = line.match(/^(\S+)\s+connected\s*(primary)?\s*(\d+)x(\d+)\+(\d+)\+(\d+)/);
|
|
86
|
+
if (match) {
|
|
87
|
+
const [, name, primary, width, height, x, y] = match;
|
|
88
|
+
displays.push({
|
|
89
|
+
id: name,
|
|
90
|
+
bounds: {
|
|
91
|
+
x: parseInt(x, 10),
|
|
92
|
+
y: parseInt(y, 10),
|
|
93
|
+
width: parseInt(width, 10),
|
|
94
|
+
height: parseInt(height, 10),
|
|
95
|
+
},
|
|
96
|
+
workArea: {
|
|
97
|
+
// Estimate work area (subtract common panel sizes)
|
|
98
|
+
x: parseInt(x, 10),
|
|
99
|
+
y: parseInt(y, 10) + 28, // Assume 28px top panel
|
|
100
|
+
width: parseInt(width, 10),
|
|
101
|
+
height: parseInt(height, 10) - 28,
|
|
102
|
+
},
|
|
103
|
+
isPrimary: primary === 'primary' || displayIndex === 0,
|
|
104
|
+
});
|
|
105
|
+
displayIndex++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (displays.length === 0) {
|
|
109
|
+
// Fallback
|
|
110
|
+
return [
|
|
111
|
+
{
|
|
112
|
+
id: 'primary',
|
|
113
|
+
bounds: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
114
|
+
workArea: { x: 0, y: 28, width: 1920, height: 1052 },
|
|
115
|
+
isPrimary: true,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
return displays;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Fallback to reasonable defaults
|
|
123
|
+
return [
|
|
124
|
+
{
|
|
125
|
+
id: 'primary',
|
|
126
|
+
bounds: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
127
|
+
workArea: { x: 0, y: 28, width: 1920, height: 1052 },
|
|
128
|
+
isPrimary: true,
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Position a terminal window by its terminal key
|
|
135
|
+
*/
|
|
136
|
+
async positionWindow(terminalKey, geometry) {
|
|
137
|
+
if (isWayland()) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
error: 'Window positioning is not supported on Wayland. Use your compositor\'s built-in tiling.',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const hasWmctrl = await this.checkWmctrl();
|
|
144
|
+
if (!hasWmctrl) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
error: 'wmctrl not installed. Install with: sudo apt install wmctrl',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const colonIndex = terminalKey.indexOf(':');
|
|
151
|
+
if (colonIndex === -1) {
|
|
152
|
+
return { success: false, error: `Invalid terminal key format: ${terminalKey}` };
|
|
153
|
+
}
|
|
154
|
+
const prefix = terminalKey.substring(0, colonIndex);
|
|
155
|
+
const value = terminalKey.substring(colonIndex + 1);
|
|
156
|
+
switch (prefix) {
|
|
157
|
+
case 'PID':
|
|
158
|
+
return this.positionByPid(value, geometry);
|
|
159
|
+
case 'WINDOWID':
|
|
160
|
+
case 'X11':
|
|
161
|
+
return this.positionByWindowId(value, geometry);
|
|
162
|
+
default:
|
|
163
|
+
// Try PID-based positioning as fallback
|
|
164
|
+
if (/^\d+$/.test(value)) {
|
|
165
|
+
return this.positionByPid(value, geometry);
|
|
166
|
+
}
|
|
167
|
+
return { success: false, error: `Unsupported terminal key prefix: ${prefix}` };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Position a window by X11 window ID using wmctrl
|
|
172
|
+
*/
|
|
173
|
+
async positionByWindowId(windowId, geometry) {
|
|
174
|
+
const { x, y, width, height } = geometry;
|
|
175
|
+
try {
|
|
176
|
+
// wmctrl -e format: gravity,x,y,width,height
|
|
177
|
+
// gravity 0 means use current gravity
|
|
178
|
+
await execAsync(`wmctrl -i -r ${windowId} -e 0,${x},${y},${width},${height}`);
|
|
179
|
+
// Activate the window
|
|
180
|
+
await execAsync(`wmctrl -i -a ${windowId}`);
|
|
181
|
+
return { success: true };
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Position a window by process ID
|
|
189
|
+
*/
|
|
190
|
+
async positionByPid(pid, geometry) {
|
|
191
|
+
const { x, y, width, height } = geometry;
|
|
192
|
+
try {
|
|
193
|
+
// First, try to find the window ID for this PID using wmctrl
|
|
194
|
+
const { stdout } = await execAsync('wmctrl -l -p');
|
|
195
|
+
// Parse wmctrl output to find window with matching PID
|
|
196
|
+
// Format: 0x0400006 0 12345 hostname Window Title
|
|
197
|
+
const lines = stdout.split('\n');
|
|
198
|
+
let windowId = null;
|
|
199
|
+
for (const line of lines) {
|
|
200
|
+
const match = line.match(/^(0x[\da-f]+)\s+\d+\s+(\d+)/i);
|
|
201
|
+
if (match && match[2] === pid) {
|
|
202
|
+
windowId = match[1];
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// If not found directly, try xdotool to search by PID
|
|
207
|
+
if (!windowId) {
|
|
208
|
+
const hasXdotool = await this.checkXdotool();
|
|
209
|
+
if (hasXdotool) {
|
|
210
|
+
try {
|
|
211
|
+
const { stdout: xdoResult } = await execAsync(`xdotool search --pid ${pid}`);
|
|
212
|
+
const ids = xdoResult.trim().split('\n').filter(Boolean);
|
|
213
|
+
if (ids.length > 0) {
|
|
214
|
+
// Convert decimal to hex for wmctrl
|
|
215
|
+
windowId = '0x' + parseInt(ids[0], 10).toString(16);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// xdotool search failed
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!windowId) {
|
|
224
|
+
return { success: false, error: `No window found for PID ${pid}` };
|
|
225
|
+
}
|
|
226
|
+
// Position using wmctrl
|
|
227
|
+
await execAsync(`wmctrl -i -r ${windowId} -e 0,${x},${y},${width},${height}`);
|
|
228
|
+
// Activate the window
|
|
229
|
+
await execAsync(`wmctrl -i -a ${windowId}`);
|
|
230
|
+
return { success: true };
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Tile multiple terminal windows
|
|
238
|
+
*/
|
|
239
|
+
async tileWindows(terminalKeys, layout, display) {
|
|
240
|
+
if (terminalKeys.length === 0) {
|
|
241
|
+
return { success: true, positioned: 0, total: 0 };
|
|
242
|
+
}
|
|
243
|
+
if (isWayland()) {
|
|
244
|
+
return {
|
|
245
|
+
success: false,
|
|
246
|
+
positioned: 0,
|
|
247
|
+
total: terminalKeys.length,
|
|
248
|
+
errors: ['Window tiling is not supported on Wayland. Use your compositor\'s built-in tiling.'],
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
const hasWmctrl = await this.checkWmctrl();
|
|
252
|
+
if (!hasWmctrl) {
|
|
253
|
+
return {
|
|
254
|
+
success: false,
|
|
255
|
+
positioned: 0,
|
|
256
|
+
total: terminalKeys.length,
|
|
257
|
+
errors: ['wmctrl not installed. Install with: sudo apt install wmctrl'],
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// Get display info
|
|
261
|
+
const displays = await this.getDisplays();
|
|
262
|
+
const targetDisplay = display || displays.find(d => d.isPrimary) || displays[0];
|
|
263
|
+
if (!targetDisplay) {
|
|
264
|
+
return {
|
|
265
|
+
success: false,
|
|
266
|
+
positioned: 0,
|
|
267
|
+
total: terminalKeys.length,
|
|
268
|
+
errors: ['No display available'],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// Use smart layout engine for all window counts (consistent with tile state)
|
|
272
|
+
const allSlots = calculateAllSlots(targetDisplay.workArea, terminalKeys.length);
|
|
273
|
+
const errors = [];
|
|
274
|
+
let positioned = 0;
|
|
275
|
+
// Position each window
|
|
276
|
+
for (let i = 0; i < terminalKeys.length; i++) {
|
|
277
|
+
const terminalKey = terminalKeys[i];
|
|
278
|
+
const geometry = allSlots[i].geometry;
|
|
279
|
+
const result = await this.positionWindow(terminalKey, geometry);
|
|
280
|
+
if (result.success) {
|
|
281
|
+
positioned++;
|
|
282
|
+
}
|
|
283
|
+
else if (result.error) {
|
|
284
|
+
errors.push(`${terminalKey}: ${result.error}`);
|
|
285
|
+
}
|
|
286
|
+
// Small delay between windows
|
|
287
|
+
if (i < terminalKeys.length - 1) {
|
|
288
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
success: positioned === terminalKeys.length,
|
|
293
|
+
positioned,
|
|
294
|
+
total: terminalKeys.length,
|
|
295
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=linux-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linux-manager.js","sourceRoot":"","sources":["../../src/window-manager/linux-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS Window Manager
|
|
3
|
+
*
|
|
4
|
+
* Implements window positioning and tiling using AppleScript.
|
|
5
|
+
* Supports iTerm2, Terminal.app, and PID-based fallback.
|
|
6
|
+
*/
|
|
7
|
+
import type { WindowManager, WindowGeometry, Display, TileLayout, PositionResult, TileResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* macOS Window Manager using AppleScript
|
|
10
|
+
*/
|
|
11
|
+
export declare class MacOSWindowManager implements WindowManager {
|
|
12
|
+
getPlatform(): string;
|
|
13
|
+
isSupported(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Get all displays using NSScreen via JXA (JavaScript for Automation).
|
|
16
|
+
* Falls back to Finder AppleScript (primary only) if JXA fails.
|
|
17
|
+
*/
|
|
18
|
+
getDisplays(): Promise<Display[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Enumerate all displays via JXA using NSScreen.
|
|
21
|
+
* Returns displays with screen coordinates (top-left origin, Y-down).
|
|
22
|
+
*/
|
|
23
|
+
private getDisplaysViaJXA;
|
|
24
|
+
/**
|
|
25
|
+
* Fallback: get primary display via Finder AppleScript
|
|
26
|
+
*/
|
|
27
|
+
private getDisplaysViaFinder;
|
|
28
|
+
private defaultDisplay;
|
|
29
|
+
/**
|
|
30
|
+
* Position a terminal window by its terminal key.
|
|
31
|
+
* Handles DISCOVERED: wrapper by extracting the inner terminal type.
|
|
32
|
+
*/
|
|
33
|
+
positionWindow(terminalKey: string, geometry: WindowGeometry): Promise<PositionResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Position an iTerm2 window by session UUID
|
|
36
|
+
*/
|
|
37
|
+
private positionITerm;
|
|
38
|
+
/**
|
|
39
|
+
* Position a Terminal.app window by TTY path
|
|
40
|
+
*/
|
|
41
|
+
private positionTerminalApp;
|
|
42
|
+
/**
|
|
43
|
+
* Find a TTY across all known terminal apps and position the window.
|
|
44
|
+
* Tries iTerm2 first (most common for discovered sessions), then Terminal.app.
|
|
45
|
+
*/
|
|
46
|
+
private findAndPositionByTTY;
|
|
47
|
+
/**
|
|
48
|
+
* Find a TTY across all known terminal apps and return window bounds.
|
|
49
|
+
* Tries iTerm2 first, then Terminal.app.
|
|
50
|
+
*/
|
|
51
|
+
private findBoundsByTTY;
|
|
52
|
+
/**
|
|
53
|
+
* Position a window by process ID using System Events
|
|
54
|
+
* Note: This is app-level only (cannot select specific tabs)
|
|
55
|
+
*/
|
|
56
|
+
private positionByPid;
|
|
57
|
+
/**
|
|
58
|
+
* Resolve a TTY device path from a PID using lsof.
|
|
59
|
+
* Useful when ps returns ?? but the process has a controlling TTY.
|
|
60
|
+
*/
|
|
61
|
+
private resolveTtyFromPid;
|
|
62
|
+
/**
|
|
63
|
+
* Resolve a PID to a positioned window via TTY lookup with PID fallback.
|
|
64
|
+
* Chain: PID → lsof → TTY → iTerm/Terminal.app (tab-specific) → PID app-level
|
|
65
|
+
*/
|
|
66
|
+
private resolveAndPositionByPid;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve a PID to window bounds via TTY lookup.
|
|
69
|
+
* Chain: PID → lsof → TTY → findBoundsByTTY
|
|
70
|
+
*/
|
|
71
|
+
private resolveBoundsByPid;
|
|
72
|
+
/**
|
|
73
|
+
* Position the browser window showing the Jacques GUI.
|
|
74
|
+
* Searches for a window with "Jacques" in its title across common browsers.
|
|
75
|
+
*/
|
|
76
|
+
positionBrowserWindow(geometry: WindowGeometry): Promise<PositionResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Get current bounds of a terminal window.
|
|
79
|
+
* Returns null if bounds cannot be determined.
|
|
80
|
+
* Handles DISCOVERED: wrapper by extracting the inner terminal type.
|
|
81
|
+
*/
|
|
82
|
+
private getWindowBounds;
|
|
83
|
+
/**
|
|
84
|
+
* Detect which display contains the center point of the given bounds.
|
|
85
|
+
* Returns the matching display, or null if no display contains the center.
|
|
86
|
+
*/
|
|
87
|
+
private detectDisplayForBounds;
|
|
88
|
+
/**
|
|
89
|
+
* Auto-detect the best display for tiling based on where windows currently are.
|
|
90
|
+
* Uses majority vote: tiles on the display with the most windows.
|
|
91
|
+
*/
|
|
92
|
+
private detectTargetDisplay;
|
|
93
|
+
/**
|
|
94
|
+
* Get the target display for a set of terminal windows using majority vote.
|
|
95
|
+
* Returns the display with the most terminal windows, or primary display as fallback.
|
|
96
|
+
*/
|
|
97
|
+
getTargetDisplayForTerminals(terminalKeys: string[]): Promise<Display | null>;
|
|
98
|
+
/**
|
|
99
|
+
* Tile multiple terminal windows
|
|
100
|
+
*/
|
|
101
|
+
tileWindows(terminalKeys: string[], layout: TileLayout, display?: Display): Promise<TileResult>;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=macos-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-manager.d.ts","sourceRoot":"","sources":["../../src/window-manager/macos-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,WAAW,IAAI,MAAM;IAIrB,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAavC;;;OAGG;YACW,iBAAiB;IAoD/B;;OAEG;YACW,oBAAoB;IAwBlC,OAAO,CAAC,cAAc;IAStB;;;OAGG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAuC5F;;OAEG;YACW,aAAa;IA2C3B;;OAEG;YACW,mBAAmB;IAwCjC;;;OAGG;YACW,oBAAoB;IAwClC;;;OAGG;YACW,eAAe;IA8D7B;;;OAGG;YACW,aAAa;IA+B3B;;;OAGG;YACW,iBAAiB;IAa/B;;;OAGG;YACW,uBAAuB;IAWrC;;;OAGG;YACW,kBAAkB;IAQhC;;;OAGG;IACG,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAwC9E;;;;OAIG;YACW,eAAe;IAiE7B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;;OAGG;YACW,mBAAmB;IA8BjC;;;OAGG;IACG,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAOnF;;OAEG;IACG,WAAW,CACf,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC;CA8DvB"}
|