dmux 5.0.0 → 5.2.0

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.
Files changed (176) hide show
  1. package/README.md +44 -141
  2. package/dist/actions/implementations/closeAction.d.ts.map +1 -1
  3. package/dist/actions/implementations/closeAction.js +25 -20
  4. package/dist/actions/implementations/closeAction.js.map +1 -1
  5. package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
  6. package/dist/actions/implementations/mergeAction.js +2 -1
  7. package/dist/actions/implementations/mergeAction.js.map +1 -1
  8. package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
  9. package/dist/actions/merge/conflictResolution.js +2 -1
  10. package/dist/actions/merge/conflictResolution.js.map +1 -1
  11. package/dist/actions/merge/mergeExecution.d.ts.map +1 -1
  12. package/dist/actions/merge/mergeExecution.js +2 -1
  13. package/dist/actions/merge/mergeExecution.js.map +1 -1
  14. package/dist/components/dialogs/SettingsDialog.d.ts.map +1 -1
  15. package/dist/components/dialogs/SettingsDialog.js +3 -1
  16. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  17. package/dist/components/panes/MergePane.d.ts +1 -0
  18. package/dist/components/panes/MergePane.d.ts.map +1 -1
  19. package/dist/components/panes/MergePane.js +14 -3
  20. package/dist/components/panes/MergePane.js.map +1 -1
  21. package/dist/components/popups/projectSelectPopup.d.ts +7 -0
  22. package/dist/components/popups/projectSelectPopup.d.ts.map +1 -0
  23. package/dist/components/popups/projectSelectPopup.js +124 -0
  24. package/dist/components/popups/projectSelectPopup.js.map +1 -0
  25. package/dist/components/popups/settingsPopup.js +25 -8
  26. package/dist/components/popups/settingsPopup.js.map +1 -1
  27. package/dist/components/popups/shared/DirectoryList.d.ts +14 -0
  28. package/dist/components/popups/shared/DirectoryList.d.ts.map +1 -0
  29. package/dist/components/popups/shared/DirectoryList.js +46 -0
  30. package/dist/components/popups/shared/DirectoryList.js.map +1 -0
  31. package/dist/components/popups/shared/index.d.ts +1 -0
  32. package/dist/components/popups/shared/index.d.ts.map +1 -1
  33. package/dist/components/popups/shared/index.js +1 -0
  34. package/dist/components/popups/shared/index.js.map +1 -1
  35. package/dist/components/popups/shortcutsPopup.js +8 -9
  36. package/dist/components/popups/shortcutsPopup.js.map +1 -1
  37. package/dist/hooks/useAutoUpdater.d.ts.map +1 -1
  38. package/dist/hooks/useAutoUpdater.js +42 -23
  39. package/dist/hooks/useAutoUpdater.js.map +1 -1
  40. package/dist/hooks/useInputHandling.d.ts.map +1 -1
  41. package/dist/hooks/useInputHandling.js +25 -5
  42. package/dist/hooks/useInputHandling.js.map +1 -1
  43. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  44. package/dist/hooks/useWorktreeActions.js +16 -8
  45. package/dist/hooks/useWorktreeActions.js.map +1 -1
  46. package/dist/index.js +8 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/server/embedded-assets.d.ts.map +1 -1
  49. package/dist/server/embedded-assets.js +41 -30
  50. package/dist/server/embedded-assets.js.map +1 -1
  51. package/dist/services/AutoUpdater.d.ts +4 -0
  52. package/dist/services/AutoUpdater.d.ts.map +1 -1
  53. package/dist/services/AutoUpdater.js +23 -0
  54. package/dist/services/AutoUpdater.js.map +1 -1
  55. package/dist/services/PopupManager.d.ts +2 -1
  56. package/dist/services/PopupManager.d.ts.map +1 -1
  57. package/dist/services/PopupManager.js +31 -11
  58. package/dist/services/PopupManager.js.map +1 -1
  59. package/dist/services/TmuxService.d.ts +6 -1
  60. package/dist/services/TmuxService.d.ts.map +1 -1
  61. package/dist/services/TmuxService.js +11 -1
  62. package/dist/services/TmuxService.js.map +1 -1
  63. package/dist/services/WorktreeCleanupService.d.ts +22 -0
  64. package/dist/services/WorktreeCleanupService.d.ts.map +1 -0
  65. package/dist/services/WorktreeCleanupService.js +80 -0
  66. package/dist/services/WorktreeCleanupService.js.map +1 -0
  67. package/dist/types.d.ts +5 -1
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/utils/agentLaunch.d.ts +4 -0
  70. package/dist/utils/agentLaunch.d.ts.map +1 -1
  71. package/dist/utils/agentLaunch.js +24 -0
  72. package/dist/utils/agentLaunch.js.map +1 -1
  73. package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
  74. package/dist/utils/conflictResolutionPane.js +61 -23
  75. package/dist/utils/conflictResolutionPane.js.map +1 -1
  76. package/dist/utils/dirScanner.d.ts +30 -0
  77. package/dist/utils/dirScanner.d.ts.map +1 -0
  78. package/dist/utils/dirScanner.js +99 -0
  79. package/dist/utils/dirScanner.js.map +1 -0
  80. package/dist/utils/generated-agents-doc.d.ts +1 -1
  81. package/dist/utils/generated-agents-doc.js +1 -1
  82. package/dist/utils/git.d.ts +13 -0
  83. package/dist/utils/git.d.ts.map +1 -1
  84. package/dist/utils/git.js +20 -0
  85. package/dist/utils/git.js.map +1 -1
  86. package/dist/utils/hooks.d.ts.map +1 -1
  87. package/dist/utils/hooks.js +51 -19
  88. package/dist/utils/hooks.js.map +1 -1
  89. package/dist/utils/hooksDocs.d.ts +1 -1
  90. package/dist/utils/mergeExecution.d.ts.map +1 -1
  91. package/dist/utils/mergeExecution.js +6 -3
  92. package/dist/utils/mergeExecution.js.map +1 -1
  93. package/dist/utils/onboarding.d.ts +9 -0
  94. package/dist/utils/onboarding.d.ts.map +1 -0
  95. package/dist/utils/onboarding.js +110 -0
  96. package/dist/utils/onboarding.js.map +1 -0
  97. package/dist/utils/openRouterApiKeySetup.d.ts +28 -0
  98. package/dist/utils/openRouterApiKeySetup.d.ts.map +1 -0
  99. package/dist/utils/openRouterApiKeySetup.js +143 -0
  100. package/dist/utils/openRouterApiKeySetup.js.map +1 -0
  101. package/dist/utils/paneCreation.d.ts.map +1 -1
  102. package/dist/utils/paneCreation.js +116 -53
  103. package/dist/utils/paneCreation.js.map +1 -1
  104. package/dist/utils/promptStore.d.ts +7 -0
  105. package/dist/utils/promptStore.d.ts.map +1 -0
  106. package/dist/utils/promptStore.js +75 -0
  107. package/dist/utils/promptStore.js.map +1 -0
  108. package/dist/utils/reopenWorktree.d.ts.map +1 -1
  109. package/dist/utils/reopenWorktree.js +11 -4
  110. package/dist/utils/reopenWorktree.js.map +1 -1
  111. package/dist/utils/settingsManager.d.ts.map +1 -1
  112. package/dist/utils/settingsManager.js +59 -0
  113. package/dist/utils/settingsManager.js.map +1 -1
  114. package/dist/utils/tmux.d.ts +2 -1
  115. package/dist/utils/tmux.d.ts.map +1 -1
  116. package/dist/utils/tmux.js +3 -1
  117. package/dist/utils/tmux.js.map +1 -1
  118. package/dist/workers/updateChecker.js +21 -6
  119. package/dist/workers/updateChecker.js.map +1 -1
  120. package/package.json +5 -8
  121. package/dist/components/popups/remotePopup.d.ts +0 -6
  122. package/dist/components/popups/remotePopup.d.ts.map +0 -1
  123. package/dist/components/popups/remotePopup.js +0 -166
  124. package/dist/components/popups/remotePopup.js.map +0 -1
  125. package/dist/hooks/useTunnelManagement.d.ts +0 -18
  126. package/dist/hooks/useTunnelManagement.d.ts.map +0 -1
  127. package/dist/hooks/useTunnelManagement.js +0 -55
  128. package/dist/hooks/useTunnelManagement.js.map +0 -1
  129. package/dist/server/actionsApi.d.ts +0 -37
  130. package/dist/server/actionsApi.d.ts.map +0 -1
  131. package/dist/server/actionsApi.js +0 -256
  132. package/dist/server/actionsApi.js.map +0 -1
  133. package/dist/server/index.d.ts +0 -21
  134. package/dist/server/index.d.ts.map +0 -1
  135. package/dist/server/index.js +0 -100
  136. package/dist/server/index.js.map +0 -1
  137. package/dist/server/routes/actionsRoutes.d.ts +0 -2
  138. package/dist/server/routes/actionsRoutes.d.ts.map +0 -1
  139. package/dist/server/routes/actionsRoutes.js +0 -110
  140. package/dist/server/routes/actionsRoutes.js.map +0 -1
  141. package/dist/server/routes/healthRoutes.d.ts +0 -13
  142. package/dist/server/routes/healthRoutes.d.ts.map +0 -1
  143. package/dist/server/routes/healthRoutes.js +0 -70
  144. package/dist/server/routes/healthRoutes.js.map +0 -1
  145. package/dist/server/routes/index.d.ts +0 -8
  146. package/dist/server/routes/index.d.ts.map +0 -1
  147. package/dist/server/routes/index.js +0 -67
  148. package/dist/server/routes/index.js.map +0 -1
  149. package/dist/server/routes/keysRoutes.d.ts +0 -33
  150. package/dist/server/routes/keysRoutes.d.ts.map +0 -1
  151. package/dist/server/routes/keysRoutes.js +0 -128
  152. package/dist/server/routes/keysRoutes.js.map +0 -1
  153. package/dist/server/routes/panesRoutes.d.ts +0 -2
  154. package/dist/server/routes/panesRoutes.d.ts.map +0 -1
  155. package/dist/server/routes/panesRoutes.js +0 -414
  156. package/dist/server/routes/panesRoutes.js.map +0 -1
  157. package/dist/server/routes/settingsRoutes.d.ts +0 -94
  158. package/dist/server/routes/settingsRoutes.d.ts.map +0 -1
  159. package/dist/server/routes/settingsRoutes.js +0 -159
  160. package/dist/server/routes/settingsRoutes.js.map +0 -1
  161. package/dist/server/routes/streamRoutes.d.ts +0 -18
  162. package/dist/server/routes/streamRoutes.d.ts.map +0 -1
  163. package/dist/server/routes/streamRoutes.js +0 -87
  164. package/dist/server/routes/streamRoutes.js.map +0 -1
  165. package/dist/server/routes/tunnelRoutes.d.ts +0 -11
  166. package/dist/server/routes/tunnelRoutes.d.ts.map +0 -1
  167. package/dist/server/routes/tunnelRoutes.js +0 -28
  168. package/dist/server/routes/tunnelRoutes.js.map +0 -1
  169. package/dist/server/routes.d.ts +0 -17
  170. package/dist/server/routes.d.ts.map +0 -1
  171. package/dist/server/routes.js +0 -17
  172. package/dist/server/routes.js.map +0 -1
  173. package/dist/services/TunnelService.d.ts +0 -10
  174. package/dist/services/TunnelService.d.ts.map +0 -1
  175. package/dist/services/TunnelService.js +0 -98
  176. package/dist/services/TunnelService.js.map +0 -1
