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,289 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { assertInteger, assertPositiveInteger, errorResponse, luaString, openSpriteScript, parseColor, resolveAsepriteExecutable, runLua, sanitizeCliOutput, textResponse, workspacePath, } from "./aseprite-tools.js";
6
+ import { asepriteFileSafety, assertAsepriteExpectedVersion } from "./aseprite-safety-tools.js";
7
+ const execFileAsync = promisify(execFile);
8
+ const MAX_DRAW_POINTS = 16_384;
9
+ const MAX_TILE_CELLS = 65_536;
10
+ const MAX_TILE_PIXELS = 65_536;
11
+ async function prepareMutation(config, registry, workspaceId, filePath, guard, label) {
12
+ await assertAsepriteExpectedVersion(registry, workspaceId, filePath, guard.expectedVersion);
13
+ if (guard.checkpoint !== false) {
14
+ const response = await asepriteFileSafety(config, registry, {
15
+ workspaceId,
16
+ filePath,
17
+ action: "checkpoint",
18
+ expectedVersion: guard.expectedVersion,
19
+ label,
20
+ });
21
+ if (response.isError) {
22
+ const message = response.content[0]?.type === "text" ? response.content[0].text : "Checkpoint failed.";
23
+ throw new Error(message);
24
+ }
25
+ }
26
+ }
27
+ function luaColor(value) {
28
+ const color = parseColor(value);
29
+ return `{r=${color.r},g=${color.g},b=${color.b},a=${color.a}}`;
30
+ }
31
+ export async function asepriteDrawAdvanced(config, registry, input) {
32
+ try {
33
+ await prepareMutation(config, registry, input.workspaceId, input.filePath, input, `draw-${input.action}`);
34
+ const file = workspacePath(registry, input.workspaceId, input.filePath);
35
+ const frame = assertPositiveInteger(input.frame ?? 1, "frame");
36
+ const points = (input.points ?? []).map((point) => ({
37
+ x: assertInteger(point.x, "point.x"),
38
+ y: assertInteger(point.y, "point.y"),
39
+ }));
40
+ if (points.length > MAX_DRAW_POINTS)
41
+ throw new Error(`A maximum of ${MAX_DRAW_POINTS} points is supported.`);
42
+ const bounds = input.bounds ? {
43
+ x: assertInteger(input.bounds.x, "bounds.x"),
44
+ y: assertInteger(input.bounds.y, "bounds.y"),
45
+ width: assertPositiveInteger(input.bounds.width, "bounds.width"),
46
+ height: assertPositiveInteger(input.bounds.height, "bounds.height"),
47
+ } : undefined;
48
+ const opacity = Math.max(0, Math.min(255, assertInteger(input.opacity ?? 255, "opacity")));
49
+ const thickness = Math.max(1, Math.min(64, assertInteger(input.thickness ?? 1, "thickness")));
50
+ const primary = luaColor(input.color ?? "#000000FF");
51
+ const secondary = luaColor(input.secondaryColor ?? "#FFFFFFFF");
52
+ const pointsLua = `{${points.map((point) => `Point(${point.x},${point.y})`).join(",")}}`;
53
+ const result = await runLua(config, registry, input.workspaceId, `
54
+ ${openSpriteScript(file.absolute)}
55
+ if ${frame}>#sprite.frames then fail("Frame is outside the sprite") end
56
+ local layer=${input.layer ? `find_layer(sprite.layers,${luaString(input.layer)})` : "sprite.layers[1]"}
57
+ if layer==nil or layer.isGroup or layer.isTilemap then fail("A normal drawable layer was not found") end
58
+ app.activeSprite=sprite app.activeLayer=layer app.activeFrame=sprite.frames[${frame}]
59
+ local cel=ensure_canvas_cel(sprite,layer,${frame})
60
+ local action=${luaString(input.action)}
61
+ local primary=Color(${primary})
62
+ local secondary=Color(${secondary})
63
+ if action=="ellipse" then
64
+ local bounds=Rectangle(${bounds?.x ?? 0},${bounds?.y ?? 0},${bounds?.width ?? 1},${bounds?.height ?? 1})
65
+ app.useTool{tool=${luaString(input.fill ? "filled_ellipse" : "ellipse")},color=primary,opacity=${opacity},brush=Brush{type=BrushType.CIRCLE,size=${thickness}},points={Point(bounds.x,bounds.y),Point(bounds.x+bounds.width-1,bounds.y+bounds.height-1)}}
66
+ elseif action=="polygon" then
67
+ local points=${pointsLua}
68
+ if #points<3 then fail("Polygon requires at least three points") end
69
+ if ${input.fill === true ? "true" : "false"} then
70
+ local min_y=points[1].y local max_y=points[1].y
71
+ for _,point in ipairs(points) do if point.y<min_y then min_y=point.y end if point.y>max_y then max_y=point.y end end
72
+ local image=cel.image local pixel=color_pixel(sprite,{r=primary.red,g=primary.green,b=primary.blue,a=primary.alpha})
73
+ for y=min_y,max_y do
74
+ local intersections={}
75
+ local previous=points[#points]
76
+ for _,current in ipairs(points) do
77
+ if (current.y<=y and previous.y>y) or (previous.y<=y and current.y>y) then
78
+ local x=current.x+(y-current.y)*(previous.x-current.x)/(previous.y-current.y)
79
+ table.insert(intersections,math.floor(x+0.5))
80
+ end
81
+ previous=current
82
+ end
83
+ table.sort(intersections)
84
+ for index=1,#intersections-1,2 do
85
+ for x=intersections[index],intersections[index+1] do if x>=0 and y>=0 and x<sprite.width and y<sprite.height then image:drawPixel(x,y,pixel) end end
86
+ end
87
+ end
88
+ end
89
+ app.useTool{tool="polygon",color=primary,opacity=${opacity},brush=Brush{type=BrushType.CIRCLE,size=${thickness}},points=points}
90
+ elseif action=="gradient" then
91
+ local points=${pointsLua}
92
+ if #points~=2 then fail("Gradient requires exactly two points") end
93
+ app.fgColor=primary app.bgColor=secondary
94
+ app.useTool{tool="gradient",points=points,opacity=${opacity}}
95
+ elseif action=="flood_fill" then
96
+ local points=${pointsLua}
97
+ if #points~=1 then fail("Flood fill requires exactly one point") end
98
+ app.preferences.tool("paint_bucket").floodfill.pixel_connectivity=${input.connectivity === 8 ? 1 : 0}
99
+ app.useTool{tool="paint_bucket",color=primary,opacity=${opacity},points=points}
100
+ elseif action=="outline" then
101
+ local image=cel.image
102
+ local original=Image(image)
103
+ local outline_pixel=color_pixel(sprite,{r=primary.red,g=primary.green,b=primary.blue,a=primary.alpha})
104
+ local diagonal=${input.includeDiagonal === true ? "true" : "false"}
105
+ for pass=1,${thickness} do
106
+ local next_image=Image(image)
107
+ for y=0,sprite.height-1 do for x=0,sprite.width-1 do
108
+ if pixel_rgba(sprite,image:getPixel(x,y)).a==0 then
109
+ local adjacent=false
110
+ for dy=-1,1 do for dx=-1,1 do
111
+ if not (dx==0 and dy==0) and (diagonal or dx==0 or dy==0) then
112
+ local nx=x+dx local ny=y+dy
113
+ if nx>=0 and ny>=0 and nx<sprite.width and ny<sprite.height and pixel_rgba(sprite,image:getPixel(nx,ny)).a>0 then adjacent=true end
114
+ end
115
+ end end
116
+ if adjacent then next_image:drawPixel(x,y,outline_pixel) end
117
+ end
118
+ end end
119
+ image=next_image
120
+ end
121
+ image:drawImage(original,Point(0,0))
122
+ cel.image=image
123
+ else fail("Unsupported advanced drawing action") end
124
+ if not sprite:saveAs(${luaString(file.absolute)}) then fail("Unable to save sprite") end
125
+ emit_result({file=${luaString(file.relative)},action=action,layer=layer.name,frame=${frame}})
126
+ sprite:close()
127
+ `);
128
+ return textResponse(result);
129
+ }
130
+ catch (error) {
131
+ return errorResponse(error instanceof Error ? error.message : String(error));
132
+ }
133
+ }
134
+ export async function asepriteManageTilemap(config, registry, input) {
135
+ try {
136
+ const file = workspacePath(registry, input.workspaceId, input.filePath);
137
+ const frame = assertPositiveInteger(input.frame ?? 1, "frame");
138
+ if (input.action !== "inspect" && input.action !== "export_tileset") {
139
+ await prepareMutation(config, registry, input.workspaceId, input.filePath, input, `tilemap-${input.action}`);
140
+ }
141
+ if (input.action === "export_tileset") {
142
+ if (!input.outputPath)
143
+ throw new Error("outputPath is required.");
144
+ const output = workspacePath(registry, input.workspaceId, input.outputPath);
145
+ await mkdir(dirname(output.absolute), { recursive: true });
146
+ const executable = await resolveAsepriteExecutable(config);
147
+ const args = ["-b", file.absolute];
148
+ if (input.layer)
149
+ args.push("--layer", input.layer);
150
+ args.push("--export-tileset", "--save-as", output.absolute);
151
+ const { stdout, stderr } = await execFileAsync(executable, args, {
152
+ cwd: registry.getWorkspace(input.workspaceId).root,
153
+ timeout: 120_000,
154
+ maxBuffer: 10 * 1024 * 1024,
155
+ windowsHide: true,
156
+ });
157
+ return textResponse({ file: file.relative, output: output.relative, details: sanitizeCliOutput([stdout.trim(), stderr.trim()].filter(Boolean).join("\n")) });
158
+ }
159
+ const grid = input.grid ? {
160
+ x: assertInteger(input.grid.x ?? 0, "grid.x"),
161
+ y: assertInteger(input.grid.y ?? 0, "grid.y"),
162
+ tileWidth: assertPositiveInteger(input.grid.tileWidth, "grid.tileWidth"),
163
+ tileHeight: assertPositiveInteger(input.grid.tileHeight, "grid.tileHeight"),
164
+ } : undefined;
165
+ const pixels = input.pixels ?? [];
166
+ if (pixels.length > MAX_TILE_PIXELS)
167
+ throw new Error(`A maximum of ${MAX_TILE_PIXELS} tile pixels is supported.`);
168
+ const pixelLua = `{${pixels.map((pixel) => {
169
+ const color = parseColor(pixel.color);
170
+ return `{x=${assertInteger(pixel.x, "pixel.x")},y=${assertInteger(pixel.y, "pixel.y")},color={r=${color.r},g=${color.g},b=${color.b},a=${color.a}}}`;
171
+ }).join(",")}}`;
172
+ const cells = input.cells ?? [];
173
+ if (cells.length > MAX_TILE_CELLS)
174
+ throw new Error(`A maximum of ${MAX_TILE_CELLS} tile cells is supported.`);
175
+ const cellsLua = `{${cells.map((cell) => `{x=${assertInteger(cell.x, "cell.x")},y=${assertInteger(cell.y, "cell.y")},tile=${Math.max(0, assertInteger(cell.tileIndex, "cell.tileIndex"))},flip_x=${cell.flipX === true ? "true" : "false"},flip_y=${cell.flipY === true ? "true" : "false"},diagonal=${cell.diagonal === true ? "true" : "false"}}`).join(",")}}`;
176
+ const source = input.sourceImagePath ? workspacePath(registry, input.workspaceId, input.sourceImagePath) : undefined;
177
+ const properties = input.properties ?? {};
178
+ const propertiesLua = `{${Object.entries(properties).map(([key, value]) => {
179
+ const encoded = value === null ? "nil" : typeof value === "string" ? luaString(value) : String(value);
180
+ return `[${luaString(key)}]=${encoded}`;
181
+ }).join(",")}}`;
182
+ const result = await runLua(config, registry, input.workspaceId, `
183
+ ${openSpriteScript(file.absolute)}
184
+ if TilesetMode==nil then fail("This Aseprite build does not support tilemaps") end
185
+ local action=${luaString(input.action)}
186
+ local function tileset_at(index)
187
+ if index<1 or index>#sprite.tilesets then fail("Tileset index is outside the sprite") end
188
+ return sprite.tilesets[index]
189
+ end
190
+ local function tilemap_summary()
191
+ local sets={}
192
+ for index,tileset in ipairs(sprite.tilesets) do
193
+ local tiles={}
194
+ for tile_index=0,#tileset-1 do
195
+ local tile=tileset:tile(tile_index)
196
+ table.insert(tiles,{index=tile_index,width=tile.image.width,height=tile.image.height,data=tile.data,color={r=tile.color.red,g=tile.color.green,b=tile.color.blue,a=tile.color.alpha},properties=tile.properties})
197
+ end
198
+ table.insert(sets,{index=index,name=tileset.name,base_index=tileset.baseIndex,tile_width=tileset.grid.tileSize.width,tile_height=tileset.grid.tileSize.height,tile_count=#tileset,data=tileset.data,properties=tileset.properties,tiles=tiles})
199
+ end
200
+ local layers={}
201
+ local function visit(items)
202
+ for _,layer in ipairs(items) do
203
+ if layer.isGroup then visit(layer.layers)
204
+ elseif layer.isTilemap then
205
+ local cels={}
206
+ for _,cel in ipairs(layer.cels) do
207
+ local cells={}
208
+ if cel.image.width*cel.image.height<=${MAX_TILE_CELLS} then
209
+ for y=0,cel.image.height-1 do for x=0,cel.image.width-1 do local value=cel.image:getPixel(x,y) table.insert(cells,{x=x,y=y,tile=app.pixelColor.tileI(value),flags=app.pixelColor.tileF(value)}) end end
210
+ end
211
+ table.insert(cels,{frame=cel.frame.frameNumber,x=cel.position.x,y=cel.position.y,width=cel.image.width,height=cel.image.height,cells=cells})
212
+ end
213
+ table.insert(layers,{name=layer.name,tileset_name=layer.tileset and layer.tileset.name or nil,cels=cels})
214
+ end
215
+ end
216
+ end
217
+ visit(sprite.layers)
218
+ return {file=${luaString(file.relative)},grid={x=sprite.gridBounds.x,y=sprite.gridBounds.y,tile_width=sprite.gridBounds.width,tile_height=sprite.gridBounds.height},tilesets=sets,tilemap_layers=layers}
219
+ end
220
+ if action=="inspect" then emit_result(tilemap_summary()) sprite:close() return end
221
+ local selected_tileset=${input.tilesetIndex ? `tileset_at(${input.tilesetIndex})` : "#sprite.tilesets>0 and sprite.tilesets[1] or nil"}
222
+ if action=="create_layer" then
223
+ ${grid ? `sprite.gridBounds=Rectangle(${grid.x},${grid.y},${grid.tileWidth},${grid.tileHeight})` : ""}
224
+ app.activeSprite=sprite app.command.NewLayer{tilemap=true}
225
+ local layer=app.activeLayer layer.name=${luaString(input.name?.trim() || "Tilemap")}
226
+ if selected_tileset~=nil then layer.tileset=selected_tileset end
227
+ elseif action=="create_tileset" then
228
+ local tileset=sprite:newTileset(Grid(${grid?.x ?? 0},${grid?.y ?? 0},${grid?.tileWidth ?? 16},${grid?.tileHeight ?? 16}),${Math.max(1, assertInteger(input.tileCount ?? 1, "tileCount"))})
229
+ tileset.name=${luaString(input.name?.trim() || "Tileset")}
230
+ elseif action=="assign_tileset" then
231
+ local layer=find_layer(sprite.layers,${luaString(input.layer ?? "")}) if layer==nil or not layer.isTilemap then fail("Tilemap layer was not found") end
232
+ if selected_tileset==nil then fail("Tileset was not found") end layer.tileset=selected_tileset
233
+ elseif action=="delete_tileset" then
234
+ if selected_tileset==nil then fail("Tileset was not found") end sprite:deleteTileset(selected_tileset)
235
+ elseif action=="import_tileset" then
236
+ local source=app.open(${luaString(source?.absolute ?? "")}) if source==nil then fail("Unable to open tileset source image") end
237
+ local rendered=Image(source.spec) rendered:clear() rendered:drawSprite(source,1,Point(0,0))
238
+ app.activeSprite=sprite
239
+ local tile_width=${grid?.tileWidth ?? 16} local tile_height=${grid?.tileHeight ?? 16}
240
+ local margin_x=${Math.max(0, input.marginX ?? 0)} local margin_y=${Math.max(0, input.marginY ?? 0)} local spacing_x=${Math.max(0, input.spacingX ?? 0)} local spacing_y=${Math.max(0, input.spacingY ?? 0)}
241
+ local columns=${input.columns ?? "math.floor((source.width-margin_x+spacing_x)/(tile_width+spacing_x))"}
242
+ local rows=${input.rows ?? "math.floor((source.height-margin_y+spacing_y)/(tile_height+spacing_y))"}
243
+ local tileset=sprite:newTileset(Grid(${grid?.x ?? 0},${grid?.y ?? 0},tile_width,tile_height),columns*rows+1) tileset.name=${luaString(input.name?.trim() || "Imported Tileset")}
244
+ for index=0,columns*rows-1 do local column=index%columns local row=math.floor(index/columns) local image=tileset:getTile(index+1) image:clear() image:drawImage(rendered,Point(-(margin_x+column*(tile_width+spacing_x)),-(margin_y+row*(tile_height+spacing_y)))) end
245
+ source:close()
246
+ elseif selected_tileset==nil then fail("Tileset was not found")
247
+ elseif action=="create_tile" then sprite:newTile(selected_tileset,${input.insertAt ?? "#selected_tileset"})
248
+ elseif action=="delete_tile" then
249
+ local index=${input.tileIndex ?? -1} if index<0 or index>=#selected_tileset then fail("Tile index is outside the tileset") end sprite:deleteTile(selected_tileset:tile(index))
250
+ elseif action=="set_tile_pixels" then
251
+ local index=${input.tileIndex ?? -1} if index<0 or index>=#selected_tileset then fail("Tile index is outside the tileset") end
252
+ local image=selected_tileset:getTile(index) local pixels=${pixelLua}
253
+ for _,pixel in ipairs(pixels) do if pixel.x<0 or pixel.y<0 or pixel.x>=image.width or pixel.y>=image.height then fail("Tile pixel is outside the tile") end image:drawPixel(pixel.x,pixel.y,color_pixel(sprite,pixel.color)) end
254
+ elseif action=="set_cells" then
255
+ local layer=find_layer(sprite.layers,${luaString(input.layer ?? "")}) if layer==nil or not layer.isTilemap then fail("Tilemap layer was not found") end
256
+ if ${frame}>#sprite.frames then fail("Frame is outside the sprite") end
257
+ app.activeSprite=sprite app.activeLayer=layer app.activeFrame=sprite.frames[${frame}]
258
+ local tile_width=layer.tileset.grid.tileSize.width local tile_height=layer.tileset.grid.tileSize.height
259
+ local origin_x=layer.tileset.grid.origin.x local origin_y=layer.tileset.grid.origin.y
260
+ local cells=${cellsLua}
261
+ for _,cell in ipairs(cells) do
262
+ if cell.tile<0 or cell.tile>=#layer.tileset then fail("Cell tile index is outside the tileset") end
263
+ app.fgTile=cell.tile
264
+ local canvas_x=origin_x+cell.x*tile_width local canvas_y=origin_y+cell.y*tile_height
265
+ app.useTool{tool="pencil",layer=layer,tilemapMode=TilemapMode.TILES,points={Point(canvas_x,canvas_y)}}
266
+ local cel=layer:cel(${frame})
267
+ if cel~=nil then
268
+ local local_x=math.floor((canvas_x-cel.position.x)/tile_width) local local_y=math.floor((canvas_y-cel.position.y)/tile_height)
269
+ if local_x>=0 and local_y>=0 and local_x<cel.image.width and local_y<cel.image.height then
270
+ local flags=0 if cell.flip_x then flags=flags|app.pixelColor.TILE_XFLIP end if cell.flip_y then flags=flags|app.pixelColor.TILE_YFLIP end if cell.diagonal then flags=flags|app.pixelColor.TILE_DFLIP end
271
+ cel.image:drawPixel(local_x,local_y,app.pixelColor.tile(cell.tile,flags))
272
+ end
273
+ end
274
+ end
275
+ elseif action=="set_metadata" then
276
+ if ${input.tileIndex !== undefined ? "true" : "false"} then
277
+ local index=${input.tileIndex ?? 0} if index<0 or index>=#selected_tileset then fail("Tile index is outside the tileset") end local target=selected_tileset:tile(index)
278
+ target.data=${luaString(input.data ?? "")} target.color=Color(${input.color ? luaColor(input.color) : "{r=0,g=0,b=0,a=0}"}) target.properties=${propertiesLua}
279
+ else selected_tileset.data=${luaString(input.data ?? "")} selected_tileset.color=Color(${input.color ? luaColor(input.color) : "{r=0,g=0,b=0,a=0}"}) selected_tileset.properties=${propertiesLua} if ${input.name ? "true" : "false"} then selected_tileset.name=${luaString(input.name ?? "Tileset")} end end
280
+ else fail("Unsupported tilemap action") end
281
+ if not sprite:saveAs(${luaString(file.absolute)}) then fail("Unable to save sprite") end
282
+ emit_result(tilemap_summary()) sprite:close()
283
+ `);
284
+ return textResponse(result);
285
+ }
286
+ catch (error) {
287
+ return errorResponse(error instanceof Error ? error.message : String(error));
288
+ }
289
+ }