aimux-cli 0.1.16 → 0.1.19

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 (357) hide show
  1. package/README.md +184 -67
  2. package/bin/aimux-dev +10 -0
  3. package/dist/agent-events.js +0 -1
  4. package/dist/agent-output-parser.js +0 -1
  5. package/dist/agent-prompt-delivery.js +0 -1
  6. package/dist/agent-tracker.js +0 -1
  7. package/dist/agent-watcher.js +0 -1
  8. package/dist/alert-display.d.ts +21 -0
  9. package/dist/alert-display.js +85 -0
  10. package/dist/atomic-write.js +0 -1
  11. package/dist/attachment-store.d.ts +0 -7
  12. package/dist/attachment-store.js +2 -87
  13. package/dist/builtin-metadata-watchers.js +4 -5
  14. package/dist/claude-hooks.d.ts +1 -0
  15. package/dist/claude-hooks.js +25 -1
  16. package/dist/config.d.ts +19 -13
  17. package/dist/config.js +28 -15
  18. package/dist/connection-targets.d.ts +8 -0
  19. package/dist/connection-targets.js +27 -0
  20. package/dist/context/compactor.js +0 -1
  21. package/dist/context/context-bridge.js +0 -1
  22. package/dist/context/context-file.js +0 -1
  23. package/dist/context/history.js +0 -1
  24. package/dist/credentials.d.ts +12 -0
  25. package/dist/credentials.js +48 -0
  26. package/dist/daemon.d.ts +23 -0
  27. package/dist/daemon.js +391 -67
  28. package/dist/dashboard/command-spec.js +0 -1
  29. package/dist/dashboard/feedback.js +0 -1
  30. package/dist/dashboard/index.d.ts +13 -10
  31. package/dist/dashboard/index.js +3 -27
  32. package/dist/dashboard/operation-failures.js +0 -1
  33. package/dist/dashboard/order.d.ts +22 -0
  34. package/dist/dashboard/order.js +54 -0
  35. package/dist/dashboard/pending-actions.d.ts +39 -10
  36. package/dist/dashboard/pending-actions.js +166 -37
  37. package/dist/dashboard/quick-jump.d.ts +2 -1
  38. package/dist/dashboard/quick-jump.js +7 -5
  39. package/dist/dashboard/runtime-evidence.js +0 -1
  40. package/dist/dashboard/session-actions.d.ts +4 -4
  41. package/dist/dashboard/session-actions.js +1 -2
  42. package/dist/dashboard/session-registry.d.ts +4 -3
  43. package/dist/dashboard/session-registry.js +16 -51
  44. package/dist/dashboard/sort.js +0 -1
  45. package/dist/dashboard/state.d.ts +1 -1
  46. package/dist/dashboard/state.js +0 -1
  47. package/dist/dashboard/targets.js +0 -1
  48. package/dist/dashboard/ui-state-store.d.ts +16 -1
  49. package/dist/dashboard/ui-state-store.js +73 -3
  50. package/dist/debug-state.d.ts +97 -0
  51. package/dist/debug-state.js +540 -0
  52. package/dist/debug.d.ts +38 -0
  53. package/dist/debug.js +219 -16
  54. package/dist/default-plugins/gh-pr-context.d.ts +2 -1
  55. package/dist/default-plugins/gh-pr-context.js +17 -12
  56. package/dist/default-plugins/transcript-length.js +15 -3
  57. package/dist/fast-control.js +37 -20
  58. package/dist/hotkeys.js +0 -1
  59. package/dist/http-client.js +31 -3
  60. package/dist/key-parser.js +0 -1
  61. package/dist/last-used.js +0 -1
  62. package/dist/local-ui-server.d.ts +22 -0
  63. package/dist/local-ui-server.js +185 -0
  64. package/dist/login-flow.d.ts +7 -0
  65. package/dist/login-flow.js +119 -0
  66. package/dist/main.js +821 -152
  67. package/dist/managed-launch-env.js +14 -1
  68. package/dist/metadata-server.d.ts +36 -36
  69. package/dist/metadata-server.js +638 -138
  70. package/dist/metadata-store.d.ts +4 -1
  71. package/dist/metadata-store.js +30 -3
  72. package/dist/multiplexer/agent-io-methods.d.ts +2 -10
  73. package/dist/multiplexer/agent-io-methods.js +12 -44
  74. package/dist/multiplexer/archives.js +8 -10
  75. package/dist/multiplexer/dashboard-actions-methods.js +0 -1
  76. package/dist/multiplexer/dashboard-control.js +45 -14
  77. package/dist/multiplexer/dashboard-interaction.d.ts +8 -2
  78. package/dist/multiplexer/dashboard-interaction.js +187 -29
  79. package/dist/multiplexer/dashboard-model.d.ts +10 -3
  80. package/dist/multiplexer/dashboard-model.js +417 -36
  81. package/dist/multiplexer/dashboard-ops.d.ts +9 -7
  82. package/dist/multiplexer/dashboard-ops.js +178 -69
  83. package/dist/multiplexer/dashboard-state-methods.d.ts +2 -1
  84. package/dist/multiplexer/dashboard-state-methods.js +3 -3
  85. package/dist/multiplexer/dashboard-tail-methods.d.ts +22 -10
  86. package/dist/multiplexer/dashboard-tail-methods.js +164 -48
  87. package/dist/multiplexer/dashboard-view-methods.d.ts +1 -1
  88. package/dist/multiplexer/dashboard-view-methods.js +23 -9
  89. package/dist/multiplexer/graveyard-view-model.d.ts +9 -1
  90. package/dist/multiplexer/graveyard-view-model.js +39 -1
  91. package/dist/multiplexer/index.d.ts +15 -12
  92. package/dist/multiplexer/index.js +64 -44
  93. package/dist/multiplexer/navigation.js +0 -1
  94. package/dist/multiplexer/notifications.js +107 -25
  95. package/dist/multiplexer/persistence-methods.d.ts +31 -4
  96. package/dist/multiplexer/persistence-methods.js +304 -309
  97. package/dist/multiplexer/runtime-lifecycle-methods.d.ts +8 -10
  98. package/dist/multiplexer/runtime-lifecycle-methods.js +104 -87
  99. package/dist/multiplexer/runtime-state.d.ts +8 -10
  100. package/dist/multiplexer/runtime-state.js +82 -146
  101. package/dist/multiplexer/runtime-sync.d.ts +2 -10
  102. package/dist/multiplexer/runtime-sync.js +3 -19
  103. package/dist/multiplexer/service-state-snapshot.d.ts +2 -4
  104. package/dist/multiplexer/service-state-snapshot.js +4 -52
  105. package/dist/multiplexer/services.d.ts +1 -0
  106. package/dist/multiplexer/services.js +55 -6
  107. package/dist/multiplexer/session-capture.d.ts +1 -0
  108. package/dist/multiplexer/session-capture.js +23 -0
  109. package/dist/multiplexer/session-launch.d.ts +4 -1
  110. package/dist/multiplexer/session-launch.js +152 -64
  111. package/dist/multiplexer/session-runtime-core.d.ts +8 -20
  112. package/dist/multiplexer/session-runtime-core.js +40 -136
  113. package/dist/multiplexer/subscreens.js +10 -4
  114. package/dist/multiplexer/tool-picker.js +0 -1
  115. package/dist/multiplexer/worktree-graveyard.d.ts +0 -1
  116. package/dist/multiplexer/worktree-graveyard.js +15 -17
  117. package/dist/multiplexer/worktrees.js +96 -41
  118. package/dist/notification-context.js +8 -5
  119. package/dist/notifications.js +163 -102
  120. package/dist/notify.d.ts +4 -0
  121. package/dist/notify.js +14 -1
  122. package/dist/orchestration-actions.js +0 -1
  123. package/dist/orchestration-routing.js +0 -1
  124. package/dist/orchestration.js +0 -1
  125. package/dist/osc-notifications.js +0 -1
  126. package/dist/paths.d.ts +32 -7
  127. package/dist/paths.js +82 -59
  128. package/dist/pending-actions.d.ts +5 -0
  129. package/dist/pending-actions.js +13 -0
  130. package/dist/plugin-runtime.js +9 -3
  131. package/dist/project-events.d.ts +1 -10
  132. package/dist/project-events.js +0 -11
  133. package/dist/project-scanner.d.ts +2 -3
  134. package/dist/project-scanner.js +58 -130
  135. package/dist/project-service-manifest.d.ts +1 -3
  136. package/dist/project-service-manifest.js +1 -4
  137. package/dist/recency.js +0 -1
  138. package/dist/recorder.js +0 -1
  139. package/dist/relay-client.d.ts +30 -0
  140. package/dist/relay-client.js +190 -0
  141. package/dist/remote-access.d.ts +16 -0
  142. package/dist/remote-access.js +90 -0
  143. package/dist/runtime-core/exchange-derived.d.ts +2 -0
  144. package/dist/runtime-core/exchange-derived.js +153 -0
  145. package/dist/runtime-core/exchange-import.d.ts +24 -0
  146. package/dist/runtime-core/exchange-import.js +317 -0
  147. package/dist/runtime-core/exchange-store.d.ts +157 -0
  148. package/dist/runtime-core/exchange-store.js +452 -0
  149. package/dist/runtime-core/topology-services.d.ts +38 -0
  150. package/dist/runtime-core/topology-services.js +170 -0
  151. package/dist/runtime-core/topology-sessions.d.ts +52 -0
  152. package/dist/runtime-core/topology-sessions.js +238 -0
  153. package/dist/runtime-core/topology-store.d.ts +171 -0
  154. package/dist/runtime-core/topology-store.js +419 -0
  155. package/dist/runtime-core/topology-worktrees.d.ts +60 -0
  156. package/dist/runtime-core/topology-worktrees.js +199 -0
  157. package/dist/runtime-migration.d.ts +69 -0
  158. package/dist/runtime-migration.js +398 -0
  159. package/dist/session-bootstrap.d.ts +8 -6
  160. package/dist/session-bootstrap.js +51 -159
  161. package/dist/session-runtime.d.ts +2 -0
  162. package/dist/session-runtime.js +1 -1
  163. package/dist/session-semantics.d.ts +12 -4
  164. package/dist/session-semantics.js +14 -1
  165. package/dist/shell-args.js +0 -1
  166. package/dist/shell-hooks.js +32 -11
  167. package/dist/shell-state.d.ts +2 -0
  168. package/dist/shell-state.js +26 -2
  169. package/dist/status-detector.js +0 -1
  170. package/dist/statusline-model.d.ts +10 -2
  171. package/dist/statusline-model.js +106 -31
  172. package/dist/task-workflow.d.ts +6 -9
  173. package/dist/task-workflow.js +37 -85
  174. package/dist/tasks.d.ts +6 -33
  175. package/dist/tasks.js +46 -89
  176. package/dist/team.d.ts +29 -0
  177. package/dist/team.js +40 -1
  178. package/dist/terminal-host.js +0 -1
  179. package/dist/threads.d.ts +6 -35
  180. package/dist/threads.js +89 -99
  181. package/dist/tmux/doctor.js +0 -1
  182. package/dist/tmux/inbox-popup.js +37 -16
  183. package/dist/tmux/runtime-manager.d.ts +3 -0
  184. package/dist/tmux/runtime-manager.js +21 -5
  185. package/dist/tmux/session-transport.js +0 -1
  186. package/dist/tmux/statusline-cache.js +0 -1
  187. package/dist/tmux/statusline.js +49 -10
  188. package/dist/tmux/switcher.js +0 -1
  189. package/dist/tmux/window-open.js +1 -3
  190. package/dist/tool-output-watchers.d.ts +0 -18
  191. package/dist/tool-output-watchers.js +0 -323
  192. package/dist/tui/render/box.js +0 -1
  193. package/dist/tui/render/text.js +0 -1
  194. package/dist/tui/screens/dashboard-renderers.js +37 -26
  195. package/dist/tui/screens/overlay-renderers.d.ts +2 -0
  196. package/dist/tui/screens/overlay-renderers.js +37 -2
  197. package/dist/tui/screens/subscreen-renderers.js +7 -1
  198. package/dist/workflow.js +0 -1
  199. package/dist/worktree.js +17 -1
  200. package/dist-ui/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css +1 -0
  201. package/dist-ui/_expo/static/js/web/entry-477c745b2adc79367a4380ecf07d9ff6.js +14620 -0
  202. package/dist-ui/assets/assets/images/icon.a5413dcd2e811c9f2317d01a28118d8a.png +0 -0
  203. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  204. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  205. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  206. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  207. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  208. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  209. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  210. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  211. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  212. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  213. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  214. package/dist-ui/assets/node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  215. package/dist-ui/assets/node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  216. package/dist-ui/assets/node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  217. package/dist-ui/assets/node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  218. package/dist-ui/assets/node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  219. package/dist-ui/assets/node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  220. package/dist-ui/assets/node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  221. package/dist-ui/favicon.ico +0 -0
  222. package/dist-ui/index.html +38 -0
  223. package/dist-ui/metadata.json +1 -0
  224. package/package.json +29 -12
  225. package/dist/agent-events.js.map +0 -1
  226. package/dist/agent-message-parts.d.ts +0 -17
  227. package/dist/agent-message-parts.js +0 -31
  228. package/dist/agent-message-parts.js.map +0 -1
  229. package/dist/agent-output-parser.js.map +0 -1
  230. package/dist/agent-prompt-delivery.js.map +0 -1
  231. package/dist/agent-tracker.js.map +0 -1
  232. package/dist/agent-watcher.js.map +0 -1
  233. package/dist/atomic-write.js.map +0 -1
  234. package/dist/attachment-store.js.map +0 -1
  235. package/dist/builtin-metadata-watchers.js.map +0 -1
  236. package/dist/claude-hooks.js.map +0 -1
  237. package/dist/config.js.map +0 -1
  238. package/dist/context/compactor.js.map +0 -1
  239. package/dist/context/context-bridge.js.map +0 -1
  240. package/dist/context/context-file.js.map +0 -1
  241. package/dist/context/history.js.map +0 -1
  242. package/dist/daemon.js.map +0 -1
  243. package/dist/dashboard/command-spec.js.map +0 -1
  244. package/dist/dashboard/feedback.js.map +0 -1
  245. package/dist/dashboard/index.js.map +0 -1
  246. package/dist/dashboard/operation-failures.js.map +0 -1
  247. package/dist/dashboard/pending-actions.js.map +0 -1
  248. package/dist/dashboard/quick-jump.js.map +0 -1
  249. package/dist/dashboard/runtime-evidence.js.map +0 -1
  250. package/dist/dashboard/session-actions.js.map +0 -1
  251. package/dist/dashboard/session-registry.js.map +0 -1
  252. package/dist/dashboard/sort.js.map +0 -1
  253. package/dist/dashboard/state.js.map +0 -1
  254. package/dist/dashboard/targets.js.map +0 -1
  255. package/dist/dashboard/ui-state-store.js.map +0 -1
  256. package/dist/debug.js.map +0 -1
  257. package/dist/default-plugins/gh-pr-context.js.map +0 -1
  258. package/dist/default-plugins/transcript-length.js.map +0 -1
  259. package/dist/fast-control.js.map +0 -1
  260. package/dist/hotkeys.js.map +0 -1
  261. package/dist/http-client.js.map +0 -1
  262. package/dist/instance-directory.d.ts +0 -32
  263. package/dist/instance-directory.js +0 -82
  264. package/dist/instance-directory.js.map +0 -1
  265. package/dist/instance-registry.d.ts +0 -39
  266. package/dist/instance-registry.js +0 -208
  267. package/dist/instance-registry.js.map +0 -1
  268. package/dist/key-parser.js.map +0 -1
  269. package/dist/last-used.js.map +0 -1
  270. package/dist/main.js.map +0 -1
  271. package/dist/managed-launch-env.js.map +0 -1
  272. package/dist/metadata-server.js.map +0 -1
  273. package/dist/metadata-store.js.map +0 -1
  274. package/dist/multiplexer/agent-io-methods.js.map +0 -1
  275. package/dist/multiplexer/archives.js.map +0 -1
  276. package/dist/multiplexer/dashboard-actions-methods.js.map +0 -1
  277. package/dist/multiplexer/dashboard-control.js.map +0 -1
  278. package/dist/multiplexer/dashboard-interaction.js.map +0 -1
  279. package/dist/multiplexer/dashboard-model.js.map +0 -1
  280. package/dist/multiplexer/dashboard-ops.js.map +0 -1
  281. package/dist/multiplexer/dashboard-state-methods.js.map +0 -1
  282. package/dist/multiplexer/dashboard-tail-methods.js.map +0 -1
  283. package/dist/multiplexer/dashboard-view-methods.js.map +0 -1
  284. package/dist/multiplexer/graveyard-view-model.js.map +0 -1
  285. package/dist/multiplexer/index.js.map +0 -1
  286. package/dist/multiplexer/navigation.js.map +0 -1
  287. package/dist/multiplexer/notifications.js.map +0 -1
  288. package/dist/multiplexer/persistence-methods.js.map +0 -1
  289. package/dist/multiplexer/runtime-lifecycle-methods.js.map +0 -1
  290. package/dist/multiplexer/runtime-state.js.map +0 -1
  291. package/dist/multiplexer/runtime-sync.js.map +0 -1
  292. package/dist/multiplexer/service-state-snapshot.js.map +0 -1
  293. package/dist/multiplexer/services.js.map +0 -1
  294. package/dist/multiplexer/session-actions.d.ts +0 -40
  295. package/dist/multiplexer/session-actions.js +0 -110
  296. package/dist/multiplexer/session-actions.js.map +0 -1
  297. package/dist/multiplexer/session-launch.js.map +0 -1
  298. package/dist/multiplexer/session-runtime-core.js.map +0 -1
  299. package/dist/multiplexer/subscreens.js.map +0 -1
  300. package/dist/multiplexer/tool-picker.js.map +0 -1
  301. package/dist/multiplexer/worktree-graveyard.js.map +0 -1
  302. package/dist/multiplexer/worktrees.js.map +0 -1
  303. package/dist/notification-context.js.map +0 -1
  304. package/dist/notifications.js.map +0 -1
  305. package/dist/notify.js.map +0 -1
  306. package/dist/orchestration-actions.js.map +0 -1
  307. package/dist/orchestration-dispatcher.d.ts +0 -25
  308. package/dist/orchestration-dispatcher.js +0 -59
  309. package/dist/orchestration-dispatcher.js.map +0 -1
  310. package/dist/orchestration-routing.js.map +0 -1
  311. package/dist/orchestration.js.map +0 -1
  312. package/dist/osc-notifications.js.map +0 -1
  313. package/dist/paths.js.map +0 -1
  314. package/dist/plugin-runtime.js.map +0 -1
  315. package/dist/project-events.js.map +0 -1
  316. package/dist/project-scanner.js.map +0 -1
  317. package/dist/project-service-manifest.js.map +0 -1
  318. package/dist/recency.js.map +0 -1
  319. package/dist/recorder.js.map +0 -1
  320. package/dist/session-bootstrap.js.map +0 -1
  321. package/dist/session-input-operations.d.ts +0 -19
  322. package/dist/session-input-operations.js +0 -46
  323. package/dist/session-input-operations.js.map +0 -1
  324. package/dist/session-message-history.d.ts +0 -27
  325. package/dist/session-message-history.js +0 -105
  326. package/dist/session-message-history.js.map +0 -1
  327. package/dist/session-runtime.js.map +0 -1
  328. package/dist/session-semantics.js.map +0 -1
  329. package/dist/shell-args.js.map +0 -1
  330. package/dist/shell-hooks.js.map +0 -1
  331. package/dist/shell-state.js.map +0 -1
  332. package/dist/status-detector.js.map +0 -1
  333. package/dist/statusline-model.js.map +0 -1
  334. package/dist/task-dispatcher.d.ts +0 -64
  335. package/dist/task-dispatcher.js +0 -213
  336. package/dist/task-dispatcher.js.map +0 -1
  337. package/dist/task-workflow.js.map +0 -1
  338. package/dist/tasks.js.map +0 -1
  339. package/dist/team.js.map +0 -1
  340. package/dist/terminal-host.js.map +0 -1
  341. package/dist/threads.js.map +0 -1
  342. package/dist/tmux/doctor.js.map +0 -1
  343. package/dist/tmux/inbox-popup.js.map +0 -1
  344. package/dist/tmux/runtime-manager.js.map +0 -1
  345. package/dist/tmux/session-transport.js.map +0 -1
  346. package/dist/tmux/statusline-cache.js.map +0 -1
  347. package/dist/tmux/statusline.js.map +0 -1
  348. package/dist/tmux/switcher.js.map +0 -1
  349. package/dist/tmux/window-open.js.map +0 -1
  350. package/dist/tool-output-watchers.js.map +0 -1
  351. package/dist/tui/render/box.js.map +0 -1
  352. package/dist/tui/render/text.js.map +0 -1
  353. package/dist/tui/screens/dashboard-renderers.js.map +0 -1
  354. package/dist/tui/screens/overlay-renderers.js.map +0 -1
  355. package/dist/tui/screens/subscreen-renderers.js.map +0 -1
  356. package/dist/workflow.js.map +0 -1
  357. package/dist/worktree.js.map +0 -1
