unity-open-mcp 0.9.0 → 1.0.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 (89) hide show
  1. package/dist/asmdef-discovery.d.ts +35 -0
  2. package/dist/asmdef-discovery.js +171 -0
  3. package/dist/asmdef-discovery.js.map +1 -0
  4. package/dist/batch-spawn.d.ts +1 -0
  5. package/dist/batch-spawn.js +78 -1
  6. package/dist/batch-spawn.js.map +1 -1
  7. package/dist/capabilities/intent-groups.js +42 -0
  8. package/dist/capabilities/intent-groups.js.map +1 -1
  9. package/dist/capabilities/rule-catalog.js +7 -1
  10. package/dist/capabilities/rule-catalog.js.map +1 -1
  11. package/dist/capabilities/tool-groups.js +37 -2
  12. package/dist/capabilities/tool-groups.js.map +1 -1
  13. package/dist/constants.d.ts +21 -1
  14. package/dist/constants.js +21 -1
  15. package/dist/constants.js.map +1 -1
  16. package/dist/event-stream.d.ts +13 -3
  17. package/dist/event-stream.js +77 -12
  18. package/dist/event-stream.js.map +1 -1
  19. package/dist/live-client.d.ts +17 -0
  20. package/dist/live-client.js +122 -5
  21. package/dist/live-client.js.map +1 -1
  22. package/dist/offline/api.js +82 -30
  23. package/dist/offline/api.js.map +1 -1
  24. package/dist/offline/index-builders.d.ts +9 -0
  25. package/dist/offline/index-builders.js +58 -8
  26. package/dist/offline/index-builders.js.map +1 -1
  27. package/dist/offline/parse.js +5 -1
  28. package/dist/offline/parse.js.map +1 -1
  29. package/dist/process-diagnostics.d.ts +100 -19
  30. package/dist/process-diagnostics.js +167 -59
  31. package/dist/process-diagnostics.js.map +1 -1
  32. package/dist/project-settings.d.ts +36 -0
  33. package/dist/project-settings.js +96 -0
  34. package/dist/project-settings.js.map +1 -0
  35. package/dist/running-unity.d.ts +23 -0
  36. package/dist/running-unity.js +60 -0
  37. package/dist/running-unity.js.map +1 -1
  38. package/dist/stale-assembly-cache.d.ts +40 -0
  39. package/dist/stale-assembly-cache.js +76 -0
  40. package/dist/stale-assembly-cache.js.map +1 -0
  41. package/dist/tool-router.d.ts +39 -1
  42. package/dist/tool-router.js +397 -62
  43. package/dist/tool-router.js.map +1 -1
  44. package/dist/tools/capture-inline.js +4 -3
  45. package/dist/tools/capture-inline.js.map +1 -1
  46. package/dist/tools/editor-status.js +7 -2
  47. package/dist/tools/editor-status.js.map +1 -1
  48. package/dist/tools/execute-csharp.js +25 -2
  49. package/dist/tools/execute-csharp.js.map +1 -1
  50. package/dist/tools/index.d.ts +1 -0
  51. package/dist/tools/index.js +34 -0
  52. package/dist/tools/index.js.map +1 -1
  53. package/dist/tools/inputsim-key.d.ts +40 -0
  54. package/dist/tools/inputsim-key.js +72 -0
  55. package/dist/tools/inputsim-key.js.map +1 -0
  56. package/dist/tools/inputsim-pointer.d.ts +40 -0
  57. package/dist/tools/inputsim-pointer.js +121 -0
  58. package/dist/tools/inputsim-pointer.js.map +1 -0
  59. package/dist/tools/inputsim-pointer3d.d.ts +40 -0
  60. package/dist/tools/inputsim-pointer3d.js +55 -0
  61. package/dist/tools/inputsim-pointer3d.js.map +1 -0
  62. package/dist/tools/inputsim-probe.d.ts +40 -0
  63. package/dist/tools/inputsim-probe.js +43 -0
  64. package/dist/tools/inputsim-probe.js.map +1 -0
  65. package/dist/tools/inputsim-step.d.ts +40 -0
  66. package/dist/tools/inputsim-step.js +50 -0
  67. package/dist/tools/inputsim-step.js.map +1 -0
  68. package/dist/tools/inputsim-touch.d.ts +40 -0
  69. package/dist/tools/inputsim-touch.js +83 -0
  70. package/dist/tools/inputsim-touch.js.map +1 -0
  71. package/dist/tools/memory-snapshot-capture.js +11 -5
  72. package/dist/tools/memory-snapshot-capture.js.map +1 -1
  73. package/dist/tools/pull-events.js +18 -10
  74. package/dist/tools/pull-events.js.map +1 -1
  75. package/dist/tools/read-compile-errors.js +10 -2
  76. package/dist/tools/read-compile-errors.js.map +1 -1
  77. package/dist/tools/resource-pressure.js +21 -10
  78. package/dist/tools/resource-pressure.js.map +1 -1
  79. package/dist/tools/screenshot-window.js +18 -12
  80. package/dist/tools/screenshot-window.js.map +1 -1
  81. package/dist/tools/screenshot.js +13 -6
  82. package/dist/tools/screenshot.js.map +1 -1
  83. package/dist/tools/visual-compare.d.ts +40 -0
  84. package/dist/tools/visual-compare.js +98 -0
  85. package/dist/tools/visual-compare.js.map +1 -0
  86. package/dist/unity-log.d.ts +51 -2
  87. package/dist/unity-log.js +152 -5
  88. package/dist/unity-log.js.map +1 -1
  89. package/package.json +1 -1
