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,46 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { isLoopbackRequest } from "../logger.js";
3
+ import { createDashboardToolsView, createDashboardView, dashboardCsp, dashboardHtml, } from "./dashboard.js";
4
+ import { integrationToolCounts } from "./mcp-tool-registrar.js";
5
+ export function registerDashboardRoutes(options) {
6
+ const { app, config, snapshot, nonce } = options;
7
+ app.get("/dashboard", async (req, res) => {
8
+ if (!isLoopbackRequest(req)) {
9
+ res.status(404).end();
10
+ return;
11
+ }
12
+ const pageNonce = nonce();
13
+ res.setHeader("Cache-Control", "no-store");
14
+ res.setHeader("X-Frame-Options", "DENY");
15
+ res.setHeader("X-Content-Type-Options", "nosniff");
16
+ res.setHeader("Referrer-Policy", "no-referrer");
17
+ res.setHeader("Content-Security-Policy", dashboardCsp(pageNonce));
18
+ const view = await createDashboardView(config, snapshot());
19
+ res.type("html").send(dashboardHtml(view, pageNonce));
20
+ });
21
+ app.get("/dashboard/data", async (req, res) => {
22
+ res.setHeader("Cache-Control", "no-store");
23
+ if (!isLoopbackRequest(req)) {
24
+ res.status(404).end();
25
+ return;
26
+ }
27
+ res.json(await createDashboardView(config, snapshot()));
28
+ });
29
+ app.get("/dashboard/tools", (req, res) => {
30
+ res.setHeader("Cache-Control", "no-store");
31
+ if (!isLoopbackRequest(req)) {
32
+ res.status(404).end();
33
+ return;
34
+ }
35
+ const integration = typeof req.query.integration === "string" ? req.query.integration : "";
36
+ const tools = createDashboardToolsView(config, integration);
37
+ if (tools === undefined) {
38
+ res.status(404).json({ error: "Unknown integration." });
39
+ return;
40
+ }
41
+ res.json({ integration, tools, counts: integrationToolCounts(config) });
42
+ });
43
+ }
44
+ export function randomNonce() {
45
+ return randomBytes(18).toString("base64url");
46
+ }
@@ -0,0 +1,240 @@
1
+ import { summarizeNgrokAuthtokens, } from "../infrastructure/ngrok-auth-pool.js";
2
+ import { summarizeContext7Auth, } from "../infrastructure/context7-auth.js";
3
+ import { readConnectedClients } from "../connection-registry.js";
4
+ import { discoverLocalIntegrations, processDetected } from "../integration-discovery.js";
5
+ import { recentLogEntries } from "../infrastructure/logger.js";
6
+ import { getPlaywrightRuntimeStatus } from "../playwright-runtime.js";
7
+ import { getAsepriteBridgeRuntimeStatus } from "../integrations/aseprite/aseprite-live-tools.js";
8
+ import { integrationToolCounts, registeredToolNamesForIntegration } from "./mcp-tool-registrar.js";
9
+ import { toolIntegrationEnabled } from "./mcp-policy.js";
10
+ import { groupToolsByName } from "./tool-groups.js";
11
+ import { dashboardHtml } from "./dashboard-page.js";
12
+ import { formatPathForPrompt, loadWorkspaceSkills } from "../workspace/skills.js";
13
+ export { dashboardHtml };
14
+ const INTEGRATION_LABELS = {
15
+ godotGdscript: "Godot GDScript",
16
+ godotCsharp: "Godot C#",
17
+ blender: "Blender",
18
+ aseprite: "Aseprite",
19
+ serena: "Serena",
20
+ playwright: "Playwright",
21
+ context7: "Context7",
22
+ obsidian: "Obsidian",
23
+ roblox: "Roblox Studio",
24
+ };
25
+ export async function createDashboardView(config, runtime) {
26
+ const discovered = await discoverLocalIntegrations().catch(() => undefined);
27
+ const playwright = getPlaywrightRuntimeStatus();
28
+ const integration = (key, connected, available, connectedDetail, availableDetail, offlineDetail) => {
29
+ const counts = integrationToolCounts(config);
30
+ const toolCount = counts[key]?.total ?? 0;
31
+ const toolEnabledCount = counts[key]?.enabled ?? 0;
32
+ const enabled = config.integrations[key];
33
+ if (!enabled) {
34
+ return {
35
+ key,
36
+ label: INTEGRATION_LABELS[key],
37
+ enabled,
38
+ state: "disabled",
39
+ detail: "Not included in the active profile.",
40
+ toolCount,
41
+ toolEnabledCount,
42
+ };
43
+ }
44
+ if (connected) {
45
+ return { key, label: INTEGRATION_LABELS[key], enabled, state: "connected", detail: connectedDetail, toolCount, toolEnabledCount };
46
+ }
47
+ if (available) {
48
+ return { key, label: INTEGRATION_LABELS[key], enabled, state: "available", detail: availableDetail, toolCount, toolEnabledCount };
49
+ }
50
+ return { key, label: INTEGRATION_LABELS[key], enabled, state: "offline", detail: offlineDetail, toolCount, toolEnabledCount };
51
+ };
52
+ const godotConnected = Boolean(discovered?.ports.auvrynt_godot_bridge);
53
+ const godotAvailable = Boolean(discovered
54
+ && (processDetected(discovered, "godot")
55
+ || discovered.executables.godot
56
+ || discovered.executables.godotCsharp));
57
+ const blenderConnected = Boolean(discovered?.ports.auvrynt_blender_bridge || discovered?.ports.blender_lab_mcp);
58
+ const blenderAvailable = Boolean(discovered && (processDetected(discovered, "blender") || discovered.executables.blender));
59
+ const asepriteRunning = Boolean(discovered && processDetected(discovered, "aseprite"));
60
+ const asepriteBridge = asepriteRunning
61
+ ? await getAsepriteBridgeRuntimeStatus()
62
+ : undefined;
63
+ const asepriteConnected = Boolean(asepriteRunning && asepriteBridge?.connected);
64
+ const asepriteAvailable = Boolean(asepriteRunning || discovered?.executables.aseprite);
65
+ const asepriteAvailableDetail = asepriteRunning
66
+ ? asepriteBridge?.installed
67
+ ? "Aseprite is running, but the Auvrynt live bridge is not responding. Restart Aseprite once after bridge installation, and close modal dialogs that can block extension timers."
68
+ : "Aseprite is running, but the Auvrynt live bridge is not installed. Native CLI tools remain available."
69
+ : "Aseprite native CLI is detected and ready on demand; launch Aseprite with the bridge installed for live editor control.";
70
+ const serenaConnected = Boolean(discovered && processDetected(discovered, "serena"));
71
+ const serenaAvailable = Boolean(discovered?.executables.serena || config.serena.executable);
72
+ const agentProvider = runtime.sessions > 0
73
+ ? readConnectedClients(config.stateDir)[0]?.provider
74
+ : undefined;
75
+ const logs = recentLogEntries(250).reverse();
76
+ const ngrokSummary = summarizeNgrokAuthtokens();
77
+ const ngrokNotice = createNgrokNotice(config, ngrokSummary, logs);
78
+ const context7 = summarizeContext7Auth();
79
+ const agentState = !runtime.ready
80
+ ? "stopping"
81
+ : runtime.activeToolCalls > 0
82
+ ? "working"
83
+ : runtime.sessions > 0
84
+ ? "connected"
85
+ : "waiting";
86
+ return {
87
+ ready: runtime.ready,
88
+ agentState,
89
+ agentLastSeenAt: runtime.lastMcpActivityAt
90
+ ? new Date(runtime.lastMcpActivityAt).toISOString()
91
+ : undefined,
92
+ activeToolCalls: runtime.activeToolCalls,
93
+ agentProvider,
94
+ pid: process.pid,
95
+ uptimeSeconds: process.uptime(),
96
+ localMcpUrl: localHttpUrl(config.host, config.port, "/mcp"),
97
+ publicMcpUrl: `${config.publicBaseUrl.replace(/\/$/, "")}/mcp`,
98
+ publicBaseUrl: config.publicBaseUrl,
99
+ tunnelProvider: config.tunnelProvider,
100
+ allowedRoots: [...config.allowedRoots],
101
+ sessions: runtime.sessions,
102
+ maxSessions: config.maxSessions,
103
+ sessionIdleTimeoutMinutes: Math.round(config.sessionIdleTimeoutMs / 60_000),
104
+ runningProcesses: runtime.runningProcesses,
105
+ workspaceChanges: runtime.workspaceChanges,
106
+ integrations: [
107
+ integration("godotCsharp", godotConnected, godotAvailable, "Godot bridge is connected.", "Godot is available; waiting for the bridge.", "Godot or its bridge is not detected."),
108
+ integration("godotGdscript", godotConnected, godotAvailable, "Godot bridge is connected.", "Godot is available; waiting for the bridge.", "Godot or its bridge is not detected."),
109
+ integration("blender", blenderConnected, blenderAvailable, "Blender MCP bridge is connected.", "Blender is available; waiting for its bridge.", "Blender is not detected."),
110
+ integration("aseprite", asepriteConnected, asepriteAvailable, `Auvrynt live bridge ${asepriteBridge?.bridgeVersion ?? ""}`.trim() + " is connected to the running Aseprite editor.", asepriteAvailableDetail, "Aseprite is not detected, and its native CLI is unavailable."),
111
+ integration("serena", serenaConnected, serenaAvailable, "Serena is running.", "Serena is detected and enabled by default.", "Serena is not detected."),
112
+ integration("playwright", false, playwright.chromiumInstalled, "Playwright browser is active.", "Chromium is installed and starts on demand.", "Playwright Chromium is unavailable."),
113
+ integration("context7", false, true, "Context7 API is ready.", "Context7 docs tools use the API key from Secrets.", "Add a Context7 API key in Secrets."),
114
+ integration("obsidian", false, true, "Obsidian vault is configured.", "Point AUVRYNT_OBSIDIAN_VAULT at your vault folder.", "Configure an Obsidian vault path to enable note tools."),
115
+ integration("roblox", Boolean(discovered && processDetected(discovered, "roblox")), true, "Roblox Studio process detected.", "Official Studio MCP launcher is available for roblox_* tools.", "Install Studio, enable MCP in Assistant settings, then start with auvrynt start roblox."),
116
+ ],
117
+ skills: buildDashboardSkills(config),
118
+ ngrok: {
119
+ ...ngrokSummary,
120
+ provider: config.tunnelProvider,
121
+ ...(ngrokNotice ? { notice: ngrokNotice } : {}),
122
+ },
123
+ context7,
124
+ logs,
125
+ };
126
+ }
127
+ function createNgrokNotice(config, summary, logs) {
128
+ if (config.tunnelProvider !== "ngrok")
129
+ return undefined;
130
+ const quotaEvent = logs.some((entry) => entry.event === "ngrok_quota_exhausted");
131
+ const exhausted = summary.tokens.filter((token) => token.quotaExhaustedAt);
132
+ if (summary.environmentOverride) {
133
+ if (!quotaEvent)
134
+ return undefined;
135
+ return {
136
+ tone: "error",
137
+ title: "ngrok request limit reached",
138
+ message: "The active token comes from AUVRYNT_NGROK_AUTHTOKEN, so automatic failover is blocked. Remove that override and add backup tokens in Secrets.",
139
+ };
140
+ }
141
+ if (exhausted.length === 0)
142
+ return undefined;
143
+ const active = summary.tokens.find((token) => token.active);
144
+ if (active && !active.quotaExhaustedAt && exhausted.length > 0) {
145
+ return {
146
+ tone: "warning",
147
+ title: "ngrok token switched automatically",
148
+ message: `${exhausted.length} saved token${exhausted.length === 1 ? " has" : "s have"} reached the monthly request limit. Auvrynt is using backup ${active.fingerprint}. Check Connectivity because a random ngrok public URL may have changed.`,
149
+ };
150
+ }
151
+ if (summary.tokens.length === 0) {
152
+ return {
153
+ tone: "error",
154
+ title: "ngrok request limit reached",
155
+ message: "No managed backup token is available. Add another ngrok authtoken in Secrets to restore the public MCP tunnel.",
156
+ };
157
+ }
158
+ return {
159
+ tone: "error",
160
+ title: "All saved ngrok tokens are unavailable",
161
+ message: `${exhausted.length || summary.tokens.length} saved token${summary.tokens.length === 1 ? " has" : "s have"} reached the monthly request limit. Add a fresh token in Secrets.`,
162
+ };
163
+ }
164
+ export function createDashboardToolsView(config, integration) {
165
+ const names = registeredToolNamesForIntegration(integration);
166
+ if (names.length === 0 && !config.integrations[integration])
167
+ return undefined;
168
+ const groups = groupToolsByName(names);
169
+ const entries = [];
170
+ for (const [group, toolNames] of groups) {
171
+ for (const name of toolNames) {
172
+ entries.push({
173
+ name,
174
+ title: toolTitle(name),
175
+ group,
176
+ enabled: toolIntegrationEnabled(config, name),
177
+ });
178
+ }
179
+ }
180
+ entries.sort((a, b) => a.name.localeCompare(b.name));
181
+ return entries;
182
+ }
183
+ function toolTitle(name) {
184
+ return name
185
+ .replace(/^blender_|^aseprite_|^godot_|^serena_|^context7_|^obsidian_/, "")
186
+ .split("_")
187
+ .filter(Boolean)
188
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
189
+ .join(" ");
190
+ }
191
+ export function dashboardCsp(nonce) {
192
+ return [
193
+ "default-src 'none'",
194
+ `style-src 'nonce-${nonce}'`,
195
+ `script-src 'nonce-${nonce}'`,
196
+ "img-src 'self'",
197
+ "connect-src 'self'",
198
+ "frame-ancestors 'none'",
199
+ "base-uri 'none'",
200
+ "form-action 'none'",
201
+ ].join("; ");
202
+ }
203
+ function localHttpUrl(host, port, path) {
204
+ const probeHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
205
+ const formattedHost = probeHost.includes(":") && !probeHost.startsWith("[")
206
+ ? `[${probeHost}]`
207
+ : probeHost;
208
+ return `http://${formattedHost}:${port}${path}`;
209
+ }
210
+ function buildDashboardSkills(config) {
211
+ const workspaceRoot = config.allowedRoots[0];
212
+ const cwd = workspaceRoot ?? config.agentDir;
213
+ const loaded = loadWorkspaceSkills(config, cwd);
214
+ return {
215
+ enabled: config.skillsEnabled,
216
+ agentDir: formatPathForPrompt(config.agentDir),
217
+ skillPaths: config.skillPaths.map((path) => formatPathForPrompt(path)),
218
+ ...(workspaceRoot ? { workspaceRoot: formatPathForPrompt(workspaceRoot) } : {}),
219
+ skills: loaded.skills.map((skill) => ({
220
+ name: skill.name,
221
+ description: skill.description,
222
+ path: formatPathForPrompt(skill.filePath),
223
+ baseDir: formatPathForPrompt(skill.baseDir),
224
+ scope: skill.sourceInfo.scope,
225
+ source: skill.sourceInfo.source,
226
+ origin: skill.sourceInfo.origin,
227
+ disableModelInvocation: skill.disableModelInvocation,
228
+ agentAccess: skill.disableModelInvocation
229
+ ? "Listed for agents, but model auto-invocation is disabled (manual /skill use only)."
230
+ : "Exposed on open_workspace as an available skill; agents should read the SKILL.md path before using it.",
231
+ })),
232
+ diagnostics: loaded.diagnostics.map((diag) => ({
233
+ type: typeof diag.type === "string" ? diag.type : undefined,
234
+ message: String(diag.message ?? diag),
235
+ path: typeof diag.path === "string"
236
+ ? formatPathForPrompt(diag.path)
237
+ : undefined,
238
+ })),
239
+ };
240
+ }
@@ -0,0 +1,30 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { fileURLToPath } from "node:url";
3
+ export function sendJsonRpcError(res, status, code, message) {
4
+ res.status(status).json({
5
+ jsonrpc: "2.0",
6
+ error: { code, message },
7
+ id: null,
8
+ });
9
+ }
10
+ export function requestLogFields(req) {
11
+ return {
12
+ userAgent: req.header("user-agent"),
13
+ contentLength: req.header("content-length"),
14
+ };
15
+ }
16
+ export function mcpClientName(req) {
17
+ const headerName = req.header("x-mcp-client-name") ?? req.header("x-client-name");
18
+ if (headerName)
19
+ return headerName;
20
+ const body = req.body;
21
+ const name = body?.params?.clientInfo?.name;
22
+ return typeof name === "string" ? name : undefined;
23
+ }
24
+ export async function isMainModule(moduleUrl) {
25
+ if (!process.argv[1])
26
+ return false;
27
+ const modulePath = await realpath(fileURLToPath(moduleUrl));
28
+ const entrypointPath = await realpath(process.argv[1]);
29
+ return modulePath === entrypointPath;
30
+ }
@@ -0,0 +1,37 @@
1
+ import { oauthScopesForIntegrations, } from "../config.js";
2
+ import { logEvent } from "../logger.js";
3
+ import { syncMcpToolAvailability } from "./mcp-tool-registrar.js";
4
+ export async function applyIntegrationProfileUpdate(input) {
5
+ const { config, integrations, serenaExecutable, oauthProvider, serenaManager, mcpServers, } = input;
6
+ Object.assign(config.integrations, integrations);
7
+ const locallyApprovedScopes = oauthScopesForIntegrations(config.integrations);
8
+ if (config.oauth.scopes.includes("auvrynt:blender-python")
9
+ && config.integrations.blender) {
10
+ locallyApprovedScopes.push("auvrynt:blender-python");
11
+ }
12
+ oauthProvider.grantScopesToExistingTokens(locallyApprovedScopes);
13
+ if (serenaExecutable)
14
+ config.serena.executable = serenaExecutable;
15
+ config.serena.enabled = integrations.serena;
16
+ serenaManager.updateConfig({
17
+ ...serenaManager.getConfig(),
18
+ enabled: integrations.serena,
19
+ executable: serenaExecutable ?? config.serena.executable,
20
+ });
21
+ if (!integrations.serena)
22
+ await serenaManager.stopAllSessions();
23
+ let enabledTools = 0;
24
+ let disabledTools = 0;
25
+ for (const server of mcpServers) {
26
+ const result = syncMcpToolAvailability(server, config);
27
+ enabledTools += result.enabled;
28
+ disabledTools += result.disabled;
29
+ }
30
+ if (enabledTools > 0 || disabledTools > 0) {
31
+ logEvent(config.logging, "info", "mcp_tool_availability_updated", {
32
+ enabledTools,
33
+ disabledTools,
34
+ serenaEnabled: integrations.serena,
35
+ });
36
+ }
37
+ }
@@ -0,0 +1,169 @@
1
+ const PLAYWRIGHT_TOOL_NAMES = new Set([
2
+ "capture_page_screenshot",
3
+ "inspect_page",
4
+ "test_responsive_page",
5
+ "browser_open",
6
+ "browser_close",
7
+ "browser_list_sessions",
8
+ "browser_navigate",
9
+ "browser_reload",
10
+ "browser_go_back",
11
+ "browser_go_forward",
12
+ "browser_snapshot",
13
+ "browser_click",
14
+ "browser_type",
15
+ "browser_select_option",
16
+ "browser_hover",
17
+ "browser_press_key",
18
+ "browser_wait_for",
19
+ "browser_get_text",
20
+ "browser_get_attribute",
21
+ "browser_is_visible",
22
+ "browser_scroll",
23
+ "browser_console",
24
+ "browser_network",
25
+ "browser_evaluate",
26
+ "browser_screenshot",
27
+ ]);
28
+ const GENERIC_GODOT_TOOL_NAMES = new Set(["detect_godot_project", "inspect_godot_scene"]);
29
+ const GODOT_CSHARP_TOOL_MARKERS = ["dotnet", "csharp", "build_solutions", "generate_vscode_config"];
30
+ const GODOT_GDSCRIPT_ONLY_TOOLS = new Set([
31
+ "godot_get_global_classes",
32
+ "godot_add_class_name",
33
+ "godot_remove_class_name",
34
+ "godot_get_autoload_usage",
35
+ "godot_inspect_tool_script",
36
+ "godot_create_editor_plugin",
37
+ ]);
38
+ export function isGodotToolName(name) {
39
+ return name.startsWith("godot_") || GENERIC_GODOT_TOOL_NAMES.has(name);
40
+ }
41
+ export function godotToolFamily(name) {
42
+ if (!isGodotToolName(name))
43
+ return undefined;
44
+ if (GODOT_CSHARP_TOOL_MARKERS.some((marker) => name.includes(marker)))
45
+ return "godotCsharp";
46
+ if (name.includes("gdscript") || GODOT_GDSCRIPT_ONLY_TOOLS.has(name))
47
+ return "godotGdscript";
48
+ return "godotShared";
49
+ }
50
+ export function godotToolBelongsToIntegration(name, integration) {
51
+ const family = godotToolFamily(name);
52
+ if (!family)
53
+ return false;
54
+ return family === integration || family === "godotShared";
55
+ }
56
+ export function requiredScopesForToolName(name) {
57
+ if (name === "open_workspace")
58
+ return ["auvrynt:read", "auvrynt:write"];
59
+ if (name === "aseprite_capture_current")
60
+ return ["auvrynt:aseprite", "auvrynt:process", "auvrynt:write"];
61
+ if (name === "aseprite_capture_canvas")
62
+ return ["auvrynt:aseprite", "auvrynt:write"];
63
+ if (name === "close_workspace")
64
+ return ["auvrynt:write", "auvrynt:process"];
65
+ if (name === "blender_execute_python")
66
+ return ["auvrynt:blender", "auvrynt:blender-python"];
67
+ if (name.startsWith("blender_"))
68
+ return ["auvrynt:blender"];
69
+ if (name.startsWith("aseprite_"))
70
+ return ["auvrynt:aseprite"];
71
+ if (name.startsWith("godot_") || GENERIC_GODOT_TOOL_NAMES.has(name))
72
+ return ["auvrynt:godot"];
73
+ if (name.startsWith("serena_"))
74
+ return ["auvrynt:serena"];
75
+ if (name.startsWith("roblox_"))
76
+ return ["auvrynt:roblox"];
77
+ if (name.startsWith("context7_"))
78
+ return ["auvrynt:read"];
79
+ if (name === "agent_reach_doctor")
80
+ return ["auvrynt:process"];
81
+ if (name.startsWith("agent_reach_"))
82
+ return ["auvrynt:read"];
83
+ if (name === "obsidian_write_note")
84
+ return ["auvrynt:write"];
85
+ if (name.startsWith("obsidian_"))
86
+ return ["auvrynt:read"];
87
+ if (name === "start_dev_server")
88
+ return ["auvrynt:web", "auvrynt:process"];
89
+ if (name === "capture_page_screenshot"
90
+ || name === "test_responsive_page"
91
+ || name === "browser_screenshot")
92
+ return ["auvrynt:web", "auvrynt:write"];
93
+ if (name === "inspect_page"
94
+ || name.startsWith("browser_"))
95
+ return ["auvrynt:web"];
96
+ if (name === "capture_window")
97
+ return ["auvrynt:process", "auvrynt:write"];
98
+ if (name === "split_sprite_sheet")
99
+ return ["auvrynt:write"];
100
+ if (name === "inspect_dotnet_project")
101
+ return ["auvrynt:software"];
102
+ if (["dotnet_restore", "dotnet_build", "dotnet_test", "dotnet_run", "dotnet_format"].includes(name)) {
103
+ return ["auvrynt:software", "auvrynt:process"];
104
+ }
105
+ if (["start_process", "get_process_logs", "list_processes", "stop_process", "run_shell", "bash"].includes(name)) {
106
+ return ["auvrynt:process"];
107
+ }
108
+ if (["write", "write_file", "edit", "edit_file"].includes(name))
109
+ return ["auvrynt:write"];
110
+ return ["auvrynt:read"];
111
+ }
112
+ export function requiredScopesForToolCall(name, input) {
113
+ const required = new Set(requiredScopesForToolName(name));
114
+ if (name === "open_workspace" && input && typeof input === "object") {
115
+ if (input.mode === "worktree")
116
+ required.add("auvrynt:process");
117
+ }
118
+ if (name === "compare_images" && input && typeof input === "object" && "diffOutputPath" in input) {
119
+ if (typeof input.diffOutputPath === "string")
120
+ required.add("auvrynt:write");
121
+ }
122
+ if (name === "dotnet_format" && input && typeof input === "object") {
123
+ if (input.verifyOnly !== true)
124
+ required.add("auvrynt:write");
125
+ }
126
+ if (name === "aseprite_recovery" && input && typeof input === "object") {
127
+ const action = input.action;
128
+ if (action === "open_recovery_ui")
129
+ required.add("auvrynt:process");
130
+ if (action === "archive")
131
+ required.add("auvrynt:write");
132
+ }
133
+ return Array.from(required);
134
+ }
135
+ export function hasRequiredScopes(scopes, required) {
136
+ const available = scopes instanceof Set ? scopes : new Set(scopes);
137
+ return required.every((scope) => available.has(scope));
138
+ }
139
+ function godotIntegrationEnabled(config, toolName) {
140
+ const family = godotToolFamily(toolName);
141
+ if (family === "godotCsharp")
142
+ return config.integrations.godotCsharp;
143
+ if (family === "godotGdscript")
144
+ return config.integrations.godotGdscript;
145
+ return config.integrations.godotGdscript || config.integrations.godotCsharp;
146
+ }
147
+ export function toolIntegrationEnabled(config, name) {
148
+ if (config.toolToggles?.[name] === false)
149
+ return false;
150
+ if (name.startsWith("blender_"))
151
+ return config.integrations.blender;
152
+ if (name.startsWith("aseprite_"))
153
+ return config.integrations.aseprite;
154
+ if (isGodotToolName(name))
155
+ return godotIntegrationEnabled(config, name);
156
+ if (PLAYWRIGHT_TOOL_NAMES.has(name))
157
+ return config.integrations.playwright;
158
+ if (name.startsWith("agent_reach_"))
159
+ return true;
160
+ if (name.startsWith("serena_"))
161
+ return config.integrations.serena && config.serena.enabled;
162
+ if (name.startsWith("context7_"))
163
+ return config.integrations.context7;
164
+ if (name.startsWith("obsidian_"))
165
+ return config.integrations.obsidian;
166
+ if (name.startsWith("roblox_"))
167
+ return config.integrations.roblox;
168
+ return true;
169
+ }
@@ -0,0 +1,127 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { registerAppResource, RESOURCE_MIME_TYPE, } from "@modelcontextprotocol/ext-apps/server";
3
+ import { registerSerenaTools } from "../serena-tools.js";
4
+ import { updateToolScopes } from "../tool-capabilities.js";
5
+ import { configureMcpToolGuard } from "./mcp-tool-registrar.js";
6
+ import { WORKSPACE_APP_URI } from "./tool-registration-shared.js";
7
+ import { appCsp, assertWorkspaceAppAssets, packageVersion, workspaceAppHtml, } from "./ui-assets.js";
8
+ import { logFailedToolResponse, logToolCall } from "./tool-logging.js";
9
+ import { registerWorkspaceLifecycleTools } from "./tools/workspace-lifecycle-tools-registration.js";
10
+ import { registerCoreFileTools } from "./tools/core-file-tools-registration.js";
11
+ import { registerProcessProjectTools } from "./tools/process-project-tools-registration.js";
12
+ import { registerWebImageTools } from "./tools/web-image-tools-registration.js";
13
+ import { registerDotnetGodotWindowTools } from "./tools/dotnet-godot-window-tools-registration.js";
14
+ import { registerGodotCsharpTools } from "./tools/godot-csharp-tools-registration.js";
15
+ import { registerGodotGdscriptTools } from "./tools/godot-gdscript-tools-registration.js";
16
+ import { registerBlenderTools } from "./tools/blender-tools-registration.js";
17
+ import { registerAsepriteTools } from "./tools/aseprite-tools-registration.js";
18
+ import { registerContext7Tools } from "../integrations/context7/context7-tools.js";
19
+ import { registerObsidianTools } from "../integrations/obsidian/obsidian-tools.js";
20
+ import { registerAgentReachTools } from "../integrations/agent-reach/agent-reach-tools.js";
21
+ import { registerRobloxTools } from "./tools/roblox-tools-registration.js";
22
+ export function createMcpServer(config, workspaces, reviewCheckpoints, serenaManager, processManager, roomRegistry, sessionRegistry, workspaceChanges) {
23
+ const toolNames = toolNamesFor(config);
24
+ const server = new McpServer({
25
+ name: "auvrynt",
26
+ title: "Auvrynt",
27
+ version: packageVersion(),
28
+ description: "Secure local coding workspace for MCP clients. Provides workspace-scoped file, search, edit, write, and shell tools.",
29
+ }, { instructions: serverInstructions(config, toolNames) });
30
+ configureMcpToolGuard(server, { config, workspaces, rooms: roomRegistry });
31
+ const widgetCsp = appCsp(config);
32
+ const widgetMeta = {
33
+ ui: {
34
+ csp: widgetCsp,
35
+ prefersBorder: false,
36
+ },
37
+ "openai/widgetDescription": "Compact Auvrynt tool result card showing the action, target path, result count, and expandable output.",
38
+ "openai/widgetPrefersBorder": false,
39
+ "openai/widgetCSP": {
40
+ connect_domains: widgetCsp.connectDomains,
41
+ resource_domains: widgetCsp.resourceDomains,
42
+ },
43
+ };
44
+ registerAppResource(server, "Auvrynt Tool Card", WORKSPACE_APP_URI, {
45
+ description: "Interactive Auvrynt card for workspace tool results.",
46
+ _meta: widgetMeta,
47
+ }, async () => {
48
+ await assertWorkspaceAppAssets();
49
+ return {
50
+ contents: [
51
+ {
52
+ uri: WORKSPACE_APP_URI,
53
+ mimeType: RESOURCE_MIME_TYPE,
54
+ text: workspaceAppHtml(config),
55
+ _meta: widgetMeta,
56
+ },
57
+ ],
58
+ };
59
+ });
60
+ registerWorkspaceLifecycleTools(server, config, workspaces, reviewCheckpoints, processManager, roomRegistry, sessionRegistry, workspaceChanges, logToolCall);
61
+ registerCoreFileTools(server, config, workspaces, reviewCheckpoints, toolNames, workspaceChanges, logToolCall, logFailedToolResponse);
62
+ registerProcessProjectTools(server, config, workspaces, processManager, logToolCall);
63
+ registerWebImageTools(server, config, workspaces, processManager);
64
+ registerDotnetGodotWindowTools(server, config, workspaces, processManager);
65
+ registerGodotCsharpTools(server, config, workspaces, processManager);
66
+ registerGodotGdscriptTools(server, config, workspaces);
67
+ registerBlenderTools(server, config, workspaces);
68
+ registerAsepriteTools(server, config, workspaces, processManager);
69
+ registerRobloxTools(server, config);
70
+ if (config.oauth.scopes.includes("auvrynt:serena")) {
71
+ registerSerenaTools(server, config, serenaManager, workspaces);
72
+ registerContext7Tools(server);
73
+ registerObsidianTools(server, config);
74
+ registerAgentReachTools(server);
75
+ }
76
+ updateToolScopes();
77
+ return server;
78
+ }
79
+ function toolNamesFor(config) {
80
+ return config.toolNaming === "short"
81
+ ? {
82
+ openWorkspace: "open_workspace",
83
+ read: "read",
84
+ write: "write",
85
+ edit: "edit",
86
+ grep: "grep",
87
+ glob: "glob",
88
+ ls: "ls",
89
+ shell: "bash",
90
+ }
91
+ : {
92
+ openWorkspace: "open_workspace",
93
+ read: "read_file",
94
+ write: "write_file",
95
+ edit: "edit_file",
96
+ grep: "grep_files",
97
+ glob: "find_files",
98
+ ls: "list_directory",
99
+ shell: "run_shell",
100
+ };
101
+ }
102
+ function serverInstructions(config, toolNames) {
103
+ const inspection = config.minimalTools
104
+ ? `In minimal tool mode, ${toolNames.grep}, ${toolNames.glob}, and ${toolNames.ls} are disabled; use ${toolNames.shell} with command-line tools such as grep, rg, find, ls, and tree for search and directory inspection. `
105
+ : `Prefer ${toolNames.read}, ${toolNames.grep}, ${toolNames.glob}, and ${toolNames.ls} for file inspection. `;
106
+ const skills = config.skillsEnabled
107
+ ? `When ${toolNames.openWorkspace} returns available skills and a task matches a skill, use ${toolNames.read} to read that skill's path before proceeding. Skill paths may be outside the workspace, but ${toolNames.read} only permits advertised SKILL.md files and files under already-loaded skill directories. `
108
+ : "";
109
+ const agentsMd = `Follow instructions returned by ${toolNames.openWorkspace}. Before working under a path listed in availableAgentsFiles, use ${toolNames.read} to inspect that instruction file and follow it. `;
110
+ const viewImageInstruction = `Use view_image when asked to inspect, describe, analyze, or compare a local image. Call ${toolNames.openWorkspace} first, pass the returned workspaceId, and use a workspace-relative path. Do not use ${toolNames.read} for binary image files. `;
111
+ const showChanges = config.widgets === "changes"
112
+ ? " After creating, editing, or overwriting files, call show_changes once after the related file changes are complete so the user can see the aggregate diff."
113
+ : "";
114
+ const devTools = `
115
+ Process management: Use start_process for long-running servers, apps, and games that must stay running. Use get_process_logs to tail output. Use stop_process when done. Do not use ${toolNames.shell} for commands that block indefinitely.
116
+ Web development: Use start_dev_server to launch a dev server (auto-detects npm run dev), capture_page_screenshot to capture pages with Playwright, inspect_page for structured DOM/accessibility info, test_responsive_page for multi-viewport testing. Requires Playwright; see docs/DEVELOPMENT_TOOLS.md.
117
+ Generated artifacts: Screenshots, image diffs, sprite frames, application captures, Godot exports, Blender exports, and Blender checkpoints are stored under the workspace's auvrynt-logs directory. Output path arguments are organized into tool-specific subdirectories there. Ordinary source-file edits and generated project source code remain at their requested project paths.
118
+ Project discovery: Use inspect_project to detect project type, package manager, and recommended commands. Use glob_files and search_text for structured file search across the workspace.
119
+ Image tools: Use inspect_image for dimensions/format/palette. Use compare_images for pixel-level diff. Use inspect_sprite and split_sprite_sheet for sprite sheets. Do not use view_image for analysis—use inspect_image.
120
+ .NET tools: Use inspect_dotnet_project to read project structure, dotnet_restore/dotnet_build/dotnet_test for CLI operations, dotnet_run to start a .NET app as a persistent process, dotnet_format for formatting.
121
+ Godot tools: Use detect_godot_project when a workspace contains project.godot. Use godot_run to start the game or editor as a persistent process. Use inspect_godot_scene to read .tscn scene trees. Configure the Godot executable via GODOT_EXECUTABLE environment variable.
122
+ Roblox Studio tools: Use roblox_status then roblox_list_tools / roblox_call (or roblox_* aliases) to proxy the official Studio MCP (Enable Studio as MCP server). Requires auvrynt start roblox and an open Studio session.
123
+ Aseprite tools: Use aseprite_detect to verify the configured source build, aseprite_inspect_file for layers/frames/tags, aseprite_set_pixels or aseprite_draw_shapes for exact pixel edits, and the export/convert tools for workspace-bound outputs. Aseprite files and output paths must stay inside the open workspace.
124
+ Window capture: Use capture_window to screenshot a running application tracked by Auvrynt. Use godot_capture_game specifically for Godot game processes.
125
+ Security: All paths must be workspace-relative. Never access files outside the opened workspace. Do not claim a screenshot or comparison succeeded unless the tool returned successfully.`;
126
+ return `Use Auvrynt as a local coding workspace. Call ${toolNames.openWorkspace} once per project folder or worktree to obtain a workspaceId. Reuse that same workspaceId for all later file, search, edit, write, show-changes, view-image, and shell tools in that folder; do not call ${toolNames.openWorkspace} again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. ${agentsMd}${skills}${inspection}${viewImageInstruction}Prefer ${toolNames.edit} for targeted source-file modifications and ${toolNames.write} only for new files or complete rewrites. Use ${toolNames.shell} for tests, builds, git inspection, package scripts, and commands that genuinely require a shell. The shell/process tools execute with the local user's privileges and are not a filesystem sandbox; only invoke them when the granted auvrynt:process scope and requested task justify local command execution.${showChanges}${devTools}`;
127
+ }