aimux-cli 0.1.18 → 0.1.20

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 (304) hide show
  1. package/README.md +13 -4
  2. package/bin/aimux +4 -0
  3. package/bin/aimux-dev +2 -6
  4. package/dist/agent-events.js +0 -1
  5. package/dist/agent-output-parser-audit.d.ts +23 -0
  6. package/dist/agent-output-parser-audit.js +187 -0
  7. package/dist/agent-output-parser-contract.d.ts +9 -0
  8. package/dist/agent-output-parser-contract.js +33 -0
  9. package/dist/agent-output-parser-fixtures.d.ts +15 -0
  10. package/dist/agent-output-parser-fixtures.js +593 -0
  11. package/dist/agent-output-parser-harness.d.ts +21 -0
  12. package/dist/agent-output-parser-harness.js +43 -0
  13. package/dist/agent-output-parser-test-utils.d.ts +1 -0
  14. package/dist/agent-output-parser-test-utils.js +7 -0
  15. package/dist/agent-output-parser.js +215 -36
  16. package/dist/agent-prompt-delivery.js +0 -1
  17. package/dist/agent-tracker.js +0 -1
  18. package/dist/agent-watcher.js +0 -1
  19. package/dist/alert-display.js +0 -1
  20. package/dist/atomic-write.d.ts +15 -0
  21. package/dist/atomic-write.js +69 -5
  22. package/dist/attachment-store.d.ts +7 -0
  23. package/dist/attachment-store.js +64 -6
  24. package/dist/backend-session-discovery.d.ts +17 -0
  25. package/dist/backend-session-discovery.js +57 -0
  26. package/dist/builtin-metadata-watchers.js +0 -1
  27. package/dist/claude-hooks.js +0 -1
  28. package/dist/config.js +9 -5
  29. package/dist/connection-targets.js +20 -2
  30. package/dist/context/compactor.js +0 -1
  31. package/dist/context/context-bridge.js +4 -2
  32. package/dist/context/context-file.js +0 -1
  33. package/dist/context/history.js +0 -1
  34. package/dist/credentials.js +3 -7
  35. package/dist/daemon.d.ts +1 -0
  36. package/dist/daemon.js +16 -1
  37. package/dist/dashboard/command-spec.js +0 -1
  38. package/dist/dashboard/feedback.js +0 -1
  39. package/dist/dashboard/index.d.ts +1 -0
  40. package/dist/dashboard/index.js +1 -1
  41. package/dist/dashboard/operation-failures.js +0 -1
  42. package/dist/dashboard/order.js +0 -1
  43. package/dist/dashboard/pending-actions.js +0 -1
  44. package/dist/dashboard/quick-jump.js +0 -1
  45. package/dist/dashboard/runtime-evidence.js +0 -1
  46. package/dist/dashboard/session-actions.js +0 -1
  47. package/dist/dashboard/session-registry.js +0 -1
  48. package/dist/dashboard/sort.js +0 -1
  49. package/dist/dashboard/state.js +0 -1
  50. package/dist/dashboard/targets.js +14 -3
  51. package/dist/dashboard/ui-state-store.js +4 -4
  52. package/dist/debug-state.js +0 -1
  53. package/dist/debug.js +0 -1
  54. package/dist/default-plugins/gh-pr-context.js +0 -1
  55. package/dist/default-plugins/transcript-length.js +0 -1
  56. package/dist/fast-control.js +0 -1
  57. package/dist/hotkeys.js +0 -1
  58. package/dist/http-client.js +0 -1
  59. package/dist/key-parser.js +0 -1
  60. package/dist/last-used.js +3 -3
  61. package/dist/launcher-env.d.ts +4 -0
  62. package/dist/launcher-env.js +70 -0
  63. package/dist/local-ui-server.js +0 -1
  64. package/dist/login-flow.js +0 -1
  65. package/dist/main.js +16 -2
  66. package/dist/managed-launch-env.js +0 -1
  67. package/dist/metadata-server.d.ts +13 -2
  68. package/dist/metadata-server.js +60 -5
  69. package/dist/metadata-store.js +4 -4
  70. package/dist/mobile-push-bridge.d.ts +8 -0
  71. package/dist/mobile-push-bridge.js +22 -0
  72. package/dist/mobile-push-throttle.d.ts +23 -0
  73. package/dist/mobile-push-throttle.js +53 -0
  74. package/dist/multiplexer/agent-io-methods.js +0 -1
  75. package/dist/multiplexer/archives.js +0 -1
  76. package/dist/multiplexer/dashboard-actions-methods.js +0 -1
  77. package/dist/multiplexer/dashboard-control.js +0 -1
  78. package/dist/multiplexer/dashboard-interaction.js +0 -1
  79. package/dist/multiplexer/dashboard-model.js +3 -3
  80. package/dist/multiplexer/dashboard-ops.d.ts +3 -2
  81. package/dist/multiplexer/dashboard-ops.js +2 -3
  82. package/dist/multiplexer/dashboard-state-methods.js +0 -1
  83. package/dist/multiplexer/dashboard-tail-methods.d.ts +3 -2
  84. package/dist/multiplexer/dashboard-tail-methods.js +2 -3
  85. package/dist/multiplexer/dashboard-view-methods.js +2 -1
  86. package/dist/multiplexer/graveyard-view-model.js +0 -1
  87. package/dist/multiplexer/index.d.ts +1 -1
  88. package/dist/multiplexer/index.js +4 -5
  89. package/dist/multiplexer/navigation.js +0 -1
  90. package/dist/multiplexer/notifications.js +0 -1
  91. package/dist/multiplexer/persistence-methods.js +2 -2
  92. package/dist/multiplexer/runtime-lifecycle-methods.js +6 -3
  93. package/dist/multiplexer/runtime-state.js +13 -2
  94. package/dist/multiplexer/runtime-sync.js +0 -1
  95. package/dist/multiplexer/service-state-snapshot.js +4 -3
  96. package/dist/multiplexer/services.js +5 -5
  97. package/dist/multiplexer/session-capture.js +0 -1
  98. package/dist/multiplexer/session-launch.d.ts +1 -1
  99. package/dist/multiplexer/session-launch.js +18 -7
  100. package/dist/multiplexer/session-runtime-core.js +9 -3
  101. package/dist/multiplexer/subscreens.js +0 -1
  102. package/dist/multiplexer/tool-picker.d.ts +2 -1
  103. package/dist/multiplexer/tool-picker.js +29 -22
  104. package/dist/multiplexer/worktree-graveyard.js +0 -1
  105. package/dist/multiplexer/worktrees.js +0 -1
  106. package/dist/notification-context.js +0 -1
  107. package/dist/notifications.js +0 -1
  108. package/dist/notify.d.ts +1 -1
  109. package/dist/notify.js +8 -6
  110. package/dist/orchestration-actions.js +0 -1
  111. package/dist/orchestration-routing.js +0 -1
  112. package/dist/orchestration.js +0 -1
  113. package/dist/osc-notifications.js +0 -1
  114. package/dist/paths.js +50 -5
  115. package/dist/pending-actions.js +0 -1
  116. package/dist/plugin-runtime.js +0 -1
  117. package/dist/project-events.js +0 -1
  118. package/dist/project-scanner.js +0 -1
  119. package/dist/project-service-manifest.js +0 -1
  120. package/dist/project-takeover.d.ts +1 -0
  121. package/dist/project-takeover.js +117 -0
  122. package/dist/recency.js +0 -1
  123. package/dist/recorder.js +0 -1
  124. package/dist/relay-client.d.ts +10 -0
  125. package/dist/relay-client.js +5 -1
  126. package/dist/remote-access.js +0 -1
  127. package/dist/runtime-core/backend-id-reconcile.d.ts +13 -0
  128. package/dist/runtime-core/backend-id-reconcile.js +23 -0
  129. package/dist/runtime-core/exchange-derived.js +0 -1
  130. package/dist/runtime-core/exchange-import.js +0 -1
  131. package/dist/runtime-core/exchange-store.js +3 -9
  132. package/dist/runtime-core/topology-services.js +0 -1
  133. package/dist/runtime-core/topology-sessions.js +0 -1
  134. package/dist/runtime-core/topology-store.js +3 -9
  135. package/dist/runtime-core/topology-worktrees.js +0 -1
  136. package/dist/runtime-migration.js +0 -1
  137. package/dist/runtime-owner.d.ts +3 -0
  138. package/dist/runtime-owner.js +10 -0
  139. package/dist/session-bootstrap.js +0 -1
  140. package/dist/session-runtime.js +0 -1
  141. package/dist/session-semantics.js +0 -1
  142. package/dist/shell-args.d.ts +13 -0
  143. package/dist/shell-args.js +25 -1
  144. package/dist/shell-hooks.d.ts +1 -0
  145. package/dist/shell-hooks.js +1 -1
  146. package/dist/shell-state.js +0 -1
  147. package/dist/status-detector.js +0 -1
  148. package/dist/statusline-model.js +0 -1
  149. package/dist/task-workflow.js +0 -1
  150. package/dist/tasks.js +0 -1
  151. package/dist/team.js +4 -4
  152. package/dist/terminal-host.js +0 -1
  153. package/dist/threads.js +0 -1
  154. package/dist/tmux/doctor.js +0 -1
  155. package/dist/tmux/inbox-popup.js +0 -1
  156. package/dist/tmux/runtime-manager.js +2 -1
  157. package/dist/tmux/session-transport.js +0 -1
  158. package/dist/tmux/statusline-cache.js +0 -1
  159. package/dist/tmux/statusline.js +0 -1
  160. package/dist/tmux/switcher.js +0 -1
  161. package/dist/tmux/window-open.js +0 -1
  162. package/dist/tool-output-watchers.js +0 -1
  163. package/dist/tui/render/box.js +0 -1
  164. package/dist/tui/render/text.js +0 -1
  165. package/dist/tui/screens/dashboard-renderers.js +6 -7
  166. package/dist/tui/screens/overlay-renderers.js +0 -1
  167. package/dist/tui/screens/subscreen-renderers.js +0 -1
  168. package/dist/vitest.setup.d.ts +1 -0
  169. package/dist/vitest.setup.js +9 -0
  170. package/dist/workflow.js +0 -1
  171. package/dist/worktree.js +0 -1
  172. package/dist-ui/_expo/static/css/web-8782287775683e5a944b821b854d0f60.css +1 -0
  173. package/dist-ui/_expo/static/js/web/{entry-477c745b2adc79367a4380ecf07d9ff6.js → entry-90d00d223eefabe5cc21e4329b274fa5.js} +260 -252
  174. package/dist-ui/index.html +2 -2
  175. package/package.json +5 -2
  176. package/dist/agent-events.js.map +0 -1
  177. package/dist/agent-output-parser.js.map +0 -1
  178. package/dist/agent-prompt-delivery.js.map +0 -1
  179. package/dist/agent-tracker.js.map +0 -1
  180. package/dist/agent-watcher.js.map +0 -1
  181. package/dist/alert-display.js.map +0 -1
  182. package/dist/atomic-write.js.map +0 -1
  183. package/dist/attachment-store.js.map +0 -1
  184. package/dist/builtin-metadata-watchers.js.map +0 -1
  185. package/dist/claude-hooks.js.map +0 -1
  186. package/dist/config.js.map +0 -1
  187. package/dist/connection-targets.js.map +0 -1
  188. package/dist/context/compactor.js.map +0 -1
  189. package/dist/context/context-bridge.js.map +0 -1
  190. package/dist/context/context-file.js.map +0 -1
  191. package/dist/context/history.js.map +0 -1
  192. package/dist/credentials.js.map +0 -1
  193. package/dist/daemon.js.map +0 -1
  194. package/dist/dashboard/command-spec.js.map +0 -1
  195. package/dist/dashboard/feedback.js.map +0 -1
  196. package/dist/dashboard/index.js.map +0 -1
  197. package/dist/dashboard/operation-failures.js.map +0 -1
  198. package/dist/dashboard/order.js.map +0 -1
  199. package/dist/dashboard/pending-actions.js.map +0 -1
  200. package/dist/dashboard/quick-jump.js.map +0 -1
  201. package/dist/dashboard/runtime-evidence.js.map +0 -1
  202. package/dist/dashboard/session-actions.js.map +0 -1
  203. package/dist/dashboard/session-registry.js.map +0 -1
  204. package/dist/dashboard/sort.js.map +0 -1
  205. package/dist/dashboard/state.js.map +0 -1
  206. package/dist/dashboard/targets.js.map +0 -1
  207. package/dist/dashboard/ui-state-store.js.map +0 -1
  208. package/dist/debug-state.js.map +0 -1
  209. package/dist/debug.js.map +0 -1
  210. package/dist/default-plugins/gh-pr-context.js.map +0 -1
  211. package/dist/default-plugins/transcript-length.js.map +0 -1
  212. package/dist/fast-control.js.map +0 -1
  213. package/dist/hotkeys.js.map +0 -1
  214. package/dist/http-client.js.map +0 -1
  215. package/dist/key-parser.js.map +0 -1
  216. package/dist/last-used.js.map +0 -1
  217. package/dist/local-ui-server.js.map +0 -1
  218. package/dist/login-flow.js.map +0 -1
  219. package/dist/main.js.map +0 -1
  220. package/dist/managed-launch-env.js.map +0 -1
  221. package/dist/metadata-server.js.map +0 -1
  222. package/dist/metadata-store.js.map +0 -1
  223. package/dist/multiplexer/agent-io-methods.js.map +0 -1
  224. package/dist/multiplexer/archives.js.map +0 -1
  225. package/dist/multiplexer/dashboard-actions-methods.js.map +0 -1
  226. package/dist/multiplexer/dashboard-control.js.map +0 -1
  227. package/dist/multiplexer/dashboard-interaction.js.map +0 -1
  228. package/dist/multiplexer/dashboard-model.js.map +0 -1
  229. package/dist/multiplexer/dashboard-ops.js.map +0 -1
  230. package/dist/multiplexer/dashboard-state-methods.js.map +0 -1
  231. package/dist/multiplexer/dashboard-tail-methods.js.map +0 -1
  232. package/dist/multiplexer/dashboard-view-methods.js.map +0 -1
  233. package/dist/multiplexer/graveyard-view-model.js.map +0 -1
  234. package/dist/multiplexer/index.js.map +0 -1
  235. package/dist/multiplexer/navigation.js.map +0 -1
  236. package/dist/multiplexer/notifications.js.map +0 -1
  237. package/dist/multiplexer/persistence-methods.js.map +0 -1
  238. package/dist/multiplexer/runtime-lifecycle-methods.js.map +0 -1
  239. package/dist/multiplexer/runtime-state.js.map +0 -1
  240. package/dist/multiplexer/runtime-sync.js.map +0 -1
  241. package/dist/multiplexer/service-state-snapshot.js.map +0 -1
  242. package/dist/multiplexer/services.js.map +0 -1
  243. package/dist/multiplexer/session-capture.js.map +0 -1
  244. package/dist/multiplexer/session-launch.js.map +0 -1
  245. package/dist/multiplexer/session-runtime-core.js.map +0 -1
  246. package/dist/multiplexer/subscreens.js.map +0 -1
  247. package/dist/multiplexer/tool-picker.js.map +0 -1
  248. package/dist/multiplexer/worktree-graveyard.js.map +0 -1
  249. package/dist/multiplexer/worktrees.js.map +0 -1
  250. package/dist/notification-context.js.map +0 -1
  251. package/dist/notifications.js.map +0 -1
  252. package/dist/notify.js.map +0 -1
  253. package/dist/orchestration-actions.js.map +0 -1
  254. package/dist/orchestration-routing.js.map +0 -1
  255. package/dist/orchestration.js.map +0 -1
  256. package/dist/osc-notifications.js.map +0 -1
  257. package/dist/paths.js.map +0 -1
  258. package/dist/pending-actions.js.map +0 -1
  259. package/dist/plugin-runtime.js.map +0 -1
  260. package/dist/project-events.js.map +0 -1
  261. package/dist/project-scanner.js.map +0 -1
  262. package/dist/project-service-manifest.js.map +0 -1
  263. package/dist/recency.js.map +0 -1
  264. package/dist/recorder.js.map +0 -1
  265. package/dist/relay-client.js.map +0 -1
  266. package/dist/remote-access.js.map +0 -1
  267. package/dist/runtime-core/exchange-derived.js.map +0 -1
  268. package/dist/runtime-core/exchange-import.js.map +0 -1
  269. package/dist/runtime-core/exchange-store.js.map +0 -1
  270. package/dist/runtime-core/topology-services.js.map +0 -1
  271. package/dist/runtime-core/topology-sessions.js.map +0 -1
  272. package/dist/runtime-core/topology-store.js.map +0 -1
  273. package/dist/runtime-core/topology-worktrees.js.map +0 -1
  274. package/dist/runtime-migration.js.map +0 -1
  275. package/dist/session-bootstrap.js.map +0 -1
  276. package/dist/session-runtime.js.map +0 -1
  277. package/dist/session-semantics.js.map +0 -1
  278. package/dist/shell-args.js.map +0 -1
  279. package/dist/shell-hooks.js.map +0 -1
  280. package/dist/shell-state.js.map +0 -1
  281. package/dist/status-detector.js.map +0 -1
  282. package/dist/statusline-model.js.map +0 -1
  283. package/dist/task-workflow.js.map +0 -1
  284. package/dist/tasks.js.map +0 -1
  285. package/dist/team.js.map +0 -1
  286. package/dist/terminal-host.js.map +0 -1
  287. package/dist/threads.js.map +0 -1
  288. package/dist/tmux/doctor.js.map +0 -1
  289. package/dist/tmux/inbox-popup.js.map +0 -1
  290. package/dist/tmux/runtime-manager.js.map +0 -1
  291. package/dist/tmux/session-transport.js.map +0 -1
  292. package/dist/tmux/statusline-cache.js.map +0 -1
  293. package/dist/tmux/statusline.js.map +0 -1
  294. package/dist/tmux/switcher.js.map +0 -1
  295. package/dist/tmux/window-open.js.map +0 -1
  296. package/dist/tool-output-watchers.js.map +0 -1
  297. package/dist/tui/render/box.js.map +0 -1
  298. package/dist/tui/render/text.js.map +0 -1
  299. package/dist/tui/screens/dashboard-renderers.js.map +0 -1
  300. package/dist/tui/screens/overlay-renderers.js.map +0 -1
  301. package/dist/tui/screens/subscreen-renderers.js.map +0 -1
  302. package/dist/workflow.js.map +0 -1
  303. package/dist/worktree.js.map +0 -1
  304. package/dist-ui/_expo/static/css/web-30453ede1678c16acb08b97e83e8646d.css +0 -1
