aimux-cli 0.1.16 → 0.1.18

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 (299) hide show
  1. package/README.md +184 -67
  2. package/bin/aimux-dev +10 -0
  3. package/dist/alert-display.d.ts +21 -0
  4. package/dist/alert-display.js +86 -0
  5. package/dist/alert-display.js.map +1 -0
  6. package/dist/attachment-store.d.ts +0 -7
  7. package/dist/attachment-store.js +2 -86
  8. package/dist/attachment-store.js.map +1 -1
  9. package/dist/builtin-metadata-watchers.js +4 -4
  10. package/dist/builtin-metadata-watchers.js.map +1 -1
  11. package/dist/claude-hooks.d.ts +1 -0
  12. package/dist/claude-hooks.js +25 -0
  13. package/dist/claude-hooks.js.map +1 -1
  14. package/dist/config.d.ts +19 -13
  15. package/dist/config.js +28 -14
  16. package/dist/config.js.map +1 -1
  17. package/dist/connection-targets.d.ts +8 -0
  18. package/dist/connection-targets.js +28 -0
  19. package/dist/connection-targets.js.map +1 -0
  20. package/dist/credentials.d.ts +12 -0
  21. package/dist/credentials.js +49 -0
  22. package/dist/credentials.js.map +1 -0
  23. package/dist/daemon.d.ts +23 -0
  24. package/dist/daemon.js +391 -66
  25. package/dist/daemon.js.map +1 -1
  26. package/dist/dashboard/index.d.ts +13 -10
  27. package/dist/dashboard/index.js +3 -26
  28. package/dist/dashboard/index.js.map +1 -1
  29. package/dist/dashboard/order.d.ts +22 -0
  30. package/dist/dashboard/order.js +55 -0
  31. package/dist/dashboard/order.js.map +1 -0
  32. package/dist/dashboard/pending-actions.d.ts +39 -10
  33. package/dist/dashboard/pending-actions.js +166 -36
  34. package/dist/dashboard/pending-actions.js.map +1 -1
  35. package/dist/dashboard/quick-jump.d.ts +2 -1
  36. package/dist/dashboard/quick-jump.js +7 -4
  37. package/dist/dashboard/quick-jump.js.map +1 -1
  38. package/dist/dashboard/session-actions.d.ts +4 -4
  39. package/dist/dashboard/session-actions.js +1 -1
  40. package/dist/dashboard/session-actions.js.map +1 -1
  41. package/dist/dashboard/session-registry.d.ts +4 -3
  42. package/dist/dashboard/session-registry.js +16 -50
  43. package/dist/dashboard/session-registry.js.map +1 -1
  44. package/dist/dashboard/state.d.ts +1 -1
  45. package/dist/dashboard/state.js.map +1 -1
  46. package/dist/dashboard/ui-state-store.d.ts +16 -1
  47. package/dist/dashboard/ui-state-store.js +73 -2
  48. package/dist/dashboard/ui-state-store.js.map +1 -1
  49. package/dist/debug-state.d.ts +97 -0
  50. package/dist/debug-state.js +541 -0
  51. package/dist/debug-state.js.map +1 -0
  52. package/dist/debug.d.ts +38 -0
  53. package/dist/debug.js +219 -15
  54. package/dist/debug.js.map +1 -1
  55. package/dist/default-plugins/gh-pr-context.d.ts +2 -1
  56. package/dist/default-plugins/gh-pr-context.js +17 -11
  57. package/dist/default-plugins/gh-pr-context.js.map +1 -1
  58. package/dist/default-plugins/transcript-length.js +15 -2
  59. package/dist/default-plugins/transcript-length.js.map +1 -1
  60. package/dist/fast-control.js +37 -19
  61. package/dist/fast-control.js.map +1 -1
  62. package/dist/http-client.js +31 -2
  63. package/dist/http-client.js.map +1 -1
  64. package/dist/local-ui-server.d.ts +22 -0
  65. package/dist/local-ui-server.js +186 -0
  66. package/dist/local-ui-server.js.map +1 -0
  67. package/dist/login-flow.d.ts +7 -0
  68. package/dist/login-flow.js +120 -0
  69. package/dist/login-flow.js.map +1 -0
  70. package/dist/main.js +821 -151
  71. package/dist/main.js.map +1 -1
  72. package/dist/managed-launch-env.js +14 -0
  73. package/dist/managed-launch-env.js.map +1 -1
  74. package/dist/metadata-server.d.ts +36 -36
  75. package/dist/metadata-server.js +638 -137
  76. package/dist/metadata-server.js.map +1 -1
  77. package/dist/metadata-store.d.ts +4 -1
  78. package/dist/metadata-store.js +30 -2
  79. package/dist/metadata-store.js.map +1 -1
  80. package/dist/multiplexer/agent-io-methods.d.ts +2 -10
  81. package/dist/multiplexer/agent-io-methods.js +12 -43
  82. package/dist/multiplexer/agent-io-methods.js.map +1 -1
  83. package/dist/multiplexer/archives.js +8 -9
  84. package/dist/multiplexer/archives.js.map +1 -1
  85. package/dist/multiplexer/dashboard-control.js +45 -13
  86. package/dist/multiplexer/dashboard-control.js.map +1 -1
  87. package/dist/multiplexer/dashboard-interaction.d.ts +8 -2
  88. package/dist/multiplexer/dashboard-interaction.js +187 -28
  89. package/dist/multiplexer/dashboard-interaction.js.map +1 -1
  90. package/dist/multiplexer/dashboard-model.d.ts +10 -3
  91. package/dist/multiplexer/dashboard-model.js +417 -35
  92. package/dist/multiplexer/dashboard-model.js.map +1 -1
  93. package/dist/multiplexer/dashboard-ops.d.ts +9 -7
  94. package/dist/multiplexer/dashboard-ops.js +178 -68
  95. package/dist/multiplexer/dashboard-ops.js.map +1 -1
  96. package/dist/multiplexer/dashboard-state-methods.d.ts +2 -1
  97. package/dist/multiplexer/dashboard-state-methods.js +3 -2
  98. package/dist/multiplexer/dashboard-state-methods.js.map +1 -1
  99. package/dist/multiplexer/dashboard-tail-methods.d.ts +22 -10
  100. package/dist/multiplexer/dashboard-tail-methods.js +164 -47
  101. package/dist/multiplexer/dashboard-tail-methods.js.map +1 -1
  102. package/dist/multiplexer/dashboard-view-methods.d.ts +1 -1
  103. package/dist/multiplexer/dashboard-view-methods.js +23 -8
  104. package/dist/multiplexer/dashboard-view-methods.js.map +1 -1
  105. package/dist/multiplexer/graveyard-view-model.d.ts +9 -1
  106. package/dist/multiplexer/graveyard-view-model.js +39 -0
  107. package/dist/multiplexer/graveyard-view-model.js.map +1 -1
  108. package/dist/multiplexer/index.d.ts +15 -12
  109. package/dist/multiplexer/index.js +64 -43
  110. package/dist/multiplexer/index.js.map +1 -1
  111. package/dist/multiplexer/notifications.js +107 -24
  112. package/dist/multiplexer/notifications.js.map +1 -1
  113. package/dist/multiplexer/persistence-methods.d.ts +31 -4
  114. package/dist/multiplexer/persistence-methods.js +304 -308
  115. package/dist/multiplexer/persistence-methods.js.map +1 -1
  116. package/dist/multiplexer/runtime-lifecycle-methods.d.ts +8 -10
  117. package/dist/multiplexer/runtime-lifecycle-methods.js +104 -86
  118. package/dist/multiplexer/runtime-lifecycle-methods.js.map +1 -1
  119. package/dist/multiplexer/runtime-state.d.ts +8 -10
  120. package/dist/multiplexer/runtime-state.js +82 -145
  121. package/dist/multiplexer/runtime-state.js.map +1 -1
  122. package/dist/multiplexer/runtime-sync.d.ts +2 -10
  123. package/dist/multiplexer/runtime-sync.js +3 -18
  124. package/dist/multiplexer/runtime-sync.js.map +1 -1
  125. package/dist/multiplexer/service-state-snapshot.d.ts +2 -4
  126. package/dist/multiplexer/service-state-snapshot.js +4 -51
  127. package/dist/multiplexer/service-state-snapshot.js.map +1 -1
  128. package/dist/multiplexer/services.d.ts +1 -0
  129. package/dist/multiplexer/services.js +55 -5
  130. package/dist/multiplexer/services.js.map +1 -1
  131. package/dist/multiplexer/session-capture.d.ts +1 -0
  132. package/dist/multiplexer/session-capture.js +24 -0
  133. package/dist/multiplexer/session-capture.js.map +1 -0
  134. package/dist/multiplexer/session-launch.d.ts +4 -1
  135. package/dist/multiplexer/session-launch.js +152 -63
  136. package/dist/multiplexer/session-launch.js.map +1 -1
  137. package/dist/multiplexer/session-runtime-core.d.ts +8 -20
  138. package/dist/multiplexer/session-runtime-core.js +40 -135
  139. package/dist/multiplexer/session-runtime-core.js.map +1 -1
  140. package/dist/multiplexer/subscreens.js +10 -3
  141. package/dist/multiplexer/subscreens.js.map +1 -1
  142. package/dist/multiplexer/worktree-graveyard.d.ts +0 -1
  143. package/dist/multiplexer/worktree-graveyard.js +15 -16
  144. package/dist/multiplexer/worktree-graveyard.js.map +1 -1
  145. package/dist/multiplexer/worktrees.js +96 -40
  146. package/dist/multiplexer/worktrees.js.map +1 -1
  147. package/dist/notification-context.js +8 -4
  148. package/dist/notification-context.js.map +1 -1
  149. package/dist/notifications.js +163 -101
  150. package/dist/notifications.js.map +1 -1
  151. package/dist/notify.d.ts +4 -0
  152. package/dist/notify.js +14 -0
  153. package/dist/notify.js.map +1 -1
  154. package/dist/paths.d.ts +32 -7
  155. package/dist/paths.js +82 -58
  156. package/dist/paths.js.map +1 -1
  157. package/dist/pending-actions.d.ts +5 -0
  158. package/dist/pending-actions.js +14 -0
  159. package/dist/pending-actions.js.map +1 -0
  160. package/dist/plugin-runtime.js +9 -2
  161. package/dist/plugin-runtime.js.map +1 -1
  162. package/dist/project-events.d.ts +1 -10
  163. package/dist/project-events.js +0 -10
  164. package/dist/project-events.js.map +1 -1
  165. package/dist/project-scanner.d.ts +2 -3
  166. package/dist/project-scanner.js +58 -129
  167. package/dist/project-scanner.js.map +1 -1
  168. package/dist/project-service-manifest.d.ts +1 -3
  169. package/dist/project-service-manifest.js +1 -3
  170. package/dist/project-service-manifest.js.map +1 -1
  171. package/dist/relay-client.d.ts +30 -0
  172. package/dist/relay-client.js +191 -0
  173. package/dist/relay-client.js.map +1 -0
  174. package/dist/remote-access.d.ts +16 -0
  175. package/dist/remote-access.js +91 -0
  176. package/dist/remote-access.js.map +1 -0
  177. package/dist/runtime-core/exchange-derived.d.ts +2 -0
  178. package/dist/runtime-core/exchange-derived.js +154 -0
  179. package/dist/runtime-core/exchange-derived.js.map +1 -0
  180. package/dist/runtime-core/exchange-import.d.ts +24 -0
  181. package/dist/runtime-core/exchange-import.js +318 -0
  182. package/dist/runtime-core/exchange-import.js.map +1 -0
  183. package/dist/runtime-core/exchange-store.d.ts +157 -0
  184. package/dist/runtime-core/exchange-store.js +453 -0
  185. package/dist/runtime-core/exchange-store.js.map +1 -0
  186. package/dist/runtime-core/topology-services.d.ts +38 -0
  187. package/dist/runtime-core/topology-services.js +171 -0
  188. package/dist/runtime-core/topology-services.js.map +1 -0
  189. package/dist/runtime-core/topology-sessions.d.ts +52 -0
  190. package/dist/runtime-core/topology-sessions.js +239 -0
  191. package/dist/runtime-core/topology-sessions.js.map +1 -0
  192. package/dist/runtime-core/topology-store.d.ts +171 -0
  193. package/dist/runtime-core/topology-store.js +420 -0
  194. package/dist/runtime-core/topology-store.js.map +1 -0
  195. package/dist/runtime-core/topology-worktrees.d.ts +60 -0
  196. package/dist/runtime-core/topology-worktrees.js +200 -0
  197. package/dist/runtime-core/topology-worktrees.js.map +1 -0
  198. package/dist/runtime-migration.d.ts +69 -0
  199. package/dist/runtime-migration.js +399 -0
  200. package/dist/runtime-migration.js.map +1 -0
  201. package/dist/session-bootstrap.d.ts +8 -6
  202. package/dist/session-bootstrap.js +51 -158
  203. package/dist/session-bootstrap.js.map +1 -1
  204. package/dist/session-runtime.d.ts +2 -0
  205. package/dist/session-runtime.js +1 -0
  206. package/dist/session-runtime.js.map +1 -1
  207. package/dist/session-semantics.d.ts +12 -4
  208. package/dist/session-semantics.js +14 -0
  209. package/dist/session-semantics.js.map +1 -1
  210. package/dist/shell-hooks.js +32 -10
  211. package/dist/shell-hooks.js.map +1 -1
  212. package/dist/shell-state.d.ts +2 -0
  213. package/dist/shell-state.js +26 -1
  214. package/dist/shell-state.js.map +1 -1
  215. package/dist/statusline-model.d.ts +10 -2
  216. package/dist/statusline-model.js +106 -30
  217. package/dist/statusline-model.js.map +1 -1
  218. package/dist/task-workflow.d.ts +6 -9
  219. package/dist/task-workflow.js +37 -84
  220. package/dist/task-workflow.js.map +1 -1
  221. package/dist/tasks.d.ts +6 -33
  222. package/dist/tasks.js +46 -88
  223. package/dist/tasks.js.map +1 -1
  224. package/dist/team.d.ts +29 -0
  225. package/dist/team.js +40 -0
  226. package/dist/team.js.map +1 -1
  227. package/dist/threads.d.ts +6 -35
  228. package/dist/threads.js +89 -98
  229. package/dist/threads.js.map +1 -1
  230. package/dist/tmux/inbox-popup.js +37 -15
  231. package/dist/tmux/inbox-popup.js.map +1 -1
  232. package/dist/tmux/runtime-manager.d.ts +3 -0
  233. package/dist/tmux/runtime-manager.js +21 -4
  234. package/dist/tmux/runtime-manager.js.map +1 -1
  235. package/dist/tmux/statusline.js +49 -9
  236. package/dist/tmux/statusline.js.map +1 -1
  237. package/dist/tmux/window-open.js +1 -2
  238. package/dist/tmux/window-open.js.map +1 -1
  239. package/dist/tool-output-watchers.d.ts +0 -18
  240. package/dist/tool-output-watchers.js +0 -322
  241. package/dist/tool-output-watchers.js.map +1 -1
  242. package/dist/tui/screens/dashboard-renderers.js +37 -25
  243. package/dist/tui/screens/dashboard-renderers.js.map +1 -1
  244. package/dist/tui/screens/overlay-renderers.d.ts +2 -0
  245. package/dist/tui/screens/overlay-renderers.js +37 -1
  246. package/dist/tui/screens/overlay-renderers.js.map +1 -1
  247. package/dist/tui/screens/subscreen-renderers.js +7 -0
  248. package/dist/tui/screens/subscreen-renderers.js.map +1 -1
  249. package/dist/worktree.js +17 -0
  250. package/dist/worktree.js.map +1 -1
  251. package/dist-ui/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css +1 -0
  252. package/dist-ui/_expo/static/js/web/entry-477c745b2adc79367a4380ecf07d9ff6.js +14620 -0
  253. package/dist-ui/assets/assets/images/icon.a5413dcd2e811c9f2317d01a28118d8a.png +0 -0
  254. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  255. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  256. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  257. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  258. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  259. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  260. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  261. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  262. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  263. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  264. package/dist-ui/assets/node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  265. package/dist-ui/assets/node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  266. package/dist-ui/assets/node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  267. package/dist-ui/assets/node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  268. package/dist-ui/assets/node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  269. package/dist-ui/assets/node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  270. package/dist-ui/assets/node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  271. package/dist-ui/assets/node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  272. package/dist-ui/favicon.ico +0 -0
  273. package/dist-ui/index.html +38 -0
  274. package/dist-ui/metadata.json +1 -0
  275. package/package.json +28 -12
  276. package/dist/agent-message-parts.d.ts +0 -17
  277. package/dist/agent-message-parts.js +0 -31
  278. package/dist/agent-message-parts.js.map +0 -1
  279. package/dist/instance-directory.d.ts +0 -32
  280. package/dist/instance-directory.js +0 -82
  281. package/dist/instance-directory.js.map +0 -1
  282. package/dist/instance-registry.d.ts +0 -39
  283. package/dist/instance-registry.js +0 -208
  284. package/dist/instance-registry.js.map +0 -1
  285. package/dist/multiplexer/session-actions.d.ts +0 -40
  286. package/dist/multiplexer/session-actions.js +0 -110
  287. package/dist/multiplexer/session-actions.js.map +0 -1
  288. package/dist/orchestration-dispatcher.d.ts +0 -25
  289. package/dist/orchestration-dispatcher.js +0 -59
  290. package/dist/orchestration-dispatcher.js.map +0 -1
  291. package/dist/session-input-operations.d.ts +0 -19
  292. package/dist/session-input-operations.js +0 -46
  293. package/dist/session-input-operations.js.map +0 -1
  294. package/dist/session-message-history.d.ts +0 -27
  295. package/dist/session-message-history.js +0 -105
  296. package/dist/session-message-history.js.map +0 -1
  297. package/dist/task-dispatcher.d.ts +0 -64
  298. package/dist/task-dispatcher.js +0 -213
  299. package/dist/task-dispatcher.js.map +0 -1
