@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,637 @@
|
|
|
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 { exec as execCb } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { calculateAllSlots } from './smart-layouts.js';
|
|
10
|
+
import { extractItermUuid, parseTerminalKey, runAppleScript } from '../connection/index.js';
|
|
11
|
+
const execAsync = promisify(execCb);
|
|
12
|
+
/**
|
|
13
|
+
* macOS Window Manager using AppleScript
|
|
14
|
+
*/
|
|
15
|
+
export class MacOSWindowManager {
|
|
16
|
+
getPlatform() {
|
|
17
|
+
return 'darwin';
|
|
18
|
+
}
|
|
19
|
+
isSupported() {
|
|
20
|
+
return process.platform === 'darwin';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get all displays using NSScreen via JXA (JavaScript for Automation).
|
|
24
|
+
* Falls back to Finder AppleScript (primary only) if JXA fails.
|
|
25
|
+
*/
|
|
26
|
+
async getDisplays() {
|
|
27
|
+
try {
|
|
28
|
+
return await this.getDisplaysViaJXA();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Fallback: try Finder AppleScript for primary display only
|
|
32
|
+
try {
|
|
33
|
+
return await this.getDisplaysViaFinder();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return [this.defaultDisplay()];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Enumerate all displays via JXA using NSScreen.
|
|
42
|
+
* Returns displays with screen coordinates (top-left origin, Y-down).
|
|
43
|
+
*/
|
|
44
|
+
async getDisplaysViaJXA() {
|
|
45
|
+
const jxaScript = `
|
|
46
|
+
ObjC.import('AppKit');
|
|
47
|
+
var screens = $.NSScreen.screens;
|
|
48
|
+
var main = $.NSScreen.mainScreen;
|
|
49
|
+
var mainFrame = main.frame;
|
|
50
|
+
var primaryHeight = mainFrame.size.height;
|
|
51
|
+
|
|
52
|
+
var result = [];
|
|
53
|
+
for (var i = 0; i < screens.count; i++) {
|
|
54
|
+
var s = screens.objectAtIndex(i);
|
|
55
|
+
var f = s.frame;
|
|
56
|
+
var v = s.visibleFrame;
|
|
57
|
+
var isMain = (f.origin.x === mainFrame.origin.x && f.origin.y === mainFrame.origin.y &&
|
|
58
|
+
f.size.width === mainFrame.size.width && f.size.height === mainFrame.size.height);
|
|
59
|
+
|
|
60
|
+
// Convert Cocoa coords (bottom-left origin, Y-up) to screen coords (top-left origin, Y-down)
|
|
61
|
+
var screenX = f.origin.x;
|
|
62
|
+
var screenY = primaryHeight - f.origin.y - f.size.height;
|
|
63
|
+
var visibleX = v.origin.x;
|
|
64
|
+
var visibleY = primaryHeight - v.origin.y - v.size.height;
|
|
65
|
+
|
|
66
|
+
result.push({
|
|
67
|
+
index: i,
|
|
68
|
+
bounds: { x: screenX, y: screenY, width: f.size.width, height: f.size.height },
|
|
69
|
+
workArea: { x: visibleX, y: visibleY, width: v.size.width, height: v.size.height },
|
|
70
|
+
isPrimary: isMain
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
JSON.stringify(result);
|
|
74
|
+
`;
|
|
75
|
+
const output = await runAppleScript(jxaScript, 'JavaScript');
|
|
76
|
+
const screens = JSON.parse(output);
|
|
77
|
+
if (!Array.isArray(screens) || screens.length === 0) {
|
|
78
|
+
throw new Error('No screens returned from JXA');
|
|
79
|
+
}
|
|
80
|
+
return screens.map(s => ({
|
|
81
|
+
id: s.isPrimary ? 'primary' : `display-${s.index}`,
|
|
82
|
+
bounds: s.bounds,
|
|
83
|
+
workArea: s.workArea,
|
|
84
|
+
isPrimary: s.isPrimary,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Fallback: get primary display via Finder AppleScript
|
|
89
|
+
*/
|
|
90
|
+
async getDisplaysViaFinder() {
|
|
91
|
+
const script = `
|
|
92
|
+
tell application "Finder"
|
|
93
|
+
get bounds of window of desktop
|
|
94
|
+
end tell
|
|
95
|
+
`;
|
|
96
|
+
const result = await runAppleScript(script);
|
|
97
|
+
const parts = result.split(',').map(s => parseInt(s.trim(), 10));
|
|
98
|
+
if (parts.length === 4) {
|
|
99
|
+
const [x1, y1, x2, y2] = parts;
|
|
100
|
+
return [
|
|
101
|
+
{
|
|
102
|
+
id: 'primary',
|
|
103
|
+
bounds: { x: x1, y: y1, width: x2 - x1, height: y2 - y1 },
|
|
104
|
+
workArea: { x: x1, y: y1, width: x2 - x1, height: y2 - y1 },
|
|
105
|
+
isPrimary: true,
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
return [this.defaultDisplay()];
|
|
110
|
+
}
|
|
111
|
+
defaultDisplay() {
|
|
112
|
+
return {
|
|
113
|
+
id: 'primary',
|
|
114
|
+
bounds: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
115
|
+
workArea: { x: 0, y: 23, width: 1920, height: 1057 },
|
|
116
|
+
isPrimary: true,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Position a terminal window by its terminal key.
|
|
121
|
+
* Handles DISCOVERED: wrapper by extracting the inner terminal type.
|
|
122
|
+
*/
|
|
123
|
+
async positionWindow(terminalKey, geometry) {
|
|
124
|
+
// Unwrap DISCOVERED keys to get the actual terminal type
|
|
125
|
+
const parsed = parseTerminalKey(terminalKey);
|
|
126
|
+
const effective = parsed.isDiscovered && parsed.innerKey ? parsed.innerKey : parsed;
|
|
127
|
+
switch (effective.prefix) {
|
|
128
|
+
case 'ITERM':
|
|
129
|
+
return this.positionITerm(effective.value, geometry);
|
|
130
|
+
case 'TTY': {
|
|
131
|
+
const ttyPath = effective.tty || effective.value.split(':')[0];
|
|
132
|
+
// Skip iTerm/Terminal lookup when TTY is ?? or ? (invalid path)
|
|
133
|
+
if (ttyPath !== '??' && ttyPath !== '?') {
|
|
134
|
+
const result = await this.findAndPositionByTTY(ttyPath, geometry);
|
|
135
|
+
if (result.success)
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
// Fallback: if PID is available, try PID → lsof → TTY → position
|
|
139
|
+
if (effective.pid) {
|
|
140
|
+
return this.resolveAndPositionByPid(effective.pid, geometry);
|
|
141
|
+
}
|
|
142
|
+
return { success: false, error: `TTY not found and no PID fallback: ${ttyPath}` };
|
|
143
|
+
}
|
|
144
|
+
case 'PID':
|
|
145
|
+
// Try PID → lsof → TTY → iTerm (tab-specific) before app-level PID
|
|
146
|
+
if (effective.pid) {
|
|
147
|
+
return this.resolveAndPositionByPid(effective.pid, geometry);
|
|
148
|
+
}
|
|
149
|
+
return this.positionByPid(effective.value, geometry);
|
|
150
|
+
case 'KITTY':
|
|
151
|
+
case 'WEZTERM':
|
|
152
|
+
return { success: false, error: `${effective.prefix} window positioning not supported yet` };
|
|
153
|
+
case 'TERM':
|
|
154
|
+
case 'AUTO':
|
|
155
|
+
case 'UNKNOWN':
|
|
156
|
+
return { success: false, error: `${effective.prefix} window positioning not supported` };
|
|
157
|
+
default:
|
|
158
|
+
return { success: false, error: `Unknown terminal key prefix: ${effective.prefix}` };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Position an iTerm2 window by session UUID
|
|
163
|
+
*/
|
|
164
|
+
async positionITerm(itermSessionId, geometry) {
|
|
165
|
+
const uuid = extractItermUuid(itermSessionId);
|
|
166
|
+
const { x, y, width, height } = geometry;
|
|
167
|
+
// AppleScript bounds format: {left, top, right, bottom}
|
|
168
|
+
const bounds = `{${x}, ${y}, ${x + width}, ${y + height}}`;
|
|
169
|
+
const script = `
|
|
170
|
+
tell application "iTerm2"
|
|
171
|
+
repeat with w in windows
|
|
172
|
+
repeat with t in tabs of w
|
|
173
|
+
repeat with s in sessions of t
|
|
174
|
+
if unique ID of s is "${uuid}" then
|
|
175
|
+
-- Select the tab first
|
|
176
|
+
select t
|
|
177
|
+
-- Position the window
|
|
178
|
+
set bounds of w to ${bounds}
|
|
179
|
+
-- Bring to front
|
|
180
|
+
set index of w to 1
|
|
181
|
+
activate
|
|
182
|
+
return "ok"
|
|
183
|
+
end if
|
|
184
|
+
end repeat
|
|
185
|
+
end repeat
|
|
186
|
+
end repeat
|
|
187
|
+
return "not_found"
|
|
188
|
+
end tell
|
|
189
|
+
`;
|
|
190
|
+
try {
|
|
191
|
+
const result = await runAppleScript(script);
|
|
192
|
+
if (result === 'ok') {
|
|
193
|
+
return { success: true };
|
|
194
|
+
}
|
|
195
|
+
return { success: false, error: `Session not found: ${uuid}` };
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Position a Terminal.app window by TTY path
|
|
203
|
+
*/
|
|
204
|
+
async positionTerminalApp(ttyPath, geometry) {
|
|
205
|
+
// Normalize TTY path - ps returns "ttys012" but Terminal.app expects "/dev/ttys012"
|
|
206
|
+
const normalizedPath = ttyPath.startsWith('/dev/') ? ttyPath : `/dev/${ttyPath}`;
|
|
207
|
+
const { x, y, width, height } = geometry;
|
|
208
|
+
const bounds = `{${x}, ${y}, ${x + width}, ${y + height}}`;
|
|
209
|
+
const script = `
|
|
210
|
+
tell application "Terminal"
|
|
211
|
+
repeat with w in windows
|
|
212
|
+
repeat with t in tabs of w
|
|
213
|
+
if tty of t is "${normalizedPath}" then
|
|
214
|
+
-- Select the tab
|
|
215
|
+
set selected tab of w to t
|
|
216
|
+
-- Position the window
|
|
217
|
+
set bounds of w to ${bounds}
|
|
218
|
+
-- Bring to front
|
|
219
|
+
set index of w to 1
|
|
220
|
+
activate
|
|
221
|
+
return "ok"
|
|
222
|
+
end if
|
|
223
|
+
end repeat
|
|
224
|
+
end repeat
|
|
225
|
+
return "not_found"
|
|
226
|
+
end tell
|
|
227
|
+
`;
|
|
228
|
+
try {
|
|
229
|
+
const result = await runAppleScript(script);
|
|
230
|
+
if (result === 'ok') {
|
|
231
|
+
return { success: true };
|
|
232
|
+
}
|
|
233
|
+
return { success: false, error: `TTY not found: ${ttyPath}` };
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Find a TTY across all known terminal apps and position the window.
|
|
241
|
+
* Tries iTerm2 first (most common for discovered sessions), then Terminal.app.
|
|
242
|
+
*/
|
|
243
|
+
async findAndPositionByTTY(ttyPath, geometry) {
|
|
244
|
+
const normalizedPath = ttyPath.startsWith('/dev/') ? ttyPath : `/dev/${ttyPath}`;
|
|
245
|
+
const { x, y, width, height } = geometry;
|
|
246
|
+
const bounds = `{${x}, ${y}, ${x + width}, ${y + height}}`;
|
|
247
|
+
// Try iTerm2 first
|
|
248
|
+
try {
|
|
249
|
+
const itermScript = `
|
|
250
|
+
tell application "iTerm2"
|
|
251
|
+
repeat with w in windows
|
|
252
|
+
repeat with t in tabs of w
|
|
253
|
+
repeat with s in sessions of t
|
|
254
|
+
if tty of s contains "${normalizedPath}" then
|
|
255
|
+
select t
|
|
256
|
+
set bounds of w to ${bounds}
|
|
257
|
+
set index of w to 1
|
|
258
|
+
activate
|
|
259
|
+
return "ok"
|
|
260
|
+
end if
|
|
261
|
+
end repeat
|
|
262
|
+
end repeat
|
|
263
|
+
end repeat
|
|
264
|
+
return "not_found"
|
|
265
|
+
end tell
|
|
266
|
+
`;
|
|
267
|
+
const result = await runAppleScript(itermScript);
|
|
268
|
+
if (result === 'ok') {
|
|
269
|
+
return { success: true };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// iTerm2 not running or errored, fall through to Terminal.app
|
|
274
|
+
}
|
|
275
|
+
// Try Terminal.app
|
|
276
|
+
return this.positionTerminalApp(ttyPath, geometry);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Find a TTY across all known terminal apps and return window bounds.
|
|
280
|
+
* Tries iTerm2 first, then Terminal.app.
|
|
281
|
+
*/
|
|
282
|
+
async findBoundsByTTY(ttyPath) {
|
|
283
|
+
const normalizedPath = ttyPath.startsWith('/dev/') ? ttyPath : `/dev/${ttyPath}`;
|
|
284
|
+
// Try iTerm2 first
|
|
285
|
+
try {
|
|
286
|
+
const itermScript = `
|
|
287
|
+
tell application "iTerm2"
|
|
288
|
+
repeat with w in windows
|
|
289
|
+
repeat with t in tabs of w
|
|
290
|
+
repeat with s in sessions of t
|
|
291
|
+
if tty of s contains "${normalizedPath}" then
|
|
292
|
+
set b to bounds of w
|
|
293
|
+
return (item 1 of b as text) & "," & (item 2 of b as text) & "," & (item 3 of b as text) & "," & (item 4 of b as text)
|
|
294
|
+
end if
|
|
295
|
+
end repeat
|
|
296
|
+
end repeat
|
|
297
|
+
end repeat
|
|
298
|
+
return ""
|
|
299
|
+
end tell
|
|
300
|
+
`;
|
|
301
|
+
const result = await runAppleScript(itermScript);
|
|
302
|
+
if (result) {
|
|
303
|
+
const parts = result.split(',').map(s => parseInt(s.trim(), 10));
|
|
304
|
+
if (parts.length === 4) {
|
|
305
|
+
const [x1, y1, x2, y2] = parts;
|
|
306
|
+
return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
// iTerm2 not running or errored, fall through to Terminal.app
|
|
312
|
+
}
|
|
313
|
+
// Try Terminal.app
|
|
314
|
+
try {
|
|
315
|
+
const terminalScript = `
|
|
316
|
+
tell application "Terminal"
|
|
317
|
+
repeat with w in windows
|
|
318
|
+
repeat with t in tabs of w
|
|
319
|
+
if tty of t is "${normalizedPath}" then
|
|
320
|
+
set b to bounds of w
|
|
321
|
+
return (item 1 of b as text) & "," & (item 2 of b as text) & "," & (item 3 of b as text) & "," & (item 4 of b as text)
|
|
322
|
+
end if
|
|
323
|
+
end repeat
|
|
324
|
+
end repeat
|
|
325
|
+
return ""
|
|
326
|
+
end tell
|
|
327
|
+
`;
|
|
328
|
+
const result = await runAppleScript(terminalScript);
|
|
329
|
+
if (result) {
|
|
330
|
+
const parts = result.split(',').map(s => parseInt(s.trim(), 10));
|
|
331
|
+
if (parts.length === 4) {
|
|
332
|
+
const [x1, y1, x2, y2] = parts;
|
|
333
|
+
return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// Terminal.app not running or errored
|
|
339
|
+
}
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Position a window by process ID using System Events
|
|
344
|
+
* Note: This is app-level only (cannot select specific tabs)
|
|
345
|
+
*/
|
|
346
|
+
async positionByPid(pid, geometry) {
|
|
347
|
+
const { x, y, width, height } = geometry;
|
|
348
|
+
// First, get the app name from the PID
|
|
349
|
+
const getAppScript = `
|
|
350
|
+
tell application "System Events"
|
|
351
|
+
set theProcess to first process whose unix id is ${pid}
|
|
352
|
+
return name of theProcess
|
|
353
|
+
end tell
|
|
354
|
+
`;
|
|
355
|
+
try {
|
|
356
|
+
const appName = await runAppleScript(getAppScript);
|
|
357
|
+
// Now position the app's frontmost window
|
|
358
|
+
const positionScript = `
|
|
359
|
+
tell application "${appName}"
|
|
360
|
+
if (count of windows) > 0 then
|
|
361
|
+
set bounds of front window to {${x}, ${y}, ${x + width}, ${y + height}}
|
|
362
|
+
activate
|
|
363
|
+
end if
|
|
364
|
+
end tell
|
|
365
|
+
`;
|
|
366
|
+
await runAppleScript(positionScript);
|
|
367
|
+
return { success: true };
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Resolve a TTY device path from a PID using lsof.
|
|
375
|
+
* Useful when ps returns ?? but the process has a controlling TTY.
|
|
376
|
+
*/
|
|
377
|
+
async resolveTtyFromPid(pid) {
|
|
378
|
+
try {
|
|
379
|
+
const { stdout } = await execAsync(`lsof -p ${pid} 2>/dev/null | awk '$4 ~ /^[0-9]+u?$/ && $8 ~ /\\/dev\\/ttys/ {print $8; exit}'`, { timeout: 3000 });
|
|
380
|
+
const tty = stdout.trim();
|
|
381
|
+
return (tty && tty.startsWith('/dev/')) ? tty : null;
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Resolve a PID to a positioned window via TTY lookup with PID fallback.
|
|
389
|
+
* Chain: PID → lsof → TTY → iTerm/Terminal.app (tab-specific) → PID app-level
|
|
390
|
+
*/
|
|
391
|
+
async resolveAndPositionByPid(pid, geometry) {
|
|
392
|
+
// Step 1: Try PID → TTY → iTerm/Terminal.app session (tab-specific positioning)
|
|
393
|
+
const resolvedTty = await this.resolveTtyFromPid(pid);
|
|
394
|
+
if (resolvedTty) {
|
|
395
|
+
const result = await this.findAndPositionByTTY(resolvedTty, geometry);
|
|
396
|
+
if (result.success)
|
|
397
|
+
return result;
|
|
398
|
+
}
|
|
399
|
+
// Step 2: Fall back to app-level PID positioning
|
|
400
|
+
return this.positionByPid(String(pid), geometry);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Resolve a PID to window bounds via TTY lookup.
|
|
404
|
+
* Chain: PID → lsof → TTY → findBoundsByTTY
|
|
405
|
+
*/
|
|
406
|
+
async resolveBoundsByPid(pid) {
|
|
407
|
+
const resolvedTty = await this.resolveTtyFromPid(pid);
|
|
408
|
+
if (resolvedTty) {
|
|
409
|
+
return this.findBoundsByTTY(resolvedTty);
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Position the browser window showing the Jacques GUI.
|
|
415
|
+
* Searches for a window with "Jacques" in its title across common browsers.
|
|
416
|
+
*/
|
|
417
|
+
async positionBrowserWindow(geometry) {
|
|
418
|
+
const { x, y, width, height } = geometry;
|
|
419
|
+
const browsers = [
|
|
420
|
+
'Google Chrome', 'Arc', 'Safari', 'Firefox',
|
|
421
|
+
'Microsoft Edge', 'Brave Browser', 'Chromium',
|
|
422
|
+
];
|
|
423
|
+
for (const browser of browsers) {
|
|
424
|
+
const script = `
|
|
425
|
+
tell application "System Events"
|
|
426
|
+
if exists process "${browser}" then
|
|
427
|
+
tell process "${browser}"
|
|
428
|
+
repeat with w in windows
|
|
429
|
+
if name of w contains "Jacques" then
|
|
430
|
+
tell application "${browser}"
|
|
431
|
+
set bounds of front window to {${x}, ${y}, ${x + width}, ${y + height}}
|
|
432
|
+
activate
|
|
433
|
+
end tell
|
|
434
|
+
return "ok"
|
|
435
|
+
end if
|
|
436
|
+
end repeat
|
|
437
|
+
end tell
|
|
438
|
+
end if
|
|
439
|
+
end tell
|
|
440
|
+
return "not_found"
|
|
441
|
+
`;
|
|
442
|
+
try {
|
|
443
|
+
const result = await runAppleScript(script);
|
|
444
|
+
if (result === 'ok') {
|
|
445
|
+
return { success: true };
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return { success: false, error: 'Browser window with Jacques GUI not found' };
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Get current bounds of a terminal window.
|
|
456
|
+
* Returns null if bounds cannot be determined.
|
|
457
|
+
* Handles DISCOVERED: wrapper by extracting the inner terminal type.
|
|
458
|
+
*/
|
|
459
|
+
async getWindowBounds(terminalKey) {
|
|
460
|
+
// Unwrap DISCOVERED keys to get the actual terminal type
|
|
461
|
+
const parsed = parseTerminalKey(terminalKey);
|
|
462
|
+
const effective = parsed.isDiscovered && parsed.innerKey ? parsed.innerKey : parsed;
|
|
463
|
+
try {
|
|
464
|
+
switch (effective.prefix) {
|
|
465
|
+
case 'ITERM': {
|
|
466
|
+
const uuid = extractItermUuid(effective.value);
|
|
467
|
+
const script = `
|
|
468
|
+
tell application "iTerm2"
|
|
469
|
+
repeat with w in windows
|
|
470
|
+
repeat with t in tabs of w
|
|
471
|
+
repeat with s in sessions of t
|
|
472
|
+
if unique ID of s is "${uuid}" then
|
|
473
|
+
set b to bounds of w
|
|
474
|
+
return (item 1 of b as text) & "," & (item 2 of b as text) & "," & (item 3 of b as text) & "," & (item 4 of b as text)
|
|
475
|
+
end if
|
|
476
|
+
end repeat
|
|
477
|
+
end repeat
|
|
478
|
+
end repeat
|
|
479
|
+
return ""
|
|
480
|
+
end tell
|
|
481
|
+
`;
|
|
482
|
+
const result = await runAppleScript(script);
|
|
483
|
+
if (!result)
|
|
484
|
+
return null;
|
|
485
|
+
const parts = result.split(',').map(s => parseInt(s.trim(), 10));
|
|
486
|
+
if (parts.length === 4) {
|
|
487
|
+
const [x1, y1, x2, y2] = parts;
|
|
488
|
+
return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };
|
|
489
|
+
}
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
case 'TTY': {
|
|
493
|
+
// For TTY keys, strip any PID suffix to get the tty path
|
|
494
|
+
const ttyPath = effective.tty || effective.value.split(':')[0];
|
|
495
|
+
// Skip lookup when TTY is ?? or ? (invalid path)
|
|
496
|
+
if (ttyPath !== '??' && ttyPath !== '?') {
|
|
497
|
+
const bounds = await this.findBoundsByTTY(ttyPath);
|
|
498
|
+
if (bounds)
|
|
499
|
+
return bounds;
|
|
500
|
+
}
|
|
501
|
+
// Fallback: if PID is available, try PID → lsof → TTY → bounds
|
|
502
|
+
if (effective.pid) {
|
|
503
|
+
return this.resolveBoundsByPid(effective.pid);
|
|
504
|
+
}
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
case 'PID': {
|
|
508
|
+
// Try PID → lsof → TTY → bounds (tab-specific)
|
|
509
|
+
if (effective.pid) {
|
|
510
|
+
return this.resolveBoundsByPid(effective.pid);
|
|
511
|
+
}
|
|
512
|
+
return null;
|
|
513
|
+
}
|
|
514
|
+
default:
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Detect which display contains the center point of the given bounds.
|
|
524
|
+
* Returns the matching display, or null if no display contains the center.
|
|
525
|
+
*/
|
|
526
|
+
detectDisplayForBounds(bounds, displays) {
|
|
527
|
+
const centerX = bounds.x + bounds.width / 2;
|
|
528
|
+
const centerY = bounds.y + bounds.height / 2;
|
|
529
|
+
for (const display of displays) {
|
|
530
|
+
const db = display.bounds;
|
|
531
|
+
if (centerX >= db.x &&
|
|
532
|
+
centerX < db.x + db.width &&
|
|
533
|
+
centerY >= db.y &&
|
|
534
|
+
centerY < db.y + db.height) {
|
|
535
|
+
return display;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return null;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Auto-detect the best display for tiling based on where windows currently are.
|
|
542
|
+
* Uses majority vote: tiles on the display with the most windows.
|
|
543
|
+
*/
|
|
544
|
+
async detectTargetDisplay(terminalKeys, displays) {
|
|
545
|
+
if (displays.length <= 1)
|
|
546
|
+
return null; // No point detecting with single display
|
|
547
|
+
const displayVotes = new Map();
|
|
548
|
+
for (const key of terminalKeys) {
|
|
549
|
+
const bounds = await this.getWindowBounds(key);
|
|
550
|
+
if (!bounds)
|
|
551
|
+
continue;
|
|
552
|
+
const display = this.detectDisplayForBounds(bounds, displays);
|
|
553
|
+
if (display) {
|
|
554
|
+
displayVotes.set(display.id, (displayVotes.get(display.id) || 0) + 1);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
if (displayVotes.size === 0)
|
|
558
|
+
return null;
|
|
559
|
+
// Find display with most votes
|
|
560
|
+
let bestId = '';
|
|
561
|
+
let bestCount = 0;
|
|
562
|
+
for (const [id, count] of displayVotes) {
|
|
563
|
+
if (count > bestCount) {
|
|
564
|
+
bestId = id;
|
|
565
|
+
bestCount = count;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return displays.find(d => d.id === bestId) || null;
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Get the target display for a set of terminal windows using majority vote.
|
|
572
|
+
* Returns the display with the most terminal windows, or primary display as fallback.
|
|
573
|
+
*/
|
|
574
|
+
async getTargetDisplayForTerminals(terminalKeys) {
|
|
575
|
+
const displays = await this.getDisplays();
|
|
576
|
+
if (displays.length <= 1)
|
|
577
|
+
return displays[0] || null;
|
|
578
|
+
const detected = await this.detectTargetDisplay(terminalKeys, displays);
|
|
579
|
+
return detected || displays.find(d => d.isPrimary) || displays[0];
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Tile multiple terminal windows
|
|
583
|
+
*/
|
|
584
|
+
async tileWindows(terminalKeys, layout, display) {
|
|
585
|
+
if (terminalKeys.length === 0) {
|
|
586
|
+
return { success: true, positioned: 0, total: 0 };
|
|
587
|
+
}
|
|
588
|
+
// Get display info
|
|
589
|
+
const displays = await this.getDisplays();
|
|
590
|
+
// Determine target display:
|
|
591
|
+
// 1. Explicit display parameter
|
|
592
|
+
// 2. Auto-detect from current window positions (majority vote)
|
|
593
|
+
// 3. Primary display fallback
|
|
594
|
+
let targetDisplay = display || null;
|
|
595
|
+
if (!targetDisplay && displays.length > 1) {
|
|
596
|
+
targetDisplay = await this.detectTargetDisplay(terminalKeys, displays);
|
|
597
|
+
}
|
|
598
|
+
if (!targetDisplay) {
|
|
599
|
+
targetDisplay = displays.find(d => d.isPrimary) || displays[0];
|
|
600
|
+
}
|
|
601
|
+
if (!targetDisplay) {
|
|
602
|
+
return {
|
|
603
|
+
success: false,
|
|
604
|
+
positioned: 0,
|
|
605
|
+
total: terminalKeys.length,
|
|
606
|
+
errors: ['No display available'],
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
// Use smart layout engine for all window counts (consistent with tile state)
|
|
610
|
+
const allSlots = calculateAllSlots(targetDisplay.workArea, terminalKeys.length);
|
|
611
|
+
const errors = [];
|
|
612
|
+
let positioned = 0;
|
|
613
|
+
// Position each window
|
|
614
|
+
for (let i = 0; i < terminalKeys.length; i++) {
|
|
615
|
+
const terminalKey = terminalKeys[i];
|
|
616
|
+
const geometry = allSlots[i].geometry;
|
|
617
|
+
const result = await this.positionWindow(terminalKey, geometry);
|
|
618
|
+
if (result.success) {
|
|
619
|
+
positioned++;
|
|
620
|
+
}
|
|
621
|
+
else if (result.error) {
|
|
622
|
+
errors.push(`${terminalKey}: ${result.error}`);
|
|
623
|
+
}
|
|
624
|
+
// Small delay between windows to let AppleScript complete
|
|
625
|
+
if (i < terminalKeys.length - 1) {
|
|
626
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return {
|
|
630
|
+
success: positioned === terminalKeys.length,
|
|
631
|
+
positioned,
|
|
632
|
+
total: terminalKeys.length,
|
|
633
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
//# sourceMappingURL=macos-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-manager.js","sourceRoot":"","sources":["../../src/window-manager/macos-manager.ts"],"names":[],"mappings":"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"}
|