auvrynt 1.0.2 → 1.0.5

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 (550) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +366 -233
  3. package/addons/auvrynt_bridge/auvrynt_bridge.gd +500 -0
  4. package/addons/auvrynt_bridge/plugin.cfg +7 -0
  5. package/bin/auvrynt-launcher.cjs +77 -0
  6. package/dist/artifact-registry.js +1 -0
  7. package/dist/aseprite-tools.js +1 -0
  8. package/dist/auth/connection-registry.js +145 -0
  9. package/dist/auth/connection-status.js +176 -0
  10. package/dist/auth/oauth-provider.js +617 -0
  11. package/dist/auth/room-registry.js +131 -0
  12. package/dist/auth/session-registry.js +531 -0
  13. package/dist/background-lifecycle.js +1 -0
  14. package/dist/blender-client.js +1 -109
  15. package/dist/blender-tools.js +1 -930
  16. package/dist/browser-stability.js +1 -0
  17. package/dist/cli/commands/help-command.js +10 -0
  18. package/dist/cli/commands/init-command.js +190 -0
  19. package/dist/cli/commands/integration-commands.js +88 -0
  20. package/dist/cli/commands/serve-command.js +83 -0
  21. package/dist/cli/commands/setup-command.js +81 -0
  22. package/dist/cli/commands/status-commands.js +166 -0
  23. package/dist/cli/commands/tunnel-command.js +127 -0
  24. package/dist/cli/commands/user-config-commands.js +105 -0
  25. package/dist/cli/dashboard-actions.js +516 -0
  26. package/dist/cli/dashboard-native-actions.js +282 -0
  27. package/dist/cli/foreground-server.js +270 -0
  28. package/dist/cli/instance-control.js +21 -0
  29. package/dist/cli/instance-lock.js +123 -0
  30. package/dist/cli/integration-bootstrap.js +206 -0
  31. package/dist/cli/lifecycle-manager.js +493 -0
  32. package/dist/cli/runtime-support.js +74 -0
  33. package/dist/cli/serena-detected-default.js +27 -0
  34. package/dist/cli/tunnel-health-monitor.js +182 -0
  35. package/dist/cli.js +82 -739
  36. package/dist/config.js +1 -243
  37. package/dist/connection-registry.js +1 -73
  38. package/dist/connection-status.js +1 -139
  39. package/dist/control-retry.js +1 -0
  40. package/dist/crash-recovery.js +1 -0
  41. package/dist/db/client.js +16 -3
  42. package/dist/db/schema.js +30 -0
  43. package/dist/dotnet-tools.js +1 -223
  44. package/dist/git-worktrees.js +1 -134
  45. package/dist/git.js +1 -41
  46. package/dist/godot-animation-tilemap.js +1 -82
  47. package/dist/godot-csharp-build.js +1 -93
  48. package/dist/godot-csharp-project.js +1 -157
  49. package/dist/godot-csharp-runner.js +1 -146
  50. package/dist/godot-csharp-semantic.js +1 -161
  51. package/dist/godot-csharp-validate.js +1 -71
  52. package/dist/godot-dotnet-env.js +1 -169
  53. package/dist/godot-editor-bridge.js +1 -140
  54. package/dist/godot-gdscript.js +1 -824
  55. package/dist/godot-project-settings.js +1 -223
  56. package/dist/godot-runtime-testing.js +1 -249
  57. package/dist/godot-tools.js +1 -183
  58. package/dist/http-rate-limit.js +1 -0
  59. package/dist/http-server-hardening.js +1 -0
  60. package/dist/image-tools.js +1 -157
  61. package/dist/infrastructure/command-reference.js +32 -0
  62. package/dist/infrastructure/config.js +424 -0
  63. package/dist/infrastructure/context7-auth.js +55 -0
  64. package/dist/infrastructure/http-rate-limit.js +42 -0
  65. package/dist/infrastructure/http-server-hardening.js +23 -0
  66. package/dist/infrastructure/integration-queue.js +46 -0
  67. package/dist/infrastructure/logger.js +129 -0
  68. package/dist/infrastructure/mcp-event-store.js +103 -0
  69. package/dist/infrastructure/ngrok-auth-pool.js +208 -0
  70. package/dist/infrastructure/request-context.js +14 -0
  71. package/dist/infrastructure/shutdown.js +37 -0
  72. package/dist/infrastructure/sse-heartbeat.js +47 -0
  73. package/dist/infrastructure/tool-capabilities.js +67 -0
  74. package/dist/infrastructure/tool-result-budget.js +175 -0
  75. package/dist/infrastructure/user-config.js +167 -0
  76. package/dist/integration-discovery.js +1 -98
  77. package/dist/integration-queue.js +1 -0
  78. package/dist/integrations/agent-reach/agent-reach-tools.js +196 -0
  79. package/dist/integrations/agent-reach/native-channels.js +468 -0
  80. package/dist/integrations/aseprite/aseprite-analysis-tools.js +368 -0
  81. package/dist/integrations/aseprite/aseprite-editing-tools.js +647 -0
  82. package/dist/integrations/aseprite/aseprite-live-tools.js +297 -0
  83. package/dist/integrations/aseprite/aseprite-safety-tools.js +594 -0
  84. package/dist/integrations/aseprite/aseprite-specialized-tools.js +289 -0
  85. package/dist/integrations/aseprite/aseprite-tools.js +837 -0
  86. package/dist/integrations/blender/blender-catalog-mesh.js +593 -0
  87. package/dist/integrations/blender/blender-catalog-object.js +906 -0
  88. package/dist/integrations/blender/blender-catalog-scene.js +266 -0
  89. package/dist/integrations/blender/blender-catalog-select.js +581 -0
  90. package/dist/integrations/blender/blender-catalog-stubs.js +7512 -0
  91. package/dist/integrations/blender/blender-catalog.js +165 -0
  92. package/dist/integrations/blender/blender-client.js +105 -0
  93. package/dist/integrations/blender/blender-tools.js +2243 -0
  94. package/dist/integrations/context7/context7-tools.js +106 -0
  95. package/dist/integrations/dotnet/dotnet-tools.js +195 -0
  96. package/dist/integrations/godot/godot-animation-tilemap.js +74 -0
  97. package/dist/integrations/godot/godot-csharp-build.js +91 -0
  98. package/dist/integrations/godot/godot-csharp-project.js +155 -0
  99. package/dist/integrations/godot/godot-csharp-runner.js +118 -0
  100. package/dist/integrations/godot/godot-csharp-semantic.js +146 -0
  101. package/dist/integrations/godot/godot-csharp-validate.js +71 -0
  102. package/dist/integrations/godot/godot-dotnet-env.js +134 -0
  103. package/dist/integrations/godot/godot-editor-bridge.js +328 -0
  104. package/dist/integrations/godot/godot-gdscript.js +536 -0
  105. package/dist/integrations/godot/godot-project-settings.js +178 -0
  106. package/dist/integrations/godot/godot-runtime-testing.js +263 -0
  107. package/dist/integrations/godot/godot-tools.js +193 -0
  108. package/dist/integrations/images/image-tools.js +414 -0
  109. package/dist/integrations/images/png-codec.js +251 -0
  110. package/dist/integrations/images/view-image.js +99 -0
  111. package/dist/integrations/images/window-capture.js +148 -0
  112. package/dist/integrations/integration-discovery.js +185 -0
  113. package/dist/integrations/obsidian/obsidian-tools.js +205 -0
  114. package/dist/integrations/playwright/browser-session.js +516 -0
  115. package/dist/integrations/playwright/browser-stability.js +36 -0
  116. package/dist/integrations/playwright/playwright-runtime.js +105 -0
  117. package/dist/integrations/playwright/web-tools.js +504 -0
  118. package/dist/integrations/roblox/roblox-helpers.js +381 -0
  119. package/dist/integrations/roblox/roblox-studio-client.js +112 -0
  120. package/dist/integrations/roblox/roblox-tools.js +106 -0
  121. package/dist/integrations/serena/serena-manager.js +464 -0
  122. package/dist/integrations/serena/serena-tools.js +411 -0
  123. package/dist/logger.js +1 -76
  124. package/dist/mcp-event-store.js +1 -0
  125. package/dist/oauth-provider.js +1 -377
  126. package/dist/pi-tools.js +1 -81
  127. package/dist/playwright-runtime.js +1 -0
  128. package/dist/process/background-lifecycle.js +189 -0
  129. package/dist/process/control-retry.js +42 -0
  130. package/dist/process/crash-recovery.js +23 -0
  131. package/dist/process/processes.js +456 -0
  132. package/dist/processes.js +1 -218
  133. package/dist/request-context.js +1 -0
  134. package/dist/review-checkpoints.js +1 -142
  135. package/dist/room-registry.js +1 -0
  136. package/dist/roots.js +1 -53
  137. package/dist/search-discovery.js +1 -271
  138. package/dist/serena-manager.js +1 -443
  139. package/dist/serena-tools.js +1 -411
  140. package/dist/server/dashboard-page-styles.js +331 -0
  141. package/dist/server/dashboard-page.js +1509 -0
  142. package/dist/server/dashboard-routes.js +46 -0
  143. package/dist/server/dashboard.js +240 -0
  144. package/dist/server/http-helpers.js +30 -0
  145. package/dist/server/integration-profile-update.js +37 -0
  146. package/dist/server/mcp-policy.js +169 -0
  147. package/dist/server/mcp-server-factory.js +127 -0
  148. package/dist/server/mcp-tool-registrar.js +182 -0
  149. package/dist/server/openai-session-hint.js +14 -0
  150. package/dist/server/tool-groups.js +29 -0
  151. package/dist/server/tool-logging.js +33 -0
  152. package/dist/server/tool-registration-shared.js +59 -0
  153. package/dist/server/tools/aseprite-advanced-tools-registration.js +547 -0
  154. package/dist/server/tools/aseprite-tools-registration.js +213 -0
  155. package/dist/server/tools/blender-tools-registration.js +690 -0
  156. package/dist/server/tools/core-file-tools-registration.js +459 -0
  157. package/dist/server/tools/dotnet-godot-window-tools-registration.js +120 -0
  158. package/dist/server/tools/godot-csharp-tools-registration.js +252 -0
  159. package/dist/server/tools/godot-gdscript-tools-registration.js +189 -0
  160. package/dist/server/tools/process-project-tools-registration.js +155 -0
  161. package/dist/server/tools/roblox-tools-registration.js +514 -0
  162. package/dist/server/tools/web-image-tools-registration.js +326 -0
  163. package/dist/server/tools/workspace-lifecycle-tools-registration.js +130 -0
  164. package/dist/server/ui-assets.js +97 -0
  165. package/dist/server/workspace-analytics.js +92 -0
  166. package/dist/server.js +453 -2713
  167. package/dist/session-registry.js +1 -0
  168. package/dist/shutdown.js +1 -0
  169. package/dist/skills.js +1 -45
  170. package/dist/sse-heartbeat.js +1 -0
  171. package/dist/tool-capabilities.js +1 -0
  172. package/dist/tool-result-budget.js +1 -0
  173. package/dist/tools/pi-tools.js +81 -0
  174. package/dist/tunnels/cloudflare-tunnel.js +217 -0
  175. package/dist/tunnels/cloudflared-service.js +174 -0
  176. package/dist/tunnels/ngrok-tunnel.js +220 -0
  177. package/dist/tunnels/tunnel-manager.js +186 -0
  178. package/dist/tunnels/tunnel-types.js +1 -0
  179. package/dist/tunnels/tunnel-utils.js +62 -0
  180. package/dist/ui/.vite/manifest.json +9 -2487
  181. package/dist/ui/assets/heavy-payload-D42A9ceL.js +1 -0
  182. package/dist/ui/assets/lightweight-diff-Cv4g9Hdr.js +13 -0
  183. package/dist/ui/assets/review-payload-DKIg1cKF.js +1 -0
  184. package/dist/ui/assets/workspace-app-CeK3NhmB.css +1 -0
  185. package/dist/ui/assets/{workspace-app-C5QsE314.js → workspace-app-CkUXnpl4.js} +6 -6
  186. package/dist/ui/brand-theme.js +23 -0
  187. package/dist/ui/workspace-app.html +15 -15
  188. package/dist/user-config.js +1 -57
  189. package/dist/view-image.js +1 -104
  190. package/dist/web-tools.js +1 -200
  191. package/dist/window-capture.js +1 -74
  192. package/dist/workspace/artifact-registry.js +69 -0
  193. package/dist/workspace/git-worktrees.js +141 -0
  194. package/dist/workspace/git.js +42 -0
  195. package/dist/workspace/review-checkpoints.js +142 -0
  196. package/dist/workspace/roots.js +56 -0
  197. package/dist/workspace/search-discovery.js +264 -0
  198. package/dist/workspace/skills.js +45 -0
  199. package/dist/workspace/workspace-store.js +219 -0
  200. package/dist/workspace/workspaces.js +314 -0
  201. package/dist/workspace-store.js +1 -125
  202. package/dist/workspaces.js +1 -226
  203. package/docs/CREATOR_STORE_FREE_ASSETS.md +162 -0
  204. package/docs/DEVELOPMENT_TOOLS.md +136 -93
  205. package/docs/assets/auvrynt-icon.png +0 -0
  206. package/docs/assets/auvrynt-icon.svg +20 -0
  207. package/docs/chatgpt-coding-workflow.md +143 -143
  208. package/docs/configuration.md +156 -124
  209. package/docs/diagnostics.md +79 -0
  210. package/docs/gotchas.md +244 -202
  211. package/docs/multi-agent-and-long-projects.md +91 -0
  212. package/docs/security.md +138 -100
  213. package/docs/setup.md +171 -131
  214. package/docs/source-layout.md +60 -0
  215. package/extensions/auvrynt_bridge/auvrynt_bridge.lua +594 -0
  216. package/extensions/auvrynt_bridge/live_analysis.lua +181 -0
  217. package/extensions/auvrynt_bridge/live_animation.lua +134 -0
  218. package/extensions/auvrynt_bridge/live_commands.lua +24 -0
  219. package/extensions/auvrynt_bridge/live_common.lua +130 -0
  220. package/extensions/auvrynt_bridge/live_document.lua +78 -0
  221. package/extensions/auvrynt_bridge/live_drawing.lua +125 -0
  222. package/extensions/auvrynt_bridge/live_effects.lua +91 -0
  223. package/extensions/auvrynt_bridge/live_palette_template.lua +167 -0
  224. package/extensions/auvrynt_bridge/live_selection.lua +110 -0
  225. package/extensions/auvrynt_bridge/live_structure.lua +129 -0
  226. package/extensions/auvrynt_bridge/package.json +17 -0
  227. package/guides/ASEPRITE_AGENT_GUIDE.md +133 -0
  228. package/guides/BLENDER_AGENT_GUIDE.md +472 -0
  229. package/guides/GODOT_AGENT_GUIDE.md +298 -0
  230. package/guides/PROJECT_ROUTER.md +165 -0
  231. package/guides/ROBLOX_AGENT_GUIDE.md +75 -0
  232. package/guides/SOFTWARE_AGENT_GUIDE.md +104 -0
  233. package/guides/WEB_AGENT_GUIDE.md +287 -0
  234. package/package.json +78 -70
  235. package/scripts/dev-server.mjs +121 -120
  236. package/scripts/live-tunnel-smoke.mjs +538 -0
  237. package/scripts/repo-hygiene.mjs +74 -0
  238. package/scripts/restart-after-crash.mjs +49 -0
  239. package/scripts/run-tests.mjs +166 -0
  240. package/dist/ui/assets/abap-CLvhMVsD.js +0 -1
  241. package/dist/ui/assets/actionscript-3--17pq3dv.js +0 -1
  242. package/dist/ui/assets/ada-C5qYipkI.js +0 -1
  243. package/dist/ui/assets/andromeeda-vGVdxbeo.js +0 -1
  244. package/dist/ui/assets/angular-html-BJqQFYI6.js +0 -1
  245. package/dist/ui/assets/angular-ts-CMJECO0Y.js +0 -1
  246. package/dist/ui/assets/apache-U0d_L8uA.js +0 -1
  247. package/dist/ui/assets/apex-CGTLDQj6.js +0 -1
  248. package/dist/ui/assets/apl-DWeXpBBr.js +0 -1
  249. package/dist/ui/assets/applescript-CCn79oCD.js +0 -1
  250. package/dist/ui/assets/ara-4CJ0cIlV.js +0 -1
  251. package/dist/ui/assets/asciidoc-DE70LPWp.js +0 -1
  252. package/dist/ui/assets/asm-Cmm7eHzH.js +0 -1
  253. package/dist/ui/assets/astro-CLbttLOq.js +0 -1
  254. package/dist/ui/assets/aurora-x-CDeNXAV0.js +0 -1
  255. package/dist/ui/assets/awk-BWXHIvNe.js +0 -1
  256. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +0 -1
  257. package/dist/ui/assets/ayu-light-C3h-C4tm.js +0 -1
  258. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +0 -1
  259. package/dist/ui/assets/ballerina-B7ZEbQpA.js +0 -1
  260. package/dist/ui/assets/bat-Bo4NYOV-.js +0 -1
  261. package/dist/ui/assets/beancount-D-usSTwE.js +0 -1
  262. package/dist/ui/assets/berry-DKpUyyne.js +0 -1
  263. package/dist/ui/assets/bibtex-Ci_nEsc7.js +0 -1
  264. package/dist/ui/assets/bicep-CUHmPFLl.js +0 -1
  265. package/dist/ui/assets/bird2-C2hNVINV.js +0 -1
  266. package/dist/ui/assets/blade-BOzY0P2V.js +0 -1
  267. package/dist/ui/assets/bsl-BkkzgIyY.js +0 -1
  268. package/dist/ui/assets/c-BG-8uJvh.js +0 -1
  269. package/dist/ui/assets/c3-CnJL0r0V.js +0 -1
  270. package/dist/ui/assets/cadence-CQ2zXKGN.js +0 -1
  271. package/dist/ui/assets/cairo-DLTphjLi.js +0 -1
  272. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +0 -1
  273. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +0 -1
  274. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +0 -1
  275. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +0 -1
  276. package/dist/ui/assets/clarity-SemFz856.js +0 -1
  277. package/dist/ui/assets/clojure-DqKBuwfJ.js +0 -1
  278. package/dist/ui/assets/cmake-Bj61d0ZC.js +0 -1
  279. package/dist/ui/assets/cobol-I_17IuGe.js +0 -1
  280. package/dist/ui/assets/codeowners-C8r90Shi.js +0 -1
  281. package/dist/ui/assets/codeql-oeQT6MSM.js +0 -1
  282. package/dist/ui/assets/coffee-C0B8hmok.js +0 -1
  283. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +0 -1
  284. package/dist/ui/assets/coq-BrsZFFmf.js +0 -1
  285. package/dist/ui/assets/cpp-DDJXt6Vs.js +0 -1
  286. package/dist/ui/assets/crystal-Bexqace6.js +0 -1
  287. package/dist/ui/assets/csharp-Ct8U2NOr.js +0 -1
  288. package/dist/ui/assets/css-DSQhw_9R.js +0 -1
  289. package/dist/ui/assets/csv-Dx-8-gkx.js +0 -1
  290. package/dist/ui/assets/cue-CE9AQfxI.js +0 -1
  291. package/dist/ui/assets/cypher-ClKdZ_lG.js +0 -1
  292. package/dist/ui/assets/d-qD-0Kul2.js +0 -1
  293. package/dist/ui/assets/dark-plus-Cs2F2srj.js +0 -1
  294. package/dist/ui/assets/dart-DkHntEIa.js +0 -1
  295. package/dist/ui/assets/dax-BkyTk9wS.js +0 -1
  296. package/dist/ui/assets/desktop-Dlh5hvp9.js +0 -1
  297. package/dist/ui/assets/diff-woXpYk--.js +0 -1
  298. package/dist/ui/assets/docker-IyjqRm3v.js +0 -1
  299. package/dist/ui/assets/dotenv-_5a1GRtc.js +0 -1
  300. package/dist/ui/assets/dracula-BHWKrbxM.js +0 -1
  301. package/dist/ui/assets/dracula-soft-5eyTD99u.js +0 -1
  302. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +0 -1
  303. package/dist/ui/assets/edge-Z8YYkHOr.js +0 -1
  304. package/dist/ui/assets/elixir-CG9uKtAF.js +0 -1
  305. package/dist/ui/assets/elm-GfWG2IfT.js +0 -1
  306. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +0 -1
  307. package/dist/ui/assets/erb-xe89e73J.js +0 -1
  308. package/dist/ui/assets/erlang-Cphh6RMH.js +0 -1
  309. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +0 -1
  310. package/dist/ui/assets/everforest-light-Df2xbC6M.js +0 -1
  311. package/dist/ui/assets/fennel-DQxkIbk2.js +0 -1
  312. package/dist/ui/assets/fish-BJitypiv.js +0 -1
  313. package/dist/ui/assets/fluent-C03EYrpw.js +0 -1
  314. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +0 -1
  315. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +0 -1
  316. package/dist/ui/assets/fsharp-D13ZGOAj.js +0 -1
  317. package/dist/ui/assets/gdresource-C0sCabJj.js +0 -1
  318. package/dist/ui/assets/gdscript-Cp2uCuqX.js +0 -1
  319. package/dist/ui/assets/gdshader-CBce3t8t.js +0 -1
  320. package/dist/ui/assets/genie-CV2tkWYe.js +0 -1
  321. package/dist/ui/assets/gherkin-DExj1W_8.js +0 -1
  322. package/dist/ui/assets/git-commit-BSykSTBG.js +0 -1
  323. package/dist/ui/assets/git-rebase-CoTL_uSE.js +0 -1
  324. package/dist/ui/assets/github-dark-C-LZuMrd.js +0 -1
  325. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +0 -1
  326. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +0 -1
  327. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +0 -1
  328. package/dist/ui/assets/github-light-EUqPIrTm.js +0 -1
  329. package/dist/ui/assets/github-light-default-BXViO-2h.js +0 -1
  330. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +0 -1
  331. package/dist/ui/assets/gleam-CSRkHgEL.js +0 -1
  332. package/dist/ui/assets/glimmer-js-DAn4UCSu.js +0 -1
  333. package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +0 -1
  334. package/dist/ui/assets/glsl-CtTDZoqR.js +0 -1
  335. package/dist/ui/assets/gn-ilITqXS6.js +0 -1
  336. package/dist/ui/assets/gnuplot-7GGW24-e.js +0 -1
  337. package/dist/ui/assets/go-BJwz_mda.js +0 -1
  338. package/dist/ui/assets/graphql-D5gcC_Jk.js +0 -1
  339. package/dist/ui/assets/groovy-CacY0gHj.js +0 -1
  340. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +0 -1
  341. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +0 -1
  342. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -1
  343. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +0 -1
  344. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +0 -1
  345. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +0 -1
  346. package/dist/ui/assets/hack-BJXY27dt.js +0 -1
  347. package/dist/ui/assets/haml-BLfFoZf7.js +0 -1
  348. package/dist/ui/assets/handlebars-Dw6CWkvN.js +0 -1
  349. package/dist/ui/assets/haskell-D8IpX4py.js +0 -1
  350. package/dist/ui/assets/haxe-OTjmBuCE.js +0 -1
  351. package/dist/ui/assets/hcl-Dh228itO.js +0 -1
  352. package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +0 -4
  353. package/dist/ui/assets/hjson-CxZEssPk.js +0 -1
  354. package/dist/ui/assets/hlsl-Cvrh5tZx.js +0 -1
  355. package/dist/ui/assets/horizon-CE9ld1lL.js +0 -1
  356. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +0 -1
  357. package/dist/ui/assets/houston-CsvMBhTu.js +0 -1
  358. package/dist/ui/assets/html-CAcAWvoN.js +0 -1
  359. package/dist/ui/assets/html-derivative-8aSW2E_7.js +0 -1
  360. package/dist/ui/assets/http-B2YR_3V1.js +0 -1
  361. package/dist/ui/assets/hurl-BnDJ9Zhf.js +0 -1
  362. package/dist/ui/assets/hxml-B0Qn7Nwc.js +0 -1
  363. package/dist/ui/assets/hy-CZbG8q4J.js +0 -1
  364. package/dist/ui/assets/imba-DsUTQ-LC.js +0 -1
  365. package/dist/ui/assets/ini-B5eOa1yu.js +0 -1
  366. package/dist/ui/assets/java-Doxi4W8u.js +0 -1
  367. package/dist/ui/assets/javascript-BbRdEqti.js +0 -1
  368. package/dist/ui/assets/jinja-CS3Tpv_Q.js +0 -1
  369. package/dist/ui/assets/jison-BkPGYVHR.js +0 -1
  370. package/dist/ui/assets/json-BMt1m3m8.js +0 -1
  371. package/dist/ui/assets/json5-BR5RXkoi.js +0 -1
  372. package/dist/ui/assets/jsonc-CYpm1nAK.js +0 -1
  373. package/dist/ui/assets/jsonl-CmCQp5Yx.js +0 -1
  374. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +0 -1
  375. package/dist/ui/assets/jssm-DXw9l8Rf.js +0 -1
  376. package/dist/ui/assets/jsx-CQKrJXXY.js +0 -1
  377. package/dist/ui/assets/julia-BuN7i2du.js +0 -1
  378. package/dist/ui/assets/just-BswEPFPu.js +0 -1
  379. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +0 -1
  380. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +0 -1
  381. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +0 -1
  382. package/dist/ui/assets/kdl-CsD5j6eV.js +0 -1
  383. package/dist/ui/assets/kotlin-DhhofPvG.js +0 -1
  384. package/dist/ui/assets/kusto-BUv0MjJC.js +0 -1
  385. package/dist/ui/assets/laserwave-C_8bwKvT.js +0 -1
  386. package/dist/ui/assets/latex-DU2VyFfA.js +0 -1
  387. package/dist/ui/assets/lean-CewbzKMR.js +0 -1
  388. package/dist/ui/assets/less-DVTAwKKz.js +0 -1
  389. package/dist/ui/assets/light-plus-DVQuIRkW.js +0 -1
  390. package/dist/ui/assets/liquid-Cmz1L3dq.js +0 -1
  391. package/dist/ui/assets/llvm-Cm23YOpf.js +0 -1
  392. package/dist/ui/assets/log-BNLmms1o.js +0 -1
  393. package/dist/ui/assets/logo-Cluzi2Zq.js +0 -1
  394. package/dist/ui/assets/lua-CfVXhkaJ.js +0 -1
  395. package/dist/ui/assets/luau-CNKltnaQ.js +0 -1
  396. package/dist/ui/assets/make-Dixweg8N.js +0 -1
  397. package/dist/ui/assets/markdown-BYOwaDjH.js +0 -1
  398. package/dist/ui/assets/marko-C5bfqGiA.js +0 -1
  399. package/dist/ui/assets/material-theme-Bm3Qr25_.js +0 -1
  400. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +0 -1
  401. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +0 -1
  402. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +0 -1
  403. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +0 -1
  404. package/dist/ui/assets/matlab-D7qyCx1q.js +0 -1
  405. package/dist/ui/assets/mdc-CVBXYfyq.js +0 -1
  406. package/dist/ui/assets/mdx-DQZ5AkYe.js +0 -1
  407. package/dist/ui/assets/mermaid-Bk4SNUv9.js +0 -1
  408. package/dist/ui/assets/min-dark-BSWPekZh.js +0 -1
  409. package/dist/ui/assets/min-light-DDpmG2fV.js +0 -1
  410. package/dist/ui/assets/mipsasm-BMqwQI7S.js +0 -1
  411. package/dist/ui/assets/mojo-BgCJLMeH.js +0 -1
  412. package/dist/ui/assets/monokai-CdkpiU2Y.js +0 -1
  413. package/dist/ui/assets/moonbit-CaWjb8XO.js +0 -1
  414. package/dist/ui/assets/move-B1IS1UjX.js +0 -1
  415. package/dist/ui/assets/narrat-_X_XdTYD.js +0 -1
  416. package/dist/ui/assets/nextflow-Bbiyy34d.js +0 -1
  417. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +0 -1
  418. package/dist/ui/assets/nginx-CzJafxLa.js +0 -1
  419. package/dist/ui/assets/night-owl-DhmEMT88.js +0 -1
  420. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +0 -1
  421. package/dist/ui/assets/nim-DABKtHtM.js +0 -1
  422. package/dist/ui/assets/nix-IvuFDN5E.js +0 -1
  423. package/dist/ui/assets/nord-Cb4Vim4T.js +0 -1
  424. package/dist/ui/assets/nushell-DcLAeLz5.js +0 -1
  425. package/dist/ui/assets/objective-c-D1A_Heim.js +0 -1
  426. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +0 -1
  427. package/dist/ui/assets/ocaml-O90oeIOV.js +0 -1
  428. package/dist/ui/assets/odin-B1RWQWA5.js +0 -1
  429. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +0 -1
  430. package/dist/ui/assets/one-light-D7Lr4KcI.js +0 -1
  431. package/dist/ui/assets/openscad-BUDT5pXO.js +0 -1
  432. package/dist/ui/assets/pascal-4ZHwLPI5.js +0 -1
  433. package/dist/ui/assets/perl-CBh7L3lZ.js +0 -1
  434. package/dist/ui/assets/php-DFbI9q5p.js +0 -1
  435. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +0 -1
  436. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +0 -1
  437. package/dist/ui/assets/pierre-light-DWBk51d8.js +0 -1
  438. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +0 -1
  439. package/dist/ui/assets/pkl-ot-7Btpt.js +0 -1
  440. package/dist/ui/assets/plastic-DQwYfKfQ.js +0 -1
  441. package/dist/ui/assets/plsql-DGHpHOYJ.js +0 -1
  442. package/dist/ui/assets/po-BiJDBrnU.js +0 -1
  443. package/dist/ui/assets/poimandres-DRFjx7u4.js +0 -1
  444. package/dist/ui/assets/polar-C7UOKdEL.js +0 -1
  445. package/dist/ui/assets/postcss-BXeXVLqQ.js +0 -1
  446. package/dist/ui/assets/powerquery-DNMTfnFr.js +0 -1
  447. package/dist/ui/assets/powershell-DshXNtvi.js +0 -1
  448. package/dist/ui/assets/prisma-BsRQq5mF.js +0 -1
  449. package/dist/ui/assets/prolog-iXnhIJG7.js +0 -1
  450. package/dist/ui/assets/proto-DB4EqR-F.js +0 -1
  451. package/dist/ui/assets/pug-C_PxC7gO.js +0 -1
  452. package/dist/ui/assets/puppet-CDv2pdJW.js +0 -1
  453. package/dist/ui/assets/purescript-9MfHhQsQ.js +0 -1
  454. package/dist/ui/assets/python-gzcpVVnB.js +0 -1
  455. package/dist/ui/assets/qml-DtngoFFK.js +0 -1
  456. package/dist/ui/assets/qmldir-DCQb3MpD.js +0 -1
  457. package/dist/ui/assets/qss-Fe1Jh2GI.js +0 -1
  458. package/dist/ui/assets/r-DohkcevW.js +0 -1
  459. package/dist/ui/assets/racket-DcIDlBhZ.js +0 -1
  460. package/dist/ui/assets/raku-B3gFvitq.js +0 -1
  461. package/dist/ui/assets/razor-C4t8J0_E.js +0 -1
  462. package/dist/ui/assets/red-CJ3rzSJv.js +0 -1
  463. package/dist/ui/assets/reg-CRGYupPL.js +0 -1
  464. package/dist/ui/assets/regexp-OGbTbjgY.js +0 -1
  465. package/dist/ui/assets/rel-BtDbiS_P.js +0 -1
  466. package/dist/ui/assets/review-payload-C5Qz60Kq.js +0 -1
  467. package/dist/ui/assets/riscv-Ckw8ddFX.js +0 -1
  468. package/dist/ui/assets/ron-VUp2lXgN.js +0 -1
  469. package/dist/ui/assets/rose-pine-BthvhNj6.js +0 -1
  470. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +0 -1
  471. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +0 -1
  472. package/dist/ui/assets/rosmsg-CAekHB0j.js +0 -1
  473. package/dist/ui/assets/rst-CfBbbcvC.js +0 -1
  474. package/dist/ui/assets/ruby-Bw0mpxHY.js +0 -1
  475. package/dist/ui/assets/rust-Cfkwpbl8.js +0 -1
  476. package/dist/ui/assets/sas-Cs3s9JOf.js +0 -1
  477. package/dist/ui/assets/sass-DXrisJhu.js +0 -1
  478. package/dist/ui/assets/scala-DKOlJaKm.js +0 -1
  479. package/dist/ui/assets/scheme-DQCgrYNe.js +0 -1
  480. package/dist/ui/assets/scss-sRxNJS54.js +0 -1
  481. package/dist/ui/assets/sdbl-bTVj8UrX.js +0 -1
  482. package/dist/ui/assets/shaderlab-TOUzSsQk.js +0 -1
  483. package/dist/ui/assets/shellscript-B0X6wh0R.js +0 -1
  484. package/dist/ui/assets/shellsession-D2FdOioR.js +0 -1
  485. package/dist/ui/assets/slack-dark-DnToyrRv.js +0 -1
  486. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +0 -1
  487. package/dist/ui/assets/smalltalk-B16xEiuN.js +0 -1
  488. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +0 -1
  489. package/dist/ui/assets/solarized-dark-DV17i1UV.js +0 -1
  490. package/dist/ui/assets/solarized-light-DSh2HLQt.js +0 -1
  491. package/dist/ui/assets/solidity-CKzVLygQ.js +0 -1
  492. package/dist/ui/assets/soy-s6g9OjJ1.js +0 -1
  493. package/dist/ui/assets/sparql-D_iOobhT.js +0 -1
  494. package/dist/ui/assets/splunk-BC2Px7Mm.js +0 -1
  495. package/dist/ui/assets/sql-DVTnh5V-.js +0 -1
  496. package/dist/ui/assets/ssh-config-BgfXC-Er.js +0 -1
  497. package/dist/ui/assets/stata-DFIDiXF9.js +0 -1
  498. package/dist/ui/assets/stylus-B6D30XZt.js +0 -1
  499. package/dist/ui/assets/surrealql-DVfrsLyg.js +0 -1
  500. package/dist/ui/assets/svelte-D5GsxESq.js +0 -1
  501. package/dist/ui/assets/swift-DonLKvLd.js +0 -1
  502. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +0 -1
  503. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +0 -1
  504. package/dist/ui/assets/systemd-BxMlprV5.js +0 -1
  505. package/dist/ui/assets/talonscript-CohzipZa.js +0 -1
  506. package/dist/ui/assets/tasl-DMoTqEGO.js +0 -1
  507. package/dist/ui/assets/tcl-CZd0xW_V.js +0 -1
  508. package/dist/ui/assets/templ-DI-Zyqzd.js +0 -1
  509. package/dist/ui/assets/terraform-DswuEJGm.js +0 -1
  510. package/dist/ui/assets/tex-WHHmlbJI.js +0 -1
  511. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +0 -1
  512. package/dist/ui/assets/toml-CcmNWLt0.js +0 -1
  513. package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +0 -1
  514. package/dist/ui/assets/tsv-sltzmVWM.js +0 -1
  515. package/dist/ui/assets/tsx-ph_idaAW.js +0 -1
  516. package/dist/ui/assets/turtle-ByJddavk.js +0 -1
  517. package/dist/ui/assets/twig-YO17jFjR.js +0 -1
  518. package/dist/ui/assets/typescript-CbAxjhkl.js +0 -1
  519. package/dist/ui/assets/typespec-B88KGewJ.js +0 -1
  520. package/dist/ui/assets/typst-DI99ib-x.js +0 -1
  521. package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +0 -244
  522. package/dist/ui/assets/v-DETTlOr0.js +0 -1
  523. package/dist/ui/assets/vala-zf12oZj6.js +0 -1
  524. package/dist/ui/assets/vb-Djn5o6TS.js +0 -1
  525. package/dist/ui/assets/verilog-CiiDBU1e.js +0 -1
  526. package/dist/ui/assets/vesper-D5bVUKB1.js +0 -1
  527. package/dist/ui/assets/vhdl-BroJfC0k.js +0 -1
  528. package/dist/ui/assets/viml-DvXPmvsu.js +0 -1
  529. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +0 -1
  530. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +0 -1
  531. package/dist/ui/assets/vitesse-light-VbXTXTou.js +0 -1
  532. package/dist/ui/assets/vue-CraHL-Ps.js +0 -1
  533. package/dist/ui/assets/vue-html-e9tyZNtS.js +0 -1
  534. package/dist/ui/assets/vue-vine-CofmxaUb.js +0 -1
  535. package/dist/ui/assets/vyper-CgoNMtux.js +0 -1
  536. package/dist/ui/assets/wasm-BnjxR4X6.js +0 -1
  537. package/dist/ui/assets/wasm-ByWQv1Qj.js +0 -1
  538. package/dist/ui/assets/wenyan-C8pVoKbM.js +0 -1
  539. package/dist/ui/assets/wgsl-BsKzXJz4.js +0 -1
  540. package/dist/ui/assets/wikitext-ClFFjSW2.js +0 -1
  541. package/dist/ui/assets/wit-DdvCle-K.js +0 -1
  542. package/dist/ui/assets/wolfram-DLL8P-h_.js +0 -1
  543. package/dist/ui/assets/workspace-app-8--oTbCd.css +0 -1
  544. package/dist/ui/assets/xml-BWSdPZHm.js +0 -1
  545. package/dist/ui/assets/xsl-BtCt7Hx8.js +0 -1
  546. package/dist/ui/assets/yaml-BZiTw7cQ.js +0 -1
  547. package/dist/ui/assets/zenscript-BnlCZFoB.js +0 -1
  548. package/dist/ui/assets/zig-CMLA9XwU.js +0 -1
  549. package/docs/assets/auvrynt-logo-light.png +0 -0
  550. package/docs/assets/auvrynt-screenshot.png +0 -0
