unity-open-mcp 0.1.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 (630) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +145 -0
  3. package/dist/batch-spawn.d.ts +33 -0
  4. package/dist/batch-spawn.js +329 -0
  5. package/dist/batch-spawn.js.map +1 -0
  6. package/dist/capabilities/build-capabilities.d.ts +155 -0
  7. package/dist/capabilities/build-capabilities.js +475 -0
  8. package/dist/capabilities/build-capabilities.js.map +1 -0
  9. package/dist/capabilities/list-rules.d.ts +45 -0
  10. package/dist/capabilities/list-rules.js +121 -0
  11. package/dist/capabilities/list-rules.js.map +1 -0
  12. package/dist/capabilities/rule-catalog.d.ts +44 -0
  13. package/dist/capabilities/rule-catalog.js +330 -0
  14. package/dist/capabilities/rule-catalog.js.map +1 -0
  15. package/dist/capabilities/tool-groups.d.ts +53 -0
  16. package/dist/capabilities/tool-groups.js +396 -0
  17. package/dist/capabilities/tool-groups.js.map +1 -0
  18. package/dist/cli/args.d.ts +36 -0
  19. package/dist/cli/args.js +239 -0
  20. package/dist/cli/args.js.map +1 -0
  21. package/dist/cli/cli.d.ts +23 -0
  22. package/dist/cli/cli.js +125 -0
  23. package/dist/cli/cli.js.map +1 -0
  24. package/dist/cli/commands.d.ts +37 -0
  25. package/dist/cli/commands.js +277 -0
  26. package/dist/cli/commands.js.map +1 -0
  27. package/dist/cli/ping-poller.d.ts +81 -0
  28. package/dist/cli/ping-poller.js +161 -0
  29. package/dist/cli/ping-poller.js.map +1 -0
  30. package/dist/compat.d.ts +32 -0
  31. package/dist/compat.js +121 -0
  32. package/dist/compat.js.map +1 -0
  33. package/dist/compiler-errors.d.ts +31 -0
  34. package/dist/compiler-errors.js +91 -0
  35. package/dist/compiler-errors.js.map +1 -0
  36. package/dist/compressible-router.d.ts +18 -0
  37. package/dist/compressible-router.js +191 -0
  38. package/dist/compressible-router.js.map +1 -0
  39. package/dist/compression/asset-model.d.ts +86 -0
  40. package/dist/compression/asset-model.js +15 -0
  41. package/dist/compression/asset-model.js.map +1 -0
  42. package/dist/compression/compact.d.ts +153 -0
  43. package/dist/compression/compact.js +501 -0
  44. package/dist/compression/compact.js.map +1 -0
  45. package/dist/dialog-dismiss.d.ts +197 -0
  46. package/dist/dialog-dismiss.js +533 -0
  47. package/dist/dialog-dismiss.js.map +1 -0
  48. package/dist/event-stream.d.ts +60 -0
  49. package/dist/event-stream.js +228 -0
  50. package/dist/event-stream.js.map +1 -0
  51. package/dist/gate-error.d.ts +18 -0
  52. package/dist/gate-error.js +11 -0
  53. package/dist/gate-error.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.js +146 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/instance-discovery.d.ts +117 -0
  58. package/dist/instance-discovery.js +202 -0
  59. package/dist/instance-discovery.js.map +1 -0
  60. package/dist/live-client.d.ts +68 -0
  61. package/dist/live-client.js +583 -0
  62. package/dist/live-client.js.map +1 -0
  63. package/dist/offline.d.ts +75 -0
  64. package/dist/offline.js +1495 -0
  65. package/dist/offline.js.map +1 -0
  66. package/dist/package-version.d.ts +8 -0
  67. package/dist/package-version.js +41 -0
  68. package/dist/package-version.js.map +1 -0
  69. package/dist/ping-cache.d.ts +15 -0
  70. package/dist/ping-cache.js +10 -0
  71. package/dist/ping-cache.js.map +1 -0
  72. package/dist/project-health.d.ts +52 -0
  73. package/dist/project-health.js +177 -0
  74. package/dist/project-health.js.map +1 -0
  75. package/dist/resource-router.d.ts +26 -0
  76. package/dist/resource-router.js +143 -0
  77. package/dist/resource-router.js.map +1 -0
  78. package/dist/resources/index.d.ts +6 -0
  79. package/dist/resources/index.js +40 -0
  80. package/dist/resources/index.js.map +1 -0
  81. package/dist/results.d.ts +14 -0
  82. package/dist/results.js +22 -0
  83. package/dist/results.js.map +1 -0
  84. package/dist/router.d.ts +5 -0
  85. package/dist/router.js +2 -0
  86. package/dist/router.js.map +1 -0
  87. package/dist/routers.d.ts +44 -0
  88. package/dist/routers.js +73 -0
  89. package/dist/routers.js.map +1 -0
  90. package/dist/schema-defaults.d.ts +10 -0
  91. package/dist/schema-defaults.js +43 -0
  92. package/dist/schema-defaults.js.map +1 -0
  93. package/dist/skill/client-paths.d.ts +33 -0
  94. package/dist/skill/client-paths.js +131 -0
  95. package/dist/skill/client-paths.js.map +1 -0
  96. package/dist/skill/generate-skill.d.ts +38 -0
  97. package/dist/skill/generate-skill.js +389 -0
  98. package/dist/skill/generate-skill.js.map +1 -0
  99. package/dist/tool-router.d.ts +40 -0
  100. package/dist/tool-router.js +778 -0
  101. package/dist/tool-router.js.map +1 -0
  102. package/dist/tool-session-state.d.ts +55 -0
  103. package/dist/tool-session-state.js +116 -0
  104. package/dist/tool-session-state.js.map +1 -0
  105. package/dist/tools/agent-capabilities.d.ts +2 -0
  106. package/dist/tools/agent-capabilities.js +24 -0
  107. package/dist/tools/agent-capabilities.js.map +1 -0
  108. package/dist/tools/animation-create.d.ts +2 -0
  109. package/dist/tools/animation-create.js +31 -0
  110. package/dist/tools/animation-create.js.map +1 -0
  111. package/dist/tools/animation-get-data.d.ts +2 -0
  112. package/dist/tools/animation-get-data.js +23 -0
  113. package/dist/tools/animation-get-data.js.map +1 -0
  114. package/dist/tools/animation-modify.d.ts +2 -0
  115. package/dist/tools/animation-modify.js +45 -0
  116. package/dist/tools/animation-modify.js.map +1 -0
  117. package/dist/tools/animator-create.d.ts +2 -0
  118. package/dist/tools/animator-create.js +31 -0
  119. package/dist/tools/animator-create.js.map +1 -0
  120. package/dist/tools/animator-get-data.d.ts +2 -0
  121. package/dist/tools/animator-get-data.js +23 -0
  122. package/dist/tools/animator-get-data.js.map +1 -0
  123. package/dist/tools/animator-modify.d.ts +2 -0
  124. package/dist/tools/animator-modify.js +51 -0
  125. package/dist/tools/animator-modify.js.map +1 -0
  126. package/dist/tools/apply-fix.d.ts +2 -0
  127. package/dist/tools/apply-fix.js +39 -0
  128. package/dist/tools/apply-fix.js.map +1 -0
  129. package/dist/tools/assets-copy.d.ts +2 -0
  130. package/dist/tools/assets-copy.js +50 -0
  131. package/dist/tools/assets-copy.js.map +1 -0
  132. package/dist/tools/assets-create-folder.d.ts +2 -0
  133. package/dist/tools/assets-create-folder.js +53 -0
  134. package/dist/tools/assets-create-folder.js.map +1 -0
  135. package/dist/tools/assets-delete.d.ts +2 -0
  136. package/dist/tools/assets-delete.js +34 -0
  137. package/dist/tools/assets-delete.js.map +1 -0
  138. package/dist/tools/assets-move.d.ts +2 -0
  139. package/dist/tools/assets-move.js +50 -0
  140. package/dist/tools/assets-move.js.map +1 -0
  141. package/dist/tools/assets-refresh.d.ts +2 -0
  142. package/dist/tools/assets-refresh.js +37 -0
  143. package/dist/tools/assets-refresh.js.map +1 -0
  144. package/dist/tools/baseline-create.d.ts +2 -0
  145. package/dist/tools/baseline-create.js +20 -0
  146. package/dist/tools/baseline-create.js.map +1 -0
  147. package/dist/tools/bridge-status.d.ts +2 -0
  148. package/dist/tools/bridge-status.js +44 -0
  149. package/dist/tools/bridge-status.js.map +1 -0
  150. package/dist/tools/build-get-active-target.d.ts +2 -0
  151. package/dist/tools/build-get-active-target.js +16 -0
  152. package/dist/tools/build-get-active-target.js.map +1 -0
  153. package/dist/tools/build-get-defines.d.ts +2 -0
  154. package/dist/tools/build-get-defines.js +16 -0
  155. package/dist/tools/build-get-defines.js.map +1 -0
  156. package/dist/tools/build-get-scenes.d.ts +2 -0
  157. package/dist/tools/build-get-scenes.js +16 -0
  158. package/dist/tools/build-get-scenes.js.map +1 -0
  159. package/dist/tools/build-get-targets.d.ts +2 -0
  160. package/dist/tools/build-get-targets.js +18 -0
  161. package/dist/tools/build-get-targets.js.map +1 -0
  162. package/dist/tools/build-set-defines.d.ts +2 -0
  163. package/dist/tools/build-set-defines.js +50 -0
  164. package/dist/tools/build-set-defines.js.map +1 -0
  165. package/dist/tools/build-set-scenes.d.ts +2 -0
  166. package/dist/tools/build-set-scenes.js +60 -0
  167. package/dist/tools/build-set-scenes.js.map +1 -0
  168. package/dist/tools/build-set-target.d.ts +2 -0
  169. package/dist/tools/build-set-target.js +49 -0
  170. package/dist/tools/build-set-target.js.map +1 -0
  171. package/dist/tools/build-start.d.ts +2 -0
  172. package/dist/tools/build-start.js +64 -0
  173. package/dist/tools/build-start.js.map +1 -0
  174. package/dist/tools/capture-inline.d.ts +2 -0
  175. package/dist/tools/capture-inline.js +57 -0
  176. package/dist/tools/capture-inline.js.map +1 -0
  177. package/dist/tools/checkpoint-create.d.ts +2 -0
  178. package/dist/tools/checkpoint-create.js +16 -0
  179. package/dist/tools/checkpoint-create.js.map +1 -0
  180. package/dist/tools/compile-check.d.ts +2 -0
  181. package/dist/tools/compile-check.js +26 -0
  182. package/dist/tools/compile-check.js.map +1 -0
  183. package/dist/tools/component-add.d.ts +2 -0
  184. package/dist/tools/component-add.js +47 -0
  185. package/dist/tools/component-add.js.map +1 -0
  186. package/dist/tools/component-destroy.d.ts +2 -0
  187. package/dist/tools/component-destroy.js +46 -0
  188. package/dist/tools/component-destroy.js.map +1 -0
  189. package/dist/tools/component-get.d.ts +2 -0
  190. package/dist/tools/component-get.js +54 -0
  191. package/dist/tools/component-get.js.map +1 -0
  192. package/dist/tools/component-list-all.d.ts +2 -0
  193. package/dist/tools/component-list-all.js +38 -0
  194. package/dist/tools/component-list-all.js.map +1 -0
  195. package/dist/tools/component-modify.d.ts +2 -0
  196. package/dist/tools/component-modify.js +80 -0
  197. package/dist/tools/component-modify.js.map +1 -0
  198. package/dist/tools/console-clear.d.ts +2 -0
  199. package/dist/tools/console-clear.js +19 -0
  200. package/dist/tools/console-clear.js.map +1 -0
  201. package/dist/tools/console-log.d.ts +2 -0
  202. package/dist/tools/console-log.js +47 -0
  203. package/dist/tools/console-log.js.map +1 -0
  204. package/dist/tools/delta.d.ts +2 -0
  205. package/dist/tools/delta.js +17 -0
  206. package/dist/tools/delta.js.map +1 -0
  207. package/dist/tools/editor-add-layer.d.ts +2 -0
  208. package/dist/tools/editor-add-layer.js +51 -0
  209. package/dist/tools/editor-add-layer.js.map +1 -0
  210. package/dist/tools/editor-add-tag.d.ts +2 -0
  211. package/dist/tools/editor-add-tag.js +41 -0
  212. package/dist/tools/editor-add-tag.js.map +1 -0
  213. package/dist/tools/editor-get-layers.d.ts +2 -0
  214. package/dist/tools/editor-get-layers.js +22 -0
  215. package/dist/tools/editor-get-layers.js.map +1 -0
  216. package/dist/tools/editor-get-tags.d.ts +2 -0
  217. package/dist/tools/editor-get-tags.js +19 -0
  218. package/dist/tools/editor-get-tags.js.map +1 -0
  219. package/dist/tools/editor-redo.d.ts +2 -0
  220. package/dist/tools/editor-redo.js +27 -0
  221. package/dist/tools/editor-redo.js.map +1 -0
  222. package/dist/tools/editor-set-state.d.ts +2 -0
  223. package/dist/tools/editor-set-state.js +57 -0
  224. package/dist/tools/editor-set-state.js.map +1 -0
  225. package/dist/tools/editor-status.d.ts +2 -0
  226. package/dist/tools/editor-status.js +17 -0
  227. package/dist/tools/editor-status.js.map +1 -0
  228. package/dist/tools/editor-undo.d.ts +2 -0
  229. package/dist/tools/editor-undo.js +29 -0
  230. package/dist/tools/editor-undo.js.map +1 -0
  231. package/dist/tools/execute-csharp.d.ts +2 -0
  232. package/dist/tools/execute-csharp.js +74 -0
  233. package/dist/tools/execute-csharp.js.map +1 -0
  234. package/dist/tools/execute-menu.d.ts +2 -0
  235. package/dist/tools/execute-menu.js +40 -0
  236. package/dist/tools/execute-menu.js.map +1 -0
  237. package/dist/tools/find-members.d.ts +2 -0
  238. package/dist/tools/find-members.js +56 -0
  239. package/dist/tools/find-members.js.map +1 -0
  240. package/dist/tools/find-references.d.ts +2 -0
  241. package/dist/tools/find-references.js +29 -0
  242. package/dist/tools/find-references.js.map +1 -0
  243. package/dist/tools/gameobject-create.d.ts +2 -0
  244. package/dist/tools/gameobject-create.js +61 -0
  245. package/dist/tools/gameobject-create.js.map +1 -0
  246. package/dist/tools/gameobject-destroy.d.ts +2 -0
  247. package/dist/tools/gameobject-destroy.js +38 -0
  248. package/dist/tools/gameobject-destroy.js.map +1 -0
  249. package/dist/tools/gameobject-duplicate.d.ts +2 -0
  250. package/dist/tools/gameobject-duplicate.js +40 -0
  251. package/dist/tools/gameobject-duplicate.js.map +1 -0
  252. package/dist/tools/gameobject-find.d.ts +2 -0
  253. package/dist/tools/gameobject-find.js +59 -0
  254. package/dist/tools/gameobject-find.js.map +1 -0
  255. package/dist/tools/gameobject-modify.d.ts +2 -0
  256. package/dist/tools/gameobject-modify.js +76 -0
  257. package/dist/tools/gameobject-modify.js.map +1 -0
  258. package/dist/tools/gameobject-set-parent.d.ts +2 -0
  259. package/dist/tools/gameobject-set-parent.js +55 -0
  260. package/dist/tools/gameobject-set-parent.js.map +1 -0
  261. package/dist/tools/gate-budget-estimate.d.ts +2 -0
  262. package/dist/tools/gate-budget-estimate.js +59 -0
  263. package/dist/tools/gate-budget-estimate.js.map +1 -0
  264. package/dist/tools/generate-skill.d.ts +2 -0
  265. package/dist/tools/generate-skill.js +37 -0
  266. package/dist/tools/generate-skill.js.map +1 -0
  267. package/dist/tools/impact-preview.d.ts +2 -0
  268. package/dist/tools/impact-preview.js +50 -0
  269. package/dist/tools/impact-preview.js.map +1 -0
  270. package/dist/tools/index.d.ts +30 -0
  271. package/dist/tools/index.js +576 -0
  272. package/dist/tools/index.js.map +1 -0
  273. package/dist/tools/inputsystem-action-add.d.ts +2 -0
  274. package/dist/tools/inputsystem-action-add.js +61 -0
  275. package/dist/tools/inputsystem-action-add.js.map +1 -0
  276. package/dist/tools/inputsystem-actionmap-add.d.ts +2 -0
  277. package/dist/tools/inputsystem-actionmap-add.js +31 -0
  278. package/dist/tools/inputsystem-actionmap-add.js.map +1 -0
  279. package/dist/tools/inputsystem-asset-create.d.ts +2 -0
  280. package/dist/tools/inputsystem-asset-create.js +35 -0
  281. package/dist/tools/inputsystem-asset-create.js.map +1 -0
  282. package/dist/tools/inputsystem-binding-add.d.ts +2 -0
  283. package/dist/tools/inputsystem-binding-add.js +48 -0
  284. package/dist/tools/inputsystem-binding-add.js.map +1 -0
  285. package/dist/tools/inputsystem-binding-composite-add.d.ts +2 -0
  286. package/dist/tools/inputsystem-binding-composite-add.js +51 -0
  287. package/dist/tools/inputsystem-binding-composite-add.js.map +1 -0
  288. package/dist/tools/inputsystem-controlscheme-add.d.ts +2 -0
  289. package/dist/tools/inputsystem-controlscheme-add.js +43 -0
  290. package/dist/tools/inputsystem-controlscheme-add.js.map +1 -0
  291. package/dist/tools/inputsystem-get.d.ts +2 -0
  292. package/dist/tools/inputsystem-get.js +22 -0
  293. package/dist/tools/inputsystem-get.js.map +1 -0
  294. package/dist/tools/invoke-method.d.ts +2 -0
  295. package/dist/tools/invoke-method.js +104 -0
  296. package/dist/tools/invoke-method.js.map +1 -0
  297. package/dist/tools/list-assets.d.ts +2 -0
  298. package/dist/tools/list-assets.js +30 -0
  299. package/dist/tools/list-assets.js.map +1 -0
  300. package/dist/tools/list-rules.d.ts +2 -0
  301. package/dist/tools/list-rules.js +27 -0
  302. package/dist/tools/list-rules.js.map +1 -0
  303. package/dist/tools/manage-tools.d.ts +2 -0
  304. package/dist/tools/manage-tools.js +47 -0
  305. package/dist/tools/manage-tools.js.map +1 -0
  306. package/dist/tools/material-create.d.ts +2 -0
  307. package/dist/tools/material-create.js +37 -0
  308. package/dist/tools/material-create.js.map +1 -0
  309. package/dist/tools/material-get-keywords.d.ts +2 -0
  310. package/dist/tools/material-get-keywords.js +23 -0
  311. package/dist/tools/material-get-keywords.js.map +1 -0
  312. package/dist/tools/material-get-properties.d.ts +2 -0
  313. package/dist/tools/material-get-properties.js +32 -0
  314. package/dist/tools/material-get-properties.js.map +1 -0
  315. package/dist/tools/material-set-keyword.d.ts +2 -0
  316. package/dist/tools/material-set-keyword.js +42 -0
  317. package/dist/tools/material-set-keyword.js.map +1 -0
  318. package/dist/tools/material-set-property.d.ts +2 -0
  319. package/dist/tools/material-set-property.js +49 -0
  320. package/dist/tools/material-set-property.js.map +1 -0
  321. package/dist/tools/material-set-shader.d.ts +2 -0
  322. package/dist/tools/material-set-shader.js +39 -0
  323. package/dist/tools/material-set-shader.js.map +1 -0
  324. package/dist/tools/mutation-explain.d.ts +2 -0
  325. package/dist/tools/mutation-explain.js +44 -0
  326. package/dist/tools/mutation-explain.js.map +1 -0
  327. package/dist/tools/navigation-agent-add.d.ts +2 -0
  328. package/dist/tools/navigation-agent-add.js +38 -0
  329. package/dist/tools/navigation-agent-add.js.map +1 -0
  330. package/dist/tools/navigation-agent-set-destination.d.ts +2 -0
  331. package/dist/tools/navigation-agent-set-destination.js +33 -0
  332. package/dist/tools/navigation-agent-set-destination.js.map +1 -0
  333. package/dist/tools/navigation-get.d.ts +2 -0
  334. package/dist/tools/navigation-get.js +20 -0
  335. package/dist/tools/navigation-get.js.map +1 -0
  336. package/dist/tools/navigation-link-add.d.ts +2 -0
  337. package/dist/tools/navigation-link-add.js +57 -0
  338. package/dist/tools/navigation-link-add.js.map +1 -0
  339. package/dist/tools/navigation-list.d.ts +2 -0
  340. package/dist/tools/navigation-list.js +16 -0
  341. package/dist/tools/navigation-list.js.map +1 -0
  342. package/dist/tools/navigation-modifier-add.d.ts +2 -0
  343. package/dist/tools/navigation-modifier-add.js +42 -0
  344. package/dist/tools/navigation-modifier-add.js.map +1 -0
  345. package/dist/tools/navigation-modifier-volume-add.d.ts +2 -0
  346. package/dist/tools/navigation-modifier-volume-add.js +41 -0
  347. package/dist/tools/navigation-modifier-volume-add.js.map +1 -0
  348. package/dist/tools/navigation-modify.d.ts +2 -0
  349. package/dist/tools/navigation-modify.js +47 -0
  350. package/dist/tools/navigation-modify.js.map +1 -0
  351. package/dist/tools/navigation-set-bake-settings.d.ts +2 -0
  352. package/dist/tools/navigation-set-bake-settings.js +42 -0
  353. package/dist/tools/navigation-set-bake-settings.js.map +1 -0
  354. package/dist/tools/navigation-surface-add.d.ts +2 -0
  355. package/dist/tools/navigation-surface-add.js +62 -0
  356. package/dist/tools/navigation-surface-add.js.map +1 -0
  357. package/dist/tools/navigation-surface-bake.d.ts +2 -0
  358. package/dist/tools/navigation-surface-bake.js +30 -0
  359. package/dist/tools/navigation-surface-bake.js.map +1 -0
  360. package/dist/tools/object-get-data.d.ts +2 -0
  361. package/dist/tools/object-get-data.js +59 -0
  362. package/dist/tools/object-get-data.js.map +1 -0
  363. package/dist/tools/object-modify.d.ts +2 -0
  364. package/dist/tools/object-modify.js +73 -0
  365. package/dist/tools/object-modify.js.map +1 -0
  366. package/dist/tools/package-add.d.ts +2 -0
  367. package/dist/tools/package-add.js +42 -0
  368. package/dist/tools/package-add.js.map +1 -0
  369. package/dist/tools/package-check.d.ts +2 -0
  370. package/dist/tools/package-check.js +27 -0
  371. package/dist/tools/package-check.js.map +1 -0
  372. package/dist/tools/package-get-dependencies.d.ts +2 -0
  373. package/dist/tools/package-get-dependencies.js +17 -0
  374. package/dist/tools/package-get-dependencies.js.map +1 -0
  375. package/dist/tools/package-get-info.d.ts +2 -0
  376. package/dist/tools/package-get-info.js +33 -0
  377. package/dist/tools/package-get-info.js.map +1 -0
  378. package/dist/tools/package-list.d.ts +2 -0
  379. package/dist/tools/package-list.js +57 -0
  380. package/dist/tools/package-list.js.map +1 -0
  381. package/dist/tools/package-remove.d.ts +2 -0
  382. package/dist/tools/package-remove.js +40 -0
  383. package/dist/tools/package-remove.js.map +1 -0
  384. package/dist/tools/package-search.d.ts +2 -0
  385. package/dist/tools/package-search.js +42 -0
  386. package/dist/tools/package-search.js.map +1 -0
  387. package/dist/tools/particle-system-get.d.ts +2 -0
  388. package/dist/tools/particle-system-get.js +42 -0
  389. package/dist/tools/particle-system-get.js.map +1 -0
  390. package/dist/tools/particle-system-modify.d.ts +2 -0
  391. package/dist/tools/particle-system-modify.js +73 -0
  392. package/dist/tools/particle-system-modify.js.map +1 -0
  393. package/dist/tools/ping.d.ts +2 -0
  394. package/dist/tools/ping.js +10 -0
  395. package/dist/tools/ping.js.map +1 -0
  396. package/dist/tools/prefab-apply.d.ts +2 -0
  397. package/dist/tools/prefab-apply.js +39 -0
  398. package/dist/tools/prefab-apply.js.map +1 -0
  399. package/dist/tools/prefab-close.d.ts +2 -0
  400. package/dist/tools/prefab-close.js +29 -0
  401. package/dist/tools/prefab-close.js.map +1 -0
  402. package/dist/tools/prefab-create.d.ts +2 -0
  403. package/dist/tools/prefab-create.js +52 -0
  404. package/dist/tools/prefab-create.js.map +1 -0
  405. package/dist/tools/prefab-get-overrides.d.ts +2 -0
  406. package/dist/tools/prefab-get-overrides.js +27 -0
  407. package/dist/tools/prefab-get-overrides.js.map +1 -0
  408. package/dist/tools/prefab-instantiate.d.ts +2 -0
  409. package/dist/tools/prefab-instantiate.js +52 -0
  410. package/dist/tools/prefab-instantiate.js.map +1 -0
  411. package/dist/tools/prefab-open.d.ts +2 -0
  412. package/dist/tools/prefab-open.js +30 -0
  413. package/dist/tools/prefab-open.js.map +1 -0
  414. package/dist/tools/prefab-revert.d.ts +2 -0
  415. package/dist/tools/prefab-revert.js +37 -0
  416. package/dist/tools/prefab-revert.js.map +1 -0
  417. package/dist/tools/prefab-save.d.ts +2 -0
  418. package/dist/tools/prefab-save.js +24 -0
  419. package/dist/tools/prefab-save.js.map +1 -0
  420. package/dist/tools/prefab-status.d.ts +2 -0
  421. package/dist/tools/prefab-status.js +29 -0
  422. package/dist/tools/prefab-status.js.map +1 -0
  423. package/dist/tools/prefab-unpack.d.ts +2 -0
  424. package/dist/tools/prefab-unpack.js +43 -0
  425. package/dist/tools/prefab-unpack.js.map +1 -0
  426. package/dist/tools/probuilder-create-shape.d.ts +2 -0
  427. package/dist/tools/probuilder-create-shape.js +40 -0
  428. package/dist/tools/probuilder-create-shape.js.map +1 -0
  429. package/dist/tools/probuilder-delete-faces.d.ts +2 -0
  430. package/dist/tools/probuilder-delete-faces.js +47 -0
  431. package/dist/tools/probuilder-delete-faces.js.map +1 -0
  432. package/dist/tools/probuilder-extrude.d.ts +2 -0
  433. package/dist/tools/probuilder-extrude.js +58 -0
  434. package/dist/tools/probuilder-extrude.js.map +1 -0
  435. package/dist/tools/probuilder-get-mesh-info.d.ts +2 -0
  436. package/dist/tools/probuilder-get-mesh-info.js +21 -0
  437. package/dist/tools/probuilder-get-mesh-info.js.map +1 -0
  438. package/dist/tools/probuilder-set-face-material.d.ts +2 -0
  439. package/dist/tools/probuilder-set-face-material.js +53 -0
  440. package/dist/tools/probuilder-set-face-material.js.map +1 -0
  441. package/dist/tools/profiler-capture.d.ts +2 -0
  442. package/dist/tools/profiler-capture.js +84 -0
  443. package/dist/tools/profiler-capture.js.map +1 -0
  444. package/dist/tools/profiler-clear-data.d.ts +2 -0
  445. package/dist/tools/profiler-clear-data.js +20 -0
  446. package/dist/tools/profiler-clear-data.js.map +1 -0
  447. package/dist/tools/profiler-enable-module.d.ts +2 -0
  448. package/dist/tools/profiler-enable-module.js +32 -0
  449. package/dist/tools/profiler-enable-module.js.map +1 -0
  450. package/dist/tools/profiler-get-config.d.ts +2 -0
  451. package/dist/tools/profiler-get-config.js +21 -0
  452. package/dist/tools/profiler-get-config.js.map +1 -0
  453. package/dist/tools/profiler-get-script-stats.d.ts +2 -0
  454. package/dist/tools/profiler-get-script-stats.js +20 -0
  455. package/dist/tools/profiler-get-script-stats.js.map +1 -0
  456. package/dist/tools/profiler-get-status.d.ts +2 -0
  457. package/dist/tools/profiler-get-status.js +22 -0
  458. package/dist/tools/profiler-get-status.js.map +1 -0
  459. package/dist/tools/profiler-list-modules.d.ts +2 -0
  460. package/dist/tools/profiler-list-modules.js +20 -0
  461. package/dist/tools/profiler-list-modules.js.map +1 -0
  462. package/dist/tools/profiler-load-data.d.ts +2 -0
  463. package/dist/tools/profiler-load-data.js +38 -0
  464. package/dist/tools/profiler-load-data.js.map +1 -0
  465. package/dist/tools/profiler-memory.d.ts +2 -0
  466. package/dist/tools/profiler-memory.js +21 -0
  467. package/dist/tools/profiler-memory.js.map +1 -0
  468. package/dist/tools/profiler-rendering.d.ts +2 -0
  469. package/dist/tools/profiler-rendering.js +14 -0
  470. package/dist/tools/profiler-rendering.js.map +1 -0
  471. package/dist/tools/profiler-save-data.d.ts +2 -0
  472. package/dist/tools/profiler-save-data.js +38 -0
  473. package/dist/tools/profiler-save-data.js.map +1 -0
  474. package/dist/tools/profiler-set-config.d.ts +2 -0
  475. package/dist/tools/profiler-set-config.js +72 -0
  476. package/dist/tools/profiler-set-config.js.map +1 -0
  477. package/dist/tools/profiler-start.d.ts +2 -0
  478. package/dist/tools/profiler-start.js +31 -0
  479. package/dist/tools/profiler-start.js.map +1 -0
  480. package/dist/tools/profiler-stop.d.ts +2 -0
  481. package/dist/tools/profiler-stop.js +20 -0
  482. package/dist/tools/profiler-stop.js.map +1 -0
  483. package/dist/tools/pull-events.d.ts +2 -0
  484. package/dist/tools/pull-events.js +43 -0
  485. package/dist/tools/pull-events.js.map +1 -0
  486. package/dist/tools/read-asset.d.ts +2 -0
  487. package/dist/tools/read-asset.js +62 -0
  488. package/dist/tools/read-asset.js.map +1 -0
  489. package/dist/tools/read-compile-errors.d.ts +2 -0
  490. package/dist/tools/read-compile-errors.js +59 -0
  491. package/dist/tools/read-compile-errors.js.map +1 -0
  492. package/dist/tools/read-console.d.ts +2 -0
  493. package/dist/tools/read-console.js +57 -0
  494. package/dist/tools/read-console.js.map +1 -0
  495. package/dist/tools/regression-check.d.ts +2 -0
  496. package/dist/tools/regression-check.js +36 -0
  497. package/dist/tools/regression-check.js.map +1 -0
  498. package/dist/tools/reserialize.d.ts +2 -0
  499. package/dist/tools/reserialize.js +31 -0
  500. package/dist/tools/reserialize.js.map +1 -0
  501. package/dist/tools/run-tests.d.ts +2 -0
  502. package/dist/tools/run-tests.js +49 -0
  503. package/dist/tools/run-tests.js.map +1 -0
  504. package/dist/tools/scan-all.d.ts +2 -0
  505. package/dist/tools/scan-all.js +25 -0
  506. package/dist/tools/scan-all.js.map +1 -0
  507. package/dist/tools/scan-paths.d.ts +2 -0
  508. package/dist/tools/scan-paths.js +40 -0
  509. package/dist/tools/scan-paths.js.map +1 -0
  510. package/dist/tools/scene-create.d.ts +2 -0
  511. package/dist/tools/scene-create.js +47 -0
  512. package/dist/tools/scene-create.js.map +1 -0
  513. package/dist/tools/scene-focus.d.ts +2 -0
  514. package/dist/tools/scene-focus.js +55 -0
  515. package/dist/tools/scene-focus.js.map +1 -0
  516. package/dist/tools/scene-get-data.d.ts +2 -0
  517. package/dist/tools/scene-get-data.js +52 -0
  518. package/dist/tools/scene-get-data.js.map +1 -0
  519. package/dist/tools/scene-get-dirty-summary.d.ts +2 -0
  520. package/dist/tools/scene-get-dirty-summary.js +17 -0
  521. package/dist/tools/scene-get-dirty-summary.js.map +1 -0
  522. package/dist/tools/scene-list-opened.d.ts +2 -0
  523. package/dist/tools/scene-list-opened.js +16 -0
  524. package/dist/tools/scene-list-opened.js.map +1 -0
  525. package/dist/tools/scene-open.d.ts +2 -0
  526. package/dist/tools/scene-open.js +48 -0
  527. package/dist/tools/scene-open.js.map +1 -0
  528. package/dist/tools/scene-save.d.ts +2 -0
  529. package/dist/tools/scene-save.js +38 -0
  530. package/dist/tools/scene-save.js.map +1 -0
  531. package/dist/tools/scene-set-active.d.ts +2 -0
  532. package/dist/tools/scene-set-active.js +33 -0
  533. package/dist/tools/scene-set-active.js.map +1 -0
  534. package/dist/tools/scene-unload.d.ts +2 -0
  535. package/dist/tools/scene-unload.js +33 -0
  536. package/dist/tools/scene-unload.js.map +1 -0
  537. package/dist/tools/screenshot-camera.d.ts +2 -0
  538. package/dist/tools/screenshot-camera.js +59 -0
  539. package/dist/tools/screenshot-camera.js.map +1 -0
  540. package/dist/tools/screenshot-window.d.ts +2 -0
  541. package/dist/tools/screenshot-window.js +54 -0
  542. package/dist/tools/screenshot-window.js.map +1 -0
  543. package/dist/tools/screenshot.d.ts +2 -0
  544. package/dist/tools/screenshot.js +47 -0
  545. package/dist/tools/screenshot.js.map +1 -0
  546. package/dist/tools/script-delete.d.ts +2 -0
  547. package/dist/tools/script-delete.js +37 -0
  548. package/dist/tools/script-delete.js.map +1 -0
  549. package/dist/tools/script-read.d.ts +2 -0
  550. package/dist/tools/script-read.js +46 -0
  551. package/dist/tools/script-read.js.map +1 -0
  552. package/dist/tools/script-write.d.ts +2 -0
  553. package/dist/tools/script-write.js +56 -0
  554. package/dist/tools/script-write.js.map +1 -0
  555. package/dist/tools/search-assets.d.ts +2 -0
  556. package/dist/tools/search-assets.js +49 -0
  557. package/dist/tools/search-assets.js.map +1 -0
  558. package/dist/tools/selection-get.d.ts +2 -0
  559. package/dist/tools/selection-get.js +28 -0
  560. package/dist/tools/selection-get.js.map +1 -0
  561. package/dist/tools/selection-set.d.ts +2 -0
  562. package/dist/tools/selection-set.js +72 -0
  563. package/dist/tools/selection-set.js.map +1 -0
  564. package/dist/tools/settings-get-lighting.d.ts +2 -0
  565. package/dist/tools/settings-get-lighting.js +21 -0
  566. package/dist/tools/settings-get-lighting.js.map +1 -0
  567. package/dist/tools/settings-get-physics.d.ts +2 -0
  568. package/dist/tools/settings-get-physics.js +17 -0
  569. package/dist/tools/settings-get-physics.js.map +1 -0
  570. package/dist/tools/settings-get-player.d.ts +2 -0
  571. package/dist/tools/settings-get-player.js +16 -0
  572. package/dist/tools/settings-get-player.js.map +1 -0
  573. package/dist/tools/settings-get-quality.d.ts +2 -0
  574. package/dist/tools/settings-get-quality.js +16 -0
  575. package/dist/tools/settings-get-quality.js.map +1 -0
  576. package/dist/tools/settings-set-lighting.d.ts +2 -0
  577. package/dist/tools/settings-set-lighting.js +58 -0
  578. package/dist/tools/settings-set-lighting.js.map +1 -0
  579. package/dist/tools/settings-set-physics.d.ts +2 -0
  580. package/dist/tools/settings-set-physics.js +52 -0
  581. package/dist/tools/settings-set-physics.js.map +1 -0
  582. package/dist/tools/settings-set-player.d.ts +2 -0
  583. package/dist/tools/settings-set-player.js +62 -0
  584. package/dist/tools/settings-set-player.js.map +1 -0
  585. package/dist/tools/settings-set-quality.d.ts +2 -0
  586. package/dist/tools/settings-set-quality.js +51 -0
  587. package/dist/tools/settings-set-quality.js.map +1 -0
  588. package/dist/tools/shader-get-data.d.ts +2 -0
  589. package/dist/tools/shader-get-data.js +31 -0
  590. package/dist/tools/shader-get-data.js.map +1 -0
  591. package/dist/tools/shader-list-all.d.ts +2 -0
  592. package/dist/tools/shader-list-all.js +24 -0
  593. package/dist/tools/shader-list-all.js.map +1 -0
  594. package/dist/tools/spatial-query.d.ts +2 -0
  595. package/dist/tools/spatial-query.js +117 -0
  596. package/dist/tools/spatial-query.js.map +1 -0
  597. package/dist/tools/splines-add-knot.d.ts +2 -0
  598. package/dist/tools/splines-add-knot.js +44 -0
  599. package/dist/tools/splines-add-knot.js.map +1 -0
  600. package/dist/tools/splines-container-create.d.ts +2 -0
  601. package/dist/tools/splines-container-create.js +39 -0
  602. package/dist/tools/splines-container-create.js.map +1 -0
  603. package/dist/tools/splines-evaluate.d.ts +2 -0
  604. package/dist/tools/splines-evaluate.js +31 -0
  605. package/dist/tools/splines-evaluate.js.map +1 -0
  606. package/dist/tools/splines-get-knots.d.ts +2 -0
  607. package/dist/tools/splines-get-knots.js +25 -0
  608. package/dist/tools/splines-get-knots.js.map +1 -0
  609. package/dist/tools/splines-modify.d.ts +2 -0
  610. package/dist/tools/splines-modify.js +35 -0
  611. package/dist/tools/splines-modify.js.map +1 -0
  612. package/dist/tools/splines-set-knot.d.ts +2 -0
  613. package/dist/tools/splines-set-knot.js +41 -0
  614. package/dist/tools/splines-set-knot.js.map +1 -0
  615. package/dist/tools/splines-set-tangent-mode.d.ts +2 -0
  616. package/dist/tools/splines-set-tangent-mode.js +43 -0
  617. package/dist/tools/splines-set-tangent-mode.js.map +1 -0
  618. package/dist/tools/type-schema.d.ts +2 -0
  619. package/dist/tools/type-schema.js +62 -0
  620. package/dist/tools/type-schema.js.map +1 -0
  621. package/dist/tools/validate-edit.d.ts +2 -0
  622. package/dist/tools/validate-edit.js +43 -0
  623. package/dist/tools/validate-edit.js.map +1 -0
  624. package/dist/unity-install-discovery.d.ts +79 -0
  625. package/dist/unity-install-discovery.js +206 -0
  626. package/dist/unity-install-discovery.js.map +1 -0
  627. package/dist/unity-log.d.ts +35 -0
  628. package/dist/unity-log.js +110 -0
  629. package/dist/unity-log.js.map +1 -0
  630. package/package.json +54 -0