@@ -0,0 +1,40 @@
1
+ export declare const inputsimKey: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };
@@ -0,0 +1,72 @@
1
+ // Input simulation — Input System keyboard device events.
2
+ //
3
+ // Compile-gated on com.unity.inputsystem (UNITY_OPEN_MCP_EXT_INPUTSIM_IS).
4
+ // Queues Keyboard state events through the new Input System.
5
+ //
6
+ // K1 fix: `tap`/`hold` accept `advance_frames` to pump N player-loop frames
7
+ // BETWEEN down and up, so polling game code (Keyboard.current[Key.Space]
8
+ // .wasPressedThisFrame) can observe the press. Without `advance_frames`, both
9
+ // updates run in one synchronous call and no MonoBehaviour.Update ticks while
10
+ // the key is down — the press is invisible to polling code (callback-driven
11
+ // InputAction.performed still fires). For polling input, pass advance_frames ≥ 1
12
+ // (or use `down`, inputsim_step, `up`).
13
+ //
14
+ // K3 doc: `up` queues an EMPTY KeyboardState, releasing EVERY held key (the
15
+ // named key, mods, and any key held by a prior `down`) — per-key release would
16
+ // require cross-call state. This is documented, not silent.
17
+ //
18
+ // Play-mode only. Gate-free. Does NOT cover legacy UnityEngine.Input.
19
+ import { makeTool } from "./schema-fragments.js";
20
+ export const inputsimKey = makeTool("unity_open_mcp_inputsim_key", "Queue a keyboard event through the Input System (Keyboard.current) during " +
21
+ "play mode. Covers gameplay reading Keyboard.current / Key enum / " +
22
+ "InputAction.performed. `key` accepts a Unity Key enum name ('Space', 'W', " +
23
+ "'LeftArrow', 'Digit1') or a single character ('a', '1'). " +
24
+ "POLLING vs CALLBACK: without `advance_frames`, down+up process in a single " +
25
+ "InputSystem.Update and no MonoBehaviour.Update runs between them — so polling " +
26
+ "code (wasPressedThisFrame) CANNOT see a `tap`/`hold`; only callback-driven " +
27
+ "InputAction.performed fires. Pass `advance_frames` ≥ 1 to pump that many " +
28
+ "player-loop frames between down and up so polling code observes the press " +
29
+ "(or split into `down` → inputsim_step → `up`). `up` releases ALL held keys " +
30
+ "(the named key + mods + anything held by a prior `down`), since per-key " +
31
+ "release would require cross-call state. Play-mode only — refuses with " +
32
+ "`play_mode_required` otherwise. Gate-free. Requires com.unity.inputsystem. " +
33
+ "Does NOT cover legacy UnityEngine.Input.", {
34
+ required: ["action", "key"],
35
+ properties: {
36
+ action: {
37
+ type: "string",
38
+ enum: ["down", "up", "tap", "hold"],
39
+ description: "down = key pressed (queued, processed next InputSystem.Update); up = " +
40
+ "release ALL held keys (see tool description); tap = down+up (only visible " +
41
+ "to callback-driven input unless advance_frames ≥ 1); hold = down+up after " +
42
+ "advancing frames (so Hold interactions with a duration threshold can fire).",
43
+ },
44
+ key: {
45
+ type: "string",
46
+ description: "Unity Key enum name ('Space', 'W', 'LeftArrow', 'Digit1', 'F1') OR a " +
47
+ "single character ('a', '1', '!'). Resolved case-insensitively against " +
48
+ "UnityEngine.InputSystem.LowLevel.Key first, then as a character key.",
49
+ },
50
+ duration_ms: {
51
+ type: "integer",
52
+ default: 100,
53
+ description: "Recorded hold duration in milliseconds (for action='hold'). The real " +
54
+ "held-time gate is the number of advanced frames, not wall-clock — pair " +
55
+ "with advance_frames for Input System Hold interactions. Default 100.",
56
+ },
57
+ advance_frames: {
58
+ type: "integer",
59
+ default: 0,
60
+ minimum: 0,
61
+ maximum: 60,
62
+ description: "Pump this many player-loop frames (EditorApplication.Step) BETWEEN down " +
63
+ "and up so polling game code observes the press. 0 (default) keeps the " +
64
+ "old single-update behavior (only callback-driven input sees it). Cap 60. " +
65
+ "For polling input (wasPressedThisFrame) pass ≥ 1.",
66
+ },
67
+ shift: { type: "boolean", default: false, description: "Also hold Left Shift. Default false." },
68
+ ctrl: { type: "boolean", default: false, description: "Also hold Left Ctrl. Default false." },
69
+ alt: { type: "boolean", default: false, description: "Also hold Left Alt. Default false." },
70
+ },
71
+ });
72
+ //# sourceMappingURL=inputsim-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputsim-key.js","sourceRoot":"","sources":["../../src/tools/inputsim-key.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,iFAAiF;AACjF,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,4DAA4D;AAC5D,EAAE;AACF,sEAAsE;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CACjC,6BAA6B,EAC7B,4EAA4E;IAC1E,mEAAmE;IACnE,4EAA4E;IAC5E,2DAA2D;IAC3D,6EAA6E;IAC7E,gFAAgF;IAChF,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,wEAAwE;IACxE,6EAA6E;IAC7E,0CAA0C,EAC5C;IACE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC3B,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;YACnC,WAAW,EACT,uEAAuE;gBACvE,4EAA4E;gBAC5E,4EAA4E;gBAC5E,6EAA6E;SAChF;QACD,GAAG,EAAE;YACH,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,uEAAuE;gBACvE,wEAAwE;gBACxE,sEAAsE;SACzE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG;YACZ,WAAW,EACT,uEAAuE;gBACvE,yEAAyE;gBACzE,sEAAsE;SACzE;QACD,cAAc,EAAE;YACd,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE;YACX,WAAW,EACT,0EAA0E;gBAC1E,wEAAwE;gBACxE,2EAA2E;gBAC3E,mDAAmD;SACtD;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC/F,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC7F,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,oCAAoC,EAAE;KAC5F;CACF,CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const inputsimPointer: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };
@@ -0,0 +1,121 @@
1
+ // Input simulation — uGUI pointer dispatch (EventSystem + ExecuteEvents).
2
+ //
3
+ // Compile-gated on com.unity.ugui in the bridge (UNITY_OPEN_MCP_EXT_INPUTSIM_UGUI).
4
+ // The workhorse for "click/swipe/drag a named object" during play mode.
5
+ //
6
+ // Resolution precedence: object_id > target > screen_x/screen_y.
7
+ // - object_id: a handle from scene_get_data / inputsim_probe, resolved via
8
+ // InstanceId (long, EntityId-safe on Unity 6000.5+). The most reliable way to
9
+ // address a specific object when names are ambiguous.
10
+ // - target: GameObject name or slash-path. Duplicate detection returns
11
+ // `ambiguous_target` with candidate paths; trailing-segment match lets a path
12
+ // inside an instantiated prefab resolve without the full scene-root path.
13
+ // - screen_x/screen_y: raycasts through EventSystem.current.RaycastAll.
14
+ //
15
+ // The response carries honesty fields — `interactable`, `blockedBy`, `dropTarget`
16
+ // — so a click on a disabled button or behind a modal is never reported as an
17
+ // unqualified ok. Dispatch still happens either way (occlusion-skipping is a
18
+ // feature for reaching things a raycast would miss); the fields let the agent
19
+ // judge whether the interaction was actually possible.
20
+ //
21
+ // Play-mode only (play_mode_required otherwise). Gate-free (writes no assets).
22
+ // Pair with inputsim_step to advance frames between the interaction and a
23
+ // screenshot so tweens/animations settle before you look.
24
+ import { makeTool } from "./schema-fragments.js";
25
+ export const inputsimPointer = makeTool("unity_open_mcp_inputsim_pointer", "Simulate a uGUI pointer interaction on a named GameObject or screen point " +
26
+ "during play mode, via the EventSystem + ExecuteEvents. Resolution precedence: " +
27
+ "object_id (a handle from scene_get_data / inputsim_probe) > target (name or " +
28
+ "slash-path, with duplicate detection + partial-path match) > screen_x/screen_y " +
29
+ "(raycasts through EventSystem.current). The response reports `interactable`, " +
30
+ "`blockedBy`, and (for drag) `dropTarget`/`dropLanded` so a click on a disabled " +
31
+ "button or behind a modal is never a silent ok. Play-mode only — refuses with " +
32
+ "`play_mode_required` otherwise; pair with editor_set_state to enter play mode " +
33
+ "and inputsim_step to advance frames before a screenshot. Gate-free. Requires " +
34
+ "com.unity.ugui.", {
35
+ required: ["action"],
36
+ properties: {
37
+ action: {
38
+ type: "string",
39
+ enum: ["click", "double_click", "press", "release", "hover", "hover_exit", "submit", "drag"],
40
+ description: "Pointer action. click = down+up+click (IPointerClickHandler); " +
41
+ "double_click = two triples with clickCount incrementing (so handlers " +
42
+ "reading eventData.clickCount==2 fire); press = pointer down only; " +
43
+ "release = pointer up only; hover = pointer Enter ONLY (so tooltip/" +
44
+ "highlight state can be screenshotted); hover_exit = pointer Exit (the " +
45
+ "pair); submit = ISubmitHandler (keyboard-style activate); drag = " +
46
+ "pointerDown → beginDrag → drag×N → pointerUp → drop (on the to-point " +
47
+ "target) → endDrag, matching uGUI's release order, with IDropHandler " +
48
+ "fired on the drop target.",
49
+ },
50
+ object_id: {
51
+ type: "string",
52
+ description: "InstanceId of the GameObject to dispatch on (from scene_get_data or " +
53
+ "inputsim_probe), as a quoted string. The most reliable addressing when " +
54
+ "names are ambiguous. Wins over target and screen_x/screen_y. On Unity " +
55
+ "6000.5+ this is an EntityId that can exceed 2^53, so pass it as a " +
56
+ "string to stay precise (the bridge accepts a quoted string or a bare " +
57
+ "number).",
58
+ },
59
+ target: {
60
+ type: "string",
61
+ description: "GameObject name ('StartButton') or slash-path ('Canvas/Panel/StartButton'). " +
62
+ "Path matching is trailing-segment aware, so 'Panel/Button' matches a " +
63
+ "nested prefab without knowing the scene root. When a name matches more " +
64
+ "than one active object the tool returns `ambiguous_target` with candidate " +
65
+ "paths — pass the full path or an object_id. Dispatched directly via " +
66
+ "ExecuteEvents.ExecuteHierarchy, so it fires even if the target is " +
67
+ "occluded (the response `blockedBy` field reports that case).",
68
+ },
69
+ screen_x: {
70
+ type: "number",
71
+ description: "Screen X (pixels) for the screen-point fallback path. Raycasts through " +
72
+ "EventSystem.current.RaycastAll and dispatches to the top hit. Pair with " +
73
+ "screen_y; omitted when object_id/target is given.",
74
+ },
75
+ screen_y: {
76
+ type: "number",
77
+ description: "Screen Y (pixels) for the screen-point fallback path. Pair with screen_x.",
78
+ },
79
+ view: {
80
+ type: "string",
81
+ enum: ["game", "scene"],
82
+ default: "game",
83
+ description: "Reserved for a future scene-view path; currently only the game view " +
84
+ "(Camera.main / canvas camera) is used to resolve screen points. Default 'game'.",
85
+ },
86
+ button: {
87
+ type: "string",
88
+ enum: ["left", "right", "middle"],
89
+ default: "left",
90
+ description: "Pointer button reported in PointerEventData. Default 'left'.",
91
+ },
92
+ drag_steps: {
93
+ type: "integer",
94
+ default: 8,
95
+ minimum: 1,
96
+ maximum: 100,
97
+ description: "Number of interpolated move events between drag endpoints. Each step " +
98
+ "runs a full EventSystem.RaycastAll, so this is capped at 100 to bound " +
99
+ "main-thread cost. The full begin/drag×N/pointerUp/drop/endDrag sequence " +
100
+ "dispatches in one frame (use inputsim_step afterward to let drag-driven " +
101
+ "tweens settle). Default 8.",
102
+ },
103
+ from_target: {
104
+ type: "string",
105
+ description: "Drag start — target name/path. When supplied, takes precedence over " +
106
+ "from_x/from_y; passing BOTH forms returns `both_endpoint_forms` (the " +
107
+ "explicit, non-silent precedence rule).",
108
+ },
109
+ from_x: { type: "number", description: "Drag start — screen X (alternative to from_target)." },
110
+ from_y: { type: "number", description: "Drag start — screen Y (alternative to from_target)." },
111
+ to_target: {
112
+ type: "string",
113
+ description: "Drag end / drop site — target name/path. When supplied, takes precedence " +
114
+ "over to_x/to_y; passing BOTH returns `both_endpoint_forms`. The drop " +
115
+ "target receives IDropHandler.OnDrop.",
116
+ },
117
+ to_x: { type: "number", description: "Drag end — screen X (alternative to to_target)." },
118
+ to_y: { type: "number", description: "Drag end — screen Y (alternative to to_target)." },
119
+ },
120
+ });
121
+ //# sourceMappingURL=inputsim-pointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputsim-pointer.js","sourceRoot":"","sources":["../../src/tools/inputsim-pointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const inputsimPointer3d: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };
@@ -0,0 +1,55 @@
1
+ // Input simulation — 3D / legacy world-space pointer (M3).
2
+ //
3
+ // Reaches physics-collider gameplay and old-Input-Manager code that
4
+ // inputsim_pointer (uGUI ExecuteEvents) cannot. Mechanics: Physics.Raycast from
5
+ // the screen → SendMessage("OnMouseDown"/"OnMouseUp"/"OnMouseUpAsButton"/
6
+ // "OnMouseDrag"). No package dependency beyond built-in UnityEngine.Physics.
7
+ // Gate-free, play-mode-only. Compile-gated on com.unity.ugui (shares the uGUI
8
+ // sub-asmdef for target/screen resolution helpers, though it uses neither
9
+ // EventSystem nor uGUI types at the dispatch path).
10
+ import { makeTool } from "./schema-fragments.js";
11
+ export const inputsimPointer3d = makeTool("unity_open_mcp_inputsim_pointer3d", "Simulate a world-space / legacy mouse interaction during play mode by " +
12
+ "raycasting from the screen point through Camera.main and SendMessage-ing the " +
13
+ "OnMouseDown / OnMouseUp / OnMouseUpAsButton / OnMouseDrag magic methods on " +
14
+ "the hit collider. Reaches physics gameplay and old-Input-Manager code that " +
15
+ "inputsim_pointer (uGUI ExecuteEvents) cannot — the only way to drive " +
16
+ "world-space gameplay in a project running the legacy Input Manager. " +
17
+ "Resolution: object_id > target > screen_x/screen_y (same as inputsim_pointer). " +
18
+ "Play-mode only — refuses with `play_mode_required` otherwise. Gate-free. " +
19
+ "Requires a tagged MainCamera in the scene.", {
20
+ required: ["action"],
21
+ properties: {
22
+ action: {
23
+ type: "string",
24
+ enum: ["click", "down", "up", "drag"],
25
+ description: "click = OnMouseDown + OnMouseUpAsButton + OnMouseUp; down = OnMouseDown; " +
26
+ "up = OnMouseUp; drag = OnMouseDown + OnMouseDrag×drag_steps + OnMouseUp " +
27
+ "(requires to_x/to_y).",
28
+ },
29
+ object_id: {
30
+ type: "string",
31
+ description: "InstanceId of a GameObject used to refine the screen point (its center " +
32
+ "is raycast), as a quoted string. The actual target is whatever the ray " +
33
+ "hits at that point. Wins over target and screen_x/screen_y. Pass as a " +
34
+ "string to stay precise on Unity 6000.5+ where an EntityId can exceed " +
35
+ "2^53 (the bridge accepts a quoted string or a bare number).",
36
+ },
37
+ target: {
38
+ type: "string",
39
+ description: "GameObject name/path used to refine the screen point. Alternative to object_id/screen.",
40
+ },
41
+ screen_x: { type: "number", description: "Screen X (pixels) to raycast from. Pair with screen_y." },
42
+ screen_y: { type: "number", description: "Screen Y (pixels) to raycast from. Pair with screen_x." },
43
+ to_x: { type: "number", description: "Drag end — screen X (action: drag only). Pair with to_y." },
44
+ to_y: { type: "number", description: "Drag end — screen Y (action: drag only). Pair with to_x." },
45
+ drag_steps: {
46
+ type: "integer",
47
+ default: 8,
48
+ minimum: 1,
49
+ maximum: 100,
50
+ description: "Number of OnMouseDrag calls between from and to (action: drag). Capped at " +
51
+ "100 to bound main-thread cost. Default 8.",
52
+ },
53
+ },
54
+ });
55
+ //# sourceMappingURL=inputsim-pointer3d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputsim-pointer3d.js","sourceRoot":"","sources":["../../src/tools/inputsim-pointer3d.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,oEAAoE;AACpE,gFAAgF;AAChF,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,oDAAoD;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CACvC,mCAAmC,EACnC,wEAAwE;IACtE,+EAA+E;IAC/E,6EAA6E;IAC7E,6EAA6E;IAC7E,uEAAuE;IACvE,sEAAsE;IACtE,iFAAiF;IACjF,2EAA2E;IAC3E,4CAA4C,EAC9C;IACE,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;YACrC,WAAW,EACT,2EAA2E;gBAC3E,0EAA0E;gBAC1E,uBAAuB;SAC1B;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,yEAAyE;gBACzE,yEAAyE;gBACzE,wEAAwE;gBACxE,uEAAuE;gBACvE,6DAA6D;SAChE;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,wFAAwF;SACtG;QACD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;QACnG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;QACnG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;QACjG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;QACjG,UAAU,EAAE;YACV,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,GAAG;YACZ,WAAW,EACT,4EAA4E;gBAC5E,2CAA2C;SAC9C;KACF;CACF,CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const inputsimProbe: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };
@@ -0,0 +1,43 @@
1
+ // Input simulation — interactable discovery (M2).
2
+ //
3
+ // Turns the surface self-sufficient: the testing loop becomes
4
+ // probe → click by path → step → screenshot
5
+ // instead of screenshot → guess a name → target_not_found → guess again.
6
+ // Lists active uGUI interactables (IPointer*Handler / IDragHandler / IDropHandler /
7
+ // ISubmitHandler / Selectable) with hierarchy path, screen rect, interactable
8
+ // flag, instanceId, and whether anything occludes their center.
9
+ //
10
+ // Read-only. Works in edit mode AND play mode (use it to build a click plan
11
+ // before entering play mode). Compile-gated on com.unity.ugui.
12
+ import { makeTool } from "./schema-fragments.js";
13
+ export const inputsimProbe = makeTool("unity_open_mcp_inputsim_probe", "List active uGUI interactables (objects with IPointer*Handler / IDragHandler / " +
14
+ "IDropHandler / ISubmitHandler / Selectable) so an agent can build a click plan " +
15
+ "without guessing names. Each entry carries: hierarchy path, name, instanceId " +
16
+ "(pass it to inputsim_pointer.object_id for unambiguous targeting), screen " +
17
+ "rect, interactable (false when the Selectable or an ancestor CanvasGroup " +
18
+ "disables it), and occluded (true when something else raycast-hits in front of " +
19
+ "the element's center — play mode only). Read-only; works in edit mode and play " +
20
+ "mode. The intended loop: probe → inputsim_pointer (object_id) → inputsim_step " +
21
+ "→ screenshot. Requires com.unity.ugui.", {
22
+ required: [],
23
+ properties: {
24
+ page_size: {
25
+ type: "integer",
26
+ default: 50,
27
+ minimum: 1,
28
+ maximum: 200,
29
+ description: "Max entries per page. Default 50, hard cap 200.",
30
+ },
31
+ cursor: {
32
+ type: "string",
33
+ description: "Opaque pagination cursor from a previous response's pagination.next_cursor. " +
34
+ "Omit on the first call.",
35
+ },
36
+ scene: {
37
+ type: "string",
38
+ description: "Optional loaded-scene name filter — only enumerate interactables in this " +
39
+ "scene. Omit to enumerate across all loaded scenes.",
40
+ },
41
+ },
42
+ });
43
+ //# sourceMappingURL=inputsim-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputsim-probe.js","sourceRoot":"","sources":["../../src/tools/inputsim-probe.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,8DAA8D;AAC9D,8CAA8C;AAC9C,yEAAyE;AACzE,oFAAoF;AACpF,8EAA8E;AAC9E,gEAAgE;AAChE,EAAE;AACF,4EAA4E;AAC5E,+DAA+D;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CACnC,+BAA+B,EAC/B,iFAAiF;IAC/E,iFAAiF;IACjF,+EAA+E;IAC/E,4EAA4E;IAC5E,2EAA2E;IAC3E,gFAAgF;IAChF,iFAAiF;IACjF,gFAAgF;IAChF,wCAAwC,EAC1C;IACE,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,GAAG;YACZ,WAAW,EAAE,iDAAiD;SAC/D;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,8EAA8E;gBAC9E,yBAAyB;SAC5B;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,2EAA2E;gBAC3E,oDAAoD;SACvD;KACF;CACF,CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const inputsimStep: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };
@@ -0,0 +1,50 @@
1
+ // Input simulation — frame advance. The missing middle of the play-mode
2
+ // testing loop: inject input (inputsim_pointer / _key / _touch), then advance N
3
+ // frames so gameplay MonoBehaviour.Update / coroutines / tweens run, THEN
4
+ // screenshot. Without this, a click that opens a panel with a 0.3s tween
5
+ // screenshots as the old panel.
6
+ //
7
+ // Also the fix for K1/K2/`hold`: a synchronous tool cannot otherwise let a key
8
+ // press or swipe be observed by polling game code. `step` lets the documented
9
+ // `down → advance → up` workflow actually work.
10
+ //
11
+ // Implementation: EditorApplication.Step() is synchronous — it runs one full
12
+ // player-loop frame inline (Update/FixedUpdate/coroutines/render) before
13
+ // returning, so a tight loop pumps N frames within one tool dispatch. Unlike
14
+ // QueuePlayerLoopUpdate + Thread.Sleep (documented broken elsewhere in the
15
+ // bridge — the sleeping thread is the one that would service the update), Step
16
+ // does not deadlock. Play-mode only (no-op in edit mode → play_mode_required).
17
+ import { makeTool } from "./schema-fragments.js";
18
+ export const inputsimStep = makeTool("unity_open_mcp_inputsim_step", "Advance the Unity play-mode player loop by N frames, then return. Pump the " +
19
+ "frames synchronously via EditorApplication.Step (each Step runs one full " +
20
+ "Update/FixedUpdate/coroutines/render cycle inline). Use between an input " +
21
+ "injection (inputsim_pointer / _key / _touch) and a screenshot so gameplay " +
22
+ "code, tweens, and animations actually run before you look — and so polling " +
23
+ "game code (`wasPressedThisFrame`, per-frame touch delta) can observe a " +
24
+ "press/swipe injected with inputsim_key/_touch (which otherwise process in a " +
25
+ "single InputSystem.Update and are invisible to polling). Play-mode only — " +
26
+ "refuses with `play_mode_required` otherwise (Step is a no-op in edit mode). " +
27
+ "Gate-free (writes no assets). Cap 60 frames per call to bound dispatch cost; " +
28
+ "for longer advances, call repeatedly.", {
29
+ required: [],
30
+ properties: {
31
+ frames: {
32
+ type: "integer",
33
+ default: 1,
34
+ minimum: 0,
35
+ maximum: 60,
36
+ description: "Number of player-loop frames to advance. Default 1. Hard cap 60 to " +
37
+ "bound dispatch cost (each frame is a full Update cycle). 0 is allowed " +
38
+ "and useful as a pure settle tick (one QueuePlayerLoopUpdate).",
39
+ },
40
+ settle_ms: {
41
+ type: "integer",
42
+ default: 0,
43
+ minimum: 0,
44
+ description: "Optional extra wall-clock settle in milliseconds AFTER stepping, as a " +
45
+ "single QueuePlayerLoopUpdate (lets one more render tick land before a " +
46
+ "screenshot). Default 0 (no extra tick).",
47
+ },
48
+ },
49
+ });
50
+ //# sourceMappingURL=inputsim-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputsim-step.js","sourceRoot":"","sources":["../../src/tools/inputsim-step.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,gFAAgF;AAChF,0EAA0E;AAC1E,yEAAyE;AACzE,gCAAgC;AAChC,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,+EAA+E;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAClC,8BAA8B,EAC9B,6EAA6E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,8EAA8E;IAC9E,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,uCAAuC,EACzC;IACE,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE;YACX,WAAW,EACT,qEAAqE;gBACrE,wEAAwE;gBACxE,+DAA+D;SAClE;QACD,SAAS,EAAE;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,WAAW,EACT,wEAAwE;gBACxE,wEAAwE;gBACxE,yCAAyC;SAC5C;KACF;CACF,CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const inputsimTouch: {
2
+ inputSchema: {
3
+ [x: string]: unknown;
4
+ type: "object";
5
+ properties?: {
6
+ [x: string]: object;
7
+ } | undefined;
8
+ required?: string[] | undefined;
9
+ };
10
+ name: string;
11
+ description?: string | undefined;
12
+ outputSchema?: {
13
+ [x: string]: unknown;
14
+ type: "object";
15
+ properties?: {
16
+ [x: string]: object;
17
+ } | undefined;
18
+ required?: string[] | undefined;
19
+ } | undefined;
20
+ annotations?: {
21
+ title?: string | undefined;
22
+ readOnlyHint?: boolean | undefined;
23
+ destructiveHint?: boolean | undefined;
24
+ idempotentHint?: boolean | undefined;
25
+ openWorldHint?: boolean | undefined;
26
+ } | undefined;
27
+ execution?: {
28
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
29
+ } | undefined;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ icons?: {
34
+ src: string;
35
+ mimeType?: string | undefined;
36
+ sizes?: string[] | undefined;
37
+ theme?: "light" | "dark" | undefined;
38
+ }[] | undefined;
39
+ title?: string | undefined;
40
+ };