@el4cteo/rbx-studio-mcp 0.7.8 → 0.8.2
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 +175 -175
- package/dist/bridge/harness.js +14 -5
- package/dist/bridge/harness.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/apidump.js +62 -25
- package/dist/lib/apidump.js.map +1 -1
- package/dist/lib/format.js +43 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/livedata.js +24 -1
- package/dist/lib/livedata.js.map +1 -1
- package/dist/lib/liveops.js +79 -0
- package/dist/lib/liveops.js.map +1 -1
- package/dist/lib/monetization.js +119 -0
- package/dist/lib/monetization.js.map +1 -0
- package/dist/lib/opencloud.js +16 -6
- package/dist/lib/opencloud.js.map +1 -1
- package/dist/lib/pluginbuild.js +10 -0
- package/dist/lib/pluginbuild.js.map +1 -1
- package/dist/lib/png.js +104 -0
- package/dist/lib/png.js.map +1 -1
- package/dist/resources.js +3 -2
- package/dist/resources.js.map +1 -1
- package/dist/tools/api.js +4 -3
- package/dist/tools/api.js.map +1 -1
- package/dist/tools/audio.js +1 -1
- package/dist/tools/audio.js.map +1 -1
- package/dist/tools/debug.js +2 -2
- package/dist/tools/debug.js.map +1 -1
- package/dist/tools/device.js +10 -9
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/discover.js +15 -4
- package/dist/tools/discover.js.map +1 -1
- package/dist/tools/exec.js +4 -4
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/instances.js +32 -7
- package/dist/tools/instances.js.map +1 -1
- package/dist/tools/perf.js +27 -5
- package/dist/tools/perf.js.map +1 -1
- package/dist/tools/playtest.js +35 -10
- package/dist/tools/playtest.js.map +1 -1
- package/dist/tools/screenshot.js +55 -11
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/scripts.js +4 -4
- package/dist/tools/scripts.js.map +1 -1
- package/dist/tools/terrain.js +5 -5
- package/dist/tools/terrain.js.map +1 -1
- package/dist/tools/universe.js +136 -11
- package/dist/tools/universe.js.map +1 -1
- package/dist/tools/world.js +38 -15
- package/dist/tools/world.js.map +1 -1
- package/package.json +75 -75
- package/plugin/src/ClientRelay.luau +20 -2
- package/plugin/src/Config.luau +1 -1
- package/plugin/src/Emulation.luau +44 -16
- package/plugin/src/ExecRuntime.luau +168 -161
- package/plugin/src/LogBuffer.luau +65 -3
- package/plugin/src/Paths.luau +15 -4
- package/plugin/src/Phrase.luau +3 -20
- package/plugin/src/ScriptEdit.luau +14 -0
- package/plugin/src/Serialize.luau +17 -0
- package/plugin/src/TextEdit.luau +6 -0
- package/plugin/src/handlers/Api.luau +8 -0
- package/plugin/src/handlers/Assets.luau +27 -18
- package/plugin/src/handlers/Audio.luau +36 -15
- package/plugin/src/handlers/Capture.luau +219 -3
- package/plugin/src/handlers/Character.luau +38 -23
- package/plugin/src/handlers/Data.luau +12 -1
- package/plugin/src/handlers/Device.luau +38 -27
- package/plugin/src/handlers/Generate.luau +8 -5
- package/plugin/src/handlers/Geometry.luau +7 -5
- package/plugin/src/handlers/Perf.luau +1 -0
- package/plugin/src/handlers/Playtest.luau +40 -3
- package/plugin/src/handlers/Terrain.luau +9 -24
- package/plugin/src/handlers/Viewport.luau +4 -4
- package/plugin/src/handlers/World.luau +17 -1
- package/plugin/src/init.server.luau +0 -2
- package/scripts/test-tools.mjs +437 -216
- package/dist/tools/anim.js +0 -159
- package/dist/tools/anim.js.map +0 -1
- package/plugin/src/handlers/Anim.luau +0 -897
package/dist/tools/anim.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { json, table, text, textOf } from "../lib/format.js";
|
|
3
|
-
import { defineTool } from "../lib/tool.js";
|
|
4
|
-
/** Downloads go to Roblox's asset servers, which are not always quick. */
|
|
5
|
-
const TIMEOUT_MS = 45_000;
|
|
6
|
-
export function registerAnimTools(context) {
|
|
7
|
-
const { bridge } = context;
|
|
8
|
-
defineTool(context, {
|
|
9
|
-
name: "animation",
|
|
10
|
-
title: "Read and build animations",
|
|
11
|
-
description: "Reads an animation's actual keyframes, and builds new ones that play " +
|
|
12
|
-
"immediately in the open Studio.\n\n" +
|
|
13
|
-
"Animations are the one part of a place no other tool can see. " +
|
|
14
|
-
"`inspect` on an Animation instance returns an asset id and stops there " +
|
|
15
|
-
"— the poses live on Roblox's servers. `read` downloads them, so you can " +
|
|
16
|
-
"answer 'how long is it', 'which joints does it move', and 'does it end " +
|
|
17
|
-
"where it started' without opening the Animation Editor and scrubbing.\n\n" +
|
|
18
|
-
"`read` takes an asset id, an rbxassetid:// string, or the path of an " +
|
|
19
|
-
"Animation instance in the place — whichever you already have. It reports " +
|
|
20
|
-
"which RIG the animation was made for, which is the thing most worth " +
|
|
21
|
-
"knowing: an R15 animation on an R6 character does nothing at all — no " +
|
|
22
|
-
"error, no movement — and the asset id gives no hint either way.\n\n" +
|
|
23
|
-
"`build` goes the other way: give it keyframes and it returns a content " +
|
|
24
|
-
"id you can put straight into an Animation's AnimationId. Nothing is " +
|
|
25
|
-
"uploaded and nothing is moderated — the id works in this Studio session " +
|
|
26
|
-
"and nowhere else, which makes it the right way to try an idea and the " +
|
|
27
|
-
"wrong way to ship one.\n\n" +
|
|
28
|
-
"`preview` puts an animation ONTO a rig in the open place and freezes it " +
|
|
29
|
-
"at a chosen moment, so `screenshot` can show you the pose. It works in " +
|
|
30
|
-
"edit mode — no playtest. Ask for several moments in turn to compare " +
|
|
31
|
-
"poses across the animation; the rig stays posed until `stop`.\n\n" +
|
|
32
|
-
"Poses are written the way a CFrame property is: \"0, 1, 0\" for a " +
|
|
33
|
-
"position, \"0, 1, 0 | 0, 45, 0\" to rotate as well.\n\n" +
|
|
34
|
-
"The id `build` returns is a bare hash, not an rbxassetid:// URL. Use it " +
|
|
35
|
-
"exactly as given — prefixing it stops it working.",
|
|
36
|
-
inputSchema: {
|
|
37
|
-
op: z
|
|
38
|
-
.enum(["read", "preview", "build", "stop"])
|
|
39
|
-
.default("read")
|
|
40
|
-
.describe("'read' downloads an existing animation, 'preview' poses a rig at one " +
|
|
41
|
-
"moment of it so you can screenshot it, 'build' makes a new one " +
|
|
42
|
-
"playable here, 'stop' clears a preview."),
|
|
43
|
-
assetId: z
|
|
44
|
-
.union([z.number(), z.string()])
|
|
45
|
-
.optional()
|
|
46
|
-
.describe('read only: animation asset id (12345), "rbxassetid://12345", or the ' +
|
|
47
|
-
'path of an Animation instance ("Workspace.Rig.Animate.run").'),
|
|
48
|
-
keyframes: z
|
|
49
|
-
.array(z.object({
|
|
50
|
-
time: z.number().min(0).describe("Seconds from the start of the animation."),
|
|
51
|
-
name: z.string().optional().describe('Keyframe name, e.g. "Start" or a marker name.'),
|
|
52
|
-
poses: z
|
|
53
|
-
.record(z.string(), z.string())
|
|
54
|
-
.optional()
|
|
55
|
-
.describe('Joint name → CFrame, e.g. { "Right Arm": "0, 0.5, 0 | 0, 0, 45" }. ' +
|
|
56
|
-
"Joint names must match the rig's parts."),
|
|
57
|
-
}))
|
|
58
|
-
.max(200)
|
|
59
|
-
.optional()
|
|
60
|
-
.describe("build only: the keyframes, in any order — they are sorted by time."),
|
|
61
|
-
name: z.string().optional().describe("build only: name for the sequence."),
|
|
62
|
-
root: z
|
|
63
|
-
.string()
|
|
64
|
-
.optional()
|
|
65
|
-
.describe('build only: the rig part every pose hangs from. Defaults to "HumanoidRootPart", ' +
|
|
66
|
-
"which is right for an R15 or R6 character."),
|
|
67
|
-
priority: z
|
|
68
|
-
.enum(["Idle", "Movement", "Action", "Core"])
|
|
69
|
-
.optional()
|
|
70
|
-
.describe("build only: which animations this one plays over."),
|
|
71
|
-
loop: z.boolean().optional().describe("build only: whether it repeats."),
|
|
72
|
-
rig: z
|
|
73
|
-
.string()
|
|
74
|
-
.optional()
|
|
75
|
-
.describe('The model, e.g. "Workspace.Dummy". For preview/stop it is the rig to ' +
|
|
76
|
-
"pose, and needs a Humanoid or an AnimationController inside it. For " +
|
|
77
|
-
"`build` it is optional and is read for its joint layout — pass it for " +
|
|
78
|
-
"anything that is not a standard R6 or R15 character (a custom rig, a " +
|
|
79
|
-
"weapon, a door, a Blender import), or the poses may be attached in the " +
|
|
80
|
-
"wrong order and the animation will move nothing."),
|
|
81
|
-
at: z
|
|
82
|
-
.number()
|
|
83
|
-
.min(0)
|
|
84
|
-
.optional()
|
|
85
|
-
.describe("preview only: the moment to freeze on, in seconds. Ask for several " +
|
|
86
|
-
"in turn to compare poses across the animation."),
|
|
87
|
-
hold: z
|
|
88
|
-
.boolean()
|
|
89
|
-
.default(true)
|
|
90
|
-
.describe("preview only: freeze on that frame. Turn off to let it play, but then " +
|
|
91
|
-
"a screenshot catches whatever pose it happens to be in."),
|
|
92
|
-
studioId: z.string().optional().describe("Target Studio; omit for the active one."),
|
|
93
|
-
},
|
|
94
|
-
readOnly: false,
|
|
95
|
-
destructive: false,
|
|
96
|
-
}, async (args) => {
|
|
97
|
-
if (args.op === "preview" || args.op === "stop") {
|
|
98
|
-
if (!args.rig)
|
|
99
|
-
return text("preview needs a `rig` — the model to pose.");
|
|
100
|
-
const posed = await bridge.call("anim.preview", { op: args.op, rig: args.rig, assetId: args.assetId, at: args.at, hold: args.hold }, { studioId: args.studioId, timeoutMs: TIMEOUT_MS });
|
|
101
|
-
return json(posed);
|
|
102
|
-
}
|
|
103
|
-
if (args.op === "build") {
|
|
104
|
-
if (!args.keyframes || args.keyframes.length === 0) {
|
|
105
|
-
return text("build needs a non-empty `keyframes` array.");
|
|
106
|
-
}
|
|
107
|
-
const built = await bridge.call("anim.build", {
|
|
108
|
-
keyframes: args.keyframes,
|
|
109
|
-
name: args.name,
|
|
110
|
-
root: args.root,
|
|
111
|
-
rig: args.rig,
|
|
112
|
-
priority: args.priority,
|
|
113
|
-
loop: args.loop,
|
|
114
|
-
}, { studioId: args.studioId, timeoutMs: TIMEOUT_MS });
|
|
115
|
-
return json(built, "Set this as an Animation's AnimationId with `modify`, exactly as it appears " +
|
|
116
|
-
"— it is a bare hash, and adding rbxassetid:// in front of it stops it " +
|
|
117
|
-
"working. Local to this Studio session: not uploaded, gone on restart.\n\n" +
|
|
118
|
-
"`hierarchy` says which joint layout the poses were nested against — the " +
|
|
119
|
-
"rig you named, or the R6/R15 standard guessed from the joint names. " +
|
|
120
|
-
"Anything in `unmatchedJoints` is a name that layout does not contain: " +
|
|
121
|
-
"those poses were attached to the root and will almost certainly do " +
|
|
122
|
-
"nothing. Pass `rig` to fix it.");
|
|
123
|
-
}
|
|
124
|
-
if (args.assetId === undefined) {
|
|
125
|
-
return text("read needs an `assetId` — a number, an rbxassetid:// string, or a path to an Animation.");
|
|
126
|
-
}
|
|
127
|
-
const found = await bridge.call("anim.read", { assetId: args.assetId }, { studioId: args.studioId, timeoutMs: TIMEOUT_MS });
|
|
128
|
-
/*
|
|
129
|
-
* A summary first, then the timeline. The three facts at the top are what
|
|
130
|
-
* the question was, and burying them under forty rows of keyframes would
|
|
131
|
-
* make the tool technically complete and practically unreadable.
|
|
132
|
-
*/
|
|
133
|
-
const lines = [
|
|
134
|
-
`${found.name ?? found.assetId} — ${found.rig} rig, ${found.duration}s, ` +
|
|
135
|
-
`${found.keyframeCount} keyframes, ${found.jointCount} joints moved`,
|
|
136
|
-
`Priority ${found.priority}${found.looping ? ", loops" : ", does not loop"}` +
|
|
137
|
-
(found.rigNote !== undefined ? ` — ${found.rigNote}` : ""),
|
|
138
|
-
"",
|
|
139
|
-
`Joints: ${found.joints.join(", ") || "none"}` +
|
|
140
|
-
(found.jointsSampled ? ` … and ${found.jointCount - found.joints.length} more` : ""),
|
|
141
|
-
];
|
|
142
|
-
if (found.rig === "R6" || found.rig === "R15") {
|
|
143
|
-
lines.push("", `This is an ${found.rig} animation. It will do NOTHING on an ${found.rig === "R6" ? "R15" : "R6"} character — no error, no movement, because the joint names do not exist ` +
|
|
144
|
-
"on the other rig. Check the character's rig type before using it.");
|
|
145
|
-
}
|
|
146
|
-
if (found.looping && found.endsWhereItStarted === false) {
|
|
147
|
-
lines.push("", "WARNING: this animation loops, but these joints do not end where they " +
|
|
148
|
-
`started: ${(found.driftingJoints ?? []).join(", ")}. That is what a ` +
|
|
149
|
-
"visible jump at the loop point looks like.");
|
|
150
|
-
}
|
|
151
|
-
lines.push("", textOf(table(["index", "time", "name", "poseCount"], found.keyframes, {
|
|
152
|
-
more: found.truncated
|
|
153
|
-
? `poses expanded for the first 40 keyframes only`
|
|
154
|
-
: undefined,
|
|
155
|
-
})));
|
|
156
|
-
return text(lines.join("\n"));
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=anim.js.map
|
package/dist/tools/anim.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anim.js","sourceRoot":"","sources":["../../src/tools/anim.ts"],"names":[],"mappings":"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"}
|