@el4cteo/rbx-studio-mcp 0.5.0 → 0.5.3

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.
package/README.md CHANGED
@@ -182,7 +182,7 @@ Under the header is a command line. Type a command, or type a sentence and it go
182
182
 
183
183
  Up and down walk the history, Tab completes.
184
184
 
185
- **Prompts start a real agent.** The bridge runs whichever tool you have on PATH — Claude Code, Codex, opencode, DeepSeek Harness, Gemini, Cursor — in headless mode. It connects back to this same bridge, drives the same Studio, and its work streams into the log line by line. It is a separate session from the terminal you may already have open, billed separately, and it is allowed the `rbx-studio` tools and nothing else. `stop` cancels it.
185
+ **Prompts start a real agent.** The bridge runs whichever tool you have on PATH — Claude Code, Codex, opencode, DeepSeek Harness, Gemini, Cursor, Amp, Qwen Code, Factory Droid, goose, GitHub Copilot CLI, Aider, Crush — in headless mode. It connects back to this same bridge, drives the same Studio, and its work streams into the log line by line. It is a separate session from the terminal you may already have open, billed separately, and it is allowed the `rbx-studio` tools and nothing else. `stop` cancels it.
186
186
 
187
187
  Hover the tab on the right edge for eight themes — Lattice, Observatory, Orbit, Void, Nebula, Aurora, Phosphor, Blueprint. Each redraws the activity band, not just its colours. Your pick is remembered.
188
188
 
@@ -13,7 +13,7 @@
13
13
  * foreign object pasted into the session.
14
14
  */
15
15
  import { collectChecks } from "../doctor.js";
16
- import { find, installed, run } from "./harness.js";
16
+ import { find, installed, matchesClient, run, } from "./harness.js";
17
17
  const agents = new Map();