package/dist/debug.js CHANGED
@@ -1,16 +1,224 @@
1
- import { createWriteStream } from "node:fs";
2
- let stream = null;
3
- function ensureStream() {
4
- if (!stream) {
5
- stream = createWriteStream("/tmp/aimux-debug.log", { flags: "a" });
1
+ import { appendFileSync, existsSync, mkdirSync, renameSync, rmSync, statSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ const LEVEL_PRIORITY = {
4
+ error: 0,
5
+ warn: 1,
6
+ info: 2,
7
+ debug: 3,
8
+ trace: 4,
9
+ };
10
+ const SENSITIVE_ASSIGNMENT_PATTERN = /\b([A-Za-z_][A-Za-z0-9_]*=)(?:\\"(?:[^"\\]|\\.)*\\"|\\'(?:[^'\\]|\\.)*\\'|"[^"]*"|'[^']*'|[^"',\s\]]+)/g;
11
+ const DEFAULT_RUNTIME_CONFIG = {
12
+ enabled: false,
13
+ level: "info",
14
+ categories: ["*"],
15
+ maxBytes: 10_000_000,
16
+ maxFiles: 5,
17
+ path: "",
18
+ processKind: "cli",
19
+ };
20
+ let runtimeConfig = { ...DEFAULT_RUNTIME_CONFIG };
21
+ function normalizeLevel(level, fallback) {
22
+ return level === "error" || level === "warn" || level === "info" || level === "debug" || level === "trace"
23
+ ? level
24
+ : fallback;
25
+ }
26
+ function isExplicitFalse(value) {
27
+ return ["0", "false", "off", "no"].includes(value.trim().toLowerCase());
28
+ }
29
+ function normalizeCategories(categories) {
30
+ const normalized = (categories ?? ["*"]).map((category) => category.trim()).filter(Boolean);
31
+ return normalized.length > 0 ? normalized : ["*"];
32
+ }
33
+ export function parseLogCategories(value) {
34
+ if (!value)
35
+ return undefined;
36
+ return normalizeCategories(value.split(","));
37
+ }
38
+ export function resolveLoggingRuntimeConfig(options) {
39
+ const env = options.env ?? process.env;
40
+ const cli = options.cli ?? {};
41
+ let enabled = options.config.enabled;
42
+ let level = options.config.level;
43
+ let categories = normalizeCategories(options.config.categories);
44
+ const envLog = env.AIMUX_LOG;
45
+ if (envLog !== undefined) {
46
+ if (isExplicitFalse(envLog)) {
47
+ enabled = false;
48
+ }
49
+ else {
50
+ enabled = true;
51
+ level = normalizeLevel(envLog, level);
52
+ }
53
+ }
54
+ if (env.AIMUX_LOG_LEVEL) {
55
+ enabled = true;
56
+ level = normalizeLevel(env.AIMUX_LOG_LEVEL, level);
57
+ }
58
+ const envCategories = parseLogCategories(env.AIMUX_LOG_CATEGORIES);
59
+ if (envCategories) {
60
+ enabled = true;
61
+ categories = envCategories;
62
+ }
63
+ if (cli.debug) {
64
+ enabled = true;
65
+ level = "debug";
66
+ }
67
+ if (cli.trace) {
68
+ enabled = true;
69
+ level = "trace";
70
+ }
71
+ if (cli.logLevel) {
72
+ enabled = true;
73
+ level = normalizeLevel(cli.logLevel, level);
74
+ }
75
+ const cliCategories = parseLogCategories(cli.logCategory);
76
+ if (cliCategories) {
77
+ enabled = true;
78
+ categories = cliCategories;
79
+ }
80
+ return {
81
+ enabled,
82
+ level,
83
+ categories,
84
+ maxBytes: options.config.maxBytes,
85
+ maxFiles: options.config.maxFiles,
86
+ path: options.path,
87
+ processKind: options.processKind,
88
+ projectId: options.projectId,
89
+ projectRoot: options.projectRoot,
90
+ };
91
+ }
92
+ export function configureLogging(config) {
93
+ runtimeConfig = {
94
+ ...runtimeConfig,
95
+ ...config,
96
+ enabled: config.enabled ?? runtimeConfig.enabled,
97
+ level: normalizeLevel(config.level, runtimeConfig.level),
98
+ categories: normalizeCategories(config.categories ?? runtimeConfig.categories),
99
+ maxBytes: config.maxBytes ?? runtimeConfig.maxBytes,
100
+ maxFiles: config.maxFiles ?? runtimeConfig.maxFiles,
101
+ path: config.path ?? runtimeConfig.path,
102
+ processKind: config.processKind ?? runtimeConfig.processKind,
103
+ };
104
+ return { ...runtimeConfig, categories: [...runtimeConfig.categories] };
105
+ }
106
+ export function getLoggingConfig() {
107
+ return { ...runtimeConfig, categories: [...runtimeConfig.categories] };
108
+ }
109
+ export function resetLoggingForTests() {
110
+ runtimeConfig = { ...DEFAULT_RUNTIME_CONFIG, categories: [...DEFAULT_RUNTIME_CONFIG.categories] };
111
+ }
112
+ function shouldLog(level, category) {
113
+ if (!runtimeConfig.enabled || !runtimeConfig.path)
114
+ return false;
115
+ if (LEVEL_PRIORITY[level] > LEVEL_PRIORITY[runtimeConfig.level])
116
+ return false;
117
+ return runtimeConfig.categories.includes("*") || runtimeConfig.categories.includes(category);
118
+ }
119
+ function rotatedPath(path, index) {
120
+ return `${path}.${index}`;
121
+ }
122
+ function rotateIfNeeded(path, incomingBytes) {
123
+ if (runtimeConfig.maxBytes <= 0 || runtimeConfig.maxFiles <= 0 || !existsSync(path))
124
+ return;
125
+ const size = statSync(path).size;
126
+ if (size + incomingBytes <= runtimeConfig.maxBytes)
127
+ return;
128
+ rmSync(rotatedPath(path, runtimeConfig.maxFiles), { force: true });
129
+ for (let i = runtimeConfig.maxFiles - 1; i >= 1; i -= 1) {
130
+ const source = rotatedPath(path, i);
131
+ if (existsSync(source)) {
132
+ renameSync(source, rotatedPath(path, i + 1));
133
+ }
134
+ }
135
+ renameSync(path, rotatedPath(path, 1));
136
+ }
137
+ function writeRecord(record) {
138
+ const line = `${JSON.stringify(record)}\n`;
139
+ try {
140
+ mkdirSync(dirname(runtimeConfig.path), { recursive: true });
141
+ rotateIfNeeded(runtimeConfig.path, Buffer.byteLength(line));
142
+ appendFileSync(runtimeConfig.path, line);
143
+ }
144
+ catch {
145
+ // Logging must never break aimux runtime behavior.
146
+ }
147
+ }
148
+ function sanitizeLogString(value) {
149
+ return value.replace(SENSITIVE_ASSIGNMENT_PATTERN, (match, assignment) => {
150
+ const name = assignment.slice(0, -1);
151
+ return isSensitiveLogName(name) ? `${assignment}<redacted>` : match;
152
+ });
153
+ }
154
+ function isSensitiveLogName(name) {
155
+ const normalized = name.toLowerCase();
156
+ return (normalized.includes("token") ||
157
+ normalized.includes("secret") ||
158
+ normalized.includes("password") ||
159
+ normalized.includes("credential") ||
160
+ normalized.includes("authorization") ||
161
+ normalized.includes("auth") ||
162
+ normalized === "key" ||
163
+ normalized.endsWith("key") ||
164
+ normalized.includes("_key"));
165
+ }
166
+ function sanitizeLogValue(value, seen = new WeakSet()) {
167
+ if (typeof value === "string")
168
+ return sanitizeLogString(value);
169
+ if (value === null || typeof value !== "object")
170
+ return value;
171
+ const jsonLike = value;
172
+ if (typeof jsonLike.toJSON === "function") {
173
+ try {
174
+ const serialized = jsonLike.toJSON();
175
+ if (serialized !== value)
176
+ return sanitizeLogValue(serialized, seen);
177
+ }
178
+ catch {
179
+ // Fall through to structural sanitization.
180
+ }
181
+ }
182
+ if (seen.has(value))
183
+ return "[Circular]";
184
+ seen.add(value);
185
+ if (Array.isArray(value))
186
+ return value.map((entry) => sanitizeLogValue(entry, seen));
187
+ const output = {};
188
+ for (const [key, fieldValue] of Object.entries(value)) {
189
+ output[key] = isSensitiveLogName(key) ? "<redacted>" : sanitizeLogValue(fieldValue, seen);
6
190
  }
7
- return stream;
191
+ return output;
8
192
  }
