@wastedcode/claudemux 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/LICENSE +21 -0
  3. package/README.md +493 -0
  4. package/bin/claudemux +6 -0
  5. package/dist/agents/claude.d.ts +3 -0
  6. package/dist/agents/claude.d.ts.map +1 -0
  7. package/dist/agents/claude.js +585 -0
  8. package/dist/agents/claude.js.map +1 -0
  9. package/dist/agents/index.d.ts +2 -0
  10. package/dist/agents/index.d.ts.map +1 -0
  11. package/dist/agents/index.js +2 -0
  12. package/dist/agents/index.js.map +1 -0
  13. package/dist/agents/types.d.ts +252 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +2 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/backends/tmux/capture.d.ts +25 -0
  18. package/dist/backends/tmux/capture.d.ts.map +1 -0
  19. package/dist/backends/tmux/capture.js +35 -0
  20. package/dist/backends/tmux/capture.js.map +1 -0
  21. package/dist/backends/tmux/exec.d.ts +105 -0
  22. package/dist/backends/tmux/exec.d.ts.map +1 -0
  23. package/dist/backends/tmux/exec.js +226 -0
  24. package/dist/backends/tmux/exec.js.map +1 -0
  25. package/dist/backends/tmux/index.d.ts +22 -0
  26. package/dist/backends/tmux/index.d.ts.map +1 -0
  27. package/dist/backends/tmux/index.js +108 -0
  28. package/dist/backends/tmux/index.js.map +1 -0
  29. package/dist/backends/tmux/keys.d.ts +38 -0
  30. package/dist/backends/tmux/keys.d.ts.map +1 -0
  31. package/dist/backends/tmux/keys.js +63 -0
  32. package/dist/backends/tmux/keys.js.map +1 -0
  33. package/dist/backends/tmux/options.d.ts +24 -0
  34. package/dist/backends/tmux/options.d.ts.map +1 -0
  35. package/dist/backends/tmux/options.js +84 -0
  36. package/dist/backends/tmux/options.js.map +1 -0
  37. package/dist/backends/tmux/sessions.d.ts +70 -0
  38. package/dist/backends/tmux/sessions.d.ts.map +1 -0
  39. package/dist/backends/tmux/sessions.js +156 -0
  40. package/dist/backends/tmux/sessions.js.map +1 -0
  41. package/dist/backends/tmux/socket.d.ts +26 -0
  42. package/dist/backends/tmux/socket.d.ts.map +1 -0
  43. package/dist/backends/tmux/socket.js +31 -0
  44. package/dist/backends/tmux/socket.js.map +1 -0
  45. package/dist/backends/types.d.ts +110 -0
  46. package/dist/backends/types.d.ts.map +1 -0
  47. package/dist/backends/types.js +24 -0
  48. package/dist/backends/types.js.map +1 -0
  49. package/dist/cli/ask.d.ts +11 -0
  50. package/dist/cli/ask.d.ts.map +1 -0
  51. package/dist/cli/ask.js +17 -0
  52. package/dist/cli/ask.js.map +1 -0
  53. package/dist/cli/capture.d.ts +8 -0
  54. package/dist/cli/capture.d.ts.map +1 -0
  55. package/dist/cli/capture.js +15 -0
  56. package/dist/cli/capture.js.map +1 -0
  57. package/dist/cli/context.d.ts +71 -0
  58. package/dist/cli/context.d.ts.map +1 -0
  59. package/dist/cli/context.js +82 -0
  60. package/dist/cli/context.js.map +1 -0
  61. package/dist/cli/exists.d.ts +7 -0
  62. package/dist/cli/exists.d.ts.map +1 -0
  63. package/dist/cli/exists.js +16 -0
  64. package/dist/cli/exists.js.map +1 -0
  65. package/dist/cli/interrupt.d.ts +10 -0
  66. package/dist/cli/interrupt.d.ts.map +1 -0
  67. package/dist/cli/interrupt.js +13 -0
  68. package/dist/cli/interrupt.js.map +1 -0
  69. package/dist/cli/kill.d.ts +7 -0
  70. package/dist/cli/kill.d.ts.map +1 -0
  71. package/dist/cli/kill.js +14 -0
  72. package/dist/cli/kill.js.map +1 -0
  73. package/dist/cli/list.d.ts +10 -0
  74. package/dist/cli/list.d.ts.map +1 -0
  75. package/dist/cli/list.js +19 -0
  76. package/dist/cli/list.js.map +1 -0
  77. package/dist/cli/main.d.ts +13 -0
  78. package/dist/cli/main.d.ts.map +1 -0
  79. package/dist/cli/main.js +143 -0
  80. package/dist/cli/main.js.map +1 -0
  81. package/dist/cli/messages.d.ts +9 -0
  82. package/dist/cli/messages.d.ts.map +1 -0
  83. package/dist/cli/messages.js +13 -0
  84. package/dist/cli/messages.js.map +1 -0
  85. package/dist/cli/respond.d.ts +10 -0
  86. package/dist/cli/respond.d.ts.map +1 -0
  87. package/dist/cli/respond.js +23 -0
  88. package/dist/cli/respond.js.map +1 -0
  89. package/dist/cli/resume.d.ts +12 -0
  90. package/dist/cli/resume.d.ts.map +1 -0
  91. package/dist/cli/resume.js +21 -0
  92. package/dist/cli/resume.js.map +1 -0
  93. package/dist/cli/send.d.ts +9 -0
  94. package/dist/cli/send.d.ts.map +1 -0
  95. package/dist/cli/send.js +16 -0
  96. package/dist/cli/send.js.map +1 -0
  97. package/dist/cli/spawn.d.ts +14 -0
  98. package/dist/cli/spawn.d.ts.map +1 -0
  99. package/dist/cli/spawn.js +21 -0
  100. package/dist/cli/spawn.js.map +1 -0
  101. package/dist/cli/state.d.ts +7 -0
  102. package/dist/cli/state.d.ts.map +1 -0
  103. package/dist/cli/state.js +11 -0
  104. package/dist/cli/state.js.map +1 -0
  105. package/dist/cli/turn-complete.d.ts +8 -0
  106. package/dist/cli/turn-complete.d.ts.map +1 -0
  107. package/dist/cli/turn-complete.js +14 -0
  108. package/dist/cli/turn-complete.js.map +1 -0
  109. package/dist/cli/wait.d.ts +13 -0
  110. package/dist/cli/wait.d.ts.map +1 -0
  111. package/dist/cli/wait.js +17 -0
  112. package/dist/cli/wait.js.map +1 -0
  113. package/dist/compose.d.ts +81 -0
  114. package/dist/compose.d.ts.map +1 -0
  115. package/dist/compose.js +64 -0
  116. package/dist/compose.js.map +1 -0
  117. package/dist/errors.d.ts +250 -0
  118. package/dist/errors.d.ts.map +1 -0
  119. package/dist/errors.js +300 -0
  120. package/dist/errors.js.map +1 -0
  121. package/dist/index.d.ts +22 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +17 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/io/baseline.d.ts +53 -0
  126. package/dist/io/baseline.d.ts.map +1 -0
  127. package/dist/io/baseline.js +97 -0
  128. package/dist/io/baseline.js.map +1 -0
  129. package/dist/io/capture.d.ts +15 -0
  130. package/dist/io/capture.d.ts.map +1 -0
  131. package/dist/io/capture.js +13 -0
  132. package/dist/io/capture.js.map +1 -0
  133. package/dist/io/interrupt.d.ts +46 -0
  134. package/dist/io/interrupt.d.ts.map +1 -0
  135. package/dist/io/interrupt.js +60 -0
  136. package/dist/io/interrupt.js.map +1 -0
  137. package/dist/io/respond.d.ts +28 -0
  138. package/dist/io/respond.d.ts.map +1 -0
  139. package/dist/io/respond.js +33 -0
  140. package/dist/io/respond.js.map +1 -0
  141. package/dist/io/send.d.ts +44 -0
  142. package/dist/io/send.d.ts.map +1 -0
  143. package/dist/io/send.js +66 -0
  144. package/dist/io/send.js.map +1 -0
  145. package/dist/io/stabilize.d.ts +28 -0
  146. package/dist/io/stabilize.d.ts.map +1 -0
  147. package/dist/io/stabilize.js +20 -0
  148. package/dist/io/stabilize.js.map +1 -0
  149. package/dist/io/wait.d.ts +47 -0
  150. package/dist/io/wait.d.ts.map +1 -0
  151. package/dist/io/wait.js +117 -0
  152. package/dist/io/wait.js.map +1 -0
  153. package/dist/observe/incremental.d.ts +28 -0
  154. package/dist/observe/incremental.d.ts.map +1 -0
  155. package/dist/observe/incremental.js +57 -0
  156. package/dist/observe/incremental.js.map +1 -0
  157. package/dist/observe/observer.d.ts +86 -0
  158. package/dist/observe/observer.d.ts.map +1 -0
  159. package/dist/observe/observer.js +167 -0
  160. package/dist/observe/observer.js.map +1 -0
  161. package/dist/observe/session-observer.d.ts +49 -0
  162. package/dist/observe/session-observer.d.ts.map +1 -0
  163. package/dist/observe/session-observer.js +123 -0
  164. package/dist/observe/session-observer.js.map +1 -0
  165. package/dist/session/adopt.d.ts +52 -0
  166. package/dist/session/adopt.d.ts.map +1 -0
  167. package/dist/session/adopt.js +57 -0
  168. package/dist/session/adopt.js.map +1 -0
  169. package/dist/session/boot.d.ts +66 -0
  170. package/dist/session/boot.d.ts.map +1 -0
  171. package/dist/session/boot.js +216 -0
  172. package/dist/session/boot.js.map +1 -0
  173. package/dist/session/constants.d.ts +57 -0
  174. package/dist/session/constants.d.ts.map +1 -0
  175. package/dist/session/constants.js +54 -0
  176. package/dist/session/constants.js.map +1 -0
  177. package/dist/session/create.d.ts +88 -0
  178. package/dist/session/create.d.ts.map +1 -0
  179. package/dist/session/create.js +66 -0
  180. package/dist/session/create.js.map +1 -0
  181. package/dist/session/default-backend.d.ts +27 -0
  182. package/dist/session/default-backend.d.ts.map +1 -0
  183. package/dist/session/default-backend.js +58 -0
  184. package/dist/session/default-backend.js.map +1 -0
  185. package/dist/session/handle.d.ts +63 -0
  186. package/dist/session/handle.d.ts.map +1 -0
  187. package/dist/session/handle.js +284 -0
  188. package/dist/session/handle.js.map +1 -0
  189. package/dist/session/hooks.d.ts +37 -0
  190. package/dist/session/hooks.d.ts.map +1 -0
  191. package/dist/session/hooks.js +42 -0
  192. package/dist/session/hooks.js.map +1 -0
  193. package/dist/session/mutex.d.ts +15 -0
  194. package/dist/session/mutex.d.ts.map +1 -0
  195. package/dist/session/mutex.js +29 -0
  196. package/dist/session/mutex.js.map +1 -0
  197. package/dist/session/recover.d.ts +43 -0
  198. package/dist/session/recover.d.ts.map +1 -0
  199. package/dist/session/recover.js +45 -0
  200. package/dist/session/recover.js.map +1 -0
  201. package/dist/session/ref.d.ts +2 -0
  202. package/dist/session/ref.d.ts.map +1 -0
  203. package/dist/session/ref.js +5 -0
  204. package/dist/session/ref.js.map +1 -0
  205. package/dist/session/registry.d.ts +31 -0
  206. package/dist/session/registry.d.ts.map +1 -0
  207. package/dist/session/registry.js +32 -0
  208. package/dist/session/registry.js.map +1 -0
  209. package/dist/session/resolve.d.ts +30 -0
  210. package/dist/session/resolve.d.ts.map +1 -0
  211. package/dist/session/resolve.js +24 -0
  212. package/dist/session/resolve.js.map +1 -0
  213. package/dist/session/resume.d.ts +68 -0
  214. package/dist/session/resume.d.ts.map +1 -0
  215. package/dist/session/resume.js +54 -0
  216. package/dist/session/resume.js.map +1 -0
  217. package/dist/session/spawn-boot.d.ts +44 -0
  218. package/dist/session/spawn-boot.d.ts.map +1 -0
  219. package/dist/session/spawn-boot.js +87 -0
  220. package/dist/session/spawn-boot.js.map +1 -0
  221. package/dist/session/validate.d.ts +10 -0
  222. package/dist/session/validate.d.ts.map +1 -0
  223. package/dist/session/validate.js +0 -0
  224. package/dist/session/validate.js.map +1 -0
  225. package/dist/state/classifier.d.ts +29 -0
  226. package/dist/state/classifier.d.ts.map +1 -0
  227. package/dist/state/classifier.js +37 -0
  228. package/dist/state/classifier.js.map +1 -0
  229. package/dist/state/types.d.ts +32 -0
  230. package/dist/state/types.d.ts.map +1 -0
  231. package/dist/state/types.js +2 -0
  232. package/dist/state/types.js.map +1 -0
  233. package/dist/types.d.ts +401 -0
  234. package/dist/types.d.ts.map +1 -0
  235. package/dist/types.js +9 -0
  236. package/dist/types.js.map +1 -0
  237. package/dist/util/ansi.d.ts +14 -0
  238. package/dist/util/ansi.d.ts.map +1 -0
  239. package/dist/util/ansi.js +18 -0
  240. package/dist/util/ansi.js.map +1 -0
  241. package/dist/util/emitter.d.ts +17 -0
  242. package/dist/util/emitter.d.ts.map +1 -0
  243. package/dist/util/emitter.js +33 -0
  244. package/dist/util/emitter.js.map +1 -0
  245. package/dist/util/sleep.d.ts +8 -0
  246. package/dist/util/sleep.d.ts.map +1 -0
  247. package/dist/util/sleep.js +10 -0
  248. package/dist/util/sleep.js.map +1 -0
  249. package/package.json +50 -0
