@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.
- package/README.md +28 -2
- package/dist/bridge/console.js +182 -0
- package/dist/bridge/console.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/cloudassets.js +233 -0
- package/dist/lib/cloudassets.js.map +1 -0
- package/dist/lib/credentials.js +180 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/livedata.js +325 -0
- package/dist/lib/livedata.js.map +1 -0
- package/dist/lib/liveluau.js +83 -0
- package/dist/lib/liveluau.js.map +1 -0
- package/dist/lib/liveops.js +358 -0
- package/dist/lib/liveops.js.map +1 -0
- package/dist/lib/opencloud.js +235 -0
- package/dist/lib/opencloud.js.map +1 -0
- package/dist/tools/anim.js +159 -0
- package/dist/tools/anim.js.map +1 -0
- package/dist/tools/audio.js +96 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/character.js +95 -5
- package/dist/tools/character.js.map +1 -1
- package/dist/tools/data.js +292 -0
- package/dist/tools/data.js.map +1 -0
- package/dist/tools/device.js +77 -7
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/discover.js +80 -4
- package/dist/tools/discover.js.map +1 -1
- package/dist/tools/exec.js +96 -2
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/input.js +35 -9
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/perf.js +74 -7
- package/dist/tools/perf.js.map +1 -1
- package/dist/tools/scripts.js +162 -6
- package/dist/tools/scripts.js.map +1 -1
- package/dist/tools/spatial.js +135 -0
- package/dist/tools/spatial.js.map +1 -0
- package/dist/tools/universe.js +177 -0
- package/dist/tools/universe.js.map +1 -0
- package/dist/tools/upload.js +294 -0
- package/dist/tools/upload.js.map +1 -0
- package/dist/tools/world.js +675 -51
- package/dist/tools/world.js.map +1 -1
- package/package.json +2 -2
- package/plugin/src/Commands.luau +31 -7
- package/plugin/src/Config.luau +65 -65
- package/plugin/src/Console.luau +1909 -1843
- package/plugin/src/Emulation.luau +172 -0
- package/plugin/src/Phrase.luau +816 -618
- package/plugin/src/Png.luau +8 -4
- package/plugin/src/Prompt.luau +965 -961
- package/plugin/src/Secret.luau +86 -0
- package/plugin/src/Serialize.luau +440 -8
- package/plugin/src/Undo.luau +94 -6
- package/plugin/src/handlers/Anim.luau +897 -0
- package/plugin/src/handlers/Assets.luau +286 -2
- package/plugin/src/handlers/Audio.luau +411 -0
- package/plugin/src/handlers/Capture.luau +155 -20
- package/plugin/src/handlers/Character.luau +823 -361
- package/plugin/src/handlers/Data.luau +539 -0
- package/plugin/src/handlers/Device.luau +394 -139
- package/plugin/src/handlers/Discover.luau +685 -363
- package/plugin/src/handlers/Geometry.luau +722 -450
- package/plugin/src/handlers/Instances.luau +84 -4
- package/plugin/src/handlers/Perf.luau +227 -0
- package/plugin/src/handlers/Scripts.luau +673 -539
- package/plugin/src/handlers/Session.luau +3 -0
- package/plugin/src/handlers/Spatial.luau +334 -0
- package/plugin/src/handlers/Viewport.luau +268 -0
- package/plugin/src/handlers/World.luau +89 -15
- package/plugin/src/init.server.luau +9 -1
- package/scripts/build-plugin.mjs +20 -0
- 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAmB,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAsB9D;;;;;GAKG;AACH,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;;;;;GAMG;AACH,KAAK,UAAU,IAAI,CAAC,IAanB;IACC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CACjB,aAAa,EACb,uEAAuE,EACvE,0EAA0E;YACxE,6EAA6E;YAC7E,wEAAwE;YACxE,uBAAuB,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW,CAAC;IACrF,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CACjB,eAAe,EACf,UAAU,IAAI,CAAC,EAAE,mDAAmD,EACpE,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QAC3B,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,2CAA2C,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE;QAC9C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAClD,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAA+C,CAAC;IAC5E,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CACT,IAAI,CAAC,IAAI,KAAK,SAAS;gBACrB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,6BAA6B,IAAI,CAAC,KAAK,IAAI,QAAQ,gBAAgB;oBAC9E,0EAA0E;oBAC1E,8BAA8B;gBAClC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;oBACxB,CAAC,CAAC,YAAY,QAAQ,sBAAsB;oBAC5C,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,qDAAqD;wBAC3E,uBAAuB,CAChC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GACX,IAAI,CAAC,IAAI,KAAK,SAAS;YACrB,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU;gBACtB,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBACnC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;oBACxB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;oBAC/B,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,IAAI,CACT,MAAM,CACJ,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE;YACpB,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS;SAClF,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,UAAU,CACR,OAAO,EACP;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,uEAAuE;YACvE,gCAAgC;YAChC,sEAAsE;YACtE,mEAAmE;YACnE,iEAAiE;YACjE,mEAAmE;YACnE,oDAAoD;YACpD,4EAA4E;YAC5E,yEAAyE;YACzE,4EAA4E;YAC5E,qEAAqE;YACrE,yEAAyE;YACzE,wEAAwE;YACxE,wEAAwE;YACxE,+CAA+C;YAC/C,0EAA0E;YAC1E,sEAAsE;YACtE,yBAAyB;YACzB,wEAAwE;YACxE,sEAAsE;YACtE,wEAAwE;YACxE,oBAAoB;YACpB,oEAAoE;YACpE,mEAAmE;YACnE,wEAAwE;YACxE,oEAAoE;YACpE,yEAAyE;YACzE,sEAAsE;YACtE,2DAA2D;YAC3D,iEAAiE;YACjE,uEAAuE;YACvE,uEAAuE;YACvE,mEAAmE;YACnE,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,+DAA+D;YAC/D,mEAAmE;QACrE,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;iBACxB,OAAO,CAAC,QAAQ,CAAC;iBACjB,QAAQ,CACP,4DAA4D;gBAC1D,gEAAgE;gBAChE,4DAA4D,CAC/D;YACH,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,6DAA6D;gBAC3D,8BAA8B,CACjC;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,kEAAkE;gBAChE,kEAAkE;gBAClE,oBAAoB,CACvB;YACH,MAAM,EAAE,CAAC;iBACN,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,kEAAkE;gBAChE,8DAA8D;gBAC9D,mEAAmE;gBACnE,2DAA2D,CAC9D;YACH,EAAE,EAAE,CAAC;iBACF,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;iBAC3E,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CACP,iEAAiE;gBAC/D,kEAAkE,CACrE;YACH,IAAI,EAAE,CAAC;iBACJ,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBACnC,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CACP,iEAAiE;gBAC/D,6DAA6D;gBAC7D,6CAA6C,CAChD;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,gEAAgE;gBAC9D,mCAAmC,CACtC;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,qEAAqE;gBACnE,kEAAkE;gBAClE,eAAe,CAClB;YACH,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YACxF,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,gEAAgE;gBAC9D,kEAAkE;gBAClE,oEAAoE;gBACpE,uCAAuC,CAC1C;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kFAAkF,CAAC;YAC/F,EAAE,EAAE,CAAC;iBACF,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,mEAAmE;gBACjE,8DAA8D;gBAC9D,sBAAsB,CACzB;YACH,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,SAAS,CAAC;iBACd,QAAQ,EAAE;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;YAC5F,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,qDAAqD,CAAC;YAClE,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,oEAAoE;gBAClE,wCAAwC,CAC3C;YACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SACpF;QACD,4EAA4E;QAC5E,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,IAAI;KAClB,EACD,KAAK,EAAE,IAAI,EAAuB,EAAE;QAClC,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CACjF,qBAAqB,CACtB,CAAC;YACF,OAAO,IAAI,CACT,MAAM,kBAAkB,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAC/E,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CACjB,aAAa,EACb,+CAA+C,EAC/C,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CACjB,aAAa,EACb,+CAA+C,EAC/C,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,QAAQ,IAAI,CAAC,EAAE,EAAE,EACjB;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CACnD,CAAC;QAEF,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAI,CACT,IAAI,CAAC,KAAK,KAAK,SAAS;oBACtB,CAAC,CAAC,mCAAmC;oBACrC,CAAC,CAAC,cAAc,IAAI,CAAC,KAAK,uDAAuD;wBAC7E,gFAAgF,CACvF,CAAC;YACJ,CAAC;YAED;;;;;eAKG;YACH,MAAM,OAAO,GACX,IAAI,CAAC,EAAE,KAAK,UAAU;gBACpB,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBACnC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;oBACxB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;wBACtB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC;wBAClB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAElB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,iCAAiC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,IAAI,CACT,MAAM,CACJ,KAAK,CAAC,OAAO,EAAE,KAAkD,EAAE;gBACjE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aACtD,CAAC,CACH,CACF,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACnD;;;;;eAKG;YACH,OAAO,IAAI,CACT,GAAG,IAAI,CAAC,GAAG,kBAAkB,IAAI,CAAC,KAAK,KAAK;gBAC1C,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oBACrB,CAAC,CAAC,wEAAwE;wBACxE,2DAA2D;oBAC7D,CAAC,CAAC,0EAA0E;wBAC1E,4EAA4E;wBAC5E,qCAAqC,CAAC,CAC7C,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/device.js
CHANGED
|
@@ -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
|
-
"`
|
|
23
|
-
"
|
|
24
|
-
"
|
|
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,
|
|
30
|
-
"
|
|
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
|
-
?
|
|
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
|
}
|
package/dist/tools/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAe9D,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,UAAU,CACR,OAAO,EACP;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EACT,sEAAsE;YACtE,iCAAiC;YACjC,uEAAuE;YACvE,wEAAwE;YACxE,mEAAmE;YACnE,wEAAwE;YACxE,uEAAuE;YACvE,mEAAmE;YACnE,oEAAoE;YACpE,sEAAsE;YACtE,iEAAiE;YACjE,0DAA0D;YAC1D,+DAA+D;YAC/D,wEAAwE;YACxE,yEAAyE;YACzE,
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/tools/device.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/discover.js
CHANGED
|
@@ -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 (
|
|
247
|
-
|
|
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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"}
|