Binary file
@@ -0,0 +1,38 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
7
+ <title>aimux</title>
8
+ <!-- The `react-native-web` recommended style reset: https://necolas.github.io/react-native-web/docs/setup/#root-element -->
9
+ <style id="expo-reset">
10
+ /* These styles make the body full-height */
11
+ html,
12
+ body {
13
+ height: 100%;
14
+ }
15
+ /* These styles disable body scrolling if you are using <ScrollView> */
16
+ body {
17
+ overflow: hidden;
18
+ }
19
+ /* These styles make the root element full-height */
20
+ #root {
21
+ display: flex;
22
+ height: 100%;
23
+ flex: 1;
24
+ }
25
+ </style>
26
+ <link rel="preload" href="/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css" as="style"><link rel="stylesheet" href="/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css"><link rel="icon" href="/favicon.ico" /> <script src="/aimux-local-config.js"></script>
27
+ </head>
28
+
29
+ <body>
30
+ <!-- Use static rendering with Expo Router to support running without JavaScript. -->
31
+ <noscript>
32
+ You need to enable JavaScript to run this app.
33
+ </noscript>
34
+ <!-- The root element for your Expo app. -->
35
+ <div id="root"></div>
36
+ <script src="/_expo/static/js/web/entry-477c745b2adc79367a4380ecf07d9ff6.js" defer></script>
37
+ </body>
38
+ </html>
@@ -0,0 +1 @@
1
+ {"version":0,"bundler":"metro","fileMetadata":{}}
package/package.json CHANGED
@@ -1,22 +1,36 @@
1
1
  {
2
2
  "name": "aimux-cli",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "Native CLI agent multiplexer — run AI coding tools with their native TUIs intact",
5
5
  "main": "dist/main.js",
6
6
  "bin": {
7
- "aimux": "./bin/aimux"
7
+ "aimux": "./bin/aimux",
8
+ "aimux-dev": "./bin/aimux-dev"
8
9
  },
9
10
  "files": [
10
11
  "bin",
11
12
  "dist",
13
+ "dist-ui",
12
14
  "README.md"
13
15
  ],
14
16
  "scripts": {
15
17
  "build": "rm -rf dist && tsc",
18
+ "build:ui:local": "bash scripts/build-local-ui.sh",
16
19
  "dev": "tsc --watch",
20
+ "dev:gui": "yarn dev:gui:web",
21
+ "dev:gui:web": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:web:local",
22
+ "dev:gui:web:relay": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:web:relay",
23
+ "dev:gui:native": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:native:local",
24
+ "dev:gui:native:relay": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:native:relay",
25
+ "dev:gui:ios": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:ios:local",
26
+ "dev:gui:ios:relay": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:ios:relay",
27
+ "dev:gui:android": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:android:local",
28
+ "dev:gui:android:relay": "yarn build && node bin/aimux-dev daemon ensure && yarn --cwd app dev:android:relay",
29
+ "dev:gui:relay": "yarn dev:gui:web:relay",
30
+ "dev:daemon": "node bin/aimux-dev daemon restart",
31
+ "dev:daemon:openrig": "bash scripts/dev-lanes/openrig-runtime-core.sh daemon restart",
32
+ "dev:aimux:openrig": "bash scripts/dev-lanes/openrig-runtime-core.sh",
17
33
  "start": "node dist/main.js",
18
- "desktop:dev": "cd desktop-ui && yarn dev & cd src-tauri && cargo tauri dev",
19
- "desktop:build": "cd desktop-ui && yarn build && cd ../src-tauri && cargo tauri build",
20
34
  "test": "vitest run",
21
35
  "test:watch": "vitest",
22
36
  "typecheck": "tsc --noEmit",
@@ -24,11 +38,12 @@
24
38
  "format": "prettier --write src/",
25
39
  "format:check": "prettier --check src/",
26
40
  "verify": "yarn typecheck && yarn lint && yarn test",
41
+ "verify:codex-instructions": "bash scripts/verify-codex-developer-instructions.sh",
27
42
  "release:asset": "bash scripts/build-release-asset.sh",
28
43
  "release:patch": "yarn version --patch && git push --follow-tags",
29
44
  "release:minor": "yarn version --minor && git push --follow-tags",
30
45
  "release:major": "yarn version --major && git push --follow-tags",
31
- "prepack": "yarn build",
46
+ "prepack": "yarn build && yarn build:ui:local",
32
47
  "prepare": "husky",
33
48
  "postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-*/spawn-helper 2>/dev/null || true"
34
49
  },
@@ -50,24 +65,25 @@
50
65
  },
