@el4cteo/rbx-studio-mcp 0.6.1 → 0.6.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.
Files changed (75) hide show
  1. package/README.md +28 -2
  2. package/dist/bridge/console.js +182 -0
  3. package/dist/bridge/console.js.map +1 -1
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/cloudassets.js +233 -0
  7. package/dist/lib/cloudassets.js.map +1 -0
  8. package/dist/lib/credentials.js +180 -0
  9. package/dist/lib/credentials.js.map +1 -0
  10. package/dist/lib/livedata.js +325 -0
  11. package/dist/lib/livedata.js.map +1 -0
  12. package/dist/lib/liveluau.js +83 -0
  13. package/dist/lib/liveluau.js.map +1 -0
  14. package/dist/lib/liveops.js +358 -0
  15. package/dist/lib/liveops.js.map +1 -0
  16. package/dist/lib/opencloud.js +235 -0
  17. package/dist/lib/opencloud.js.map +1 -0
  18. package/dist/tools/anim.js +159 -0
  19. package/dist/tools/anim.js.map +1 -0
  20. package/dist/tools/audio.js +96 -0
  21. package/dist/tools/audio.js.map +1 -0
  22. package/dist/tools/character.js +95 -5
  23. package/dist/tools/character.js.map +1 -1
  24. package/dist/tools/data.js +292 -0
  25. package/dist/tools/data.js.map +1 -0
  26. package/dist/tools/device.js +77 -7
  27. package/dist/tools/device.js.map +1 -1
  28. package/dist/tools/discover.js +80 -4
  29. package/dist/tools/discover.js.map +1 -1
  30. package/dist/tools/exec.js +96 -2
  31. package/dist/tools/exec.js.map +1 -1
  32. package/dist/tools/input.js +35 -9
  33. package/dist/tools/input.js.map +1 -1
  34. package/dist/tools/perf.js +74 -7
  35. package/dist/tools/perf.js.map +1 -1
  36. package/dist/tools/scripts.js +162 -6
  37. package/dist/tools/scripts.js.map +1 -1
  38. package/dist/tools/spatial.js +135 -0
  39. package/dist/tools/spatial.js.map +1 -0
  40. package/dist/tools/universe.js +177 -0
  41. package/dist/tools/universe.js.map +1 -0
  42. package/dist/tools/upload.js +294 -0
  43. package/dist/tools/upload.js.map +1 -0
  44. package/dist/tools/world.js +675 -51
  45. package/dist/tools/world.js.map +1 -1
  46. package/package.json +2 -2
  47. package/plugin/src/Commands.luau +31 -7
  48. package/plugin/src/Config.luau +65 -65
  49. package/plugin/src/Console.luau +1909 -1843
  50. package/plugin/src/Emulation.luau +172 -0
  51. package/plugin/src/Phrase.luau +816 -618
  52. package/plugin/src/Png.luau +8 -4
  53. package/plugin/src/Prompt.luau +965 -961
  54. package/plugin/src/Secret.luau +86 -0
  55. package/plugin/src/Serialize.luau +440 -8
  56. package/plugin/src/Undo.luau +94 -6
  57. package/plugin/src/handlers/Anim.luau +897 -0
  58. package/plugin/src/handlers/Assets.luau +286 -2
  59. package/plugin/src/handlers/Audio.luau +411 -0
  60. package/plugin/src/handlers/Capture.luau +155 -20
  61. package/plugin/src/handlers/Character.luau +823 -361
  62. package/plugin/src/handlers/Data.luau +539 -0
  63. package/plugin/src/handlers/Device.luau +394 -139
  64. package/plugin/src/handlers/Discover.luau +685 -363
  65. package/plugin/src/handlers/Geometry.luau +722 -450
  66. package/plugin/src/handlers/Instances.luau +84 -4
  67. package/plugin/src/handlers/Perf.luau +227 -0
  68. package/plugin/src/handlers/Scripts.luau +673 -539
  69. package/plugin/src/handlers/Session.luau +3 -0
  70. package/plugin/src/handlers/Spatial.luau +334 -0
  71. package/plugin/src/handlers/Viewport.luau +268 -0
  72. package/plugin/src/handlers/World.luau +89 -15
  73. package/plugin/src/init.server.luau +9 -1
  74. package/scripts/build-plugin.mjs +20 -0
  75. package/scripts/check-plugin.mjs +171 -124