@@ -0,0 +1,583 @@
1
+ import { deriveIsError } from "./gate-error.js";
2
+ import { existsSync, readFileSync, unlinkSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { pollAndDismissLaunchErrors, readDismissConfig, } from "./dialog-dismiss.js";
6
+ import { readInstanceLock, classifyInstance, lockPath } from "./instance-discovery.js";
7
+ import { makeErrorResult } from "./results.js";
8
+ import { checkBridgeCompat, isVersionCheckSuppressed, } from "./compat.js";
9
+ const MAX_COMPILE_WAIT_MS = 120_000;
10
+ const COMPILE_POLL_INTERVAL_MS = 2_000;
11
+ const PING_TIMEOUT_MS = 5_000;
12
+ const DIRECT_RESPONSE_TOOLS = new Set([
13
+ "unity_open_mcp_validate_edit",
14
+ "unity_open_mcp_checkpoint_create",
15
+ "unity_open_mcp_delta",
16
+ "unity_open_mcp_find_references",
17
+ "unity_open_mcp_scan_paths",
18
+ // Compact drill-down reads return a structured model JSON directly; the MCP
19
+ // ToolRouter applies the compression module on top (compressible-router.ts).
20
+ "unity_open_mcp_read_asset",
21
+ "unity_open_mcp_search_assets",
22
+ // Test runner returns { status, runId } directly; LiveClient polls the
23
+ // results file and returns the final result.
24
+ "unity_senses_run_tests",
25
+ // Agent senses (non-mutating): return tool JSON directly.
26
+ "unity_senses_screenshot",
27
+ // M20 Plan 1 / T20.1.1 — capture_inline returns an inlineImage field (base64
28
+ // PNG). The postTool handler unwraps it into an MCP image content block so
29
+ // the agent receives a viewable image without reading the filesystem.
30
+ "unity_senses_capture_inline",
31
+ "unity_senses_screenshot_camera",
32
+ // M20 Plan 1 / T20.1.2 — EditorWindow capture (file path). Read-only.
33
+ "unity_senses_screenshot_window",
34
+ "unity_senses_read_console",
35
+ "unity_senses_profiler_capture",
36
+ "unity_senses_profiler_memory",
37
+ "unity_senses_profiler_rendering",
38
+ "unity_senses_spatial_query",
39
+ ]);
40
+ function sleep(ms) {
41
+ return new Promise((resolve) => setTimeout(resolve, ms));
42
+ }
43
+ const OFFLINE_HINT = "Ensure the Unity Editor is open with the Agent Bridge running. " +
44
+ "The bridge port is per-project (20000 + sha256(projectPath) % 10000), not " +
45
+ "fixed — if Unity is open the MCP server may be aimed at the wrong port. " +
46
+ "Check the instance lock at ~/.unity-open-mcp/instances/<sha256(projectPath)>.json " +
47
+ "for the live port/pid, or set UNITY_OPEN_MCP_BRIDGE_PORT. If Unity is not " +
48
+ "open, launch it (or set UNITY_PATH + UNITY_PROJECT_PATH for batch fallback).";
49
+ /**
50
+ * Build a per-instance offline hint that names THIS project's lock file path
51
+ * and (when the lock is readable) its port/pid/state, so an agent debugging a
52
+ * `bridge_offline` knows exactly where to look. Falls back to OFFLINE_HINT
53
+ * when the project path is unknown (older callers / tests).
54
+ */
55
+ function buildOfflineHint(projectPath) {
56
+ if (!projectPath)
57
+ return OFFLINE_HINT;
58
+ const lock = lockPath(projectPath);
59
+ const base = `${OFFLINE_HINT} This project's lock file: ${lock}`;
60
+ try {
61
+ const inst = readInstanceLock(projectPath);
62
+ if (inst) {
63
+ return `${base}. Lock state: pid=${inst.pid}, port=${inst.port}, state=${inst.state}`;
64
+ }
65
+ }
66
+ catch {
67
+ // best-effort — fall through to the base hint
68
+ }
69
+ return `${base} (lock not readable — Unity may not be running).`;
70
+ }
71
+ export class LiveClient {
72
+ baseUrl;
73
+ pingCache;
74
+ dismissEnabled;
75
+ dismissTimeoutMs;
76
+ dismissIntervalMs;
77
+ /** M14 — per-session bearer token auto-discovered from the instance lock.
78
+ * Undefined when no live lock was found (older bridge / env port override);
79
+ * in that case no Authorization header is sent and the bridge must be in
80
+ * authMode "none" for requests to succeed. */
81
+ authToken;
82
+ /** Absolute Unity project path, used to read the instance lock mid-session
83
+ * for dead-bridge detection. Optional so existing callers/tests that don't
84
+ * exercise the fail-fast path keep working; when absent, a /ping failure
85
+ * falls back to the original bridge_offline behavior. */
86
+ projectPath;
87
+ /** One-shot guard so the version-compat warning (server vs bridge) is emitted
88
+ * at most once per process — every /ping would otherwise re-warn. */
89
+ compatWarned;
90
+ constructor(port, pingCache, authToken, projectPath) {
91
+ this.baseUrl = `http://127.0.0.1:${port}`;
92
+ this.pingCache = pingCache;
93
+ this.authToken = authToken;
94
+ this.projectPath = projectPath;
95
+ // M13 T4.5 — launch-errors / Safe Mode dialog auto-dismissal. Resolved
96
+ // once at construction; the env vars do not change mid-process. The
97
+ // feature is enabled by default (Unity-MCP parity) and runs concurrently
98
+ // with every compile/bridge readiness wait so it ticks on the same stall
99
+ // points agents hit, not only at process spawn.
100
+ const dismissCfg = readDismissConfig();
101
+ this.dismissEnabled = dismissCfg.enabled;
102
+ this.dismissTimeoutMs = dismissCfg.timeoutMs;
103
+ this.dismissIntervalMs = dismissCfg.intervalMs;
104
+ this.compatWarned = false;
105
+ }
106
+ /**
107
+ * Emit the server/bridge version-compatibility warning at most once per
108
+ * process. Advisory only — the caller never blocks on this. Suppressed
109
+ * entirely by UNITY_OPEN_MCP_SKIP_VERSION_CHECK=1. See docs/versioning.md.
110
+ */
111
+ maybeWarnCompat(bridgeVersion) {
112
+ if (this.compatWarned)
113
+ return;
114
+ if (bridgeVersion === undefined || bridgeVersion === null)
115
+ return;
116
+ if (isVersionCheckSuppressed()) {
117
+ this.compatWarned = true;
118
+ return;
119
+ }
120
+ const result = checkBridgeCompat(String(bridgeVersion));
121
+ this.compatWarned = true;
122
+ if (result.message) {
123
+ console.warn(result.message);
124
+ }
125
+ }
126
+ async isLiveAvailable() {
127
+ try {
128
+ const res = await this.fetchWithTimeout("/ping", { method: "GET" });
129
+ if (res.status === 503)
130
+ return true;
131
+ if (!res.ok)
132
+ return false;
133
+ const body = (await res.json());
134
+ this.pingCache.record(body);
135
+ this.maybeWarnCompat(body.bridgeVersion);
136
+ return body.connected;
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ }
142
+ async route(toolName, args) {
143
+ if (toolName === "unity_open_mcp_ping") {
144
+ return this.handlePing();
145
+ }
146
+ if (toolName === "unity_senses_run_tests") {
147
+ return this.handleRunTests(args);
148
+ }
149
+ return this.handleToolCall(toolName, args);
150
+ }
151
+ async handlePing() {
152
+ try {
153
+ const res = await this.fetchWithTimeout("/ping", { method: "GET" });
154
+ const body = await res.json();
155
+ this.pingCache.record(body);
156
+ this.maybeWarnCompat(body.bridgeVersion);
157
+ return {
158
+ content: [{ type: "text", text: JSON.stringify(body) }],
159
+ isError: false,
160
+ };
161
+ }
162
+ catch {
163
+ return makeErrorResult({
164
+ code: "bridge_offline",
165
+ message: `Bridge is not reachable at ${this.baseUrl}. ${buildOfflineHint(this.projectPath)}`,
166
+ detail: {
167
+ error: {
168
+ code: "bridge_offline",
169
+ message: `Cannot connect to bridge at ${this.baseUrl}`,
170
+ },
171
+ },
172
+ });
173
+ }
174
+ }
175
+ async handleToolCall(toolName, args) {
176
+ const readyError = await this.ensureReady();
177
+ if (readyError)
178
+ return readyError;
179
+ return this.postTool(toolName, args, true);
180
+ }
181
+ async handleRunTests(args) {
182
+ const readyError = await this.ensureReady();
183
+ if (readyError)
184
+ return readyError;
185
+ const startResult = await this.postTool("unity_senses_run_tests", args, true);
186
+ if (startResult.isError)
187
+ return startResult;
188
+ const text = startResult.content[0]?.type === "text"
189
+ ? startResult.content[0].text
190
+ : "";
191
+ let body;
192
+ try {
193
+ body = JSON.parse(text);
194
+ }
195
+ catch {
196
+ return startResult;
197
+ }
198
+ if (body.status !== "started" || !body.runId) {
199
+ return startResult;
200
+ }
201
+ return this.pollTestResults(body.runId, args);
202
+ }
203
+ async pollTestResults(runId, args) {
204
+ const timeoutMs = typeof args.timeout_ms === "number" ? args.timeout_ms : 60_000;
205
+ const deadline = Date.now() + timeoutMs;
206
+ // Check before sleeping: an EditMode run often finishes within a second or
207
+ // two, and the previous fixed 1s-before-first-check + 1s interval added up
208
+ // to seconds of dead time per call. Back off 250ms -> 1s so fast runs return
209
+ // promptly without hammering the filesystem on long ones.
210
+ const minIntervalMs = 250;
211
+ const maxIntervalMs = 1_000;
212
+ const resultsPath = join(homedir(), ".unity-open-mcp", `test-results-${runId}.json`);
213
+ let intervalMs = minIntervalMs;
214
+ while (Date.now() < deadline) {
215
+ try {
216
+ if (existsSync(resultsPath)) {
217
+ const content = readFileSync(resultsPath, "utf-8");
218
+ try {
219
+ unlinkSync(resultsPath);
220
+ }
221
+ catch {
222
+ // best-effort cleanup
223
+ }
224
+ let isError = false;
225
+ try {
226
+ const parsed = JSON.parse(content);
227
+ isError = parsed.status === "error";
228
+ }
229
+ catch {
230
+ // unparseable → treat as error
231
+ isError = true;
232
+ }
233
+ return {
234
+ content: [{ type: "text", text: content }],
235
+ isError,
236
+ };
237
+ }
238
+ }
239
+ catch {
240
+ // continue polling
241
+ }
242
+ await sleep(intervalMs);
243
+ intervalMs = Math.min(intervalMs * 2, maxIntervalMs);
244
+ }
245
+ return makeErrorResult({
246
+ code: "test_results_timeout",
247
+ message: `Test results for run ${runId} were not available within ` +
248
+ `${timeoutMs / 1000}s. The test run may still be in progress or ` +
249
+ "the bridge may have lost the callback.",
250
+ detail: {
251
+ error: {
252
+ code: "test_results_timeout",
253
+ message: `Test results poll timed out after ${timeoutMs / 1000}s`,
254
+ },
255
+ },
256
+ });
257
+ }
258
+ async postTool(toolName, args, retryOn503) {
259
+ try {
260
+ const timeoutMs = typeof args.timeout_ms === "number" ? args.timeout_ms : 60_000;
261
+ const res = await this.fetchWithTimeout(`/tools/${toolName}`, {
262
+ method: "POST",
263
+ headers: { "Content-Type": "application/json; charset=utf-8" },
264
+ body: JSON.stringify(args),
265
+ }, timeoutMs + 10_000);
266
+ if (res.status === 503 && retryOn503) {
267
+ const compileError = await this.waitForCompile();
268
+ if (compileError)
269
+ return compileError;
270
+ return this.postTool(toolName, args, false);
271
+ }
272
+ if (!res.ok) {
273
+ const body = (await res
274
+ .json()
275
+ .catch(() => null));
276
+ return makeErrorResult({
277
+ code: "bridge_http_error",
278
+ message: body?.error?.message ?? `Bridge returned HTTP ${res.status}`,
279
+ detail: body ?? {
280
+ error: {
281
+ code: "bridge_http_error",
282
+ message: `HTTP ${res.status}`,
283
+ },
284
+ },
285
+ });
286
+ }
287
+ if (DIRECT_RESPONSE_TOOLS.has(toolName)) {
288
+ const directBody = (await res.json().catch(() => null));
289
+ // M20 Plan 1 / T20.1.1 — capture_inline returns an `inlineImage` base64
290
+ // PNG field. Unwrap it into an MCP image content block alongside a text
291
+ // metadata block (matching the AnkleBreaker unity_graphics_*_capture
292
+ // contract: [{type: image}, {type: text}]). The image carries the same
293
+ // viewable payload a file-path screenshot would; the metadata keeps the
294
+ // view / resolution / byteLength fields without the base64 blob.
295
+ const inlineImage = directBody?.inlineImage;
296
+ if (directBody != null &&
297
+ typeof inlineImage === "string" &&
298
+ inlineImage.length > 0 &&
299
+ directBody.error == null) {
300
+ const body = directBody;
301
+ const mimeType = typeof body.mimeType === "string" ? body.mimeType : "image/png";
302
+ const metadata = { ...body };
303
+ delete metadata.inlineImage;
304
+ return {
305
+ content: [
306
+ { type: "image", data: inlineImage, mimeType },
307
+ { type: "text", text: JSON.stringify(metadata) },
308
+ ],
309
+ isError: false,
310
+ };
311
+ }
312
+ return {
313
+ content: [
314
+ {
315
+ type: "text",
316
+ text: JSON.stringify(directBody ?? {}),
317
+ },
318
+ ],
319
+ isError: directBody?.error != null,
320
+ };
321
+ }
322
+ const body = (await res.json());
323
+ return {
324
+ content: [{ type: "text", text: JSON.stringify(body) }],
325
+ isError: deriveIsError(body),
326
+ };
327
+ }
328
+ catch {
329
+ return makeErrorResult({
330
+ code: "bridge_offline",
331
+ message: `Failed to reach bridge at ${this.baseUrl}. ${buildOfflineHint(this.projectPath)}`,
332
+ detail: {
333
+ error: {
334
+ code: "bridge_offline",
335
+ message: `Cannot connect to bridge at ${this.baseUrl}`,
336
+ },
337
+ },
338
+ });
339
+ }
340
+ }
341
+ async ensureReady() {
342
+ try {
343
+ const res = await this.fetchWithTimeout("/ping", { method: "GET" });
344
+ if (res.status === 503) {
345
+ return this.waitForCompile();
346
+ }
347
+ if (!res.ok) {
348
+ return makeErrorResult({
349
+ code: "bridge_error",
350
+ message: `Bridge /ping returned unexpected HTTP ${res.status}`,
351
+ });
352
+ }
353
+ const body = (await res.json());
354
+ this.pingCache.record(body);
355
+ if (!body.connected) {
356
+ return makeErrorResult({
357
+ code: "bridge_not_connected",
358
+ message: "Bridge listener is running but session is not initialized.",
359
+ detail: {
360
+ error: {
361
+ code: "bridge_not_connected",
362
+ message: "Bridge session not connected",
363
+ },
364
+ },
365
+ });
366
+ }
367
+ if (body.compiling) {
368
+ return this.waitForCompile();
369
+ }
370
+ return null;
371
+ }
372
+ catch {
373
+ // Bridge is unreachable (ECONNREFUSED / timeout). Before falling back to
374
+ // the generic offline error, check whether the instance lock indicates a
375
+ // DEAD bridge assembly — the Unity process is still alive but the bridge
376
+ // failed to reload after a compile error. That case is NOT recoverable
377
+ // by waiting; surface it immediately so the agent can fetch the compiler
378
+ // errors and fix them instead of hanging on /ping.
379
+ const deadBridge = this.deadBridgeResult();
380
+ if (deadBridge)
381
+ return deadBridge;
382
+ return makeErrorResult({
383
+ code: "bridge_offline",
384
+ message: `Bridge is not reachable at ${this.baseUrl}. ${buildOfflineHint(this.projectPath)}`,
385
+ detail: {
386
+ error: {
387
+ code: "bridge_offline",
388
+ message: `Cannot connect to bridge at ${this.baseUrl}`,
389
+ },
390
+ },
391
+ });
392
+ }
393
+ }
394
+ // Detect the dead-bridge-assembly signature from the on-disk instance lock:
395
+ // Unity process alive (PID running) but heartbeat stale (the bridge's
396
+ // [InitializeOnLoad] never re-ran after a compile failure, so the heartbeat
397
+ // writer is gone). Returns a structured error pointing the agent at
398
+ // read_compile_errors, or null when the signature is not present (no lock,
399
+ // dead PID, or a fresh/reloading heartbeat — i.e. the wait is still worth
400
+ // keeping). Requires projectPath to have been threaded in; without it we
401
+ // can't read the lock, so we return null and preserve the original behavior.
402
+ deadBridgeResult() {
403
+ if (!this.projectPath)
404
+ return null;
405
+ let classification;
406
+ try {
407
+ classification = classifyInstance(readInstanceLock(this.projectPath));
408
+ }
409
+ catch {
410
+ return null;
411
+ }
412
+ if (classification !== "dead_bridge")
413
+ return null;
414
+ return {
415
+ content: [
416
+ {
417
+ type: "text",
418
+ text: JSON.stringify({
419
+ error: {
420
+ code: "bridge_compile_failed",
421
+ message: "The bridge assembly failed to recompile and Unity is likely " +
422
+ "in a bad state (safe mode / compile errors). The HTTP listener " +
423
+ "will not return until the C# error is fixed. " +
424
+ "Call unity_open_mcp_read_compile_errors to retrieve the compiler " +
425
+ "errors from Unity's Editor.log, fix the cited file/line, then " +
426
+ "trigger a recompile (e.g. a no-op edit + focus Unity, or " +
427
+ "unity_open_mcp_compile_check once the source compiles).",
428
+ },
429
+ }),
430
+ },
431
+ ],
432
+ isError: true,
433
+ };
434
+ }
435
+ async waitForCompile() {
436
+ const deadline = Date.now() + MAX_COMPILE_WAIT_MS;
437
+ // M13 T4.5 — run the launch-errors / Safe Mode dialog auto-dismiss loop
438
+ // CONCURRENTLY with the compile poll. The dismiss loop ticks on the same
439
+ // stall point this method represents (UCP bridge-wait pattern): if a
440
+ // native modal is blocking the Editor, the compile poll below will spin
441
+ // until timeout with no recovery. The dismiss loop clicks Ignore on that
442
+ // modal; the moment compile resolves (compiling → idle), we abort the
443
+ // loop — there is no launch dialog left to dismiss once Unity is idle.
444
+ //
445
+ // When auto-dismiss is opted out (UNITY_OPEN_MCP_NO_AUTO_DISMISS_LAUNCH_ERRORS=1),
446
+ // `dismissEnabled` is false and this branch is skipped entirely,
447
+ // preserving the pre-feature baseline.
448
+ let dismissAbort = null;
449
+ let dismissDone = null;
450
+ if (this.dismissEnabled) {
451
+ dismissAbort = new AbortController();
452
+ const dismissOpts = {
453
+ timeoutMs: this.dismissTimeoutMs,
454
+ intervalMs: this.dismissIntervalMs,
455
+ abortSignal: dismissAbort.signal,
456
+ };
457
+ dismissDone = this.runDismissLoop(dismissOpts);
458
+ }
459
+ try {
460
+ while (Date.now() < deadline) {
461
+ await sleep(COMPILE_POLL_INTERVAL_MS);
462
+ try {
463
+ const res = await this.fetchWithTimeout("/ping", { method: "GET" });
464
+ if (res.status === 503)
465
+ continue;
466
+ if (!res.ok)
467
+ continue;
468
+ const body = (await res.json());
469
+ if (!body.compiling && body.connected)
470
+ return null;
471
+ }
472
+ catch {
473
+ // Network failure during the poll — normal during a domain reload
474
+ // (the listener is torn down and rebuilt). But if the instance lock
475
+ // shows a dead bridge assembly (stale heartbeat + live PID), the
476
+ // reload will never complete: abort the wait immediately with the
477
+ // structured bridge_compile_failed error instead of spinning to the
478
+ // 120s deadline.
479
+ const deadBridge = this.deadBridgeResult();
480
+ if (deadBridge)
481
+ return deadBridge;
482
+ continue;
483
+ }
484
+ }
485
+ // Final check before declaring a timeout: a dead-bridge signature here
486
+ // is a more useful error than the opaque compile_timeout.
487
+ const deadBridge = this.deadBridgeResult();
488
+ if (deadBridge)
489
+ return deadBridge;
490
+ return makeErrorResult({
491
+ code: "compile_timeout",
492
+ message: `Unity is still compiling after ${MAX_COMPILE_WAIT_MS / 1000}s. ` +
493
+ "The compile-wait timeout was exceeded.",
494
+ detail: {
495
+ error: {
496
+ code: "compile_timeout",
497
+ message: `Compile-wait exceeded ${MAX_COMPILE_WAIT_MS / 1000}s`,
498
+ },
499
+ },
500
+ });
501
+ }
502
+ finally {
503
+ // Compile wait resolved (idle) OR timed out — either way there is
504
+ // nothing more to dismiss. Aborting unblocks the dismiss loop's sleep.
505
+ dismissAbort?.abort();
506
+ await dismissDone;
507
+ }
508
+ }
509
+ /**
510
+ * Run the launch-errors dismiss polling loop. Indirected through a method
511
+ * so unit tests can stub the OS-clicking loop without invoking
512
+ * PowerShell / osascript / xdotool. Production uses the real
513
+ * `pollAndDismissLaunchErrors`.
514
+ */
515
+ runDismissLoop(opts) {
516
+ return pollAndDismissLaunchErrors(opts);
517
+ }
518
+ async readResource(route) {
519
+ try {
520
+ const res = await this.fetchWithTimeout(`/resources/${route}`, { method: "GET" }, 10_000);
521
+ if (!res.ok) {
522
+ return {
523
+ status: "no_data",
524
+ asOf: null,
525
+ summary: null,
526
+ nextStep: "Run unity_open_mcp_scan_paths or a gated mutation to populate the cache.",
527
+ };
528
+ }
529
+ const text = await res.text();
530
+ return JSON.parse(text);
531
+ }
532
+ catch {
533
+ return {
534
+ status: "no_data",
535
+ asOf: null,
536
+ summary: null,
537
+ nextStep: "Run unity_open_mcp_scan_paths or a gated mutation to populate the cache.",
538
+ };
539
+ }
540
+ }
541
+ /**
542
+ * M18 Plan 2 / T18.2.3 — fetch the compiled-state tool inventory from the
543
+ * bridge (`GET /tools`). Returns the set of tool names the bridge compiled
544
+ * in (KnownTools ∪ BridgeToolRegistry), so the MCP server can report per-
545
+ * group availability in `unity_open_mcp_capabilities` and
546
+ * `unity_open_mcp_manage_tools(list_groups)`.
547
+ *
548
+ * Returns null when the bridge is unreachable or the response is malformed
549
+ * — callers fall back to `available: null` (unknown) so the agent is
550
+ * directed at manage_tools when the bridge comes back up.
551
+ */
552
+ async listBridgeTools() {
553
+ try {
554
+ const res = await this.fetchWithTimeout("/tools", { method: "GET" }, 5_000);
555
+ if (!res.ok)
556
+ return null;
557
+ const body = (await res.json());
558
+ const tools = new Set(Array.isArray(body.tools) ? body.tools : []);
559
+ const groups = Array.isArray(body.groups) ? body.groups : [];
560
+ return { tools, groups };
561
+ }
562
+ catch {
563
+ return null;
564
+ }
565
+ }
566
+ fetchWithTimeout(path, init, timeoutMs = PING_TIMEOUT_MS) {
567
+ const controller = new AbortController();
568
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
569
+ // M14 — attach the bearer token to every request when one was discovered
570
+ // from the instance lock. Merge with any caller-supplied headers so we
571
+ // never clobber a per-request value.
572
+ const headers = new Headers(init.headers);
573
+ if (this.authToken && !headers.has("Authorization")) {
574
+ headers.set("Authorization", `Bearer ${this.authToken}`);
575
+ }
576
+ return fetch(`${this.baseUrl}${path}`, {
577
+ ...init,
578
+ headers,
579
+ signal: controller.signal,
580
+ }).finally(() => clearTimeout(timer));
581
+ }
582
+ }
583
+ //# sourceMappingURL=live-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-client.js","sourceRoot":"","sources":["../src/live-client.ts"],"names":[],"mappings":"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"}