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 @@
1
+ export * from "./integrations/playwright/browser-stability.js";
@@ -0,0 +1,10 @@
1
+ import { AUVRYNT_COMMANDS } from "../../infrastructure/command-reference.js";
2
+ export function printHelp() {
3
+ const commandWidth = AUVRYNT_COMMANDS.reduce((width, item) => Math.max(width, item.command.length), 0);
4
+ console.log([
5
+ "Auvrynt",
6
+ "",
7
+ "Usage:",
8
+ ...AUVRYNT_COMMANDS.map((item) => ` ${item.command.padEnd(commandWidth)} ${item.description}`),
9
+ ].join("\n"));
10
+ }
@@ -0,0 +1,190 @@
1
+ import * as prompts from "@clack/prompts";
2
+ import { resolve } from "node:path";
3
+ import { stdin, stdout } from "node:process";
4
+ import { expandHomePath } from "../../roots.js";
5
+ import { generateOwnerToken, loadAuvryntFiles, writeAuvryntAuth, writeAuvryntConfig, } from "../../user-config.js";
6
+ import { httpUrl } from "../runtime-support.js";
7
+ import { isCloudflaredProcessRunning, findCloudflaredExecutable, spawnUserCloudflaredProcess } from "../../tunnels/cloudflared-service.js";
8
+ class SetupCancelledError extends Error {
9
+ }
10
+ async function textPrompt(options) {
11
+ const result = await prompts.text({
12
+ ...options,
13
+ validate: (value) => options.validate?.(value?.trim() ? value : options.defaultValue),
14
+ });
15
+ if (prompts.isCancel(result))
16
+ throw new SetupCancelledError();
17
+ const value = String(result).trim();
18
+ return value || options.defaultValue;
19
+ }
20
+ function validatePort(value) {
21
+ const port = Number(value);
22
+ return Number.isInteger(port) && port >= 1 && port <= 65535
23
+ ? undefined
24
+ : "Enter a port between 1 and 65535.";
25
+ }
26
+ function validatePublicBaseUrl(value) {
27
+ try {
28
+ const parsed = new URL(value);
29
+ return parsed.protocol === "http:" || parsed.protocol === "https:"
30
+ ? undefined
31
+ : "Use an http or https URL.";
32
+ }
33
+ catch {
34
+ return "Enter a valid URL, for example https://your-tunnel-host.example.com.";
35
+ }
36
+ }
37
+ function validateRequiredPublicBaseUrl(value) {
38
+ const trimmed = value?.trim() ?? "";
39
+ if (!trimmed)
40
+ return "Enter the public URL from your tunnel or reverse proxy.";
41
+ if (trimmed.endsWith("/mcp"))
42
+ return "Enter the base URL only, without /mcp.";
43
+ return validatePublicBaseUrl(trimmed);
44
+ }
45
+ function normalizePublicBaseUrl(value) {
46
+ const parsed = new URL(value.trim());
47
+ parsed.hash = "";
48
+ parsed.search = "";
49
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
50
+ return parsed.toString().replace(/\/$/, "");
51
+ }
52
+ async function probeCustomUrl(url) {
53
+ try {
54
+ const controller = new AbortController();
55
+ const timeout = setTimeout(() => controller.abort(), 3000);
56
+ const res = await fetch(`${url}/healthz`, { signal: controller.signal });
57
+ clearTimeout(timeout);
58
+ return res.ok || res.status === 404 || res.status === 401;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ export async function ensureConfigured(options = {}) {
65
+ const files = loadAuvryntFiles();
66
+ if (files.configExists && files.authExists)
67
+ return;
68
+ if (process.env.AUVRYNT_OAUTH_OWNER_TOKEN)
69
+ return;
70
+ if (options.directoryScoped) {
71
+ const launchRoot = resolve(process.cwd());
72
+ if (!files.configExists) {
73
+ writeAuvryntConfig({
74
+ host: files.config.host ?? "127.0.0.1",
75
+ port: files.config.port ?? 49321,
76
+ allowedRoots: [launchRoot],
77
+ publicBaseUrl: files.config.publicBaseUrl ?? `http://127.0.0.1:${files.config.port ?? 49321}`,
78
+ });
79
+ }
80
+ if (!files.authExists)
81
+ writeAuvryntAuth({ ownerToken: generateOwnerToken() });
82
+ return;
83
+ }
84
+ if (!stdin.isTTY || !stdout.isTTY) {
85
+ throw new Error([
86
+ "Auvrynt is not configured and this terminal is non-interactive.",
87
+ "",
88
+ "Run:",
89
+ " auvrynt init",
90
+ "",
91
+ "Or provide AUVRYNT_OAUTH_OWNER_TOKEN and AUVRYNT_ALLOWED_ROOTS.",
92
+ ].join("\n"));
93
+ }
94
+ await runInitCommand({ force: false });
95
+ }
96
+ export async function runInitCommand({ force }) {
97
+ const files = loadAuvryntFiles();
98
+ if (!force && files.configExists && files.authExists) {
99
+ prompts.log.info(`Auvrynt is already configured at ${files.dir}`);
100
+ prompts.log.info("Run `auvrynt init --force` to update it.");
101
+ return;
102
+ }
103
+ try {
104
+ prompts.intro("Auvrynt setup");
105
+ const defaultRoots = files.config.allowedRoots?.join(", ") || process.cwd();
106
+ const rootsAnswer = await textPrompt({
107
+ message: `Where are your projects located? Press Enter to use ${defaultRoots}`,
108
+ placeholder: defaultRoots,
109
+ defaultValue: defaultRoots,
110
+ validate: (value) => value?.trim() ? undefined : "Enter at least one project root.",
111
+ });
112
+ const allowedRoots = rootsAnswer.split(",")
113
+ .map((root) => resolve(expandHomePath(root.trim())))
114
+ .filter(Boolean);
115
+ const defaultPort = String(files.config.port ?? 49321);
116
+ const port = Number(await textPrompt({
117
+ message: `Which local port should Auvrynt use? Press Enter to use ${defaultPort}`,
118
+ placeholder: defaultPort,
119
+ defaultValue: defaultPort,
120
+ validate: validatePort,
121
+ }));
122
+ prompts.note([
123
+ "Auvrynt needs a public base URL so ChatGPT or Claude can reach this MCP server.",
124
+ "Create a tunnel or reverse proxy with Cloudflare Tunnel, ngrok, Pinggy, Tailscale Funnel, or your own HTTPS proxy.",
125
+ "Paste the public origin here, without /mcp.",
126
+ "",
127
+ "Example: https://your-tunnel-host.example.com",
128
+ ].join("\n"), "Public URL required");
129
+ const publicBaseUrl = normalizePublicBaseUrl(await textPrompt({
130
+ message: files.config.publicBaseUrl
131
+ ? `What is the public base URL? Press Enter to keep ${files.config.publicBaseUrl}`
132
+ : "What is the public base URL?",
133
+ placeholder: files.config.publicBaseUrl ?? "https://your-tunnel-host.example.com",
134
+ defaultValue: files.config.publicBaseUrl ?? "",
135
+ validate: validateRequiredPublicBaseUrl,
136
+ }));
137
+ let cloudflareTunnelToken = files.auth.cloudflareTunnelToken;
138
+ const tokenAnswer = await textPrompt({
139
+ message: "Cloudflare Named Tunnel token (optional; press Enter to skip if managed externally)",
140
+ placeholder: "paste token or press Enter to skip",
141
+ defaultValue: cloudflareTunnelToken ?? "",
142
+ });
143
+ if (tokenAnswer)
144
+ cloudflareTunnelToken = tokenAnswer;
145
+ const s = prompts.spinner();
146
+ s.start("Checking tunnel and public URL connectivity...");
147
+ if (cloudflareTunnelToken && !isCloudflaredProcessRunning() && findCloudflaredExecutable()) {
148
+ spawnUserCloudflaredProcess(cloudflareTunnelToken);
149
+ }
150
+ const isReachable = await probeCustomUrl(publicBaseUrl);
151
+ if (isReachable) {
152
+ s.stop("✓ Public URL is reachable and responding.");
153
+ }
154
+ else {
155
+ s.stop("ℹ Public URL not reachable yet. Auvrynt will auto-connect when the tunnel starts.");
156
+ }
157
+ const config = {
158
+ host: files.config.host ?? "127.0.0.1",
159
+ port,
160
+ allowedRoots,
161
+ publicBaseUrl,
162
+ tunnelProvider: "custom",
163
+ };
164
+ const auth = {
165
+ ownerToken: files.auth.ownerToken ?? generateOwnerToken(),
166
+ ...(cloudflareTunnelToken ? { cloudflareTunnelToken } : {}),
167
+ };
168
+ const configPath = writeAuvryntConfig(config);
169
+ const authPath = writeAuvryntAuth(auth);
170
+ prompts.note([
171
+ `Config: ${configPath}`,
172
+ `Auth: ${authPath}`,
173
+ `Local MCP URL: ${httpUrl(config.host ?? "127.0.0.1", config.port ?? 49321, "/mcp")}`,
174
+ `Public MCP URL: ${publicBaseUrl}/mcp`,
175
+ ].join("\n"), "Auvrynt configured");
176
+ prompts.note([
177
+ `Owner token: ${auth.ownerToken}`,
178
+ "Use this when ChatGPT or Claude asks you to approve Auvrynt access.",
179
+ `Stored at: ${authPath}`,
180
+ ].join("\n"), "Owner token");
181
+ prompts.outro("Run `auvrynt start` to start the MCP server.");
182
+ }
183
+ catch (error) {
184
+ if (error instanceof SetupCancelledError) {
185
+ prompts.cancel("Setup cancelled");
186
+ return;
187
+ }
188
+ throw error;
189
+ }
190
+ }
@@ -0,0 +1,88 @@
1
+ import * as prompts from "@clack/prompts";
2
+ import { INTEGRATION_KEYS, INTEGRATION_LABELS } from "../../background-lifecycle.js";
3
+ import { loadAuvryntFiles, writeAuvryntConfig, } from "../../user-config.js";
4
+ export function completeIntegrationsConfig(config) {
5
+ return {
6
+ godotGdscript: config?.godotGdscript ?? false,
7
+ godotCsharp: config?.godotCsharp ?? false,
8
+ blender: config?.blender ?? false,
9
+ aseprite: config?.aseprite ?? false,
10
+ serena: config?.serena ?? false,
11
+ playwright: config?.playwright ?? false,
12
+ context7: config?.context7 ?? false,
13
+ obsidian: config?.obsidian ?? false,
14
+ roblox: config?.roblox ?? false,
15
+ };
16
+ }
17
+ function writeIntegrationConfig(integrations) {
18
+ const files = loadAuvryntFiles();
19
+ writeAuvryntConfig({ ...files.config, integrations });
20
+ }
21
+ export async function ensureIntegrationChoicesConfigured() {
22
+ const files = loadAuvryntFiles();
23
+ if (files.config.integrations)
24
+ return;
25
+ prompts.intro(" Auvrynt integrations ");
26
+ const integrations = completeIntegrationsConfig(undefined);
27
+ for (const key of INTEGRATION_KEYS) {
28
+ const answer = await prompts.confirm({
29
+ message: `Enable ${INTEGRATION_LABELS[key]}?`,
30
+ initialValue: false,
31
+ });
32
+ if (prompts.isCancel(answer)) {
33
+ prompts.cancel("Integration setup cancelled.");
34
+ process.exit(1);
35
+ }
36
+ integrations[key] = Boolean(answer);
37
+ }
38
+ writeAuvryntConfig({ ...files.config, integrations });
39
+ prompts.outro("Saved integration choices. Change them later with `auvrynt enable` or `auvrynt disable`.");
40
+ }
41
+ async function runToggleCommand(enable) {
42
+ const files = loadAuvryntFiles();
43
+ const integrations = completeIntegrationsConfig(files.config.integrations);
44
+ const verb = enable ? "Enable" : "Disable";
45
+ prompts.intro(` ${verb} Auvrynt integrations `);
46
+ while (true) {
47
+ prompts.note([
48
+ "0. Done",
49
+ ...INTEGRATION_KEYS.map((key, index) => `${index + 1}. ${INTEGRATION_LABELS[key]} ${integrations[key] ? "[enabled]" : "[disabled]"}`),
50
+ ].join("\n"), "Integrations");
51
+ const picked = await prompts.text({
52
+ message: `Type numbers to ${enable ? "enable" : "disable"}, or 0 when finished`,
53
+ placeholder: "1 3 5 or 0",
54
+ validate: (value) => {
55
+ const raw = String(value ?? "").trim();
56
+ if (!raw)
57
+ return "Enter one or more numbers, or 0.";
58
+ const values = raw.split(/[\s,]+/).map(Number);
59
+ if (values.includes(0))
60
+ return values.length === 1 ? undefined : "Use 0 by itself when finished.";
61
+ if (values.some((value) => !Number.isInteger(value) || value < 1 || value > INTEGRATION_KEYS.length)) {
62
+ return `Use 0 or numbers from 1 to ${INTEGRATION_KEYS.length}.`;
63
+ }
64
+ const alreadyDesired = values.every((value) => integrations[INTEGRATION_KEYS[value - 1]] === enable);
65
+ if (alreadyDesired)
66
+ return `Choose at least one ${enable ? "disabled" : "enabled"} integration, or type 0.`;
67
+ return undefined;
68
+ },
69
+ });
70
+ if (prompts.isCancel(picked)) {
71
+ prompts.cancel(`${verb} cancelled.`);
72
+ return;
73
+ }
74
+ const values = String(picked).trim().split(/[\s,]+/).map(Number);
75
+ if (values[0] === 0)
76
+ break;
77
+ for (const value of new Set(values))
78
+ integrations[INTEGRATION_KEYS[value - 1]] = enable;
79
+ writeIntegrationConfig(integrations);
80
+ }
81
+ prompts.outro("Integration settings updated. Restart any running Auvrynt server for the change to take effect.");
82
+ }
83
+ export function runEnableCommand() {
84
+ return runToggleCommand(true);
85
+ }
86
+ export function runDisableCommand() {
87
+ return runToggleCommand(false);
88
+ }
@@ -0,0 +1,83 @@
1
+ import { resolve } from "node:path";
2
+ import { loadConfig } from "../../config.js";
3
+ import { parseStartRequest } from "../../background-lifecycle.js";
4
+ import { startTunnel } from "../../tunnels/tunnel-manager.js";
5
+ import { applyIntegrationProfile, } from "../lifecycle-manager.js";
6
+ import { selfHealStartIntegrations } from "../integration-bootstrap.js";
7
+ import { acquireInstanceLock } from "../instance-lock.js";
8
+ import { serveForegroundServer } from "../foreground-server.js";
9
+ import { ensureConfigured } from "./init-command.js";
10
+ export async function runServeCommand(rawCommand, args, lifecycle) {
11
+ const startRequest = rawCommand === "start" ? parseStartRequest(args) : undefined;
12
+ if (startRequest && !startRequest.backgroundChild) {
13
+ const launchRoot = setDirectoryScopedRoot();
14
+ await ensureConfigured({ directoryScoped: true });
15
+ await lifecycle.start(startRequest, launchRoot);
16
+ return;
17
+ }
18
+ if (rawCommand === "start")
19
+ setDirectoryScopedRoot();
20
+ await ensureConfigured({ directoryScoped: rawCommand === "start" });
21
+ if (startRequest?.profiles)
22
+ applyIntegrationProfile(startRequest.profiles);
23
+ const localConfig = loadConfig();
24
+ exposeConfiguredGodotExecutables(localConfig.executables);
25
+ const instanceLock = await acquireInstanceLock(localConfig.stateDir, localConfig.host, localConfig.port, startRequest?.profiles, resolve(process.cwd()));
26
+ let tunnel;
27
+ let stopTunnel;
28
+ try {
29
+ if (rawCommand === "start") {
30
+ process.env.AUVRYNT_START_MODE = "true";
31
+ const launchRoot = resolve(process.cwd());
32
+ if (!startRequest?.backgroundChild) {
33
+ await selfHealStartIntegrations(launchRoot, localConfig.executables, localConfig.integrations);
34
+ }
35
+ const managedTunnelUrl = process.env.AUVRYNT_MANAGED_TUNNEL_URL;
36
+ if (localConfig.tunnelProvider === "custom" && (process.platform === "win32" || !localConfig.cloudflareTunnelToken)) {
37
+ process.env.AUVRYNT_PUBLIC_BASE_URL = localConfig.publicBaseUrl;
38
+ }
39
+ else if (managedTunnelUrl) {
40
+ process.env.AUVRYNT_PUBLIC_BASE_URL = managedTunnelUrl;
41
+ }
42
+ else {
43
+ tunnel = await startTunnel(localConfig.tunnelProvider, localConfig.port, {
44
+ ngrokAuthtoken: localConfig.ngrokAuthtoken,
45
+ ngrokUrl: localConfig.ngrokUrl,
46
+ cloudflareTunnelToken: localConfig.cloudflareTunnelToken,
47
+ publicUrl: localConfig.publicBaseUrl,
48
+ });
49
+ process.env.AUVRYNT_PUBLIC_BASE_URL = tunnel.url;
50
+ stopTunnel = () => {
51
+ if (tunnel && !tunnel.process.killed)
52
+ tunnel.process.kill();
53
+ };
54
+ process.once("SIGINT", stopTunnel);
55
+ process.once("SIGTERM", stopTunnel);
56
+ }
57
+ }
58
+ await serveForegroundServer();
59
+ }
60
+ finally {
61
+ if (stopTunnel) {
62
+ process.removeListener("SIGINT", stopTunnel);
63
+ process.removeListener("SIGTERM", stopTunnel);
64
+ stopTunnel();
65
+ }
66
+ await instanceLock.release();
67
+ }
68
+ }
69
+ function setDirectoryScopedRoot() {
70
+ const launchRoot = resolve(process.cwd());
71
+ process.env.AUVRYNT_ALLOWED_ROOTS = launchRoot;
72
+ process.env.AUVRYNT_WORKTREE_ROOT = launchRoot;
73
+ return launchRoot;
74
+ }
75
+ function exposeConfiguredGodotExecutables(executables) {
76
+ if (executables.godotCsharp
77
+ && !process.env.GODOT_DOTNET_EXECUTABLE) {
78
+ process.env.GODOT_DOTNET_EXECUTABLE = executables.godotCsharp;
79
+ }
80
+ if (executables.godot && !process.env.GODOT_EXECUTABLE) {
81
+ process.env.GODOT_EXECUTABLE = executables.godot;
82
+ }
83
+ }
@@ -0,0 +1,81 @@
1
+ import * as prompts from "@clack/prompts";
2
+ import { ensureGlobalGodotPlugin } from "../../godot-tools.js";
3
+ import { ensureGlobalAsepriteBridge } from "../../integrations/aseprite/aseprite-live-tools.js";
4
+ import { loadAuvryntFiles, writeAuvryntConfig } from "../../user-config.js";
5
+ const SETUP_TOOL_LABELS = {
6
+ godot: "Godot - GDScript game engine",
7
+ godotCsharp: "Godot C# - .NET / Mono Godot build",
8
+ asepriteSource: "Aseprite - source/build directory",
9
+ };
10
+ const SETUP_TOOL_KEYS = ["godot", "godotCsharp", "asepriteSource"];
11
+ export async function runSetupCommand(args = []) {
12
+ const files = loadAuvryntFiles();
13
+ const existingExecs = files.config.executables ?? {};
14
+ if (args.length >= 2) {
15
+ const toolKeyMap = {
16
+ godot: "godot",
17
+ godotcsharp: "godotCsharp",
18
+ "godot-csharp": "godotCsharp",
19
+ aseprite: "asepriteSource",
20
+ "aseprite-source": "asepriteSource",
21
+ };
22
+ const key = toolKeyMap[args[0].toLowerCase()];
23
+ if (key) {
24
+ const exePath = args.slice(1).join(" ").trim().replace(/^["']|["']$/g, "").trim();
25
+ writeAuvryntConfig({ ...files.config, executables: { ...existingExecs, [key]: exePath } });
26
+ if (key === "asepriteSource") {
27
+ const bridge = await ensureGlobalAsepriteBridge();
28
+ console.log(`Installed Aseprite live bridge: ${bridge.targetPath}`);
29
+ }
30
+ console.log(`Updated ${key} executable path: ${exePath}`);
31
+ return;
32
+ }
33
+ }
34
+ prompts.intro(" Auvrynt Setup - configure local tool integrations ");
35
+ const picked = await prompts.select({
36
+ message: "Select integration to configure (Enter to confirm)",
37
+ options: SETUP_TOOL_KEYS.map((key) => ({
38
+ value: key,
39
+ label: SETUP_TOOL_LABELS[key],
40
+ hint: existingExecs[key] ? `currently: ${existingExecs[key]}` : "not set",
41
+ })),
42
+ });
43
+ if (prompts.isCancel(picked)) {
44
+ prompts.cancel("Setup cancelled.");
45
+ return;
46
+ }
47
+ const key = picked;
48
+ const labelName = SETUP_TOOL_LABELS[key].split(" - ")[0].trim();
49
+ const placeholder = key === "godot"
50
+ ? "e.g. C:\\Program Files\\Godot\\Godot.exe"
51
+ : key === "godotCsharp"
52
+ ? "e.g. C:\\Program Files\\Godot_v4-mono\\Godot.exe (.NET build)"
53
+ : "e.g. C:\\Users\\you\\src\\aseprite (contains build\\bin\\aseprite.exe)";
54
+ const answer = await prompts.text({
55
+ message: `${labelName} executable path`,
56
+ placeholder,
57
+ initialValue: existingExecs[key] ?? "",
58
+ validate: (value) => (value ?? "").trim() ? undefined : "Path cannot be empty.",
59
+ });
60
+ if (prompts.isCancel(answer)) {
61
+ prompts.cancel("Setup cancelled.");
62
+ return;
63
+ }
64
+ const executablePath = String(answer).trim().replace(/^["']|["']$/g, "").trim();
65
+ writeAuvryntConfig({
66
+ ...files.config,
67
+ executables: { ...files.config.executables, [key]: executablePath },
68
+ });
69
+ if (key === "godot" || key === "godotCsharp") {
70
+ const pluginResult = ensureGlobalGodotPlugin();
71
+ if (pluginResult.installed) {
72
+ prompts.log.success(`Installed global Godot Editor plugin: ${pluginResult.targetPath}`);
73
+ }
74
+ }
75
+ else if (key === "asepriteSource") {
76
+ const bridge = await ensureGlobalAsepriteBridge();
77
+ prompts.log.success(`Installed Aseprite live bridge: ${bridge.targetPath}`);
78
+ }
79
+ prompts.note(`${labelName.padEnd(14)} -> ${executablePath}`, "Saved to ~/.auvrynt/config.json");
80
+ prompts.outro("Setup complete. Run `auvrynt status` to verify.");
81
+ }
@@ -0,0 +1,166 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createRequire } from "node:module";
3
+ import { getShellConfig } from "@earendil-works/pi-coding-agent";
4
+ import { satisfies } from "semver";
5
+ import { loadConfig } from "../../config.js";
6
+ import { INTEGRATION_KEYS, INTEGRATION_LABELS } from "../../background-lifecycle.js";
7
+ import { discoverLocalIntegrations, processDetected } from "../../integration-discovery.js";
8
+ import { getGlobalGodotPluginStatus } from "../../godot-tools.js";
9
+ import { getPlaywrightRuntimeStatus } from "../../playwright-runtime.js";
10
+ import { readManagedTunnel } from "../../tunnels/tunnel-manager.js";
11
+ import { loadAuvryntFiles } from "../../user-config.js";
12
+ import { dashboardUrl, httpUrl, localProbeHost, printConsolePanel, RUNNING_COMMAND_HINTS, } from "../runtime-support.js";
13
+ const require = createRequire(import.meta.url);
14
+ const SUPPORTED_NODE_RANGE = ">=20.12 <27";
15
+ export async function runDoctorCommand() {
16
+ const files = loadAuvryntFiles();
17
+ const rows = [
18
+ { label: "Config dir", value: files.dir },
19
+ { label: "Config", value: files.configExists ? files.configPath : "Missing" },
20
+ { label: "Auth", value: files.authExists ? files.authPath : "Missing" },
21
+ { label: "Node", value: `${process.version} (${nodeVersionStatus()}), ABI ${process.versions.modules}` },
22
+ { label: "Platform", value: `${process.platform} ${process.arch}` },
23
+ { label: "Git", value: checkGitAvailable() },
24
+ { label: "Bash", value: checkBashShell() },
25
+ { label: "SQLite", value: checkSqliteNative() },
26
+ ];
27
+ try {
28
+ const config = loadConfig();
29
+ rows.push({ label: "Local MCP", value: httpUrl(config.host, config.port, "/mcp") }, { label: "Public MCP", value: new URL("/mcp", config.publicBaseUrl).toString() }, { label: "Roots", value: config.allowedRoots.join(", ") }, { label: "Hosts", value: config.allowedHosts.join(", ") });
30
+ }
31
+ catch (error) {
32
+ rows.push({ label: "Config status", value: error instanceof Error ? error.message : String(error) });
33
+ }
34
+ printConsolePanel("Auvrynt doctor", rows);
35
+ }
36
+ export async function runStatusCommand(dependencies) {
37
+ const files = loadAuvryntFiles();
38
+ const config = loadConfig();
39
+ const host = files.config.host ?? "127.0.0.1";
40
+ const port = files.config.port ?? 49321;
41
+ const healthUrl = httpUrl(localProbeHost(host), port, "/healthz");
42
+ const active = await dependencies.readActiveInstance();
43
+ const tunnel = await readManagedTunnel({
44
+ stateDir: config.stateDir,
45
+ port,
46
+ provider: config.tunnelProvider,
47
+ ngrokAuthtoken: config.ngrokAuthtoken,
48
+ ngrokUrl: config.ngrokUrl,
49
+ });
50
+ const rows = [];
51
+ try {
52
+ const response = await fetch(healthUrl, { signal: AbortSignal.timeout(1500) });
53
+ const body = await response.json().catch(() => ({}));
54
+ rows.push({ label: "Local MCP", value: response.ok && body.ok ? "Connected" : "Error" });
55
+ }
56
+ catch (error) {
57
+ rows.push({ label: "Local MCP", value: "Disconnected" });
58
+ rows.push({ label: "Detail", value: error instanceof Error ? error.message : String(error) });
59
+ }
60
+ rows.push({ label: "Health", value: healthUrl });
61
+ rows.push({ label: "Dashboard", value: dashboardUrl(host, port) });
62
+ if (active) {
63
+ rows.push({ label: "Process", value: `PID ${active.record.pid}` });
64
+ rows.push({ label: "Workspace", value: active.record.launchRoot ?? "unknown" });
65
+ }
66
+ else {
67
+ rows.push({ label: "Process", value: "Not running" });
68
+ }
69
+ rows.push({
70
+ label: "Public MCP",
71
+ value: config.tunnelProvider === "custom"
72
+ ? new URL("/mcp", config.publicBaseUrl).toString()
73
+ : tunnel
74
+ ? `${tunnel.url}/mcp`
75
+ : "Not running",
76
+ });
77
+ const local = await discoverLocalIntegrations({ pollMs: 1500 });
78
+ const profileSet = new Set(active?.record.profiles ?? INTEGRATION_KEYS.filter((key) => config.integrations[key]));
79
+ rows.push({
80
+ label: "Integrations",
81
+ value: profileSet.size > 0 ? [...profileSet].map((key) => INTEGRATION_LABELS[key]).join(", ") : "None",
82
+ });
83
+ if (profileSet.has("blender")) {
84
+ const blenderConnected = local.ports.blender_lab_mcp;
85
+ const blenderDetail = local.ports.blender_lab_mcp
86
+ ? "Blender MCP connected on 9876"
87
+ : processDetected(local, "blender")
88
+ ? "Blender is running; waiting for Blender Lab MCP on 9876"
89
+ : "Blender is not detected";
90
+ rows.push({ label: "Blender", value: `${blenderConnected ? "Connected" : "Offline"} - ${blenderDetail}` });
91
+ }
92
+ if (profileSet.has("godotGdscript") || profileSet.has("godotCsharp")) {
93
+ const godotPlugin = getGlobalGodotPluginStatus();
94
+ const godotConfigured = Boolean(local.executables.godot || local.executables.godotCsharp || godotPlugin.installed);
95
+ const godotStatusText = local.ports.auvrynt_godot_bridge
96
+ ? "connected"
97
+ : processDetected(local, "godot")
98
+ ? "running, bridge unavailable"
99
+ : godotConfigured
100
+ ? "installed, not running"
101
+ : "not detected";
102
+ rows.push({ label: "Godot", value: godotStatusText });
103
+ }
104
+ if (profileSet.has("serena")) {
105
+ rows.push({
106
+ label: "Software",
107
+ value: processDetected(local, "serena") ? "Ready" : local.executables.serena ? "Installed, not running" : "Not detected",
108
+ });
109
+ }
110
+ if (profileSet.has("playwright")) {
111
+ const playwright = getPlaywrightRuntimeStatus();
112
+ rows.push({
113
+ label: "Web",
114
+ value: playwright.chromiumInstalled ? "Ready" : playwright.packageInstalled ? "Installed, browser unavailable" : "Not installed",
115
+ });
116
+ }
117
+ printConsolePanel("Auvrynt status", rows, active ? RUNNING_COMMAND_HINTS : "Start: auvrynt start");
118
+ }
119
+ export function assertSupportedNode() {
120
+ if (satisfies(process.versions.node, SUPPORTED_NODE_RANGE))
121
+ return;
122
+ throw new Error(`Auvrynt supports Node ${SUPPORTED_NODE_RANGE}. Current runtime: ${process.version}. `
123
+ + "Use Node 20 LTS, Node 22 LTS, Node 24 LTS, or Node 26.");
124
+ }
125
+ function nodeVersionStatus() {
126
+ return satisfies(process.versions.node, SUPPORTED_NODE_RANGE)
127
+ ? `supported (${SUPPORTED_NODE_RANGE})`
128
+ : `unsupported; expected ${SUPPORTED_NODE_RANGE}`;
129
+ }
130
+ export function checkSqliteNative() {
131
+ try {
132
+ const Database = require("better-sqlite3");
133
+ const database = new Database(":memory:");
134
+ try {
135
+ database.prepare("SELECT 1 AS ok").get();
136
+ return "ok";
137
+ }
138
+ finally {
139
+ database.close();
140
+ }
141
+ }
142
+ catch (error) {
143
+ return `Unavailable: ${error instanceof Error ? error.message : String(error)}`;
144
+ }
145
+ }
146
+ function checkGitAvailable() {
147
+ try {
148
+ return execFileSync("git", ["--version"], {
149
+ encoding: "utf8",
150
+ stdio: ["ignore", "pipe", "pipe"],
151
+ windowsHide: true,
152
+ }).trim();
153
+ }
154
+ catch (error) {
155
+ return `Unavailable: ${error instanceof Error ? error.message : String(error)}`;
156
+ }
157
+ }
158
+ function checkBashShell() {
159
+ try {
160
+ const shell = getShellConfig();
161
+ return `${shell.shell} ${shell.args.join(" ")}`;
162
+ }
163
+ catch (error) {
164
+ return `Unavailable: ${error instanceof Error ? error.message : String(error)}`;
165
+ }
166
+ }