18
18
  function agentFor(studioId) {
19
19
  let state = agents.get(studioId);
@@ -105,7 +105,7 @@ function resolveStudio(bridge, token) {
105
105
  return byId?.studioId ?? null;
106
106
  }
107
107
  /** Which harnesses are installed, and which one prompts will go to. */
108
- function renderAgents(state) {
108
+ function renderAgents(state, bridge) {
109
109
  const available = installed();
110
110
  if (available.length === 0) {
111
111
  return [
@@ -117,15 +117,82 @@ function renderAgents(state) {
117
117
  },
118
118
  ];
119
119
  }
120
- const chosen = state.harnessId ?? available[0]?.id;
120
+ //[[ Says what a prompt WOULD do, not what the registry contains.
121
+ //
122
+ // Listing an "(in use)" that the prompt then ignores is worse than not
123
+ // marking one at all -- that mismatch is what made the wrong agent answer
124
+ // look like a bug in the agent rather than in this choice. So the mark comes
125
+ // from the same function the prompt uses, and when that cannot decide,
126
+ // nothing is marked and the list says so.
127
+ //]]
128
+ const wanted = preferred(state, bridge, available);
129
+ const connected = (entry) => bridge.clientList().some((client) => matchesClient(entry, client.name));
121
130
  return [
122
131
  { level: "info", message: `${available.length} agent${available.length === 1 ? "" : "s"} available` },
123
- ...available.map((entry) => ({
124
- level: entry.id === chosen ? "ok" : "dim",
125
- message: ` ${entry.id}`,
126
- detail: entry.id === chosen ? `${entry.label} (in use)` : entry.label,
132
+ ...available.map((entry) => {
133
+ const marks = [];
134
+ if (connected(entry))
135
+ marks.push("connected");
136
+ if (entry.id === wanted?.id)
137
+ marks.push(state.harnessId === null ? "would answer" : "in use");
138
+ return {
139
+ level: entry.id === wanted?.id ? "ok" : "dim",
140
+ message: ` ${entry.id}`,
141
+ detail: marks.length > 0 ? `${entry.label} (${marks.join(", ")})` : entry.label,
142
+ };
143
+ }),
144
+ wanted === undefined
145
+ ? { level: "warn", message: "several agents are connected -- `agent use <id>` to pick one" }
146
+ : { level: "dim", message: "type anything that is not a command to send it to the agent" },
147
+ ];
148
+ }
149
+ /**
150
+ * Which agent an unconfigured panel should use, or nothing when it cannot tell.
151
+ *
152
+ * The old rule was "the first one installed", which is alphabetical accident
153
+ * dressed up as a decision: someone with opencode open typed a prompt and
154
+ * Claude Code answered, because `claude` sits first in the registry. The answer
155
+ * was fine and came from the wrong program.
156
+ *
157
+ * The bridge knows more than the registry does. Every agent driving this Studio
158
+ * is connected to it and says its name, so the panel can answer with the one
159
+ * the user is actually working in. That settles the ordinary case, which is one
160
+ * agent attached to one Studio.
161
+ *
162
+ * When two are attached there is no signal that says which one the user meant.
163
+ * Recency does not: in the report that prompted this, opencode had been up a
164
+ * minute and Claude Code forty seconds, and the wanted answer was the older
165
+ * one. So this returns nothing and the caller asks -- the same shape as
166
+ * AMBIGUOUS_STUDIO, which refuses to guess between two open places for exactly
167
+ * this reason. The choice is remembered, so it is one question once.
168
+ */
169
+ function preferred(state, bridge, available) {
170
+ if (state.harnessId !== null)
171
+ return find(state.harnessId);
172
+ if (available.length === 1)
173
+ return available[0];
174
+ const matched = available.filter((harness) => bridge.clientList().some((client) => matchesClient(harness, client.name)));
175
+ if (matched.length === 1)
176
+ return matched[0];
177
+ // Nothing connected that we recognise: the registry order is as good a guess
178
+ // as any, and refusing here would block a panel whose user has no agent
179
+ // attached at all -- which is a normal way to use this.
180
+ return matched.length === 0 ? available[0] : undefined;
181
+ }
182
+ /** Asks which of several attached agents should answer, and how to say so. */
183
+ function askWhichAgent(bridge, available) {
184
+ const attached = available.filter((harness) => bridge.clientList().some((client) => matchesClient(harness, client.name)));
185
+ return [
186
+ {
187
+ level: "warn",
188
+ message: `${attached.length} agents are connected to this Studio -- which should answer?`,
189
+ },
190
+ ...attached.map((harness) => ({
191
+ level: "dim",
192
+ message: ` agent use ${harness.id}`,
193
+ detail: harness.label,
127
194
  })),
128
- { level: "dim", message: "type anything that is not a command to send it to the agent" },
195
+ { level: "dim", message: "asked once; the choice is remembered until you change it" },
129
196
  ];
130
197
  }
131
198
  /**
@@ -170,10 +237,12 @@ function startAgent(bridge, state, studioId, prompt) {
170
237
  }
171
238
  const available = installed();
172
239
  if (available.length === 0)
173
- return renderAgents(state);
174
- const wanted = state.harnessId === null ? available[0] : find(state.harnessId);
240
+ return renderAgents(state, bridge);
241
+ const wanted = preferred(state, bridge, available);
175
242
  if (wanted === undefined) {
176
- return [{ level: "error", message: `unknown agent "${state.harnessId}"` }];
243
+ return state.harnessId === null
244
+ ? askWhichAgent(bridge, available)
245
+ : [{ level: "error", message: `unknown agent "${state.harnessId}"` }];
177
246
  }
178
247
  const emit = (line) => {
179
248
  bridge.notify(studioId, { event: "console", ...line });
@@ -233,7 +302,7 @@ export async function handleConsole(bridge, port, request) {
233
302
  case "agent": {
234
303
  const verb = request.args[0];
235
304
  if (verb === undefined || verb === "list")
236
- return renderAgents(state);
305
+ return renderAgents(state, bridge);
237
306
  if (verb === "use") {
238
307
  const id = request.args[1];
239
308
  if (id === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/bridge/console.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/bridge/console.ts"],"names":[],"mappings":"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"}
@@ -39,8 +39,55 @@ function parse(line) {
39
39
  }
40
40
  }
41
41
  /** A tool call written the way the console writes its own. */
42
- function toolLine(name, input) {
43
- const short = name.replace(/^mcp__[^_]+__/, "").replace(/^mcp__/, "");
42
+ /**
43
+ * What to do with a line that is not the JSON we expected.
44
+ *
45
+ * Never nothing. Dropping unrecognised input is precisely how the opencode
46
+ * adapter printed a blank run for months: it understood none of what it was
47
+ * sent and said so by staying quiet. A line nobody can parse is still evidence,
48
+ * and dim is the level for evidence.
49
+ */
50
+ function unparsed(line) {
51
+ const text = line.trim();
52
+ return text === "" ? NOTHING : { lines: [{ level: "dim", message: text }] };
53
+ }
54
+ /**
55
+ * The MCP server this panel belongs to, as the agents spell it.
56
+ *
57
+ * Every harness renames MCP tools its own way: Claude and Codex write
58
+ * `mcp__rbx-studio__tree`, opencode writes `rbx-studio_tree`. Both are the same
59
+ * call, and neither is what a reader wants to see -- the tool is `tree`.
60
+ */
61
+ const OWN_SERVER = "rbx-studio";
62
+ /** Strips whatever prefix a harness put in front of an MCP tool name. */
63
+ function shorten(name) {
64
+ return name
65
+ .replace(/^mcp__[^_]+__/, "")
66
+ .replace(/^mcp__/, "")
67
+ .replace(new RegExp("^" + OWN_SERVER + "[_-]+"), "");
68
+ }
69
+ /**
70
+ * Rows for one tool call -- usually one, and none for our own tools.
71
+ *
72
+ * Studio logs every call that reaches it, with a friendly name and the time it
73
+ * took, for EVERY client. So an agent's own row for a `rbx-studio` call is the
74
+ * same event written twice, one line apart: "Check Studio 441ms" from the
75
+ * plugin, "rbx-studio_studio_status" from the agent. Two lines per call, and
76
+ * the panel's four-call test read as eight.
77
+ *
78
+ * The agent's copy is the one to drop. Studio's has the duration, has the
79
+ * readable name, and appears whichever client made the call -- including the
80
+ * user's own terminal session, which no adapter here ever sees. What is lost is
81
+ * the arguments; that is a fair price for a log that reads as one event per
82
+ * line, and `console` still has them.
83
+ *
84
+ * Everything else the agent does -- reading a file, running a shell command --
85
+ * Studio never sees, so those rows are all there is and they stay.
86
+ */
87
+ function toolLines(name, input) {
88
+ const short = shorten(name);
89
+ if (short !== name)
90
+ return [];
44
91
  let detail;
45
92
  if (input !== null && typeof input === "object") {
46
93
  const parts = Object.entries(input)
@@ -53,7 +100,7 @@ function toolLine(name, input) {
53
100
  if (parts.length > 0)
54
101
  detail = parts.join(" ");
55
102
  }
56
- return { level: "call", message: short, detail };
103
+ return [{ level: "call", message: short, detail }];
57
104
  }
58
105
  /** Collapses a paragraph into the one-line rows a console log can hold. */
59
106
  function say(text) {
@@ -92,7 +139,7 @@ const claude = {
92
139
  read: (line) => {
93
140
  const event = parse(line);
94
141
  if (event === null)
95
- return NOTHING;
142
+ return unparsed(line);
96
143
  if (event.type === "system" && event.subtype === "init") {
97
144
  return { lines: [], session: event.session_id };
98
145
  }
@@ -102,7 +149,7 @@ const claude = {
102
149
  if (part.type === "text" && String(part.text).trim() !== "")
103
150
  lines.push(...say(part.text));
104
151
  if (part.type === "tool_use")
105
- lines.push(toolLine(part.name, part.input));
152
+ lines.push(...toolLines(part.name, part.input));
106
153
  }
107
154
  return { lines, session: event.session_id };
108
155
  }
@@ -125,8 +172,26 @@ const claude = {
125
172
  },
126
173
  };
127
174
  /**
128
- * OpenAI Codex CLI. `exec` is its headless verb and `--json` its event stream;
129
- * the envelope differs from Claude's but carries the same three facts.
175
+ * OpenAI Codex CLI. `exec` is its headless verb and `--json` its event stream.
176
+ *
177
+ * Documented shape, one JSON object per line:
178
+ *
179
+ * {"type":"thread.started","thread_id":"019cec77-..."}
180
+ * {"type":"turn.started"}
181
+ * {"type":"item.completed","item":{"type":"agent_message","text":"..."}}
182
+ * {"type":"item.started", "item":{"type":"mcp_tool_call","server":"...","tool":"..."}}
183
+ * {"type":"turn.completed","usage":{...}}
184
+ * {"type":"turn.failed","error":{"message":"..."}}
185
+ *
186
+ * Two things here were wrong and are worth naming, because both fail quietly.
187
+ *
188
+ * The session id is `thread_id` on `thread.started`, not `session_id` on a
189
+ * `session.created` that codex never sends -- so every panel prompt started a
190
+ * new conversation and "continuing" was a lie.
191
+ *
192
+ * And global flags must precede the `resume` subcommand: codex rejects
193
+ * `--skip-git-repo-check` placed after it, so the old argv could only ever
194
+ * work on the FIRST turn and broke on every follow-up.
130
195
  */
131
196
  const codex = {
132
197
  id: "codex",
@@ -134,37 +199,69 @@ const codex = {
134
199
  bin: "codex",
135
200
  argv: (prompt, session) => [
136
201
  "exec",
137
- ...(session === null ? [] : ["resume", session]),
138
202
  "--json",
139
203
  "--skip-git-repo-check",
204
+ ...(session === null ? [] : ["resume", session]),
140
205
  prompt,
141
206
  ],
142
207
  read: (line) => {
143
208
  const event = parse(line);
144
209
  if (event === null)
145
- return NOTHING;
146
- const item = event.item ?? event.msg ?? event;
147
- const kind = item.type ?? event.type;
148
- if (kind === "session.created" || kind === "session_configured") {
149
- return { lines: [], session: item.session_id ?? event.session_id };
210
+ return unparsed(line);
211
+ if (event.type === "thread.started") {
212
+ return { lines: [], session: event.thread_id };
150
213
  }
151
- if (kind === "agent_message" || kind === "assistant_message") {
152
- return { lines: say(String(item.text ?? item.message ?? "")) };
214
+ if (event.type === "turn.completed") {
215
+ return { lines: [{ level: "ok", message: "agent done" }] };
153
216
  }
154
- if (kind === "command_execution" || kind === "mcp_tool_call" || kind === "function_call") {
155
- const name = String(item.tool ?? item.name ?? item.command ?? "tool");
156
- return { lines: [toolLine(name, item.arguments ?? item.input)] };
217
+ if (event.type === "turn.failed" || event.type === "error") {
218
+ const message = event.error?.message ?? event.message ?? "agent failed";
219
+ return { lines: [{ level: "error", message: String(message) }] };
157
220
  }
158
- if (kind === "turn.completed" || kind === "task_complete") {
159
- return { lines: [{ level: "ok", message: "agent done" }] };
221
+ const item = event.item;
222
+ if (item === undefined)
223
+ return NOTHING;
224
+ // Tools report twice, `item.started` then `item.completed`. The started one
225
+ // is taken because it is the one that arrives while the work is happening,
226
+ // which is what a live log is for; taking both printed every call twice.
227
+ if (item.type === "agent_message" && event.type === "item.completed") {
228
+ return { lines: say(String(item.text ?? "")) };
160
229
  }
161
- if (kind === "error" || kind === "turn.failed") {
230
+ if (event.type === "item.started") {
231
+ if (item.type === "mcp_tool_call")
232
+ return { lines: toolLines(String(item.tool ?? "tool"), item.arguments) };
233
+ if (item.type === "command_execution")
234
+ return { lines: toolLines("shell", item.command) };
235
+ }
236
+ if (item.type === "error" && event.type === "item.completed") {
162
237
  return { lines: [{ level: "error", message: String(item.message ?? "agent failed") }] };
163
238
  }
164
239
  return NOTHING;
165
240
  },
166
241
  };
167
- /** opencode. `run` is one-shot; `--format json` turns it into an event stream. */
242
+ /**
243
+ * opencode. `run` is one-shot; `--format json` turns it into an event stream.
244
+ *
245
+ * The envelope here was WRONG until it was recorded from a live run, and wrong
246
+ * in the way that produces silence rather than an error: it expected
247
+ * `message.part.updated`, `session.created` and `session.idle`, none of which
248
+ * opencode emits. Every line fell through to NOTHING, so a prompt started the
249
+ * agent, the agent answered, and the panel printed a blank run and went idle.
250
+ *
251
+ * What it actually emits, one JSON object per line, verified on 1.18.30:
252
+ *
253
+ * {"type":"step_start", "sessionID":"ses_...", "part":{...}}
254
+ * {"type":"tool_use", "sessionID":"ses_...", "part":{"type":"tool","tool":"glob","state":{...}}}
255
+ * {"type":"text", "sessionID":"ses_...", "part":{"type":"text","text":"Hi there"}}
256
+ * {"type":"step_finish","sessionID":"ses_...", "part":{"tokens":{...},"cost":0.004}}
257
+ *
258
+ * `sessionID` rides on EVERY event rather than arriving in one of its own, so
259
+ * it is read from whatever comes first instead of being waited for.
260
+ *
261
+ * `step_finish` is per step, not per run -- a turn that calls a tool emits two
262
+ * of them -- so it is not "agent done". The run's end is the process exiting,
263
+ * which `run` already reports.
264
+ */
168
265
  const opencode = {
169
266
  id: "opencode",
170
267
  label: "opencode",
@@ -178,26 +275,25 @@ const opencode = {
178
275
  ],
179
276
  read: (line) => {
180
277
  const event = parse(line);
181
- if (event === null) {
182
- return line.trim() === "" ? NOTHING : { lines: [{ level: "dim", message: line.trim() }] };
278
+ if (event === null)
279
+ return unparsed(line);
280
+ const session = typeof event.sessionID === "string" ? event.sessionID : undefined;
281
+ const kind = event.type;
282
+ const part = event.part ?? {};
283
+ if (kind === "text" && typeof part.text === "string") {
284
+ return { lines: say(part.text), session };
183
285
  }
184
- const kind = event.type ?? event.event;
185
- if (kind === "session.created" || kind === "session") {
186
- return { lines: [], session: event.sessionID ?? event.id ?? event.properties?.info?.id };
286
+ if (kind === "tool_use" && typeof part.tool === "string") {
287
+ return { lines: toolLines(part.tool, part.state?.input), session };
187
288
  }
188
- if (kind === "message.part.updated" || kind === "part") {
189
- const part = event.properties?.part ?? event.part ?? {};
190
- if (part.type === "text" && typeof part.text === "string")
191
- return { lines: say(part.text) };
192
- if (part.type === "tool" && typeof part.tool === "string") {
193
- return { lines: [toolLine(part.tool, part.state?.input)] };
194
- }
195
- return NOTHING;
289
+ if (kind === "error") {
290
+ const message = event.error ?? part.error ?? "agent failed";
291
+ return { lines: [{ level: "error", message: String(message) }], session };
196
292
  }
197
- if (kind === "session.idle" || kind === "done") {
198
- return { lines: [{ level: "ok", message: "agent done" }] };
199
- }
200
- return NOTHING;
293
+ // step_start and step_finish are turn bookkeeping. They carry the token
294
+ // count and cost, which the panel already gets from the run's own summary,
295
+ // and printing a row per step would double the log for nothing.
296
+ return { lines: [], session };
201
297
  },
202
298
  };
203
299
  /**
@@ -243,15 +339,324 @@ const dsh = {
243
339
  argv: (prompt) => ["--profile", "headless", "--patch", dshOverlay(), prompt],
244
340
  read: (line) => line.trim() === "" ? NOTHING : { lines: [{ level: "reply", message: line.trim() }] },
245
341
  };
342
+ /**
343
+ * Gemini CLI. `-p` is its headless verb; `--output-format stream-json` turns it
344
+ * into an event stream of `init`, `message`, `tool_use`, `tool_result`, `error`
345
+ * and `result`.
346
+ *
347
+ * No documented way to resume a headless session, so every prompt is a fresh
348
+ * conversation. That is the CLI's limitation rather than this adapter's, and it
349
+ * is why `session` is ignored here instead of being passed to a flag that does
350
+ * not exist.
351
+ */
352
+ const gemini = {
353
+ id: "gemini",
354
+ label: "Gemini CLI",
355
+ bin: "gemini",
356
+ argv: (prompt) => ["--output-format", "stream-json", "-p", prompt],
357
+ read: (line) => {
358
+ const event = parse(line);
359
+ if (event === null)
360
+ return unparsed(line);
361
+ if (event.type === "init") {
362
+ return { lines: [], session: event.session_id ?? event.sessionId };
363
+ }
364
+ if (event.type === "message") {
365
+ // Both sides of the conversation come through here; the user's half is
366
+ // the prompt that was just typed into the panel, and echoing it back
367
+ // reads as the agent repeating the question.
368
+ if (event.role === "user")
369
+ return NOTHING;
370
+ return { lines: say(String(event.content ?? event.text ?? "")) };
371
+ }
372
+ if (event.type === "tool_use") {
373
+ return { lines: toolLines(String(event.name ?? event.tool ?? "tool"), event.args ?? event.input) };
374
+ }
375
+ if (event.type === "error") {
376
+ return { lines: [{ level: "error", message: String(event.message ?? "agent failed") }] };
377
+ }
378
+ if (event.type === "result") {
379
+ return { lines: [{ level: "ok", message: "agent done" }] };
380
+ }
381
+ return NOTHING;
382
+ },
383
+ };
384
+ /**
385
+ * Cursor Agent. `-p` with `--output-format stream-json`, an envelope shaped
386
+ * closely after Claude's -- `system`/`assistant`/`result` with `session_id` on
387
+ * every event -- but with its own tool shape: `tool_call` carries a single key
388
+ * naming the kind of call, `readToolCall`, `writeToolCall` or `function`.
389
+ */
390
+ const cursor = {
391
+ id: "cursor",
392
+ label: "Cursor Agent",
393
+ bin: "cursor-agent",
394
+ argv: (prompt, session) => [
395
+ ...(session === null ? [] : ["--resume", session]),
396
+ "--output-format",
397
+ "stream-json",
398
+ "-p",
399
+ prompt,
400
+ ],
401
+ read: (line) => {
402
+ const event = parse(line);
403
+ if (event === null)
404
+ return unparsed(line);
405
+ const session = typeof event.session_id === "string" ? event.session_id : undefined;
406
+ if (event.type === "assistant") {
407
+ const parts = event.message?.content;
408
+ const text = Array.isArray(parts)
409
+ ? parts.filter((piece) => piece?.type === "text").map((piece) => piece.text).join("")
410
+ : "";
411
+ return { lines: say(String(text)), session };
412
+ }
413
+ if (event.type === "tool_call" && event.subtype === "started") {
414
+ const call = event.tool_call ?? {};
415
+ const named = Object.keys(call)[0] ?? "tool";
416
+ const inner = call[named] ?? {};
417
+ return { lines: toolLines(inner.name ?? named, inner.args), session };
418
+ }
419
+ if (event.type === "result") {
420
+ return {
421
+ lines: [
422
+ event.is_error === true
423
+ ? { level: "error", message: "agent failed" }
424
+ : { level: "ok", message: "agent done" },
425
+ ],
426
+ session,
427
+ };
428
+ }
429
+ if (event.type === "error") {
430
+ return { lines: [{ level: "error", message: String(event.message ?? "agent failed") }], session };
431
+ }
432
+ return { lines: [], session };
433
+ },
434
+ };
435
+ /**
436
+ * Crush. `run` takes the prompt and prints the answer as plain text -- there is
437
+ * no event stream and no resume, so this is `generic` with the right verb.
438
+ *
439
+ * The verb matters: the generic adapter guesses `-p`, which crush rejects as an
440
+ * unknown flag. A harness that is merely unstructured still works; one invoked
441
+ * wrongly does not run at all.
442
+ */
443
+ const crush = {
444
+ id: "crush",
445
+ label: "Crush",
446
+ bin: "crush",
447
+ argv: (prompt) => ["run", prompt],
448
+ read: (line) => line.trim() === "" ? NOTHING : { lines: [{ level: "reply", message: line.trim() }] },
449
+ };
450
+ /**
451
+ * Reads Claude Code's `stream-json` envelope, which several other CLIs copy.
452
+ *
453
+ * Amp says so outright ("Claude Code-compatible protocol"), and the shape is
454
+ * the same three events with the same field names: `system`/`init` carrying
455
+ * `session_id`, `assistant` carrying `message.content[]` of `text` and
456
+ * `tool_use` parts, and `result` ending the run. Sharing the reader means a fix
457
+ * to one is a fix to all of them, and means a new CLI that adopts the envelope
458
+ * costs an argv and nothing else.
459
+ *
460
+ * `result` detail is left to the caller: Claude reports cost and duration in
461
+ * fields the others do not have.
462
+ */
463
+ function readAnthropicStream(line) {
464
+ const event = parse(line);
465
+ if (event === null)
466
+ return unparsed(line);
467
+ if (event.type === "system" && event.subtype === "init") {
468
+ return { lines: [], session: event.session_id };
469
+ }
470
+ if (event.type === "assistant") {
471
+ const lines = [];
472
+ for (const part of event.message?.content ?? []) {
473
+ if (part.type === "text" && String(part.text).trim() !== "")
474
+ lines.push(...say(part.text));
475
+ if (part.type === "tool_use")
476
+ lines.push(...toolLines(part.name, part.input));
477
+ }
478
+ return { lines, session: event.session_id };
479
+ }
480
+ if (event.type === "result") {
481
+ return {
482
+ lines: [
483
+ event.is_error === true
484
+ ? { level: "error", message: "agent failed" }
485
+ : { level: "ok", message: "agent done" },
486
+ ],
487
+ session: event.session_id,
488
+ };
489
+ }
490
+ return NOTHING;
491
+ }
492
+ /**
493
+ * Sourcegraph Amp. `-x` is its execute verb and `--stream-json` its event
494
+ * stream, in Claude Code's own envelope.
495
+ *
496
+ * Continuing is a different COMMAND rather than a flag -- `amp threads continue
497
+ * <id>` -- so the resumed argv is not the first-run argv with something added,
498
+ * which is why this builds both shapes rather than appending.
499
+ */
500
+ const amp = {
501
+ id: "amp",
502
+ label: "Amp",
503
+ bin: "amp",
504
+ argv: (prompt, session) => session === null
505
+ ? ["-x", "--stream-json", prompt]
506
+ : ["threads", "continue", session, "-x", "--stream-json", prompt],
507
+ read: readAnthropicStream,
508
+ };
509
+ /**
510
+ * Qwen Code. A Gemini CLI fork, and it kept the headless interface: `-p` with
511
+ * `--output-format stream-json`, and the same `init`/`message`/`tool_use`
512
+ * events.
513
+ */
514
+ const qwen = {
515
+ id: "qwen",
516
+ label: "Qwen Code",
517
+ bin: "qwen",
518
+ argv: (prompt) => ["--output-format", "stream-json", "-p", prompt],
519
+ read: (line) => gemini.read(line),
520
+ };
521
+ /**
522
+ * Factory Droid. `exec` is headless; `--output-format json` answers with ONE
523
+ * object at the end rather than a stream.
524
+ *
525
+ * `stream-json` exists and is deprecated -- it prints a warning -- and its
526
+ * replacement, `stream-jsonrpc`, is a request/response protocol that expects a
527
+ * client writing to stdin, not a log to read. A single object at the end is the
528
+ * honest fit for a one-shot prompt, at the cost of the panel showing the work
529
+ * only when it is done.
530
+ *
531
+ * `--auto medium` because a headless agent cannot answer an approval prompt,
532
+ * and `low` refuses the file edits an agent asked to build something needs.
533
+ */
534
+ const droid = {
535
+ id: "droid",
536
+ label: "Factory Droid",
537
+ bin: "droid",
538
+ argv: (prompt, session) => [
539
+ "exec",
540
+ "--output-format",
541
+ "json",
542
+ "--auto",
543
+ "medium",
544
+ ...(session === null ? [] : ["--session-id", session]),
545
+ prompt,
546
+ ],
547
+ read: (line) => {
548
+ const event = parse(line);
549
+ if (event === null)
550
+ return unparsed(line);
551
+ const text = event.result ?? event.output ?? event.message ?? event.text;
552
+ const session = event.session_id ?? event.sessionId;
553
+ if (typeof text === "string" && text.trim() !== "")
554
+ return { lines: say(text), session };
555
+ return { lines: [], session };
556
+ },
557
+ };
558
+ /**
559
+ * Block's goose. `run -t` is its headless verb, and it speaks `stream-json`.
560
+ *
561
+ * Sessions are named rather than identified: `--resume -n <name>` reopens one,
562
+ * so the name goose reports is stored where the other harnesses store an id.
563
+ */
564
+ const goose = {
565
+ id: "goose",
566
+ label: "goose",
567
+ bin: "goose",
568
+ argv: (prompt, session) => [
569
+ "run",
570
+ ...(session === null ? [] : ["--resume", "-n", session]),
571
+ "--output-format",
572
+ "stream-json",
573
+ "-t",
574
+ prompt,
575
+ ],
576
+ read: (line) => {
577
+ const event = parse(line);
578
+ if (event === null)
579
+ return unparsed(line);
580
+ const session = event.session_id ?? event.session ?? event.name;
581
+ const kind = event.type;
582
+ if (kind === "text" || kind === "message" || kind === "assistant") {
583
+ const text = event.text ?? event.content ?? event.message?.content;
584
+ if (typeof text === "string")
585
+ return { lines: say(text), session };
586
+ }
587
+ if (kind === "tool_use" || kind === "tool_request") {
588
+ return { lines: toolLines(String(event.name ?? event.tool ?? "tool"), event.input), session };
589
+ }
590
+ if (kind === "error") {
591
+ return { lines: [{ level: "error", message: String(event.message ?? "agent failed") }], session };
592
+ }
593
+ return { lines: [], session };
594
+ },
595
+ };
596
+ /**
597
+ * GitHub Copilot CLI. `-p` runs one prompt; there is no structured output --
598
+ * the request for it is open and unimplemented -- so this reads plain text.
599
+ *
600
+ * `--no-ask-user` matters more here than the missing JSON: without it Copilot
601
+ * pauses for clarification, and a headless run with nothing to answer it sits
602
+ * there until it is killed. `--allow-tool` is scoped to this server's tools for
603
+ * the same reason Claude's is: a prompt typed in a Studio panel is not consent
604
+ * to touch the disk.
605
+ */
606
+ const copilot = {
607
+ id: "copilot",
608
+ label: "GitHub Copilot CLI",
609
+ bin: "copilot",
610
+ argv: (prompt) => ["-p", prompt, "--no-ask-user", "--allow-tool", "mcp__rbx-studio"],
611
+ read: (line) => line.trim() === "" ? NOTHING : { lines: [{ level: "reply", message: line.trim() }] },
612
+ };
613
+ /**
614
+ * Aider. `--message` is one shot; `--yes` answers the confirmations it would
615
+ * otherwise block on. No event stream, so its prose arrives as prose.
616
+ */
617
+ const aider = {
618
+ id: "aider",
619
+ label: "Aider",
620
+ bin: "aider",
621
+ argv: (prompt) => ["--message", prompt, "--yes", "--no-pretty"],
622
+ read: (line) => line.trim() === "" ? NOTHING : { lines: [{ level: "reply", message: line.trim() }] },
623
+ };
246
624
  const REGISTRY = [
247
625
  claude,
248
626
  codex,
249
627
  opencode,
250
628
  dsh,
251
- generic("gemini", "gemini", "Gemini CLI"),
252
- generic("cursor", "cursor-agent", "Cursor Agent"),
253
- generic("crush", "crush", "Crush"),
629
+ gemini,
630
+ cursor,
631
+ amp,
632
+ qwen,
633
+ droid,
634
+ goose,
635
+ copilot,
636
+ aider,
637
+ crush,
254
638
  ];
639
+ /**
640
+ * Whether an MCP client's self-reported name is this harness.
641
+ *
642
+ * The names nearly agree and not quite: the harness ids here are `claude`,
643
+ * `codex`, `opencode`, and the clients introduce themselves as `claude-code`,
644
+ * `codex`, `opencode`. Compared with the punctuation stripped and either one
645
+ * allowed to be the prefix, which covers `claude` against `claude-code`
646
+ * without needing a second table to keep in sync with the first.
647
+ *
648
+ * Deliberately not clever. A wrong match here picks the wrong agent, and the
649
+ * cost of no match is only that the first installed one is used instead --
650
+ * which is the behaviour this replaces, so a miss is never worse than before.
651
+ */
652
+ export function matchesClient(harness, clientName) {
653
+ const flat = (value) => value.toLowerCase().replace(/[^a-z0-9]/g, "");
654
+ const id = flat(harness.id);
655
+ const name = flat(clientName);
656
+ if (id.length === 0 || name.length === 0)
657
+ return false;
658
+ return name.startsWith(id) || id.startsWith(name);
659
+ }
255
660
  /**
256
661
  * Where a binary is on PATH, or null. Found by looking rather than by running.
257
662
  *
@@ -1 +1 @@
1
- {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/bridge/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoCzC,MAAM,OAAO,GAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAEvC,iFAAiF;AACjF,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtE,IAAI,MAA0B,CAAC;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;aAC7E,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACZ,kEAAkE;YAClE,qEAAqE;YACrE,yCAAyC;aACxC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,2EAA2E;AAC3E,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;SAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAY;IACtB,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,aAAa;IACpB,GAAG,EAAE,QAAQ;IACb,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5C,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,SAAS;QACT,MAAM;QACN,iBAAiB;QACjB,aAAa;QACb,WAAW;QACX,wEAAwE;QACxE,2EAA2E;QAC3E,yEAAyE;QACzE,mCAAmC;QACnC,gBAAgB;QAChB,iBAAiB;QACjB,mBAAmB;QACnB,SAAS;KACV;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACxD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3F,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;oBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,OAAO;gBACL,KAAK,EAAE;oBACL;wBACE,KAAK,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;wBAC/C,OAAO,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY;wBAChE,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;qBAC3C;iBACF;gBACD,OAAO,EAAE,KAAK,CAAC,UAAU;aAC1B,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,KAAK,GAAY;IACrB,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACzB,MAAM;QACN,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,QAAQ;QACR,uBAAuB;QACvB,MAAM;KACP;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QAErC,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAChE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACjE,CAAC;QACD,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACzF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;YACtE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,kFAAkF;AAClF,MAAM,QAAQ,GAAY;IACxB,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACzB,KAAK;QACL,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,UAAU;QACV,MAAM;QACN,MAAM;KACP;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;QACvC,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC3F,CAAC;QACD,IAAI,IAAI,KAAK,sBAAsB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5F,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1D,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7D,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,EAAU,EAAE,GAAW,EAAE,KAAa;IACrD,OAAO;QACL,EAAE;QACF,KAAK;QACL,GAAG;QACH,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;KACrF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,GAAG,GAAY;IACnB,EAAE,EAAE,KAAK;IACT,KAAK,EAAE,kBAAkB;IACzB,GAAG,EAAE,KAAK;IACV,6EAA6E;IAC7E,EAAE;IACF,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI;IACJ,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,MAAM,CAAC;IAC5E,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;CACvF,CAAC;AAEF,MAAM,QAAQ,GAAc;IAC1B,MAAM;IACN,KAAK;IACL,QAAQ;IACR,GAAG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;IACzC,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC;IACjD,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3F,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QACzD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,MAAM,SAAS,IAAI,SAAS,KAAK,EAAE;gBACtC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,IAAI,UAAU,CAAC,SAAS,CAAC;oBAAE,OAAO,SAAS,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAU;IAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,qDAAqD;AACrD,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC;;;;;;;;;;GAUG;AACH,SAAS,SAAS;IAChB,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACnC,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC;QACb,UAAU,EAAE;YACV,YAAY,EAAE;gBACZ,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,IAAI,EAAE,CAAC,KAAK,CAAC;gBACb,2DAA2D;gBAC3D,EAAE;gBACF,kEAAkE;gBAClE,qEAAqE;gBACrE,iEAAiE;gBACjE,sEAAsE;gBACtE,kEAAkE;gBAClE,sEAAsE;gBACtE,8CAA8C;gBAC9C,EAAE;gBACF,oEAAoE;gBACpE,4CAA4C;gBAC5C,IAAI;gBACJ,GAAG,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE;aACrC;SACF;KACF,CAAC,EACF,MAAM,CACP,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,IAAI,CAAC,KAAmB;IAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAE9B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC;AACf,CAAC;AAED,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC;;;;;;;;GAQG;AACH,SAAS,UAAU;IACjB,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACjD,2EAA2E;IAC3E,0EAA0E;IAC1E,wBAAwB;IACxB,aAAa,CACX,WAAW,EACX;QACE,WAAW;QACX,0BAA0B;QAC1B,2CAA2C;QAC3C,eAAe;QACf,gCAAgC;QAChC,0BAA0B;QAC1B,oBAAoB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACtD,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;QAC1C,kCAAkC;QAClC,mCAAmC;QACnC,kEAAkE;QAClE,mEAAmE;QACnE,cAAc;QACd,uCAAuC;QACvC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,CACP,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,CACjB,OAAgB,EAChB,MAAc,EACd,OAAmF;IAEnF,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG,iBAAiB,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,yEAAyE;YACzE,qEAAqE;YACrE,yEAAyE;YACzE,wCAAwC;YACxC,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;YACvC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,yEAAyE;YACzE,0BAA0B;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,0EAA0E;YAC1E,0EAA0E;YAC1E,mDAAmD;YACnD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,sBAAsB,EAAE,GAAG,EAAE;SACrD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7F,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,2EAA2E;IAC3E,mDAAmD;IACnD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAQ,EAAE;QACnC,OAAO,IAAI,KAAK,CAAC;QACjB,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,EAAE;gBAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YACvF,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnD,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE/B,6EAA6E;IAC7E,0EAA0E;IAC1E,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,SAAS,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAgB,CAAC,MAAM,EAAE,EAAE;QACjD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,GAAG;gBACzC,MAAM,EAAE,KAAK,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO,KAAK,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,OAAO,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI;oBAC1C,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;iBACvC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;QACD,IAAI;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/bridge/harness.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@el4cteo/rbx-studio-mcp",
3
- "version": "0.5.0",
3
+ "version": "0.5.3",
4
4
  "description": "MCP server for Roblox Studio. 31 tools, push-based SSE bridge, editor-safe script edits, one-step undo.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -9,7 +9,7 @@
9
9
 
10
10
  local Config = {}
11
11
 
12
- Config.PLUGIN_VERSION = "0.5.0"
12
+ Config.PLUGIN_VERSION = "0.5.3"
13
13
 
14
14
  -- Fingerprint of plugin/src, stamped in by scripts/build-plugin.mjs. The server
15
15
  -- computes the same hash from its own copy of the sources and compares, so a
@@ -17,7 +17,7 @@ import { readFileSync } from "node:fs";
17
17
  import { Bridge } from "../dist/bridge/rpc.js";
18
18
  import { LocalBridge } from "../dist/bridge/api.js";
19
19
  import { frame, handleConsole } from "../dist/bridge/console.js";
20
- import { find, installed } from "../dist/bridge/harness.js";
20
+ import { find, installed, matchesClient } from "../dist/bridge/harness.js";
21
21
 
22
22
  let checks = 0;
23
23
  const ok = (condition, what) => {
@@ -60,12 +60,51 @@ const readAll = (id, lines) => {
60
60
  ]);
61
61
 
62
62
  ok(session === "abc-123", "claude: session id is learned from the init event");
63
- ok(rows.length === 3, "claude: init contributes no row, junk lines are ignored");
63
+ // Four rows, not three: the "not json at all" line is SHOWN. This assertion
64
+ // used to require it be dropped, which is the same instinct that made
65
+ // opencode print nothing -- a line we cannot parse is still evidence, and the
66
+ // panel is the only place the user can see it.
67
+ // Three rows, and which three is the point. The junk line IS shown -- that
68
+ // assertion used to require it be dropped, the same instinct that made
69
+ // opencode print nothing. The rbx-studio tool call is NOT, because Studio
70
+ // logs every call that reaches it with a friendlier name and a duration, and
71
+ // the agent's copy of it made every call two lines in the panel.
72
+ ok(rows.length === 3, "claude: junk is surfaced, our own tool call is not doubled");
73
+ ok(
74
+ rows.some((row) => row.level === "dim" && row.message === "not json at all"),
75
+ "claude: an unparseable line is shown dim rather than swallowed",
76
+ );
77
+ ok(
78
+ !rows.some((row) => row.level === "call"),
79
+ "claude: an rbx-studio call is left to Studio's own log",
80
+ );
64
81
  ok(rows[0].level === "reply" && rows[0].message === "Looking at the place.", "claude: prose");
65
- ok(rows[1].level === "call" && rows[1].message === "create", "claude: server prefix is stripped");
66
82
  ok(rows[2].level === "ok" && rows[2].message === "agent done", "claude: result row");
67
83
  ok(rows[2].detail === "5.6s $0.1282", "claude: duration and cost ride the detail column");
68
84
 
85
+ // A tool that is NOT ours is all the panel will ever hear about, so it stays.
86
+ const outside = readAll("claude", [
87
+ JSON.stringify({
88
+ type: "assistant",
89
+ message: { content: [{ type: "tool_use", name: "Bash", input: { command: "ls -la" } }] },
90
+ }),
91
+ ]);
92
+ ok(
93
+ outside.rows[0].level === "call" && outside.rows[0].message === "Bash",
94
+ "claude: a tool Studio never sees is still logged",
95
+ );
96
+
97
+ // opencode names MCP tools `<server>_<tool>`, not `mcp__<server>__<tool>`.
98
+ // Unstripped it printed "rbx-studio_studio_status" AND doubled Studio's row.
99
+ const named = readAll("opencode", [
100
+ JSON.stringify({
101
+ type: "tool_use",
102
+ sessionID: "s",
103
+ part: { type: "tool", tool: "rbx-studio_studio_status", state: { input: {} } },
104
+ }),
105
+ ]);
106
+ ok(named.rows.length === 0, "opencode: its own naming of our tools is recognised too");
107
+
69
108
  // A failure must not be reported as a completion. This is the one row a user
70
109
  // reads to decide whether to trust what just happened to their place.
71
110
  const failed = readAll("claude", [
@@ -86,7 +125,7 @@ const readAll = (id, lines) => {
86
125
  content: [
87
126
  {
88
127
  type: "tool_use",
89
- name: "mcp__rbx-studio__execute_luau",
128
+ name: "Bash",
90
129
  input: { source: "local m = workspace.SmallHouse\nm.Parent = nil\nprint(m)" },
91
130
  },
92
131
  ],
@@ -94,25 +133,126 @@ const readAll = (id, lines) => {
94
133
  }),
95
134
  ]);
96
135
  ok(!rows[0].detail.includes("\n"), "tool detail never contains a newline");
97
- ok(rows[0].message === "execute_luau", "tool name keeps its own underscores");
136
+ ok(rows[0].message === "Bash", "an outside tool keeps its own name");
98
137
  }
99
138
 
100
- // --- Codex and opencode ----------------------------------------------------
139
+ // --- every adapter, against its real envelope -------------------------------
140
+ //
141
+ // This block used to assert INVENTED event names -- `session.created` for
142
+ // codex, `message.part.updated` for opencode -- while the file's own header
143
+ // claimed the shapes were recorded from live runs. They were not, and the tests
144
+ // passed anyway, because a test written against the same wrong envelope as the
145
+ // code agrees with it perfectly.
146
+ //
147
+ // What that cost: a prompt sent to opencode printed NOTHING. Every line fell
148
+ // through to no rows, the panel logged a blank run and went idle, and the
149
+ // agent's answer was thrown away. The lines below are copied from real runs
150
+ // (opencode 1.18.30, claude 2.1.266) or from the vendors' own documented
151
+ // schemas for the CLIs not installed here.
101
152
  {
153
+ // opencode 1.18.30, verbatim from `opencode run --format json`.
154
+ const oc = readAll("opencode", [
155
+ JSON.stringify({ type: "step_start", sessionID: "ses_abc", part: { type: "step-start" } }),
156
+ JSON.stringify({
157
+ type: "tool_use",
158
+ sessionID: "ses_abc",
159
+ part: { type: "tool", tool: "glob", state: { input: { pattern: "*.ts" } } },
160
+ }),
161
+ JSON.stringify({
162
+ type: "text",
163
+ sessionID: "ses_abc",
164
+ part: { type: "text", text: "Hi there, how's it going?" },
165
+ }),
166
+ JSON.stringify({ type: "step_finish", sessionID: "ses_abc", part: { type: "step-finish" } }),
167
+ ]);
168
+ ok(oc.session === "ses_abc", "opencode: session id rides on every event");
169
+ ok(
170
+ oc.rows.some((row) => row.level === "reply" && row.message === "Hi there, how's it going?"),
171
+ "opencode: the answer is printed -- the bug was that it never was",
172
+ );
173
+ ok(oc.rows.some((row) => row.message === "glob"), "opencode: tool calls are printed");
174
+ ok(
175
+ !oc.rows.some((row) => row.message === "agent done"),
176
+ "opencode: step_finish is per step, not the end of the run",
177
+ );
178
+
179
+ // Codex, from the documented exec --json protocol.
102
180
  const codex = readAll("codex", [
103
- JSON.stringify({ type: "session.created", session_id: "cx-1" }),
104
- JSON.stringify({ type: "agent_message", text: "Done." }),
181
+ JSON.stringify({ type: "thread.started", thread_id: "019cec77-af02" }),
182
+ JSON.stringify({ type: "turn.started" }),
183
+ JSON.stringify({
184
+ type: "item.started",
185
+ item: { id: "i1", type: "mcp_tool_call", server: "rbx", tool: "create", arguments: {} },
186
+ }),
187
+ JSON.stringify({
188
+ type: "item.completed",
189
+ item: { id: "i1", type: "mcp_tool_call", server: "rbx", tool: "create" },
190
+ }),
191
+ JSON.stringify({ type: "item.completed", item: { id: "i2", type: "agent_message", text: "Done." } }),
192
+ JSON.stringify({ type: "turn.completed", usage: {} }),
193
+ ]);
194
+ ok(codex.session === "019cec77-af02", "codex: session comes from thread.started/thread_id");
195
+ ok(
196
+ codex.rows.some((row) => row.level === "reply" && row.message === "Done."),
197
+ "codex: prose",
198
+ );
199
+ ok(
200
+ codex.rows.filter((row) => row.message === "create").length === 1,
201
+ "codex: a tool reported started AND completed is logged once",
202
+ );
203
+ ok(codex.rows.some((row) => row.message === "agent done"), "codex: turn.completed ends the run");
204
+
205
+ // Codex global flags must precede the `resume` subcommand or it refuses them.
206
+ const resumed = find("codex").argv("hello", "thread-1");
207
+ ok(
208
+ resumed.indexOf("--skip-git-repo-check") < resumed.indexOf("resume"),
209
+ "codex: global flags come before the resume subcommand",
210
+ );
211
+ ok(resumed[resumed.length - 1] === "hello", "codex: the prompt stays last");
212
+
213
+ // Gemini, from the documented headless stream-json events.
214
+ const gem = readAll("gemini", [
215
+ JSON.stringify({ type: "init", session_id: "gem-1", model: "gemini" }),
216
+ JSON.stringify({ type: "message", role: "user", content: "what did I ask" }),
217
+ JSON.stringify({ type: "message", role: "assistant", content: "Built it." }),
218
+ JSON.stringify({ type: "result" }),
105
219
  ]);
106
- ok(codex.session === "cx-1", "codex: session id");
107
- ok(codex.rows[0].level === "reply" && codex.rows[0].message === "Done.", "codex: prose");
220
+ ok(gem.session === "gem-1", "gemini: session id");
221
+ ok(gem.rows.some((row) => row.message === "Built it."), "gemini: the assistant half is printed");
222
+ ok(
223
+ !gem.rows.some((row) => row.message === "what did I ask"),
224
+ "gemini: the user half is not echoed back at them",
225
+ );
108
226
 
109
- const oc = readAll("opencode", [
227
+ // Cursor, from the documented stream-json envelope.
228
+ const cur = readAll("cursor", [
229
+ JSON.stringify({ type: "system", subtype: "init", session_id: "cur-1" }),
110
230
  JSON.stringify({
111
- type: "message.part.updated",
112
- properties: { part: { type: "text", text: "Placed the model." } },
231
+ type: "tool_call",
232
+ subtype: "started",
233
+ session_id: "cur-1",
234
+ tool_call: { readToolCall: { args: { path: "a.ts" } } },
113
235
  }),
236
+ JSON.stringify({
237
+ type: "assistant",
238
+ session_id: "cur-1",
239
+ message: { role: "assistant", content: [{ type: "text", text: "Read it." }] },
240
+ }),
241
+ JSON.stringify({ type: "result", subtype: "success", is_error: false, session_id: "cur-1" }),
114
242
  ]);
115
- ok(oc.rows[0].message === "Placed the model.", "opencode: prose");
243
+ ok(cur.session === "cur-1", "cursor: session id rides on every event");
244
+ ok(cur.rows.some((row) => row.message === "Read it."), "cursor: text is nested in message.content");
245
+ ok(cur.rows.some((row) => row.message === "readToolCall"), "cursor: the tool key names the call");
246
+ ok(cur.rows.some((row) => row.message === "agent done"), "cursor: result ends the run");
247
+
248
+ // Crush has no event stream, but it does have its own verb -- the generic
249
+ // adapter guessed `-p`, which crush rejects outright as an unknown flag.
250
+ const crush = find("crush").argv("hello", null);
251
+ ok(crush[0] === "run", "crush: uses its `run` verb, not a guessed -p flag");
252
+ ok(
253
+ readAll("crush", ["Placed the model."]).rows[0].message === "Placed the model.",
254
+ "crush: plain text still reaches the log",
255
+ );
116
256
  }
117
257
 
118
258
  // --- DeepSeek Harness ------------------------------------------------------
@@ -290,4 +430,131 @@ const readAll = (id, lines) => {
290
430
  );
291
431
  }
292
432
 
433
+ // Choosing which agent answers a prompt --------------------------------------
434
+ //
435
+ // The shipped bug: someone with opencode open typed a prompt into the panel and
436
+ // Claude Code answered, because the choice was "first one installed" and
437
+ // `claude` sorts first in the registry. The answer was fine and came from the
438
+ // wrong program.
439
+ {
440
+ const claude = find("claude");
441
+ const opencode = find("opencode");
442
+
443
+ ok(matchesClient(claude, "claude-code"), "claude matches the name its client reports");
444
+ ok(matchesClient(opencode, "opencode"), "opencode matches its own client name");
445
+ ok(!matchesClient(claude, "opencode"), "and does not match a different agent");
446
+ ok(!matchesClient(opencode, "claude-code"), "in either direction");
447
+ ok(!matchesClient(claude, ""), "a nameless client matches nothing");
448
+
449
+ // The registry marks `agent` rows and picks the prompt's target from the same
450
+ // function, so a listing can never say "in use" about an agent the prompt
451
+ // would not use. Exercised through the real bridge: what makes an agent a
452
+ // candidate is that it is CONNECTED, which only the bridge knows.
453
+ const bridge = new Bridge();
454
+ bridge.noteClient("one", { name: "opencode", version: "1", pid: 1 });
455
+ bridge.noteClient("two", { name: "claude-code", version: "2", pid: 2 });
456
+
457
+ const rows = await handleConsole(bridge, 44755, {
458
+ studioId: "studio-agents",
459
+ command: "agent",
460
+ args: [],
461
+ line: "agent",
462
+ });
463
+ const text = rows.map((row) => `${row.message} ${row.detail ?? ""}`).join(" | ");
464
+
465
+ // Only meaningful when both are actually installed on the machine running the
466
+ // suite; otherwise there is nothing to be ambiguous between.
467
+ const both = installed().filter((entry) => entry.id === "claude" || entry.id === "opencode");
468
+ if (both.length === 2) {
469
+ ok(
470
+ rows.some((row) => row.level === "warn" && /agent use <id>/.test(row.message)),
471
+ "two connected agents are not silently resolved to whichever sorts first",
472
+ );
473
+ ok(!/in use/.test(text), "and none is marked as the one in use");
474
+ ok(/connected/.test(text), "the ones that are attached are named as attached");
475
+ } else {
476
+ ok(true, "skipped: both agents are not installed here");
477
+ }
478
+ }
479
+
480
+ // --- the harnesses added after the opencode failure -------------------------
481
+ //
482
+ // Same rule as the block above: every shape here comes from the vendor's own
483
+ // documentation, not from a guess. The point of the rule is that a guessed
484
+ // envelope produces silence, and silence is the failure mode this whole file
485
+ // exists to catch.
486
+ {
487
+ // Amp says outright that it speaks Claude Code's protocol, so it is read by
488
+ // the same function -- and this asserts that, rather than trusting it.
489
+ const amp = readAll("amp", [
490
+ JSON.stringify({ type: "system", subtype: "init", session_id: "T-1", cwd: "/x" }),
491
+ JSON.stringify({
492
+ type: "assistant",
493
+ session_id: "T-1",
494
+ message: {
495
+ content: [
496
+ { type: "text", text: "Built the wall." },
497
+ { type: "tool_use", name: "create", input: { className: "Part" } },
498
+ ],
499
+ },
500
+ }),
501
+ JSON.stringify({ type: "result", session_id: "T-1", is_error: false }),
502
+ ]);
503
+ ok(amp.session === "T-1", "amp: session id");
504
+ ok(amp.rows.some((row) => row.message === "Built the wall."), "amp: prose");
505
+ ok(amp.rows.some((row) => row.message === "create"), "amp: tool calls");
506
+ ok(amp.rows.some((row) => row.message === "agent done"), "amp: result ends the run");
507
+
508
+ // Continuing is a different command, not a flag: `amp threads continue <id>`.
509
+ const ampResume = find("amp").argv("go on", "T-1");
510
+ ok(ampResume[0] === "threads" && ampResume[1] === "continue", "amp: resumes with its own verb");
511
+ ok(ampResume[2] === "T-1", "amp: the thread id follows the verb");
512
+ ok(find("amp").argv("hi", null)[0] === "-x", "amp: a fresh run uses the execute flag");
513
+
514
+ // Qwen Code is a Gemini CLI fork and kept its headless envelope.
515
+ const qwen = readAll("qwen", [
516
+ JSON.stringify({ type: "init", session_id: "q-1" }),
517
+ JSON.stringify({ type: "message", role: "assistant", content: "Done." }),
518
+ ]);
519
+ ok(qwen.session === "q-1", "qwen: session id, read as gemini");
520
+ ok(qwen.rows.some((row) => row.message === "Done."), "qwen: prose");
521
+
522
+ // Droid answers with one object at the end rather than a stream.
523
+ const droid = readAll("droid", [JSON.stringify({ session_id: "d-1", result: "Placed it." })]);
524
+ ok(droid.session === "d-1", "droid: session id");
525
+ ok(droid.rows.some((row) => row.message === "Placed it."), "droid: the final answer");
526
+ const droidArgv = find("droid").argv("hi", null);
527
+ ok(droidArgv[0] === "exec", "droid: uses its exec verb");
528
+ ok(droidArgv.includes("--auto"), "droid: sets an autonomy level, or it blocks on approval");
529
+
530
+ // goose names sessions instead of numbering them.
531
+ const goose = readAll("goose", [
532
+ JSON.stringify({ type: "message", text: "Ready.", session_id: "g-1" }),
533
+ ]);
534
+ ok(goose.rows.some((row) => row.message === "Ready."), "goose: prose");
535
+ const gooseResume = find("goose").argv("go on", "g-1");
536
+ ok(
537
+ gooseResume.includes("--resume") && gooseResume[gooseResume.indexOf("-n") + 1] === "g-1",
538
+ "goose: resumes a session by name",
539
+ );
540
+
541
+ // Copilot has no structured output, but it does block without --no-ask-user.
542
+ const copilotArgv = find("copilot").argv("hi", null);
543
+ ok(copilotArgv.includes("--no-ask-user"), "copilot: never waits for a human that is not there");
544
+ ok(
545
+ readAll("copilot", ["Explained it."]).rows[0].message === "Explained it.",
546
+ "copilot: plain text reaches the log",
547
+ );
548
+
549
+ // Aider blocks on confirmations unless told not to.
550
+ ok(find("aider").argv("hi", null).includes("--yes"), "aider: answers its own confirmations");
551
+
552
+ // Every harness must produce SOMETHING from a plain line. A reader that
553
+ // silently drops unknown input is exactly how opencode printed nothing.
554
+ for (const harness of ["amp", "qwen", "droid", "goose", "copilot", "aider", "crush"]) {
555
+ const rows = readAll(harness, ["some unstructured output"]).rows;
556
+ ok(rows.length > 0, harness + ": unrecognised output is shown, not swallowed");
557
+ }
558
+ }
559
+
293
560
  process.stdout.write(`console: ${checks} checks pass\n`);