@el4cteo/rbx-studio-mcp 0.1.6 → 0.2.7
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 +67 -5
- package/dist/bridge/api.js +29 -0
- package/dist/bridge/api.js.map +1 -1
- package/dist/bridge/remote.js +35 -0
- package/dist/bridge/remote.js.map +1 -1
- package/dist/bridge/rpc.js +81 -2
- package/dist/bridge/rpc.js.map +1 -1
- package/dist/bridge/server.js +60 -3
- package/dist/bridge/server.js.map +1 -1
- package/dist/index.js +86 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/protocol.js +23 -0
- package/dist/lib/protocol.js.map +1 -1
- package/dist/tools/discover.js +7 -1
- package/dist/tools/discover.js.map +1 -1
- package/dist/tools/input.js +63 -1
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/instances.js +9 -1
- package/dist/tools/instances.js.map +1 -1
- package/dist/tools/perf.js +73 -16
- package/dist/tools/perf.js.map +1 -1
- package/dist/tools/playtest.js +8 -1
- package/dist/tools/playtest.js.map +1 -1
- package/dist/tools/session.js +32 -6
- package/dist/tools/session.js.map +1 -1
- package/dist/tools/world.js +9 -3
- package/dist/tools/world.js.map +1 -1
- package/package.json +2 -2
- package/plugin/src/Config.luau +1 -1
- package/plugin/src/Console.luau +204 -4
- package/plugin/src/Net.luau +23 -1
- package/plugin/src/Phrase.luau +158 -5
- package/plugin/src/Transport.luau +84 -19
- package/plugin/src/Visuals.luau +217 -20
- package/plugin/src/handlers/Debug.luau +63 -6
- package/plugin/src/handlers/Geometry.luau +20 -1
- package/plugin/src/handlers/Input.luau +41 -1
- package/plugin/src/handlers/Perf.luau +662 -645
- package/plugin/src/handlers/World.luau +19 -0
- package/plugin/src/init.server.luau +48 -11
- package/scripts/check-plugin.mjs +29 -1
- package/scripts/test-bridge.mjs +104 -0
- package/scripts/test-transport.mjs +58 -0
package/dist/tools/session.js
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { json, text } from "../lib/format.js";
|
|
3
3
|
import { pluginStalenessWarning } from "../lib/pluginbuild.js";
|
|
4
|
+
import { protocolMismatchWarning } from "../lib/protocol.js";
|
|
4
5
|
import { defineTool } from "../lib/tool.js";
|
|
6
|
+
/**
|
|
7
|
+
* What to tell the agent when this listing leaves no default target.
|
|
8
|
+
*
|
|
9
|
+
* Two sessions on one placeId is an editor and its own playtest, and telling
|
|
10
|
+
* the agent to go and ask the user which place they mean is a question with no
|
|
11
|
+
* answer -- there is one place, in two states. `resolveSession` already knew
|
|
12
|
+
* that and raised SAME_PLACE_STUDIO with real guidance, but this listing, which
|
|
13
|
+
* is what an agent reads *before* it gets that far, gave the opposite advice.
|
|
14
|
+
* Asking the user was the first thing it said, and the error it would hit next
|
|
15
|
+
* says in as many words not to. Same wording in both places now.
|
|
16
|
+
*/
|
|
17
|
+
function listingHint(sessions, active) {
|
|
18
|
+
if (active !== null || sessions.length <= 1)
|
|
19
|
+
return undefined;
|
|
20
|
+
const places = new Set(sessions.map((session) => session.placeId));
|
|
21
|
+
if (places.size === 1) {
|
|
22
|
+
return ("This is one place with a playtest running, not two places — do not ask " +
|
|
23
|
+
"the user which they mean. Pass `studioId` explicitly: the *edit* session " +
|
|
24
|
+
"for anything that must outlive the playtest, the *playtest* session for " +
|
|
25
|
+
"the running game.");
|
|
26
|
+
}
|
|
27
|
+
return ("Several places are open and none is selected. Ask the user which one they " +
|
|
28
|
+
"mean, then call set_active_studio.");
|
|
29
|
+
}
|
|
5
30
|
export function registerSessionTools(context) {
|
|
6
31
|
const { bridge } = context;
|
|
7
32
|
defineTool(context, {
|
|
@@ -40,8 +65,11 @@ export function registerSessionTools(context) {
|
|
|
40
65
|
// A stale plugin answers with older handlers and no other symptom, so the
|
|
41
66
|
// warning rides along with the one call agents are told to make first.
|
|
42
67
|
const session = view.list.find((entry) => entry.studioId === targetId);
|
|
43
|
-
const
|
|
44
|
-
|
|
68
|
+
const warnings = [
|
|
69
|
+
pluginStalenessWarning(session?.buildId),
|
|
70
|
+
session ? protocolMismatchWarning(session.protocolVersion) : null,
|
|
71
|
+
].filter((warning) => warning !== null);
|
|
72
|
+
return json(status, warnings.length > 0 ? `WARNING: ${warnings.join(" ")}` : undefined);
|
|
45
73
|
});
|
|
46
74
|
defineTool(context, {
|
|
47
75
|
name: "list_studios",
|
|
@@ -108,13 +136,11 @@ export function registerSessionTools(context) {
|
|
|
108
136
|
pluginVersion: session.pluginVersion,
|
|
109
137
|
buildId: session.buildId,
|
|
110
138
|
stale: pluginStalenessWarning(session.buildId) ?? false,
|
|
139
|
+
protocolMismatch: protocolMismatchWarning(session.protocolVersion) ?? false,
|
|
111
140
|
active: session.studioId === active,
|
|
112
141
|
})),
|
|
113
142
|
activeStudioId: active,
|
|
114
|
-
},
|
|
115
|
-
? "No place is selected. Ask the user which one they mean, then call " +
|
|
116
|
-
"set_active_studio."
|
|
117
|
-
: undefined);
|
|
143
|
+
}, listingHint(sessions, active));
|
|
118
144
|
});
|
|
119
145
|
defineTool(context, {
|
|
120
146
|
name: "set_active_studio",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AA+B9D,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,UAAU,CACR,OAAO,EACP;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,uEAAuE;YACvE,wEAAwE;YACxE,oEAAoE;YACpE,2EAA2E;YAC3E,uEAAuE;YACvE,yEAAyE;YACzE,0EAA0E;YAC1E,2EAA2E;YAC3E,4EAA4E;YAC5E,oEAAoE;YACpE,wEAAwE;YACxE,2EAA2E;YAC3E,yEAAyE;YACzE,UAAU;YACV,2EAA2E;YAC3E,mDAAmD;QACrD,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,gEAAgE;gBAC9D,yCAAyC,CAC5C;SACJ;QACD,QAAQ,EAAE,IAAI;KACf,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAuB,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAe,eAAe,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC3C,IAAI,QAAQ;YAAE,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAErF,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACvE,MAAM,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/world.js
CHANGED
|
@@ -241,12 +241,18 @@ export function registerWorldTools(context) {
|
|
|
241
241
|
"The order is: `create` a group, `assign` parts to it, then set what it " +
|
|
242
242
|
"is `collidable` with. A group with nothing assigned does nothing.\n\n" +
|
|
243
243
|
"Assigning a Model assigns every part inside it, which is almost always " +
|
|
244
|
-
"what is meant
|
|
244
|
+
"what is meant.\n\n" +
|
|
245
|
+
"Groups are not undoable and not scoped to a session: `remove` when one " +
|
|
246
|
+
"was created to try something and is no longer wanted, rather than " +
|
|
247
|
+
"leaving it registered in the place indefinitely. The built-in " +
|
|
248
|
+
"\"Default\" group cannot be removed.",
|
|
245
249
|
inputSchema: {
|
|
246
250
|
action: z
|
|
247
|
-
.enum(["list", "create", "assign", "collidable"])
|
|
251
|
+
.enum(["list", "create", "assign", "collidable", "remove"])
|
|
248
252
|
.default("list")
|
|
249
|
-
.describe("'list' shows existing groups and changes nothing."
|
|
253
|
+
.describe("'list' shows existing groups and changes nothing. 'remove' " +
|
|
254
|
+
"unregisters a group entirely — not the same as un-assigning " +
|
|
255
|
+
"parts from it."),
|
|
250
256
|
group: z.string().optional().describe("The group's name. Required for everything but list."),
|
|
251
257
|
paths: z
|
|
252
258
|
.array(z.string())
|
package/dist/tools/world.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/tools/world.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"world.js","sourceRoot":"","sources":["../../src/tools/world.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.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "MCP server for Roblox Studio. 29 tools, push-based SSE bridge, editor-safe script edits, one-step undo.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"start": "node dist/index.js",
|
|
25
25
|
"build:plugin": "node scripts/check-plugin.mjs && node scripts/build-plugin.mjs",
|
|
26
26
|
"sourcemap": "node scripts/sourcemap.mjs",
|
|
27
|
-
"test": "node scripts/test-plugin.mjs && node scripts/test-bridge.mjs",
|
|
27
|
+
"test": "node scripts/test-plugin.mjs && node scripts/test-transport.mjs && node scripts/test-bridge.mjs",
|
|
28
28
|
"build:all": "npm run build && npm run build:plugin",
|
|
29
29
|
"install:plugin": "node scripts/install-plugin.mjs",
|
|
30
30
|
"check:plugin": "node scripts/check-plugin.mjs",
|
package/plugin/src/Config.luau
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
local Config = {}
|
|
11
11
|
|
|
12
|
-
Config.PLUGIN_VERSION = "0.
|
|
12
|
+
Config.PLUGIN_VERSION = "0.2.7"
|
|
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
|
package/plugin/src/Console.luau
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
--!strict
|
|
2
2
|
--[[
|
|
3
|
-
The
|
|
3
|
+
The rbx-studio console.
|
|
4
4
|
|
|
5
5
|
This is the only feedback channel the plugin has. It deliberately never
|
|
6
6
|
writes to Studio's Output window, because that log is also what the agent
|
|
@@ -107,12 +107,22 @@ end
|
|
|
107
107
|
|
|
108
108
|
type State = {
|
|
109
109
|
lines: { string },
|
|
110
|
+
--[[
|
|
111
|
+
Rows written, as opposed to lines rendered.
|
|
112
|
+
|
|
113
|
+
`lines` also holds the indented continuations a long detail wraps onto,
|
|
114
|
+
so counting it would report a number nobody wrote -- "cleared 41 logs"
|
|
115
|
+
for twelve commands. This counts calls to `log`, which is what a person
|
|
116
|
+
means by a log line.
|
|
117
|
+
]]
|
|
118
|
+
entries: number,
|
|
110
119
|
label: TextLabel?,
|
|
111
120
|
scroller: ScrollingFrame?,
|
|
112
121
|
statusDot: TextLabel?,
|
|
113
122
|
statusText: TextLabel?,
|
|
114
123
|
metaText: TextLabel?,
|
|
115
124
|
countersText: TextLabel?,
|
|
125
|
+
clientsChip: TextLabel?,
|
|
116
126
|
pinned: boolean,
|
|
117
127
|
calls: number,
|
|
118
128
|
errors: number,
|
|
@@ -120,23 +130,43 @@ type State = {
|
|
|
120
130
|
-- The command in flight, shown in the footer while it runs. One value that
|
|
121
131
|
-- is replaced, never a list that grows.
|
|
122
132
|
running: string?,
|
|
133
|
+
--[[
|
|
134
|
+
Bumped by every call, so a pending idle timer can tell whether it is still
|
|
135
|
+
the most recent one. Cheaper and less error-prone than cancelling timers:
|
|
136
|
+
`task.delay` has no handle to cancel, and a stale closure that checks a
|
|
137
|
+
counter simply does nothing.
|
|
138
|
+
]]
|
|
139
|
+
generation: number,
|
|
140
|
+
-- How many MCP clients share this bridge. Only ever displayed above one.
|
|
141
|
+
clients: number,
|
|
142
|
+
-- Set while a repaint is already scheduled for the end of this frame.
|
|
143
|
+
dirty: boolean,
|
|
123
144
|
}
|
|
124
145
|
|
|
125
146
|
local state: State = {
|
|
126
147
|
lines = {},
|
|
148
|
+
entries = 0,
|
|
127
149
|
label = nil,
|
|
128
150
|
scroller = nil,
|
|
129
151
|
statusDot = nil,
|
|
130
152
|
statusText = nil,
|
|
131
153
|
metaText = nil,
|
|
132
154
|
countersText = nil,
|
|
155
|
+
clientsChip = nil,
|
|
133
156
|
pinned = true,
|
|
134
157
|
calls = 0,
|
|
135
158
|
errors = 0,
|
|
136
159
|
totalMs = 0,
|
|
137
160
|
running = nil,
|
|
161
|
+
generation = 0,
|
|
162
|
+
clients = 1,
|
|
163
|
+
dirty = false,
|
|
138
164
|
}
|
|
139
165
|
|
|
166
|
+
-- How long the session must be silent before the console says so. Long enough
|
|
167
|
+
-- that an agent pausing to think is not announced as having stopped.
|
|
168
|
+
local QUIET_SECONDS = 20
|
|
169
|
+
|
|
140
170
|
local function hex(color: Color3): string
|
|
141
171
|
return string.format(
|
|
142
172
|
"#%02X%02X%02X",
|
|
@@ -159,7 +189,8 @@ local function span(color: Color3, value: string): string
|
|
|
159
189
|
return string.format('<font color="%s">%s</font>', hex(color), escape(value))
|
|
160
190
|
end
|
|
161
191
|
|
|
162
|
-
local function
|
|
192
|
+
local function paint()
|
|
193
|
+
state.dirty = false
|
|
163
194
|
local label = state.label
|
|
164
195
|
if not label then
|
|
165
196
|
return
|
|
@@ -177,6 +208,24 @@ local function redraw()
|
|
|
177
208
|
end
|
|
178
209
|
end
|
|
179
210
|
|
|
211
|
+
--[[
|
|
212
|
+
Asks for a repaint, at most one per frame.
|
|
213
|
+
|
|
214
|
+
Painting is a concat of up to three hundred strings followed by a RichText
|
|
215
|
+
relayout of the whole label, and it used to run once per appended row. A
|
|
216
|
+
failed command writes three rows -- the failure, its message, sometimes a
|
|
217
|
+
hint -- so a single unlucky call repainted the entire console three times,
|
|
218
|
+
and all of that sat in front of the reply on its way back to the agent.
|
|
219
|
+
Deferring collapses them into the one paint that was always sufficient.
|
|
220
|
+
]]
|
|
221
|
+
local function redraw()
|
|
222
|
+
if state.dirty then
|
|
223
|
+
return
|
|
224
|
+
end
|
|
225
|
+
state.dirty = true
|
|
226
|
+
task.defer(paint)
|
|
227
|
+
end
|
|
228
|
+
|
|
180
229
|
local function refreshCounters()
|
|
181
230
|
local counters = state.countersText
|
|
182
231
|
if not counters then
|
|
@@ -257,6 +306,7 @@ function Console.log(level: Level, message: string, detail: string?)
|
|
|
257
306
|
off beneath it.
|
|
258
307
|
]]
|
|
259
308
|
table.insert(state.lines, line)
|
|
309
|
+
state.entries += 1
|
|
260
310
|
if detail then
|
|
261
311
|
if inlineDetail then
|
|
262
312
|
local padding = math.max(1, DETAIL_COLUMN - bodyWidth)
|
|
@@ -303,6 +353,7 @@ local KIND_LOOK: { [string]: { color: Color3, urgency: number } } = {
|
|
|
303
353
|
|
|
304
354
|
function Console.beginCall(title: string, kind: string)
|
|
305
355
|
state.running = title
|
|
356
|
+
state.generation += 1
|
|
306
357
|
local look = KIND_LOOK[kind] or KIND_LOOK.read
|
|
307
358
|
Visuals.setCaption(title)
|
|
308
359
|
Visuals.setKind(look.color, look.urgency)
|
|
@@ -319,6 +370,9 @@ function Console.recordCall(ok: boolean, milliseconds: number)
|
|
|
319
370
|
if not ok then
|
|
320
371
|
state.errors += 1
|
|
321
372
|
end
|
|
373
|
+
-- Read before it is cleared: the bar wants the same phrase the log row uses,
|
|
374
|
+
-- and this is the only place that still has it.
|
|
375
|
+
local title = state.running or "call"
|
|
322
376
|
state.running = nil
|
|
323
377
|
refreshCounters()
|
|
324
378
|
-- The footer reports totals when idle, so the band shows what just ran
|
|
@@ -327,7 +381,35 @@ function Console.recordCall(ok: boolean, milliseconds: number)
|
|
|
327
381
|
|
|
328
382
|
-- The band plots it: bar height is how long it took, colour is whether it
|
|
329
383
|
-- worked, and a failure knocks the solid off its axis as well.
|
|
330
|
-
Visuals.recordCall(milliseconds, ok)
|
|
384
|
+
Visuals.recordCall(milliseconds, ok, title)
|
|
385
|
+
|
|
386
|
+
--[[
|
|
387
|
+
Says so when the session goes quiet, once per burst.
|
|
388
|
+
|
|
389
|
+
There is no "the agent has finished" message in MCP -- an agent that has
|
|
390
|
+
stopped and one that is thinking are the same silence -- so this reports
|
|
391
|
+
the silence rather than claiming to know what caused it: what ran, how
|
|
392
|
+
much of it, and how fast. The generation check is what makes it once per
|
|
393
|
+
burst: every later call bumps the counter, so all but the newest timer
|
|
394
|
+
wake up, find they are stale, and do nothing.
|
|
395
|
+
]]
|
|
396
|
+
state.generation += 1
|
|
397
|
+
local mine = state.generation
|
|
398
|
+
task.delay(QUIET_SECONDS, function()
|
|
399
|
+
if state.generation ~= mine or state.calls == 0 then
|
|
400
|
+
return
|
|
401
|
+
end
|
|
402
|
+
Console.log(
|
|
403
|
+
"dim",
|
|
404
|
+
string.format(
|
|
405
|
+
"agent idle -- %d call%s, avg %.0fms",
|
|
406
|
+
state.calls,
|
|
407
|
+
if state.calls == 1 then "" else "s",
|
|
408
|
+
state.totalMs / state.calls
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
Visuals.setQuiet()
|
|
412
|
+
end)
|
|
331
413
|
end
|
|
332
414
|
|
|
333
415
|
--[[
|
|
@@ -342,13 +424,99 @@ function Console.setCaption(message: string)
|
|
|
342
424
|
Visuals.setCaption(message)
|
|
343
425
|
end
|
|
344
426
|
|
|
427
|
+
--[[
|
|
428
|
+
Announces that an MCP client disconnected.
|
|
429
|
+
|
|
430
|
+
This is the one moment the bridge can be certain a session ended rather than
|
|
431
|
+
paused -- the client's process is gone -- so it is the one place the console
|
|
432
|
+
is allowed to state it outright. Everything else it knows about agent
|
|
433
|
+
activity is inference, and is worded as inference.
|
|
434
|
+
]]
|
|
435
|
+
function Console.agentFinished()
|
|
436
|
+
--[[
|
|
437
|
+
Named for what happened, not for what it might have meant.
|
|
438
|
+
|
|
439
|
+
This said "Agent finished task." and that was overclaiming: the bridge
|
|
440
|
+
sees a client disconnect and nothing more. Quitting the editor, a crash
|
|
441
|
+
and a restart all arrive here identically, and the first time one was
|
|
442
|
+
watched live it announced a completed task for an agent that had simply
|
|
443
|
+
been closed mid-idle.
|
|
444
|
+
]]
|
|
445
|
+
Console.log("ok", "Agent disconnected.", "client left")
|
|
446
|
+
Visuals.setQuiet()
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
--[[
|
|
450
|
+
How many MCP clients are sharing this bridge.
|
|
451
|
+
|
|
452
|
+
Reported only above one. A single client is the ordinary case and needs no
|
|
453
|
+
badge -- a permanent "1 client connected" is a label, not a signal, and the
|
|
454
|
+
header has better uses for the width.
|
|
455
|
+
]]
|
|
456
|
+
function Console.setClients(count: number)
|
|
457
|
+
local previous = state.clients
|
|
458
|
+
state.clients = count
|
|
459
|
+
|
|
460
|
+
local chip = state.clientsChip
|
|
461
|
+
if chip then
|
|
462
|
+
chip.Visible = count > 1
|
|
463
|
+
-- Pluralised even though the badge hides at one. A string that is only
|
|
464
|
+
-- ever correct because nobody can see it is a trap for whoever changes
|
|
465
|
+
-- the visibility rule later.
|
|
466
|
+
chip.Text = string.format(
|
|
467
|
+
"\u{25C6} %d client%s",
|
|
468
|
+
count,
|
|
469
|
+
if count == 1 then "" else "s"
|
|
470
|
+
)
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
local meta = state.metaText
|
|
474
|
+
if meta then
|
|
475
|
+
meta.Size = UDim2.new(1, if count > 1 then -486 else -394, 1, 0)
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
--[[
|
|
479
|
+
Only the arrival is worth a row.
|
|
480
|
+
|
|
481
|
+
The departure had one too, and seeing it live made the redundancy plain:
|
|
482
|
+
"one MCP client connected" landed in the same second as "Agent finished
|
|
483
|
+
task.", saying the same thing less well, while the badge disappearing
|
|
484
|
+
said it a third time. The count going up is news because nothing else
|
|
485
|
+
reports it; the count coming down is already covered twice over.
|
|
486
|
+
]]
|
|
487
|
+
if count > 1 and previous <= 1 then
|
|
488
|
+
Console.log("info", string.format("%d MCP clients connected", count))
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
345
492
|
function Console.clear()
|
|
493
|
+
--[[
|
|
494
|
+
Says what it did, with a timestamp, like everything else in here.
|
|
495
|
+
|
|
496
|
+
A button that empties the screen and leaves no trace is indistinguishable
|
|
497
|
+
from one that crashed the panel. The count is read before the clear and
|
|
498
|
+
written after it, so the first row of the fresh log is the receipt for
|
|
499
|
+
the one that went.
|
|
500
|
+
]]
|
|
501
|
+
local cleared = state.entries
|
|
346
502
|
table.clear(state.lines)
|
|
503
|
+
state.entries = 0
|
|
347
504
|
state.calls = 0
|
|
348
505
|
state.errors = 0
|
|
349
506
|
state.totalMs = 0
|
|
350
507
|
refreshCounters()
|
|
508
|
+
-- The bars belonged to the log that just went. Leaving forty timings from an
|
|
509
|
+
-- erased session on screen while the footer reads "idle" is two answers to
|
|
510
|
+
-- one question.
|
|
511
|
+
Visuals.clearTrace()
|
|
351
512
|
redraw()
|
|
513
|
+
|
|
514
|
+
if cleared > 0 then
|
|
515
|
+
Console.log(
|
|
516
|
+
"dim",
|
|
517
|
+
string.format("cleared %d log%s", cleared, if cleared == 1 then "" else "s")
|
|
518
|
+
)
|
|
519
|
+
end
|
|
352
520
|
end
|
|
353
521
|
|
|
354
522
|
--[[
|
|
@@ -482,6 +650,38 @@ function Console.mount(parent: Instance, handlers: Handlers)
|
|
|
482
650
|
meta.Parent = header
|
|
483
651
|
state.metaText = meta
|
|
484
652
|
|
|
653
|
+
--[[
|
|
654
|
+
The shared-bridge badge, hidden until there is something to share.
|
|
655
|
+
|
|
656
|
+
Sits between the meta line and the buttons rather than in the activity
|
|
657
|
+
band, because it is a fact about the connection and the header is where
|
|
658
|
+
connection facts live. `meta` gives up the width when it appears; see
|
|
659
|
+
`Console.setClients`.
|
|
660
|
+
]]
|
|
661
|
+
local clientsChip = Instance.new("TextLabel")
|
|
662
|
+
clientsChip.Name = "Clients"
|
|
663
|
+
clientsChip.AnchorPoint = Vector2.new(1, 0.5)
|
|
664
|
+
clientsChip.Position = UDim2.new(1, -252, 0.5, 0)
|
|
665
|
+
clientsChip.Size = UDim2.new(0, 84, 0, 18)
|
|
666
|
+
clientsChip.BackgroundColor3 = PALETTE.background
|
|
667
|
+
clientsChip.BorderSizePixel = 0
|
|
668
|
+
clientsChip.Font = Enum.Font.Code
|
|
669
|
+
clientsChip.TextSize = 11
|
|
670
|
+
clientsChip.TextColor3 = PALETTE.cyan
|
|
671
|
+
clientsChip.Text = ""
|
|
672
|
+
clientsChip.Visible = false
|
|
673
|
+
clientsChip.Parent = header
|
|
674
|
+
state.clientsChip = clientsChip
|
|
675
|
+
|
|
676
|
+
local chipCorner = Instance.new("UICorner")
|
|
677
|
+
chipCorner.CornerRadius = UDim.new(0, 3)
|
|
678
|
+
chipCorner.Parent = clientsChip
|
|
679
|
+
|
|
680
|
+
local chipStroke = Instance.new("UIStroke")
|
|
681
|
+
chipStroke.Color = PALETTE.cyan
|
|
682
|
+
chipStroke.Transparency = 0.6
|
|
683
|
+
chipStroke.Parent = clientsChip
|
|
684
|
+
|
|
485
685
|
local buttons = Instance.new("Frame")
|
|
486
686
|
buttons.AnchorPoint = Vector2.new(1, 0.5)
|
|
487
687
|
buttons.Position = UDim2.new(1, 0, 0.5, 0)
|
|
@@ -571,7 +771,7 @@ function Console.mount(parent: Instance, handlers: Handlers)
|
|
|
571
771
|
footerPadding.Parent = footer
|
|
572
772
|
|
|
573
773
|
local prompt = Instance.new("TextLabel")
|
|
574
|
-
prompt.Text = "
|
|
774
|
+
prompt.Text = "rbx\u{00B7}studio"
|
|
575
775
|
prompt.Font = Enum.Font.Code
|
|
576
776
|
prompt.TextSize = 11
|
|
577
777
|
prompt.TextColor3 = PALETTE.violet
|
package/plugin/src/Net.luau
CHANGED
|
@@ -45,10 +45,32 @@ function Net.request(method: string, path: string, body: string?): Response
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
local response = result :: any
|
|
48
|
+
if response.Success then
|
|
49
|
+
return {
|
|
50
|
+
ok = true,
|
|
51
|
+
statusCode = response.StatusCode,
|
|
52
|
+
body = response.Body,
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
--[[
|
|
57
|
+
The request reached the bridge and it refused -- every `send()` on that
|
|
58
|
+
side answers with `{ error: "..." }`, and that string is the actual reason
|
|
59
|
+
(missing header, protocol mismatch, no Studio connected). Falling back to
|
|
60
|
+
a bare status code discarded it and showed "handshake failed" instead,
|
|
61
|
+
which is accurate about nothing. Decoded defensively: a body that is not
|
|
62
|
+
JSON, or JSON without an `error` field, still gets a readable fallback.
|
|
63
|
+
]]
|
|
64
|
+
local decoded = Net.decode(response.Body)
|
|
65
|
+
local reason = if typeof(decoded) == "table" and typeof((decoded :: any).error) == "string"
|
|
66
|
+
then (decoded :: any).error
|
|
67
|
+
else string.format("server responded %d", response.StatusCode)
|
|
68
|
+
|
|
48
69
|
return {
|
|
49
|
-
ok =
|
|
70
|
+
ok = false,
|
|
50
71
|
statusCode = response.StatusCode,
|
|
51
72
|
body = response.Body,
|
|
73
|
+
error = reason,
|
|
52
74
|
}
|
|
53
75
|
end
|
|
54
76
|
|