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 "./auth/session-registry.js";
@@ -0,0 +1 @@
1
+ export * from "./infrastructure/shutdown.js";
package/dist/skills.js CHANGED
@@ -1,45 +1 @@
1
- import { homedir } from "node:os";
2
- import { resolve, sep } from "node:path";
3
- import { loadSkills, } from "@earendil-works/pi-coding-agent";
4
- import { expandHomePath, isPathInsideRoot } from "./roots.js";
5
- export function loadWorkspaceSkills(config, cwd) {
6
- if (!config.skillsEnabled)
7
- return { skills: [], diagnostics: [] };
8
- return loadSkills({
9
- cwd,
10
- agentDir: config.agentDir,
11
- skillPaths: config.skillPaths,
12
- includeDefaults: true,
13
- });
14
- }
15
- export function resolveSkillReadPath(skills, activatedSkillDirs, inputPath) {
16
- const absolutePath = resolve(expandHomePath(inputPath));
17
- for (const skill of skills) {
18
- const skillFilePath = resolve(skill.filePath);
19
- if (absolutePath === skillFilePath) {
20
- return { absolutePath, skill, isSkillFile: true };
21
- }
22
- }
23
- for (const skill of skills) {
24
- const baseDir = resolve(skill.baseDir);
25
- if (!activatedSkillDirs.has(baseDir))
26
- continue;
27
- if (!isPathInsideRoot(absolutePath, baseDir))
28
- continue;
29
- return { absolutePath, skill, isSkillFile: false };
30
- }
31
- return undefined;
32
- }
33
- export function markSkillActivated(activatedSkillDirs, skill) {
34
- activatedSkillDirs.add(resolve(skill.baseDir));
35
- }
36
- export function formatPathForPrompt(path) {
37
- const home = resolve(homedir());
38
- const resolvedPath = resolve(path);
39
- if (resolvedPath === home)
40
- return "~";
41
- if (resolvedPath.startsWith(`${home}${sep}`)) {
42
- return `~/${resolvedPath.slice(home.length + 1).split(sep).join("/")}`;
43
- }
44
- return resolvedPath.split(sep).join("/");
45
- }
1
+ export * from "./workspace/skills.js";
@@ -0,0 +1 @@
1
+ export * from "./infrastructure/sse-heartbeat.js";
@@ -0,0 +1 @@
1
+ export * from "./infrastructure/tool-capabilities.js";
@@ -0,0 +1 @@
1
+ export * from "./infrastructure/tool-result-budget.js";
@@ -0,0 +1,81 @@
1
+ import { createBashTool, createEditTool, createFindTool, createGrepTool, createLsTool, createReadTool, createWriteTool, } from "@earendil-works/pi-coding-agent";
2
+ import { resolveAllowedPath } from "../roots.js";
3
+ function toMcpContent(result) {
4
+ return result.content.map((content) => {
5
+ if (content.type === "text") {
6
+ return { type: "text", text: content.text };
7
+ }
8
+ return {
9
+ type: "image",
10
+ data: content.data,
11
+ mimeType: content.mimeType,
12
+ };
13
+ });
14
+ }
15
+ function formatToolError(error) {
16
+ const message = error instanceof Error ? error.message : String(error);
17
+ return [{ type: "text", text: message }];
18
+ }
19
+ async function runTool(execute, input, context) {
20
+ try {
21
+ const result = await execute(input);
22
+ return {
23
+ content: toMcpContent(result),
24
+ details: result.details,
25
+ };
26
+ }
27
+ catch (error) {
28
+ return { content: formatToolError(error), isError: true };
29
+ }
30
+ }
31
+ export async function readFileTool(input, context) {
32
+ const path = resolveAllowedPath(input.path, context.cwd, context.readRoots ?? [context.root]);
33
+ const tool = createReadTool(context.cwd);
34
+ return runTool((params) => tool.execute("read_file", params), {
35
+ path,
36
+ offset: input.offset,
37
+ limit: input.limit,
38
+ }, context);
39
+ }
40
+ export async function writeFileTool(input, context) {
41
+ const path = resolveAllowedPath(input.path, context.cwd, [context.root]);
42
+ const tool = createWriteTool(context.cwd);
43
+ return runTool((params) => tool.execute("write_file", params), {
44
+ path,
45
+ content: input.content,
46
+ }, context);
47
+ }
48
+ export async function editFileTool(input, context) {
49
+ const path = resolveAllowedPath(input.path, context.cwd, [context.root]);
50
+ const tool = createEditTool(context.cwd);
51
+ return runTool((params) => tool.execute("edit_file", params), {
52
+ path,
53
+ edits: input.edits,
54
+ }, context);
55
+ }
56
+ export async function grepFilesTool(input, context) {
57
+ if (input.path)
58
+ resolveAllowedPath(input.path, context.cwd, [context.root]);
59
+ const tool = createGrepTool(context.cwd);
60
+ return runTool((params) => tool.execute("grep_files", params), input, context);
61
+ }
62
+ export async function findFilesTool(input, context) {
63
+ if (input.path)
64
+ resolveAllowedPath(input.path, context.cwd, [context.root]);
65
+ const tool = createFindTool(context.cwd);
66
+ return runTool((params) => tool.execute("find_files", params), input, context);
67
+ }
68
+ export async function listDirectoryTool(input, context) {
69
+ if (input.path)
70
+ resolveAllowedPath(input.path, context.cwd, [context.root]);
71
+ const tool = createLsTool(context.cwd);
72
+ return runTool((params) => tool.execute("list_directory", params), input, context);
73
+ }
74
+ export async function runShellTool(input, context) {
75
+ const tool = createBashTool(context.cwd);
76
+ const timeout = input.timeout === undefined ? 30 : Math.min(input.timeout, 300);
77
+ return runTool((params) => tool.execute("run_shell", params), {
78
+ command: input.command,
79
+ timeout,
80
+ }, context);
81
+ }
@@ -0,0 +1,217 @@
1
+ import { createHash } from "node:crypto";
2
+ import { execFileSync, spawn } from "node:child_process";
3
+ import { closeSync, existsSync, openSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
7
+ import { isProcessRunning } from "../background-lifecycle.js";
8
+ import { findCommand } from "./tunnel-utils.js";
9
+ const MANAGED_CLOUDFLARED_VERSION = "2026.7.2";
10
+ const CLOUDFLARE_URL_PATTERN = /https:\/\/[a-zA-Z0-9-]+\.trycloudflare\.com/;
11
+ const MAX_STARTUP_OUTPUT_BYTES = 1024 * 1024;
12
+ export function extractCloudflarePublicUrl(output) {
13
+ return output.match(CLOUDFLARE_URL_PATTERN)?.[0];
14
+ }
15
+ async function installWindowsCloudflared() {
16
+ const targetDir = join(homedir(), ".auvrynt", "bin");
17
+ const executable = join(targetDir, "cloudflared.exe");
18
+ const artifact = process.arch === "arm64"
19
+ ? "cloudflared-windows-arm64.exe"
20
+ : process.arch === "ia32"
21
+ ? "cloudflared-windows-386.exe"
22
+ : "cloudflared-windows-amd64.exe";
23
+ const releaseUrl = `https://api.github.com/repos/cloudflare/cloudflared/releases/tags/${MANAGED_CLOUDFLARED_VERSION}`;
24
+ console.log(`cloudflared is not installed; downloading verified ${MANAGED_CLOUDFLARED_VERSION}...`);
25
+ const releaseResponse = await fetch(releaseUrl, {
26
+ headers: { Accept: "application/vnd.github+json", "User-Agent": "auvrynt-cloudflared-installer" },
27
+ signal: AbortSignal.timeout(30_000),
28
+ });
29
+ if (!releaseResponse.ok)
30
+ throw new Error(`Could not load cloudflared release metadata (HTTP ${releaseResponse.status}).`);
31
+ const release = await releaseResponse.json();
32
+ if (release.tag_name !== MANAGED_CLOUDFLARED_VERSION || !Array.isArray(release.assets)) {
33
+ throw new Error("Cloudflared release metadata did not match the pinned release.");
34
+ }
35
+ const asset = release.assets.find((candidate) => candidate.name === artifact);
36
+ if (!asset || typeof asset.browser_download_url !== "string" || typeof asset.digest !== "string") {
37
+ throw new Error(`Cloudflared release ${MANAGED_CLOUDFLARED_VERSION} is missing ${artifact} or its SHA-256 digest.`);
38
+ }
39
+ const expectedPrefix = `https://github.com/cloudflare/cloudflared/releases/download/${MANAGED_CLOUDFLARED_VERSION}/`;
40
+ if (!asset.browser_download_url.startsWith(expectedPrefix) || !/^sha256:[0-9a-f]{64}$/i.test(asset.digest)) {
41
+ throw new Error("Cloudflared release asset metadata failed origin/digest validation.");
42
+ }
43
+ const response = await fetch(asset.browser_download_url, { signal: AbortSignal.timeout(120_000) });
44
+ if (!response.ok)
45
+ throw new Error(`Could not download cloudflared (HTTP ${response.status}).`);
46
+ const bytes = Buffer.from(await response.arrayBuffer());
47
+ const actualDigest = createHash("sha256").update(bytes).digest("hex");
48
+ const expectedDigest = asset.digest.slice("sha256:".length).toLowerCase();
49
+ if (actualDigest !== expectedDigest) {
50
+ throw new Error("Cloudflared SHA-256 verification failed; the downloaded binary was not installed.");
51
+ }
52
+ await mkdir(targetDir, { recursive: true });
53
+ await writeFile(executable, bytes, { mode: 0o755 });
54
+ execFileSync(executable, ["--version"], { stdio: "ignore", windowsHide: true });
55
+ return executable;
56
+ }
57
+ async function resolveCloudflaredExecutable() {
58
+ const found = findCommand("cloudflared");
59
+ if (found)
60
+ return found;
61
+ if (process.platform === "win32") {
62
+ const managedExecutable = join(homedir(), ".auvrynt", "bin", "cloudflared.exe");
63
+ if (existsSync(managedExecutable)) {
64
+ try {
65
+ execFileSync(managedExecutable, ["--version"], { stdio: "ignore", windowsHide: true });
66
+ return managedExecutable;
67
+ }
68
+ catch {
69
+ // A partial or corrupt managed binary is replaced by the verified installer.
70
+ }
71
+ }
72
+ return installWindowsCloudflared();
73
+ }
74
+ throw new Error("cloudflared is required for `auvrynt start`. Install it from https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/.");
75
+ }
76
+ export async function startCloudflareTunnel(port, options = {}) {
77
+ const executable = await resolveCloudflaredExecutable();
78
+ const args = options.cloudflareTunnelToken
79
+ ? ["tunnel", "--no-autoupdate", "run"]
80
+ : ["tunnel", "--no-autoupdate", "--url", `http://127.0.0.1:${port}`];
81
+ if (options.cloudflareTunnelToken && !options.publicUrl) {
82
+ throw new Error("A public URL is required when starting a Cloudflare Named Tunnel.");
83
+ }
84
+ if (options.cloudflareTunnelToken) {
85
+ let stdio = ["ignore", "pipe", "pipe"];
86
+ let logHandle;
87
+ if (options.detached && options.logPath) {
88
+ await writeFile(options.logPath, "", { mode: 0o600 });
89
+ logHandle = openSync(options.logPath, "a");
90
+ stdio = ["ignore", logHandle, logHandle];
91
+ }
92
+ const child = spawn(executable, args, {
93
+ stdio,
94
+ windowsHide: true,
95
+ detached: options.detached,
96
+ env: { ...process.env, TUNNEL_TOKEN: options.cloudflareTunnelToken },
97
+ });
98
+ if (logHandle !== undefined)
99
+ closeSync(logHandle);
100
+ try {
101
+ const deadline = Date.now() + (options.logPath ? 30_000 : 1_500);
102
+ let registered = !options.logPath;
103
+ while (Date.now() < deadline) {
104
+ if (!child.pid || !isProcessRunning(child.pid))
105
+ throw new Error("Cloudflare Named Tunnel exited before connecting.");
106
+ if (options.logPath) {
107
+ const output = await readFile(options.logPath, "utf8").catch(() => "");
108
+ if (Buffer.byteLength(output, "utf8") > MAX_STARTUP_OUTPUT_BYTES) {
109
+ throw new Error("Cloudflare Named Tunnel startup output exceeded 1 MB before registering.");
110
+ }
111
+ registered = /Registered tunnel connection/i.test(output);
112
+ }
113
+ if (registered)
114
+ break;
115
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 250));
116
+ }
117
+ if (!registered)
118
+ throw new Error("Cloudflare Named Tunnel did not register with Cloudflare within 30 seconds.");
119
+ if (options.detached)
120
+ child.unref();
121
+ return { process: child, url: options.publicUrl };
122
+ }
123
+ catch (error) {
124
+ child.kill();
125
+ throw error;
126
+ }
127
+ }
128
+ if (options.detached && options.logPath) {
129
+ await writeFile(options.logPath, "", { mode: 0o600 });
130
+ const logHandle = openSync(options.logPath, "a");
131
+ const child = spawn(executable, args, {
132
+ stdio: ["ignore", logHandle, logHandle],
133
+ windowsHide: true,
134
+ detached: true,
135
+ });
136
+ closeSync(logHandle);
137
+ let spawnError;
138
+ child.once("error", (error) => { spawnError = error; });
139
+ const deadline = Date.now() + 90_000;
140
+ try {
141
+ while (Date.now() < deadline) {
142
+ if (spawnError)
143
+ throw new Error(`Cloudflare tunnel failed to start: ${spawnError.message}`);
144
+ if (!child.pid || !isProcessRunning(child.pid))
145
+ throw new Error("Cloudflare tunnel exited before connecting.");
146
+ const output = await readFile(options.logPath, "utf8").catch(() => "");
147
+ if (Buffer.byteLength(output, "utf8") > MAX_STARTUP_OUTPUT_BYTES) {
148
+ throw new Error("Cloudflare tunnel startup output exceeded 1 MB before providing a public URL.");
149
+ }
150
+ const url = extractCloudflarePublicUrl(output);
151
+ if (url) {
152
+ child.unref();
153
+ return { process: child, url };
154
+ }
155
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 250));
156
+ }
157
+ throw new Error("Cloudflare tunnel did not provide a public URL within 90 seconds.");
158
+ }
159
+ catch (error) {
160
+ child.kill();
161
+ throw error;
162
+ }
163
+ }
164
+ const child = spawn(executable, args, {
165
+ stdio: ["ignore", "pipe", "pipe"],
166
+ windowsHide: true,
167
+ detached: options.detached,
168
+ });
169
+ const tunnelUrl = await new Promise((resolveUrl, reject) => {
170
+ let output = "";
171
+ let settled = false;
172
+ const cleanup = () => {
173
+ clearTimeout(timeout);
174
+ child.stdout?.off("data", onOutput);
175
+ child.stderr?.off("data", onOutput);
176
+ child.off("error", onError);
177
+ child.off("exit", onExit);
178
+ };
179
+ const fail = (error) => {
180
+ if (settled)
181
+ return;
182
+ settled = true;
183
+ cleanup();
184
+ reject(error);
185
+ };
186
+ const timeout = setTimeout(() => {
187
+ child.kill();
188
+ fail(new Error("Cloudflare tunnel did not provide a public URL within 30 seconds."));
189
+ }, 30_000);
190
+ const onOutput = (chunk) => {
191
+ if (settled)
192
+ return;
193
+ output += chunk.toString();
194
+ if (Buffer.byteLength(output, "utf8") > MAX_STARTUP_OUTPUT_BYTES) {
195
+ child.kill();
196
+ fail(new Error("Cloudflare tunnel startup output exceeded 1 MB before providing a public URL."));
197
+ return;
198
+ }
199
+ const url = extractCloudflarePublicUrl(output);
200
+ if (url) {
201
+ settled = true;
202
+ cleanup();
203
+ resolveUrl(url);
204
+ }
205
+ };
206
+ const onError = (error) => fail(new Error(`Cloudflare tunnel failed to start: ${error.message}`));
207
+ const onExit = (code) => {
208
+ if (code !== null)
209
+ fail(new Error(`Cloudflare tunnel exited before connecting (code ${code}).`));
210
+ };
211
+ child.stdout?.on("data", onOutput);
212
+ child.stderr?.on("data", onOutput);
213
+ child.once("error", onError);
214
+ child.once("exit", onExit);
215
+ });
216
+ return { process: child, url: tunnelUrl };
217
+ }
@@ -0,0 +1,174 @@
1
+ import { execFileSync, spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { loadAuvryntFiles } from "../user-config.js";
6
+ const SERVICE_NAME = "cloudflared";
7
+ const POLL_INTERVAL_MS = 250;
8
+ const START_TIMEOUT_MS = 30_000;
9
+ function queryService() {
10
+ return execFileSync("sc.exe", ["query", SERVICE_NAME], {
11
+ encoding: "utf8",
12
+ windowsHide: true,
13
+ stdio: ["ignore", "pipe", "pipe"],
14
+ });
15
+ }
16
+ function serviceState() {
17
+ if (process.platform !== "win32")
18
+ return "MISSING";
19
+ try {
20
+ const output = queryService();
21
+ if (/STATE\s+:\s+\d+\s+RUNNING/i.test(output))
22
+ return "RUNNING";
23
+ if (/STATE\s+:\s+\d+\s+STOPPED/i.test(output))
24
+ return "STOPPED";
25
+ return "OTHER";
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ if (/1060|does not exist|not found/i.test(message))
30
+ return "MISSING";
31
+ return "OTHER";
32
+ }
33
+ }
34
+ export function isCloudflaredProcessRunning() {
35
+ if (process.platform !== "win32")
36
+ return false;
37
+ try {
38
+ const output = execFileSync("tasklist.exe", ["/FI", "IMAGENAME eq cloudflared.exe", "/NH"], {
39
+ encoding: "utf8",
40
+ windowsHide: true,
41
+ stdio: ["ignore", "pipe", "pipe"],
42
+ });
43
+ return /cloudflared\.exe/i.test(output);
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ export function findCloudflaredExecutable() {
50
+ if (process.platform !== "win32")
51
+ return null;
52
+ const commonPaths = [
53
+ "C:\\Program Files (x86)\\cloudflared\\cloudflared.exe",
54
+ "C:\\Program Files\\cloudflared\\cloudflared.exe",
55
+ join(homedir(), "bin", "cloudflared.exe"),
56
+ join(homedir(), "AppData", "Local", "Programs", "cloudflared", "cloudflared.exe"),
57
+ ];
58
+ for (const p of commonPaths) {
59
+ if (existsSync(p))
60
+ return p;
61
+ }
62
+ try {
63
+ const output = execFileSync("where.exe", ["cloudflared.exe"], {
64
+ encoding: "utf8",
65
+ windowsHide: true,
66
+ stdio: ["ignore", "pipe", "pipe"],
67
+ }).trim();
68
+ const first = output.split(/\r?\n/)[0]?.trim();
69
+ if (first && existsSync(first))
70
+ return first;
71
+ }
72
+ catch {
73
+ // not in PATH
74
+ }
75
+ return null;
76
+ }
77
+ export function spawnUserCloudflaredProcess(token) {
78
+ const binary = findCloudflaredExecutable();
79
+ if (!binary)
80
+ return false;
81
+ try {
82
+ const child = spawn(binary, ["tunnel", "run", "--token", token], {
83
+ detached: true,
84
+ stdio: "ignore",
85
+ windowsHide: true,
86
+ });
87
+ child.unref();
88
+ return true;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ async function waitForState(expected) {
95
+ const deadline = Date.now() + START_TIMEOUT_MS;
96
+ while (Date.now() < deadline) {
97
+ const current = serviceState();
98
+ if (current === expected)
99
+ return;
100
+ if (current === "MISSING")
101
+ throw new Error(`Windows service ${SERVICE_NAME} is not installed.`);
102
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
103
+ }
104
+ throw new Error(`Windows service ${SERVICE_NAME} did not become ${expected.toLowerCase()} within 30 seconds.`);
105
+ }
106
+ export async function startCloudflaredService() {
107
+ if (process.platform !== "win32")
108
+ return false;
109
+ // 1. Check if the Windows Service is already running
110
+ const current = serviceState();
111
+ if (current === "RUNNING")
112
+ return false;
113
+ // 2. Check if cloudflared is already running as a process (self-healed / user started)
114
+ if (isCloudflaredProcessRunning())
115
+ return false;
116
+ // 3. Try to start the Windows Service via sc.exe
117
+ let scFailed = false;
118
+ if (current !== "MISSING") {
119
+ try {
120
+ execFileSync("sc.exe", ["start", SERVICE_NAME], {
121
+ encoding: "utf8",
122
+ windowsHide: true,
123
+ stdio: ["ignore", "pipe", "pipe"],
124
+ });
125
+ await waitForState("RUNNING");
126
+ return true;
127
+ }
128
+ catch {
129
+ scFailed = true;
130
+ }
131
+ }
132
+ else {
133
+ scFailed = true;
134
+ }
135
+ // 4. Self-healing fallback: If sc.exe failed (e.g. non-admin), try spawning user-space cloudflared with saved token
136
+ if (scFailed) {
137
+ if (isCloudflaredProcessRunning())
138
+ return false;
139
+ const files = loadAuvryntFiles();
140
+ const token = files.auth.cloudflareTunnelToken || process.env.CLOUDFLARE_TUNNEL_TOKEN;
141
+ if (token) {
142
+ const spawned = spawnUserCloudflaredProcess(token);
143
+ if (spawned) {
144
+ const deadline = Date.now() + 4_000;
145
+ while (Date.now() < deadline) {
146
+ if (isCloudflaredProcessRunning())
147
+ return true;
148
+ await new Promise((resolve) => setTimeout(resolve, 250));
149
+ }
150
+ return true;
151
+ }
152
+ }
153
+ // If external tunnel is managed elsewhere or no token is provided, proceed gracefully
154
+ return false;
155
+ }
156
+ return false;
157
+ }
158
+ export async function stopCloudflaredService() {
159
+ if (process.platform !== "win32")
160
+ return false;
161
+ const current = serviceState();
162
+ if (current === "MISSING" || current === "STOPPED")
163
+ return false;
164
+ try {
165
+ execFileSync("sc.exe", ["stop", SERVICE_NAME], { encoding: "utf8", windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
166
+ }
167
+ catch (error) {
168
+ const message = error instanceof Error ? error.message : String(error);
169
+ if (!/1062|not been started|already stopped/i.test(message))
170
+ throw new Error(`Could not stop Windows service ${SERVICE_NAME}: ${message}`);
171
+ }
172
+ await waitForState("STOPPED");
173
+ return true;
174
+ }