51
66
  "type": "module",
52
67
  "engines": {
53
- "node": ">=18"
68
+ "node": ">=24"
69
+ },
70
+ "volta": {
71
+ "node": "24.16.0",
72
+ "yarn": "1.22.21"
54
73
  },
55
74
  "dependencies": {
56
- "@tauri-apps/api": "^2.10.1",
57
- "@xterm/addon-fit": "^0.11.0",
58
- "@xterm/headless": "^6.0.0",
59
- "@xterm/xterm": "^6.0.0",
60
75
  "commander": "^14.0.0",
61
76
  "node-notifier": "^10.0.1",
62
77
  "node-pty": "^1.0.0",
63
78
  "proper-lockfile": "^4.1.2",
64
79
  "simple-git": "^3.33.0",
65
- "strip-ansi": "^7.1.0"
80
+ "strip-ansi": "^7.1.0",
81
+ "yaml": "^2.9.0"
66
82
  },
67
83
  "devDependencies": {
68
84
  "@eslint/js": "^10.0.1",
69
85
  "@humanfs/core": "^0.19.1",
70
- "@types/node": "^22.0.0",
86
+ "@types/node": "^24.0.0",
71
87
  "@types/node-notifier": "^8.0.5",
72
88
  "@types/proper-lockfile": "^4.1.4",
73
89
  "eslint": "^10.0.3",
@@ -1,17 +0,0 @@
1
- export type AgentInputPart = {
2
- type: "text";
3
- text: string;
4
- } | {
5
- type: "image";
6
- path?: string;
7
- url?: string;
8
- attachmentId?: string;
9
- alt?: string;
10
- };
11
- export declare function serializeAgentInput(input: {
12
- data?: string;
13
- parts?: AgentInputPart[];
14
- }, options?: {
15
- tool?: string;
16
- resolveAttachmentPath?: (attachmentId: string) => string | null;
17
- }): string;
@@ -1,31 +0,0 @@
1
- export function serializeAgentInput(input, options = {}) {
2
- const parts = Array.isArray(input.parts) ? input.parts : [];
3
- if (parts.length === 0) {
4
- return String(input.data ?? "");
5
- }
6
- const serializedParts = parts.map((part) => serializePart(part, options)).filter((chunk) => chunk.length > 0);
7
- if (serializedParts.length === 0) {
8
- return String(input.data ?? "");
9
- }
10
- return serializedParts.join("\n\n");
11
- }
12
- function serializePart(part, options) {
13
- if (part.type === "text") {
14
- return String(part.text ?? "");
15
- }
16
- const tool = (options.tool || "agent").trim() || "agent";
17
- const resolvedAttachmentPath = part.attachmentId?.trim()
18
- ? options.resolveAttachmentPath?.(part.attachmentId.trim())
19
- : null;
20
- const source = part.path?.trim() || resolvedAttachmentPath || part.url?.trim() || part.attachmentId?.trim() || "";
21
- if (!source) {
22
- return "";
23
- }
24
- const alt = part.alt?.trim();
25
- const lines = [`[inline image for ${tool}]`, `source: ${source}`];
26
- if (alt) {
27
- lines.push(`alt: ${alt}`);
28
- }
29
- return lines.join("\n");
30
- }
31
- //# sourceMappingURL=agent-message-parts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-message-parts.js","sourceRoot":"","sources":["../src/agent-message-parts.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,mBAAmB,CACjC,KAGC,EACD,UAA8F,EAAE;IAEhG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9G,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,aAAa,CACpB,IAAoB,EACpB,OAA2F;IAE3F,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;IACzD,MAAM,sBAAsB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;QACtD,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,sBAAsB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,qBAAqB,IAAI,GAAG,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,32 +0,0 @@
1
- import { type InstanceInfo, type InstanceSessionRef } from "./instance-registry.js";
2
- export interface SessionsFileEntry {
3
- id: string;
4
- tool: string;
5
- status: string;
6
- backendSessionId?: string;
7
- worktreePath?: string;
8
- instance?: string;
9
- }
10
- export interface InstanceDirectoryFns {
11
- getRemoteInstances?: (ownInstanceId: string, cwd: string) => InstanceInfo[];
12
- registerInstance?: (instanceId: string, cwd: string) => Promise<InstanceInfo[]>;
13
- unregisterInstance?: (instanceId: string, cwd: string) => Promise<void>;
14
- updateHeartbeat?: (instanceId: string, sessions: InstanceSessionRef[], cwd: string) => Promise<string[]>;
15
- claimSession?: (sessionId: string, fromInstanceId: string, cwd: string) => Promise<InstanceSessionRef | undefined>;
16
- }
17
- export declare class InstanceDirectory {
18
- private readonly fns;
19
- constructor(fns?: InstanceDirectoryFns);
20
- getRemoteInstancesSafe(ownInstanceId: string, cwd: string): InstanceInfo[];
21
- registerInstance(instanceId: string, cwd: string): Promise<InstanceInfo[]>;
22
- unregisterInstance(instanceId: string, cwd: string): Promise<void>;
23
- getRemoteOwnedSessionKeys(ownInstanceId: string, cwd: string): Set<string>;
24
- updateHeartbeat(instanceId: string, sessions: InstanceSessionRef[], cwd: string): Promise<string[]>;
25
- reconcileHeartbeat(instanceId: string, sessions: InstanceSessionRef[], cwd: string, confirmedRegistered: Set<string>): Promise<{
26
- claimedIds: string[];
27
- confirmedIds: Set<string>;
28
- skippedClaimDetection: boolean;
29
- }>;
30
- claimSession(sessionId: string, fromInstanceId: string, cwd: string): Promise<InstanceSessionRef | undefined>;
31
- buildSessionsFileEntries(localSessions: InstanceSessionRef[], remoteInstances: InstanceInfo[]): SessionsFileEntry[];
32
- }
@@ -1,82 +0,0 @@
1
- import { claimSession, getRemoteInstances, registerInstance, unregisterInstance, updateHeartbeat, } from "./instance-registry.js";
2
- import { getRemoteOwnedSessionKeys } from "./dashboard/session-registry.js";
3
- export class InstanceDirectory {
4
- fns;
5
- constructor(fns = {}) {
6
- this.fns = fns;
7
- }
8
- getRemoteInstancesSafe(ownInstanceId, cwd) {
9
- try {
10
- return (this.fns.getRemoteInstances ?? getRemoteInstances)(ownInstanceId, cwd);
11
- }
12
- catch {
13
- return [];
14
- }
15
- }
16
- async registerInstance(instanceId, cwd) {
17
- return (this.fns.registerInstance ?? registerInstance)(instanceId, cwd);
18
- }
19
- async unregisterInstance(instanceId, cwd) {
20
- return (this.fns.unregisterInstance ?? unregisterInstance)(instanceId, cwd);
21
- }
22
- getRemoteOwnedSessionKeys(ownInstanceId, cwd) {
23
- return getRemoteOwnedSessionKeys(this.getRemoteInstancesSafe(ownInstanceId, cwd));
24
- }
25
- async updateHeartbeat(instanceId, sessions, cwd) {
26
- return (this.fns.updateHeartbeat ?? updateHeartbeat)(instanceId, sessions, cwd);
27
- }
28
- async reconcileHeartbeat(instanceId, sessions, cwd, confirmedRegistered) {
29
- const previousIds = await this.updateHeartbeat(instanceId, sessions, cwd);
30
- const nextConfirmed = new Set(confirmedRegistered);
31
- const claimedIds = [];
32
- let skippedClaimDetection = false;
33
- if (previousIds.length > 0 || confirmedRegistered.size === 0) {
34
- const previousSet = new Set(previousIds);
35
- for (const id of confirmedRegistered) {
36
- if (!previousSet.has(id)) {
37
- claimedIds.push(id);
38
- nextConfirmed.delete(id);
39
- }
40
- }
41
- }
42
- else if (confirmedRegistered.size > 0) {
43
- skippedClaimDetection = true;
44
- }
45
- for (const session of sessions) {
46
- nextConfirmed.add(session.id);
47
- }
48
- return {
49
- claimedIds,
50
- confirmedIds: nextConfirmed,
51
- skippedClaimDetection,
52
- };
53
- }
54
- async claimSession(sessionId, fromInstanceId, cwd) {
55
- return (this.fns.claimSession ?? claimSession)(sessionId, fromInstanceId, cwd);
56
- }
57
- buildSessionsFileEntries(localSessions, remoteInstances) {
58
- const data = localSessions.map((session) => ({
59
- id: session.id,
60
- tool: session.tool,
61
- status: "running",
62
- backendSessionId: session.backendSessionId,
63
- worktreePath: session.worktreePath,
64
- }));
65
- for (const inst of remoteInstances) {
66
- for (const session of inst.sessions) {
67
- if (data.some((entry) => entry.id === session.id))
68
- continue;
69
- data.push({
70
- id: session.id,
71
- tool: session.tool,
72
- status: "running",
73
- backendSessionId: session.backendSessionId,
74
- worktreePath: session.worktreePath,
75
- instance: `PID ${inst.pid}`,
76
- });
77
- }
78
- }
79
- return data;
80
- }
81
- }
82
- //# sourceMappingURL=instance-directory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instance-directory.js","sourceRoot":"","sources":["../src/instance-directory.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- export interface InstanceSessionRef {
2
- id: string;
3
- tool: string;
4
- createdAt?: string;
5
- backendSessionId?: string;
6
- worktreePath?: string;
7
- }
8
- export interface InstanceInfo {
9
- instanceId: string;
10
- pid: number;
11
- startedAt: string;
12
- heartbeat: string;
13
- cwd: string;
14
- sessions: InstanceSessionRef[];
15
- }
16
- /**
17
- * Register this instance in instances.json.
18
- */
19
- export declare function registerInstance(instanceId: string, cwd: string): Promise<InstanceInfo[]>;
20
- /**
21
- * Unregister this instance from instances.json.
22
- */
23
- export declare function unregisterInstance(instanceId: string, cwd: string): Promise<void>;
24
- /**
25
- * Update heartbeat timestamp and sessions list. Also prunes dead instances.
26
- * Returns the session IDs that were in the registry BEFORE this update
27
- * (so the caller can detect which were claimed by comparing against expectations).
28
- */
29
- export declare function updateHeartbeat(instanceId: string, sessions: InstanceSessionRef[], cwd: string): Promise<string[]>;
30
- /**
31
- * Get instances belonging to other aimux processes.
32
- * Reads from all known instances.json files for cross-worktree visibility.
33
- */
34
- export declare function getRemoteInstances(ownInstanceId: string, cwd: string): InstanceInfo[];
35
- /**
36
- * Remove a session from another instance's entry (takeover step).
37
- * Returns the claimed session ref, or undefined if not found.
38
- */
39
- export declare function claimSession(sessionId: string, fromInstanceId: string, cwd: string): Promise<InstanceSessionRef | undefined>;
@@ -1,208 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
- import { join } from "node:path";
3
- import * as lockfile from "proper-lockfile";
4
- import { getInstancesPath, getAimuxDirFor } from "./paths.js";
5
- import { findMainRepo } from "./worktree.js";
6
- import { debug } from "./debug.js";
7
- const HEARTBEAT_STALE_MS = 15_000;
8
- const LOCK_RETRIES = { retries: 5, minTimeout: 50 };
9
- /**
10
- * Check if a PID is alive.
11
- */
12
- function isPidAlive(pid) {
13
- try {
14
- process.kill(pid, 0);
15
- return true;
16
- }
17
- catch {
18
- return false;
19
- }
20
- }
21
- /**
22
- * Filter out dead instances (dead PID or stale heartbeat).
23
- */
24
- function pruneDeadEntries(instances) {
25
- const now = Date.now();
26
- return instances.filter((inst) => {
27
- if (!isPidAlive(inst.pid)) {
28
- debug(`pruning dead instance ${inst.instanceId} (PID ${inst.pid} dead)`, "instance");
29
- return false;
30
- }
31
- const heartbeatAge = now - new Date(inst.heartbeat).getTime();
32
- if (heartbeatAge > HEARTBEAT_STALE_MS) {
33
- debug(`pruning stale instance ${inst.instanceId} (heartbeat ${Math.round(heartbeatAge / 1000)}s old)`, "instance");
34
- return false;
35
- }
36
- return true;
37
- });
38
- }
39
- /**
40
- * Read instances.json, returning empty array if missing or corrupt.
41
- */
42
- function readInstancesFile(filePath) {
43
- if (!existsSync(filePath))
44
- return [];
45
- try {
46
- return JSON.parse(readFileSync(filePath, "utf-8"));
47
- }
48
- catch {
49
- return [];
50
- }
51
- }
52
- /**
53
- * Ensure the directory for the instances file exists and the file is created.
54
- */
55
- function ensureInstancesFile(filePath) {
56
- const dir = filePath.replace(/\/[^/]+$/, "");
57
- if (!existsSync(dir)) {
58
- mkdirSync(dir, { recursive: true });
59
- }
60
- if (!existsSync(filePath)) {
61
- writeFileSync(filePath, "[]");
62
- }
63
- }
64
- /**
65
- * Run an operation against instances.json with locking.
66
- * Operates on both the global project state dir and the main repo (for cross-worktree discovery).
67
- */
68
- async function withLockedInstances(cwd, fn) {
69
- const paths = getInstancesPaths(cwd);
70
- for (const filePath of paths) {
71
- ensureInstancesFile(filePath);
72
- let release;
73
- try {
74
- release = await lockfile.lock(filePath, { retries: LOCK_RETRIES });
75
- const instances = readInstancesFile(filePath);
76
- const updated = fn(instances, filePath);
77
- writeFileSync(filePath, JSON.stringify(updated, null, 2) + "\n");
78
- }
79
- finally {
80
- if (release)
81
- await release();
82
- }
83
- }
84
- }
85
- /**
86
- * Get all instances.json paths to update (global project state + main repo .aimux/ if different).
87
- * The global path is primary; the in-repo path is for cross-worktree discovery by older instances.
88
- */
89
- function getInstancesPaths(cwd) {
90
- const globalPath = getInstancesPath();
91
- const paths = [globalPath];
92
- // Also write to in-repo .aimux/ for backward compat with older instances
93
- try {
94
- const mainRepo = findMainRepo(cwd);
95
- const inRepoPath = join(getAimuxDirFor(mainRepo), "instances.json");
96
- if (inRepoPath !== globalPath) {
97
- paths.push(inRepoPath);
98
- }
99
- }
100
- catch {
101
- // Not in a git repo or worktree detection failed — global only
102
- }
103
- return paths;
104
- }
105
- /**
106
- * Register this instance in instances.json.
107
- */
108
- export async function registerInstance(instanceId, cwd) {
109
- let remoteInstances = [];
110
- await withLockedInstances(cwd, (instances) => {
111
- const pruned = pruneDeadEntries(instances);
112
- const entry = {
113
- instanceId,
114
- pid: process.pid,
115
- startedAt: new Date().toISOString(),
116
- heartbeat: new Date().toISOString(),
117
- cwd,
118
- sessions: [],
119
- };
120
- const updated = [...pruned, entry];
121
- remoteInstances = pruned.filter((i) => i.instanceId !== instanceId);
122
- return updated;
123
- });
124
- if (remoteInstances.length > 0) {
125
- debug(`registered instance ${instanceId}, found ${remoteInstances.length} other instance(s)`, "instance");
126
- }
127
- else {
128
- debug(`registered instance ${instanceId} (sole instance)`, "instance");
129
- }
130
- return remoteInstances;
131
- }
132
- /**
133
- * Unregister this instance from instances.json.
134
- */
135
- export async function unregisterInstance(instanceId, cwd) {
136
- await withLockedInstances(cwd, (instances) => {
137
- return instances.filter((i) => i.instanceId !== instanceId);
138
- });
139
- debug(`unregistered instance ${instanceId}`, "instance");
140
- }
141
- /**
142
- * Update heartbeat timestamp and sessions list. Also prunes dead instances.
143
- * Returns the session IDs that were in the registry BEFORE this update
144
- * (so the caller can detect which were claimed by comparing against expectations).
145
- */
146
- export async function updateHeartbeat(instanceId, sessions, cwd) {
147
- // Collect previous session IDs across ALL instances.json files (global + in-repo).
148
- // withLockedInstances calls the callback once per file, so we merge results.
149
- const allPreviousIds = new Set();
150
- await withLockedInstances(cwd, (instances) => {
151
- // Prune dead instances, but never prune ourselves — we know we're alive
152
- const pruned = pruneDeadEntries(instances.filter((i) => i.instanceId !== instanceId));
153
- const self = instances.find((i) => i.instanceId === instanceId);
154
- const result = pruned.map((inst) => inst);
155
- if (self) {
156
- for (const s of self.sessions)
157
- allPreviousIds.add(s.id);
158
- result.push({ ...self, heartbeat: new Date().toISOString(), sessions });
159
- }
160
- return result;
161
- });
162
- return [...allPreviousIds];
163
- }
164
- /**
165
- * Get instances belonging to other aimux processes.
166
- * Reads from all known instances.json files for cross-worktree visibility.
167
- */
168
- export function getRemoteInstances(ownInstanceId, cwd) {
169
- const paths = getInstancesPaths(cwd);
170
- const seen = new Set();
171
- const result = [];
172
- for (const filePath of paths) {
173
- const instances = readInstancesFile(filePath);
174
- const alive = pruneDeadEntries(instances);
175
- for (const inst of alive) {
176
- if (inst.instanceId !== ownInstanceId && !seen.has(inst.instanceId)) {
177
- seen.add(inst.instanceId);
178
- result.push(inst);
179
- }
180
- }
181
- }
182
- return result;
183
- }
184
- /**
185
- * Remove a session from another instance's entry (takeover step).
186
- * Returns the claimed session ref, or undefined if not found.
187
- */
188
- export async function claimSession(sessionId, fromInstanceId, cwd) {
189
- let claimed;
190
- await withLockedInstances(cwd, (instances) => {
191
- return instances.map((inst) => {
192
- if (inst.instanceId === fromInstanceId) {
193
- const session = inst.sessions.find((s) => s.id === sessionId);
194
- if (session) {
195
- claimed = session;
196
- debug(`claimed session ${sessionId} from instance ${fromInstanceId}`, "instance");
197
- return {
198
- ...inst,
199
- sessions: inst.sessions.filter((s) => s.id !== sessionId),
200
- };
201
- }
202
- }
203
- return inst;
204
- });
205
- });
206
- return claimed;
207
- }
208
- //# sourceMappingURL=instance-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instance-registry.js","sourceRoot":"","sources":["../src/instance-registry.ts"],"names":[],"mappings":"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"}