@@ -0,0 +1,536 @@
1
+ import { readFile, writeFile, mkdir, readdir } from "node:fs/promises";
2
+ import { join, dirname, relative, basename } from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import { execFile } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ import { getBridgeClient } from "./godot-editor-bridge.js";
7
+ const execFileAsync = promisify(execFile);
8
+ export async function inspectGodotGdscriptEnvironment(registry, input) {
9
+ const workspace = registry.getWorkspace(input.workspaceId);
10
+ const root = registry.resolvePath(workspace, input.projectPath ?? ".");
11
+ const problems = [];
12
+ let godotExecutable = process.env.GODOT_EXECUTABLE || "godot";
13
+ let godotVersion = "";
14
+ try {
15
+ const { stdout } = await execFileAsync(godotExecutable, ["--version"], { windowsHide: true });
16
+ godotVersion = stdout.trim();
17
+ }
18
+ catch {
19
+ godotExecutable = "";
20
+ problems.push({
21
+ code: "GODOT_NOT_FOUND",
22
+ message: "Godot executable not found. Make sure 'godot' is in your PATH or set GODOT_EXECUTABLE.",
23
+ suggestedFix: "Set GODOT_EXECUTABLE environment variable.",
24
+ });
25
+ }
26
+ let usesGdscript = false;
27
+ let usesCsharp = false;
28
+ try {
29
+ const files = await scanWorkspaceDir(root);
30
+ usesGdscript = files.some((file) => file.endsWith(".gd"));
31
+ usesCsharp = files.some((file) => file.endsWith(".cs"));
32
+ }
33
+ catch { }
34
+ return {
35
+ godotExecutable: godotExecutable || undefined,
36
+ godotVersion: godotVersion || undefined,
37
+ editorBridgeConnected: getBridgeClient(input.workspaceId).status,
38
+ usesGdscript,
39
+ usesCsharp,
40
+ mixedLanguage: usesGdscript && usesCsharp,
41
+ problems,
42
+ };
43
+ }
44
+ async function scanWorkspaceDir(dir) {
45
+ const results = [];
46
+ async function scan(current) {
47
+ const entries = await readdir(current, { withFileTypes: true });
48
+ for (const entry of entries) {
49
+ const full = join(current, entry.name);
50
+ if ([".godot", "bin", "obj", ".git"].includes(entry.name))
51
+ continue;
52
+ if (entry.isDirectory())
53
+ await scan(full);
54
+ else if (entry.isFile())
55
+ results.push(full);
56
+ }
57
+ }
58
+ await scan(dir);
59
+ return results;
60
+ }
61
+ export async function getGdscriptDiagnostics(registry, input) {
62
+ const workspace = registry.getWorkspace(input.workspaceId);
63
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
64
+ const errors = [];
65
+ const warnings = [];
66
+ const scriptFiles = input.scriptPath
67
+ ? [registry.resolvePath(workspace, input.scriptPath)]
68
+ : (await scanWorkspaceDir(projectRoot)).filter((file) => file.endsWith(".gd"));
69
+ for (const script of scriptFiles) {
70
+ const relPath = relative(workspace.root, script);
71
+ try {
72
+ const content = await readFile(script, "utf8");
73
+ const lines = content.split(/\r?\n/);
74
+ let insideMultilineComment = false;
75
+ for (let index = 0; index < lines.length; index++) {
76
+ const rawLine = lines[index];
77
+ const line = rawLine.trim();
78
+ const lineNum = index + 1;
79
+ if (line.startsWith('"""')) {
80
+ insideMultilineComment = !insideMultilineComment;
81
+ continue;
82
+ }
83
+ if (insideMultilineComment || line.startsWith("#") || !line)
84
+ continue;
85
+ if (rawLine.startsWith(" ") && rawLine.startsWith("\t")) {
86
+ errors.push({ code: "MIXED_INDENTATION", message: "Mixed tabs and spaces in indentation.", path: relPath, line: lineNum, category: "parser" });
87
+ }
88
+ if (line.includes("yield(")) {
89
+ errors.push({ code: "DEPRECATED_YIELD", message: "Use of deprecated yield(). Use 'await' in Godot 4.", path: relPath, line: lineNum, category: "parser" });
90
+ }
91
+ if (line.startsWith("export var ")) {
92
+ errors.push({ code: "DEPRECATED_EXPORT", message: "Use of deprecated 'export var'. Use '@export var' or '@export' in Godot 4.", path: relPath, line: lineNum, category: "annotation" });
93
+ }
94
+ if (line.startsWith("onready var ")) {
95
+ errors.push({ code: "DEPRECATED_ONREADY", message: "Use of deprecated 'onready var'. Use '@onready var' in Godot 4.", path: relPath, line: lineNum, category: "annotation" });
96
+ }
97
+ const annotationMatch = line.match(/^@(\w+)/);
98
+ if (annotationMatch) {
99
+ const valid = ["export", "onready", "tool", "icon", "warning_ignore", "rpc", "export_range", "export_enum", "export_file", "export_dir", "export_multiline", "export_color_no_alpha", "export_node_path", "export_placeholder", "export_group", "export_subgroup", "export_category"];
100
+ if (!valid.includes(annotationMatch[1])) {
101
+ warnings.push({ code: "UNKNOWN_ANNOTATION", message: `Unknown or invalid annotation: @${annotationMatch[1]}`, path: relPath, line: lineNum, category: "annotation" });
102
+ }
103
+ }
104
+ }
105
+ }
106
+ catch (error) {
107
+ errors.push({ message: `Failed to read/parse script file: ${error.message}`, path: relPath, category: "parser" });
108
+ }
109
+ }
110
+ try {
111
+ const godotExecutable = process.env.GODOT_EXECUTABLE || "godot";
112
+ const { stderr } = await execFileAsync(godotExecutable, ["--headless", "--path", projectRoot, "--validate-scripts"], { timeout: 3000, windowsHide: true });
113
+ for (const line of stderr.toString().split("\n")) {
114
+ if (line.includes("ERROR:") || line.includes("SCRIPT ERROR:")) {
115
+ errors.push({ message: line.trim(), path: input.scriptPath || "project", category: "parser" });
116
+ }
117
+ }
118
+ }
119
+ catch { }
120
+ return { errors, warnings };
121
+ }
122
+ export async function inspectGdscript(registry, input) {
123
+ const workspace = registry.getWorkspace(input.workspaceId);
124
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
125
+ const lines = content.split(/\r?\n/);
126
+ let extendsType;
127
+ let className;
128
+ let toolScript = false;
129
+ const signals = [];
130
+ const exports = [];
131
+ const methods = [];
132
+ const nodePathReferences = [];
133
+ const preloadDependencies = [];
134
+ for (let index = 0; index < lines.length; index++) {
135
+ const line = lines[index].trim();
136
+ const lineNum = index + 1;
137
+ if (line.startsWith("extends "))
138
+ extendsType = line.substring(8).trim();
139
+ else if (line.startsWith("class_name "))
140
+ className = line.substring(11).trim();
141
+ else if (line.startsWith("@tool"))
142
+ toolScript = true;
143
+ else if (line.startsWith("signal ")) {
144
+ const match = line.match(/^signal\s+(\w+)(?:\((.*?)\))?/);
145
+ if (match) {
146
+ const parameters = (match[2] || "").split(",").map((parameter) => {
147
+ const parts = parameter.trim().split(":");
148
+ return { name: parts[0].trim(), type: parts[1]?.trim() };
149
+ }).filter((parameter) => parameter.name);
150
+ signals.push({ name: match[1], parameters });
151
+ }
152
+ }
153
+ else if (line.startsWith("@export") || line.startsWith("export ")) {
154
+ const nameMatch = line.match(/(?:var\s+)?(\w+)\s*(?::|=)/) || line.match(/var\s+(\w+)/);
155
+ if (nameMatch) {
156
+ const typeMatch = line.match(/:([^\s=]+)/);
157
+ const valueMatch = line.match(/=\s*(.+)$/);
158
+ const annotationMatch = line.match(/^@export\w*/);
159
+ exports.push({ name: nameMatch[1], type: typeMatch?.[1].trim(), defaultValue: valueMatch?.[1].trim(), annotation: annotationMatch?.[0] });
160
+ }
161
+ }
162
+ else if (line.startsWith("func ") || line.startsWith("static func ")) {
163
+ const match = line.match(/func\s+(\w+)\s*\((.*?)\)(?:\s*->\s*([^\s:]+))?/);
164
+ if (match)
165
+ methods.push({ name: match[1], parameters: match[2].split(",").map((value) => value.trim()).filter(Boolean), returnType: match[3], static: line.startsWith("static "), line: lineNum });
166
+ }
167
+ for (const match of line.match(/\$(?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_\/]+))/g) ?? [])
168
+ nodePathReferences.push({ path: match, line: lineNum });
169
+ for (const match of line.match(/(?:preload|load)\((?:"([^"]+)"|'([^']+)')\)/g) ?? [])
170
+ preloadDependencies.push({ path: match, line: lineNum });
171
+ }
172
+ return { extendsType, className, toolScript, signals, exports, methods, nodePathReferences, preloadDependencies };
173
+ }
174
+ export async function createGdscript(registry, input) {
175
+ const workspace = registry.getWorkspace(input.workspaceId);
176
+ const absolutePath = registry.resolvePath(workspace, input.outputPath);
177
+ if (existsSync(absolutePath))
178
+ throw new Error(`File already exists: ${input.outputPath}`);
179
+ await mkdir(dirname(absolutePath), { recursive: true });
180
+ const lines = [];
181
+ if (input.toolScript)
182
+ lines.push("@tool");
183
+ if (input.className)
184
+ lines.push(`class_name ${input.className}`);
185
+ lines.push(`extends ${input.baseType}`, "");
186
+ if (input.template === "node")
187
+ lines.push("func _ready() -> void:", "\tpass", "", "func _process(delta: float) -> void:", "\tpass");
188
+ else if (input.template === "editor_plugin")
189
+ lines.push("func _enter_tree() -> void:", "\tpass", "", "func _exit_tree() -> void:", "\tpass");
190
+ await writeFile(absolutePath, lines.join("\n"), "utf8");
191
+ return { path: input.outputPath, created: true };
192
+ }
193
+ export async function attachGdscript(registry, input) {
194
+ const workspace = registry.getWorkspace(input.workspaceId);
195
+ const absScriptPath = registry.resolvePath(workspace, input.scriptPath);
196
+ const relScriptPath = relative(workspace.root, absScriptPath).replace(/\\/g, "/");
197
+ const result = await getBridgeClient(input.workspaceId).sendRequest("node.attach_script", {
198
+ nodePath: input.nodePath,
199
+ scriptPath: `res://${relScriptPath}`,
200
+ });
201
+ return { attached: !!result?.attached };
202
+ }
203
+ export async function detachGdscript(registry, input) {
204
+ const result = await getBridgeClient(input.workspaceId).sendRequest("node.detach_script", { nodePath: input.nodePath });
205
+ return { detached: !!result?.detached };
206
+ }
207
+ export async function createGdscriptSignal(registry, input) {
208
+ const workspace = registry.getWorkspace(input.workspaceId);
209
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
210
+ const content = await readFile(absPath, "utf8");
211
+ if (content.includes(`signal ${input.signalName}`))
212
+ throw new Error(`Signal ${input.signalName} already exists in script.`);
213
+ const lines = content.split(/\r?\n/);
214
+ const paramsStr = (input.parameters ?? []).map((parameter) => parameter.type ? `${parameter.name}: ${parameter.type}` : parameter.name).join(", ");
215
+ const signalLine = paramsStr ? `signal ${input.signalName}(${paramsStr})` : `signal ${input.signalName}`;
216
+ let insertIdx = 0;
217
+ for (let index = 0; index < lines.length; index++) {
218
+ if (lines[index].startsWith("extends ") || lines[index].startsWith("class_name ") || lines[index].startsWith("@tool"))
219
+ insertIdx = index + 1;
220
+ }
221
+ lines.splice(insertIdx, 0, signalLine);
222
+ await writeFile(absPath, lines.join("\n"), "utf8");
223
+ return { success: true };
224
+ }
225
+ export async function createGdscriptSignalHandler(registry, input) {
226
+ const workspace = registry.getWorkspace(input.workspaceId);
227
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
228
+ const content = await readFile(absPath, "utf8");
229
+ if (content.includes(`func ${input.methodName}`))
230
+ throw new Error(`Method ${input.methodName} already exists in script.`);
231
+ const paramsStr = (input.parameters ?? []).map((parameter) => parameter.type ? `${parameter.name}: ${parameter.type}` : parameter.name).join(", ");
232
+ const lines = content.split(/\r?\n/);
233
+ lines.push("", `func ${input.methodName}(${paramsStr}) -> void:`, "\tpass");
234
+ await writeFile(absPath, lines.join("\n"), "utf8");
235
+ return { success: true };
236
+ }
237
+ export async function getGlobalClasses(registry, input) {
238
+ const workspace = registry.getWorkspace(input.workspaceId);
239
+ const gdscriptFiles = (await scanWorkspaceDir(workspace.root)).filter((file) => file.endsWith(".gd"));
240
+ const classes = [];
241
+ for (const file of gdscriptFiles) {
242
+ const content = await readFile(file, "utf8");
243
+ const classMatch = content.match(/^class_name\s+(\w+)/m);
244
+ if (classMatch) {
245
+ const extendsMatch = content.match(/^extends\s+(\w+)/m);
246
+ classes.push({ className: classMatch[1], baseType: extendsMatch ? extendsMatch[1] : "RefCounted", scriptPath: relative(workspace.root, file).replace(/\\/g, "/") });
247
+ }
248
+ }
249
+ return classes;
250
+ }
251
+ export async function addClassName(registry, input) {
252
+ const workspace = registry.getWorkspace(input.workspaceId);
253
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
254
+ const content = await readFile(absPath, "utf8");
255
+ if (content.includes("class_name "))
256
+ throw new Error("Script already has a class_name defined.");
257
+ const lines = content.split(/\r?\n/);
258
+ let insertIdx = 0;
259
+ for (let index = 0; index < lines.length; index++) {
260
+ if (lines[index].startsWith("extends ") || lines[index].startsWith("@tool"))
261
+ insertIdx = index + 1;
262
+ }
263
+ lines.splice(insertIdx, 0, `class_name ${input.className}`);
264
+ await writeFile(absPath, lines.join("\n"), "utf8");
265
+ return { success: true };
266
+ }
267
+ export async function removeClassName(registry, input) {
268
+ const workspace = registry.getWorkspace(input.workspaceId);
269
+ const absPath = registry.resolvePath(workspace, input.scriptPath);
270
+ const content = await readFile(absPath, "utf8");
271
+ const classMatch = content.match(/^class_name\s+(\w+)/m);
272
+ const warnings = classMatch ? [`References to global class '${classMatch[1]}' in other scenes/scripts may be broken.`] : [];
273
+ await writeFile(absPath, content.split(/\r?\n/).filter((line) => !line.startsWith("class_name ")).join("\n"), "utf8");
274
+ return { success: true, warnings };
275
+ }
276
+ export async function addGdscriptAutoload(registry, input) {
277
+ const workspace = registry.getWorkspace(input.workspaceId);
278
+ const godotFile = join(workspace.root, "project.godot");
279
+ if (!existsSync(godotFile))
280
+ throw new Error("No project.godot found at workspace root.");
281
+ const lines = (await readFile(godotFile, "utf8")).split(/\r?\n/);
282
+ const autoloadSecIdx = lines.findIndex((line) => line.trim() === "[autoload]");
283
+ const relScriptPath = relative(workspace.root, registry.resolvePath(workspace, input.scriptPath)).replace(/\\/g, "/");
284
+ const autoloadLine = `${input.singletonName}="*res://${relScriptPath}"`;
285
+ if (autoloadSecIdx === -1)
286
+ lines.push("", "[autoload]", autoloadLine);
287
+ else {
288
+ if (lines.some((line) => line.startsWith(`${input.singletonName}=`)))
289
+ throw new Error(`Autoload singleton '${input.singletonName}' already exists.`);
290
+ lines.splice(autoloadSecIdx + 1, 0, autoloadLine);
291
+ }
292
+ await writeFile(godotFile, lines.join("\n"), "utf8");
293
+ return { success: true };
294
+ }
295
+ export async function getAutoloadUsage(registry, input) {
296
+ const workspace = registry.getWorkspace(input.workspaceId);
297
+ const scriptFiles = (await scanWorkspaceDir(workspace.root)).filter((file) => file.endsWith(".gd") || file.endsWith(".cs"));
298
+ const results = [];
299
+ for (const file of scriptFiles) {
300
+ const lines = (await readFile(file, "utf8")).split(/\r?\n/);
301
+ for (let index = 0; index < lines.length; index++) {
302
+ if (lines[index].includes(input.singletonName))
303
+ results.push({ path: relative(workspace.root, file), line: index + 1, text: lines[index].trim() });
304
+ }
305
+ }
306
+ return results;
307
+ }
308
+ export async function inspectToolScript(registry, input) {
309
+ const workspace = registry.getWorkspace(input.workspaceId);
310
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
311
+ const toolScript = content.includes("@tool");
312
+ const methods = [];
313
+ const warnings = [];
314
+ if (toolScript) {
315
+ for (const line of content.split(/\r?\n/)) {
316
+ const match = line.match(/func\s+(\w+)/);
317
+ if (match)
318
+ methods.push(match[1]);
319
+ }
320
+ warnings.push("Tool scripts run inside the editor. Avoid modifying files or running subprocesses in tool script code.");
321
+ }
322
+ return { toolScript, methods, warnings };
323
+ }
324
+ export async function createEditorPlugin(registry, input) {
325
+ const workspace = registry.getWorkspace(input.workspaceId);
326
+ const addonDir = join(workspace.root, "addons", input.pluginName);
327
+ await mkdir(addonDir, { recursive: true });
328
+ const cfgPath = join(addonDir, "plugin.cfg");
329
+ const gdPath = join(addonDir, "plugin.gd");
330
+ await writeFile(cfgPath, `[plugin]\n\nname="${input.pluginName}"\ndescription="${input.description ?? "A Auvrynt generated editor plugin"}"\nauthor="${input.author ?? "Auvrynt Agent"}"\nversion="${input.version ?? "1.0.0"}"\nscript="plugin.gd"\n`, "utf8");
331
+ await writeFile(gdPath, `@tool\nextends EditorPlugin\n\nfunc _enter_tree() -> void:\n\tprint("[${input.pluginName}] Plugin enabled.")\n\nfunc _exit_tree() -> void:\n\tprint("[${input.pluginName}] Plugin disabled.")\n`, "utf8");
332
+ return { success: true, filesCreated: [relative(workspace.root, cfgPath).replace(/\\/g, "/"), relative(workspace.root, gdPath).replace(/\\/g, "/")] };
333
+ }
334
+ export async function getGdscriptDependencies(registry, input) {
335
+ const workspace = registry.getWorkspace(input.workspaceId);
336
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
337
+ const results = [];
338
+ for (const line of content.split(/\r?\n/)) {
339
+ const preload = line.match(/preload\((?:"([^"]+)"|'([^']+)')\)/);
340
+ if (preload) {
341
+ const path = preload[1] || preload[2];
342
+ results.push({ path, loadType: "preload", exists: existsSync(join(workspace.root, path.replace("res://", ""))) });
343
+ }
344
+ const loadMatch = line.match(/load\((?:"([^"]+)"|'([^']+)')\)/);
345
+ if (loadMatch) {
346
+ const path = loadMatch[1] || loadMatch[2];
347
+ results.push({ path, loadType: "load", exists: existsSync(join(workspace.root, path.replace("res://", ""))) });
348
+ }
349
+ }
350
+ return results;
351
+ }
352
+ export async function findCyclicScriptDependencies(registry, input) {
353
+ const workspace = registry.getWorkspace(input.workspaceId);
354
+ const graph = new Map();
355
+ for (const file of (await scanWorkspaceDir(workspace.root)).filter((candidate) => candidate.endsWith(".gd"))) {
356
+ const relPath = relative(workspace.root, file).replace(/\\/g, "/");
357
+ const preloads = [];
358
+ for (const line of (await readFile(file, "utf8")).split(/\r?\n/)) {
359
+ const preload = line.match(/preload\((?:"([^"]+)"|'([^']+)')\)/);
360
+ if (preload)
361
+ preloads.push((preload[1] || preload[2]).replace("res://", ""));
362
+ }
363
+ graph.set(relPath, preloads);
364
+ }
365
+ const cycles = [];
366
+ const visited = new Set();
367
+ const stack = new Set();
368
+ function dfs(node, currentPath) {
369
+ visited.add(node);
370
+ stack.add(node);
371
+ currentPath.push(node);
372
+ for (const neighbor of graph.get(node) ?? []) {
373
+ if (stack.has(neighbor)) {
374
+ const cycleStart = currentPath.indexOf(neighbor);
375
+ if (cycleStart !== -1)
376
+ cycles.push(currentPath.slice(cycleStart));
377
+ }
378
+ else if (!visited.has(neighbor))
379
+ dfs(neighbor, [...currentPath]);
380
+ }
381
+ stack.delete(node);
382
+ }
383
+ for (const node of graph.keys())
384
+ if (!visited.has(node))
385
+ dfs(node, []);
386
+ return cycles;
387
+ }
388
+ export async function getGdscriptNodeReferences(registry, input) {
389
+ const workspace = registry.getWorkspace(input.workspaceId);
390
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
391
+ const results = [];
392
+ for (const [index, line] of content.split(/\r?\n/).entries()) {
393
+ const dollar = line.match(/\$(?:"([^"]+)"|'([^']+)'|([a-zA-Z0-9_\/]+))/);
394
+ if (dollar) {
395
+ const path = dollar[1] || dollar[2] || dollar[3];
396
+ results.push({ path, style: path.startsWith("%") ? "unique" : "dollar", line: index + 1 });
397
+ }
398
+ const getNode = line.match(/get_node\((?:"([^"]+)"|'([^']+)')\)/);
399
+ if (getNode)
400
+ results.push({ path: getNode[1] || getNode[2], style: "get_node", line: index + 1 });
401
+ }
402
+ return results;
403
+ }
404
+ export async function getGdscriptLifecycleMethods(registry, input) {
405
+ const workspace = registry.getWorkspace(input.workspaceId);
406
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
407
+ const methods = ["_init", "_enter_tree", "_ready", "_process", "_physics_process", "_input", "_unhandled_input", "_exit_tree", "_draw"];
408
+ const results = [];
409
+ for (const [index, raw] of content.split(/\r?\n/).entries()) {
410
+ const line = raw.trim();
411
+ const match = line.match(/func\s+(_\w+)/);
412
+ if (match && methods.includes(match[1])) {
413
+ const warnings = [];
414
+ if ((match[1] === "_process" || match[1] === "_physics_process") && !line.includes("delta"))
415
+ warnings.push(`Lifecycle method ${match[1]} does not reference 'delta'.`);
416
+ results.push({ method: match[1], line: index + 1, warnings });
417
+ }
418
+ }
419
+ return results;
420
+ }
421
+ export async function inspectGdscriptAwaitUsage(registry, input) {
422
+ const workspace = registry.getWorkspace(input.workspaceId);
423
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
424
+ const results = [];
425
+ for (const [index, raw] of content.split(/\r?\n/).entries()) {
426
+ const match = raw.trim().match(/await\s+(.+)$/);
427
+ if (!match)
428
+ continue;
429
+ const expression = match[1];
430
+ const warning = !expression.includes(".") && !expression.includes("(")
431
+ ? "Awaiting a symbol directly. Ensure it resolves to a signal or a Callable."
432
+ : undefined;
433
+ results.push({ line: index + 1, expression, warning });
434
+ }
435
+ return results;
436
+ }
437
+ export async function analyzeGdscriptTyping(registry, input) {
438
+ const workspace = registry.getWorkspace(input.workspaceId);
439
+ const content = await readFile(registry.resolvePath(workspace, input.scriptPath), "utf8");
440
+ let variables = 0;
441
+ let typedVariables = 0;
442
+ let parameters = 0;
443
+ let typedParameters = 0;
444
+ let returns = 0;
445
+ let typedReturns = 0;
446
+ for (const raw of content.split(/\r?\n/)) {
447
+ const line = raw.trim();
448
+ if (line.startsWith("var ") || line.startsWith("@onready var ") || line.startsWith("@export var ")) {
449
+ variables++;
450
+ if (line.includes(":") || line.includes(":="))
451
+ typedVariables++;
452
+ }
453
+ if (line.startsWith("func ")) {
454
+ returns++;
455
+ if (line.includes("->"))
456
+ typedReturns++;
457
+ const parameterMatch = line.match(/\((.*?)\)/);
458
+ if (parameterMatch?.[1]) {
459
+ for (const parameter of parameterMatch[1].split(",").map((value) => value.trim())) {
460
+ parameters++;
461
+ if (parameter.includes(":"))
462
+ typedParameters++;
463
+ }
464
+ }
465
+ }
466
+ }
467
+ return {
468
+ typedVariablesPercentage: variables ? Math.round((typedVariables / variables) * 100) : 100,
469
+ typedParametersPercentage: parameters ? Math.round((typedParameters / parameters) * 100) : 100,
470
+ typedReturnsPercentage: returns ? Math.round((typedReturns / returns) * 100) : 100,
471
+ };
472
+ }
473
+ export async function formatGdscript(registry, input) {
474
+ const workspace = registry.getWorkspace(input.workspaceId);
475
+ const file = input.scriptPath ? registry.resolvePath(workspace, input.scriptPath) : workspace.root;
476
+ try {
477
+ await execFileAsync("gdformat", input.verifyOnly ? ["--check", file] : [file], { windowsHide: true });
478
+ return { formatted: !input.verifyOnly, verified: true };
479
+ }
480
+ catch {
481
+ return { formatted: false, verified: false };
482
+ }
483
+ }
484
+ export async function detectGdscriptTests(registry, input) {
485
+ const workspace = registry.getWorkspace(input.workspaceId);
486
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
487
+ const framework = existsSync(join(projectRoot, "addons", "gut")) ? "gut" : "none";
488
+ const testScripts = (await scanWorkspaceDir(projectRoot))
489
+ .filter((file) => basename(file).startsWith("test_") && file.endsWith(".gd"))
490
+ .map((file) => relative(workspace.root, file).replace(/\\/g, "/"));
491
+ return { framework, testDirectories: [], testScripts };
492
+ }
493
+ export async function runGdscriptTests(registry, input) {
494
+ const workspace = registry.getWorkspace(input.workspaceId);
495
+ const projectRoot = registry.resolvePath(workspace, input.projectPath);
496
+ const args = ["--headless", "--path", projectRoot, "-s", "addons/gut/gut_cmdline.gd"];
497
+ if (input.testPath)
498
+ args.push(`-gselect=${input.testPath}`);
499
+ const start = performance.now();
500
+ try {
501
+ const { stdout, stderr } = await execFileAsync(process.env.GODOT_EXECUTABLE || "godot", args, { timeout: 30000, windowsHide: true });
502
+ const logs = stdout.toString() + stderr.toString();
503
+ return {
504
+ passed: Number(logs.match(/(\d+) passed/)?.[1] ?? 0),
505
+ failed: Number(logs.match(/(\d+) failed/)?.[1] ?? 0),
506
+ skipped: 0,
507
+ duration: Math.round(performance.now() - start),
508
+ logs,
509
+ };
510
+ }
511
+ catch (error) {
512
+ return { passed: 0, failed: 0, skipped: 0, duration: Math.round(performance.now() - start), logs: `Failed to execute test suite: ${error.message}` };
513
+ }
514
+ }
515
+ export async function reloadGdscript(registry, input) {
516
+ const result = await getBridgeClient(input.workspaceId).sendRequest("gdscript.reload", { scriptPath: input.scriptPath });
517
+ return { reloaded: !!result?.reloaded };
518
+ }
519
+ export async function setBreakpoint(registry, input) {
520
+ await getBridgeClient(input.workspaceId).sendRequest("debugger.set_breakpoint", { scriptPath: input.scriptPath, line: input.line });
521
+ return { success: true };
522
+ }
523
+ export async function removeBreakpoint(registry, input) {
524
+ await getBridgeClient(input.workspaceId).sendRequest("debugger.remove_breakpoint", { scriptPath: input.scriptPath, line: input.line });
525
+ return { success: true };
526
+ }
527
+ export async function lspFindSymbol(registry, input) {
528
+ return getBridgeClient(input.workspaceId).sendRequest("lsp.find_symbol", { symbol: input.symbol });
529
+ }
530
+ export async function lspGetDefinition(registry, input) {
531
+ return getBridgeClient(input.workspaceId).sendRequest("lsp.get_definition", {
532
+ scriptPath: input.scriptPath,
533
+ line: input.line,
534
+ character: input.character,
535
+ });
536
+ }