@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,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Discovery
|
|
3
|
+
*
|
|
4
|
+
* Finds and resolves metadata for JSONL session files in Claude's project directories.
|
|
5
|
+
* Uses a catalog-first strategy: reads pre-extracted metadata from Jacques session index
|
|
6
|
+
* when available, falls back to JSONL parsing for uncataloged sessions.
|
|
7
|
+
*
|
|
8
|
+
* @module connection/session-discovery
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import { encodeProjectPath, getClaudeProjectsDir, parseJSONLContent, parseJSONL, getEntryStatistics, } from '@jacques-ai/core/session';
|
|
13
|
+
import { detectModeAndPlans, } from '@jacques-ai/core/cache';
|
|
14
|
+
import { ACTIVE_SESSION_THRESHOLD_MS, DEFAULT_CONTEXT_WINDOW_SIZE, } from './constants.js';
|
|
15
|
+
import { detectGitInfo } from './git-info.js';
|
|
16
|
+
/**
|
|
17
|
+
* Resolve metadata for a session file using catalog-first strategy.
|
|
18
|
+
*
|
|
19
|
+
* Priority 1: Use pre-extracted catalog metadata (fast, no file I/O)
|
|
20
|
+
* Priority 2: Fall back to JSONL parsing (slow, reads full file)
|
|
21
|
+
*/
|
|
22
|
+
async function resolveSessionMetadata(filePath, sessionId, modifiedAt, cwd, catalogMap) {
|
|
23
|
+
// Priority 1: Use existing Jacques catalog metadata
|
|
24
|
+
const catalogEntry = catalogMap.get(sessionId);
|
|
25
|
+
if (catalogEntry) {
|
|
26
|
+
let contextMetrics = null;
|
|
27
|
+
if (catalogEntry.tokens && catalogEntry.tokens.input > 0) {
|
|
28
|
+
const contextWindowSize = DEFAULT_CONTEXT_WINDOW_SIZE;
|
|
29
|
+
const usedPercentage = (catalogEntry.tokens.input / contextWindowSize) * 100;
|
|
30
|
+
contextMetrics = {
|
|
31
|
+
used_percentage: Math.min(usedPercentage, 100),
|
|
32
|
+
remaining_percentage: Math.max(100 - usedPercentage, 0),
|
|
33
|
+
context_window_size: contextWindowSize,
|
|
34
|
+
total_input_tokens: catalogEntry.tokens.input,
|
|
35
|
+
total_output_tokens: catalogEntry.tokens.output,
|
|
36
|
+
is_estimate: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Always use live git detection for discovered sessions — catalog git info
|
|
40
|
+
// may be stale (e.g., detected from decoded project path instead of actual worktree)
|
|
41
|
+
const gitInfo = await detectGitInfo(cwd);
|
|
42
|
+
const gitBranch = gitInfo.branch || catalogEntry.gitBranch || null;
|
|
43
|
+
const gitWorktree = gitInfo.worktree || catalogEntry.gitWorktree || null;
|
|
44
|
+
const gitRepoRoot = gitInfo.repoRoot || catalogEntry.gitRepoRoot || null;
|
|
45
|
+
return {
|
|
46
|
+
filePath,
|
|
47
|
+
sessionId,
|
|
48
|
+
modifiedAt,
|
|
49
|
+
gitBranch,
|
|
50
|
+
gitWorktree,
|
|
51
|
+
gitRepoRoot,
|
|
52
|
+
title: catalogEntry.title,
|
|
53
|
+
contextMetrics,
|
|
54
|
+
mode: catalogEntry.mode || null,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Priority 2: Fall back to JSONL parsing for uncataloged sessions
|
|
58
|
+
const metadata = await extractSessionMetadataFromJSONL(filePath);
|
|
59
|
+
if (!metadata.sessionId) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const gitInfo = await detectGitInfo(cwd);
|
|
63
|
+
const mode = await detectSessionModeFromJSONL(filePath);
|
|
64
|
+
return {
|
|
65
|
+
filePath,
|
|
66
|
+
sessionId: metadata.sessionId,
|
|
67
|
+
modifiedAt,
|
|
68
|
+
gitBranch: metadata.gitBranch || gitInfo.branch,
|
|
69
|
+
gitWorktree: gitInfo.worktree,
|
|
70
|
+
gitRepoRoot: gitInfo.repoRoot,
|
|
71
|
+
title: metadata.title,
|
|
72
|
+
// Don't estimate context for discovered sessions - show null until hooks fire
|
|
73
|
+
contextMetrics: null,
|
|
74
|
+
mode,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find all active session files for a given CWD.
|
|
79
|
+
* Uses catalog-first strategy: reads from Jacques session index when available,
|
|
80
|
+
* falls back to JSONL parsing for uncataloged sessions.
|
|
81
|
+
*
|
|
82
|
+
* @param cwd Working directory to find sessions for
|
|
83
|
+
* @param catalogMap Pre-loaded session catalog (sessionId -> SessionEntry)
|
|
84
|
+
* @returns Sessions modified within ACTIVE_SESSION_THRESHOLD_MS, sorted by recency
|
|
85
|
+
*/
|
|
86
|
+
export async function findActiveSessionFiles(cwd, catalogMap) {
|
|
87
|
+
const projectDir = getProjectDir(cwd);
|
|
88
|
+
try {
|
|
89
|
+
await fs.access(projectDir);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const files = await fs.readdir(projectDir);
|
|
96
|
+
const jsonlFiles = files.filter((f) => f.endsWith('.jsonl'));
|
|
97
|
+
if (jsonlFiles.length === 0) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
const activeSessions = [];
|
|
102
|
+
for (const filename of jsonlFiles) {
|
|
103
|
+
const filePath = path.join(projectDir, filename);
|
|
104
|
+
const stats = await fs.stat(filePath);
|
|
105
|
+
const mtime = stats.mtime.getTime();
|
|
106
|
+
if (now - mtime <= ACTIVE_SESSION_THRESHOLD_MS) {
|
|
107
|
+
const sessionId = path.basename(filename, '.jsonl');
|
|
108
|
+
const resolved = await resolveSessionMetadata(filePath, sessionId, stats.mtime, cwd, catalogMap);
|
|
109
|
+
if (resolved) {
|
|
110
|
+
activeSessions.push(resolved);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Sort by modification time (most recent first)
|
|
115
|
+
activeSessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
|
|
116
|
+
return activeSessions;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Find the most recent session file for a CWD (fallback for inactive detection).
|
|
124
|
+
* Uses catalog-first strategy when available.
|
|
125
|
+
*
|
|
126
|
+
* @param cwd Working directory to find sessions for
|
|
127
|
+
* @param catalogMap Pre-loaded session catalog (sessionId -> SessionEntry)
|
|
128
|
+
*/
|
|
129
|
+
export async function findMostRecentSessionFile(cwd, catalogMap) {
|
|
130
|
+
const projectDir = getProjectDir(cwd);
|
|
131
|
+
try {
|
|
132
|
+
await fs.access(projectDir);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const files = await fs.readdir(projectDir);
|
|
139
|
+
const jsonlFiles = files.filter((f) => f.endsWith('.jsonl'));
|
|
140
|
+
if (jsonlFiles.length === 0) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
// Find most recent file
|
|
144
|
+
let mostRecent = null;
|
|
145
|
+
for (const filename of jsonlFiles) {
|
|
146
|
+
const filePath = path.join(projectDir, filename);
|
|
147
|
+
const stats = await fs.stat(filePath);
|
|
148
|
+
if (!mostRecent || stats.mtime > mostRecent.mtime) {
|
|
149
|
+
mostRecent = { filePath, mtime: stats.mtime, filename };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (!mostRecent) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const sessionId = path.basename(mostRecent.filename, '.jsonl');
|
|
156
|
+
return resolveSessionMetadata(mostRecent.filePath, sessionId, mostRecent.mtime, cwd, catalogMap);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Find the N most recently modified session files for a CWD, regardless of activity threshold.
|
|
164
|
+
* Used when there are more running processes than active session files to discover idle sessions.
|
|
165
|
+
*
|
|
166
|
+
* @param cwd Working directory to find sessions for
|
|
167
|
+
* @param catalogMap Pre-loaded session catalog (sessionId -> SessionEntry)
|
|
168
|
+
* @param count Maximum number of files to return
|
|
169
|
+
* @param excludeIds Session IDs to skip (already registered)
|
|
170
|
+
* @returns Up to `count` most recent session files, sorted by recency
|
|
171
|
+
*/
|
|
172
|
+
export async function findRecentSessionFiles(cwd, catalogMap, count, excludeIds) {
|
|
173
|
+
const projectDir = getProjectDir(cwd);
|
|
174
|
+
try {
|
|
175
|
+
await fs.access(projectDir);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const files = await fs.readdir(projectDir);
|
|
182
|
+
const jsonlFiles = files.filter((f) => f.endsWith('.jsonl'));
|
|
183
|
+
if (jsonlFiles.length === 0) {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
// Stat all files and sort by recency
|
|
187
|
+
const fileStats = [];
|
|
188
|
+
for (const filename of jsonlFiles) {
|
|
189
|
+
const sessionId = path.basename(filename, '.jsonl');
|
|
190
|
+
if (excludeIds.has(sessionId))
|
|
191
|
+
continue;
|
|
192
|
+
const filePath = path.join(projectDir, filename);
|
|
193
|
+
const stats = await fs.stat(filePath);
|
|
194
|
+
fileStats.push({ filePath, mtime: stats.mtime, filename });
|
|
195
|
+
}
|
|
196
|
+
// Sort by most recent first, take top N
|
|
197
|
+
fileStats.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
198
|
+
const topN = fileStats.slice(0, count);
|
|
199
|
+
const results = [];
|
|
200
|
+
for (const { filePath, mtime, filename } of topN) {
|
|
201
|
+
const sessionId = path.basename(filename, '.jsonl');
|
|
202
|
+
const resolved = await resolveSessionMetadata(filePath, sessionId, mtime, cwd, catalogMap);
|
|
203
|
+
if (resolved) {
|
|
204
|
+
results.push(resolved);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return results;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ============================================================
|
|
214
|
+
// Internal Helpers
|
|
215
|
+
// ============================================================
|
|
216
|
+
/**
|
|
217
|
+
* Get the Claude project directory for a given CWD
|
|
218
|
+
*/
|
|
219
|
+
function getProjectDir(cwd) {
|
|
220
|
+
const claudeDir = getClaudeProjectsDir();
|
|
221
|
+
const encodedPath = encodeProjectPath(cwd);
|
|
222
|
+
return path.join(claudeDir, encodedPath);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Detect session mode (planning/execution) from JSONL file
|
|
226
|
+
*/
|
|
227
|
+
async function detectSessionModeFromJSONL(filePath) {
|
|
228
|
+
try {
|
|
229
|
+
const entries = await parseJSONL(filePath);
|
|
230
|
+
if (entries.length === 0)
|
|
231
|
+
return null;
|
|
232
|
+
const { mode } = detectModeAndPlans(entries);
|
|
233
|
+
return mode;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Extract session metadata from JSONL file (fallback for uncataloged sessions)
|
|
241
|
+
*/
|
|
242
|
+
async function extractSessionMetadataFromJSONL(filePath) {
|
|
243
|
+
try {
|
|
244
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
245
|
+
const lines = content.split('\n').filter((l) => l.trim());
|
|
246
|
+
let sessionId = null;
|
|
247
|
+
let gitBranch = null;
|
|
248
|
+
let title = null;
|
|
249
|
+
// Parse first few lines to get session metadata
|
|
250
|
+
for (let i = 0; i < Math.min(lines.length, 50); i++) {
|
|
251
|
+
try {
|
|
252
|
+
const entry = JSON.parse(lines[i]);
|
|
253
|
+
if (!sessionId && entry.sessionId) {
|
|
254
|
+
sessionId = entry.sessionId;
|
|
255
|
+
}
|
|
256
|
+
if (!gitBranch && entry.data?.gitBranch) {
|
|
257
|
+
gitBranch = entry.data.gitBranch;
|
|
258
|
+
}
|
|
259
|
+
if (!title && entry.type === 'user' && entry.message?.content) {
|
|
260
|
+
const userContent = typeof entry.message.content === 'string'
|
|
261
|
+
? entry.message.content
|
|
262
|
+
: entry.message.content[0]?.text || '';
|
|
263
|
+
if (userContent &&
|
|
264
|
+
!userContent.trim().startsWith('<local-command') &&
|
|
265
|
+
!userContent.trim().startsWith('<command-')) {
|
|
266
|
+
title = userContent.split('\n')[0].slice(0, 60);
|
|
267
|
+
if (userContent.length > 60) {
|
|
268
|
+
title += '...';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (sessionId && gitBranch && title)
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Parse full content for statistics
|
|
280
|
+
let contextMetrics = null;
|
|
281
|
+
try {
|
|
282
|
+
const entries = parseJSONLContent(content);
|
|
283
|
+
const stats = getEntryStatistics(entries);
|
|
284
|
+
if (stats.lastInputTokens > 0) {
|
|
285
|
+
const contextWindowSize = DEFAULT_CONTEXT_WINDOW_SIZE;
|
|
286
|
+
const usedPercentage = (stats.lastInputTokens / contextWindowSize) * 100;
|
|
287
|
+
contextMetrics = {
|
|
288
|
+
used_percentage: Math.min(usedPercentage, 100),
|
|
289
|
+
remaining_percentage: Math.max(100 - usedPercentage, 0),
|
|
290
|
+
context_window_size: contextWindowSize,
|
|
291
|
+
total_input_tokens: stats.totalInputTokens,
|
|
292
|
+
total_output_tokens: stats.totalOutputTokens,
|
|
293
|
+
is_estimate: true,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Statistics extraction failed, metrics remain null
|
|
299
|
+
}
|
|
300
|
+
return { sessionId, gitBranch, title, contextMetrics };
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
return {
|
|
304
|
+
sessionId: null,
|
|
305
|
+
gitBranch: null,
|
|
306
|
+
title: null,
|
|
307
|
+
contextMetrics: null,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=session-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-discovery.js","sourceRoot":"","sources":["../../src/connection/session-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Key Utilities
|
|
3
|
+
*
|
|
4
|
+
* Unified parsing, building, and matching of terminal key identifiers.
|
|
5
|
+
* Terminal keys uniquely identify terminal sessions across different terminal emulators.
|
|
6
|
+
*
|
|
7
|
+
* @module connection/terminal-key
|
|
8
|
+
*/
|
|
9
|
+
import { TerminalKeyPrefix } from './constants.js';
|
|
10
|
+
/**
|
|
11
|
+
* Parsed terminal key structure
|
|
12
|
+
*/
|
|
13
|
+
export interface ParsedTerminalKey {
|
|
14
|
+
/** The terminal key prefix (ITERM, TTY, PID, etc.) */
|
|
15
|
+
prefix: TerminalKeyPrefix;
|
|
16
|
+
/** The value portion after the prefix */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Extracted PID if present in the key */
|
|
19
|
+
pid?: number;
|
|
20
|
+
/** Extracted UUID for iTerm keys */
|
|
21
|
+
uuid?: string;
|
|
22
|
+
/** Extracted TTY path */
|
|
23
|
+
tty?: string;
|
|
24
|
+
/** True if key has DISCOVERED: wrapper */
|
|
25
|
+
isDiscovered: boolean;
|
|
26
|
+
/** For DISCOVERED keys, the parsed inner key */
|
|
27
|
+
innerKey?: ParsedTerminalKey;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Information needed to build a terminal key
|
|
31
|
+
*/
|
|
32
|
+
export interface TerminalIdentity {
|
|
33
|
+
/** iTerm2 session ID (e.g., "w0t0p0:UUID") */
|
|
34
|
+
itermSessionId?: string;
|
|
35
|
+
/** TTY device path (e.g., "/dev/ttys001") */
|
|
36
|
+
tty?: string;
|
|
37
|
+
/** Process ID */
|
|
38
|
+
pid?: number;
|
|
39
|
+
/** Kitty window ID */
|
|
40
|
+
kittyWindowId?: string;
|
|
41
|
+
/** WezTerm pane ID */
|
|
42
|
+
weztermPaneId?: string;
|
|
43
|
+
/** Windows Terminal session ID */
|
|
44
|
+
wtSession?: string;
|
|
45
|
+
/** Terminal.app session ID */
|
|
46
|
+
termSessionId?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse a terminal key string into its components.
|
|
50
|
+
*
|
|
51
|
+
* Handles all key formats:
|
|
52
|
+
* - ITERM:w0t0p0:UUID or ITERM:UUID
|
|
53
|
+
* - TTY:/dev/ttys001
|
|
54
|
+
* - PID:12345
|
|
55
|
+
* - KITTY:42
|
|
56
|
+
* - WEZTERM:pane:0
|
|
57
|
+
* - DISCOVERED:TTY:ttys001:12345
|
|
58
|
+
* - AUTO:session-uuid
|
|
59
|
+
*
|
|
60
|
+
* @param key The terminal key string to parse
|
|
61
|
+
* @returns Parsed terminal key structure
|
|
62
|
+
*/
|
|
63
|
+
export declare function parseTerminalKey(key: string): ParsedTerminalKey;
|
|
64
|
+
/**
|
|
65
|
+
* Build a terminal key string from identity information.
|
|
66
|
+
*
|
|
67
|
+
* Priority order:
|
|
68
|
+
* 1. iTerm session ID
|
|
69
|
+
* 2. Kitty window ID
|
|
70
|
+
* 3. WezTerm pane ID
|
|
71
|
+
* 4. Windows Terminal session
|
|
72
|
+
* 5. TTY path
|
|
73
|
+
* 6. PID (fallback)
|
|
74
|
+
*
|
|
75
|
+
* @param info Terminal identity information
|
|
76
|
+
* @returns Terminal key string or null if no valid identity
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildTerminalKey(info: TerminalIdentity): string | null;
|
|
79
|
+
/**
|
|
80
|
+
* Extract PID from a terminal key if present.
|
|
81
|
+
*
|
|
82
|
+
* Handles formats:
|
|
83
|
+
* - PID:12345
|
|
84
|
+
* - DISCOVERED:PID:12345
|
|
85
|
+
* - DISCOVERED:TTY:ttys001:12345 (PID at end)
|
|
86
|
+
*
|
|
87
|
+
* @param key Terminal key string
|
|
88
|
+
* @returns PID number or null if not extractable
|
|
89
|
+
*/
|
|
90
|
+
export declare function extractPid(key: string): number | null;
|
|
91
|
+
/**
|
|
92
|
+
* Extract the UUID from an iTerm session ID or terminal key.
|
|
93
|
+
*
|
|
94
|
+
* iTerm's ITERM_SESSION_ID format is "w0t0p0:UUID" where:
|
|
95
|
+
* - w0 = window index
|
|
96
|
+
* - t0 = tab index
|
|
97
|
+
* - p0 = pane index
|
|
98
|
+
* - UUID = unique session identifier
|
|
99
|
+
*
|
|
100
|
+
* AppleScript's `unique ID of session` returns just the UUID portion.
|
|
101
|
+
*
|
|
102
|
+
* @param value The iTerm session ID value (after ITERM: prefix) or full key
|
|
103
|
+
* @returns The UUID portion, or the input if no colon present
|
|
104
|
+
*/
|
|
105
|
+
export declare function extractItermUuid(value: string): string;
|
|
106
|
+
/**
|
|
107
|
+
* Check if two terminal keys refer to the same terminal.
|
|
108
|
+
*
|
|
109
|
+
* Handles special cases:
|
|
110
|
+
* - iTerm keys match by UUID (ignoring w0t0p0 prefix differences)
|
|
111
|
+
* - DISCOVERED: wrapper is unwrapped for comparison
|
|
112
|
+
* - Exact string match as fallback
|
|
113
|
+
*
|
|
114
|
+
* @param keyA First terminal key
|
|
115
|
+
* @param keyB Second terminal key
|
|
116
|
+
* @returns True if keys match the same terminal
|
|
117
|
+
*/
|
|
118
|
+
export declare function matchTerminalKeys(keyA: string, keyB: string): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Get a human-readable description of a terminal key.
|
|
121
|
+
*
|
|
122
|
+
* @param key Terminal key string
|
|
123
|
+
* @returns Human-readable description
|
|
124
|
+
*/
|
|
125
|
+
export declare function describeTerminalKey(key: string): string;
|
|
126
|
+
//# sourceMappingURL=terminal-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-key.d.ts","sourceRoot":"","sources":["../../src/connection/terminal-key.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,YAAY,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAyB/D;AA+DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAuBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAqCrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyBvD"}
|