@@ -0,0 +1,292 @@
1
+ import { z } from "zod";
2
+ import { ToolError } from "../lib/errors.js";
3
+ import { json, table, text, textOf } from "../lib/format.js";
4
+ import { liveDataStore } from "../lib/livedata.js";
5
+ import { snapshotDataStores } from "../lib/liveops.js";
6
+ import { requireCredentials, requireUniverse } from "../lib/opencloud.js";
7
+ import { defineTool } from "../lib/tool.js";
8
+ /**
9
+ * Data store calls cross the network twice — bridge to Studio, Studio to
10
+ * Roblox — and the second hop is a real HTTP request to a service that
11
+ * throttles. A list that walks several pages is several of those in sequence,
12
+ * so the ceiling is generous on purpose.
13
+ */
14
+ const TIMEOUT_MS = 45_000;
15
+ /**
16
+ * The live path: Open Cloud instead of the Studio bridge.
17
+ *
18
+ * Writes are gated on `confirm` exactly as the Studio path is, and for a
19
+ * stronger reason — this is the data of people who are playing right now, and
20
+ * there is no undo, no recording, and no "it was only the Studio copy".
21
+ */
22
+ async function live(args) {
23
+ if (args.kind === "memory") {
24
+ throw new ToolError("UNSUPPORTED", 'MemoryStore over Open Cloud is not wired up here yet (target="live").', 'Use target="studio" for now. Roblox does expose memory stores over Open ' +
25
+ "Cloud (queues and sorted maps under /cloud/v2/universes/.../memory-store), " +
26
+ "it simply has no route through this tool yet — so this is a gap here, " +
27
+ "not a platform limit.");
28
+ }
29
+ const writing = args.op === "set" || args.op === "remove" || args.op === "increment";
30
+ if (writing && args.confirm !== true) {
31
+ throw new ToolError("NEEDS_CONFIRM", `A live ${args.op} changes the data of players in the running game.`, "Nothing here can undo it. Read the key first, then pass confirm: true.");
32
+ }
33
+ const credentials = await requireCredentials();
34
+ const universe = await requireUniverse(args.universeId);
35
+ if (args.op === "snapshot") {
36
+ // Handled before this function is reached; narrowed here so the shared
37
+ // LiveArgs type does not have to carry an op it has no path for.
38
+ throw new ToolError("UNREACHABLE", "snapshot is handled before the live path.");
39
+ }
40
+ const result = await liveDataStore(credentials, {
41
+ op: args.op,
42
+ kind: args.kind === "ordered" ? "ordered" : "data",
43
+ universe,
44
+ store: args.store,
45
+ scope: args.scope,
46
+ key: args.key,
47
+ value: args.value,
48
+ amount: args.amount,
49
+ limit: args.limit ?? 50,
50
+ cursor: args.cursor,
51
+ create: args.create,
52
+ });
53
+ const items = result["items"];
54
+ if (items) {
55
+ if (items.length === 0) {
56
+ return text(args.kind === "ordered"
57
+ ? `${args.store} has no entries in scope "${args.scope ?? "global"}". An ordered ` +
58
+ 'store written with no scope lands in "global"; one written with a scope ' +
59
+ "is invisible from any other."
60
+ : args.store === undefined
61
+ ? `Universe ${universe} has no data stores.`
62
+ : `Nothing in ${args.store}. Check the \`scope\` — keys written under one are ` +
63
+ "invisible without it.");
64
+ }
65
+ const columns = args.kind === "ordered"
66
+ ? ["rank", "key", "value"]
67
+ : args.op === "versions"
68
+ ? ["version", "created", "deleted"]
69
+ : args.store === undefined
70
+ ? ["store", "created", "state"]
71
+ : ["key", "state"];
72
+ return text(textOf(table(columns, items, {
73
+ more: result["truncated"] === true ? "more available — raise `limit`" : undefined,
74
+ })));
75
+ }
76
+ return json(result);
77
+ }
78
+ export function registerDataTools(context) {
79
+ const { bridge } = context;
80
+ defineTool(context, {
81
+ name: "datastore",
82
+ title: "Read and write saved data",
83
+ description: "Reads and writes the game's saved data — DataStore and MemoryStore — " +
84
+ "from the connected Studio.\n\n" +
85
+ "This is the only tool here that looks at anything outside the place " +
86
+ "file. Every other tool answers 'is the instance right'; this one " +
87
+ "answers 'is what the player saved right', which is a different " +
88
+ "question and the one behind most reports of lost progress, reset " +
89
+ "stats, or items that come back after a rejoin.\n\n" +
90
+ "`kind=\"data\"` (the default) is DataStoreService: permanent, per-player, " +
91
+ "and version-tracked. `kind=\"memory\"` is MemoryStoreService: a shared " +
92
+ "scratchpad that expires on its own — queues, locks, live leaderboards.\n\n" +
93
+ "The workflow for a bug report is: `list` with no store to see what " +
94
+ "exists, `list` with one to see its keys, `get` the player's key, and — " +
95
+ "the part worth knowing about — `versions` then `get` with a `version` " +
96
+ "to see what that same key held BEFORE it broke. You cannot diagnose a " +
97
+ "bad save by looking only at the bad save.\n\n" +
98
+ "Writes need `confirm: true` on `kind=\"data\"`, because nothing in this " +
99
+ "server can undo one: there is no recording to cancel and no Ctrl+Z. " +
100
+ "Read the key first.\n\n" +
101
+ "DataStore needs 'Enable Studio Access to API Services' ticked in Game " +
102
+ "Settings → Security, and a published place. If it is off, this tool " +
103
+ "says so in those words rather than reporting the raw 502. MemoryStore " +
104
+ "needs neither.\n\n" +
105
+ "`target=\"live\"` is the other half of this tool and the one that " +
106
+ "answers a real bug report. It goes to Roblox directly instead of " +
107
+ "through Studio, so it sees exactly what the running servers see — not " +
108
+ "what the place happens to be connected to, and with no Studio API " +
109
+ "toggle involved. Use it whenever the question is about a player who is " +
110
+ "actually playing. It needs an Open Cloud key and a universe id; the " +
111
+ "user sets both once with `cloud` in the Studio panel.\n\n" +
112
+ "`kind=\"ordered\"` (live only) is OrderedDataStoreService, the " +
113
+ "leaderboard backend: numbers only, always sorted, no history. `list` " +
114
+ "returns it ranked highest first, which is the leaderboard itself.\n\n" +
115
+ "`op=\"snapshot\"` is the safety net. It tells Roblox to snapshot " +
116
+ "every data store in the experience, so support can roll them back. " +
117
+ "TAKE ONE BEFORE ANY LIVE WRITE. Roblox allows one per experience " +
118
+ "per UTC day, and the result says whether this call actually took " +
119
+ "one — a second call the same day reports success while doing " +
120
+ "nothing, and anything written since the first one is not covered.",
121
+ inputSchema: {
122
+ target: z
123
+ .enum(["studio", "live"])
124
+ .default("studio")
125
+ .describe("'studio' reads through the connected Studio — right while " +
126
+ "building. 'live' goes to Roblox over Open Cloud and sees what " +
127
+ "the published game's servers see — right for a bug report."),
128
+ universeId: z
129
+ .string()
130
+ .optional()
131
+ .describe("live only: which game. Omit to use the one set with `cloud " +
132
+ "universe <id>` in the panel."),
133
+ amount: z
134
+ .number()
135
+ .optional()
136
+ .describe('live increment only: how much to add. Negative subtracts. Safer ' +
137
+ "than get-then-set for currency, which loses whatever the player " +
138
+ "earned in between."),
139
+ create: z
140
+ .boolean()
141
+ .optional()
142
+ .describe("live set only: allow writing a key that does not exist yet. Off " +
143
+ "by default — Open Cloud separates create from update, and a " +
144
+ "typo'd key silently creating a second empty save beside the real " +
145
+ "one is exactly what looks like a player's data resetting."),
146
+ op: z
147
+ .enum(["list", "get", "versions", "set", "remove", "increment", "snapshot"])
148
+ .default("list")
149
+ .describe("'list' shows stores (no `store`) or a store's keys (with one). " +
150
+ "'versions' is DataStore only and is how you see a key's history."),
151
+ kind: z
152
+ .enum(["data", "memory", "ordered"])
153
+ .default("data")
154
+ .describe("'data' = DataStoreService, permanent and versioned. 'memory' = " +
155
+ "MemoryStoreService, shared and expiring. They are separate " +
156
+ "storage — a key in one is not in the other."),
157
+ store: z
158
+ .string()
159
+ .optional()
160
+ .describe("Data store name, or the sorted map's name for memory. Omit on " +
161
+ "`list` to see which stores exist."),
162
+ scope: z
163
+ .string()
164
+ .optional()
165
+ .describe("DataStore scope, if the game uses them. Omit for the default — but " +
166
+ "if a store reads as empty and you expected data, a scope is the " +
167
+ "usual reason."),
168
+ key: z.string().optional().describe("The key. Usually the player's UserId as a string."),
169
+ value: z
170
+ .string()
171
+ .optional()
172
+ .describe('set only: the new value as JSON — {"coins":10}, 42, or a bare ' +
173
+ "string. Read the key first and edit what comes back rather than " +
174
+ "writing a value from scratch: a save is usually a whole table and " +
175
+ "writing part of one deletes the rest."),
176
+ version: z
177
+ .string()
178
+ .optional()
179
+ .describe("get only: read this exact version instead of the current value. From `versions`."),
180
+ at: z
181
+ .number()
182
+ .optional()
183
+ .describe("get only: read the version that was current at this Unix time in " +
184
+ "MILLISECONDS. Use when the player says when it broke but no " +
185
+ "version id is known."),
186
+ ttl: z
187
+ .number()
188
+ .int()
189
+ .min(1)
190
+ .max(3_888_000)
191
+ .optional()
192
+ .describe("memory set only: seconds before the value expires. Defaults to an hour."),
193
+ prefix: z.string().optional().describe("list only: only names starting with this."),
194
+ cursor: z.string().optional().describe("list only: continue from a previous call's cursor."),
195
+ limit: z
196
+ .number()
197
+ .int()
198
+ .min(1)
199
+ .max(200)
200
+ .optional()
201
+ .describe("list/versions only: rows to return. Defaults to 50."),
202
+ confirm: z
203
+ .boolean()
204
+ .optional()
205
+ .describe("Required for set and remove on kind=\"data\". This is real player " +
206
+ "data and nothing here can put it back."),
207
+ studioId: z.string().optional().describe("Target Studio; omit for the active one."),
208
+ },
209
+ // Reads dominate, but the tool can write, so it is not annotated read-only.
210
+ readOnly: false,
211
+ destructive: true,
212
+ }, async (args) => {
213
+ if (args.op === "snapshot") {
214
+ const { requireCredentials: needKey, requireUniverse: needUniverse } = await import("../lib/opencloud.js");
215
+ return json(await snapshotDataStores(await needKey(), await needUniverse(args.universeId)));
216
+ }
217
+ if (args.target === "live")
218
+ return live(args);
219
+ if (args.kind === "ordered") {
220
+ throw new ToolError("UNSUPPORTED", 'kind="ordered" only works with target="live".', "Studio has no way to enumerate an OrderedDataStore; Open Cloud does.");
221
+ }
222
+ if (args.op === "increment") {
223
+ throw new ToolError("UNSUPPORTED", 'op="increment" only works with target="live".', 'Read with `get` and write with `set` against Studio, or use target="live".');
224
+ }
225
+ const response = await bridge.call(`data.${args.op}`, {
226
+ kind: args.kind,
227
+ store: args.store,
228
+ scope: args.scope,
229
+ key: args.key,
230
+ value: args.value,
231
+ version: args.version,
232
+ at: args.at,
233
+ ttl: args.ttl,
234
+ prefix: args.prefix,
235
+ cursor: args.cursor,
236
+ limit: args.limit,
237
+ confirm: args.confirm,
238
+ }, { studioId: args.studioId, timeoutMs: TIMEOUT_MS });
239
+ if (args.op === "list" || args.op === "versions") {
240
+ const items = response.items ?? [];
241
+ if (items.length === 0) {
242
+ return text(args.store === undefined
243
+ ? "No data stores in this place yet."
244
+ : `Nothing in ${args.store}. If you expected data, check the \`scope\` — a game ` +
245
+ "that used scopes keeps its keys under them, and the default scope looks empty.");
246
+ }
247
+ /*
248
+ * Column choice is per-op rather than inferred from the rows, because
249
+ * an inferred set drifts: `list` over stores has no `key`, over keys
250
+ * has nothing else, and `versions` has three. Naming them keeps each
251
+ * table readable instead of mostly blank.
252
+ */
253
+ const columns = args.op === "versions"
254
+ ? ["version", "created", "deleted"]
255
+ : args.store === undefined
256
+ ? ["store", "created"]
257
+ : args.kind === "memory"
258
+ ? ["key", "value"]
259
+ : ["key"];
260
+ const notes = [];
261
+ if (response.cursor) {
262
+ notes.push(`more available — pass cursor="${response.cursor}"`);
263
+ }
264
+ if (typeof response.budget === "number") {
265
+ notes.push(`${response.budget} requests left in budget`);
266
+ }
267
+ if (args.op === "versions") {
268
+ notes.push('read one with op="get" and its `version`');
269
+ }
270
+ return text(textOf(table(columns, items, {
271
+ more: notes.length > 0 ? notes.join("; ") : undefined,
272
+ })));
273
+ }
274
+ if (args.op === "get" && response.exists === false) {
275
+ /*
276
+ * The advice differs by backend, and the DataStore version of it is
277
+ * nonsense for memory: MemoryStore has no scopes and no version
278
+ * history, so pointing someone at either sends them looking for
279
+ * something that does not exist.
280
+ */
281
+ return text(`${args.key} is not set in ${args.store}.\n` +
282
+ (args.kind === "memory"
283
+ ? "MemoryStore entries expire on their own, so a key written earlier may " +
284
+ "simply have passed its TTL. There is no history to check."
285
+ : "An empty key and a key that was never written look identical here. If a " +
286
+ 'player should have data, check the `scope`, and try op="versions" — a key ' +
287
+ "that was removed still has history."));
288
+ }
289
+ return json(response);
290
+ });
291
+ }
292
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/tools/data.ts"],"names":[],"mappings":"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"}
@@ -19,15 +19,25 @@ export function registerDeviceTools(context) {
19
19
  "`list` gives the ids, each with its real name, form factor and " +
20
20
  "resolution — ids look like \"iphone_16\", \"ipad_a16\", " +
21
21
  "\"samsung_galaxy_s25_ultra\", \"xbox\", \"meta_quest_3\".\n\n" +
22
- "`stop` returns Studio to the normal editor viewport. Do that when you " +
23
- "are finished: a left-over emulated device makes every later screenshot " +
24
- "the wrong shape, and nothing on screen obviously says why.",
22
+ "`network` degrades the connection on purpose — latency, jitter and " +
23
+ "packet loss — which is the other half of what a phone player " +
24
+ "actually gets. A menu that works at 0ms is not evidence that it works " +
25
+ "at 300: the spinner that never stops, the button that fires twice, the " +
26
+ "HUD that arrives after the round started are all invisible on a local " +
27
+ "connection. Use a `preset` (`wifi`, `4g`, `3g`, `poor`, `clear`) or " +
28
+ "set the numbers yourself, then `playtest` and watch.\n\n" +
29
+ "`stop` returns Studio to the normal editor viewport AND clears the " +
30
+ "network shaping. Do that when you are finished: a left-over emulated " +
31
+ "device makes every later screenshot the wrong shape, a left-over 400ms " +
32
+ "delay makes the whole place feel broken, and nothing on screen says " +
33
+ "why in either case.",
25
34
  inputSchema: {
26
35
  op: z
27
- .enum(["list", "set", "stop", "state"])
36
+ .enum(["list", "set", "network", "stop", "state"])
28
37
  .default("state")
29
- .describe("'list' shows the available devices, 'set' switches to one, 'stop' " +
30
- "returns to the normal viewport, 'state' only reports."),
38
+ .describe("'list' shows the available devices, 'set' switches to one, " +
39
+ "'network' shapes the connection, 'stop' undoes both, 'state' " +
40
+ "only reports."),
31
41
  device: z
32
42
  .string()
33
43
  .optional()
@@ -42,6 +52,51 @@ export function registerDeviceTools(context) {
42
52
  .enum(["Phone", "Tablet", "Console", "Desktop", "VR"])
43
53
  .optional()
44
54
  .describe("list only: show only devices of this form factor."),
55
+ preset: z
56
+ .enum(["clear", "wifi", "4g", "3g", "poor"])
57
+ .optional()
58
+ .describe("network only: a whole connection in one word. clear=0ms (normal), " +
59
+ "wifi=15ms, 4g=60ms/0.5% loss, 3g=150ms/2% loss, poor=400ms/8% " +
60
+ "loss. Named fields below override whichever part you name."),
61
+ latency: z
62
+ .number()
63
+ .min(0)
64
+ .max(1000)
65
+ .optional()
66
+ .describe("network only: minimum delay in milliseconds, up to 1000 — the " +
67
+ "engine's own ceiling. 0 clears it."),
68
+ jitter: z
69
+ .number()
70
+ .min(0)
71
+ .max(1000)
72
+ .optional()
73
+ .describe("network only: how much the delay varies, in milliseconds. Jitter " +
74
+ "breaks things steady latency does not — it is what makes " +
75
+ "replicated motion stutter rather than simply lag."),
76
+ loss: z
77
+ .number()
78
+ .min(0)
79
+ .max(50)
80
+ .optional()
81
+ .describe("network only: percentage of packets thrown away, up to 50 — the " +
82
+ "engine's own ceiling. The field that finds real bugs: latency " +
83
+ "makes a game feel slow, loss makes it behave wrongly. 2-8% is a " +
84
+ "bad mobile connection."),
85
+ memory: z
86
+ .number()
87
+ .int()
88
+ .min(0)
89
+ .max(65536)
90
+ .optional()
91
+ .describe("network only: pretend the machine has this many MB of memory. A " +
92
+ "cheap phone is a small screen AND little memory; this is the " +
93
+ "half that makes textures unload. 0 removes the cap."),
94
+ direction: z
95
+ .enum(["in", "out", "both"])
96
+ .optional()
97
+ .describe("network only: which way to degrade. 'in' is the player with a bad " +
98
+ "connection, 'out' is everyone else seeing that player late. " +
99
+ "Defaults to both."),
45
100
  studioId: z.string().optional().describe("Target Studio; omit for the active one."),
46
101
  },
47
102
  readOnly: false,
@@ -64,10 +119,25 @@ export function registerDeviceTools(context) {
64
119
  if (args.op === "set" && (args.device === undefined || args.device === "")) {
65
120
  return text('set needs a `device` id. Call `device op="list"` to see them.');
66
121
  }
122
+ if (args.op === "network") {
123
+ const shaped = await bridge.call("device.network", {
124
+ preset: args.preset,
125
+ latency: args.latency,
126
+ jitter: args.jitter,
127
+ loss: args.loss,
128
+ memory: args.memory,
129
+ direction: args.direction,
130
+ }, { studioId: args.studioId, timeoutMs: 30_000 });
131
+ return json(shaped, shaped["shaping"] === true
132
+ ? 'Traffic is degraded from now on, in edit and in playtest, until `device op="stop"` ' +
133
+ "or `op=\"network\" preset=\"clear\"`. Nothing on screen says so — if the place " +
134
+ "starts behaving strangely later, this is the first thing to rule out."
135
+ : "The connection is back to normal.");
136
+ }
67
137
  const command = args.op === "set" ? "device.set" : args.op === "stop" ? "device.stop" : "device.state";
68
138
  const response = await bridge.call(command, { device: args.device, orientation: args.orientation }, { studioId: args.studioId, timeoutMs: 30_000 });
69
139
  return json(response, args.op === "set"
70
- ? "Take a `screenshot` to see it. Call `device op=\"stop\"` when finished, or every later screenshot stays this shape."
140
+ ? 'Take a `screenshot` to see it. Call `device op="stop"` when finished, or every later screenshot stays this shape.'
71
141
  : undefined);
72
142
  });
73
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { propertiesOf, restrictionsOf, standardProperties } from "../lib/apidump.js";
3
- import { cursorSchema, decodeCursor, detailSchema, encodeCursor, json, limitSchema, table, text, } from "../lib/format.js";
3
+ import { cursorSchema, decodeCursor, detailSchema, encodeCursor, json, limitSchema, table, text, textOf } from "../lib/format.js";
4
4
  import { defineTool } from "../lib/tool.js";
5
5
  /**
6
6
  * Renders a hierarchy page as a table. `concise` drops the child count, which
@@ -157,6 +157,14 @@ export function registerDiscoverTools(context) {
157
157
  .optional()
158
158
  .describe("Read exactly these properties instead of the detail-level default. " +
159
159
  "Use when you want one specific value across many instances."),
160
+ physics: z
161
+ .boolean()
162
+ .default(false)
163
+ .describe("Also report mass, density, assembly root and centre of mass for any " +
164
+ "BasePart. Mass appears nowhere in Studio — it is computed from " +
165
+ "volume and material — so this is the only way to answer 'why does " +
166
+ "this fall over', 'why does it sink', or 'why did half the model " +
167
+ "stay behind when I moved it'."),
160
168
  includeChildren: z
161
169
  .boolean()
162
170
  .default(true)
@@ -196,6 +204,7 @@ export function registerDiscoverTools(context) {
196
204
  paths: args.paths,
197
205
  properties: requested,
198
206
  includeChildren: args.includeChildren,
207
+ physics: args.physics,
199
208
  }, { studioId: args.studioId });
200
209
  const notes = [];
201
210
  if (response.failures.length > 0) {
@@ -218,8 +227,25 @@ export function registerDiscoverTools(context) {
218
227
  "Prefer it over `tree` whenever you know what you are looking for.\n\n" +
219
228
  "Tag searches are answered from CollectionService's index rather than by " +
220
229
  "walking the tree, so they stay fast on large places. Narrow with `path` " +
221
- "if a search reports TOO_BROAD.",
230
+ "if a search reports TOO_BROAD.\n\n" +
231
+ "`op=\"tags\"` lists which tags the place actually USES, with counts and a " +
232
+ "few example paths. Call it before filtering by tag on a place you do not " +
233
+ "know: a tag search that returns nothing looks the same whether you spelled " +
234
+ "it wrong or nothing carries it, and the tag names are often the clearest " +
235
+ "description of how a game is organised (Enemy, Checkpoint, Interactable " +
236
+ "say more than the folder layout does).\n\n" +
237
+ "`selector` is the engine's own query language and is the fastest option " +
238
+ "of all — the matching happens in C++ and only survivors come back. Reach " +
239
+ "for it when the shape of the tree is part of the question (`Model > Part`) " +
240
+ "or when one call should answer two (`Part, Model`); the filters above " +
241
+ "still apply on top of it.",
222
242
  inputSchema: {
243
+ op: z
244
+ .enum(["find", "tags"])
245
+ .default("find")
246
+ .describe("'find' searches for instances. 'tags' lists which CollectionService " +
247
+ "tags exist in the place, with counts — use it when you do not know " +
248
+ "the tag names yet."),
223
249
  path: z
224
250
  .string()
225
251
  .optional()
@@ -227,6 +253,15 @@ export function registerDiscoverTools(context) {
227
253
  nameContains: z.string().optional().describe("Substring of the instance name, case-insensitive."),
228
254
  className: z.string().optional().describe('Class or superclass, e.g. "BasePart", "Script".'),
229
255
  tag: z.string().optional().describe("CollectionService tag the instance must carry."),
256
+ selector: z
257
+ .string()
258
+ .optional()
259
+ .describe("Engine query selector, matched inside Studio. Supports a class name " +
260
+ '("Part", superclasses included), "#ExactName", "[Anchored=true]", ' +
261
+ 'either-or with "Part, Model", direct children with "Model > Part" ' +
262
+ 'and descendants with "Model >> Part". No substring names and no ' +
263
+ "< > comparisons — use nameContains and propertyValue for those. " +
264
+ "Combines with the other filters."),
230
265
  propertyName: z
231
266
  .string()
232
267
  .optional()
@@ -243,8 +278,48 @@ export function registerDiscoverTools(context) {
243
278
  },
244
279
  readOnly: true,
245
280
  }, async (args) => {
246
- if (!args.nameContains && !args.className && !args.tag && !args.propertyName) {
247
- return text("find needs at least one filter (nameContains, className, tag or propertyName).\n" +
281
+ if (args.op === "tags") {
282
+ const found = await bridge.call("discover.tags", { path: args.path }, { studioId: args.studioId, timeoutMs: 30_000 });
283
+ if (found.tags.length === 0) {
284
+ return text((found.scope !== undefined
285
+ ? `Nothing under ${found.scope} carries a tag.`
286
+ : "This place uses no tags.") +
287
+ (found.studioTagsHidden > 0
288
+ ? ` (${found.studioTagsHidden} of Studio's own internal tags were hidden.)`
289
+ : ""));
290
+ }
291
+ /*
292
+ * Tags carrying nothing are listed as a sentence, not as table rows.
293
+ * They have no count worth reading and no examples to show, so each one
294
+ * is a blank line in the middle of the real answer — measured on a place
295
+ * using two tags, where five empty rows from Studio's own plugins
296
+ * (RigEdit, the tag editor, gui-object-defaults) buried both of them.
297
+ * Naming them still matters, because one of them may be the tag the
298
+ * caller was about to search for.
299
+ */
300
+ const used = found.tags.filter((entry) => entry.count > 0);
301
+ const empty = found.tags.filter((entry) => entry.count === 0).map((entry) => entry.tag);
302
+ const emptyNote = empty.length > 0
303
+ ? `\n\nRegistered but carrying nothing: ${empty.join(", ")}. These are ` +
304
+ "usually left by Studio plugins or by something since deleted."
305
+ : "";
306
+ if (used.length === 0) {
307
+ return text((found.scope !== undefined
308
+ ? `Nothing under ${found.scope} carries a tag.`
309
+ : "Nothing in this place carries a tag.") + emptyNote);
310
+ }
311
+ const rows = used.map((entry) => ({
312
+ tag: entry.tag,
313
+ count: entry.count,
314
+ examples: entry.sample.join(", ") || "—",
315
+ }));
316
+ return text(textOf(table(["tag", "count", "examples"], rows, {
317
+ more: (found.scope !== undefined ? `within ${found.scope}; ` : "") +
318
+ `${found.studioTagsHidden} of Studio's own tags hidden`,
319
+ })) + emptyNote);
320
+ }
321
+ if (!args.nameContains && !args.className && !args.tag && !args.propertyName && !args.selector) {
322
+ return text("find needs at least one filter (nameContains, className, tag, propertyName or selector).\n" +
248
323
  "To list everything under a path, use `tree` instead.");
249
324
  }
250
325
  const response = await bridge.call("discover.find", {
@@ -252,6 +327,7 @@ export function registerDiscoverTools(context) {
252
327
  nameContains: args.nameContains,
253
328
  className: args.className,
254
329
  tag: args.tag,
330
+ selector: args.selector,
255
331
  propertyName: args.propertyName,
256
332
  propertyValue: args.propertyValue,
257
333
  limit: args.limit,
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"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"}