breakpoint-mcp 1.88.0 → 1.90.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.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  The MCP **host** for [Breakpoint MCP](https://github.com/jlivingston-Cipher/godot-breakpoint-mcp) —
4
4
  a [Model Context Protocol](https://modelcontextprotocol.io) server that exposes the
5
5
  Godot game engine to AI coding assistants across four planes: headless CLI, the live
6
- editor, Godot's own LSP + DAP, and a runtime bridge inside the running game. **294 tools
6
+ editor, Godot's own LSP + DAP, and a runtime bridge inside the running game. **295 tools
7
7
  + 6 MCP resources**, built against the stable `@modelcontextprotocol/sdk` 1.x API.
8
8
  Developed and tested with **Claude**; because MCP is an open protocol, other clients can
9
9
  connect too (currently untested — reports welcome).
@@ -93,8 +93,9 @@ const RUNTIME_REMEDIES := {
93
93
  "emit_failed": "Check the argument count and types against the signal's declaration, then emit again.",
94
94
  "bad_action": "Call `inputmap_list` for the actions the project declares before injecting one.",
95
95
  "bad_kind": "Pass one of the kinds the message lists to `runtime_inject_input`.",
96
+ "bad_event": "Pass the fields the message names for that kind to `runtime_inject_input`; a pointer's x and y are pixels of the frame `runtime_screenshot` returns.",
96
97
  "bad_regex": "Simplify the pattern and call again — it did not compile as a Godot RegEx.",
97
- "bad_reference": "Pass a reference image the project can load — `runtime_screenshot` writes one you can diff against later.",
98
+ "bad_reference": "Pass a reference image the project can load — `runtime_screenshot_save` writes one you can diff against later.",
98
99
  "not_animation_player": "Call `runtime_get_tree` and pass the path of an AnimationPlayer node.",
99
100
  "no_animation": "Call `runtime_anim_get_state` for the animations the player actually holds.",
100
101
  "bad_scene": "Pass a res:// .tscn path that loads in the running project; `scene_get_dependencies` reports what a scene needs.",
@@ -8,7 +8,7 @@ extends RefCounted
8
8
 
9
9
  const Codec := preload("res://addons/breakpoint_mcp/variant_json.gd")
10
10
  const Remedies := preload("res://addons/breakpoint_mcp/error_remedies.gd")
11
- const ADDON_VERSION := "1.18.0"
11
+ const ADDON_VERSION := "1.20.0"
12
12
 
13
13
  var _plugin: EditorPlugin
14
14
 
@@ -3,5 +3,5 @@
3
3
  name="Breakpoint MCP"
4
4
  description="Exposes the live Godot editor and the running game to an MCP host so an AI assistant can drive them: scene/node/resource CRUD with full undo/redo, project settings, ClassDB, editor + in-game screenshots, and an in-game runtime bridge (live SceneTree, property get/set, method calls, signals, input injection, Performance monitors). Pairs with the breakpoint-mcp MCP host."
5
5
  author="James Livingston"
6
- version="1.18.0"
6
+ version="1.20.0"
7
7
  script="plugin.gd"
@@ -36,7 +36,7 @@ extends Node
36
36
  ## and the process that is already running keeps the addon it loaded. Held in lockstep
37
37
  ## with `plugin.cfg` and with `operations.gd`'s copy by contract_check check 14, which
38
38
  ## exists because two of those literals disagreed for two releases.
39
- const ADDON_VERSION := "1.18.0"
39
+ const ADDON_VERSION := "1.20.0"
40
40
  const Codec := preload("res://addons/breakpoint_mcp/variant_json.gd")
41
41
  const Remedies := preload("res://addons/breakpoint_mcp/error_remedies.gd")
42
42
  const DEFAULT_PORT := 9081
@@ -87,6 +87,14 @@ const BridgeSecret := preload("res://addons/breakpoint_mcp/bridge_secret.gd")
87
87
  const PauseLatch := preload("res://addons/breakpoint_mcp/pause_latch.gd")
88
88
  # F4: methods dispatched on the async lane (they await frames); see _handle_line / _dispatch_async.
89
89
  const ASYNC_METHODS := ["runtime.step_frames"]
90
+ # 🆕 BP-0041 (1.19.0): the input kinds runtime.inject_input answers, in the order the
91
+ # refusal lists them. `pointer` alone rides the async lane (a tap or drag spans frames).
92
+ const INPUT_KINDS := ["action", "key", "mouse_button", "mouse_motion", "joypad_button", "joypad_motion", "pointer"]
93
+ const POINTER_ACTIONS := ["press", "move", "release", "tap", "drag"]
94
+ # The pointer's `button` is a MouseButton index, as on mouse_button: 1 left, 2 right, 3 middle.
95
+ const POINTER_MASKS := {MOUSE_BUTTON_LEFT: MOUSE_BUTTON_MASK_LEFT, MOUSE_BUTTON_RIGHT: MOUSE_BUTTON_MASK_RIGHT, MOUSE_BUTTON_MIDDLE: MOUSE_BUTTON_MASK_MIDDLE}
96
+ const STRETCH_MODES := ["disabled", "canvas_items", "viewport"]
97
+ const STRETCH_ASPECTS := ["ignore", "keep", "keep_width", "keep_height", "expand"]
90
98
  # F4: default salient fields captured by runtime.state_digest when no explicit list is given.
91
99
  const _DIGEST_DEFAULT_FIELDS := ["position", "global_position", "rotation", "scale", "visible", "modulate"]
92
100
 
@@ -107,6 +115,11 @@ var _in_capture: bool = false
107
115
  ## 🔴 325 (BP-0023): the listen decision, taken first in _ready (bridge_secret.gd's
108
116
  ## runtime_listen_policy). Read by _setup_auth for where the secret comes from.
109
117
  var _policy: Dictionary = {}
118
+ ## 🆕 BP-0041: where the injected pointer last was and which buttons it holds, so a
119
+ ## `press`, `move` and `release` sent as three calls carry the relative motion and the
120
+ ## button_mask one real gesture would.
121
+ var _pointer_at := Vector2.ZERO
122
+ var _pointer_mask: int = 0
110
123
 
111
124
 
112
125
  ## The facts the listen policy is decided on. A method and not inline so the
@@ -308,7 +321,7 @@ func _handle_line(c: Dictionary, line: String) -> void:
308
321
  # F4: async lane — methods that await frames can't use the synchronous dispatch (which sends
309
322
  # its response immediately). Start a coroutine that sends the id'd response when done; the host
310
323
  # correlates responses by id, so an out-of-order async response is fine.
311
- if method in ASYNC_METHODS:
324
+ if method in ASYNC_METHODS or _is_pointer(method, params):
312
325
  _dispatch_async(c, id, method, params)
313
326
  return
314
327
  # D1a: the engine-error echo. The ring already receives every push_error /
@@ -730,32 +743,263 @@ func _inject_input(params: Dictionary) -> Dictionary:
730
743
  Input.action_release(action)
731
744
  return _ok({"injected": true, "kind": kind})
732
745
  "key":
733
- var k := InputEventKey.new()
734
- k.keycode = int(ev.get("keycode", 0))
735
- k.pressed = bool(ev.get("pressed", true))
746
+ # 🆕 BP-0041: keys bound in the editor's Input Map are stored by PHYSICAL key (the
747
+ # dialog's default), and an event carrying only `keycode` never matches one — so
748
+ # today's key kind reached `_input` but not the actions. A key with none of the
749
+ # three codes is KEY_NONE, which matches nothing, so it is refused, not injected.
750
+ # 🆕 BP-0047 (1.20.0): a key from a real keyboard carries all three codes, and game
751
+ # code reads whichever one it was written against — most of it `event.keycode`, the
752
+ # Input Map's bindings the physical code. So _key_event fills each code the caller
753
+ # left out, and the reply names the three that were sent.
754
+ if not (ev.has("keycode") or ev.has("physical_keycode") or ev.has("key_label")):
755
+ return _err("bad_event", "A key event needs at least one of event.keycode, event.physical_keycode or event.key_label; with none it is KEY_NONE and matches no key and no action.")
756
+ var k := _key_event(ev)
736
757
  Input.parse_input_event(k)
737
- return _ok({"injected": true, "kind": kind})
758
+ return _ok({"injected": true, "kind": kind, "codes": {"keycode": int(k.keycode), "physical_keycode": int(k.physical_keycode), "key_label": int(k.key_label)}})
738
759
  "mouse_button":
739
760
  var mb := InputEventMouseButton.new()
740
761
  mb.button_index = int(ev.get("button", 1))
741
762
  mb.pressed = bool(ev.get("pressed", true))
742
- var pos_err := _apply_vector2(ev, "position", func(v: Vector2) -> void: mb.position = v)
763
+ mb.double_click = bool(ev.get("double_click", false))
764
+ var in_frame := String(ev.get("space", "window")) == "frame"
765
+ var pos_err := _apply_vector2(ev, "position", func(v: Vector2) -> void: mb.position = _frame_to_window(v) if in_frame else v)
743
766
  if not pos_err.is_empty():
744
767
  return pos_err
768
+ mb.global_position = mb.position
769
+ _apply_modifiers(mb, ev)
745
770
  Input.parse_input_event(mb)
746
771
  return _ok({"injected": true, "kind": kind})
747
772
  "mouse_motion":
748
773
  var mm := InputEventMouseMotion.new()
749
- var mpos_err := _apply_vector2(ev, "position", func(v: Vector2) -> void: mm.position = v)
774
+ var m_in_frame := String(ev.get("space", "window")) == "frame"
775
+ var mpos_err := _apply_vector2(ev, "position", func(v: Vector2) -> void: mm.position = _frame_to_window(v) if m_in_frame else v)
750
776
  if not mpos_err.is_empty():
751
777
  return mpos_err
752
778
  var rel_err := _apply_vector2(ev, "relative", func(v: Vector2) -> void: mm.relative = v)
753
779
  if not rel_err.is_empty():
754
780
  return rel_err
781
+ mm.global_position = mm.position
782
+ mm.button_mask = int(ev.get("button_mask", 0))
783
+ _apply_modifiers(mm, ev)
755
784
  Input.parse_input_event(mm)
756
785
  return _ok({"injected": true, "kind": kind})
786
+ "joypad_button":
787
+ if not ev.has("button"):
788
+ return _err("bad_event", "A joypad_button event needs event.button, Godot's JoyButton index (0 is the bottom face button).")
789
+ var jb := InputEventJoypadButton.new()
790
+ jb.device = int(ev.get("device", 0))
791
+ jb.button_index = int(ev.get("button"))
792
+ jb.pressed = bool(ev.get("pressed", true))
793
+ jb.pressure = float(ev.get("pressure", 1.0 if jb.pressed else 0.0))
794
+ Input.parse_input_event(jb)
795
+ return _ok({"injected": true, "kind": kind})
796
+ "joypad_motion":
797
+ if not ev.has("axis"):
798
+ return _err("bad_event", "A joypad_motion event needs event.axis, Godot's JoyAxis index (0 to 5), and event.value from -1 to 1.")
799
+ var jm := InputEventJoypadMotion.new()
800
+ jm.device = int(ev.get("device", 0))
801
+ jm.axis = int(ev.get("axis"))
802
+ jm.axis_value = clampf(float(ev.get("value", 0.0)), -1.0, 1.0)
803
+ Input.parse_input_event(jm)
804
+ return _ok({"injected": true, "kind": kind})
805
+ "pointer":
806
+ # Reached only from a caller that bypassed _handle_line's routing; the lane is async.
807
+ return _err("async_only", "runtime.inject_input with kind pointer is dispatched on the async lane")
757
808
  _:
758
- return _err("bad_kind", "Unknown input kind: %s" % kind)
809
+ return _err("bad_kind", "Unknown input kind: %s. The kinds are %s." % [kind, ", ".join(INPUT_KINDS)])
810
+
811
+
812
+ ## 🆕 BP-0041 — the four modifier flags, on any event that carries them.
813
+ static func _apply_modifiers(e: InputEventWithModifiers, ev: Dictionary) -> void:
814
+ e.shift_pressed = bool(ev.get("shift", false))
815
+ e.ctrl_pressed = bool(ev.get("ctrl", false))
816
+ e.alt_pressed = bool(ev.get("alt", false))
817
+ e.meta_pressed = bool(ev.get("meta", false))
818
+
819
+
820
+ ## 🆕 BP-0047 (1.20.0): the key event a real keyboard would send. Each of the three codes the
821
+ ## caller leaves out is filled from the first non-zero one it gave, in the order keycode,
822
+ ## physical_keycode, key_label — the identity a US layout reports — so a key reaches code that
823
+ ## reads `event.keycode` and Input Map bindings stored by physical key alike, and means the same
824
+ ## on every machine (the developer's own layout is never consulted). A code the caller passes,
825
+ ## 0 included, is sent exactly as given. `unicode` is never filled: it is the text a key types,
826
+ ## which depends on shift and layout, so a caller that wants text passes it.
827
+ static func _key_event(ev: Dictionary) -> InputEventKey:
828
+ var k := InputEventKey.new()
829
+ var fill := 0
830
+ for code in ["keycode", "physical_keycode", "key_label"]:
831
+ if ev.has(code) and int(ev.get(code)) != 0:
832
+ fill = int(ev.get(code))
833
+ break
834
+ k.keycode = int(ev.get("keycode", fill))
835
+ k.physical_keycode = int(ev.get("physical_keycode", fill))
836
+ k.key_label = int(ev.get("key_label", fill))
837
+ k.unicode = int(ev.get("unicode", 0))
838
+ k.echo = bool(ev.get("echo", false))
839
+ k.pressed = bool(ev.get("pressed", true))
840
+ _apply_modifiers(k, ev)
841
+ return k
842
+
843
+
844
+ ## 🆕 BP-0041 — true when this call is a `pointer` gesture, which awaits frames and so
845
+ ## rides the async lane like runtime.step_frames.
846
+ static func _is_pointer(method: String, params: Dictionary) -> bool:
847
+ if method != "runtime.inject_input":
848
+ return false
849
+ var ev: Variant = params.get("event")
850
+ return typeof(ev) == TYPE_DICTIONARY and String((ev as Dictionary).get("kind", "")) == "pointer"
851
+
852
+
853
+ ## 🆕 BP-0041 — the geometry that relates `runtime.screenshot`'s frame to the window.
854
+ ## `texture` is the frame's own pixel size (the image's, NOT `ViewportTexture.get_size()`:
855
+ ## measured windowed on 4.7 under canvas_items, that answered 685x386 for an 888x500 frame); `visible_rect` is the viewport's coordinate
856
+ ## space (what input events and Controls use); `window` is the OS window's client size;
857
+ ## the stretch fields are the root window's content scale settings.
858
+ func _viewport_block(vp: Viewport, frame_size: Vector2) -> Dictionary:
859
+ var tex_size := frame_size
860
+ var vis := vp.get_visible_rect()
861
+ var win: Window = vp as Window if vp is Window else vp.get_window()
862
+ var block := {
863
+ "texture": [tex_size.x, tex_size.y],
864
+ "visible_rect": [vis.position.x, vis.position.y, vis.size.x, vis.size.y],
865
+ "window": [vis.size.x, vis.size.y],
866
+ "stretch_mode": "disabled",
867
+ "stretch_aspect": "ignore",
868
+ "content_scale_factor": 1.0,
869
+ }
870
+ if win != null:
871
+ block["window"] = [float(win.size.x), float(win.size.y)]
872
+ block["stretch_mode"] = STRETCH_MODES[clampi(int(win.content_scale_mode), 0, STRETCH_MODES.size() - 1)]
873
+ block["stretch_aspect"] = STRETCH_ASPECTS[clampi(int(win.content_scale_aspect), 0, STRETCH_ASPECTS.size() - 1)]
874
+ block["content_scale_factor"] = win.content_scale_factor
875
+ return block
876
+
877
+
878
+ ## 🆕 BP-0041 — the transform that carries a pixel of the frame `runtime.screenshot`
879
+ ## returns to a window pixel, in all three stretch modes.
880
+ ##
881
+ ## Godot's root window maps viewport coordinates to the window with
882
+ ## `get_final_transform()` = window_transform * stretch_transform * global_canvas_transform
883
+ ## (window.cpp, 4.3-4.7), and `Viewport._make_input_local` INVERTS exactly that for every
884
+ ## event. The frame is the viewport's render target, whose pixels are viewport coordinates
885
+ ## times the stretch scale — so frame -> window is `window_transform` alone: the letterbox
886
+ ## offset under canvas_items, offset and upscale under viewport, identity when disabled.
887
+ ## Measured windowed on the Mac (4.7, 1000x500 window, 1152x648 base, aspect keep): taps and
888
+ ## drags at frame pixels landed on their targets under all three modes.
889
+ func _frame_transform() -> Transform2D:
890
+ var vp := get_viewport()
891
+ if vp == null:
892
+ return Transform2D.IDENTITY
893
+ if vp.has_method("get_stretch_transform"): # bound from Godot 4.4
894
+ var inner: Transform2D = vp.call("get_stretch_transform") * vp.global_canvas_transform
895
+ return vp.get_final_transform() * inner.affine_inverse()
896
+ # 4.2 / 4.3 bind no stretch accessor, so the frame's own size says the stretch scale.
897
+ var tex := vp.get_texture()
898
+ var img: Image = tex.get_image() if tex != null else null
899
+ if img == null or img.get_width() <= 0 or img.get_height() <= 0:
900
+ return Transform2D.IDENTITY
901
+ var vis := vp.get_visible_rect()
902
+ var to_local := Transform2D(0.0, vis.size / Vector2(img.get_width(), img.get_height()), 0.0, vis.position)
903
+ return vp.get_final_transform() * to_local
904
+
905
+
906
+ func _frame_to_window(f: Vector2) -> Vector2:
907
+ return _frame_transform() * f
908
+
909
+
910
+ ## 🆕 BP-0041 — the pointer kind: press / move / release / tap / drag, at points given in
911
+ ## the frame's pixels (`space` "frame", the default) or the window's (`space` "window").
912
+ ## The reply carries the window points actually sent, so a miss is visible in the reply.
913
+ func _inject_pointer(ev_in: Variant) -> Dictionary:
914
+ if typeof(ev_in) != TYPE_DICTIONARY:
915
+ return _err("bad_event", "event must be an object.")
916
+ var ev: Dictionary = ev_in
917
+ var action := String(ev.get("action", ""))
918
+ if not action in POINTER_ACTIONS:
919
+ return _err("bad_event", "A pointer event needs event.action, one of %s; got %s." % [", ".join(POINTER_ACTIONS), JSON.stringify(action)])
920
+ if not (ev.has("x") and ev.has("y")):
921
+ return _err("bad_event", "A pointer event needs event.x and event.y, pixels of the frame runtime_screenshot returns.")
922
+ if action == "drag" and not (ev.has("to_x") and ev.has("to_y")):
923
+ return _err("bad_event", "A pointer drag needs event.to_x and event.to_y, where the button is released.")
924
+ var bname := int(ev.get("button", MOUSE_BUTTON_LEFT))
925
+ if not POINTER_MASKS.has(bname):
926
+ return _err("bad_event", "A pointer's event.button is a MouseButton index: 1 left, 2 right or 3 middle; got %s." % JSON.stringify(ev.get("button")))
927
+ var in_frame := String(ev.get("space", "frame")) != "window"
928
+ var warp := bool(ev.get("warp", false))
929
+ var per_step := clampi(int(ev.get("frames_per_step", 1)), 1, 10)
930
+ var xf := _frame_transform() if in_frame else Transform2D.IDENTITY
931
+ var start := xf * Vector2(float(ev.get("x")), float(ev.get("y")))
932
+ var points: Array = []
933
+ var frames := 0
934
+ match action:
935
+ "press":
936
+ _pointer_button(start, bname, true, warp)
937
+ points.append(start)
938
+ "release":
939
+ _pointer_button(start, bname, false, warp)
940
+ points.append(start)
941
+ "move":
942
+ _pointer_motion(start, warp)
943
+ points.append(start)
944
+ "tap":
945
+ _pointer_button(start, bname, true, warp)
946
+ points.append(start)
947
+ frames += await _pointer_wait(per_step)
948
+ _pointer_button(start, bname, false, warp)
949
+ points.append(start)
950
+ "drag":
951
+ var end := xf * Vector2(float(ev.get("to_x")), float(ev.get("to_y")))
952
+ var steps := clampi(int(ev.get("steps", 8)), 1, 60)
953
+ _pointer_button(start, bname, true, warp)
954
+ points.append(start)
955
+ for i in range(1, steps + 1):
956
+ frames += await _pointer_wait(per_step)
957
+ var p := start.lerp(end, float(i) / float(steps))
958
+ _pointer_motion(p, warp)
959
+ points.append(p)
960
+ frames += await _pointer_wait(per_step)
961
+ _pointer_button(end, bname, false, warp)
962
+ points.append(end)
963
+ var sent: Array = []
964
+ for p in points:
965
+ sent.append([(p as Vector2).x, (p as Vector2).y])
966
+ return _ok({"injected": true, "kind": "pointer", "window_points": sent, "frames": frames})
967
+
968
+
969
+ func _pointer_wait(n: int) -> int:
970
+ var tree := get_tree()
971
+ for _i in n:
972
+ await tree.process_frame
973
+ return n
974
+
975
+
976
+ func _pointer_button(at: Vector2, bname: int, pressed: bool, warp: bool) -> void:
977
+ if warp:
978
+ Input.warp_mouse(at)
979
+ if pressed:
980
+ _pointer_mask |= int(POINTER_MASKS[bname])
981
+ else:
982
+ _pointer_mask &= ~int(POINTER_MASKS[bname])
983
+ var mb := InputEventMouseButton.new()
984
+ mb.button_index = bname
985
+ mb.pressed = pressed
986
+ mb.position = at
987
+ mb.global_position = at
988
+ mb.button_mask = _pointer_mask
989
+ Input.parse_input_event(mb)
990
+ _pointer_at = at
991
+
992
+
993
+ func _pointer_motion(at: Vector2, warp: bool) -> void:
994
+ if warp:
995
+ Input.warp_mouse(at)
996
+ var mm := InputEventMouseMotion.new()
997
+ mm.position = at
998
+ mm.global_position = at
999
+ mm.relative = at - _pointer_at
1000
+ mm.button_mask = _pointer_mask
1001
+ Input.parse_input_event(mm)
1002
+ _pointer_at = at
759
1003
 
760
1004
 
761
1005
  ## Apply an OPTIONAL Vector2 field of a synthetic input event, or say why not.
@@ -841,6 +1085,7 @@ func _screenshot() -> Dictionary:
841
1085
  "base64": Marshalls.raw_to_base64(buf),
842
1086
  "width": img.get_width(),
843
1087
  "height": img.get_height(),
1088
+ "viewport": _viewport_block(vp, Vector2(img.get_width(), img.get_height())),
844
1089
  })
845
1090
 
846
1091
 
@@ -1314,6 +1559,8 @@ func _dispatch_async(c: Dictionary, id: Variant, method: String, params: Diction
1314
1559
  match method:
1315
1560
  "runtime.step_frames":
1316
1561
  result = await _step_frames(params)
1562
+ "runtime.inject_input":
1563
+ result = await _inject_pointer(params.get("event", {}))
1317
1564
  _:
1318
1565
  result = _err("async_only", "not an async method: %s" % method)
1319
1566
  var peer: StreamPeerTCP = c.get("peer")
@@ -86,7 +86,7 @@ const IDEMPOTENT = [
86
86
  "runtime_anim_stop", "runtime_assert_node_state", "runtime_assert_perf", "runtime_assert_scene_structure",
87
87
  "runtime_assert_screen_text", "runtime_await_condition", "runtime_get_log", "runtime_get_monitors",
88
88
  "runtime_get_property", "runtime_get_tree", "runtime_node_remove", "runtime_peer_stop", "runtime_peers_digest", "runtime_read_state",
89
- "runtime_screenshot", "runtime_screenshot_diff", "runtime_seed_rng", "runtime_set_property",
89
+ "runtime_screenshot", "runtime_screenshot_diff", "runtime_screenshot_save", "runtime_seed_rng", "runtime_set_property",
90
90
  "runtime_state_digest", "runtime_time_scale", "scene_get_dependencies", "scene_get_tree", "scene_list_open", "scene_new", "scene_open",
91
91
  "scene_pack", "scene_reload", "scene_save", "scene_save_as", "screenshot_editor", "selection_get",
92
92
  "selection_set", "shader_create", "shader_set_code", "shadermaterial_create", "shadermaterial_set_param",
@@ -157,7 +157,7 @@ export const ALL_ANNOTATED = [
157
157
  "runtime_assert_scene_structure", "runtime_assert_screen_text", "runtime_await_condition", "runtime_call_method",
158
158
  "runtime_emit_signal", "runtime_get_log", "runtime_get_monitors", "runtime_get_property", "runtime_get_tree",
159
159
  "runtime_inject_input", "runtime_node_add", "runtime_node_remove", "runtime_peer_stop", "runtime_peers_digest", "runtime_read_state",
160
- "runtime_screenshot", "runtime_screenshot_diff", "runtime_seed_rng", "runtime_set_property",
160
+ "runtime_screenshot", "runtime_screenshot_diff", "runtime_screenshot_save", "runtime_seed_rng", "runtime_set_property",
161
161
  "runtime_spawn_peers", "runtime_state_digest", "runtime_step_frames", "runtime_time_scale", "scene_close",
162
162
  "scene_get_dependencies", "scene_get_tree",
163
163
  "scene_list_open", "scene_new", "scene_open", "scene_pack", "scene_reload", "scene_save", "scene_save_as",
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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"}
@@ -255,7 +255,7 @@ export function droppedToolMessage(name) {
255
255
  * earlier would wrap nothing.
256
256
  *
257
257
  * 🔴 THIS DELIBERATELY DOES NOT REGISTER THE TOOL. Least-privilege by
258
- * construction is the point of the drop: `tools/list` stays at 281 and no
258
+ * construction is the point of the drop: `tools/list` stays at 282 and no
259
259
  * withheld schema crosses the wire, so `wire_diff`, `token-cost` and every floor
260
260
  * over the advertised surface are unmoved. The ONLY thing that changes is the
261
261
  * sentence a caller gets back when it asks for one by name — which is the whole
@@ -356,7 +356,7 @@ export function checkCapabilities(config) {
356
356
  status: "ok",
357
357
  severity: "info",
358
358
  detail: dropped.length === 0
359
- ? `${state} — full 294-tool surface`
359
+ ? `${state} — full 295-tool surface`
360
360
  : `${state} (secure default) — ${dropped.length} higher-trust tool(s) dropped from the surface`,
361
361
  // The token list is DERIVED — `code-execution,network` was printed here
362
362
  // for as long as the `network` group has been deleted, so the remedy
package/dist/cli/init.js CHANGED
@@ -349,7 +349,7 @@ export async function runInit(argv, deps = {}) {
349
349
  // Trust groups — surface the secure default so even a bare `init` teaches it.
350
350
  say("");
351
351
  if (privilegedGroups) {
352
- say(`Higher-trust tool groups enabled: ${privilegedGroups} — the full 294-tool surface loads.`);
352
+ say(`Higher-trust tool groups enabled: ${privilegedGroups} — the full 295-tool surface loads.`);
353
353
  }
354
354
  else {
355
355
  say("Higher-trust tool groups are OFF by default (the secure default). The assistant loads the");
package/dist/cli/tools.js CHANGED
@@ -17,8 +17,8 @@
17
17
  * container, and on a machine with no Godot installed.
18
18
  *
19
19
  * Two surfaces are reported, because the difference is the security story:
20
- * • `full` — all 294 tools, what loads with BREAKPOINT_PRIVILEGED_GROUPS=all
21
- * • `secure-default` — 281, what an untouched install actually advertises
20
+ * • `full` — all 295 tools, what loads with BREAKPOINT_PRIVILEGED_GROUPS=all
21
+ * • `secure-default` — 282, what an untouched install actually advertises
22
22
  * `--surface` picks which one populates `tools[]`; both counts are always in the
23
23
  * header so a consumer cannot report one as the other by accident.
24
24
  */
package/dist/index.js CHANGED
@@ -83,7 +83,7 @@ async function main() {
83
83
  // below makes itself the OUTERMOST registerTool wrapper, so the earliest one
84
84
  // installed is the LAST in the call chain and counts only what reached the SDK —
85
85
  // after `applyCapabilities` dropped a privileged tool and after the toolset
86
- // filter declined a whole group. Installed later it would count 294 attempts on
86
+ // filter declined a whole group. Installed later it would count 295 attempts on
87
87
  // every configuration and be wrong exactly on the default one. `applyWireDefaults`
88
88
  // keeps its FIRST claim above: it wraps setRequestHandler, not registerTool.
89
89
  const toolCensus = installToolCensus(server);
@@ -108,7 +108,7 @@ async function main() {
108
108
  // Capability groups — a risk-based axis over the toolsets. `code-execution` is
109
109
  // OFF by default; a disabled group's tools are DROPPED at
110
110
  // registration (omitted from tools/list), so the secure-default surface is
111
- // 294 − 13 = 281 tools. Enable via BREAKPOINT_PRIVILEGED_GROUPS. Wraps
111
+ // 295 − 13 = 282 tools. Enable via BREAKPOINT_PRIVILEGED_GROUPS. Wraps
112
112
  // server.registerTool AFTER applyOutputSchemas (schema wrapper stays innermost).
113
113
  const privilegedGroups = selectPrivilegedGroups(config.privilegedGroups, (unknown) => log(`ignoring unknown BREAKPOINT_PRIVILEGED_GROUPS token(s): ${unknown.join(", ")}`));
114
114
  applyCapabilities(server, privilegedGroups);
@@ -127,7 +127,7 @@ async function main() {
127
127
  // The A/B/C/D planes ARE the grouping. Build the ordered toolset registry
128
128
  // (the single source of truth, shared with the registration tests) and
129
129
  // register only the selected groups. Default (BREAKPOINT_TOOLSETS unset) =
130
- // every group → the full 294-tool surface, byte-identical to before. A filter
130
+ // every group → the full 295-tool surface, byte-identical to before. A filter
131
131
  // lets a client that can't defer tools, or a user who wants a smaller default
132
132
  // menu, load only the planes a project needs (GitHub-MCP `--toolsets` style).
133
133
  let processes;
@@ -167,7 +167,7 @@ async function main() {
167
167
  log(`toolsets enabled: ${[...enabled].sort().join(", ")} (${enabled.size}/${toolsets.length} groups)`);
168
168
  }
169
169
  // Recipes: a free, curated task-recipe layer exposed as MCP prompts (discoverable
170
- // via prompts/list). Adds NO tools — the 294-tool count is unchanged — and drives
170
+ // via prompts/list). Adds NO tools — the 295-tool count is unchanged — and drives
171
171
  // the enforced tools above, so it's a skill-pack layer over typed/undoable tools.
172
172
  registerRecipes(server);
173
173
  // Always-on capability affordance — never behind a toolset or a privileged
@@ -180,7 +180,7 @@ async function main() {
180
180
  // the SDK's `Tool <name> not found` — grammatical, accurate about the lookup,
181
181
  // and wrong about the world. Must run AFTER every ts.run() above: the CallTool
182
182
  // dispatcher does not exist until the first registerTool, and this wraps it.
183
- // Advertises nothing new — tools/list is untouched at 281.
183
+ // Advertises nothing new — tools/list is untouched at 282.
184
184
  applyDroppedToolRefusal(server, privilegedGroups);
185
185
  // 257 — the result-cost meter, off unless BREAKPOINT_RESULT_COST names a file.
186
186
  // AFTER the refusal wrapper so a dropped tool's refusal is measured as the result
package/dist/paths.js CHANGED
@@ -108,8 +108,11 @@ export function resolveWriteTarget(p, projectPath, opts = {}) {
108
108
  const fsPath = resolveInsideProject(p, projectPath, label);
109
109
  const exists = fs.existsSync(fsPath);
110
110
  if (exists && !opts.overwrite) {
111
+ // 🆕 BP-0042 (1.89.0) — the closing sentence is a PARAMETER for a writer with no
112
+ // `overwrite` to offer: `runtime_screenshot_save` never replaces a file, so telling
113
+ // its caller to pass overwrite:true would name an argument the tool does not take.
111
114
  refuse("exists", `Refusing to write ${label} ${JSON.stringify(p)}: ${fsPath} already exists. ` +
112
- `Pass overwrite:true to replace it, or choose another path.`);
115
+ (opts.existsHint ?? `Pass overwrite:true to replace it, or choose another path.`));
113
116
  }
114
117
  return { fsPath, exists };
115
118
  }
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
package/dist/recipes.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * it's **free** (MIT, shipped in the server), and it sits **over typed,
8
8
  * schema-validated, undoable tools** — so the contract is executed by the
9
9
  * server, not merely described in prose the model might misapply. Recipes are
10
- * discoverable via MCP `prompts/list`; they add **no tools** (the 294-tool
10
+ * discoverable via MCP `prompts/list`; they add **no tools** (the 295-tool
11
11
  * count is unchanged) and cost nothing until a client pulls one.
12
12
  */
13
13
  import { z } from "zod";
@@ -114,7 +114,7 @@ export function registerRecipes(server) {
114
114
  return recipe("Golden-image regression check for a scene.", [
115
115
  `Goal: lock a scene's look to a golden image at ${ref} and catch visual drift.`,
116
116
  "",
117
- `1. Establish the golden (first run only): godot_run_managed, drive the game to the state under test (runtime_inject_input / runtime_call_method), then runtime_screenshot and save the frame to ${ref}. Commit it (vcs_add) so it's the reference, then godot_stop — this recipe runs the game more than once, and a game left running holds the runtime bridge port, so the next run is refused.`,
117
+ `1. Establish the golden (first run only): godot_run_managed, drive the game to the state under test (runtime_inject_input / runtime_call_method), then call runtime_screenshot_save {path: ${ref}} to write the frame. Commit it (vcs_add) so it's the reference, then godot_stop — this recipe runs the game more than once, and a game left running holds the runtime bridge port, so the next run is refused.`,
118
118
  `2. Regression run (every time after): godot_run_managed, reproduce the same state, then runtime_screenshot_diff against ${ref} with tolerance ${tol} (pass a region to ignore volatile HUD areas). ok:true means no meaningful drift. godot_stop when the diff is in hand.`,
119
119
  "3. On failure: the diff returns diff_ratio + differing_pixels — don't just eyeball it. runtime_get_tree / runtime_assert_node_state to find the node that changed, or dbg_* to break where the offending value is set. Update the golden deliberately (re-do step 1) only once you've confirmed the change is intended.",
120
120
  "",
@@ -189,7 +189,7 @@ export function registerRecipes(server) {
189
189
  `1. Boot + freeze: godot_run_project. runtime_time_scale{scale:0} to FREEZE the game (this pauses the SceneTree, so nothing advances on its own). If the run uses randomness, runtime_seed_rng{seed:...} first so the whole playtest is reproducible.`,
190
190
  `2. Baseline: runtime_state_digest{root:"${root}"} to snapshot the frozen state (positions / visibility / modulate, stable-ordered) — this is your deterministic "before".`,
191
191
  `3. Step: runtime_step_frames{frames:${frames}, kind:"physics"} to advance EXACTLY ${frames} frames while frozen (use kind:"both" to also tick _process each step). The game stays frozen afterwards, so your reads are stable.`,
192
- `4. Assert: runtime_state_digest{root:"${root}"} (or runtime_assert_node_state) that the node reached the expected, frame-exact state, then runtime_screenshot_diff against ${ref} with tolerance ${tol} — because you stepped a fixed number of frames the frame is reproducible, so the diff is stable (establish ${ref} once with runtime_screenshot on the first green run, then vcs_add it).`,
192
+ `4. Assert: runtime_state_digest{root:"${root}"} (or runtime_assert_node_state) that the node reached the expected, frame-exact state, then runtime_screenshot_diff against ${ref} with tolerance ${tol} — because you stepped a fixed number of frames the frame is reproducible, so the diff is stable (establish ${ref} once with runtime_screenshot_save on the first green run, then vcs_add it).`,
193
193
  `5. Iterate or thaw: repeat 3–4 to walk frame-by-frame (every step is deterministic), or runtime_time_scale{scale:1} to thaw and resume normal play. godot_stop when done. On a failed assert you are one dbg_set_breakpoints + dbg_launch away from the exact value that diverged.`,
194
194
  "",
195
195
  "Why this beats run-screenshot-guess: freezing plus fixed-frame stepping converts a timing-dependent check into a frame-exact, reproducible one the runtime_assert_* family can verify — the R tier of the W/R/E model, made deterministic.",