193
+ function sanitizeLogFields(fields) {
194
+ if (!fields)
195
+ return undefined;
196
+ return sanitizeLogValue(fields);
197
+ }
198
+ export function logAt(level, message, category = "general", fields) {
199
+ if (!shouldLog(level, category))
200
+ return;
201
+ writeRecord({
202
+ ts: new Date().toISOString(),
203
+ level,
204
+ category,
205
+ message: sanitizeLogString(message),
206
+ pid: process.pid,
207
+ processKind: runtimeConfig.processKind,
208
+ projectId: runtimeConfig.projectId,
209
+ projectRoot: runtimeConfig.projectRoot,
210
+ fields: sanitizeLogFields(fields),
211
+ });
212
+ }
213
+ export const log = {
214
+ error: (message, category, fields) => logAt("error", message, category, fields),
215
+ warn: (message, category, fields) => logAt("warn", message, category, fields),
216
+ info: (message, category, fields) => logAt("info", message, category, fields),
217
+ debug: (message, category, fields) => logAt("debug", message, category, fields),
218
+ trace: (message, category, fields) => logAt("trace", message, category, fields),
219
+ };
9
220
  export function debug(msg, category) {
10
- const s = ensureStream();
11
- const ts = new Date().toISOString().slice(11, 23);
12
- const prefix = category ? `[${ts}] [${category}]` : `[${ts}]`;
13
- s.write(`${prefix} ${msg}\n`);
221
+ log.debug(msg, category);
14
222
  }