@@ -0,0 +1,593 @@
1
+ export const AGENT_OUTPUT_PARSER_FIXTURES = [
2
+ {
3
+ name: "claude-feedback-survey-input",
4
+ tool: "claude",
5
+ raw: [
6
+ "⏺ There's our 2 at the top, then ~30 sequential Pine-related PRs (#584-616) — looks like autonomous-agent churn on",
7
+ " Pinescript compatibility.",
8
+ "",
9
+ " Want a closer look at any particular one, or a diff stat to see what files changed?",
10
+ "",
11
+ "* Churned for 15s",
12
+ "",
13
+ " 4 tasks (3 done, 1 in progress, 0 open)",
14
+ " ✓ Soft-archive retiring channels (lock + pinned redirect)",
15
+ " ✓ Apply target category structure",
16
+ " ■ Refresh #start-here welcome post via webhook",
17
+ " ✓ Move non-secret Discord/Slack channel config out of .env",
18
+ "",
19
+ "• How is Claude doing this session? (optional)",
20
+ " 1: Bad 2: Fine 3: Good 0: Dismiss",
21
+ "",
22
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
23
+ "❯ no that's fine, what's next?",
24
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
25
+ " user@host ~/workspace/project master ██░░░░38% Opus 4.7",
26
+ " ⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents",
27
+ ].join("\n"),
28
+ expected: [
29
+ {
30
+ type: "response",
31
+ includes: ["There's our 2 at the top", "Want a closer look"],
32
+ },
33
+ {
34
+ type: "status",
35
+ includes: ["How is Claude doing this session?", "no that's fine, what's next?", "bypass permissions on"],
36
+ },
37
+ ],
38
+ invariants: {
39
+ noPromptIncludes: ["no that's fine, what's next?"],
40
+ },
41
+ },
42
+ {
43
+ name: "codex-repeated-template-suggestion",
44
+ tool: "codex",
45
+ raw: [
46
+ "╭─────────────────────────────────────────╮",
47
+ "│ >_ OpenAI Codex (v0.136.0) │",
48
+ "│ │",
49
+ "│ model: loading /model to change │",
50
+ "│ directory: ~/workspace/project │",
51
+ "│ permissions: YOLO mode │",
52
+ "╰─────────────────────────────────────────╯",
53
+ "",
54
+ "› Implement {feature}",
55
+ "",
56
+ " gpt-5.5 default · ~/workspace/project/.aimux/worktrees/chat-sync",
57
+ "",
58
+ "╭─────────────────────────────────────────╮",
59
+ "│ >_ OpenAI Codex (v0.136.0) │",
60
+ "│ │",
61
+ "│ model: gpt-5.5 medium /model to change │",
62
+ "│ directory: ~/workspace/project │",
63
+ "│ permissions: YOLO mode │",
64
+ "╰─────────────────────────────────────────╯",
65
+ "",
66
+ "• Starting MCP servers (1/4): chrome-devtools, codex_apps, openaiDeveloperDocs (0s • esc to interrupt)",
67
+ "",
68
+ "› Implement {feature}",
69
+ "",
70
+ " gpt-5.5 medium · ~/workspace/project/.aimux/worktrees/chat-sync",
71
+ ].join("\n"),
72
+ expected: [
73
+ {
74
+ type: "meta",
75
+ includes: ["OpenAI Codex"],
76
+ },
77
+ {
78
+ type: "status",
79
+ includes: ["Implement {feature}", "Starting MCP servers", "gpt-5.5 medium"],
80
+ },
81
+ ],
82
+ invariants: {
83
+ noPromptIncludes: ["Implement {feature}"],
84
+ },
85
+ },
86
+ {
87
+ name: "codex-resume-session-picker-selection",
88
+ tool: "codex",
89
+ raw: [
90
+ "Resume a previous session",
91
+ " Type to search Filter: Cwd [All] Sort: [Updated] Created",
92
+ " ❯ now Saved as ~/cs/hyperprop/HANDOFF.md. Here it is: --- What: Decentralized eval prop firm on...",
93
+ " 1m ago previous agent was in a compact loop.TL;DR: we were trying to fix the iOS chat composer bein...",
94
+ " 15h ago reply exactly CODEX_PROTOCOL_OK",
95
+ ].join("\n"),
96
+ expected: [
97
+ {
98
+ type: "response",
99
+ includes: ["Resume a previous session", "Type to search"],
100
+ },
101
+ {
102
+ type: "status",
103
+ includes: ["now", "previous agent was in a compact loop", "CODEX_PROTOCOL_OK"],
104
+ },
105
+ ],
106
+ invariants: {
107
+ noPromptIncludes: ["Saved as ~/cs/hyperprop/HANDOFF.md", "previous agent was in a compact loop"],
108
+ },
109
+ },
110
+ {
111
+ name: "codex-working-directory-picker-selection",
112
+ tool: "codex",
113
+ raw: [
114
+ "Choose working directory to resume this session",
115
+ " Session = latest cwd recorded in the resumed session",
116
+ " Current = your current working directory",
117
+ " 1. Use session directory (/Users/sam/cs/aimux)",
118
+ "› 2. Use current directory (/Users/sam/cs/aimux/.aimux/worktrees/chat-parser)",
119
+ " Press enter to continue",
120
+ "│ >_ OpenAI Codex (v0.136.0) │",
121
+ "│ │",
122
+ "│ model: gpt-5.5 high /model to change │",
123
+ "│ directory: ~/cs/aimux/.aimux/worktrees/chat-parser │",
124
+ "│ permissions: YOLO mode │",
125
+ ].join("\n"),
126
+ expected: [
127
+ {
128
+ type: "response",
129
+ includes: ["Choose working directory", "Use session directory"],
130
+ },
131
+ {
132
+ type: "status",
133
+ includes: ["2. Use current directory", "Press enter to continue"],
134
+ },
135
+ {
136
+ type: "meta",
137
+ includes: ["OpenAI Codex", "permissions: YOLO mode"],
138
+ },
139
+ ],
140
+ invariants: {
141
+ noPromptIncludes: ["2. Use current directory"],
142
+ },
143
+ },
144
+ {
145
+ name: "codex-live-startup-suggestion-loop",
146
+ tool: "codex",
147
+ raw: [
148
+ "│ >_ OpenAI Codex (v0.136.0) │",
149
+ "│ │",
150
+ "│ model: loading /model to change │",
151
+ "│ directory: ~/workspace/project/.aimux/worktrees/polish │",
152
+ "│ permissions: YOLO mode │",
153
+ "› Explain this codebase",
154
+ " gpt-5.5 default · ~/workspace/project/.aimux/worktrees/polish",
155
+ "│ >_ OpenAI Codex (v0.136.0) │",
156
+ "│ │",
157
+ "│ model: loading /model to change │",
158
+ "│ directory: ~/workspace/project/.aimux/worktrees/polish │",
159
+ "│ permissions: YOLO mode │",
160
+ "• Starting MCP servers (0/4): chrome-devtools, codex_apps, node_repl, … (0s • esc to interrupt)",
161
+ "› Explain this codebase",
162
+ " gpt-5.5 default · ~/workspace/project/.aimux/worktrees/polish",
163
+ "│ >_ OpenAI Codex (v0.136.0) │",
164
+ "│ │",
165
+ "│ model: gpt-5.5 high /model to change │",
166
+ "│ directory: ~/workspace/project/.aimux/worktrees/polish │",
167
+ "│ permissions: YOLO mode │",
168
+ " Tip: Press Tab to queue a message when a task is running; otherwise it sends immediately (except !).",
169
+ "› Explain this codebase",
170
+ " gpt-5.5 high · ~/workspace/project/.aimux/worktrees/polish",
171
+ ].join("\n"),
172
+ expected: [
173
+ {
174
+ type: "meta",
175
+ includes: ["OpenAI Codex"],
176
+ },
177
+ {
178
+ type: "status",
179
+ includes: ["Explain this codebase", "Starting MCP servers", "Press Tab to queue a message"],
180
+ },
181
+ ],
182
+ invariants: {
183
+ noPromptIncludes: ["Explain this codebase"],
184
+ },
185
+ },
186
+ {
187
+ name: "codex-active-image-input-followed-by-suggestion",
188
+ tool: "codex",
189
+ raw: [
190
+ "› can you see this? Attached image files: - Screenshot.png (image/png, 120484 bytes): /workspace/project/.aimux/attachments/att_example.png",
191
+ "",
192
+ "• Working (4s • esc to interrupt)",
193
+ "",
194
+ "› Explain this codebase",
195
+ "",
196
+ " gpt-5.5 medium · ~/workspace/project",
197
+ ].join("\n"),
198
+ expected: [
199
+ {
200
+ type: "prompt",
201
+ includes: ["can you see this?", "Attached image files"],
202
+ },
203
+ {
204
+ type: "status",
205
+ includes: ["Working", "Explain this codebase", "gpt-5.5 medium"],
206
+ },
207
+ ],
208
+ invariants: {
209
+ noPromptIncludes: ["Explain this codebase"],
210
+ },
211
+ },
212
+ {
213
+ name: "codex-trailing-suggestion-after-status-output",
214
+ tool: "codex",
215
+ raw: [
216
+ "• This worktree looks clean and usable.",
217
+ "",
218
+ "• Ran git branch -vv && git rev-parse --abbrev-ref --symbolic-full-name @{u}",
219
+ " └ ## chat-parser",
220
+ "",
221
+ "› Explain this codebase",
222
+ "",
223
+ " gpt-5.5 high · ~/workspace/project",
224
+ ].join("\n"),
225
+ expected: [
226
+ {
227
+ type: "response",
228
+ includes: ["This worktree looks clean"],
229
+ },
230
+ {
231
+ type: "status",
232
+ includes: ["Ran git branch", "Explain this codebase", "gpt-5.5 high"],
233
+ },
234
+ ],
235
+ invariants: {
236
+ noPromptIncludes: ["Explain this codebase"],
237
+ },
238
+ },
239
+ {
240
+ name: "codex-command-output-tree-summary",
241
+ tool: "codex",
242
+ raw: [
243
+ "• Ran aimux daemon project-ensure --project /Users/sam/cs/hyperprop --json",
244
+ " └ {",
245
+ ' "project": {',
246
+ " … +5 lines (ctrl + t to view transcript)",
247
+ " }",
248
+ " }",
249
+ "",
250
+ "• The prod ensure completed.",
251
+ ].join("\n"),
252
+ expected: [
253
+ {
254
+ type: "status",
255
+ includes: ["Ran aimux daemon project-ensure", "└ {", "ctrl + t to view transcript"],
256
+ },
257
+ {
258
+ type: "response",
259
+ includes: ["The prod ensure completed"],
260
+ },
261
+ ],
262
+ },
263
+ {
264
+ name: "codex-bare-ran-command-status",
265
+ tool: "codex",
266
+ raw: [
267
+ "• Checking the branch.",
268
+ "",
269
+ "Ran git worktree list --porcelain",
270
+ "",
271
+ "• Bash(cd /tmp) is only a prose example here.",
272
+ ].join("\n"),
273
+ expected: [
274
+ {
275
+ type: "response",
276
+ includes: ["Checking the branch"],
277
+ },
278
+ {
279
+ type: "status",
280
+ includes: ["Ran git worktree list --porcelain"],
281
+ },
282
+ {
283
+ type: "response",
284
+ includes: ["Bash(cd /tmp) is only a prose example here."],
285
+ },
286
+ ],
287
+ },
288
+ {
289
+ name: "codex-result-summary-after-metadata-path",
290
+ tool: "codex",
291
+ raw: [
292
+ "~/.aimux/projects.json.backup-2026-06-06T06-44-29-597Z",
293
+ " Result:",
294
+ " - Registry: 23087 -> 6",
295
+ " - Live /projects: now ~0.24-0.51s",
296
+ " - Remaining projects: aimux, hyperprop, premys",
297
+ "",
298
+ "› Open a PR. run review-coderabbit until green. then merge and cut new branch.",
299
+ "■ Conversation interrupted - tell the model what to do differently.",
300
+ ].join("\n"),
301
+ expected: [
302
+ {
303
+ type: "meta",
304
+ includes: ["projects.json.backup"],
305
+ },
306
+ {
307
+ type: "response",
308
+ includes: ["Result:", "Registry: 23087 -> 6", "Remaining projects"],
309
+ },
310
+ {
311
+ type: "prompt",
312
+ includes: ["Open a PR"],
313
+ },
314
+ {
315
+ type: "status",
316
+ includes: ["Conversation interrupted"],
317
+ },
318
+ ],
319
+ },
320
+ {
321
+ name: "codex-completed-state-suggestion",
322
+ tool: "codex",
323
+ raw: [
324
+ "• A spiral wakes in ember light,",
325
+ " pink at the edge of morning.",
326
+ "",
327
+ "› Explain this codebase",
328
+ "",
329
+ " gpt-5.5 medium · ~/workspace/project",
330
+ ].join("\n"),
331
+ expected: [
332
+ {
333
+ type: "response",
334
+ includes: ["A spiral wakes", "pink at the edge of morning"],
335
+ },
336
+ {
337
+ type: "status",
338
+ includes: ["Explain this codebase", "gpt-5.5 medium"],
339
+ },
340
+ ],
341
+ invariants: {
342
+ noPromptIncludes: ["Explain this codebase"],
343
+ },
344
+ },
345
+ {
346
+ name: "claude-real-prompt-that-matches-codex-suggestion",
347
+ tool: "claude",
348
+ raw: ["⏺ Ready when you are.", "", "❯ Explain this codebase", "", " claude · ~/workspace/project"].join("\n"),
349
+ expected: [
350
+ {
351
+ type: "response",
352
+ includes: ["Ready when you are."],
353
+ },
354
+ {
355
+ type: "prompt",
356
+ includes: ["Explain this codebase"],
357
+ },
358
+ {
359
+ type: "status",
360
+ includes: ["claude", "~/workspace/project"],
361
+ },
362
+ ],
363
+ },
364
+ {
365
+ name: "claude-multi-unit-activity-status",
366
+ tool: "claude",
367
+ raw: [
368
+ "⏺ Good question — and I can actually check it, rather than take it on faith.",
369
+ "",
370
+ "* Cooked for 1m 2s · 1 shell still running",
371
+ "",
372
+ " user@host ~/workspace/project master ██░░░░5% Opus 4.8",
373
+ " ⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents",
374
+ ].join("\n"),
375
+ expected: [
376
+ {
377
+ type: "response",
378
+ includes: ["Good question"],
379
+ },
380
+ {
381
+ type: "status",
382
+ includes: ["Cooked for 1m 2s · 1 shell still running", "bypass permissions on"],
383
+ },
384
+ ],
385
+ },
386
+ {
387
+ name: "claude-live-tool-action-rows",
388
+ tool: "claude",
389
+ raw: [
390
+ "⏺ Good question. Let me check the relay status.",
391
+ "",
392
+ "⏺ Bash(cd /workspace/project; gh pr checks 5968)",
393
+ " ⎿ Running in the background (down arrow to manage)",
394
+ "",
395
+ "⏺ Read 2 files (ctrl+o to expand)",
396
+ "",
397
+ "⏺ Update(src/relay.ts)",
398
+ "",
399
+ "⏺ All checks are green. I can merge now.",
400
+ ].join("\n"),
401
+ expected: [
402
+ {
403
+ type: "response",
404
+ includes: ["Good question"],
405
+ excludes: ["Bash(cd", "Read 2 files", "Update(src/relay.ts)"],
406
+ },
407
+ {
408
+ type: "status",
409
+ includes: ["Bash(cd", "Running in the background", "Read 2 files", "Update(src/relay.ts)"],
410
+ },
411
+ {
412
+ type: "response",
413
+ includes: ["All checks are green"],
414
+ },
415
+ ],
416
+ },
417
+ {
418
+ name: "claude-malformed-animation-status",
419
+ tool: "claude",
420
+ raw: [
421
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
422
+ "user@host ~/workspace/project main Opus4.6(1Mcontext)",
423
+ "✢n",
424
+ "g",
425
+ "·…",
426
+ "✻Bew",
427
+ "ri",
428
+ "✶en",
429
+ "win…",
430
+ "(thinking)",
431
+ "·Brewing… (thinking)",
432
+ 'Bash(terminal-notifier-title"ClaudeCode"-message"Notificationtest-sessionstarted"-sounddefault)\r⎿ Running…',
433
+ "✢ Brewing… (thinking)",
434
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
435
+ ].join("\n"),
436
+ expected: [
437
+ {
438
+ type: "meta",
439
+ includes: ["user@host ~/workspace/project"],
440
+ },
441
+ {
442
+ type: "status",
443
+ includes: ["Brewing… (thinking)", "terminal-notifier"],
444
+ },
445
+ ],
446
+ },
447
+ {
448
+ name: "claude-compact-terminal-notifier-status",
449
+ tool: "claude",
450
+ raw: [
451
+ "⏺Read1file(ctrl+otoexpand)",
452
+ "⏺I'vereadyour~/CLAUDE.md.Ihaveallyourinstructionsloaded.",
453
+ '⏺Bash(terminal-notifier-title"ClaudeCode"-message"Readyfortasks-whatwouldyouliketoworkon?"-sound',
454
+ "default)",
455
+ "⎿ (Nooutput)",
456
+ "⏺Whatwouldyouliketoworkon?",
457
+ ].join("\n"),
458
+ expected: [
459
+ {
460
+ type: "status",
461
+ includes: ["Read1file"],
462
+ },
463
+ {
464
+ type: "response",
465
+ includes: ["I'vereadyour~/CLAUDE.md"],
466
+ },
467
+ {
468
+ type: "status",
469
+ includes: ["terminal-notifier", "Nooutput"],
470
+ },
471
+ {
472
+ type: "response",
473
+ includes: ["Whatwouldyouliketoworkon?"],
474
+ },
475
+ ],
476
+ },
477
+ {
478
+ name: "claude-collapsed-approval-status",
479
+ tool: "claude",
480
+ raw: [
481
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
482
+ "Brewing…",
483
+ "⏺\r────────────────────────────────────────────────────────────────────────────────────────────────\rBash command\r",
484
+ ' terminal-notifier-title"ClaudeCode"-message"Notificationtest-sessionstarted"-sounddefault',
485
+ " Test notification at session start",
486
+ "Thiscommandrequiresapproval",
487
+ "Doyouwanttoproceed?",
488
+ "7;185;249m❯1.Yes",
489
+ "2.Yes,anddon’taskagainfor:terminal-notifier:*",
490
+ "3.No",
491
+ "Esctocancel·Tabtoamend·ctrl+etoexplain",
492
+ ].join("\n"),
493
+ expected: [
494
+ {
495
+ type: "status",
496
+ includes: ["Brewing…", "Thiscommandrequiresapproval", "Doyouwanttoproceed?"],
497
+ },
498
+ ],
499
+ },
500
+ {
501
+ name: "codex-unknown-activity-verb-status",
502
+ tool: "codex",
503
+ raw: ["› run the thing", "", "* Carbonated for 42s", "", " gpt-5.5 medium · ~/workspace/project"].join("\n"),
504
+ expected: [
505
+ {
506
+ type: "prompt",
507
+ includes: ["run the thing"],
508
+ },
509
+ {
510
+ type: "status",
511
+ includes: ["Carbonated for 42s", "gpt-5.5 medium"],
512
+ },
513
+ ],
514
+ },
515
+ {
516
+ name: "codex-ellipsis-activity-status",
517
+ tool: "codex",
518
+ raw: [
519
+ "› continue",
520
+ "",
521
+ "* Indexing… (running stop hook · 11s · ↓ 16 tokens)",
522
+ "",
523
+ " gpt-5.5 medium · ~/workspace/project",
524
+ ].join("\n"),
525
+ expected: [
526
+ {
527
+ type: "prompt",
528
+ includes: ["continue"],
529
+ },
530
+ {
531
+ type: "status",
532
+ includes: ["Indexing… (running stop hook · 11s · ↓ 16 tokens)", "gpt-5.5 medium"],
533
+ },
534
+ ],
535
+ },
536
+ {
537
+ name: "codex-dash-activity-status",
538
+ tool: "codex",
539
+ raw: [
540
+ "• PR #5914 is merged.",
541
+ "",
542
+ "- Worked for 20m 16s",
543
+ "",
544
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
545
+ "› Find and fix a bug in @filename",
546
+ "────────────────────────────────────────────────────────────────────────────────────────────────",
547
+ " gpt-5.5 medium · ~/workspace/project · Main [default]",
548
+ ].join("\n"),
549
+ expected: [
550
+ {
551
+ type: "response",
552
+ includes: ["PR #5914 is merged."],
553
+ },
554
+ {
555
+ type: "status",
556
+ includes: ["Worked for 20m 16s", "Find and fix a bug in @filename", "gpt-5.5 medium"],
557
+ },
558
+ ],
559
+ invariants: {
560
+ noPromptIncludes: ["Find and fix a bug in @filename"],
561
+ },
562
+ },
563
+ {
564
+ name: "claude-wrapped-bash-action-status",
565
+ tool: "claude",
566
+ raw: [
567
+ "⏺ Running verification.",
568
+ "",
569
+ "⏺ Bash(cd /Users/sam/cs/aimux/.aimux/worktrees/polish",
570
+ ' export PATH="$HOME/.nvm/versions/node/v24.16.0/bin:$PATH"…)',
571
+ " ⎿ === relay typecheck ===",
572
+ " warning ../../../../../package.json: No license field",
573
+ " $ tsc --noEmit",
574
+ " … +9 lines (ctrl+o to expand)",
575
+ "",
576
+ "⏺ Green. Committing on polish-next, pushing, and opening the PR:",
577
+ ].join("\n"),
578
+ expected: [
579
+ {
580
+ type: "response",
581
+ includes: ["Running verification."],
582
+ },
583
+ {
584
+ type: "status",
585
+ includes: ["Bash(cd /Users/sam/cs/aimux/.aimux/worktrees/polish", "relay typecheck"],
586
+ },
587
+ {
588
+ type: "response",
589
+ includes: ["Green. Committing on polish-next"],
590
+ },
591
+ ],
592
+ },
593
+ ];
@@ -0,0 +1,21 @@
1
+ import type { ParsedAgentOutput } from "./agent-output-parser.js";
2
+ export interface AgentOutputParserHarnessSession {
3
+ id: string;
4
+ tool: string;
5
+ output: string;
6
+ }
7
+ export interface AgentOutputParserHarnessRead {
8
+ sessionId: string;
9
+ output: string;
10
+ startLine?: number;
11
+ parsed: ParsedAgentOutput;
12
+ }
13
+ export interface AgentOutputParserHarness {
14
+ read(sessionId: string, startLine?: number): Promise<AgentOutputParserHarnessRead>;
15
+ readAll(startLine?: number): Promise<AgentOutputParserHarnessRead[]>;
16
+ setOutput(sessionId: string, output: string): void;
17
+ }
18
+ export declare function createAgentOutputParserHarness(sessions: AgentOutputParserHarnessSession[], options?: {
19
+ projectRoot?: string;
20
+ sessionName?: string;
21
+ }): AgentOutputParserHarness;
@@ -0,0 +1,43 @@
1
+ import { readAgentOutput } from "./multiplexer/session-runtime-core.js";
2
+ export function createAgentOutputParserHarness(sessions, options = {}) {
3
+ const sessionName = options.sessionName ?? "aimux-parser-harness";
4
+ const outputs = new Map(sessions.map((session) => [session.id, session.output]));
5
+ const targets = new Map();
6
+ const sessionsByWindowId = new Map();
7
+ sessions.forEach((session, index) => {
8
+ const target = {
9
+ sessionName,
10
+ windowId: `@parser-${index + 1}`,
11
+ windowIndex: index + 1,
12
+ windowName: session.tool,
13
+ };
14
+ targets.set(session.id, target);
15
+ sessionsByWindowId.set(target.windowId, session.id);
16
+ });
17
+ const host = {
18
+ sessions: sessions.map((session) => ({ id: session.id, exited: false })),
19
+ sessionToolKeys: new Map(sessions.map((session) => [session.id, session.tool])),
20
+ sessionTmuxTargets: targets,
21
+ tmuxRuntimeManager: {
22
+ captureTarget(target) {
23
+ const sessionId = sessionsByWindowId.get(target.windowId);
24
+ return sessionId ? (outputs.get(sessionId) ?? "") : "";
25
+ },
26
+ },
27
+ projectRoot: options.projectRoot ?? "/tmp/aimux-parser-harness",
28
+ };
29
+ return {
30
+ read(sessionId, startLine) {
31
+ return readAgentOutput(host, sessionId, startLine);
32
+ },
33
+ readAll(startLine) {
34
+ return Promise.all(sessions.map((session) => readAgentOutput(host, session.id, startLine)));
35
+ },
36
+ setOutput(sessionId, output) {
37
+ if (!outputs.has(sessionId)) {
38
+ throw new Error(`Unknown parser harness session "${sessionId}"`);
39
+ }
40
+ outputs.set(sessionId, output);
41
+ },
42
+ };
43
+ }
@@ -0,0 +1 @@
1
+ export declare const getParserFixture: (name: string) => import("./agent-output-parser-fixtures.js").AgentOutputParserFixture;
@@ -0,0 +1,7 @@
1
+ import { AGENT_OUTPUT_PARSER_FIXTURES } from "./agent-output-parser-fixtures.js";
2
+ export const getParserFixture = (name) => {
3
+ const fixture = AGENT_OUTPUT_PARSER_FIXTURES.find((candidate) => candidate.name === name);
4
+ if (!fixture)
5
+ throw new Error(`Missing parser fixture ${name}`);
6
+ return fixture;
7
+ };