@@ -0,0 +1,585 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { AgentSessionIdConflict } from "../errors.js";
5
+ import { stripSgr } from "../util/ansi.js";
6
+ /** Pane-substring test that ignores SGR styling (the pane is captured with `-e`). */
7
+ const includesPlain = (pane, needle) => stripSgr(pane).includes(needle);
8
+ /**
9
+ * The `claude` agent definition. **Sole file with claude-specific strings**;
10
+ * CI grep-test (T12) enforces this. Never imports from `src/backends/**`.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { create, claude } from "claudemux";
15
+ * await create({ name: "job", cwd: process.cwd(), agent: claude });
16
+ * ```
17
+ */
18
+ /**
19
+ * Pane-text substrings that classify a Claude Code permission prompt.
20
+ *
21
+ * **The stable signal is the prompt header `Do you want to <verb> <target>?`** —
22
+ * it precedes the `❯ 1. Yes / 2. Yes, allow all… / 3. No` menu for every
23
+ * tool class (Write/Edit/Bash/WebFetch/MCP). The trailing-space anchor
24
+ * `"Do you want to "` avoids matching the same phrase in prose. Verified
25
+ * verbatim against authenticated claude 2.1.162 (Write hello.txt → the pane
26
+ * reads `Do you want to create hello.txt?`); first enumerated on 2.1.153.
27
+ *
28
+ * Per [[decisions/0010-claudemux-owns-no-config]] detection and handling are
29
+ * **one unit** — this matcher is populated together with the menu mapping in
30
+ * {@link permissionPrompt} and the handle's `respond()`. A detected prompt now
31
+ * classifies as `permission-prompt` (still never `idle`), and `wait()` surfaces
32
+ * it as `{ kind: "awaiting", on: "permission-prompt" }` for the consumer to
33
+ * answer. The enumerated shapes live in
34
+ * `test/fixtures/permission-prompt-classifier-fixture.json`; the auth-gated
35
+ * replay (`permission-prompts.test.ts`) re-triggers each under network
36
+ * isolation. See README §5.
37
+ */
38
+ const PERMISSION_PROMPT_SUBSTRINGS = ["Do you want to "];
39
+ /**
40
+ * The selected first option of the approval menu — the cursor arrow `❯` then
41
+ * `1.`. This is the STRUCTURAL half of the classifier and it is what makes the
42
+ * header safe: the classifier scans the full visible region (40 rows), so a
43
+ * *completed* turn whose reply tail happens to end "…do you want to proceed?"
44
+ * sits in the window right above the empty input box, and an in-flight turn can
45
+ * stream the same phrase. The header substring alone would mis-fire on both.
46
+ * Requiring an actual selectable `❯ 1.` menu line — which an assistant reply
47
+ * never renders — disambiguates a real prompt from prose. (Boot dialogs also
48
+ * render `❯ 1.`, but they lack the header AND are classified *before*
49
+ * permission-prompt, so they never reach here.)
50
+ */
51
+ const PERMISSION_PROMPT_MENU = /❯ ?1\.\s/;
52
+ /**
53
+ * True when the captured pane shows a tool-approval prompt: the header
54
+ * (`Do you want to …?`) AND the selectable `❯ 1.` menu both present. Both
55
+ * halves are required — see {@link PERMISSION_PROMPT_MENU}.
56
+ */
57
+ function isPermissionPrompt(text) {
58
+ const plain = stripSgr(text);
59
+ return (PERMISSION_PROMPT_SUBSTRINGS.some((s) => plain.includes(s)) &&
60
+ PERMISSION_PROMPT_MENU.test(plain));
61
+ }
62
+ /**
63
+ * The keystroke that selects each neutral {@link PromptChoice} in claude's
64
+ * tool-approval menu. claude's option order is stable across tool classes:
65
+ * `1. Yes` (approve once) · `2. Yes, allow all … during this session` ·
66
+ * `3. No`. A bare digit selects AND confirms — no Enter (verified against
67
+ * authenticated claude 2.1.162: sending `1` to the Write prompt wrote the file
68
+ * immediately). The SOLE place that knows this order (layering grep keeps the
69
+ * vocabulary out of the agent-agnostic layers).
70
+ */
71
+ const PERMISSION_PROMPT_CHOICE_KEYS = {
72
+ approve: "1",
73
+ "approve-for-session": "2",
74
+ deny: "3",
75
+ };
76
+ const dialog = [
77
+ {
78
+ id: "theme-picker",
79
+ matches: (pane) => includesPlain(pane, "Choose the text style that looks best with your terminal"),
80
+ respond: { kind: "key", key: "Enter" },
81
+ },
82
+ {
83
+ id: "login-method",
84
+ // claudemux assumes the founder has already run `claude` interactively and
85
+ // signed in. If the login-method dialog fires, the setup is wrong, not
86
+ // something we should auto-answer — throw LoginRequired so the consumer
87
+ // sees a clean typed error instead of a hung session.
88
+ matches: (pane) => includesPlain(pane, "Select login method:"),
89
+ respond: { kind: "throw", errorClass: "LoginRequired" },
90
+ },
91
+ {
92
+ id: "workspace-trust",
93
+ // claude 2.1.153 wording: "Quick safety check: Is this a project you
94
+ // created or one you trust? … ❯ 1. Yes, I trust this folder". Match the
95
+ // option-label substring "trust this folder" — resilient to header copy
96
+ // edits. (Verified against authenticated 2.1.153 at product-acceptance.)
97
+ matches: (pane) => includesPlain(pane, "trust this folder"),
98
+ // Trusting a folder is an authority grant — fail closed. boot.ts throws
99
+ // WorkspaceUntrusted *before* sending "1" unless the consumer opted in
100
+ // via trustWorkspace. The "1" is the dismiss key used only when opted in.
101
+ respond: { kind: "key", key: "1" },
102
+ gate: { option: "trustWorkspace", errorClass: "WorkspaceUntrusted" },
103
+ },
104
+ ];
105
+ /**
106
+ * Is the REPL idle and ready for *new* input? True when the bottom-N pane
107
+ * contains an **empty** input box: a line that begins (at column 0) with the
108
+ * ready glyph `❯` and carries no *real* draft after it.
109
+ *
110
+ * **Why this needs ANSI styling (`capture -e`).** Since claude 2.1.16x the idle
111
+ * box is not blank — it shows a dim "ghost" placeholder hint, e.g.
112
+ * `❯ Try "how does <filepath> work?"`. In *plain* text that is indistinguishable
113
+ * from a real unsubmitted draft `❯ how does …`, so a plain-text check either
114
+ * mis-reads the placeholder as a draft (boot/`wait` hang — the bug this fixes)
115
+ * or, if it ignored trailing text, mis-reads a real draft as idle (silent
116
+ * turn-loss). The two are only separable by **intensity**: the placeholder is
117
+ * SGR-faint (code 2) and the block cursor is reverse-video (code 7); a real
118
+ * draft is normal intensity. So {@link lineIsEmptyBox} interprets the SGR state
119
+ * and treats only normal-intensity, non-cursor glyphs after `❯` as a draft.
120
+ * Verified against authenticated claude 2.1.162 (the ghost line decodes to
121
+ * `\e[39m❯ \e[7mT\e[0;2mry "…"\e[0m`; a draft to `\e[39m❯ hello\e[7m \e[0m`).
122
+ *
123
+ * What this still gets right (all confirmed against 2.1.162):
124
+ * - **Footer below the prompt** (`⏵⏵ bypass permissions …` / `? for shortcuts`)
125
+ * is not at column 0 with a leading `❯`, so scanning bottom-N for the box
126
+ * (not taking the last non-blank line) keeps boot / `state→idle` / `wait`
127
+ * anchored on the prompt.
128
+ * - **Draft echo is NOT idle** — normal-intensity glyphs after `❯`.
129
+ * - **Menu selection is NOT idle** — `❯ 1. …` has a normal-intensity digit.
130
+ *
131
+ * NOTE: on a *plain* (non-`-e`) capture the placeholder reads as a draft and
132
+ * this returns `false` — callers that need idle-detection must capture with
133
+ * ANSI on (see `CLASSIFIER_CAPTURE`). Structural readiness is also necessary
134
+ * but not sufficient: `boot.ts` confirms the pane is *stable* before declaring
135
+ * ready (the box can flash mid-render). The reliable boot-ready signal is the
136
+ * `SessionStart` hook edge; this pane check is the no-hooks fallback. See
137
+ * `wait-needs-a-transition-not-a-snapshot`.
138
+ */
139
+ const PROMPT_GLYPH = "❯";
140
+ function lineIsEmptyBox(line) {
141
+ let dim = false; // SGR 2 (faint) — the ghost placeholder hint
142
+ let reverse = false; // SGR 7 — the block cursor, not user content
143
+ let sawPrompt = false;
144
+ let i = 0;
145
+ while (i < line.length) {
146
+ // SGR escape: ESC [ <params> m — update style state, consume, continue.
147
+ if (line[i] === "\x1b" && line[i + 1] === "[") {
148
+ let j = i + 2;
149
+ while (j < line.length && line[j] !== "m")
150
+ j++;
151
+ for (const p of line.slice(i + 2, j).split(";")) {
152
+ if (p === "" || p === "0") {
153
+ dim = false;
154
+ reverse = false;
155
+ }
156
+ else if (p === "2")
157
+ dim = true;
158
+ else if (p === "22")
159
+ dim = false;
160
+ else if (p === "7")
161
+ reverse = true;
162
+ else if (p === "27")
163
+ reverse = false;
164
+ }
165
+ i = j + 1;
166
+ continue;
167
+ }
168
+ const ch = line[i++];
169
+ if (ch === undefined)
170
+ break;
171
+ if (!sawPrompt) {
172
+ // The box must start at column 0 (after any leading SGR) — anything else
173
+ // first (incl. indentation) means this line isn't the prompt.
174
+ if (ch === PROMPT_GLYPH) {
175
+ sawPrompt = true;
176
+ continue;
177
+ }
178
+ return false;
179
+ }
180
+ if (/\s/.test(ch))
181
+ continue; // whitespace / U+00A0 padding
182
+ if (reverse || dim)
183
+ continue; // block cursor / dim ghost-placeholder hint
184
+ return false; // a normal-intensity glyph after ❯ → a real draft, not idle
185
+ }
186
+ return sawPrompt;
187
+ }
188
+ function isReady(paneTextBottomN) {
189
+ return paneTextBottomN.split("\n").some(lineIsEmptyBox);
190
+ }
191
+ const rules = {
192
+ // Dialog predicate: any of the known boot-dialog matchers firing.
193
+ // Mirrors the dialog list above so the classifier doesn't drift apart.
194
+ dialog: (text) => dialog.some((d) => d.matches(text)),
195
+ permissionPrompt: (text) => isPermissionPrompt(text),
196
+ // "esc to interrupt" is the reliable in-flight signal — present for the
197
+ // whole turn (verified ~2.2s on a trivial reply against 2.1.153). The
198
+ // post-turn summary (`✻ Crunched for 1s`) does NOT contain it, so matching
199
+ // the bare `✻` spinner glyph would false-positive on a *completed* turn.
200
+ // (The old gerund list `Cooking`/`Crafting` was stale — 2.1.153 uses
201
+ // `Brewing`/`Crunched`/… — and dead weight given the reliable signal.)
202
+ working: (text) => includesPlain(text, "esc to interrupt"),
203
+ // Idle is the empty-input-box check.
204
+ idle: (text) => isReady(text),
205
+ // A turn stopped by ESC renders "Interrupted" (verified on 2.1.162 in the
206
+ // interrupt acceptance scenario). Interrupt fires NO `stop` hook, so this
207
+ // pane marker is the only signal — the Observer maps it to `aborted`.
208
+ interrupted: (text) => includesPlain(text, "Interrupted"),
209
+ // Input sent while a turn is in flight is QUEUED by claude, which shows the
210
+ // affordance "Press up to edit queued messages" beneath the composer (verified
211
+ // verbatim on authenticated 2.1.162). The send path uses this to tell a queued
212
+ // delivery (accepted, runs after the current turn) from a lost one — match the
213
+ // UI instruction text, which prose never reproduces.
214
+ queued: (text) => includesPlain(text, "Press up to edit queued message"),
215
+ };
216
+ /**
217
+ * claude's conversation-identity flags. **The only place that knows these
218
+ * strings** (layering-grep T12 keeps the `--session-id` vocabulary out of the
219
+ * session layer). `create()` mints a neutral `sessionId`; *this* file decides
220
+ * it becomes `--session-id`, and recognizes a caller's own identity flag in
221
+ * `extraArgs` so the substrate never emits two.
222
+ */
223
+ const SESSION_ID_FLAG = "--session-id";
224
+ const RESUME_FLAGS = ["--resume", "-r"];
225
+ const FORK_FLAG = "--fork-session";
226
+ function findCallerIdentity(extraArgs) {
227
+ // A `--fork-session` anywhere means claude resumes into a NEW id we can't
228
+ // know — it dominates a co-present --resume/--session-id for the surfaced id.
229
+ if (extraArgs.includes(FORK_FLAG))
230
+ return { kind: "fork" };
231
+ for (let i = 0; i < extraArgs.length; i++) {
232
+ const arg = extraArgs[i];
233
+ if (arg === undefined)
234
+ continue;
235
+ // `--session-id <x>` or `--session-id=<x>`.
236
+ if (arg === SESSION_ID_FLAG)
237
+ return { kind: "session-id", value: extraArgs[i + 1] };
238
+ if (arg.startsWith(`${SESSION_ID_FLAG}=`)) {
239
+ return { kind: "session-id", value: arg.slice(SESSION_ID_FLAG.length + 1) };
240
+ }
241
+ // `-r`/`--resume [value]` (optional value) or `--resume=<id>`.
242
+ if (RESUME_FLAGS.includes(arg)) {
243
+ const next = extraArgs[i + 1];
244
+ // Bare resume: nothing follows, or the next token is itself a flag.
245
+ const value = next !== undefined && !next.startsWith("-") ? next : undefined;
246
+ return { kind: "resume", value };
247
+ }
248
+ const resumeEq = RESUME_FLAGS.map((f) => `${f}=`).find((p) => arg.startsWith(p));
249
+ if (resumeEq)
250
+ return { kind: "resume", value: arg.slice(resumeEq.length) };
251
+ }
252
+ return undefined;
253
+ }
254
+ /**
255
+ * Build the spawn argv for `claude`.
256
+ *
257
+ * **Identity:** the substrate always knows the conversation id up front — see
258
+ * `create()`'s mint. This builder maps the neutral `sessionId` to claude's
259
+ * `--session-id <id>`, emitted as **two adjacent argv elements** (never
260
+ * `--session-id=<id>`, never string-joined, never via `send-keys`). That
261
+ * single-argv-element shape is a *security invariant*, not just a style: every
262
+ * element is passed to the backend verbatim with no shell, so a value can never
263
+ * be re-parsed as a flag or (in tmux's argv grammar, where a bare `;` is a
264
+ * command separator) a second command. `create()` validates the id is a v4
265
+ * UUID before we ever get here, so the value cannot be `;`, a path, or any
266
+ * meaningful token — but the two-element shape is what makes that validation
267
+ * sufficient.
268
+ *
269
+ * **Caller-wins precedence** (a caller's own identity flag in `extraArgs`
270
+ * always wins; we never emit two `--session-id`):
271
+ * - no identity flag → inject `--session-id <sessionId>`, return `sessionId`.
272
+ * - `--session-id <x>` → pass through, suppress mint, return `x`.
273
+ * - `--resume <id>` → pass through, suppress mint, return `id`.
274
+ * - bare `--resume` / `--fork-session` → pass through, suppress mint, return
275
+ * `undefined` (claude picks the id; the one path we can't know it).
276
+ * - any of the above **and** `sessionIdExplicit` → fail fast with
277
+ * `AgentSessionIdConflict` (the caller insisted on an id two ways).
278
+ *
279
+ * Beyond identity the substrate adds no flags — never injects
280
+ * `--permission-mode` or `--allowedTools` unless the consumer opted in via
281
+ * `extraArgs` (acceptance criterion: "Never injects --permission-mode or
282
+ * --allowed-tools"). `--session-id` grants no authority — it only names the
283
+ * conversation — so always-minting it does not breach that criterion.
284
+ */
285
+ function buildArgv(o) {
286
+ void o.cwd; // cwd is plumbed by the session/backend layer at spawn time
287
+ const extraArgs = o.extraArgs ?? [];
288
+ const env = { LC_ALL: "C.UTF-8" };
289
+ // Neutral resume request (from the session layer's `resume()`): map it to
290
+ // `--resume <id>` — the SOLE place that vendor flag is written. Emitted as two
291
+ // adjacent argv elements (the same security invariant as `--session-id`). A
292
+ // co-present caller identity flag in extraArgs is choosing the id two ways.
293
+ if (o.resumeFrom !== undefined) {
294
+ if (findCallerIdentity(extraArgs))
295
+ throw new AgentSessionIdConflict(o.sessionName ?? "");
296
+ return {
297
+ cmd: "claude",
298
+ argv: [RESUME_FLAGS[0], o.resumeFrom, ...extraArgs],
299
+ env,
300
+ agentSessionId: o.resumeFrom,
301
+ };
302
+ }
303
+ const caller = findCallerIdentity(extraArgs);
304
+ if (caller) {
305
+ // A caller-chosen identity flag conflicts with an explicit agentSessionId:
306
+ // the caller asked for an id two different ways. Fail fast before spawn.
307
+ if (o.sessionIdExplicit) {
308
+ throw new AgentSessionIdConflict(o.sessionName ?? "");
309
+ }
310
+ // Otherwise the caller's flag wins and the mint is suppressed. Pass
311
+ // extraArgs through verbatim; surface the id the flag selects (or undefined
312
+ // for a bare resume / fork, which we genuinely cannot know up front).
313
+ const surfaced = caller.kind === "fork" ? undefined : caller.value;
314
+ return {
315
+ cmd: "claude",
316
+ argv: extraArgs,
317
+ env,
318
+ ...(surfaced === undefined ? {} : { agentSessionId: surfaced }),
319
+ };
320
+ }
321
+ // No caller identity flag. Inject the substrate's id if we have one. The flag
322
+ // and its value are TWO adjacent argv elements — never joined (the invariant).
323
+ if (o.sessionId !== undefined) {
324
+ return {
325
+ cmd: "claude",
326
+ argv: [SESSION_ID_FLAG, o.sessionId, ...extraArgs],
327
+ env,
328
+ agentSessionId: o.sessionId,
329
+ };
330
+ }
331
+ // No id at all (e.g. an internal caller that didn't mint one) — pass through.
332
+ return { cmd: "claude", argv: extraArgs, env };
333
+ }
334
+ /** The `claude` agent definition. */
335
+ // ─── Transcript reading (claude's on-disk session log) ──────────────────────
336
+ // claude writes the session transcript to
337
+ // `<home>/.claude/projects/<cwd-slug>/<session-id>.jsonl`, append-only (verified
338
+ // + docs-confirmed: compaction summarizes the context window, never rewrites the
339
+ // file). The cwd→slug rule is fragile (punctuation-substituted), so we locate by
340
+ // id-glob across project dirs rather than recompute it.
341
+ /** Locate the transcript for a session id by scanning the project dirs. */
342
+ function locateTranscript(o) {
343
+ const projectsDir = join(o.home ?? homedir(), ".claude", "projects");
344
+ let entries;
345
+ try {
346
+ entries = readdirSync(projectsDir);
347
+ }
348
+ catch {
349
+ return null;
350
+ }
351
+ for (const dir of entries) {
352
+ const candidate = join(projectsDir, dir, `${o.agentSessionId}.jsonl`);
353
+ if (existsSync(candidate))
354
+ return candidate;
355
+ }
356
+ return null;
357
+ }
358
+ /** `mcp__<server>__<tool>` → `<tool>`; other names pass through. */
359
+ function stripMcpPrefix(name) {
360
+ if (!name.startsWith("mcp__"))
361
+ return name;
362
+ const segs = name.split("__");
363
+ return segs[segs.length - 1] ?? name;
364
+ }
365
+ /** A short, neutral one-line summary of a tool_use input. */
366
+ function summarizeToolInput(input) {
367
+ if (input === null || typeof input !== "object")
368
+ return "";
369
+ const o = input;
370
+ // First matching field becomes the one-line summary; extend for new tool input shapes.
371
+ for (const key of ["command", "file_path", "path", "pattern", "url", "query"]) {
372
+ const v = o[key];
373
+ if (typeof v === "string")
374
+ return v;
375
+ }
376
+ return "";
377
+ }
378
+ /** A short, neutral summary of a tool_result's content (string or text blocks). */
379
+ function summarizeToolResult(content) {
380
+ if (typeof content === "string")
381
+ return content.slice(0, 200);
382
+ if (Array.isArray(content)) {
383
+ const text = content
384
+ .map((c) => c !== null && typeof c === "object" && typeof c.text === "string"
385
+ ? c.text
386
+ : "")
387
+ .join("");
388
+ return text.slice(0, 200);
389
+ }
390
+ return "";
391
+ }
392
+ /**
393
+ * Parse one transcript line into a neutral {@link Message}. Returns `null` for
394
+ * a blank line, a partial/half-flushed line (unparseable JSON), or a metadata
395
+ * record (anything that is not a `user`/`assistant` turn-side).
396
+ */
397
+ function parseTranscriptLine(line) {
398
+ const trimmed = line.trim();
399
+ if (trimmed === "")
400
+ return null;
401
+ let rec;
402
+ try {
403
+ rec = JSON.parse(trimmed);
404
+ }
405
+ catch {
406
+ return null;
407
+ }
408
+ const type = rec.type;
409
+ if (type !== "user" && type !== "assistant")
410
+ return null;
411
+ const msg = rec.message;
412
+ if (msg === undefined)
413
+ return null;
414
+ const parts = [];
415
+ const content = msg.content;
416
+ if (typeof content === "string") {
417
+ if (content !== "")
418
+ parts.push({ kind: "text", text: content });
419
+ }
420
+ else if (Array.isArray(content)) {
421
+ for (const block of content) {
422
+ if (block === null || typeof block !== "object")
423
+ continue;
424
+ const b = block;
425
+ if (b.type === "text" && typeof b.text === "string") {
426
+ parts.push({ kind: "text", text: b.text });
427
+ }
428
+ else if (b.type === "tool_use" && typeof b.name === "string") {
429
+ parts.push({
430
+ kind: "tool",
431
+ tool: stripMcpPrefix(b.name),
432
+ summary: summarizeToolInput(b.input),
433
+ });
434
+ }
435
+ else if (b.type === "tool_result") {
436
+ parts.push({
437
+ kind: "tool-result",
438
+ ok: b.is_error !== true,
439
+ summary: summarizeToolResult(b.content),
440
+ });
441
+ }
442
+ // `thinking` blocks are intentionally skipped — internal, not conversation.
443
+ }
444
+ }
445
+ if (parts.length === 0)
446
+ return null;
447
+ const id = typeof rec.uuid === "string" ? rec.uuid : "";
448
+ const parentId = typeof rec.parentUuid === "string" ? rec.parentUuid : undefined;
449
+ const at = typeof rec.timestamp === "string" ? rec.timestamp : undefined;
450
+ return {
451
+ id,
452
+ role: type,
453
+ parts,
454
+ ...(parentId === undefined ? {} : { parentId }),
455
+ ...(at === undefined ? {} : { at }),
456
+ };
457
+ }
458
+ /**
459
+ * A typed user prompt carries a text part; a tool-result-feedback user record
460
+ * carries only tool-result parts (not a new turn).
461
+ */
462
+ function isTurnStart(message) {
463
+ return message.role === "user" && message.parts.some((p) => p.kind === "text");
464
+ }
465
+ /**
466
+ * The raw ancestry link of **any** transcript record (`uuid` → `parentUuid`),
467
+ * not just `user`/`assistant` turns. claude 2.1.162 threads non-message records
468
+ * (e.g. `attachment`) *between* a prompt and its reply — the assistant's
469
+ * `parentUuid` points at an attachment, not the user record — so a causal chain
470
+ * built from surfaced messages alone is severed. Exposing every linkable
471
+ * record's edge lets the consumer bridge those gaps. `null` for blank/partial
472
+ * lines and records with no `uuid` (pure metadata that cannot be a chain link).
473
+ */
474
+ function parseTranscriptEdge(line) {
475
+ const trimmed = line.trim();
476
+ if (trimmed === "")
477
+ return null;
478
+ let rec;
479
+ try {
480
+ rec = JSON.parse(trimmed);
481
+ }
482
+ catch {
483
+ return null;
484
+ }
485
+ if (typeof rec.uuid !== "string")
486
+ return null;
487
+ const parentId = typeof rec.parentUuid === "string" ? rec.parentUuid : undefined;
488
+ return { id: rec.uuid, ...(parentId === undefined ? {} : { parentId }) };
489
+ }
490
+ // ─── Hook-based turn observation (the reliable, no-pane-scrape signal) ───────
491
+ // claude fires hooks the harness can't forget (verified in spike). We inject a
492
+ // settings fragment wiring the turn-lifecycle events to append a marker line to
493
+ // a claudemux-owned per-session rendezvous file; the Observer reads those as
494
+ // deterministic phase edges. Marker line format: "<epoch.ns> <payload-json>\n",
495
+ // where the payload (claude's hook stdin) carries hook_event_name/session_id/
496
+ // tool_name plus the fusion fields below. The settings shape + this format +
497
+ // every claude payload field name live ONLY here (the agent seam translates the
498
+ // vendor payload into the neutral HookEdge; field names never leak past it).
499
+ /** claude hook event name → neutral edge. */
500
+ const HOOK_EVENT_MAP = {
501
+ SessionStart: "session-start",
502
+ UserPromptSubmit: "prompt-submit",
503
+ PreToolUse: "tool-start",
504
+ PostToolUse: "tool-end",
505
+ Stop: "stop",
506
+ Notification: "notification",
507
+ PreCompact: "pre-compact",
508
+ };
509
+ /** claude `SessionStart` `source` → neutral {@link HookEdge.source}. */
510
+ const HOOK_SOURCE_MAP = {
511
+ startup: "start",
512
+ resume: "resume",
513
+ clear: "clear",
514
+ compact: "compact",
515
+ };
516
+ function hookSpec(o) {
517
+ // Single-quote the path for the shell (claudemux-generated, uuid-based — but
518
+ // quote defensively). Each hook appends "<ts> <stdin-json>\n" to it.
519
+ const quoted = `'${o.rendezvousPath.replace(/'/g, `'\\''`)}'`;
520
+ const command = `{ printf '%s ' "$(date +%s.%N)"; cat; printf '\\n'; } >> ${quoted}`;
521
+ const entry = [{ hooks: [{ type: "command", command }] }];
522
+ const toolEntry = [{ matcher: "*", hooks: [{ type: "command", command }] }];
523
+ const settings = {
524
+ hooks: {
525
+ SessionStart: entry,
526
+ UserPromptSubmit: entry,
527
+ Stop: entry,
528
+ Notification: entry,
529
+ PreCompact: entry,
530
+ PreToolUse: toolEntry,
531
+ PostToolUse: toolEntry,
532
+ },
533
+ };
534
+ return { flag: "--settings", value: JSON.stringify(settings) };
535
+ }
536
+ function parseMarker(line) {
537
+ const trimmed = line.trim();
538
+ if (trimmed === "")
539
+ return null;
540
+ const sp = trimmed.indexOf(" ");
541
+ if (sp < 0)
542
+ return null;
543
+ const at = Math.round(Number.parseFloat(trimmed.slice(0, sp)) * 1000);
544
+ if (!Number.isFinite(at))
545
+ return null;
546
+ let payload;
547
+ try {
548
+ payload = JSON.parse(trimmed.slice(sp + 1));
549
+ }
550
+ catch {
551
+ return null;
552
+ }
553
+ const name = typeof payload.hook_event_name === "string" ? payload.hook_event_name : "";
554
+ const event = HOOK_EVENT_MAP[name] ?? "other";
555
+ const sessionId = typeof payload.session_id === "string" ? payload.session_id : undefined;
556
+ const tool = typeof payload.tool_name === "string" ? payload.tool_name : undefined;
557
+ // Fusion fields — translate claude's payload names into the neutral edge.
558
+ const transcriptPath = typeof payload.transcript_path === "string" ? payload.transcript_path : undefined;
559
+ const source = typeof payload.source === "string" ? HOOK_SOURCE_MAP[payload.source] : undefined;
560
+ const finalMessage = typeof payload.last_assistant_message === "string" ? payload.last_assistant_message : undefined;
561
+ return {
562
+ event,
563
+ at,
564
+ ...(sessionId === undefined ? {} : { sessionId }),
565
+ ...(tool === undefined ? {} : { tool }),
566
+ ...(transcriptPath === undefined ? {} : { transcriptPath }),
567
+ ...(source === undefined ? {} : { source }),
568
+ ...(finalMessage === undefined ? {} : { finalMessage }),
569
+ };
570
+ }
571
+ export const claude = {
572
+ name: "claude",
573
+ buildArgv,
574
+ boot: { dialogs: dialog, isReady },
575
+ rules,
576
+ permissionPrompt: { respondKey: (choice) => PERMISSION_PROMPT_CHOICE_KEYS[choice] },
577
+ transcript: {
578
+ locate: locateTranscript,
579
+ parseLine: parseTranscriptLine,
580
+ parseEdge: parseTranscriptEdge,
581
+ isTurnStart,
582
+ },
583
+ hooks: { spec: hookSpec, parseMarker },
584
+ };
585
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { claude } from "./claude.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { claude } from "./claude.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}