15
223
  export function debugContext(action, file, sizeBytes) {
16
224
  const sizeKB = (sizeBytes / 1024).toFixed(1);
@@ -32,10 +240,5 @@ export function debugGit(filesChanged, diffLen) {
32
240
  debug(`git: ${filesChanged} files changed, diff ${diffLen} chars`, "git");
33
241
  }
34
242
  export function closeDebug() {
35
- if (stream) {
36
- debug("--- aimux session ended ---");
37
- stream.end();
38
- stream = null;
39
- }
243
+ log.info("--- aimux session ended ---", "lifecycle");
40
244
  }
41
- //# sourceMappingURL=debug.js.map
@@ -1,8 +1,9 @@
1
1
  import type { AimuxPluginAPI, AimuxPluginInstance } from "../plugin-runtime.js";
2
+ import { type RuntimeTopologySessionState } from "../runtime-core/topology-sessions.js";
2
3
  interface SessionTarget {
3
4
  id: string;
4
5
  worktreePath?: string;
5
6
  }
6
- export declare function collectGithubPrTargets(statusline: any, state: any, metadata: any): SessionTarget[];
7
+ export declare function collectGithubPrTargets(statusline: any, state: any, metadata: any, topologySessions?: RuntimeTopologySessionState[]): SessionTarget[];
7
8
  export declare function createGithubPrContextPlugin(api: AimuxPluginAPI): AimuxPluginInstance;
8
9
  export {};
@@ -3,6 +3,8 @@ import { existsSync, mkdirSync, readFileSync } from "node:fs";
3
3
  import { basename, join, resolve } from "node:path";
4
4
  import { getProjectStateDirFor } from "../paths.js";
5
5
  import { writeJsonAtomic } from "../atomic-write.js";
6
+ import { createRuntimeTopologyStore } from "../runtime-core/topology-store.js";
7
+ import { listTopologySessionStates } from "../runtime-core/topology-sessions.js";
6
8
  const POLL_INTERVAL_MS = 60_000;
7
9
  const PR_CACHE_TTL_MS = 5 * 60_000;
8
10
  const PR_CACHE_PENDING_TTL_MS = 20_000;
@@ -104,21 +106,19 @@ async function resolveBranchPr(cwd, repo, branch) {
104
106
  function stableSerialize(value) {
105
107
  return JSON.stringify(value ?? null);
106
108
  }
107
- export function collectGithubPrTargets(statusline, state, metadata) {
109
+ export function collectGithubPrTargets(statusline, state, metadata, topologySessions = []) {
108
110
  const targets = new Map();
109
- for (const session of statusline?.sessions ?? []) {
110
- const existingContext = metadata?.sessions?.[session.id]?.context ?? {};
111
- targets.set(session.id, {
112
- id: session.id,
113
- worktreePath: session.worktreePath ?? existingContext.worktreePath ?? existingContext.cwd,
114
- });
115
- }
116
- for (const session of state?.sessions ?? []) {
111
+ const statuslineById = new Map((statusline?.sessions ?? []).map((session) => [session.id, session]));
112
+ for (const session of topologySessions) {
117
113
  if (!targets.has(session.id)) {
114
+ const statuslineSession = statuslineById.get(session.id);
118
115
  const existingContext = metadata?.sessions?.[session.id]?.context ?? {};
119
116
  targets.set(session.id, {
120
117
  id: session.id,
121
- worktreePath: session.worktreePath ?? existingContext.worktreePath ?? existingContext.cwd,
118
+ worktreePath: session.worktreePath ??
119
+ statuslineSession?.worktreePath ??
120
+ existingContext.worktreePath ??
121
+ existingContext.cwd,
122
122
  });
123
123
  }
124
124
  }
@@ -136,8 +136,10 @@ export function createGithubPrContextPlugin(api) {
136
136
  const projectStateDir = getProjectStateDirFor(api.projectRoot);
137
137
  const statuslinePath = join(projectStateDir, "statusline.json");
138
138
  const statePath = join(projectStateDir, "state.json");
139
+ const runtimeTopologyPath = join(projectStateDir, "runtime-topology.yaml");
139
140
  const metadataPath = join(projectStateDir, "metadata.json");
140
141
  const prCachePath = join(projectStateDir, "plugin-cache", "gh-pr-context.json");
142
+ const topologyStore = createRuntimeTopologyStore(runtimeTopologyPath);
141
143
  const prCache = new Map();
142
144
  const contextCache = new Map();
143
145
  const fileCache = new Map();
@@ -169,7 +171,11 @@ export function createGithubPrContextPlugin(api) {
169
171
  const statusline = loadCachedJson(statuslinePath);
170
172
  const state = loadCachedJson(statePath);
171
173
  const metadata = loadCachedJson(metadataPath);
172
- return collectGithubPrTargets(statusline, state, metadata);
174
+ const topologySessions = listTopologySessionStates({
175
+ statuses: ["running", "idle", "offline"],
176
+ store: topologyStore,
177
+ });
178
+ return collectGithubPrTargets(statusline, state, metadata, topologySessions);
173
179
  }
174
180
  async function resolveCachedPr(repoRoot, cwd, repo, branch) {
175
181
  const cacheKey = `${repoRoot}::${branch ?? ""}`;
@@ -253,4 +259,3 @@ export function createGithubPrContextPlugin(api) {
253
259
  },
254
260
  };
255
261
  }
256
- //# sourceMappingURL=gh-pr-context.js.map
@@ -1,8 +1,9 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { readHistory } from "../context/history.js";
4
4
  import { loadConfig } from "../config.js";
5
5
  import { getContextDir } from "../paths.js";
6
+ import { loadMetadataState } from "../metadata-store.js";
6
7
  function formatBytes(bytes) {
7
8
  if (bytes < 1024)
8
9
  return `${bytes}b`;
@@ -34,8 +35,20 @@ function transcriptBytesSinceCheckpoint(sessionId) {
34
35
  const turns = readHistory(sessionId, lastTurnTs ? { since: lastTurnTs } : undefined).filter((turn) => !lastTurnTs || turn.ts > lastTurnTs);
35
36
  return turns.reduce((total, turn) => total + Buffer.byteLength(`${JSON.stringify(turn)}\n`), 0);
36
37
  }
38
+ function externalTranscriptBytes(sessionId) {
39
+ const transcriptPath = loadMetadataState().sessions[sessionId]?.context?.transcriptPath;
40
+ if (!transcriptPath)
41
+ return undefined;
42
+ try {
43
+ const stat = statSync(transcriptPath);
44
+ return stat.isFile() ? stat.size : undefined;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
37
50
  function buildSegmentText(sessionId) {
38
- const bytes = transcriptBytesSinceCheckpoint(sessionId);
51
+ const bytes = externalTranscriptBytes(sessionId) ?? transcriptBytesSinceCheckpoint(sessionId);
39
52
  return formatBytes(bytes);
40
53
  }
41
54
  export function createTranscriptLengthPlugin(api, options) {
@@ -91,4 +104,3 @@ export default function createConfiguredTranscriptLengthPlugin(api) {
91
104
  line: pluginConfig.line ?? "top",
92
105
  });
93
106
  }
94
- //# sourceMappingURL=transcript-length.js.map
@@ -32,12 +32,17 @@ export function resolveScopedWorktreePath(projectRoot, currentPath) {
32
32
  const match = worktrees.find((worktreePath) => fallback === worktreePath || fallback.startsWith(`${worktreePath}/`));
33
33
  return match ?? fallback;
34
34
  }
35
- function resolveContextWorktreePath(context, tmux, managedWindows) {
36
- const byWindowId = context.currentWindowId
37
- ? managedWindows.find((entry) => entry.target.windowId === context.currentWindowId)
38
- : undefined;
39
- if (byWindowId?.metadata.worktreePath) {
40
- return pathResolve(byWindowId.metadata.worktreePath);
35
+ function resolveContextWorktreePath(context, currentManagedWindow) {
36
+ if (currentManagedWindow?.metadata.worktreePath) {
37
+ return pathResolve(currentManagedWindow.metadata.worktreePath);
38
+ }
39
+ return resolveScopedWorktreePath(context.projectRoot, context.currentPath);
40
+ }
41
+ function resolveCurrentManagedWindow(context, tmux, managedWindows) {
42
+ if (context.currentWindowId) {
43
+ const byWindowId = managedWindows.find((entry) => entry.target.windowId === context.currentWindowId);
44
+ if (byWindowId)
45
+ return byWindowId;
41
46
  }
42
47
  const currentClientSession = context.currentClientSession?.trim();
43
48
  if (currentClientSession) {
@@ -46,12 +51,25 @@ function resolveContextWorktreePath(context, tmux, managedWindows) {
46
51
  .find((window) => window.active && !isDashboardWindowName(window.name));
47
52
  if (currentClientWindow) {
48
53
  const byActiveClientWindow = managedWindows.find((entry) => entry.target.windowId === currentClientWindow.id);
49
- if (byActiveClientWindow?.metadata.worktreePath) {
50
- return pathResolve(byActiveClientWindow.metadata.worktreePath);
51
- }
54
+ if (byActiveClientWindow)
55
+ return byActiveClientWindow;
52
56
  }
53
57
  }
54
- return resolveScopedWorktreePath(context.projectRoot, context.currentPath);
58
+ return managedWindows.find(({ target, metadata }) => target.windowName === context.currentWindow || metadata.label === context.currentWindow);
59
+ }
60
+ function compareSwitchableWindows(left, right, teammateParentSessionId) {
61
+ if (teammateParentSessionId) {
62
+ const leftOrder = typeof left.metadata.team?.order === "number" ? left.metadata.team.order : Number.POSITIVE_INFINITY;
63
+ const rightOrder = typeof right.metadata.team?.order === "number" ? right.metadata.team.order : Number.POSITIVE_INFINITY;
64
+ if (leftOrder !== rightOrder)
65
+ return leftOrder - rightOrder;
66
+ return left.target.windowIndex - right.target.windowIndex;
67
+ }
68
+ const kindRank = left.metadata.kind === "service" ? 1 : 0;
69
+ const otherKindRank = right.metadata.kind === "service" ? 1 : 0;
70
+ if (kindRank !== otherKindRank)
71
+ return kindRank - otherKindRank;
72
+ return left.target.windowIndex - right.target.windowIndex;
55
73
  }
56
74
  function urgencyFor(projectRoot, sessionId) {
57
75
  if (!sessionId)
@@ -70,21 +88,20 @@ export function listSwitchableAgentItems(context, tmux = new TmuxRuntimeManager(
70
88
  const tmuxSession = tmux.getProjectSession(context.projectRoot);
71
89
  const recentRankMap = getRecentRankMap(context.projectRoot, context.currentClientSession);
72
90
  const managedWindows = tmux.listManagedWindows(tmuxSession.sessionName);
73
- const scopedWorktreePath = resolveContextWorktreePath(context, tmux, managedWindows);
91
+ const currentManagedWindow = resolveCurrentManagedWindow(context, tmux, managedWindows);
92
+ const teammateParentSessionId = currentManagedWindow?.metadata.team?.parentSessionId;
93
+ const scopedWorktreePath = resolveContextWorktreePath(context, currentManagedWindow);
74
94
  let managed = managedWindows
75
95
  .filter(({ target, metadata }) => {
76
96
  if (isDashboardWindowName(target.windowName))
77
97
  return false;
98
+ if (teammateParentSessionId) {
99
+ return metadata.kind !== "service" && metadata.team?.parentSessionId === teammateParentSessionId;
100
+ }
78
101
  const worktreePath = metadata.worktreePath || context.projectRoot;
79
- return pathResolve(worktreePath) === scopedWorktreePath;
80
- })
81
- .sort((a, b) => {
82
- const kindRank = a.metadata.kind === "service" ? 1 : 0;
83
- const otherKindRank = b.metadata.kind === "service" ? 1 : 0;
84
- if (kindRank !== otherKindRank)
85
- return kindRank - otherKindRank;
86
- return a.target.windowIndex - b.target.windowIndex;
102
+ return !metadata.team && pathResolve(worktreePath) === scopedWorktreePath;
87
103
  })
104
+ .sort((a, b) => compareSwitchableWindows(a, b, teammateParentSessionId))
88
105
  .map((entry) => ({
89
106
  ...entry,
90
107
  id: entry.metadata.sessionId,
@@ -92,6 +109,7 @@ export function listSwitchableAgentItems(context, tmux = new TmuxRuntimeManager(
92
109
  kind: entry.metadata.kind === "service" ? "service" : "agent",
93
110
  tool: entry.metadata.command || entry.target.windowName,
94
111
  label: entry.metadata.label,
112
+ launchCommandLine: entry.metadata.launchCommandLine,
95
113
  role: entry.metadata.role,
96
114
  id: entry.metadata.sessionId,
97
115
  }),
@@ -170,4 +188,3 @@ export function listSwitchableAgentMenuItems(context, tmux = new TmuxRuntimeMana
170
188
  return a.target.windowIndex - b.target.windowIndex;
171
189
  });
172
190
  }
173
- //# sourceMappingURL=fast-control.js.map
package/dist/hotkeys.js CHANGED
@@ -118,4 +118,3 @@ export class HotkeyHandler {
118
118
  this.clearTimeout();
119
119
  }
120
120
  }
121
- //# sourceMappingURL=hotkeys.js.map
@@ -1,7 +1,9 @@
1
1
  import http from "node:http";
2
2
  import https from "node:https";
3
+ import { log } from "./debug.js";
3
4
  export async function requestJson(urlString, options = {}) {
4
5
  const url = new URL(urlString);
6
+ const logUrl = `${url.origin}${url.pathname}`;
5
7
  const transport = url.protocol === "https:" ? https : http;
6
8
  const bodyString = options.body === undefined
7
9
  ? undefined
@@ -19,8 +21,9 @@ export async function requestJson(urlString, options = {}) {
19
21
  headers["content-length"] = Buffer.byteLength(bodyString).toString();
20
22
  }
21
23
  return await new Promise((resolve, reject) => {
24
+ const method = options.method ?? (bodyString === undefined ? "GET" : "POST");
22
25
  const req = transport.request(url, {
23
- method: options.method ?? (bodyString === undefined ? "GET" : "POST"),
26
+ method,
24
27
  headers,
25
28
  agent: false,
26
29
  }, (res) => {
@@ -33,17 +36,43 @@ export async function requestJson(urlString, options = {}) {
33
36
  json = raw ? JSON.parse(raw) : {};
34
37
  }
35
38
  catch (error) {
39
+ log.warn("http json parse failed", "http", {
40
+ method,
41
+ url: logUrl,
42
+ status: res.statusCode ?? 0,
43
+ bytes: Buffer.byteLength(raw),
44
+ error: error instanceof Error ? error.message : String(error),
45
+ });
36
46
  reject(error);
37
47
  return;
38
48
  }
49
+ if ((res.statusCode ?? 0) >= 400) {
50
+ log.warn("http request returned error status", "http", {
51
+ method,
52
+ url: logUrl,
53
+ status: res.statusCode ?? 0,
54
+ });
55
+ }
39
56
  resolve({
40
57
  status: res.statusCode ?? 0,
41
58
  json,
42
59
  });
43
60
  });
44
61
  });
45
- req.on("error", reject);
62
+ req.on("error", (error) => {
63
+ log.warn("http request failed", "http", {
64
+ method,
65
+ url: logUrl,
66
+ error: error instanceof Error ? error.message : String(error),
67
+ });
68
+ reject(error);
69
+ });
46
70
  req.setTimeout(options.timeoutMs ?? 0, () => {
71
+ log.warn("http request timed out", "http", {
72
+ method,
73
+ url: logUrl,
74
+ timeoutMs: options.timeoutMs ?? 0,
75
+ });
47
76
  req.destroy(new Error(`request timed out after ${options.timeoutMs ?? 0}ms`));
48
77
  });
49
78
  if (bodyString !== undefined) {
@@ -52,4 +81,3 @@ export async function requestJson(urlString, options = {}) {
52
81
  req.end();
53
82
  });
54
83
  }
55
- //# sourceMappingURL=http-client.js.map
@@ -276,4 +276,3 @@ export function matchKey(event, descriptor) {
276
276
  event.alt === wantAlt &&
277
277
  (event.name === key || event.char === key));
278
278
  }
279
- //# sourceMappingURL=key-parser.js.map
package/dist/last-used.js CHANGED
@@ -90,4 +90,3 @@ function normalizeLastUsedState(state) {
90
90
  function pushRecentId(ids, itemId) {
91
91
  return [itemId, ...ids.filter((entry) => entry !== itemId)].slice(0, MAX_RECENT_IDS);
92
92
  }
93
- //# sourceMappingURL=last-used.js.map
@@ -0,0 +1,22 @@
1
+ export declare const DEFAULT_LOCAL_UI_HOST = "127.0.0.1";
2
+ export declare const DEFAULT_LOCAL_UI_PORT = 43192;
3
+ export interface LocalUiConfig {
4
+ connectionMode: "local";
5
+ daemonUrl: string;
6
+ }
7
+ export interface LocalUiServerOptions {
8
+ host?: string;
9
+ port?: number;
10
+ uiRoot?: string;
11
+ config: LocalUiConfig;
12
+ }
13
+ export interface LocalUiServerHandle {
14
+ host: string;
15
+ port: number;
16
+ url: string;
17
+ uiRoot: string;
18
+ close: () => Promise<void>;
19
+ }
20
+ export declare function resolveDefaultLocalUiRoot(): string;
21
+ export declare function startLocalUiServer(options: LocalUiServerOptions): Promise<LocalUiServerHandle>;
22
+ export declare function openUrlInBrowser(url: string): void;