@@ -5,7 +5,7 @@
5
5
  * Hook scripts are stored in .dmux/hooks/ and receive context via environment variables.
6
6
  */
7
7
  import { execSync, spawn } from 'child_process';
8
- import { existsSync, accessSync, constants, mkdirSync, writeFileSync } from 'fs';
8
+ import { existsSync, accessSync, constants, mkdirSync, readFileSync, writeFileSync } from 'fs';
9
9
  import path from 'path';
10
10
  import os from 'os';
11
11
  import { HOOKS_DOCUMENTATION, HOOKS_README, EXAMPLE_HOOKS } from './hooksDocs.js';
@@ -62,7 +62,7 @@ export async function buildHookEnvironment(projectRoot, pane, extraData) {
62
62
  env.DMUX_TMUX_PANE_ID = pane.paneId;
63
63
  if (pane.worktreePath) {
64
64
  env.DMUX_WORKTREE_PATH = pane.worktreePath;
65
- env.DMUX_BRANCH = pane.slug; // Branch name matches slug
65
+ env.DMUX_BRANCH = pane.branchName || pane.slug; // Branch name (may differ from slug with prefix)
66
66
  }
67
67
  }
68
68
  // Add any extra data
@@ -197,32 +197,62 @@ export function listAvailableHooks(projectRoot) {
197
197
  */
198
198
  export function initializeHooksDirectory(projectRoot) {
199
199
  const hooksDir = path.join(projectRoot, '.dmux-hooks');
200
- // Skip if already initialized
201
- if (existsSync(path.join(hooksDir, 'AGENTS.md'))) {
200
+ const agentsPath = path.join(hooksDir, 'AGENTS.md');
201
+ const claudePath = path.join(hooksDir, 'CLAUDE.md');
202
+ const readmePath = path.join(hooksDir, 'README.md');
203
+ const examplesDir = path.join(hooksDir, 'examples');
204
+ const examplePaths = Object.keys(EXAMPLE_HOOKS).map((filename) => path.join(examplesDir, filename));
205
+ // Fast path for the common case: everything already initialized
206
+ if (existsSync(agentsPath)
207
+ && existsSync(claudePath)
208
+ && existsSync(readmePath)
209
+ && existsSync(examplesDir)
210
+ && examplePaths.every((examplePath) => existsSync(examplePath))) {
202
211
  return;
203
212
  }
204
- const initMsg = 'Initializing .dmux-hooks/ directory...';
213
+ const initMsg = 'Initializing .dmux-hooks/ directory (or repairing missing docs)...';
205
214
  LogService.getInstance().debug(initMsg, 'hooks');
206
215
  try {
216
+ let madeChanges = false;
207
217
  // Create main hooks directory
208
218
  if (!existsSync(hooksDir)) {
209
219
  mkdirSync(hooksDir, { recursive: true });
220
+ madeChanges = true;
210
221
  }
211
- // Write AGENTS.md (complete reference)
212
- writeFileSync(path.join(hooksDir, 'AGENTS.md'), HOOKS_DOCUMENTATION, 'utf-8');
213
- // Write CLAUDE.md (identical to AGENTS.md, just different filename for Claude Code)
214
- writeFileSync(path.join(hooksDir, 'CLAUDE.md'), HOOKS_DOCUMENTATION, 'utf-8');
215
- // Write README.md
216
- writeFileSync(path.join(hooksDir, 'README.md'), HOOKS_README, 'utf-8');
217
- // Create examples directory
218
- const examplesDir = path.join(hooksDir, 'examples');
222
+ // Ensure AGENTS.md (complete reference)
223
+ if (!existsSync(agentsPath)) {
224
+ writeFileSync(agentsPath, HOOKS_DOCUMENTATION, 'utf-8');
225
+ madeChanges = true;
226
+ }
227
+ // Ensure CLAUDE.md (prefer AGENTS.md content if present)
228
+ if (!existsSync(claudePath)) {
229
+ let claudeContent = HOOKS_DOCUMENTATION;
230
+ try {
231
+ claudeContent = readFileSync(agentsPath, 'utf-8');
232
+ }
233
+ catch {
234
+ // Keep default HOOKS_DOCUMENTATION fallback
235
+ }
236
+ writeFileSync(claudePath, claudeContent, 'utf-8');
237
+ madeChanges = true;
238
+ }
239
+ // Ensure README.md
240
+ if (!existsSync(readmePath)) {
241
+ writeFileSync(readmePath, HOOKS_README, 'utf-8');
242
+ madeChanges = true;
243
+ }
244
+ // Ensure examples directory
219
245
  if (!existsSync(examplesDir)) {
220
246
  mkdirSync(examplesDir, { recursive: true });
247
+ madeChanges = true;
221
248
  }
222
- // Write example hooks
249
+ // Ensure example hooks
223
250
  for (const [filename, content] of Object.entries(EXAMPLE_HOOKS)) {
224
251
  const examplePath = path.join(examplesDir, filename);
225
- writeFileSync(examplePath, content, 'utf-8');
252
+ if (!existsSync(examplePath)) {
253
+ writeFileSync(examplePath, content, 'utf-8');
254
+ madeChanges = true;
255
+ }
226
256
  // Make examples executable
227
257
  try {
228
258
  execSync(`chmod +x "${examplePath}"`, { stdio: 'pipe' });
@@ -231,10 +261,12 @@ export function initializeHooksDirectory(projectRoot) {
231
261
  // Ignore chmod errors (Windows, etc.)
232
262
  }
233
263
  }
234
- const completeMsg = '✅ Initialized .dmux-hooks/ with documentation and examples';
235
- const readmeMsg = '📝 Read AGENTS.md or CLAUDE.md to get started';
236
- LogService.getInstance().debug(completeMsg, 'hooks');
237
- LogService.getInstance().debug(readmeMsg, 'hooks');
264
+ if (madeChanges) {
265
+ const completeMsg = ' Initialized .dmux-hooks/ with documentation and examples';
266
+ const readmeMsg = '📝 Read AGENTS.md or CLAUDE.md to get started';
267
+ LogService.getInstance().debug(completeMsg, 'hooks');
268
+ LogService.getInstance().debug(readmeMsg, 'hooks');
269
+ }
238
270
  }
239
271
  catch (error) {
240
272
  const errMsg = `Failed to initialize .dmux-hooks/ directory: ${error instanceof Error ? error.message : String(error)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  * Main documentation - gets written as both AGENTS.md and CLAUDE.md
10
10
  * Different agents look for different filenames, but content is identical
11
11
  */
12
- export declare const HOOKS_DOCUMENTATION = "# dmux Hooks System - Agent Reference\n\n**Auto-generated documentation for AI agents**\n\nThis document contains everything an AI agent needs to create, modify, and understand dmux hooks. It is automatically generated from the dmux source code and embedded in the binary.\n\n## What You're Working On\n\nYou are editing hooks for **dmux**, a tmux pane manager that creates AI-powered development workflows. Each pane runs in its own git worktree with an AI agent (Claude Code or opencode).\n\n## Your Goal\n\nCreate executable bash scripts in `.dmux-hooks/` that run automatically at key lifecycle events.\n\n## Quick Start\n\n1. **Create a hook file**: `touch .dmux-hooks/worktree_created`\n2. **Make it executable**: `chmod +x .dmux-hooks/worktree_created`\n3. **Add shebang**: Start with `#!/bin/bash`\n4. **Use environment variables**: Access `$DMUX_ROOT`, `$DMUX_WORKTREE_PATH`, etc.\n5. **Test it**: Set env vars manually and run the script\n\n## Hook Execution Model\n\n- **Non-blocking**: Hooks run in background (detached processes)\n- **Silent failures**: Hook errors are logged but don't stop dmux\n- **Environment-based**: All context passed via environment variables\n- **Version controlled**: Hooks in `.dmux-hooks/` are shared with team\n- **Priority resolution**: `.dmux-hooks/` \u2192 `.dmux/hooks/` \u2192 `~/.dmux/hooks/`\n\n## Available Hooks\n\n### Pane Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `before_pane_create` | Before pane creation | Validation, notifications, pre-flight checks |\n| `pane_created` | After pane, before worktree | Configure tmux settings, prepare environment |\n| `worktree_created` | After full setup | Install deps, copy configs, setup git |\n| `before_pane_close` | Before closing | Save state, backup uncommitted work |\n| `pane_closed` | After closed | Cleanup resources, analytics, notifications |\n\n### Worktree Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `before_worktree_remove` | Before worktree removal | Archive worktree, save artifacts |\n| `worktree_removed` | After worktree removed | Cleanup external references |\n\n### Merge Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `pre_merge` | Before merge operation | Run final tests, create backups |\n| `post_merge` | After successful merge | Deploy, close issues, notify team |\n\n### Interactive Hooks (with HTTP callbacks)\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `run_test` | When tests triggered | Run test suite, report status via HTTP |\n| `run_dev` | When dev server triggered | Start dev server, create tunnel, report URL |\n\n\n## Environment Variables\n\n### Always Available\n```bash\nDMUX_ROOT=\"/path/to/project\" # Project root directory\nDMUX_SERVER_PORT=\"3142\" # HTTP server port\n```\n\n### Pane Context (most hooks)\n```bash\nDMUX_PANE_ID=\"dmux-1234567890\" # dmux pane identifier\nDMUX_SLUG=\"fix-auth-bug\" # Branch/worktree name\nDMUX_PROMPT=\"Fix authentication bug\" # User's prompt\nDMUX_AGENT=\"claude\" # Agent type (claude|opencode)\nDMUX_TMUX_PANE_ID=\"%38\" # tmux pane ID\n```\n\n### Worktree Context\n```bash\nDMUX_WORKTREE_PATH=\"/path/.dmux/worktrees/fix-auth-bug\"\nDMUX_BRANCH=\"fix-auth-bug\" # Same as slug\n```\n\n### Merge Context\n```bash\nDMUX_TARGET_BRANCH=\"main\" # Branch being merged into\n```\n\n## HTTP Callback API\n\nInteractive hooks (`run_test` and `run_dev`) can update dmux UI via HTTP.\n\n### Update Test Status\n```bash\ncurl -X PUT \"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/test\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\", \"output\": \"optional test output\"}'\n\n# Status values: \"running\" | \"passed\" | \"failed\"\n```\n\n### Update Dev Server\n```bash\ncurl -X PUT \"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/dev\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\", \"url\": \"http://localhost:3000\"}'\n\n# Status values: \"running\" | \"stopped\"\n# url: Can be localhost or tunnel URL (ngrok, cloudflared, etc.)\n```\n\n## Common Patterns\n\n### Pattern 1: Install Dependencies\n```bash\n#!/bin/bash\n# .dmux-hooks/worktree_created\n\ncd \"$DMUX_WORKTREE_PATH\"\n\nif [ -f \"pnpm-lock.yaml\" ]; then\n pnpm install --prefer-offline &\nelif [ -f \"package-lock.json\" ]; then\n npm install &\nelif [ -f \"yarn.lock\" ]; then\n yarn install &\nelif [ -f \"Gemfile\" ]; then\n bundle install &\nelif [ -f \"requirements.txt\" ]; then\n pip install -r requirements.txt &\nelif [ -f \"Cargo.toml\" ]; then\n cargo build &\nfi\n```\n\n### Pattern 2: Copy Configuration\n```bash\n#!/bin/bash\n# .dmux-hooks/worktree_created\n\n# Copy environment file\nif [ -f \"$DMUX_ROOT/.env.local\" ]; then\n cp \"$DMUX_ROOT/.env.local\" \"$DMUX_WORKTREE_PATH/.env.local\"\nfi\n\n# Copy other config files\nfor file in .env.development .npmrc .yarnrc; do\n if [ -f \"$DMUX_ROOT/$file\" ]; then\n cp \"$DMUX_ROOT/$file\" \"$DMUX_WORKTREE_PATH/$file\"\n fi\ndone\n```\n\n### Pattern 3: Run Tests with Status Updates\n```bash\n#!/bin/bash\n# .dmux-hooks/run_test\n\nset -e\ncd \"$DMUX_WORKTREE_PATH\"\nAPI=\"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/test\"\n\n# Update: starting\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\"}' > /dev/null\n\n# Run tests and capture output\nOUTPUT_FILE=\"/tmp/dmux-test-$DMUX_PANE_ID.txt\"\nif pnpm test > \"$OUTPUT_FILE\" 2>&1; then\n STATUS=\"passed\"\nelse\n STATUS=\"failed\"\nfi\n\n# Get output (truncate if too long)\nOUTPUT=$(head -c 5000 \"$OUTPUT_FILE\")\n\n# Update: complete\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d \"$(jq -n --arg status \"$STATUS\" --arg output \"$OUTPUT\" '{status: $status, output: $output}')\" > /dev/null\n\nrm -f \"$OUTPUT_FILE\"\n```\n\n### Pattern 4: Dev Server with Tunnel\n```bash\n#!/bin/bash\n# .dmux-hooks/run_dev\n\nset -e\ncd \"$DMUX_WORKTREE_PATH\"\nAPI=\"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/dev\"\n\n# Start dev server in background\nLOG_FILE=\"/tmp/dmux-dev-$DMUX_PANE_ID.log\"\npnpm dev > \"$LOG_FILE\" 2>&1 &\nDEV_PID=$!\n\n# Wait for server to start\nsleep 5\n\n# Detect port from logs\nPORT=$(grep -oP 'localhost:Kd+' \"$LOG_FILE\" | head -1)\n[ -z \"$PORT\" ] && PORT=3000\n\n# Optional: Create tunnel with cloudflared\nif command -v cloudflared &> /dev/null; then\n TUNNEL=$(cloudflared tunnel --url \"http://localhost:$PORT\" 2>&1 | grep -oP 'https://[a-z0-9-]+.trycloudflare.com' | head -1)\n URL=\"${TUNNEL:-http://localhost:$PORT}\"\nelse\n URL=\"http://localhost:$PORT\"\nfi\n\n# Report status\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d \"{\"status\": \"running\", \"url\": \"$URL\"}\" > /dev/null\n\necho \"[Hook] Dev server running at $URL (PID: $DEV_PID)\"\n```\n\n### Pattern 5: Post-Merge Deployment\n```bash\n#!/bin/bash\n# .dmux-hooks/post_merge\n\nset -e\ncd \"$DMUX_ROOT\"\n\n# Only deploy from main/master\nif [ \"$DMUX_TARGET_BRANCH\" != \"main\" ] && [ \"$DMUX_TARGET_BRANCH\" != \"master\" ]; then\n exit 0\nfi\n\n# Push to remote\ngit push origin \"$DMUX_TARGET_BRANCH\"\n\n# Trigger deployment (example: Vercel)\nif [ -n \"$VERCEL_TOKEN\" ]; then\n curl -s -X POST \"https://api.vercel.com/v1/deployments\" -H \"Authorization: Bearer $VERCEL_TOKEN\" -H \"Content-Type: application/json\" -d '{\"name\": \"my-project\"}' > /dev/null\nfi\n\n# Close GitHub issue if prompt contains #123\nISSUE=$(echo \"$DMUX_PROMPT\" | grep -oP '#Kd+' | head -1)\nif [ -n \"$ISSUE\" ] && command -v gh &> /dev/null; then\n gh issue close \"$ISSUE\" -c \"Resolved in $DMUX_SLUG, merged to $DMUX_TARGET_BRANCH\" 2>/dev/null || true\nfi\n```\n\n## Best Practices\n\n1. **Always start with shebang**: `#!/bin/bash`\n2. **Set error handling**: `set -e` (exit on error)\n3. **Make executable**: `chmod +x .dmux-hooks/hook_name`\n4. **Background long operations**: Append `&` to avoid blocking\n5. **Check for required tools**: `command -v tool &> /dev/null`\n6. **Log for debugging**: `echo \"[Hook] message\" >> \"$DMUX_ROOT/.dmux/hooks.log\"`\n7. **Handle missing vars gracefully**: `[ -z \"$VAR\" ] && exit 0`\n8. **Use silent curl**: `curl -s` to avoid noise in logs\n9. **Clean up temp files**: Remove files in `/tmp/`\n10. **Test before committing**: Run hooks manually with mock env vars\n\n## Testing Hooks\n\n### Manual Testing\n```bash\n# 1. Set environment variables\nexport DMUX_ROOT=\"$(pwd)\"\nexport DMUX_PANE_ID=\"test-pane\"\nexport DMUX_SLUG=\"test-branch\"\nexport DMUX_WORKTREE_PATH=\"$(pwd)\"\nexport DMUX_SERVER_PORT=\"3142\"\nexport DMUX_AGENT=\"claude\"\nexport DMUX_PROMPT=\"Test prompt\"\n\n# 2. Run hook directly\n./.dmux-hooks/worktree_created\n\n# 3. Check exit code\necho $? # Should be 0 for success\n```\n\n### Syntax Check\n```bash\n# Check for syntax errors without running\nbash -n ./.dmux-hooks/worktree_created\n```\n\n### Shellcheck (if available)\n```bash\nshellcheck ./.dmux-hooks/worktree_created\n```\n\n## Project Context Analysis\n\nBefore creating hooks, analyze these files in the project:\n\n### Package Manager Detection\n```bash\n# Check which package manager is used\nif [ -f \"pnpm-lock.yaml\" ]; then\n # Use: pnpm install, pnpm test, pnpm dev\nelif [ -f \"package-lock.json\" ]; then\n # Use: npm install, npm test, npm run dev\nelif [ -f \"yarn.lock\" ]; then\n # Use: yarn install, yarn test, yarn dev\nfi\n```\n\n### Test Command Discovery\n```bash\n# Read package.json to find test command\ncat package.json | grep '\"test\"'\n# Or with jq:\njq -r '.scripts.test' package.json\n```\n\n### Dev Command Discovery\n```bash\n# Read package.json to find dev command\ncat package.json | grep '\"dev\"'\n# Or with jq:\njq -r '.scripts.dev' package.json\n```\n\n### Environment Variables\n```bash\n# Check for .env files to copy\nls -la | grep '.env'\n```\n\n### Build System\n```bash\n# Detect build system\nif [ -f \"vite.config.ts\" ]; then\n # Vite project\nelif [ -f \"next.config.js\" ]; then\n # Next.js project\nelif [ -f \"nuxt.config.ts\" ]; then\n # Nuxt project\nfi\n```\n\n## Common Mistakes to Avoid\n\n\u274C **Blocking operations**: `sleep 60` (blocks dmux)\n\u2705 **Background long tasks**: `slow_operation &`\n\n\u274C **Hardcoded paths**: `/Users/me/project`\n\u2705 **Use variables**: `\"$DMUX_ROOT\"`\n\n\u274C **Assuming tools exist**: `pnpm install`\n\u2705 **Check first**: `command -v pnpm && pnpm install`\n\n\u274C **No error handling**: Script fails silently\n\u2705 **Set error mode**: `set -e` or check exit codes\n\n\u274C **Forgetting executable bit**: Hook won't run\n\u2705 **Make executable**: `chmod +x`\n\n\u274C **Noisy output**: Clutters dmux logs\n\u2705 **Silent operations**: `curl -s`, `> /dev/null 2>&1`\n\n\u274C **Not testing**: Deploy and hope\n\u2705 **Test manually**: Run with mock env vars first\n\n## Debugging\n\nIf a hook isn't working:\n\n1. **Check if file exists**: `ls -la .dmux-hooks/`\n2. **Check permissions**: Should show `x` in `rwxr-xr-x`\n3. **Check syntax**: `bash -n .dmux-hooks/hook_name`\n4. **Test manually**: Set env vars and run\n5. **Check logs**: dmux logs to stderr with `[Hooks]` prefix\n6. **Simplify**: Remove complex parts, test basic version\n7. **Check tool availability**: `command -v required_tool`\n\n### Debug Mode\n```bash\n#!/bin/bash\n# Add to top of hook for debugging\nset -x # Print each command before executing\nset -e # Exit on error\n\n# Your hook logic here\n```\n\n## Summary Checklist\n\nWhen creating a new hook:\n\n- [ ] Create file in `.dmux-hooks/`\n- [ ] Add shebang: `#!/bin/bash`\n- [ ] Make executable: `chmod +x`\n- [ ] Add `set -e` for error handling\n- [ ] Use environment variables (never hardcode paths)\n- [ ] Background long operations with `&`\n- [ ] Check for required tools before using\n- [ ] Test manually with mock env vars\n- [ ] Add comments explaining what it does\n- [ ] Commit to version control\n\n## Getting Help\n\n- **Full documentation**: See `HOOKS.md` in project root\n- **Claude-specific tips**: See `CLAUDE.md` in `.dmux-hooks/`\n- **Examples**: Check `.dmux-hooks/examples/` directory\n- **dmux API**: See `API.md` for REST endpoints\n\n---\n\n*This documentation was auto-generated from dmux source code.*\n*Version: 2026-02-17*\n";
12
+ export declare const HOOKS_DOCUMENTATION = "# dmux Hooks System - Agent Reference\n\n**Auto-generated documentation for AI agents**\n\nThis document contains everything an AI agent needs to create, modify, and understand dmux hooks. It is automatically generated from the dmux source code and embedded in the binary.\n\n## What You're Working On\n\nYou are editing hooks for **dmux**, a tmux pane manager that creates AI-powered development workflows. Each pane runs in its own git worktree with an AI agent (Claude Code or opencode).\n\n## Your Goal\n\nCreate executable bash scripts in `.dmux-hooks/` that run automatically at key lifecycle events.\n\n## Quick Start\n\n1. **Create a hook file**: `touch .dmux-hooks/worktree_created`\n2. **Make it executable**: `chmod +x .dmux-hooks/worktree_created`\n3. **Add shebang**: Start with `#!/bin/bash`\n4. **Use environment variables**: Access `$DMUX_ROOT`, `$DMUX_WORKTREE_PATH`, etc.\n5. **Test it**: Set env vars manually and run the script\n\n## Hook Execution Model\n\n- **Non-blocking**: Hooks run in background (detached processes)\n- **Silent failures**: Hook errors are logged but don't stop dmux\n- **Environment-based**: All context passed via environment variables\n- **Version controlled**: Hooks in `.dmux-hooks/` are shared with team\n- **Priority resolution**: `.dmux-hooks/` \u2192 `.dmux/hooks/` \u2192 `~/.dmux/hooks/`\n\n## Available Hooks\n\n### Pane Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `before_pane_create` | Before pane creation | Validation, notifications, pre-flight checks |\n| `pane_created` | After pane, before worktree | Configure tmux settings, prepare environment |\n| `worktree_created` | After full setup | Install deps, copy configs, setup git |\n| `before_pane_close` | Before closing | Save state, backup uncommitted work |\n| `pane_closed` | After closed | Cleanup resources, analytics, notifications |\n\n### Worktree Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `before_worktree_remove` | Before worktree removal | Archive worktree, save artifacts |\n| `worktree_removed` | After worktree removed | Cleanup external references |\n\n### Merge Lifecycle Hooks\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `pre_merge` | Before merge operation | Run final tests, create backups |\n| `post_merge` | After successful merge | Deploy, close issues, notify team |\n\n### Interactive Hooks (with HTTP callbacks)\n\n| Hook | When | Common Use Cases |\n|------|------|------------------|\n| `run_test` | When tests triggered | Run test suite, report status via HTTP |\n| `run_dev` | When dev server triggered | Start dev server, create tunnel, report URL |\n\n\n## Environment Variables\n\n### Always Available\n```bash\nDMUX_ROOT=\"/path/to/project\" # Project root directory\nDMUX_SERVER_PORT=\"3142\" # HTTP server port\n```\n\n### Pane Context (most hooks)\n```bash\nDMUX_PANE_ID=\"dmux-1234567890\" # dmux pane identifier\nDMUX_SLUG=\"fix-auth-bug\" # Branch/worktree name\nDMUX_PROMPT=\"Fix authentication bug\" # User's prompt\nDMUX_AGENT=\"claude\" # Agent type (claude|opencode)\nDMUX_TMUX_PANE_ID=\"%38\" # tmux pane ID\n```\n\n### Worktree Context\n```bash\nDMUX_WORKTREE_PATH=\"/path/.dmux/worktrees/fix-auth-bug\"\nDMUX_BRANCH=\"fix-auth-bug\" # Same as slug\n```\n\n### Merge Context\n```bash\nDMUX_TARGET_BRANCH=\"main\" # Branch being merged into\n```\n\n## HTTP Callback API\n\nInteractive hooks (`run_test` and `run_dev`) can update dmux UI via HTTP.\n\n### Update Test Status\n```bash\ncurl -X PUT \"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/test\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\", \"output\": \"optional test output\"}'\n\n# Status values: \"running\" | \"passed\" | \"failed\"\n```\n\n### Update Dev Server\n```bash\ncurl -X PUT \"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/dev\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\", \"url\": \"http://localhost:3000\"}'\n\n# Status values: \"running\" | \"stopped\"\n# url: Can be localhost or tunnel URL (ngrok, cloudflared, etc.)\n```\n\n## Common Patterns\n\n### Pattern 1: Install Dependencies\n```bash\n#!/bin/bash\n# .dmux-hooks/worktree_created\n\ncd \"$DMUX_WORKTREE_PATH\"\n\nif [ -f \"pnpm-lock.yaml\" ]; then\n pnpm install --prefer-offline &\nelif [ -f \"package-lock.json\" ]; then\n npm install &\nelif [ -f \"yarn.lock\" ]; then\n yarn install &\nelif [ -f \"Gemfile\" ]; then\n bundle install &\nelif [ -f \"requirements.txt\" ]; then\n pip install -r requirements.txt &\nelif [ -f \"Cargo.toml\" ]; then\n cargo build &\nfi\n```\n\n### Pattern 2: Copy Configuration\n```bash\n#!/bin/bash\n# .dmux-hooks/worktree_created\n\n# Copy environment file\nif [ -f \"$DMUX_ROOT/.env.local\" ]; then\n cp \"$DMUX_ROOT/.env.local\" \"$DMUX_WORKTREE_PATH/.env.local\"\nfi\n\n# Copy other config files\nfor file in .env.development .npmrc .yarnrc; do\n if [ -f \"$DMUX_ROOT/$file\" ]; then\n cp \"$DMUX_ROOT/$file\" \"$DMUX_WORKTREE_PATH/$file\"\n fi\ndone\n```\n\n### Pattern 3: Run Tests with Status Updates\n```bash\n#!/bin/bash\n# .dmux-hooks/run_test\n\nset -e\ncd \"$DMUX_WORKTREE_PATH\"\nAPI=\"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/test\"\n\n# Update: starting\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d '{\"status\": \"running\"}' > /dev/null\n\n# Run tests and capture output\nOUTPUT_FILE=\"/tmp/dmux-test-$DMUX_PANE_ID.txt\"\nif pnpm test > \"$OUTPUT_FILE\" 2>&1; then\n STATUS=\"passed\"\nelse\n STATUS=\"failed\"\nfi\n\n# Get output (truncate if too long)\nOUTPUT=$(head -c 5000 \"$OUTPUT_FILE\")\n\n# Update: complete\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d \"$(jq -n --arg status \"$STATUS\" --arg output \"$OUTPUT\" '{status: $status, output: $output}')\" > /dev/null\n\nrm -f \"$OUTPUT_FILE\"\n```\n\n### Pattern 4: Dev Server with Tunnel\n```bash\n#!/bin/bash\n# .dmux-hooks/run_dev\n\nset -e\ncd \"$DMUX_WORKTREE_PATH\"\nAPI=\"http://localhost:$DMUX_SERVER_PORT/api/panes/$DMUX_PANE_ID/dev\"\n\n# Start dev server in background\nLOG_FILE=\"/tmp/dmux-dev-$DMUX_PANE_ID.log\"\npnpm dev > \"$LOG_FILE\" 2>&1 &\nDEV_PID=$!\n\n# Wait for server to start\nsleep 5\n\n# Detect port from logs\nPORT=$(grep -oP 'localhost:Kd+' \"$LOG_FILE\" | head -1)\n[ -z \"$PORT\" ] && PORT=3000\n\n# Optional: Create tunnel with cloudflared\nif command -v cloudflared &> /dev/null; then\n TUNNEL=$(cloudflared tunnel --url \"http://localhost:$PORT\" 2>&1 | grep -oP 'https://[a-z0-9-]+.trycloudflare.com' | head -1)\n URL=\"${TUNNEL:-http://localhost:$PORT}\"\nelse\n URL=\"http://localhost:$PORT\"\nfi\n\n# Report status\ncurl -s -X PUT \"$API\" -H \"Content-Type: application/json\" -d \"{\"status\": \"running\", \"url\": \"$URL\"}\" > /dev/null\n\necho \"[Hook] Dev server running at $URL (PID: $DEV_PID)\"\n```\n\n### Pattern 5: Post-Merge Deployment\n```bash\n#!/bin/bash\n# .dmux-hooks/post_merge\n\nset -e\ncd \"$DMUX_ROOT\"\n\n# Only deploy from main/master\nif [ \"$DMUX_TARGET_BRANCH\" != \"main\" ] && [ \"$DMUX_TARGET_BRANCH\" != \"master\" ]; then\n exit 0\nfi\n\n# Push to remote\ngit push origin \"$DMUX_TARGET_BRANCH\"\n\n# Trigger deployment (example: Vercel)\nif [ -n \"$VERCEL_TOKEN\" ]; then\n curl -s -X POST \"https://api.vercel.com/v1/deployments\" -H \"Authorization: Bearer $VERCEL_TOKEN\" -H \"Content-Type: application/json\" -d '{\"name\": \"my-project\"}' > /dev/null\nfi\n\n# Close GitHub issue if prompt contains #123\nISSUE=$(echo \"$DMUX_PROMPT\" | grep -oP '#Kd+' | head -1)\nif [ -n \"$ISSUE\" ] && command -v gh &> /dev/null; then\n gh issue close \"$ISSUE\" -c \"Resolved in $DMUX_SLUG, merged to $DMUX_TARGET_BRANCH\" 2>/dev/null || true\nfi\n```\n\n## Best Practices\n\n1. **Always start with shebang**: `#!/bin/bash`\n2. **Set error handling**: `set -e` (exit on error)\n3. **Make executable**: `chmod +x .dmux-hooks/hook_name`\n4. **Background long operations**: Append `&` to avoid blocking\n5. **Check for required tools**: `command -v tool &> /dev/null`\n6. **Log for debugging**: `echo \"[Hook] message\" >> \"$DMUX_ROOT/.dmux/hooks.log\"`\n7. **Handle missing vars gracefully**: `[ -z \"$VAR\" ] && exit 0`\n8. **Use silent curl**: `curl -s` to avoid noise in logs\n9. **Clean up temp files**: Remove files in `/tmp/`\n10. **Test before committing**: Run hooks manually with mock env vars\n\n## Testing Hooks\n\n### Manual Testing\n```bash\n# 1. Set environment variables\nexport DMUX_ROOT=\"$(pwd)\"\nexport DMUX_PANE_ID=\"test-pane\"\nexport DMUX_SLUG=\"test-branch\"\nexport DMUX_WORKTREE_PATH=\"$(pwd)\"\nexport DMUX_SERVER_PORT=\"3142\"\nexport DMUX_AGENT=\"claude\"\nexport DMUX_PROMPT=\"Test prompt\"\n\n# 2. Run hook directly\n./.dmux-hooks/worktree_created\n\n# 3. Check exit code\necho $? # Should be 0 for success\n```\n\n### Syntax Check\n```bash\n# Check for syntax errors without running\nbash -n ./.dmux-hooks/worktree_created\n```\n\n### Shellcheck (if available)\n```bash\nshellcheck ./.dmux-hooks/worktree_created\n```\n\n## Project Context Analysis\n\nBefore creating hooks, analyze these files in the project:\n\n### Package Manager Detection\n```bash\n# Check which package manager is used\nif [ -f \"pnpm-lock.yaml\" ]; then\n # Use: pnpm install, pnpm test, pnpm dev\nelif [ -f \"package-lock.json\" ]; then\n # Use: npm install, npm test, npm run dev\nelif [ -f \"yarn.lock\" ]; then\n # Use: yarn install, yarn test, yarn dev\nfi\n```\n\n### Test Command Discovery\n```bash\n# Read package.json to find test command\ncat package.json | grep '\"test\"'\n# Or with jq:\njq -r '.scripts.test' package.json\n```\n\n### Dev Command Discovery\n```bash\n# Read package.json to find dev command\ncat package.json | grep '\"dev\"'\n# Or with jq:\njq -r '.scripts.dev' package.json\n```\n\n### Environment Variables\n```bash\n# Check for .env files to copy\nls -la | grep '.env'\n```\n\n### Build System\n```bash\n# Detect build system\nif [ -f \"vite.config.ts\" ]; then\n # Vite project\nelif [ -f \"next.config.js\" ]; then\n # Next.js project\nelif [ -f \"nuxt.config.ts\" ]; then\n # Nuxt project\nfi\n```\n\n## Common Mistakes to Avoid\n\n\u274C **Blocking operations**: `sleep 60` (blocks dmux)\n\u2705 **Background long tasks**: `slow_operation &`\n\n\u274C **Hardcoded paths**: `/Users/me/project`\n\u2705 **Use variables**: `\"$DMUX_ROOT\"`\n\n\u274C **Assuming tools exist**: `pnpm install`\n\u2705 **Check first**: `command -v pnpm && pnpm install`\n\n\u274C **No error handling**: Script fails silently\n\u2705 **Set error mode**: `set -e` or check exit codes\n\n\u274C **Forgetting executable bit**: Hook won't run\n\u2705 **Make executable**: `chmod +x`\n\n\u274C **Noisy output**: Clutters dmux logs\n\u2705 **Silent operations**: `curl -s`, `> /dev/null 2>&1`\n\n\u274C **Not testing**: Deploy and hope\n\u2705 **Test manually**: Run with mock env vars first\n\n## Debugging\n\nIf a hook isn't working:\n\n1. **Check if file exists**: `ls -la .dmux-hooks/`\n2. **Check permissions**: Should show `x` in `rwxr-xr-x`\n3. **Check syntax**: `bash -n .dmux-hooks/hook_name`\n4. **Test manually**: Set env vars and run\n5. **Check logs**: dmux logs to stderr with `[Hooks]` prefix\n6. **Simplify**: Remove complex parts, test basic version\n7. **Check tool availability**: `command -v required_tool`\n\n### Debug Mode\n```bash\n#!/bin/bash\n# Add to top of hook for debugging\nset -x # Print each command before executing\nset -e # Exit on error\n\n# Your hook logic here\n```\n\n## Summary Checklist\n\nWhen creating a new hook:\n\n- [ ] Create file in `.dmux-hooks/`\n- [ ] Add shebang: `#!/bin/bash`\n- [ ] Make executable: `chmod +x`\n- [ ] Add `set -e` for error handling\n- [ ] Use environment variables (never hardcode paths)\n- [ ] Background long operations with `&`\n- [ ] Check for required tools before using\n- [ ] Test manually with mock env vars\n- [ ] Add comments explaining what it does\n- [ ] Commit to version control\n\n## Getting Help\n\n- **Full documentation**: See `HOOKS.md` in project root\n- **Claude-specific tips**: See `CLAUDE.md` in `.dmux-hooks/`\n- **Examples**: Check `.dmux-hooks/examples/` directory\n- **dmux API**: See `API.md` for REST endpoints\n\n---\n\n*This documentation was auto-generated from dmux source code.*\n*Version: 2026-02-21*\n";
13
13
  /**
14
14
  * README for the .dmux-hooks/ directory
15
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mergeExecution.d.ts","sourceRoot":"","sources":["../../src/utils/mergeExecution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,WAAW,CAsCb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,WAAW,CA4Bb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAajF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAaxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CA2B7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYvD"}
1
+ {"version":3,"file":"mergeExecution.d.ts","sourceRoot":"","sources":["../../src/utils/mergeExecution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,WAAW,CAsCb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,WAAW,CA4Bb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAajF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAaxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CA2B7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYvD"}
@@ -4,13 +4,14 @@
4
4
  * Handles the actual merge operations with proper error handling
5
5
  */
6
6
  import { execSync } from 'child_process';
7
+ import { cleanupPromptFilesForSlug } from './promptStore.js';
7
8
  /**
8
9
  * Merge main branch into worktree branch
9
10
  * This is step 1 of the two-phase merge: get latest changes from main
10
11
  */
11
12
  export function mergeMainIntoWorktree(worktreePath, mainBranch) {
12
13
  try {
13
- execSync(`git merge ${mainBranch} --no-edit`, {
14
+ execSync(`git merge "${mainBranch}" --no-edit`, {
14
15
  cwd: worktreePath,
15
16
  stdio: 'pipe',
16
17
  });
@@ -48,7 +49,7 @@ export function mergeMainIntoWorktree(worktreePath, mainBranch) {
48
49
  */
49
50
  export function mergeWorktreeIntoMain(mainRepoPath, worktreeBranch) {
50
51
  try {
51
- execSync(`git merge ${worktreeBranch} --no-edit`, {
52
+ execSync(`git merge "${worktreeBranch}" --no-edit`, {
52
53
  cwd: mainRepoPath,
53
54
  stdio: 'pipe',
54
55
  });
@@ -167,10 +168,12 @@ export function cleanupAfterMerge(mainRepoPath, worktreePath, branchName) {
167
168
  stdio: 'pipe',
168
169
  });
169
170
  // Delete branch (use -d for safety, it will fail if not merged)
170
- execSync(`git branch -d ${branchName}`, {
171
+ execSync(`git branch -d "${branchName}"`, {
171
172
  cwd: mainRepoPath,
172
173
  stdio: 'pipe',
173
174
  });
175
+ // Best-effort cleanup for any prompt artifacts associated with this branch.
176
+ void cleanupPromptFilesForSlug(mainRepoPath, branchName);
174
177
  return { success: true };
175
178
  }
176
179
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"mergeExecution.js","sourceRoot":"","sources":["../../src/utils/mergeExecution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mergeExecution.js","sourceRoot":"","sources":["../../src/utils/mergeExecution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAS7D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,UAAU,aAAa,EAAE;YAC9C,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,iCAAiC;QACjC,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,gDAAgD;YAChD,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAExD,8DAA8D;YAC9D,0DAA0D;YAC1D,UAAU,CAAC,YAAY,CAAC,CAAC;YAEzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B;gBACjC,aAAa;gBACb,qBAAqB,EAAE,IAAI;aAC5B,CAAC;QACJ,CAAC;QAED,8DAA8D;QAC9D,IAAI,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoB,EACpB,cAAsB;IAEtB,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,cAAc,aAAa,EAAE;YAClD,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,+EAA+E;QAC/E,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oCAAoC;gBAC3C,aAAa;gBACb,qBAAqB,EAAE,IAAI;aAC5B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,sCAAsC,EAAE;YAC9D,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,QAAQ,CAAC,mBAAmB,EAAE;YAC5B,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE;YACpC,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAgB;IAC9D,IAAI,CAAC;QACH,sCAAsC;QACtC,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sCAAsC;gBAC7C,aAAa;gBACb,qBAAqB,EAAE,IAAI;aAC5B,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,SAAS,GAAG,OAAO,IAAI,sCAAsC,CAAC;QACpE,QAAQ,CAAC,kBAAkB,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE;YAC5D,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAC;QACH,kBAAkB;QAClB,QAAQ,CAAC,wBAAwB,YAAY,WAAW,EAAE;YACxD,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,gEAAgE;QAChE,QAAQ,CAAC,kBAAkB,UAAU,GAAG,EAAE;YACxC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,4EAA4E;QAC5E,KAAK,yBAAyB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAEzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,oBAAoB,EAAE;YAC5C,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function runOpenRouterApiKeyOnboardingIfNeeded(): Promise<void>;
2
+ /**
3
+ * Run all first-run onboarding checks in one place.
4
+ * This currently includes:
5
+ * - tmux config suggestion/setup
6
+ * - OpenRouter API key setup
7
+ */
8
+ export declare function runFirstRunOnboardingIfNeeded(): Promise<void>;
9
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/utils/onboarding.ts"],"names":[],"mappings":"AA6DA,wBAAsB,qCAAqC,IAAI,OAAO,CAAC,IAAI,CAAC,CA6D3E;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAGnE"}
@@ -0,0 +1,110 @@
1
+ import chalk from 'chalk';
2
+ import os from 'os';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { Writable } from 'stream';
5
+ import { LogService } from '../services/LogService.js';
6
+ import { runTmuxConfigOnboardingIfNeeded } from './tmuxConfigOnboarding.js';
7
+ import { hasCompletedOpenRouterOnboarding, persistOpenRouterApiKeyToShell, writeOpenRouterOnboardingState, } from './openRouterApiKeySetup.js';
8
+ async function promptYesNo(question, defaultYes = true) {
9
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
10
+ return false;
11
+ }
12
+ const suffix = defaultYes ? '[Y/n]' : '[y/N]';
13
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
14
+ try {
15
+ const answer = (await rl.question(`${question} ${suffix} `)).trim().toLowerCase();
16
+ if (!answer)
17
+ return defaultYes;
18
+ if (answer === 'y' || answer === 'yes')
19
+ return true;
20
+ if (answer === 'n' || answer === 'no')
21
+ return false;
22
+ return defaultYes;
23
+ }
24
+ finally {
25
+ rl.close();
26
+ }
27
+ }
28
+ async function promptHiddenInput(question) {
29
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
30
+ return '';
31
+ }
32
+ let muted = false;
33
+ const output = new Writable({
34
+ write(chunk, _encoding, callback) {
35
+ if (!muted) {
36
+ process.stdout.write(typeof chunk === 'string' ? chunk : chunk.toString());
37
+ }
38
+ callback();
39
+ },
40
+ });
41
+ const rl = createInterface({ input: process.stdin, output, terminal: true });
42
+ try {
43
+ muted = false;
44
+ const answerPromise = rl.question(`${question} `);
45
+ muted = true;
46
+ const answer = await answerPromise;
47
+ muted = false;
48
+ process.stdout.write('\n');
49
+ return answer.trim();
50
+ }
51
+ finally {
52
+ muted = false;
53
+ rl.close();
54
+ }
55
+ }
56
+ export async function runOpenRouterApiKeyOnboardingIfNeeded() {
57
+ const logger = LogService.getInstance();
58
+ try {
59
+ const homeDir = process.env.HOME || os.homedir();
60
+ if (!homeDir) {
61
+ return;
62
+ }
63
+ const existingApiKey = process.env.OPENROUTER_API_KEY?.trim();
64
+ if (existingApiKey) {
65
+ await writeOpenRouterOnboardingState(homeDir, 'existing-env');
66
+ return;
67
+ }
68
+ const completed = await hasCompletedOpenRouterOnboarding(homeDir);
69
+ if (completed) {
70
+ return;
71
+ }
72
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
73
+ logger.debug('Skipping OpenRouter API key onboarding because terminal is non-interactive', 'onboarding');
74
+ return;
75
+ }
76
+ const shouldConfigure = await promptYesNo('OPENROUTER_API_KEY is not set. Configure it now to enable AI-powered features?', true);
77
+ if (!shouldConfigure) {
78
+ await writeOpenRouterOnboardingState(homeDir, 'skip');
79
+ return;
80
+ }
81
+ const apiKey = await promptHiddenInput('Enter your OpenRouter API key:');
82
+ if (!apiKey) {
83
+ console.log(chalk.yellow('Skipping OpenRouter setup (no API key entered).'));
84
+ await writeOpenRouterOnboardingState(homeDir, 'skip');
85
+ return;
86
+ }
87
+ const { shellConfigPath } = await persistOpenRouterApiKeyToShell(apiKey, {
88
+ shellPath: process.env.SHELL,
89
+ homeDir,
90
+ });
91
+ process.env.OPENROUTER_API_KEY = apiKey;
92
+ await writeOpenRouterOnboardingState(homeDir, 'configured', shellConfigPath);
93
+ console.log(chalk.green(`Saved OPENROUTER_API_KEY to ${shellConfigPath}`));
94
+ console.log(chalk.yellow(`Run 'source ${shellConfigPath}' or open a new shell to load it globally.`));
95
+ }
96
+ catch (error) {
97
+ logger.warn(`OpenRouter onboarding failed: ${error instanceof Error ? error.message : String(error)}`, 'onboarding');
98
+ }
99
+ }
100
+ /**
101
+ * Run all first-run onboarding checks in one place.
102
+ * This currently includes:
103
+ * - tmux config suggestion/setup
104
+ * - OpenRouter API key setup
105
+ */
106
+ export async function runFirstRunOnboardingIfNeeded() {
107
+ await runTmuxConfigOnboardingIfNeeded();
108
+ await runOpenRouterApiKeyOnboardingIfNeeded();
109
+ }
110
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/utils/onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type OpenRouterOnboardingOutcome = 'existing-env' | 'configured' | 'skip';
2
+ interface OpenRouterOnboardingEntry {
3
+ completed: boolean;
4
+ completedAt: string;
5
+ outcome: OpenRouterOnboardingOutcome;
6
+ shellConfigPath?: string;
7
+ }
8
+ interface OnboardingState {
9
+ openRouterApiKeyOnboarding?: OpenRouterOnboardingEntry;
10
+ [key: string]: unknown;
11
+ }
12
+ export declare function getShellConfigCandidates(shellPath: string | undefined, homeDir: string): string[];
13
+ export declare function resolveShellConfigPath(shellPath: string | undefined, homeDir: string): Promise<string>;
14
+ export declare function buildOpenRouterExportLine(apiKey: string, shellPath?: string): string;
15
+ export declare function upsertOpenRouterKeyBlock(existingContent: string, exportLine: string): string;
16
+ export declare function persistOpenRouterApiKeyToShell(apiKey: string, options?: {
17
+ shellPath?: string;
18
+ homeDir?: string;
19
+ }): Promise<{
20
+ shellConfigPath: string;
21
+ exportLine: string;
22
+ }>;
23
+ export declare function getOnboardingStatePath(homeDir: string): string;
24
+ export declare function readOnboardingState(homeDir: string): Promise<OnboardingState>;
25
+ export declare function hasCompletedOpenRouterOnboarding(homeDir: string): Promise<boolean>;
26
+ export declare function writeOpenRouterOnboardingState(homeDir: string, outcome: OpenRouterOnboardingOutcome, shellConfigPath?: string): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=openRouterApiKeySetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openRouterApiKeySetup.d.ts","sourceRoot":"","sources":["../../src/utils/openRouterApiKeySetup.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,2BAA2B,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;AAEjF,UAAU,yBAAyB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,2BAA2B,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,eAAe;IACvB,0BAA0B,CAAC,EAAE,yBAAyB,CAAC;IACvD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAoCD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBjG;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5G;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpF;AAED,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAsB5F;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAanF;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxF;AAED,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,2BAA2B,EACpC,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,143 @@
1
+ import fs from 'fs/promises';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ const ONBOARDING_STATE_RELATIVE_PATH = path.join('.dmux', 'onboarding.json');
5
+ const OPENROUTER_BLOCK_START = '# >>> dmux openrouter >>>';
6
+ const OPENROUTER_BLOCK_END = '# <<< dmux openrouter <<<';
7
+ function escapeRegex(value) {
8
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
9
+ }
10
+ function quoteForPosix(value) {
11
+ return `'${value.replace(/'/g, `'\\''`)}'`;
12
+ }
13
+ function quoteForFish(value) {
14
+ const escaped = value
15
+ .replace(/\\/g, '\\\\')
16
+ .replace(/"/g, '\\"')
17
+ .replace(/\$/g, '\\$')
18
+ .replace(/`/g, '\\`');
19
+ return `"${escaped}"`;
20
+ }
21
+ function isFishShell(shellPath) {
22
+ return path.basename(shellPath || '').toLowerCase().includes('fish');
23
+ }
24
+ async function fileExists(filePath) {
25
+ try {
26
+ const stats = await fs.stat(filePath);
27
+ return stats.isFile();
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export function getShellConfigCandidates(shellPath, homeDir) {
34
+ const shellName = path.basename(shellPath || '').toLowerCase();
35
+ if (shellName.includes('zsh')) {
36
+ return [
37
+ path.join(homeDir, '.zshrc'),
38
+ path.join(homeDir, '.zprofile'),
39
+ ];
40
+ }
41
+ if (shellName.includes('bash')) {
42
+ return [
43
+ path.join(homeDir, '.bashrc'),
44
+ path.join(homeDir, '.bash_profile'),
45
+ path.join(homeDir, '.profile'),
46
+ ];
47
+ }
48
+ if (shellName.includes('fish')) {
49
+ return [
50
+ path.join(homeDir, '.config', 'fish', 'config.fish'),
51
+ ];
52
+ }
53
+ return [path.join(homeDir, '.profile')];
54
+ }
55
+ export async function resolveShellConfigPath(shellPath, homeDir) {
56
+ const candidates = getShellConfigCandidates(shellPath, homeDir);
57
+ for (const candidate of candidates) {
58
+ if (await fileExists(candidate)) {
59
+ return candidate;
60
+ }
61
+ }
62
+ return candidates[0];
63
+ }
64
+ export function buildOpenRouterExportLine(apiKey, shellPath) {
65
+ const trimmedKey = apiKey.trim();
66
+ if (isFishShell(shellPath)) {
67
+ return `set -gx OPENROUTER_API_KEY ${quoteForFish(trimmedKey)}`;
68
+ }
69
+ return `export OPENROUTER_API_KEY=${quoteForPosix(trimmedKey)}`;
70
+ }
71
+ export function upsertOpenRouterKeyBlock(existingContent, exportLine) {
72
+ const normalizedContent = existingContent.replace(/\r\n/g, '\n');
73
+ const block = `${OPENROUTER_BLOCK_START}\n${exportLine}\n${OPENROUTER_BLOCK_END}`;
74
+ const blockPattern = new RegExp(`${escapeRegex(OPENROUTER_BLOCK_START)}[\\s\\S]*?${escapeRegex(OPENROUTER_BLOCK_END)}\\n?`, 'm');
75
+ if (blockPattern.test(normalizedContent)) {
76
+ const replaced = normalizedContent.replace(blockPattern, `${block}\n`);
77
+ return replaced.endsWith('\n') ? replaced : `${replaced}\n`;
78
+ }
79
+ if (!normalizedContent) {
80
+ return `${block}\n`;
81
+ }
82
+ const withTrailingNewline = normalizedContent.endsWith('\n')
83
+ ? normalizedContent
84
+ : `${normalizedContent}\n`;
85
+ return `${withTrailingNewline}\n${block}\n`;
86
+ }
87
+ export async function persistOpenRouterApiKeyToShell(apiKey, options) {
88
+ const homeDir = options?.homeDir || process.env.HOME || os.homedir();
89
+ if (!homeDir) {
90
+ throw new Error('Unable to determine HOME directory');
91
+ }
92
+ const shellPath = options?.shellPath || process.env.SHELL;
93
+ const shellConfigPath = await resolveShellConfigPath(shellPath, homeDir);
94
+ let existingContent = '';
95
+ try {
96
+ existingContent = await fs.readFile(shellConfigPath, 'utf-8');
97
+ }
98
+ catch {
99
+ // Expected if shell config does not exist yet
100
+ }
101
+ const exportLine = buildOpenRouterExportLine(apiKey, shellPath);
102
+ const updatedContent = upsertOpenRouterKeyBlock(existingContent, exportLine);
103
+ await fs.mkdir(path.dirname(shellConfigPath), { recursive: true });
104
+ await fs.writeFile(shellConfigPath, updatedContent, 'utf-8');
105
+ return { shellConfigPath, exportLine };
106
+ }
107
+ export function getOnboardingStatePath(homeDir) {
108
+ return path.join(homeDir, ONBOARDING_STATE_RELATIVE_PATH);
109
+ }
110
+ export async function readOnboardingState(homeDir) {
111
+ const statePath = getOnboardingStatePath(homeDir);
112
+ try {
113
+ const raw = await fs.readFile(statePath, 'utf-8');
114
+ const parsed = JSON.parse(raw);
115
+ if (parsed && typeof parsed === 'object') {
116
+ return parsed;
117
+ }
118
+ }
119
+ catch {
120
+ // Expected if onboarding state doesn't exist yet
121
+ }
122
+ return {};
123
+ }
124
+ export async function hasCompletedOpenRouterOnboarding(homeDir) {
125
+ const state = await readOnboardingState(homeDir);
126
+ return state.openRouterApiKeyOnboarding?.completed === true;
127
+ }
128
+ export async function writeOpenRouterOnboardingState(homeDir, outcome, shellConfigPath) {
129
+ const statePath = getOnboardingStatePath(homeDir);
130
+ const currentState = await readOnboardingState(homeDir);
131
+ const nextState = {
132
+ ...currentState,
133
+ openRouterApiKeyOnboarding: {
134
+ completed: true,
135
+ completedAt: new Date().toISOString(),
136
+ outcome,
137
+ ...(shellConfigPath ? { shellConfigPath } : {}),
138
+ },
139
+ };
140
+ await fs.mkdir(path.dirname(statePath), { recursive: true });
141
+ await fs.writeFile(statePath, JSON.stringify(nextState, null, 2), 'utf-8');
142
+ }
143
+ //# sourceMappingURL=openRouterApiKeySetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openRouterApiKeySetup.js","sourceRoot":"","sources":["../../src/utils/openRouterApiKeySetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC7E,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAC3D,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAEzD,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,SAAkB;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAA6B,EAAE,OAAe;IACrF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE/D,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAA6B,EAAE,OAAe;IACzF,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEhE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc,EAAE,SAAkB;IAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,8BAA8B,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,6BAA6B,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,eAAuB,EAAE,UAAkB;IAClF,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,sBAAsB,KAAK,UAAU,KAAK,oBAAoB,EAAE,CAAC;IAClF,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,GAAG,WAAW,CAAC,sBAAsB,CAAC,aAAa,WAAW,CAAC,oBAAoB,CAAC,MAAM,EAC1F,GAAG,CACJ,CAAC;IAEF,IAAI,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,GAAG,KAAK,IAAI,CAAC;IACtB,CAAC;IAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1D,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,GAAG,iBAAiB,IAAI,CAAC;IAE7B,OAAO,GAAG,mBAAmB,KAAK,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAc,EACd,OAAkD;IAElD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1D,MAAM,eAAe,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,wBAAwB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAE7E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe;IACvD,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,OAAe;IACpE,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,0BAA0B,EAAE,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAAe,EACf,OAAoC,EACpC,eAAwB;IAExB,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAExD,MAAM,SAAS,GAAoB;QACjC,GAAG,YAAY;QACf,0BAA0B,EAAE;YAC1B,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO;YACP,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD;KACF,CAAC;IAEF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAiBxD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAgBD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAqb3B"}
1
+ {"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAsBxD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAgBD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA+e3B"}