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
@@ -748,13 +748,6 @@ processRequest = function(request)
748
748
  return handlers.getScriptSource(data)
749
749
  elseif endpoint == "/api/set-script-source" then
750
750
  return handlers.setScriptSource(data)
751
- -- Partial script editing endpoints
752
- elseif endpoint == "/api/edit-script-lines" then
753
- return handlers.editScriptLines(data)
754
- elseif endpoint == "/api/insert-script-lines" then
755
- return handlers.insertScriptLines(data)
756
- elseif endpoint == "/api/delete-script-lines" then
757
- return handlers.deleteScriptLines(data)
758
751
  -- Attribute endpoints
759
752
  elseif endpoint == "/api/get-attribute" then
760
753
  return handlers.getAttribute(data)
@@ -2498,237 +2491,9 @@ handlers.setScriptSource = function(requestData)
2498
2491
  end
2499
2492
  end
2500
2493
 
2501
- -- Partial Script Editing: Edit specific lines
2502
- handlers.editScriptLines = function(requestData)
2503
- local instancePath = requestData.instancePath
2504
- local startLine = requestData.startLine
2505
- local endLine = requestData.endLine
2506
- local newContent = requestData.newContent
2507
-
2508
- if not instancePath or not startLine or not endLine or not newContent then
2509
- return { error = "Instance path, startLine, endLine, and newContent are required" }
2510
- end
2511
-
2512
- -- Normalize escape sequences that may have been double-escaped
2513
- newContent = newContent:gsub("\\n", "\n")
2514
- newContent = newContent:gsub("\\t", "\t")
2515
- newContent = newContent:gsub("\\r", "\r")
2516
- newContent = newContent:gsub("\\\\", "\\")
2517
-
2518
- local instance = getInstanceByPath(instancePath)
2519
- if not instance then
2520
- return { error = "Instance not found: " .. instancePath }
2521
- end
2522
-
2523
- if not instance:IsA("LuaSourceContainer") then
2524
- return { error = "Instance is not a script-like object: " .. instance.ClassName }
2525
- end
2526
-
2527
- local success, result = pcall(function()
2528
- local lines, hadTrailingNewline = splitLines(instance.Source)
2529
- local totalLines = #lines
2530
-
2531
- if startLine < 1 or startLine > totalLines then
2532
- error("startLine out of range (1-" .. totalLines .. ")")
2533
- end
2534
- if endLine < startLine or endLine > totalLines then
2535
- error("endLine out of range (" .. startLine .. "-" .. totalLines .. ")")
2536
- end
2537
-
2538
- -- Split new content into lines
2539
- local newLines = select(1, splitLines(newContent))
2540
-
2541
- -- Build new source: lines before + new content + lines after
2542
- local resultLines = {}
2543
-
2544
- -- Lines before the edit
2545
- for i = 1, startLine - 1 do
2546
- table.insert(resultLines, lines[i])
2547
- end
2548
-
2549
- -- New content lines
2550
- for _, line in ipairs(newLines) do
2551
- table.insert(resultLines, line)
2552
- end
2553
-
2554
- -- Lines after the edit
2555
- for i = endLine + 1, totalLines do
2556
- table.insert(resultLines, lines[i])
2557
- end
2558
-
2559
- local newSource = joinLines(resultLines, hadTrailingNewline)
2560
-
2561
- -- Use UpdateSourceAsync for editor compatibility
2562
- ScriptEditorService:UpdateSourceAsync(instance, function(oldContent)
2563
- return newSource
2564
- end)
2565
-
2566
- ChangeHistoryService:SetWaypoint("Edit script lines " .. startLine .. "-" .. endLine .. ": " .. instance.Name)
2567
-
2568
- return {
2569
- success = true,
2570
- instancePath = instancePath,
2571
- editedLines = { startLine = startLine, endLine = endLine },
2572
- linesRemoved = endLine - startLine + 1,
2573
- linesAdded = #newLines,
2574
- newLineCount = #resultLines,
2575
- message = "Script lines edited successfully"
2576
- }
2577
- end)
2578
-
2579
- if success then
2580
- return result
2581
- else
2582
- return { error = "Failed to edit script lines: " .. tostring(result) }
2583
- end
2584
- end
2585
-
2586
- -- Partial Script Editing: Insert lines after a specific line
2587
- handlers.insertScriptLines = function(requestData)
2588
- local instancePath = requestData.instancePath
2589
- local afterLine = requestData.afterLine or 0 -- 0 means insert at beginning
2590
- local newContent = requestData.newContent
2591
-
2592
- if not instancePath or not newContent then
2593
- return { error = "Instance path and newContent are required" }
2594
- end
2595
-
2596
- -- Normalize escape sequences that may have been double-escaped
2597
- newContent = newContent:gsub("\\n", "\n")
2598
- newContent = newContent:gsub("\\t", "\t")
2599
- newContent = newContent:gsub("\\r", "\r")
2600
- newContent = newContent:gsub("\\\\", "\\")
2601
-
2602
- local instance = getInstanceByPath(instancePath)
2603
- if not instance then
2604
- return { error = "Instance not found: " .. instancePath }
2605
- end
2606
-
2607
- if not instance:IsA("LuaSourceContainer") then
2608
- return { error = "Instance is not a script-like object: " .. instance.ClassName }
2609
- end
2610
-
2611
- local success, result = pcall(function()
2612
- local lines, hadTrailingNewline = splitLines(instance.Source)
2613
- local totalLines = #lines
2614
-
2615
- if afterLine < 0 or afterLine > totalLines then
2616
- error("afterLine out of range (0-" .. totalLines .. ")")
2617
- end
2618
-
2619
- -- Split new content into lines
2620
- local newLines = select(1, splitLines(newContent))
2621
-
2622
- -- Build new source
2623
- local resultLines = {}
2624
-
2625
- -- Lines before insertion point
2626
- for i = 1, afterLine do
2627
- table.insert(resultLines, lines[i])
2628
- end
2629
-
2630
- -- New content lines
2631
- for _, line in ipairs(newLines) do
2632
- table.insert(resultLines, line)
2633
- end
2634
-
2635
- -- Lines after insertion point
2636
- for i = afterLine + 1, totalLines do
2637
- table.insert(resultLines, lines[i])
2638
- end
2639
-
2640
- local newSource = joinLines(resultLines, hadTrailingNewline)
2641
-
2642
- -- Use UpdateSourceAsync for editor compatibility
2643
- ScriptEditorService:UpdateSourceAsync(instance, function(oldContent)
2644
- return newSource
2645
- end)
2646
-
2647
- ChangeHistoryService:SetWaypoint("Insert script lines after line " .. afterLine .. ": " .. instance.Name)
2648
-
2649
- return {
2650
- success = true,
2651
- instancePath = instancePath,
2652
- insertedAfterLine = afterLine,
2653
- linesInserted = #newLines,
2654
- newLineCount = #resultLines,
2655
- message = "Script lines inserted successfully"
2656
- }
2657
- end)
2658
-
2659
- if success then
2660
- return result
2661
- else
2662
- return { error = "Failed to insert script lines: " .. tostring(result) }
2663
- end
2664
- end
2665
-
2666
- -- Partial Script Editing: Delete specific lines
2667
- handlers.deleteScriptLines = function(requestData)
2668
- local instancePath = requestData.instancePath
2669
- local startLine = requestData.startLine
2670
- local endLine = requestData.endLine
2671
-
2672
- if not instancePath or not startLine or not endLine then
2673
- return { error = "Instance path, startLine, and endLine are required" }
2674
- end
2675
-
2676
- local instance = getInstanceByPath(instancePath)
2677
- if not instance then
2678
- return { error = "Instance not found: " .. instancePath }
2679
- end
2680
-
2681
- if not instance:IsA("LuaSourceContainer") then
2682
- return { error = "Instance is not a script-like object: " .. instance.ClassName }
2683
- end
2684
-
2685
- local success, result = pcall(function()
2686
- local lines, hadTrailingNewline = splitLines(instance.Source)
2687
- local totalLines = #lines
2688
-
2689
- if startLine < 1 or startLine > totalLines then
2690
- error("startLine out of range (1-" .. totalLines .. ")")
2691
- end
2692
- if endLine < startLine or endLine > totalLines then
2693
- error("endLine out of range (" .. startLine .. "-" .. totalLines .. ")")
2694
- end
2695
-
2696
- -- Build new source without the deleted lines
2697
- local resultLines = {}
2698
-
2699
- for i = 1, startLine - 1 do
2700
- table.insert(resultLines, lines[i])
2701
- end
2702
-
2703
- for i = endLine + 1, totalLines do
2704
- table.insert(resultLines, lines[i])
2705
- end
2706
-
2707
- local newSource = joinLines(resultLines, hadTrailingNewline)
2708
-
2709
- -- Use UpdateSourceAsync for editor compatibility
2710
- ScriptEditorService:UpdateSourceAsync(instance, function(oldContent)
2711
- return newSource
2712
- end)
2713
-
2714
- ChangeHistoryService:SetWaypoint("Delete script lines " .. startLine .. "-" .. endLine .. ": " .. instance.Name)
2715
-
2716
- return {
2717
- success = true,
2718
- instancePath = instancePath,
2719
- deletedLines = { startLine = startLine, endLine = endLine },
2720
- linesDeleted = endLine - startLine + 1,
2721
- newLineCount = #resultLines,
2722
- message = "Script lines deleted successfully"
2723
- }
2724
- end)
2725
-
2726
- if success then
2727
- return result
2728
- else
2729
- return { error = "Failed to delete script lines: " .. tostring(result) }
2730
- end
2731
- end
2494
+ -- Legacy line-based partial script editors removed — superseded by the
2495
+ -- string-based editScript handler below. Line numbers shift after each
2496
+ -- edit, which makes line-based editing unreliable for AI workflows.
2732
2497
 
2733
2498
  -- Attribute Tools: Get a single attribute
2734
2499
  handlers.getAttribute = function(requestData)