rbxstudio-mcp 2.3.2 → 2.4.0

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 (175) hide show
  1. package/README.md +67 -14
  2. package/dist/__tests__/bridge-service.test.js +25 -13
  3. package/dist/__tests__/bridge-service.test.js.map +1 -1
  4. package/dist/__tests__/bridge-session.test.d.ts +2 -0
  5. package/dist/__tests__/bridge-session.test.d.ts.map +1 -0
  6. package/dist/__tests__/bridge-session.test.js +171 -0
  7. package/dist/__tests__/bridge-session.test.js.map +1 -0
  8. package/dist/__tests__/chunker.test.d.ts +2 -0
  9. package/dist/__tests__/chunker.test.d.ts.map +1 -0
  10. package/dist/__tests__/chunker.test.js +201 -0
  11. package/dist/__tests__/chunker.test.js.map +1 -0
  12. package/dist/__tests__/docs-core.test.d.ts +2 -0
  13. package/dist/__tests__/docs-core.test.d.ts.map +1 -0
  14. package/dist/__tests__/docs-core.test.js +137 -0
  15. package/dist/__tests__/docs-core.test.js.map +1 -0
  16. package/dist/__tests__/docs-fetcher.test.d.ts +2 -0
  17. package/dist/__tests__/docs-fetcher.test.d.ts.map +1 -0
  18. package/dist/__tests__/docs-fetcher.test.js +173 -0
  19. package/dist/__tests__/docs-fetcher.test.js.map +1 -0
  20. package/dist/__tests__/helpers.d.ts +8 -0
  21. package/dist/__tests__/helpers.d.ts.map +1 -0
  22. package/dist/__tests__/helpers.js +23 -0
  23. package/dist/__tests__/helpers.js.map +1 -0
  24. package/dist/__tests__/http-routes.test.d.ts +2 -0
  25. package/dist/__tests__/http-routes.test.d.ts.map +1 -0
  26. package/dist/__tests__/http-routes.test.js +233 -0
  27. package/dist/__tests__/http-routes.test.js.map +1 -0
  28. package/dist/__tests__/http-server.test.js +13 -6
  29. package/dist/__tests__/http-server.test.js.map +1 -1
  30. package/dist/__tests__/integration.test.js +9 -4
  31. package/dist/__tests__/integration.test.js.map +1 -1
  32. package/dist/__tests__/semantic-search.test.d.ts +2 -0
  33. package/dist/__tests__/semantic-search.test.d.ts.map +1 -0
  34. package/dist/__tests__/semantic-search.test.js +202 -0
  35. package/dist/__tests__/semantic-search.test.js.map +1 -0
  36. package/dist/__tests__/smoke.test.js +7 -3
  37. package/dist/__tests__/smoke.test.js.map +1 -1
  38. package/dist/__tests__/studio-client.test.d.ts +2 -0
  39. package/dist/__tests__/studio-client.test.d.ts.map +1 -0
  40. package/dist/__tests__/studio-client.test.js +25 -0
  41. package/dist/__tests__/studio-client.test.js.map +1 -0
  42. package/dist/__tests__/tool-nudges.test.d.ts +2 -0
  43. package/dist/__tests__/tool-nudges.test.d.ts.map +1 -0
  44. package/dist/__tests__/tool-nudges.test.js +60 -0
  45. package/dist/__tests__/tool-nudges.test.js.map +1 -0
  46. package/dist/__tests__/tool-registry.test.d.ts +2 -0
  47. package/dist/__tests__/tool-registry.test.d.ts.map +1 -0
  48. package/dist/__tests__/tool-registry.test.js +365 -0
  49. package/dist/__tests__/tool-registry.test.js.map +1 -0
  50. package/dist/__tests__/tools-bridge.test.d.ts +2 -0
  51. package/dist/__tests__/tools-bridge.test.d.ts.map +1 -0
  52. package/dist/__tests__/tools-bridge.test.js +396 -0
  53. package/dist/__tests__/tools-bridge.test.js.map +1 -0
  54. package/dist/__tests__/tools-docs.test.d.ts +2 -0
  55. package/dist/__tests__/tools-docs.test.d.ts.map +1 -0
  56. package/dist/__tests__/tools-docs.test.js +112 -0
  57. package/dist/__tests__/tools-docs.test.js.map +1 -0
  58. package/dist/__tests__/tools-guards.test.d.ts +2 -0
  59. package/dist/__tests__/tools-guards.test.d.ts.map +1 -0
  60. package/dist/__tests__/tools-guards.test.js +131 -0
  61. package/dist/__tests__/tools-guards.test.js.map +1 -0
  62. package/dist/__tests__/tools-runtime.test.d.ts +2 -0
  63. package/dist/__tests__/tools-runtime.test.d.ts.map +1 -0
  64. package/dist/__tests__/tools-runtime.test.js +214 -0
  65. package/dist/__tests__/tools-runtime.test.js.map +1 -0
  66. package/dist/__tests__/tools-visual.test.d.ts +2 -0
  67. package/dist/__tests__/tools-visual.test.d.ts.map +1 -0
  68. package/dist/__tests__/tools-visual.test.js +149 -0
  69. package/dist/__tests__/tools-visual.test.js.map +1 -0
  70. package/dist/bridge-service.d.ts +99 -12
  71. package/dist/bridge-service.d.ts.map +1 -1
  72. package/dist/bridge-service.js +238 -21
  73. package/dist/bridge-service.js.map +1 -1
  74. package/dist/docs/cache.d.ts +50 -0
  75. package/dist/docs/cache.d.ts.map +1 -0
  76. package/dist/docs/cache.js +123 -0
  77. package/dist/docs/cache.js.map +1 -0
  78. package/dist/docs/embeddings/chunker.d.ts +120 -0
  79. package/dist/docs/embeddings/chunker.d.ts.map +1 -0
  80. package/dist/docs/embeddings/chunker.js +395 -0
  81. package/dist/docs/embeddings/chunker.js.map +1 -0
  82. package/dist/docs/embeddings/embedder.d.ts +41 -0
  83. package/dist/docs/embeddings/embedder.d.ts.map +1 -0
  84. package/dist/docs/embeddings/embedder.js +113 -0
  85. package/dist/docs/embeddings/embedder.js.map +1 -0
  86. package/dist/docs/embeddings/index.d.ts +102 -0
  87. package/dist/docs/embeddings/index.d.ts.map +1 -0
  88. package/dist/docs/embeddings/index.js +250 -0
  89. package/dist/docs/embeddings/index.js.map +1 -0
  90. package/dist/docs/embeddings/manager.d.ts +68 -0
  91. package/dist/docs/embeddings/manager.d.ts.map +1 -0
  92. package/dist/docs/embeddings/manager.js +97 -0
  93. package/dist/docs/embeddings/manager.js.map +1 -0
  94. package/dist/docs/fetcher.d.ts +29 -0
  95. package/dist/docs/fetcher.d.ts.map +1 -0
  96. package/dist/docs/fetcher.js +244 -0
  97. package/dist/docs/fetcher.js.map +1 -0
  98. package/dist/docs/reference.d.ts +37 -0
  99. package/dist/docs/reference.d.ts.map +1 -0
  100. package/dist/docs/reference.js +108 -0
  101. package/dist/docs/reference.js.map +1 -0
  102. package/dist/docs/search.d.ts +194 -0
  103. package/dist/docs/search.d.ts.map +1 -0
  104. package/dist/docs/search.js +733 -0
  105. package/dist/docs/search.js.map +1 -0
  106. package/dist/http-server.d.ts.map +1 -1
  107. package/dist/http-server.js +52 -5
  108. package/dist/http-server.js.map +1 -1
  109. package/dist/index.d.ts +8 -9
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +35 -1035
  112. package/dist/index.js.map +1 -1
  113. package/dist/instructions.d.ts +15 -0
  114. package/dist/instructions.d.ts.map +1 -0
  115. package/dist/instructions.js +26 -0
  116. package/dist/instructions.js.map +1 -0
  117. package/dist/tools/defs/attributes.d.ts +6 -0
  118. package/dist/tools/defs/attributes.d.ts.map +1 -0
  119. package/dist/tools/defs/attributes.js +85 -0
  120. package/dist/tools/defs/attributes.js.map +1 -0
  121. package/dist/tools/defs/docs.d.ts +17 -0
  122. package/dist/tools/defs/docs.d.ts.map +1 -0
  123. package/dist/tools/defs/docs.js +151 -0
  124. package/dist/tools/defs/docs.js.map +1 -0
  125. package/dist/tools/defs/execute.d.ts +6 -0
  126. package/dist/tools/defs/execute.d.ts.map +1 -0
  127. package/dist/tools/defs/execute.js +21 -0
  128. package/dist/tools/defs/execute.js.map +1 -0
  129. package/dist/tools/defs/inspection.d.ts +7 -0
  130. package/dist/tools/defs/inspection.d.ts.map +1 -0
  131. package/dist/tools/defs/inspection.js +202 -0
  132. package/dist/tools/defs/inspection.js.map +1 -0
  133. package/dist/tools/defs/objects.d.ts +6 -0
  134. package/dist/tools/defs/objects.d.ts.map +1 -0
  135. package/dist/tools/defs/objects.js +111 -0
  136. package/dist/tools/defs/objects.js.map +1 -0
  137. package/dist/tools/defs/properties.d.ts +6 -0
  138. package/dist/tools/defs/properties.d.ts.map +1 -0
  139. package/dist/tools/defs/properties.js +71 -0
  140. package/dist/tools/defs/properties.js.map +1 -0
  141. package/dist/tools/defs/runtime.d.ts +6 -0
  142. package/dist/tools/defs/runtime.d.ts.map +1 -0
  143. package/dist/tools/defs/runtime.js +145 -0
  144. package/dist/tools/defs/runtime.js.map +1 -0
  145. package/dist/tools/defs/scripts.d.ts +18 -0
  146. package/dist/tools/defs/scripts.d.ts.map +1 -0
  147. package/dist/tools/defs/scripts.js +163 -0
  148. package/dist/tools/defs/scripts.js.map +1 -0
  149. package/dist/tools/defs/tags.d.ts +6 -0
  150. package/dist/tools/defs/tags.d.ts.map +1 -0
  151. package/dist/tools/defs/tags.js +74 -0
  152. package/dist/tools/defs/tags.js.map +1 -0
  153. package/dist/tools/defs/visual.d.ts +7 -0
  154. package/dist/tools/defs/visual.d.ts.map +1 -0
  155. package/dist/tools/defs/visual.js +208 -0
  156. package/dist/tools/defs/visual.js.map +1 -0
  157. package/dist/tools/index.d.ts +101 -25
  158. package/dist/tools/index.d.ts.map +1 -1
  159. package/dist/tools/index.js +580 -63
  160. package/dist/tools/index.js.map +1 -1
  161. package/dist/tools/nudges.d.ts +25 -0
  162. package/dist/tools/nudges.d.ts.map +1 -0
  163. package/dist/tools/nudges.js +34 -0
  164. package/dist/tools/nudges.js.map +1 -0
  165. package/dist/tools/registry.d.ts +20 -0
  166. package/dist/tools/registry.d.ts.map +1 -0
  167. package/dist/tools/registry.js +65 -0
  168. package/dist/tools/registry.js.map +1 -0
  169. package/dist/tools/types.d.ts +24 -0
  170. package/dist/tools/types.d.ts.map +1 -0
  171. package/dist/tools/types.js +2 -0
  172. package/dist/tools/types.js.map +1 -0
  173. package/package.json +7 -6
  174. package/studio-plugin/MCPPlugin.rbxmx +3 -238
  175. package/studio-plugin/plugin.luau +2041 -365
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Script editing tools — string-based (Claude Code-style) only.
3
+ *
4
+ * The legacy line-based partial editors (edit_script_lines /
5
+ * insert_script_lines / delete_script_lines) were removed: line numbers
6
+ * shift on every edit, the model has to count manually, and `edit_script`
7
+ * does the same job more reliably with exact string matching + automatic
8
+ * syntax validation.
9
+ *
10
+ * `search_script` was also removed: the `grep` tool (inspection.ts)
11
+ * supersedes it — passing a single script path as `grep`'s `path` does
12
+ * the exact same single-script search, plus everything `grep` adds
13
+ * (cross-file, glob/type filters, output modes, head limits). Keeping
14
+ * two near-identical tools just creates choice paralysis for the LLM.
15
+ */
16
+ export const scriptTools = [
17
+ {
18
+ name: 'get_script_source',
19
+ description: 'Read the source of a Roblox script (LocalScript, Script, or ModuleScript). Returns both `source` (raw) and `numberedSource` (line-numbered, like `cat -n`). ' +
20
+ '⚠️ For scripts >500 lines, you SHOULD pass `startLine`/`endLine` instead of slurping the whole file — or better, use `search_script` / `get_script_function` to pull just the part you need.',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {
24
+ instancePath: {
25
+ type: 'string',
26
+ description: 'Roblox instance path to the script using dot notation (e.g., "game.ServerScriptService.MainScript", "game.StarterPlayer.StarterPlayerScripts.LocalScript")',
27
+ },
28
+ startLine: {
29
+ type: 'number',
30
+ description: 'Optional: Start line number (1-indexed). RECOMMENDED for any script >500 lines.',
31
+ },
32
+ endLine: {
33
+ type: 'number',
34
+ description: 'Optional: End line number (inclusive). RECOMMENDED for any script >500 lines.',
35
+ },
36
+ },
37
+ required: ['instancePath'],
38
+ },
39
+ handler: (args, { tools }) => tools.getScriptSource(args?.instancePath, args?.startLine, args?.endLine),
40
+ },
41
+ {
42
+ name: 'set_script_source',
43
+ description: '⚠️ EXPENSIVE — FOR FULL REWRITES OR NEW-SCRIPT POPULATION ONLY. Replaces the ENTIRE source of a script. ' +
44
+ 'For any partial change (adding a function, fixing a bug, refactoring a block) use `edit_script` instead — it is dramatically cheaper in tokens and far less likely to silently truncate the file. ' +
45
+ 'Use this tool only when: (a) you just created the script via `create_object` and are populating it from scratch, or (b) you genuinely want to overwrite >80% of the existing source.',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ instancePath: {
50
+ type: 'string',
51
+ description: 'Roblox instance path to the script (e.g., "game.ServerScriptService.MainScript")',
52
+ },
53
+ source: {
54
+ type: 'string',
55
+ description: 'New source code for the script (replaces the entire existing content)',
56
+ },
57
+ },
58
+ required: ['instancePath', 'source'],
59
+ },
60
+ handler: (args, { tools }) => tools.setScriptSource(args?.instancePath, args?.source),
61
+ },
62
+ {
63
+ name: 'edit_script',
64
+ description: "RECOMMENDED for all partial script edits. String-based editing like Claude Code's Edit tool: find exact text and replace it — no line numbers, no shifting offsets, no truncation risk. " +
65
+ 'Fails safely if `old_string` is not found, or appears more than once (unless `replace_all` is true). Validates Luau syntax after the edit and reverts if broken.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ properties: {
69
+ instancePath: {
70
+ type: 'string',
71
+ description: 'Roblox instance path to the script (e.g., "game.ServerScriptService.MainScript")',
72
+ },
73
+ old_string: {
74
+ type: 'string',
75
+ description: 'The exact text to find and replace (must match exactly, including whitespace/indentation)',
76
+ },
77
+ new_string: {
78
+ type: 'string',
79
+ description: 'The text to replace it with (must be different from old_string)',
80
+ },
81
+ replace_all: {
82
+ type: 'boolean',
83
+ description: 'If true, replace ALL occurrences of old_string. If false (default), fails if old_string appears more than once.',
84
+ default: false,
85
+ },
86
+ validate_after: {
87
+ type: 'boolean',
88
+ description: 'If true (default), validates the script syntax after editing and reverts if invalid.',
89
+ default: true,
90
+ },
91
+ },
92
+ required: ['instancePath', 'old_string', 'new_string'],
93
+ },
94
+ handler: (args, { tools }) => tools.editScript(args?.instancePath, args?.old_string, args?.new_string, args?.replace_all ?? false, args?.validate_after ?? true),
95
+ },
96
+ {
97
+ name: 'get_script_function',
98
+ description: 'Extract a specific function from a script by name. Returns the function source code with start/end line numbers. Perfect for editing just one function without affecting the rest of the script.',
99
+ inputSchema: {
100
+ type: 'object',
101
+ properties: {
102
+ instancePath: {
103
+ type: 'string',
104
+ description: 'Roblox instance path to the script (e.g., "game.ServerScriptService.MainScript")',
105
+ },
106
+ function_name: {
107
+ type: 'string',
108
+ description: 'Name of the function to extract (e.g., "onPlayerJoin", "handleDamage")',
109
+ },
110
+ },
111
+ required: ['instancePath', 'function_name'],
112
+ },
113
+ handler: (args, { tools }) => tools.getScriptFunction(args?.instancePath, args?.function_name),
114
+ },
115
+ {
116
+ name: 'find_and_replace_in_scripts',
117
+ description: 'Find and replace text across multiple scripts at once. Like `edit_script` but for batch operations. Validates all scripts after editing.',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ paths: {
122
+ type: 'array',
123
+ items: { type: 'string' },
124
+ description: 'Array of script paths to search and replace in',
125
+ },
126
+ old_string: {
127
+ type: 'string',
128
+ description: 'The exact text to find and replace',
129
+ },
130
+ new_string: {
131
+ type: 'string',
132
+ description: 'The text to replace it with',
133
+ },
134
+ validate_after: {
135
+ type: 'boolean',
136
+ description: 'If true (default), validates syntax after each edit.',
137
+ default: true,
138
+ },
139
+ },
140
+ required: ['paths', 'old_string', 'new_string'],
141
+ },
142
+ handler: (args, { tools }) => tools.findAndReplaceInScripts(args?.paths, args?.old_string, args?.new_string, args?.validate_after ?? true),
143
+ },
144
+ {
145
+ name: 'validate_script',
146
+ description: 'Validate Lua/Luau script syntax without running it. Returns syntax errors and warnings for deprecated patterns (wait, spawn, delay). Can validate either an existing script or raw source code.',
147
+ inputSchema: {
148
+ type: 'object',
149
+ properties: {
150
+ instancePath: {
151
+ type: 'string',
152
+ description: 'Path to the script to validate (e.g., "game.ServerScriptService.MainScript")',
153
+ },
154
+ source: {
155
+ type: 'string',
156
+ description: 'Raw Lua source code to validate (alternative to instancePath)',
157
+ },
158
+ },
159
+ },
160
+ handler: (args, { tools }) => tools.validateScript(args?.instancePath, args?.source),
161
+ },
162
+ ];
163
+ //# sourceMappingURL=scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/tools/defs/scripts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ToolDef } from '../types.js';
2
+ /**
3
+ * CollectionService tag tools: list, add, remove, query by tag.
4
+ */
5
+ export declare const tagTools: ToolDef[];
6
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/tools/defs/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,EAwE7B,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * CollectionService tag tools: list, add, remove, query by tag.
3
+ */
4
+ export const tagTools = [
5
+ {
6
+ name: 'get_tags',
7
+ description: 'Get all CollectionService tags on a Roblox instance',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ instancePath: {
12
+ type: 'string',
13
+ description: 'Roblox instance path using dot notation (e.g., "game.Workspace.Part")',
14
+ },
15
+ },
16
+ required: ['instancePath'],
17
+ },
18
+ handler: (args, { tools }) => tools.getTags(args?.instancePath),
19
+ },
20
+ {
21
+ name: 'add_tag',
22
+ description: 'Add a CollectionService tag to a Roblox instance',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ instancePath: {
27
+ type: 'string',
28
+ description: 'Roblox instance path using dot notation (e.g., "game.Workspace.Part")',
29
+ },
30
+ tagName: {
31
+ type: 'string',
32
+ description: 'Name of the tag to add',
33
+ },
34
+ },
35
+ required: ['instancePath', 'tagName'],
36
+ },
37
+ handler: (args, { tools }) => tools.addTag(args?.instancePath, args?.tagName),
38
+ },
39
+ {
40
+ name: 'remove_tag',
41
+ description: 'Remove a CollectionService tag from a Roblox instance',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ instancePath: {
46
+ type: 'string',
47
+ description: 'Roblox instance path using dot notation (e.g., "game.Workspace.Part")',
48
+ },
49
+ tagName: {
50
+ type: 'string',
51
+ description: 'Name of the tag to remove',
52
+ },
53
+ },
54
+ required: ['instancePath', 'tagName'],
55
+ },
56
+ handler: (args, { tools }) => tools.removeTag(args?.instancePath, args?.tagName),
57
+ },
58
+ {
59
+ name: 'get_tagged',
60
+ description: 'Get all instances with a specific tag',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ tagName: {
65
+ type: 'string',
66
+ description: 'Name of the tag to search for',
67
+ },
68
+ },
69
+ required: ['tagName'],
70
+ },
71
+ handler: (args, { tools }) => tools.getTagged(args?.tagName),
72
+ },
73
+ ];
74
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/tools/defs/tags.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;KAChE;IAED;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;iBACrF;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wBAAwB;iBACtC;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC;SACtC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC;KAC9E;IAED;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uDAAuD;QACpE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;iBACrF;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2BAA2B;iBACzC;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC;SACtC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC;KACjF;IAED;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uCAAuC;QACpD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;KAC7D;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ToolDef } from '../types.js';
2
+ /**
3
+ * Visual feedback tools: viewport screenshot, off-screen ViewportFrame
4
+ * render at any angle, and Studio camera focus (no image).
5
+ */
6
+ export declare const visualTools: ToolDef[];
7
+ //# sourceMappingURL=visual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual.d.ts","sourceRoot":"","sources":["../../../src/tools/defs/visual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAkC3C;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,EAqLhC,CAAC"}
@@ -0,0 +1,208 @@
1
+ import { STILL_FRAME_NUDGE } from '../nudges.js';
2
+ const cameraAngleSchema = {
3
+ description: 'Camera angle - use preset string or custom object with pitch/yaw/roll/distance',
4
+ oneOf: [
5
+ {
6
+ type: 'string',
7
+ enum: [
8
+ 'front',
9
+ 'back',
10
+ 'left',
11
+ 'right',
12
+ 'top',
13
+ 'bottom',
14
+ 'iso',
15
+ 'iso_front',
16
+ 'iso_back',
17
+ 'low_angle',
18
+ 'high_angle',
19
+ ],
20
+ },
21
+ {
22
+ type: 'object',
23
+ properties: {
24
+ pitch: { type: 'number', description: 'Pitch angle in degrees' },
25
+ yaw: { type: 'number', description: 'Yaw angle in degrees' },
26
+ roll: { type: 'number', description: 'Roll angle in degrees' },
27
+ distance: { type: 'number', description: 'Camera distance from object' },
28
+ },
29
+ },
30
+ ],
31
+ };
32
+ /**
33
+ * Visual feedback tools: viewport screenshot, off-screen ViewportFrame
34
+ * render at any angle, and Studio camera focus (no image).
35
+ */
36
+ export const visualTools = [
37
+ {
38
+ name: 'capture_screenshot',
39
+ description: 'Capture a screenshot of the current Roblox Studio viewport. Returns the image as base64-encoded RGBA pixel data. Use this to "see" what you\'ve built - GUIs, 3D objects, scene layout, etc. The screenshot captures exactly what\'s visible in the Studio viewport.',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ maxWidth: {
44
+ type: 'number',
45
+ description: 'Maximum width of the returned image (default: 768). Smaller = faster + less data.',
46
+ default: 768,
47
+ },
48
+ maxHeight: {
49
+ type: 'number',
50
+ description: 'Maximum height of the returned image (default: 768). Smaller = faster + less data.',
51
+ default: 768,
52
+ },
53
+ },
54
+ },
55
+ nudge: STILL_FRAME_NUDGE,
56
+ handler: (args, { tools }) => tools.captureScreenshot(args?.maxWidth, args?.maxHeight),
57
+ },
58
+ {
59
+ name: 'render_object_view',
60
+ description: `Render a 3D object as an image from any angle using an off-screen ViewportFrame — the PRIMARY tool for visual feedback on what you've built. Works in ANY Studio state (Edit/Play/Run) with no CaptureService limits, and gives full control over camera, lighting, and background.
61
+
62
+ Angles: front, back, left, right, top, bottom, iso, iso_front, iso_back, low_angle, high_angle, or a custom {pitch, yaw, roll} in degrees.
63
+ Lighting presets: bright (3-point), studio (flat/even), dark (dramatic), default (ambient only).
64
+ For 2D GUIs use render_gui instead.`,
65
+ inputSchema: {
66
+ type: 'object',
67
+ properties: {
68
+ instancePath: {
69
+ type: 'string',
70
+ description: 'Path to the object to render (e.g., "game.Workspace.Model1")',
71
+ },
72
+ angle: cameraAngleSchema,
73
+ resolution: {
74
+ type: 'object',
75
+ properties: {
76
+ width: { type: 'number', description: 'Image width (64-2048, default: 768)' },
77
+ height: { type: 'number', description: 'Image height (64-2048, default: 768)' },
78
+ },
79
+ description: 'Render resolution',
80
+ },
81
+ lighting: {
82
+ type: 'string',
83
+ enum: ['default', 'bright', 'studio', 'dark', 'showcase', 'dramatic', 'flat'],
84
+ description: 'Lighting preset to use (default: bright)',
85
+ },
86
+ background: {
87
+ type: 'string',
88
+ enum: ['transparent', 'grid', 'solid'],
89
+ description: 'Background style (default: transparent)',
90
+ },
91
+ autoDistance: {
92
+ type: 'boolean',
93
+ description: 'Automatically calculate camera distance to fit object (default: true)',
94
+ },
95
+ },
96
+ required: ['instancePath'],
97
+ },
98
+ nudge: STILL_FRAME_NUDGE,
99
+ handler: (args, { tools }) => tools.renderObjectView(args?.instancePath, {
100
+ angle: args?.angle,
101
+ resolution: args?.resolution,
102
+ lighting: args?.lighting,
103
+ background: args?.background,
104
+ autoDistance: args?.autoDistance,
105
+ }),
106
+ },
107
+ {
108
+ name: 'render_gui',
109
+ description: `Render a 2D GUI as an image — the visual-feedback tool for ScreenGuis, Frames, TextLabels, and other UI. render_object_view uses a ViewportFrame (3D only), so it cannot show UI; this captures a real on-screen rendering instead.
110
+
111
+ Pass any GUI by path (it doesn't have to live under StarterGui — e.g. "game.StarterGui.MainMenu", "game.StarterGui.HUD.HealthBar", or a ScreenGui you stored in ReplicatedStorage). Give a GuiObject (Frame, TextLabel, ImageLabel, …) to render that element, or a ScreenGui/SurfaceGui/BillboardGui to render all of its GuiObject children. Placement is faithful: elements are rendered inside a clone of their real ScreenGui (siblings, layout, and GUI inset intact), not repositioned to a corner.
112
+
113
+ region:
114
+ - "element" (default): crop tight to the element's on-screen rect — best for inspecting one component's visual correctness. Scale-based sizing renders at its real proportions.
115
+ - "screen": return the full viewport so you can verify WHERE the element actually lands (placement, overlaps, off-screen overflow) relative to the whole screen.
116
+
117
+ Optionally clamp the output with maxWidth/maxHeight (downscale only, aspect preserved).`,
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ instancePath: {
122
+ type: 'string',
123
+ description: 'Path to the GUI to render (e.g. "game.StarterGui.MainMenu" or "game.StarterGui.HUD.HealthBar"). Any path works — not just StarterGui. Must be a GuiObject or a ScreenGui/SurfaceGui/BillboardGui.',
124
+ },
125
+ region: {
126
+ type: 'string',
127
+ enum: ['element', 'screen'],
128
+ description: 'Crop mode. "element" (default) crops tight to the GUI; "screen" returns the full viewport to check on-screen placement.',
129
+ default: 'element',
130
+ },
131
+ maxWidth: {
132
+ type: 'number',
133
+ description: 'Optional max output width in pixels (downscale only, aspect preserved).',
134
+ },
135
+ maxHeight: {
136
+ type: 'number',
137
+ description: 'Optional max output height in pixels (downscale only, aspect preserved).',
138
+ },
139
+ },
140
+ required: ['instancePath'],
141
+ },
142
+ nudge: STILL_FRAME_NUDGE,
143
+ handler: (args, { tools }) => tools.renderGui(args?.instancePath, {
144
+ region: args?.region,
145
+ maxWidth: args?.maxWidth,
146
+ maxHeight: args?.maxHeight,
147
+ }),
148
+ },
149
+ {
150
+ name: 'focus_camera',
151
+ description: `Point the Studio camera at an object (like pressing F), auto-fitting distance for any object size. Pairs with capture_screenshot: focus_camera then capture_screenshot.
152
+
153
+ Angles: front, back, left, right, top, bottom, iso (default), iso_front, iso_back, low_angle, high_angle, or custom {pitch, yaw, roll}. Distance auto-fits from tiny (clamped to ~5 studs) to huge (1000+ studs) objects; override with \`distance\`.`,
154
+ inputSchema: {
155
+ type: 'object',
156
+ properties: {
157
+ instancePath: {
158
+ type: 'string',
159
+ description: 'Path to the object to focus on (e.g., "game.Workspace.Model1")',
160
+ },
161
+ angle: {
162
+ description: 'Camera angle - preset string or custom {pitch, yaw, roll}',
163
+ oneOf: [
164
+ {
165
+ type: 'string',
166
+ enum: [
167
+ 'front',
168
+ 'back',
169
+ 'left',
170
+ 'right',
171
+ 'top',
172
+ 'bottom',
173
+ 'iso',
174
+ 'iso_front',
175
+ 'iso_back',
176
+ 'low_angle',
177
+ 'high_angle',
178
+ ],
179
+ },
180
+ {
181
+ type: 'object',
182
+ properties: {
183
+ pitch: { type: 'number', description: 'Pitch angle in degrees' },
184
+ yaw: { type: 'number', description: 'Yaw angle in degrees' },
185
+ roll: { type: 'number', description: 'Roll angle in degrees' },
186
+ },
187
+ },
188
+ ],
189
+ },
190
+ distance: {
191
+ type: 'number',
192
+ description: 'Manual camera distance (overrides auto-distance)',
193
+ },
194
+ autoDistance: {
195
+ type: 'boolean',
196
+ description: 'Automatically calculate distance to fit object (default: true)',
197
+ },
198
+ },
199
+ required: ['instancePath'],
200
+ },
201
+ handler: (args, { tools }) => tools.focusCamera(args?.instancePath, {
202
+ angle: args?.angle,
203
+ distance: args?.distance,
204
+ autoDistance: args?.autoDistance,
205
+ }),
206
+ },
207
+ ];
208
+ //# sourceMappingURL=visual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual.js","sourceRoot":"","sources":["../../../src/tools/defs/visual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,iBAAiB,GAAG;IACxB,WAAW,EAAE,gFAAgF;IAC7F,KAAK,EAAE;QACL;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE;gBACJ,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,OAAO;gBACP,KAAK;gBACL,QAAQ;gBACR,KAAK;gBACL,WAAW;gBACX,UAAU;gBACV,WAAW;gBACX,YAAY;aACb;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;gBAChE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAC5D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;gBAC9D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;aACzE;SACF;KACF;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,sQAAsQ;QACxQ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mFAAmF;oBAChG,OAAO,EAAE,GAAG;iBACb;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oFAAoF;oBACtF,OAAO,EAAE,GAAG;iBACb;aACF;SACF;QACD,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC;KACvF;IAED;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE;;;;oCAImB;QAChC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8DAA8D;iBAC5E;gBACD,KAAK,EAAE,iBAAiB;gBACxB,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;wBAC7E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;qBAChF;oBACD,WAAW,EAAE,mBAAmB;iBACjC;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;oBAC7E,WAAW,EAAE,0CAA0C;iBACxD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC;oBACtC,WAAW,EAAE,yCAAyC;iBACvD;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,uEAAuE;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;QACD,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;YACzC,KAAK,EAAE,IAAI,EAAE,KAAK;YAClB,UAAU,EAAE,IAAI,EAAE,UAAU;YAC5B,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,UAAU,EAAE,IAAI,EAAE,UAAU;YAC5B,YAAY,EAAE,IAAI,EAAE,YAAY;SACjC,CAAC;KACL;IAED;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;;;wFAQuE;QACpF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,mMAAmM;iBACtM;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;oBAC3B,WAAW,EACT,yHAAyH;oBAC3H,OAAO,EAAE,SAAS;iBACnB;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yEAAyE;iBACvF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0EAA0E;iBACxF;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;QACD,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE;YAClC,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,SAAS,EAAE,IAAI,EAAE,SAAS;SAC3B,CAAC;KACL;IAED;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE;;sPAEqO;QAClP,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gEAAgE;iBAC9E;gBACD,KAAK,EAAE;oBACL,WAAW,EAAE,2DAA2D;oBACxE,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE;gCACJ,OAAO;gCACP,MAAM;gCACN,MAAM;gCACN,OAAO;gCACP,KAAK;gCACL,QAAQ;gCACR,KAAK;gCACL,WAAW;gCACX,UAAU;gCACV,WAAW;gCACX,YAAY;6BACb;yBACF;wBACD;4BACE,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;gCAChE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gCAC5D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;6BAC/D;yBACF;qBACF;iBACF;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAChE;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gEAAgE;iBAC9E;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE;YACpC,KAAK,EAAE,IAAI,EAAE,KAAK;YAClB,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,YAAY,EAAE,IAAI,EAAE,YAAY;SACjC,CAAC;KACL;CACF,CAAC"}