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.
- package/LICENSE +21 -21
- package/README.md +366 -233
- package/addons/auvrynt_bridge/auvrynt_bridge.gd +500 -0
- package/addons/auvrynt_bridge/plugin.cfg +7 -0
- package/bin/auvrynt-launcher.cjs +77 -0
- package/dist/artifact-registry.js +1 -0
- package/dist/aseprite-tools.js +1 -0
- package/dist/auth/connection-registry.js +145 -0
- package/dist/auth/connection-status.js +176 -0
- package/dist/auth/oauth-provider.js +617 -0
- package/dist/auth/room-registry.js +131 -0
- package/dist/auth/session-registry.js +531 -0
- package/dist/background-lifecycle.js +1 -0
- package/dist/blender-client.js +1 -109
- package/dist/blender-tools.js +1 -930
- package/dist/browser-stability.js +1 -0
- package/dist/cli/commands/help-command.js +10 -0
- package/dist/cli/commands/init-command.js +190 -0
- package/dist/cli/commands/integration-commands.js +88 -0
- package/dist/cli/commands/serve-command.js +83 -0
- package/dist/cli/commands/setup-command.js +81 -0
- package/dist/cli/commands/status-commands.js +166 -0
- package/dist/cli/commands/tunnel-command.js +127 -0
- package/dist/cli/commands/user-config-commands.js +105 -0
- package/dist/cli/dashboard-actions.js +516 -0
- package/dist/cli/dashboard-native-actions.js +282 -0
- package/dist/cli/foreground-server.js +270 -0
- package/dist/cli/instance-control.js +21 -0
- package/dist/cli/instance-lock.js +123 -0
- package/dist/cli/integration-bootstrap.js +206 -0
- package/dist/cli/lifecycle-manager.js +493 -0
- package/dist/cli/runtime-support.js +74 -0
- package/dist/cli/serena-detected-default.js +27 -0
- package/dist/cli/tunnel-health-monitor.js +182 -0
- package/dist/cli.js +82 -739
- package/dist/config.js +1 -243
- package/dist/connection-registry.js +1 -73
- package/dist/connection-status.js +1 -139
- package/dist/control-retry.js +1 -0
- package/dist/crash-recovery.js +1 -0
- package/dist/db/client.js +16 -3
- package/dist/db/schema.js +30 -0
- package/dist/dotnet-tools.js +1 -223
- package/dist/git-worktrees.js +1 -134
- package/dist/git.js +1 -41
- package/dist/godot-animation-tilemap.js +1 -82
- package/dist/godot-csharp-build.js +1 -93
- package/dist/godot-csharp-project.js +1 -157
- package/dist/godot-csharp-runner.js +1 -146
- package/dist/godot-csharp-semantic.js +1 -161
- package/dist/godot-csharp-validate.js +1 -71
- package/dist/godot-dotnet-env.js +1 -169
- package/dist/godot-editor-bridge.js +1 -140
- package/dist/godot-gdscript.js +1 -824
- package/dist/godot-project-settings.js +1 -223
- package/dist/godot-runtime-testing.js +1 -249
- package/dist/godot-tools.js +1 -183
- package/dist/http-rate-limit.js +1 -0
- package/dist/http-server-hardening.js +1 -0
- package/dist/image-tools.js +1 -157
- package/dist/infrastructure/command-reference.js +32 -0
- package/dist/infrastructure/config.js +424 -0
- package/dist/infrastructure/context7-auth.js +55 -0
- package/dist/infrastructure/http-rate-limit.js +42 -0
- package/dist/infrastructure/http-server-hardening.js +23 -0
- package/dist/infrastructure/integration-queue.js +46 -0
- package/dist/infrastructure/logger.js +129 -0
- package/dist/infrastructure/mcp-event-store.js +103 -0
- package/dist/infrastructure/ngrok-auth-pool.js +208 -0
- package/dist/infrastructure/request-context.js +14 -0
- package/dist/infrastructure/shutdown.js +37 -0
- package/dist/infrastructure/sse-heartbeat.js +47 -0
- package/dist/infrastructure/tool-capabilities.js +67 -0
- package/dist/infrastructure/tool-result-budget.js +175 -0
- package/dist/infrastructure/user-config.js +167 -0
- package/dist/integration-discovery.js +1 -98
- package/dist/integration-queue.js +1 -0
- package/dist/integrations/agent-reach/agent-reach-tools.js +196 -0
- package/dist/integrations/agent-reach/native-channels.js +468 -0
- package/dist/integrations/aseprite/aseprite-analysis-tools.js +368 -0
- package/dist/integrations/aseprite/aseprite-editing-tools.js +647 -0
- package/dist/integrations/aseprite/aseprite-live-tools.js +297 -0
- package/dist/integrations/aseprite/aseprite-safety-tools.js +594 -0
- package/dist/integrations/aseprite/aseprite-specialized-tools.js +289 -0
- package/dist/integrations/aseprite/aseprite-tools.js +837 -0
- package/dist/integrations/blender/blender-catalog-mesh.js +593 -0
- package/dist/integrations/blender/blender-catalog-object.js +906 -0
- package/dist/integrations/blender/blender-catalog-scene.js +266 -0
- package/dist/integrations/blender/blender-catalog-select.js +581 -0
- package/dist/integrations/blender/blender-catalog-stubs.js +7512 -0
- package/dist/integrations/blender/blender-catalog.js +165 -0
- package/dist/integrations/blender/blender-client.js +105 -0
- package/dist/integrations/blender/blender-tools.js +2243 -0
- package/dist/integrations/context7/context7-tools.js +106 -0
- package/dist/integrations/dotnet/dotnet-tools.js +195 -0
- package/dist/integrations/godot/godot-animation-tilemap.js +74 -0
- package/dist/integrations/godot/godot-csharp-build.js +91 -0
- package/dist/integrations/godot/godot-csharp-project.js +155 -0
- package/dist/integrations/godot/godot-csharp-runner.js +118 -0
- package/dist/integrations/godot/godot-csharp-semantic.js +146 -0
- package/dist/integrations/godot/godot-csharp-validate.js +71 -0
- package/dist/integrations/godot/godot-dotnet-env.js +134 -0
- package/dist/integrations/godot/godot-editor-bridge.js +328 -0
- package/dist/integrations/godot/godot-gdscript.js +536 -0
- package/dist/integrations/godot/godot-project-settings.js +178 -0
- package/dist/integrations/godot/godot-runtime-testing.js +263 -0
- package/dist/integrations/godot/godot-tools.js +193 -0
- package/dist/integrations/images/image-tools.js +414 -0
- package/dist/integrations/images/png-codec.js +251 -0
- package/dist/integrations/images/view-image.js +99 -0
- package/dist/integrations/images/window-capture.js +148 -0
- package/dist/integrations/integration-discovery.js +185 -0
- package/dist/integrations/obsidian/obsidian-tools.js +205 -0
- package/dist/integrations/playwright/browser-session.js +516 -0
- package/dist/integrations/playwright/browser-stability.js +36 -0
- package/dist/integrations/playwright/playwright-runtime.js +105 -0
- package/dist/integrations/playwright/web-tools.js +504 -0
- package/dist/integrations/roblox/roblox-helpers.js +381 -0
- package/dist/integrations/roblox/roblox-studio-client.js +112 -0
- package/dist/integrations/roblox/roblox-tools.js +106 -0
- package/dist/integrations/serena/serena-manager.js +464 -0
- package/dist/integrations/serena/serena-tools.js +411 -0
- package/dist/logger.js +1 -76
- package/dist/mcp-event-store.js +1 -0
- package/dist/oauth-provider.js +1 -377
- package/dist/pi-tools.js +1 -81
- package/dist/playwright-runtime.js +1 -0
- package/dist/process/background-lifecycle.js +189 -0
- package/dist/process/control-retry.js +42 -0
- package/dist/process/crash-recovery.js +23 -0
- package/dist/process/processes.js +456 -0
- package/dist/processes.js +1 -218
- package/dist/request-context.js +1 -0
- package/dist/review-checkpoints.js +1 -142
- package/dist/room-registry.js +1 -0
- package/dist/roots.js +1 -53
- package/dist/search-discovery.js +1 -271
- package/dist/serena-manager.js +1 -443
- package/dist/serena-tools.js +1 -411
- package/dist/server/dashboard-page-styles.js +331 -0
- package/dist/server/dashboard-page.js +1509 -0
- package/dist/server/dashboard-routes.js +46 -0
- package/dist/server/dashboard.js +240 -0
- package/dist/server/http-helpers.js +30 -0
- package/dist/server/integration-profile-update.js +37 -0
- package/dist/server/mcp-policy.js +169 -0
- package/dist/server/mcp-server-factory.js +127 -0
- package/dist/server/mcp-tool-registrar.js +182 -0
- package/dist/server/openai-session-hint.js +14 -0
- package/dist/server/tool-groups.js +29 -0
- package/dist/server/tool-logging.js +33 -0
- package/dist/server/tool-registration-shared.js +59 -0
- package/dist/server/tools/aseprite-advanced-tools-registration.js +547 -0
- package/dist/server/tools/aseprite-tools-registration.js +213 -0
- package/dist/server/tools/blender-tools-registration.js +690 -0
- package/dist/server/tools/core-file-tools-registration.js +459 -0
- package/dist/server/tools/dotnet-godot-window-tools-registration.js +120 -0
- package/dist/server/tools/godot-csharp-tools-registration.js +252 -0
- package/dist/server/tools/godot-gdscript-tools-registration.js +189 -0
- package/dist/server/tools/process-project-tools-registration.js +155 -0
- package/dist/server/tools/roblox-tools-registration.js +514 -0
- package/dist/server/tools/web-image-tools-registration.js +326 -0
- package/dist/server/tools/workspace-lifecycle-tools-registration.js +130 -0
- package/dist/server/ui-assets.js +97 -0
- package/dist/server/workspace-analytics.js +92 -0
- package/dist/server.js +453 -2713
- package/dist/session-registry.js +1 -0
- package/dist/shutdown.js +1 -0
- package/dist/skills.js +1 -45
- package/dist/sse-heartbeat.js +1 -0
- package/dist/tool-capabilities.js +1 -0
- package/dist/tool-result-budget.js +1 -0
- package/dist/tools/pi-tools.js +81 -0
- package/dist/tunnels/cloudflare-tunnel.js +217 -0
- package/dist/tunnels/cloudflared-service.js +174 -0
- package/dist/tunnels/ngrok-tunnel.js +220 -0
- package/dist/tunnels/tunnel-manager.js +186 -0
- package/dist/tunnels/tunnel-types.js +1 -0
- package/dist/tunnels/tunnel-utils.js +62 -0
- package/dist/ui/.vite/manifest.json +9 -2487
- package/dist/ui/assets/heavy-payload-D42A9ceL.js +1 -0
- package/dist/ui/assets/lightweight-diff-Cv4g9Hdr.js +13 -0
- package/dist/ui/assets/review-payload-DKIg1cKF.js +1 -0
- package/dist/ui/assets/workspace-app-CeK3NhmB.css +1 -0
- package/dist/ui/assets/{workspace-app-C5QsE314.js → workspace-app-CkUXnpl4.js} +6 -6
- package/dist/ui/brand-theme.js +23 -0
- package/dist/ui/workspace-app.html +15 -15
- package/dist/user-config.js +1 -57
- package/dist/view-image.js +1 -104
- package/dist/web-tools.js +1 -200
- package/dist/window-capture.js +1 -74
- package/dist/workspace/artifact-registry.js +69 -0
- package/dist/workspace/git-worktrees.js +141 -0
- package/dist/workspace/git.js +42 -0
- package/dist/workspace/review-checkpoints.js +142 -0
- package/dist/workspace/roots.js +56 -0
- package/dist/workspace/search-discovery.js +264 -0
- package/dist/workspace/skills.js +45 -0
- package/dist/workspace/workspace-store.js +219 -0
- package/dist/workspace/workspaces.js +314 -0
- package/dist/workspace-store.js +1 -125
- package/dist/workspaces.js +1 -226
- package/docs/CREATOR_STORE_FREE_ASSETS.md +162 -0
- package/docs/DEVELOPMENT_TOOLS.md +136 -93
- package/docs/assets/auvrynt-icon.png +0 -0
- package/docs/assets/auvrynt-icon.svg +20 -0
- package/docs/chatgpt-coding-workflow.md +143 -143
- package/docs/configuration.md +156 -124
- package/docs/diagnostics.md +79 -0
- package/docs/gotchas.md +244 -202
- package/docs/multi-agent-and-long-projects.md +91 -0
- package/docs/security.md +138 -100
- package/docs/setup.md +171 -131
- package/docs/source-layout.md +60 -0
- package/extensions/auvrynt_bridge/auvrynt_bridge.lua +594 -0
- package/extensions/auvrynt_bridge/live_analysis.lua +181 -0
- package/extensions/auvrynt_bridge/live_animation.lua +134 -0
- package/extensions/auvrynt_bridge/live_commands.lua +24 -0
- package/extensions/auvrynt_bridge/live_common.lua +130 -0
- package/extensions/auvrynt_bridge/live_document.lua +78 -0
- package/extensions/auvrynt_bridge/live_drawing.lua +125 -0
- package/extensions/auvrynt_bridge/live_effects.lua +91 -0
- package/extensions/auvrynt_bridge/live_palette_template.lua +167 -0
- package/extensions/auvrynt_bridge/live_selection.lua +110 -0
- package/extensions/auvrynt_bridge/live_structure.lua +129 -0
- package/extensions/auvrynt_bridge/package.json +17 -0
- package/guides/ASEPRITE_AGENT_GUIDE.md +133 -0
- package/guides/BLENDER_AGENT_GUIDE.md +472 -0
- package/guides/GODOT_AGENT_GUIDE.md +298 -0
- package/guides/PROJECT_ROUTER.md +165 -0
- package/guides/ROBLOX_AGENT_GUIDE.md +75 -0
- package/guides/SOFTWARE_AGENT_GUIDE.md +104 -0
- package/guides/WEB_AGENT_GUIDE.md +287 -0
- package/package.json +78 -70
- package/scripts/dev-server.mjs +121 -120
- package/scripts/live-tunnel-smoke.mjs +538 -0
- package/scripts/repo-hygiene.mjs +74 -0
- package/scripts/restart-after-crash.mjs +49 -0
- package/scripts/run-tests.mjs +166 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +0 -1
- package/dist/ui/assets/actionscript-3--17pq3dv.js +0 -1
- package/dist/ui/assets/ada-C5qYipkI.js +0 -1
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +0 -1
- package/dist/ui/assets/angular-html-BJqQFYI6.js +0 -1
- package/dist/ui/assets/angular-ts-CMJECO0Y.js +0 -1
- package/dist/ui/assets/apache-U0d_L8uA.js +0 -1
- package/dist/ui/assets/apex-CGTLDQj6.js +0 -1
- package/dist/ui/assets/apl-DWeXpBBr.js +0 -1
- package/dist/ui/assets/applescript-CCn79oCD.js +0 -1
- package/dist/ui/assets/ara-4CJ0cIlV.js +0 -1
- package/dist/ui/assets/asciidoc-DE70LPWp.js +0 -1
- package/dist/ui/assets/asm-Cmm7eHzH.js +0 -1
- package/dist/ui/assets/astro-CLbttLOq.js +0 -1
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +0 -1
- package/dist/ui/assets/awk-BWXHIvNe.js +0 -1
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +0 -1
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +0 -1
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +0 -1
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +0 -1
- package/dist/ui/assets/bat-Bo4NYOV-.js +0 -1
- package/dist/ui/assets/beancount-D-usSTwE.js +0 -1
- package/dist/ui/assets/berry-DKpUyyne.js +0 -1
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +0 -1
- package/dist/ui/assets/bicep-CUHmPFLl.js +0 -1
- package/dist/ui/assets/bird2-C2hNVINV.js +0 -1
- package/dist/ui/assets/blade-BOzY0P2V.js +0 -1
- package/dist/ui/assets/bsl-BkkzgIyY.js +0 -1
- package/dist/ui/assets/c-BG-8uJvh.js +0 -1
- package/dist/ui/assets/c3-CnJL0r0V.js +0 -1
- package/dist/ui/assets/cadence-CQ2zXKGN.js +0 -1
- package/dist/ui/assets/cairo-DLTphjLi.js +0 -1
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +0 -1
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +0 -1
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +0 -1
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +0 -1
- package/dist/ui/assets/clarity-SemFz856.js +0 -1
- package/dist/ui/assets/clojure-DqKBuwfJ.js +0 -1
- package/dist/ui/assets/cmake-Bj61d0ZC.js +0 -1
- package/dist/ui/assets/cobol-I_17IuGe.js +0 -1
- package/dist/ui/assets/codeowners-C8r90Shi.js +0 -1
- package/dist/ui/assets/codeql-oeQT6MSM.js +0 -1
- package/dist/ui/assets/coffee-C0B8hmok.js +0 -1
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +0 -1
- package/dist/ui/assets/coq-BrsZFFmf.js +0 -1
- package/dist/ui/assets/cpp-DDJXt6Vs.js +0 -1
- package/dist/ui/assets/crystal-Bexqace6.js +0 -1
- package/dist/ui/assets/csharp-Ct8U2NOr.js +0 -1
- package/dist/ui/assets/css-DSQhw_9R.js +0 -1
- package/dist/ui/assets/csv-Dx-8-gkx.js +0 -1
- package/dist/ui/assets/cue-CE9AQfxI.js +0 -1
- package/dist/ui/assets/cypher-ClKdZ_lG.js +0 -1
- package/dist/ui/assets/d-qD-0Kul2.js +0 -1
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +0 -1
- package/dist/ui/assets/dart-DkHntEIa.js +0 -1
- package/dist/ui/assets/dax-BkyTk9wS.js +0 -1
- package/dist/ui/assets/desktop-Dlh5hvp9.js +0 -1
- package/dist/ui/assets/diff-woXpYk--.js +0 -1
- package/dist/ui/assets/docker-IyjqRm3v.js +0 -1
- package/dist/ui/assets/dotenv-_5a1GRtc.js +0 -1
- package/dist/ui/assets/dracula-BHWKrbxM.js +0 -1
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +0 -1
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +0 -1
- package/dist/ui/assets/edge-Z8YYkHOr.js +0 -1
- package/dist/ui/assets/elixir-CG9uKtAF.js +0 -1
- package/dist/ui/assets/elm-GfWG2IfT.js +0 -1
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +0 -1
- package/dist/ui/assets/erb-xe89e73J.js +0 -1
- package/dist/ui/assets/erlang-Cphh6RMH.js +0 -1
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +0 -1
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +0 -1
- package/dist/ui/assets/fennel-DQxkIbk2.js +0 -1
- package/dist/ui/assets/fish-BJitypiv.js +0 -1
- package/dist/ui/assets/fluent-C03EYrpw.js +0 -1
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +0 -1
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +0 -1
- package/dist/ui/assets/fsharp-D13ZGOAj.js +0 -1
- package/dist/ui/assets/gdresource-C0sCabJj.js +0 -1
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +0 -1
- package/dist/ui/assets/gdshader-CBce3t8t.js +0 -1
- package/dist/ui/assets/genie-CV2tkWYe.js +0 -1
- package/dist/ui/assets/gherkin-DExj1W_8.js +0 -1
- package/dist/ui/assets/git-commit-BSykSTBG.js +0 -1
- package/dist/ui/assets/git-rebase-CoTL_uSE.js +0 -1
- package/dist/ui/assets/github-dark-C-LZuMrd.js +0 -1
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +0 -1
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +0 -1
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +0 -1
- package/dist/ui/assets/github-light-EUqPIrTm.js +0 -1
- package/dist/ui/assets/github-light-default-BXViO-2h.js +0 -1
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +0 -1
- package/dist/ui/assets/gleam-CSRkHgEL.js +0 -1
- package/dist/ui/assets/glimmer-js-DAn4UCSu.js +0 -1
- package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +0 -1
- package/dist/ui/assets/glsl-CtTDZoqR.js +0 -1
- package/dist/ui/assets/gn-ilITqXS6.js +0 -1
- package/dist/ui/assets/gnuplot-7GGW24-e.js +0 -1
- package/dist/ui/assets/go-BJwz_mda.js +0 -1
- package/dist/ui/assets/graphql-D5gcC_Jk.js +0 -1
- package/dist/ui/assets/groovy-CacY0gHj.js +0 -1
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +0 -1
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +0 -1
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -1
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +0 -1
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +0 -1
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +0 -1
- package/dist/ui/assets/hack-BJXY27dt.js +0 -1
- package/dist/ui/assets/haml-BLfFoZf7.js +0 -1
- package/dist/ui/assets/handlebars-Dw6CWkvN.js +0 -1
- package/dist/ui/assets/haskell-D8IpX4py.js +0 -1
- package/dist/ui/assets/haxe-OTjmBuCE.js +0 -1
- package/dist/ui/assets/hcl-Dh228itO.js +0 -1
- package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +0 -4
- package/dist/ui/assets/hjson-CxZEssPk.js +0 -1
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +0 -1
- package/dist/ui/assets/horizon-CE9ld1lL.js +0 -1
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +0 -1
- package/dist/ui/assets/houston-CsvMBhTu.js +0 -1
- package/dist/ui/assets/html-CAcAWvoN.js +0 -1
- package/dist/ui/assets/html-derivative-8aSW2E_7.js +0 -1
- package/dist/ui/assets/http-B2YR_3V1.js +0 -1
- package/dist/ui/assets/hurl-BnDJ9Zhf.js +0 -1
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +0 -1
- package/dist/ui/assets/hy-CZbG8q4J.js +0 -1
- package/dist/ui/assets/imba-DsUTQ-LC.js +0 -1
- package/dist/ui/assets/ini-B5eOa1yu.js +0 -1
- package/dist/ui/assets/java-Doxi4W8u.js +0 -1
- package/dist/ui/assets/javascript-BbRdEqti.js +0 -1
- package/dist/ui/assets/jinja-CS3Tpv_Q.js +0 -1
- package/dist/ui/assets/jison-BkPGYVHR.js +0 -1
- package/dist/ui/assets/json-BMt1m3m8.js +0 -1
- package/dist/ui/assets/json5-BR5RXkoi.js +0 -1
- package/dist/ui/assets/jsonc-CYpm1nAK.js +0 -1
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +0 -1
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +0 -1
- package/dist/ui/assets/jssm-DXw9l8Rf.js +0 -1
- package/dist/ui/assets/jsx-CQKrJXXY.js +0 -1
- package/dist/ui/assets/julia-BuN7i2du.js +0 -1
- package/dist/ui/assets/just-BswEPFPu.js +0 -1
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +0 -1
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +0 -1
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +0 -1
- package/dist/ui/assets/kdl-CsD5j6eV.js +0 -1
- package/dist/ui/assets/kotlin-DhhofPvG.js +0 -1
- package/dist/ui/assets/kusto-BUv0MjJC.js +0 -1
- package/dist/ui/assets/laserwave-C_8bwKvT.js +0 -1
- package/dist/ui/assets/latex-DU2VyFfA.js +0 -1
- package/dist/ui/assets/lean-CewbzKMR.js +0 -1
- package/dist/ui/assets/less-DVTAwKKz.js +0 -1
- package/dist/ui/assets/light-plus-DVQuIRkW.js +0 -1
- package/dist/ui/assets/liquid-Cmz1L3dq.js +0 -1
- package/dist/ui/assets/llvm-Cm23YOpf.js +0 -1
- package/dist/ui/assets/log-BNLmms1o.js +0 -1
- package/dist/ui/assets/logo-Cluzi2Zq.js +0 -1
- package/dist/ui/assets/lua-CfVXhkaJ.js +0 -1
- package/dist/ui/assets/luau-CNKltnaQ.js +0 -1
- package/dist/ui/assets/make-Dixweg8N.js +0 -1
- package/dist/ui/assets/markdown-BYOwaDjH.js +0 -1
- package/dist/ui/assets/marko-C5bfqGiA.js +0 -1
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +0 -1
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +0 -1
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +0 -1
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +0 -1
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +0 -1
- package/dist/ui/assets/matlab-D7qyCx1q.js +0 -1
- package/dist/ui/assets/mdc-CVBXYfyq.js +0 -1
- package/dist/ui/assets/mdx-DQZ5AkYe.js +0 -1
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +0 -1
- package/dist/ui/assets/min-dark-BSWPekZh.js +0 -1
- package/dist/ui/assets/min-light-DDpmG2fV.js +0 -1
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +0 -1
- package/dist/ui/assets/mojo-BgCJLMeH.js +0 -1
- package/dist/ui/assets/monokai-CdkpiU2Y.js +0 -1
- package/dist/ui/assets/moonbit-CaWjb8XO.js +0 -1
- package/dist/ui/assets/move-B1IS1UjX.js +0 -1
- package/dist/ui/assets/narrat-_X_XdTYD.js +0 -1
- package/dist/ui/assets/nextflow-Bbiyy34d.js +0 -1
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +0 -1
- package/dist/ui/assets/nginx-CzJafxLa.js +0 -1
- package/dist/ui/assets/night-owl-DhmEMT88.js +0 -1
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +0 -1
- package/dist/ui/assets/nim-DABKtHtM.js +0 -1
- package/dist/ui/assets/nix-IvuFDN5E.js +0 -1
- package/dist/ui/assets/nord-Cb4Vim4T.js +0 -1
- package/dist/ui/assets/nushell-DcLAeLz5.js +0 -1
- package/dist/ui/assets/objective-c-D1A_Heim.js +0 -1
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +0 -1
- package/dist/ui/assets/ocaml-O90oeIOV.js +0 -1
- package/dist/ui/assets/odin-B1RWQWA5.js +0 -1
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +0 -1
- package/dist/ui/assets/one-light-D7Lr4KcI.js +0 -1
- package/dist/ui/assets/openscad-BUDT5pXO.js +0 -1
- package/dist/ui/assets/pascal-4ZHwLPI5.js +0 -1
- package/dist/ui/assets/perl-CBh7L3lZ.js +0 -1
- package/dist/ui/assets/php-DFbI9q5p.js +0 -1
- package/dist/ui/assets/pierre-dark-sU4Zdns8.js +0 -1
- package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +0 -1
- package/dist/ui/assets/pierre-light-DWBk51d8.js +0 -1
- package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +0 -1
- package/dist/ui/assets/pkl-ot-7Btpt.js +0 -1
- package/dist/ui/assets/plastic-DQwYfKfQ.js +0 -1
- package/dist/ui/assets/plsql-DGHpHOYJ.js +0 -1
- package/dist/ui/assets/po-BiJDBrnU.js +0 -1
- package/dist/ui/assets/poimandres-DRFjx7u4.js +0 -1
- package/dist/ui/assets/polar-C7UOKdEL.js +0 -1
- package/dist/ui/assets/postcss-BXeXVLqQ.js +0 -1
- package/dist/ui/assets/powerquery-DNMTfnFr.js +0 -1
- package/dist/ui/assets/powershell-DshXNtvi.js +0 -1
- package/dist/ui/assets/prisma-BsRQq5mF.js +0 -1
- package/dist/ui/assets/prolog-iXnhIJG7.js +0 -1
- package/dist/ui/assets/proto-DB4EqR-F.js +0 -1
- package/dist/ui/assets/pug-C_PxC7gO.js +0 -1
- package/dist/ui/assets/puppet-CDv2pdJW.js +0 -1
- package/dist/ui/assets/purescript-9MfHhQsQ.js +0 -1
- package/dist/ui/assets/python-gzcpVVnB.js +0 -1
- package/dist/ui/assets/qml-DtngoFFK.js +0 -1
- package/dist/ui/assets/qmldir-DCQb3MpD.js +0 -1
- package/dist/ui/assets/qss-Fe1Jh2GI.js +0 -1
- package/dist/ui/assets/r-DohkcevW.js +0 -1
- package/dist/ui/assets/racket-DcIDlBhZ.js +0 -1
- package/dist/ui/assets/raku-B3gFvitq.js +0 -1
- package/dist/ui/assets/razor-C4t8J0_E.js +0 -1
- package/dist/ui/assets/red-CJ3rzSJv.js +0 -1
- package/dist/ui/assets/reg-CRGYupPL.js +0 -1
- package/dist/ui/assets/regexp-OGbTbjgY.js +0 -1
- package/dist/ui/assets/rel-BtDbiS_P.js +0 -1
- package/dist/ui/assets/review-payload-C5Qz60Kq.js +0 -1
- package/dist/ui/assets/riscv-Ckw8ddFX.js +0 -1
- package/dist/ui/assets/ron-VUp2lXgN.js +0 -1
- package/dist/ui/assets/rose-pine-BthvhNj6.js +0 -1
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +0 -1
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +0 -1
- package/dist/ui/assets/rosmsg-CAekHB0j.js +0 -1
- package/dist/ui/assets/rst-CfBbbcvC.js +0 -1
- package/dist/ui/assets/ruby-Bw0mpxHY.js +0 -1
- package/dist/ui/assets/rust-Cfkwpbl8.js +0 -1
- package/dist/ui/assets/sas-Cs3s9JOf.js +0 -1
- package/dist/ui/assets/sass-DXrisJhu.js +0 -1
- package/dist/ui/assets/scala-DKOlJaKm.js +0 -1
- package/dist/ui/assets/scheme-DQCgrYNe.js +0 -1
- package/dist/ui/assets/scss-sRxNJS54.js +0 -1
- package/dist/ui/assets/sdbl-bTVj8UrX.js +0 -1
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +0 -1
- package/dist/ui/assets/shellscript-B0X6wh0R.js +0 -1
- package/dist/ui/assets/shellsession-D2FdOioR.js +0 -1
- package/dist/ui/assets/slack-dark-DnToyrRv.js +0 -1
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +0 -1
- package/dist/ui/assets/smalltalk-B16xEiuN.js +0 -1
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +0 -1
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +0 -1
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +0 -1
- package/dist/ui/assets/solidity-CKzVLygQ.js +0 -1
- package/dist/ui/assets/soy-s6g9OjJ1.js +0 -1
- package/dist/ui/assets/sparql-D_iOobhT.js +0 -1
- package/dist/ui/assets/splunk-BC2Px7Mm.js +0 -1
- package/dist/ui/assets/sql-DVTnh5V-.js +0 -1
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +0 -1
- package/dist/ui/assets/stata-DFIDiXF9.js +0 -1
- package/dist/ui/assets/stylus-B6D30XZt.js +0 -1
- package/dist/ui/assets/surrealql-DVfrsLyg.js +0 -1
- package/dist/ui/assets/svelte-D5GsxESq.js +0 -1
- package/dist/ui/assets/swift-DonLKvLd.js +0 -1
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +0 -1
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +0 -1
- package/dist/ui/assets/systemd-BxMlprV5.js +0 -1
- package/dist/ui/assets/talonscript-CohzipZa.js +0 -1
- package/dist/ui/assets/tasl-DMoTqEGO.js +0 -1
- package/dist/ui/assets/tcl-CZd0xW_V.js +0 -1
- package/dist/ui/assets/templ-DI-Zyqzd.js +0 -1
- package/dist/ui/assets/terraform-DswuEJGm.js +0 -1
- package/dist/ui/assets/tex-WHHmlbJI.js +0 -1
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +0 -1
- package/dist/ui/assets/toml-CcmNWLt0.js +0 -1
- package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +0 -1
- package/dist/ui/assets/tsv-sltzmVWM.js +0 -1
- package/dist/ui/assets/tsx-ph_idaAW.js +0 -1
- package/dist/ui/assets/turtle-ByJddavk.js +0 -1
- package/dist/ui/assets/twig-YO17jFjR.js +0 -1
- package/dist/ui/assets/typescript-CbAxjhkl.js +0 -1
- package/dist/ui/assets/typespec-B88KGewJ.js +0 -1
- package/dist/ui/assets/typst-DI99ib-x.js +0 -1
- package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +0 -244
- package/dist/ui/assets/v-DETTlOr0.js +0 -1
- package/dist/ui/assets/vala-zf12oZj6.js +0 -1
- package/dist/ui/assets/vb-Djn5o6TS.js +0 -1
- package/dist/ui/assets/verilog-CiiDBU1e.js +0 -1
- package/dist/ui/assets/vesper-D5bVUKB1.js +0 -1
- package/dist/ui/assets/vhdl-BroJfC0k.js +0 -1
- package/dist/ui/assets/viml-DvXPmvsu.js +0 -1
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +0 -1
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +0 -1
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +0 -1
- package/dist/ui/assets/vue-CraHL-Ps.js +0 -1
- package/dist/ui/assets/vue-html-e9tyZNtS.js +0 -1
- package/dist/ui/assets/vue-vine-CofmxaUb.js +0 -1
- package/dist/ui/assets/vyper-CgoNMtux.js +0 -1
- package/dist/ui/assets/wasm-BnjxR4X6.js +0 -1
- package/dist/ui/assets/wasm-ByWQv1Qj.js +0 -1
- package/dist/ui/assets/wenyan-C8pVoKbM.js +0 -1
- package/dist/ui/assets/wgsl-BsKzXJz4.js +0 -1
- package/dist/ui/assets/wikitext-ClFFjSW2.js +0 -1
- package/dist/ui/assets/wit-DdvCle-K.js +0 -1
- package/dist/ui/assets/wolfram-DLL8P-h_.js +0 -1
- package/dist/ui/assets/workspace-app-8--oTbCd.css +0 -1
- package/dist/ui/assets/xml-BWSdPZHm.js +0 -1
- package/dist/ui/assets/xsl-BtCt7Hx8.js +0 -1
- package/dist/ui/assets/yaml-BZiTw7cQ.js +0 -1
- package/dist/ui/assets/zenscript-BnlCZFoB.js +0 -1
- package/dist/ui/assets/zig-CMLA9XwU.js +0 -1
- package/docs/assets/auvrynt-logo-light.png +0 -0
- 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
|
+
}
|