@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,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Activator
|
|
3
|
+
*
|
|
4
|
+
* Activates (brings to foreground with keyboard focus) a terminal window
|
|
5
|
+
* identified by its terminal_key. Supports iTerm2, Kitty, WezTerm,
|
|
6
|
+
* Terminal.app, and PID-based fallback.
|
|
7
|
+
*/
|
|
8
|
+
import { exec as execCb } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import { runAppleScript, extractItermUuid } from './connection/index.js';
|
|
11
|
+
const execAsync = promisify(execCb);
|
|
12
|
+
/**
|
|
13
|
+
* Activate a terminal window by its terminal_key.
|
|
14
|
+
*
|
|
15
|
+
* Terminal key formats:
|
|
16
|
+
* - ITERM:<w0t0p0:UUID> (ITERM_SESSION_ID = "w0t0p0:UUID")
|
|
17
|
+
* - KITTY:<window-id>
|
|
18
|
+
* - WEZTERM:<pane-id>
|
|
19
|
+
* - TERM:<session-id> (from statusline.sh using TERM_SESSION_ID)
|
|
20
|
+
* - TTY:<tty-path>
|
|
21
|
+
* - PID:<process-id>
|
|
22
|
+
* - AUTO:* or UNKNOWN:* (unsupported)
|
|
23
|
+
* - DISCOVERED:<type>:<value>[:extra] (from process scanner, unwrapped to inner type)
|
|
24
|
+
*/
|
|
25
|
+
export async function activateTerminal(terminalKey) {
|
|
26
|
+
const colonIndex = terminalKey.indexOf(':');
|
|
27
|
+
if (colonIndex === -1) {
|
|
28
|
+
return { success: false, method: 'unsupported', error: `Invalid terminal key format: ${terminalKey}` };
|
|
29
|
+
}
|
|
30
|
+
const prefix = terminalKey.substring(0, colonIndex);
|
|
31
|
+
const value = terminalKey.substring(colonIndex + 1);
|
|
32
|
+
switch (prefix) {
|
|
33
|
+
case 'DISCOVERED':
|
|
34
|
+
// DISCOVERED keys have format: DISCOVERED:<type>:<value>[:pid]
|
|
35
|
+
// Extract the inner key and try to activate it
|
|
36
|
+
return activateDiscoveredTerminal(value);
|
|
37
|
+
case 'ITERM':
|
|
38
|
+
return activateITerm(value);
|
|
39
|
+
case 'KITTY':
|
|
40
|
+
return activateKitty(value);
|
|
41
|
+
case 'WEZTERM':
|
|
42
|
+
return activateWezTerm(value);
|
|
43
|
+
case 'TERM':
|
|
44
|
+
// TERM_SESSION_ID from Terminal.app - no reliable activation API
|
|
45
|
+
return { success: false, method: 'unsupported', error: 'TERM_SESSION_ID does not support remote activation' };
|
|
46
|
+
case 'TTY':
|
|
47
|
+
return activateByTTY(value);
|
|
48
|
+
case 'PID':
|
|
49
|
+
return activateByPid(value);
|
|
50
|
+
case 'AUTO':
|
|
51
|
+
case 'UNKNOWN':
|
|
52
|
+
return { success: false, method: 'unsupported', error: 'Terminal does not support remote activation' };
|
|
53
|
+
default:
|
|
54
|
+
return { success: false, method: 'unsupported', error: `Unknown terminal key prefix: ${prefix}` };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Activate a terminal from a DISCOVERED key.
|
|
59
|
+
*
|
|
60
|
+
* Discovered key formats (after DISCOVERED: prefix is stripped):
|
|
61
|
+
* - iTerm2:w0t0p0:<uuid> → use ITERM activation with uuid
|
|
62
|
+
* - TTY:<tty-path>:<pid> → use TTY activation with tty-path
|
|
63
|
+
* - PID:<pid> → use PID activation
|
|
64
|
+
*/
|
|
65
|
+
async function activateDiscoveredTerminal(innerKey) {
|
|
66
|
+
const colonIndex = innerKey.indexOf(':');
|
|
67
|
+
if (colonIndex === -1) {
|
|
68
|
+
return { success: false, method: 'unsupported', error: `Invalid discovered key format: ${innerKey}` };
|
|
69
|
+
}
|
|
70
|
+
const innerType = innerKey.substring(0, colonIndex);
|
|
71
|
+
const innerValue = innerKey.substring(colonIndex + 1);
|
|
72
|
+
switch (innerType) {
|
|
73
|
+
case 'iTerm2': {
|
|
74
|
+
// iTerm2 discovered keys have format: iTerm2:w0t0p0:<uuid>
|
|
75
|
+
// The UUID is after the second colon
|
|
76
|
+
const secondColon = innerValue.indexOf(':');
|
|
77
|
+
if (secondColon === -1) {
|
|
78
|
+
// Just a single value, use it directly
|
|
79
|
+
return activateITerm(innerValue);
|
|
80
|
+
}
|
|
81
|
+
// Extract UUID (everything after w0t0p0:)
|
|
82
|
+
const uuid = innerValue.substring(secondColon + 1);
|
|
83
|
+
return activateITerm(uuid);
|
|
84
|
+
}
|
|
85
|
+
case 'TTY': {
|
|
86
|
+
// TTY discovered keys have format: TTY:<tty-path>:<pid>
|
|
87
|
+
// We need just the tty-path for activation
|
|
88
|
+
const lastColon = innerValue.lastIndexOf(':');
|
|
89
|
+
if (lastColon === -1) {
|
|
90
|
+
// No PID suffix, use value as-is
|
|
91
|
+
return activateByTTY(innerValue);
|
|
92
|
+
}
|
|
93
|
+
// Check if the last segment is a PID (all digits)
|
|
94
|
+
const possiblePid = innerValue.substring(lastColon + 1);
|
|
95
|
+
if (/^\d+$/.test(possiblePid)) {
|
|
96
|
+
// Last part is a PID, strip it
|
|
97
|
+
const ttyPath = innerValue.substring(0, lastColon);
|
|
98
|
+
return activateByTTY(ttyPath);
|
|
99
|
+
}
|
|
100
|
+
// Not a PID suffix, use full value
|
|
101
|
+
return activateByTTY(innerValue);
|
|
102
|
+
}
|
|
103
|
+
case 'PID':
|
|
104
|
+
return activateByPid(innerValue);
|
|
105
|
+
default:
|
|
106
|
+
// Unknown inner type, try using it as-is by reconstructing the key
|
|
107
|
+
return activateTerminal(`${innerType}:${innerValue}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// extractItermUuid is re-exported from connection module for backwards compatibility
|
|
111
|
+
export { extractItermUuid } from './connection/index.js';
|
|
112
|
+
/**
|
|
113
|
+
* Activate an iTerm2 tab by session UUID using AppleScript.
|
|
114
|
+
* Iterates all windows/tabs/sessions to find the matching UUID,
|
|
115
|
+
* selects the tab, and activates the window.
|
|
116
|
+
*
|
|
117
|
+
* ITERM_SESSION_ID env var is "w0t0p0:UUID" format.
|
|
118
|
+
* AppleScript's `unique ID of session` returns just the UUID.
|
|
119
|
+
*/
|
|
120
|
+
async function activateITerm(itermSessionId) {
|
|
121
|
+
const uuid = extractItermUuid(itermSessionId);
|
|
122
|
+
const script = `
|
|
123
|
+
tell application "iTerm2"
|
|
124
|
+
repeat with w in windows
|
|
125
|
+
repeat with t in tabs of w
|
|
126
|
+
repeat with s in sessions of t
|
|
127
|
+
if unique ID of s is "${uuid}" then
|
|
128
|
+
select t
|
|
129
|
+
set index of w to 1
|
|
130
|
+
activate
|
|
131
|
+
return "ok"
|
|
132
|
+
end if
|
|
133
|
+
end repeat
|
|
134
|
+
end repeat
|
|
135
|
+
end repeat
|
|
136
|
+
return "not_found"
|
|
137
|
+
end tell
|
|
138
|
+
`;
|
|
139
|
+
try {
|
|
140
|
+
const result = await runAppleScript(script);
|
|
141
|
+
if (result === 'ok') {
|
|
142
|
+
return { success: true, method: 'iterm' };
|
|
143
|
+
}
|
|
144
|
+
return { success: false, method: 'iterm', error: `Session not found: ${uuid}` };
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
return { success: false, method: 'iterm', error: formatError(err) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Activate a Kitty window by ID.
|
|
152
|
+
* Requires `allow_remote_control yes` in kitty.conf.
|
|
153
|
+
*/
|
|
154
|
+
async function activateKitty(windowId) {
|
|
155
|
+
try {
|
|
156
|
+
await execAsync(`kitten @ focus-window --match id:${windowId}`);
|
|
157
|
+
return { success: true, method: 'kitty' };
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return { success: false, method: 'kitty', error: formatError(err) };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Activate a WezTerm pane by pane ID.
|
|
165
|
+
*/
|
|
166
|
+
async function activateWezTerm(paneId) {
|
|
167
|
+
try {
|
|
168
|
+
await execAsync(`wezterm cli activate-pane --pane-id ${paneId}`);
|
|
169
|
+
return { success: true, method: 'wezterm' };
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return { success: false, method: 'wezterm', error: formatError(err) };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Activate a terminal by TTY path, trying all known terminal apps.
|
|
177
|
+
* Tries iTerm2 first (most common for discovered sessions), then Terminal.app.
|
|
178
|
+
*/
|
|
179
|
+
async function activateByTTY(ttyPath) {
|
|
180
|
+
const normalizedPath = ttyPath.startsWith('/dev/') ? ttyPath : `/dev/${ttyPath}`;
|
|
181
|
+
// Try iTerm2 first
|
|
182
|
+
try {
|
|
183
|
+
const itermScript = `
|
|
184
|
+
tell application "iTerm2"
|
|
185
|
+
repeat with w in windows
|
|
186
|
+
repeat with t in tabs of w
|
|
187
|
+
repeat with s in sessions of t
|
|
188
|
+
if tty of s contains "${normalizedPath}" then
|
|
189
|
+
select t
|
|
190
|
+
set index of w to 1
|
|
191
|
+
activate
|
|
192
|
+
return "ok"
|
|
193
|
+
end if
|
|
194
|
+
end repeat
|
|
195
|
+
end repeat
|
|
196
|
+
end repeat
|
|
197
|
+
return "not_found"
|
|
198
|
+
end tell
|
|
199
|
+
`;
|
|
200
|
+
const result = await runAppleScript(itermScript);
|
|
201
|
+
if (result === 'ok') {
|
|
202
|
+
return { success: true, method: 'iterm' };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// iTerm2 not running or errored, fall through to Terminal.app
|
|
207
|
+
}
|
|
208
|
+
// Try Terminal.app
|
|
209
|
+
return activateTerminalApp(normalizedPath);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Activate a Terminal.app tab by matching its TTY path.
|
|
213
|
+
* Uses AppleScript to iterate windows/tabs and match the tty.
|
|
214
|
+
*/
|
|
215
|
+
async function activateTerminalApp(ttyPath) {
|
|
216
|
+
// Normalize TTY path - ps returns "ttys012" but Terminal.app expects "/dev/ttys012"
|
|
217
|
+
const normalizedPath = ttyPath.startsWith('/dev/') ? ttyPath : `/dev/${ttyPath}`;
|
|
218
|
+
const script = `
|
|
219
|
+
tell application "Terminal"
|
|
220
|
+
repeat with w in windows
|
|
221
|
+
repeat with t in tabs of w
|
|
222
|
+
if tty of t is "${normalizedPath}" then
|
|
223
|
+
set selected tab of w to t
|
|
224
|
+
set index of w to 1
|
|
225
|
+
activate
|
|
226
|
+
return "ok"
|
|
227
|
+
end if
|
|
228
|
+
end repeat
|
|
229
|
+
end repeat
|
|
230
|
+
return "not_found"
|
|
231
|
+
end tell
|
|
232
|
+
`;
|
|
233
|
+
try {
|
|
234
|
+
const result = await runAppleScript(script);
|
|
235
|
+
if (result === 'ok') {
|
|
236
|
+
return { success: true, method: 'terminal_app' };
|
|
237
|
+
}
|
|
238
|
+
return { success: false, method: 'terminal_app', error: `TTY not found: ${normalizedPath}` };
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
return { success: false, method: 'terminal_app', error: formatError(err) };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Activate a terminal by its process ID using System Events.
|
|
246
|
+
* This is app-level only (cannot select specific tabs).
|
|
247
|
+
*/
|
|
248
|
+
async function activateByPid(pid) {
|
|
249
|
+
const script = `tell application "System Events" to set frontmost of first process whose unix id is ${pid} to true`;
|
|
250
|
+
try {
|
|
251
|
+
await runAppleScript(script);
|
|
252
|
+
return { success: true, method: 'pid' };
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
return { success: false, method: 'pid', error: formatError(err) };
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function formatError(err) {
|
|
259
|
+
if (err instanceof Error) {
|
|
260
|
+
return err.message;
|
|
261
|
+
}
|
|
262
|
+
return String(err);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=terminal-activator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-activator.js","sourceRoot":"","sources":["../src/terminal-activator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Activator Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests prefix parsing and unsupported terminal handling.
|
|
5
|
+
* The actual exec calls (osascript, kitten, wezterm) are platform-specific
|
|
6
|
+
* and tested via manual verification.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=terminal-activator.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-activator.test.d.ts","sourceRoot":"","sources":["../src/terminal-activator.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Activator Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests prefix parsing and unsupported terminal handling.
|
|
5
|
+
* The actual exec calls (osascript, kitten, wezterm) are platform-specific
|
|
6
|
+
* and tested via manual verification.
|
|
7
|
+
*/
|
|
8
|
+
import { activateTerminal, extractItermUuid } from './terminal-activator.js';
|
|
9
|
+
describe('activateTerminal', () => {
|
|
10
|
+
describe('prefix parsing', () => {
|
|
11
|
+
it('should return unsupported for invalid key format (no colon)', async () => {
|
|
12
|
+
const result = await activateTerminal('invalid-key');
|
|
13
|
+
expect(result.success).toBe(false);
|
|
14
|
+
expect(result.method).toBe('unsupported');
|
|
15
|
+
expect(result.error).toContain('Invalid terminal key format');
|
|
16
|
+
});
|
|
17
|
+
it('should return unsupported for empty string', async () => {
|
|
18
|
+
const result = await activateTerminal('');
|
|
19
|
+
expect(result.success).toBe(false);
|
|
20
|
+
expect(result.method).toBe('unsupported');
|
|
21
|
+
expect(result.error).toContain('Invalid terminal key format');
|
|
22
|
+
});
|
|
23
|
+
it('should return unsupported for AUTO prefix', async () => {
|
|
24
|
+
const result = await activateTerminal('AUTO:12345');
|
|
25
|
+
expect(result.success).toBe(false);
|
|
26
|
+
expect(result.method).toBe('unsupported');
|
|
27
|
+
expect(result.error).toContain('does not support remote activation');
|
|
28
|
+
});
|
|
29
|
+
it('should return unsupported for UNKNOWN prefix', async () => {
|
|
30
|
+
const result = await activateTerminal('UNKNOWN:something');
|
|
31
|
+
expect(result.success).toBe(false);
|
|
32
|
+
expect(result.method).toBe('unsupported');
|
|
33
|
+
expect(result.error).toContain('does not support remote activation');
|
|
34
|
+
});
|
|
35
|
+
it('should return unsupported for unrecognized prefix', async () => {
|
|
36
|
+
const result = await activateTerminal('VSCODE:1234');
|
|
37
|
+
expect(result.success).toBe(false);
|
|
38
|
+
expect(result.method).toBe('unsupported');
|
|
39
|
+
expect(result.error).toContain('Unknown terminal key prefix');
|
|
40
|
+
});
|
|
41
|
+
it('should return unsupported for ALACRITTY prefix', async () => {
|
|
42
|
+
const result = await activateTerminal('ALACRITTY:window1');
|
|
43
|
+
expect(result.success).toBe(false);
|
|
44
|
+
expect(result.method).toBe('unsupported');
|
|
45
|
+
expect(result.error).toContain('Unknown terminal key prefix');
|
|
46
|
+
});
|
|
47
|
+
it('should return unsupported for TERM prefix', async () => {
|
|
48
|
+
const result = await activateTerminal('TERM:123.456');
|
|
49
|
+
expect(result.success).toBe(false);
|
|
50
|
+
expect(result.method).toBe('unsupported');
|
|
51
|
+
expect(result.error).toContain('does not support remote activation');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('extractItermUuid', () => {
|
|
55
|
+
it('should extract UUID from w0t0p0:UUID format', () => {
|
|
56
|
+
expect(extractItermUuid('w0t0p0:8A7D83CA-3FA0-4D00-B34E-08C4FFA1E512'))
|
|
57
|
+
.toBe('8A7D83CA-3FA0-4D00-B34E-08C4FFA1E512');
|
|
58
|
+
});
|
|
59
|
+
it('should extract UUID from w1t2p0:UUID format', () => {
|
|
60
|
+
expect(extractItermUuid('w1t2p0:ABCDEF12-3456-7890-ABCD-EF1234567890'))
|
|
61
|
+
.toBe('ABCDEF12-3456-7890-ABCD-EF1234567890');
|
|
62
|
+
});
|
|
63
|
+
it('should return value as-is if no colon present', () => {
|
|
64
|
+
expect(extractItermUuid('8A7D83CA-3FA0-4D00-B34E-08C4FFA1E512'))
|
|
65
|
+
.toBe('8A7D83CA-3FA0-4D00-B34E-08C4FFA1E512');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// Integration-style tests that actually call exec.
|
|
69
|
+
// These will fail in CI but verify correct method dispatch.
|
|
70
|
+
// Use short timeout since these may hang on some platforms.
|
|
71
|
+
describe('method dispatch', () => {
|
|
72
|
+
it('should dispatch to iterm for ITERM prefix', async () => {
|
|
73
|
+
const result = await activateTerminal('ITERM:12345678-1234-1234-1234-123456789abc');
|
|
74
|
+
expect(result.method).toBe('iterm');
|
|
75
|
+
}, 3000);
|
|
76
|
+
it('should dispatch to kitty for KITTY prefix', async () => {
|
|
77
|
+
const result = await activateTerminal('KITTY:42');
|
|
78
|
+
expect(result.method).toBe('kitty');
|
|
79
|
+
}, 3000);
|
|
80
|
+
it('should dispatch to wezterm for WEZTERM prefix', async () => {
|
|
81
|
+
const result = await activateTerminal('WEZTERM:7');
|
|
82
|
+
expect(result.method).toBe('wezterm');
|
|
83
|
+
}, 3000);
|
|
84
|
+
it('should dispatch to iterm or terminal_app for TTY prefix', async () => {
|
|
85
|
+
const result = await activateTerminal('TTY:/dev/ttys003');
|
|
86
|
+
// activateByTTY tries iTerm2 first, then Terminal.app
|
|
87
|
+
expect(['iterm', 'terminal_app']).toContain(result.method);
|
|
88
|
+
}, 10000);
|
|
89
|
+
it('should dispatch to pid for PID prefix', async () => {
|
|
90
|
+
const result = await activateTerminal('PID:99999');
|
|
91
|
+
expect(result.method).toBe('pid');
|
|
92
|
+
}, 3000);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=terminal-activator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-activator.test.js","sourceRoot":"","sources":["../src/terminal-activator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Launcher
|
|
3
|
+
*
|
|
4
|
+
* Launches a new terminal window in a given directory and runs `claude` in it.
|
|
5
|
+
* Supports iTerm2, Terminal.app, Kitty, WezTerm, Windows Terminal, PowerShell,
|
|
6
|
+
* and GNOME Terminal. Auto-detects the best available terminal per platform.
|
|
7
|
+
*
|
|
8
|
+
* Once claude starts, the existing hook infrastructure (SessionStart) handles
|
|
9
|
+
* auto-registration — the new session appears in Jacques automatically.
|
|
10
|
+
*/
|
|
11
|
+
export type LaunchMethod = 'iterm' | 'terminal_app' | 'kitty' | 'wezterm' | 'gnome_terminal' | 'windows_terminal' | 'powershell' | 'unsupported';
|
|
12
|
+
export interface LaunchResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
method: LaunchMethod;
|
|
15
|
+
error?: string;
|
|
16
|
+
/** PID of the spawned terminal process (if detectable) */
|
|
17
|
+
pid?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface LaunchOptions {
|
|
20
|
+
/** Working directory to run claude in */
|
|
21
|
+
cwd: string;
|
|
22
|
+
/** Preferred terminal emulator (overrides auto-detection) */
|
|
23
|
+
preferredTerminal?: string;
|
|
24
|
+
/** Target display bounds for window positioning (used for display-targeted launching) */
|
|
25
|
+
targetBounds?: {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
};
|
|
31
|
+
/** Launch with --dangerously-skip-permissions flag */
|
|
32
|
+
dangerouslySkipPermissions?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Launch a new terminal session running `claude` in the given directory.
|
|
36
|
+
*
|
|
37
|
+
* Terminal detection priority:
|
|
38
|
+
* - macOS: iTerm2 → Kitty → WezTerm → Terminal.app
|
|
39
|
+
* - Windows: Windows Terminal → PowerShell
|
|
40
|
+
* - Linux: Kitty → WezTerm → GNOME Terminal
|
|
41
|
+
*/
|
|
42
|
+
export declare function launchTerminalSession(options: LaunchOptions): Promise<LaunchResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Detect the best available terminal emulator for the current platform.
|
|
45
|
+
*/
|
|
46
|
+
export declare function detectAvailableTerminal(): Promise<LaunchMethod>;
|
|
47
|
+
/**
|
|
48
|
+
* Check if a command is available on the system PATH.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isCommandOnPath(cmd: string): Promise<boolean>;
|
|
51
|
+
//# sourceMappingURL=terminal-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-launcher.d.ts","sourceRoot":"","sources":["../src/terminal-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,OAAO,GACP,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,aAAa,CAAC;AAElB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,YAAY,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,sDAAsD;IACtD,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAyBzF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,YAAY,CAAC,CAmBrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE"}
|