auvrynt 1.0.1

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 (364) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +239 -0
  3. package/dist/blender-client.js +109 -0
  4. package/dist/blender-tools.js +930 -0
  5. package/dist/cli.js +370 -0
  6. package/dist/config.js +211 -0
  7. package/dist/connection-status.js +91 -0
  8. package/dist/db/client.js +22 -0
  9. package/dist/db/schema.js +29 -0
  10. package/dist/dotnet-tools.js +223 -0
  11. package/dist/git-worktrees.js +134 -0
  12. package/dist/git.js +41 -0
  13. package/dist/godot-animation-tilemap.js +82 -0
  14. package/dist/godot-csharp-build.js +93 -0
  15. package/dist/godot-csharp-project.js +157 -0
  16. package/dist/godot-csharp-runner.js +146 -0
  17. package/dist/godot-csharp-semantic.js +161 -0
  18. package/dist/godot-csharp-validate.js +71 -0
  19. package/dist/godot-dotnet-env.js +169 -0
  20. package/dist/godot-editor-bridge.js +140 -0
  21. package/dist/godot-gdscript.js +824 -0
  22. package/dist/godot-project-settings.js +223 -0
  23. package/dist/godot-runtime-testing.js +249 -0
  24. package/dist/godot-tools.js +183 -0
  25. package/dist/image-tools.js +157 -0
  26. package/dist/logger.js +76 -0
  27. package/dist/oauth-provider.js +266 -0
  28. package/dist/pi-tools.js +81 -0
  29. package/dist/processes.js +218 -0
  30. package/dist/review-checkpoints.js +142 -0
  31. package/dist/roots.js +53 -0
  32. package/dist/search-discovery.js +271 -0
  33. package/dist/serena-manager.js +443 -0
  34. package/dist/serena-tools.js +411 -0
  35. package/dist/server.js +2835 -0
  36. package/dist/skills.js +45 -0
  37. package/dist/ui/.vite/manifest.json +2520 -0
  38. package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
  39. package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
  40. package/dist/ui/assets/ada-C5qYipkI.js +1 -0
  41. package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  42. package/dist/ui/assets/angular-html-BJqQFYI6.js +1 -0
  43. package/dist/ui/assets/angular-ts-CMJECO0Y.js +1 -0
  44. package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
  45. package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
  46. package/dist/ui/assets/apl-DWeXpBBr.js +1 -0
  47. package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
  48. package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
  49. package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
  50. package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
  51. package/dist/ui/assets/astro-CLbttLOq.js +1 -0
  52. package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  53. package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
  54. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  55. package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  56. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  57. package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
  58. package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
  59. package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
  60. package/dist/ui/assets/berry-DKpUyyne.js +1 -0
  61. package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
  62. package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
  63. package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
  64. package/dist/ui/assets/blade-BOzY0P2V.js +1 -0
  65. package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
  66. package/dist/ui/assets/c-BG-8uJvh.js +1 -0
  67. package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
  68. package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
  69. package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
  70. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  71. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  72. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  73. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  74. package/dist/ui/assets/clarity-SemFz856.js +1 -0
  75. package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
  76. package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
  77. package/dist/ui/assets/cobol-I_17IuGe.js +1 -0
  78. package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
  79. package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
  80. package/dist/ui/assets/coffee-C0B8hmok.js +1 -0
  81. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
  82. package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
  83. package/dist/ui/assets/cpp-DDJXt6Vs.js +1 -0
  84. package/dist/ui/assets/crystal-Bexqace6.js +1 -0
  85. package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
  86. package/dist/ui/assets/css-DSQhw_9R.js +1 -0
  87. package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
  88. package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
  89. package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
  90. package/dist/ui/assets/d-qD-0Kul2.js +1 -0
  91. package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  92. package/dist/ui/assets/dart-DkHntEIa.js +1 -0
  93. package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
  94. package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
  95. package/dist/ui/assets/diff-woXpYk--.js +1 -0
  96. package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
  97. package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
  98. package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  99. package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  100. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
  101. package/dist/ui/assets/edge-Z8YYkHOr.js +1 -0
  102. package/dist/ui/assets/elixir-CG9uKtAF.js +1 -0
  103. package/dist/ui/assets/elm-GfWG2IfT.js +1 -0
  104. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
  105. package/dist/ui/assets/erb-xe89e73J.js +1 -0
  106. package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
  107. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  108. package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  109. package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
  110. package/dist/ui/assets/fish-BJitypiv.js +1 -0
  111. package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
  112. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  113. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
  114. package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
  115. package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
  116. package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
  117. package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
  118. package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
  119. package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
  120. package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
  121. package/dist/ui/assets/git-rebase-CoTL_uSE.js +1 -0
  122. package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  123. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  124. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  125. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  126. package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  127. package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  128. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  129. package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
  130. package/dist/ui/assets/glimmer-js-DAn4UCSu.js +1 -0
  131. package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +1 -0
  132. package/dist/ui/assets/glsl-CtTDZoqR.js +1 -0
  133. package/dist/ui/assets/gn-ilITqXS6.js +1 -0
  134. package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
  135. package/dist/ui/assets/go-BJwz_mda.js +1 -0
  136. package/dist/ui/assets/graphql-D5gcC_Jk.js +1 -0
  137. package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
  138. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  139. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  140. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  141. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  142. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  143. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  144. package/dist/ui/assets/hack-BJXY27dt.js +1 -0
  145. package/dist/ui/assets/haml-BLfFoZf7.js +1 -0
  146. package/dist/ui/assets/handlebars-Dw6CWkvN.js +1 -0
  147. package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
  148. package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
  149. package/dist/ui/assets/hcl-Dh228itO.js +1 -0
  150. package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +4 -0
  151. package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
  152. package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
  153. package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  154. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
  155. package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  156. package/dist/ui/assets/html-CAcAWvoN.js +1 -0
  157. package/dist/ui/assets/html-derivative-8aSW2E_7.js +1 -0
  158. package/dist/ui/assets/http-B2YR_3V1.js +1 -0
  159. package/dist/ui/assets/hurl-BnDJ9Zhf.js +1 -0
  160. package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
  161. package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
  162. package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
  163. package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
  164. package/dist/ui/assets/java-Doxi4W8u.js +1 -0
  165. package/dist/ui/assets/javascript-BbRdEqti.js +1 -0
  166. package/dist/ui/assets/jinja-CS3Tpv_Q.js +1 -0
  167. package/dist/ui/assets/jison-BkPGYVHR.js +1 -0
  168. package/dist/ui/assets/json-BMt1m3m8.js +1 -0
  169. package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
  170. package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
  171. package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
  172. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
  173. package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
  174. package/dist/ui/assets/jsx-CQKrJXXY.js +1 -0
  175. package/dist/ui/assets/julia-BuN7i2du.js +1 -0
  176. package/dist/ui/assets/just-BswEPFPu.js +1 -0
  177. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  178. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  179. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  180. package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
  181. package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
  182. package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
  183. package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  184. package/dist/ui/assets/latex-DU2VyFfA.js +1 -0
  185. package/dist/ui/assets/lean-CewbzKMR.js +1 -0
  186. package/dist/ui/assets/less-DVTAwKKz.js +1 -0
  187. package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  188. package/dist/ui/assets/liquid-Cmz1L3dq.js +1 -0
  189. package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
  190. package/dist/ui/assets/log-BNLmms1o.js +1 -0
  191. package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
  192. package/dist/ui/assets/lua-CfVXhkaJ.js +1 -0
  193. package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
  194. package/dist/ui/assets/make-Dixweg8N.js +1 -0
  195. package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
  196. package/dist/ui/assets/marko-C5bfqGiA.js +1 -0
  197. package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  198. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  199. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  200. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  201. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  202. package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
  203. package/dist/ui/assets/mdc-CVBXYfyq.js +1 -0
  204. package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
  205. package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
  206. package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  207. package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  208. package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
  209. package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
  210. package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
  211. package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
  212. package/dist/ui/assets/move-B1IS1UjX.js +1 -0
  213. package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
  214. package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
  215. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  216. package/dist/ui/assets/nginx-CzJafxLa.js +1 -0
  217. package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  218. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  219. package/dist/ui/assets/nim-DABKtHtM.js +1 -0
  220. package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
  221. package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  222. package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
  223. package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
  224. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
  225. package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
  226. package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
  227. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  228. package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  229. package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
  230. package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
  231. package/dist/ui/assets/perl-CBh7L3lZ.js +1 -0
  232. package/dist/ui/assets/php-DFbI9q5p.js +1 -0
  233. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
  234. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  235. package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
  236. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
  237. package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
  238. package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  239. package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
  240. package/dist/ui/assets/po-BiJDBrnU.js +1 -0
  241. package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  242. package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
  243. package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
  244. package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
  245. package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
  246. package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
  247. package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
  248. package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
  249. package/dist/ui/assets/pug-C_PxC7gO.js +1 -0
  250. package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
  251. package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
  252. package/dist/ui/assets/python-gzcpVVnB.js +1 -0
  253. package/dist/ui/assets/qml-DtngoFFK.js +1 -0
  254. package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
  255. package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
  256. package/dist/ui/assets/r-DohkcevW.js +1 -0
  257. package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
  258. package/dist/ui/assets/raku-B3gFvitq.js +1 -0
  259. package/dist/ui/assets/razor-C4t8J0_E.js +1 -0
  260. package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
  261. package/dist/ui/assets/reg-CRGYupPL.js +1 -0
  262. package/dist/ui/assets/regexp-OGbTbjgY.js +1 -0
  263. package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
  264. package/dist/ui/assets/review-payload-C5Qz60Kq.js +1 -0
  265. package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
  266. package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
  267. package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
  268. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  269. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
  270. package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
  271. package/dist/ui/assets/rst-CfBbbcvC.js +1 -0
  272. package/dist/ui/assets/ruby-Bw0mpxHY.js +1 -0
  273. package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
  274. package/dist/ui/assets/sas-Cs3s9JOf.js +1 -0
  275. package/dist/ui/assets/sass-DXrisJhu.js +1 -0
  276. package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
  277. package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
  278. package/dist/ui/assets/scss-sRxNJS54.js +1 -0
  279. package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
  280. package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
  281. package/dist/ui/assets/shellscript-B0X6wh0R.js +1 -0
  282. package/dist/ui/assets/shellsession-D2FdOioR.js +1 -0
  283. package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  284. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  285. package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
  286. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  287. package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
  288. package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
  289. package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
  290. package/dist/ui/assets/soy-s6g9OjJ1.js +1 -0
  291. package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
  292. package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
  293. package/dist/ui/assets/sql-DVTnh5V-.js +1 -0
  294. package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
  295. package/dist/ui/assets/stata-DFIDiXF9.js +1 -0
  296. package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
  297. package/dist/ui/assets/surrealql-DVfrsLyg.js +1 -0
  298. package/dist/ui/assets/svelte-D5GsxESq.js +1 -0
  299. package/dist/ui/assets/swift-DonLKvLd.js +1 -0
  300. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  301. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
  302. package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
  303. package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
  304. package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
  305. package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
  306. package/dist/ui/assets/templ-DI-Zyqzd.js +1 -0
  307. package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
  308. package/dist/ui/assets/tex-WHHmlbJI.js +1 -0
  309. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  310. package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
  311. package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +1 -0
  312. package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
  313. package/dist/ui/assets/tsx-ph_idaAW.js +1 -0
  314. package/dist/ui/assets/turtle-ByJddavk.js +1 -0
  315. package/dist/ui/assets/twig-YO17jFjR.js +1 -0
  316. package/dist/ui/assets/typescript-CbAxjhkl.js +1 -0
  317. package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
  318. package/dist/ui/assets/typst-DI99ib-x.js +1 -0
  319. package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +244 -0
  320. package/dist/ui/assets/v-DETTlOr0.js +1 -0
  321. package/dist/ui/assets/vala-zf12oZj6.js +1 -0
  322. package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
  323. package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
  324. package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
  325. package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
  326. package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
  327. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  328. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  329. package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  330. package/dist/ui/assets/vue-CraHL-Ps.js +1 -0
  331. package/dist/ui/assets/vue-html-e9tyZNtS.js +1 -0
  332. package/dist/ui/assets/vue-vine-CofmxaUb.js +1 -0
  333. package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
  334. package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
  335. package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
  336. package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
  337. package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
  338. package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
  339. package/dist/ui/assets/wit-DdvCle-K.js +1 -0
  340. package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
  341. package/dist/ui/assets/workspace-app-8--oTbCd.css +1 -0
  342. package/dist/ui/assets/workspace-app-C5QsE314.js +118 -0
  343. package/dist/ui/assets/xml-BWSdPZHm.js +1 -0
  344. package/dist/ui/assets/xsl-BtCt7Hx8.js +1 -0
  345. package/dist/ui/assets/yaml-BZiTw7cQ.js +1 -0
  346. package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
  347. package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
  348. package/dist/ui/workspace-app.html +15 -0
  349. package/dist/user-config.js +57 -0
  350. package/dist/view-image.js +104 -0
  351. package/dist/web-tools.js +200 -0
  352. package/dist/window-capture.js +74 -0
  353. package/dist/workspace-store.js +125 -0
  354. package/dist/workspaces.js +226 -0
  355. package/docs/DEVELOPMENT_TOOLS.md +95 -0
  356. package/docs/assets/auvrynt-logo-light.png +0 -0
  357. package/docs/assets/auvrynt-screenshot.png +0 -0
  358. package/docs/chatgpt-coding-workflow.md +143 -0
  359. package/docs/configuration.md +132 -0
  360. package/docs/gotchas.md +215 -0
  361. package/docs/security.md +100 -0
  362. package/docs/setup.md +132 -0
  363. package/package.json +70 -0
  364. package/scripts/dev-server.mjs +120 -0
package/dist/cli.js ADDED
@@ -0,0 +1,370 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import { resolve } from "node:path";
5
+ import * as prompts from "@clack/prompts";
6
+ import { getShellConfig } from "@earendil-works/pi-coding-agent";
7
+ import { satisfies } from "semver";
8
+ import { loadConfig } from "./config.js";
9
+ import { generateOwnerToken, loadAuvryntFiles, writeAuvryntAuth, writeAuvryntConfig, } from "./user-config.js";
10
+ import { expandHomePath } from "./roots.js";
11
+ const require = createRequire(import.meta.url);
12
+ const SUPPORTED_NODE_RANGE = ">=20.12 <27";
13
+ async function main(argv) {
14
+ assertSupportedNode();
15
+ const [rawCommand, ...args] = argv;
16
+ const command = normalizeCommand(rawCommand);
17
+ switch (command) {
18
+ case "serve":
19
+ await ensureConfigured();
20
+ if (rawCommand === "start") {
21
+ process.env.AUVRYNT_START_MODE = "true";
22
+ }
23
+ await serve();
24
+ return;
25
+ case "init":
26
+ await runInit({ force: args.includes("--force") });
27
+ return;
28
+ case "doctor":
29
+ await runDoctor();
30
+ return;
31
+ case "config":
32
+ runConfigCommand(args);
33
+ return;
34
+ case "help":
35
+ printHelp();
36
+ return;
37
+ }
38
+ }
39
+ function normalizeCommand(command) {
40
+ if (!command || command === "serve" || command === "start")
41
+ return "serve";
42
+ if (command === "init" || command === "doctor" || command === "config")
43
+ return command;
44
+ if (command === "help" || command === "--help" || command === "-h")
45
+ return "help";
46
+ throw new Error(`Unknown command: ${command}`);
47
+ }
48
+ async function ensureConfigured() {
49
+ const files = loadAuvryntFiles();
50
+ if (files.configExists && files.authExists)
51
+ return;
52
+ if (process.env.AUVRYNT_OAUTH_OWNER_TOKEN)
53
+ return;
54
+ if (!input.isTTY || !output.isTTY) {
55
+ throw new Error([
56
+ "Auvrynt is not configured and this terminal is non-interactive.",
57
+ "",
58
+ "Run:",
59
+ " auvrynt init",
60
+ "",
61
+ "Or provide AUVRYNT_OAUTH_OWNER_TOKEN and AUVRYNT_ALLOWED_ROOTS.",
62
+ ].join("\n"));
63
+ }
64
+ await runInit({ force: false });
65
+ }
66
+ async function runInit({ force }) {
67
+ const files = loadAuvryntFiles();
68
+ if (!force && files.configExists && files.authExists) {
69
+ prompts.log.info(`Auvrynt is already configured at ${files.dir}`);
70
+ prompts.log.info("Run `auvrynt init --force` to update it.");
71
+ return;
72
+ }
73
+ try {
74
+ prompts.intro("Auvrynt setup");
75
+ const defaultRoots = files.config.allowedRoots?.join(", ") || process.cwd();
76
+ const rootsAnswer = await textPrompt({
77
+ message: `Where are your projects located? Press Enter to use ${defaultRoots}`,
78
+ placeholder: defaultRoots,
79
+ defaultValue: defaultRoots,
80
+ validate: (value) => value?.trim() ? undefined : "Enter at least one project root.",
81
+ });
82
+ const allowedRoots = rootsAnswer
83
+ .split(",")
84
+ .map((root) => resolve(expandHomePath(root.trim())))
85
+ .filter(Boolean);
86
+ const defaultPort = String(files.config.port ?? 49321);
87
+ const portAnswer = await textPrompt({
88
+ message: `Which local port should Auvrynt use? Press Enter to use ${defaultPort}`,
89
+ placeholder: defaultPort,
90
+ defaultValue: defaultPort,
91
+ validate: validatePort,
92
+ });
93
+ const port = Number(portAnswer);
94
+ prompts.note([
95
+ "Auvrynt needs a public base URL so ChatGPT or Claude can reach this MCP server.",
96
+ "Create a tunnel or reverse proxy with Cloudflare Tunnel, ngrok, Pinggy, Tailscale Funnel, or your own HTTPS proxy.",
97
+ "Paste the public origin here, without /mcp.",
98
+ "",
99
+ "Example: https://your-tunnel-host.example.com",
100
+ ].join("\n"), "Public URL required");
101
+ const publicBaseUrl = normalizePublicBaseUrl(await textPrompt({
102
+ message: files.config.publicBaseUrl
103
+ ? `What is the public base URL? Press Enter to keep ${files.config.publicBaseUrl}`
104
+ : "What is the public base URL?",
105
+ placeholder: files.config.publicBaseUrl ?? "https://your-tunnel-host.example.com",
106
+ defaultValue: files.config.publicBaseUrl ?? "",
107
+ validate: validateRequiredPublicBaseUrl,
108
+ }));
109
+ const config = {
110
+ host: files.config.host ?? "127.0.0.1",
111
+ port,
112
+ allowedRoots,
113
+ publicBaseUrl,
114
+ };
115
+ const auth = {
116
+ ownerToken: files.auth.ownerToken ?? generateOwnerToken(),
117
+ };
118
+ const configPath = writeAuvryntConfig(config);
119
+ const authPath = writeAuvryntAuth(auth);
120
+ const lines = [
121
+ `Config: ${configPath}`,
122
+ `Auth: ${authPath}`,
123
+ `Local MCP URL: http://${config.host}:${config.port}/mcp`,
124
+ ...(publicBaseUrl ? [`Public MCP URL: ${publicBaseUrl}/mcp`] : []),
125
+ ];
126
+ prompts.note(lines.join("\n"), "Auvrynt configured");
127
+ prompts.note([
128
+ `Owner password: ${auth.ownerToken}`,
129
+ "Use this when ChatGPT or Claude asks you to approve Auvrynt access.",
130
+ `Stored at: ${authPath}`,
131
+ ].join("\n"), "Owner password");
132
+ prompts.outro("Run `auvrynt serve` to start the MCP server.");
133
+ }
134
+ catch (error) {
135
+ if (error instanceof SetupCancelledError) {
136
+ prompts.cancel("Setup cancelled");
137
+ return;
138
+ }
139
+ throw error;
140
+ }
141
+ }
142
+ async function serve() {
143
+ const sqliteStatus = checkSqliteNative();
144
+ if (sqliteStatus !== "ok") {
145
+ throw new Error([
146
+ "better-sqlite3 could not load for this Node runtime.",
147
+ sqliteStatus,
148
+ "",
149
+ "Try reinstalling or rebuilding dependencies under the active Node version:",
150
+ " npm rebuild better-sqlite3",
151
+ ].join("\n"));
152
+ }
153
+ const { createServer } = await import("./server.js");
154
+ const config = loadConfig();
155
+ const { app } = createServer(config);
156
+ const startMode = process.env.AUVRYNT_START_MODE === "true";
157
+ const files = loadAuvryntFiles();
158
+ const ownerToken = files.auth.ownerToken || "not_configured";
159
+ const publicMcpUrl = config.publicBaseUrl
160
+ ? `${config.publicBaseUrl.replace(/\/$/, "")}/mcp`
161
+ : `http://${config.host}:${config.port}/mcp`;
162
+ const httpServer = app.listen(config.port, config.host, () => {
163
+ if (startMode) {
164
+ console.clear();
165
+ console.log("Auvrynt is running!");
166
+ console.log("");
167
+ console.log(` Public URL: \x1b[36m${publicMcpUrl}\x1b[0m`);
168
+ console.log(` Owner Password: \x1b[33m${ownerToken}\x1b[0m`);
169
+ console.log("");
170
+ console.log(" # CTRL + C to stop");
171
+ console.log("");
172
+ const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
173
+ let frameIndex = 0;
174
+ let mcpEventsCount = 0;
175
+ let lastEvent = "Started successfully";
176
+ global.auvryntLogEmitter = (level, event) => {
177
+ mcpEventsCount++;
178
+ lastEvent = `${event} (${level})`;
179
+ };
180
+ const interval = setInterval(() => {
181
+ const frame = frames[frameIndex];
182
+ frameIndex = (frameIndex + 1) % frames.length;
183
+ process.stdout.write(`\r\x1b[K \x1b[32m${frame}\x1b[0m Logs active... (${mcpEventsCount} requests handled | Last: ${lastEvent})`);
184
+ }, 100);
185
+ global.auvryntStartInterval = interval;
186
+ }
187
+ else {
188
+ console.log(`auvrynt listening on http://${config.host}:${config.port}/mcp`);
189
+ console.log(`public base url: ${config.publicBaseUrl}`);
190
+ console.log(`allowed roots: ${config.allowedRoots.join(", ")}`);
191
+ console.log(`allowed hosts: ${config.allowedHosts.join(", ")}`);
192
+ if (config.allowedHosts.includes("*")) {
193
+ console.warn("warning: Host header allowlist is disabled because AUVRYNT_ALLOWED_HOSTS=*");
194
+ }
195
+ console.log("auth: Owner password approval required");
196
+ console.log(`logging: ${config.logging.level} ${config.logging.format}`);
197
+ }
198
+ });
199
+ const shutdown = () => {
200
+ if (global.auvryntStartInterval) {
201
+ clearInterval(global.auvryntStartInterval);
202
+ }
203
+ httpServer.close(() => process.exit(0));
204
+ };
205
+ process.once("SIGINT", shutdown);
206
+ process.once("SIGTERM", shutdown);
207
+ }
208
+ async function runDoctor() {
209
+ const files = loadAuvryntFiles();
210
+ console.log(`Config dir: ${files.dir}`);
211
+ console.log(`Config file: ${files.configExists ? files.configPath : "missing"}`);
212
+ console.log(`Auth file: ${files.authExists ? files.authPath : "missing"}`);
213
+ console.log(`Node: ${process.version} (${nodeVersionStatus()})`);
214
+ console.log(`Node ABI: ${process.versions.modules}`);
215
+ console.log(`Platform: ${process.platform} ${process.arch}`);
216
+ console.log(`Git: ${checkGitAvailable()}`);
217
+ console.log(`Bash shell: ${checkBashShell()}`);
218
+ console.log(`SQLite native dependency: ${checkSqliteNative()}`);
219
+ try {
220
+ const config = loadConfig();
221
+ console.log(`Local MCP URL: http://${config.host}:${config.port}/mcp`);
222
+ console.log(`Public MCP URL: ${new URL("/mcp", config.publicBaseUrl).toString()}`);
223
+ console.log(`Allowed roots: ${config.allowedRoots.join(", ")}`);
224
+ console.log(`Allowed hosts: ${config.allowedHosts.join(", ")}`);
225
+ }
226
+ catch (error) {
227
+ console.log(`Config status: ${error instanceof Error ? error.message : String(error)}`);
228
+ }
229
+ }
230
+ function runConfigCommand(args) {
231
+ const [subcommand, key, ...rest] = args;
232
+ const files = loadAuvryntFiles();
233
+ if (!subcommand || subcommand === "get") {
234
+ console.log(JSON.stringify(files.config, null, 2));
235
+ return;
236
+ }
237
+ if (subcommand !== "set") {
238
+ throw new Error(`Unknown config command: ${subcommand}`);
239
+ }
240
+ if (key !== "publicBaseUrl") {
241
+ throw new Error("Only `auvrynt config set publicBaseUrl <url|null>` is supported right now.");
242
+ }
243
+ const value = rest.join(" ").trim();
244
+ if (!value) {
245
+ throw new Error("Missing publicBaseUrl value.");
246
+ }
247
+ writeAuvryntConfig({
248
+ ...files.config,
249
+ publicBaseUrl: normalizeOptionalPublicBaseUrl(value),
250
+ });
251
+ console.log(`Updated ${files.configPath}`);
252
+ }
253
+ function printHelp() {
254
+ console.log([
255
+ "Auvrynt",
256
+ "",
257
+ "Usage:",
258
+ " auvrynt Run first-time setup if needed, then start the server",
259
+ " auvrynt start Start the server with an animated logs indicator (clean UI)",
260
+ " auvrynt serve Start the server with verbose console logs",
261
+ " auvrynt init Create or update ~/.auvrynt/config.json and auth.json",
262
+ " auvrynt doctor Show config, runtime, and native dependency status",
263
+ " auvrynt config get Print persisted config",
264
+ " auvrynt config set publicBaseUrl <url|null>",
265
+ "",
266
+ "For temporary tunnels:",
267
+ " AUVRYNT_PUBLIC_BASE_URL=https://example.trycloudflare.com auvrynt serve",
268
+ ].join("\n"));
269
+ }
270
+ function normalizeOptionalPublicBaseUrl(value) {
271
+ const trimmed = value.trim();
272
+ if (!trimmed || trimmed === "null" || trimmed === "none")
273
+ return null;
274
+ return normalizePublicBaseUrl(trimmed);
275
+ }
276
+ function normalizePublicBaseUrl(value) {
277
+ const trimmed = value.trim();
278
+ const parsed = new URL(trimmed);
279
+ parsed.hash = "";
280
+ parsed.search = "";
281
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
282
+ return parsed.toString().replace(/\/$/, "");
283
+ }
284
+ async function textPrompt(options) {
285
+ const result = await prompts.text({
286
+ ...options,
287
+ validate: (value) => options.validate?.(value?.trim() ? value : options.defaultValue),
288
+ });
289
+ if (prompts.isCancel(result))
290
+ throw new SetupCancelledError();
291
+ const value = String(result).trim();
292
+ return value || options.defaultValue;
293
+ }
294
+ function validatePort(value) {
295
+ const port = Number(value);
296
+ return Number.isInteger(port) && port >= 1 && port <= 65535
297
+ ? undefined
298
+ : "Enter a port between 1 and 65535.";
299
+ }
300
+ function validateRequiredPublicBaseUrl(value) {
301
+ const trimmed = value?.trim() ?? "";
302
+ if (!trimmed)
303
+ return "Enter the public URL from your tunnel or reverse proxy.";
304
+ if (trimmed.endsWith("/mcp"))
305
+ return "Enter the base URL only, without /mcp.";
306
+ return validatePublicBaseUrl(trimmed);
307
+ }
308
+ function validatePublicBaseUrl(value) {
309
+ try {
310
+ const parsed = new URL(value);
311
+ return parsed.protocol === "http:" || parsed.protocol === "https:"
312
+ ? undefined
313
+ : "Use an http or https URL.";
314
+ }
315
+ catch {
316
+ return "Enter a valid URL, for example https://your-tunnel-host.example.com.";
317
+ }
318
+ }
319
+ function assertSupportedNode() {
320
+ if (satisfies(process.versions.node, SUPPORTED_NODE_RANGE))
321
+ return;
322
+ throw new Error([
323
+ `Auvrynt requires Node ${SUPPORTED_NODE_RANGE}.`,
324
+ `Current Node: ${process.version}`,
325
+ "",
326
+ "Install Node 22 LTS or use a version manager such as nvm, fnm, or mise.",
327
+ ].join("\n"));
328
+ }
329
+ function nodeVersionStatus() {
330
+ return satisfies(process.versions.node, SUPPORTED_NODE_RANGE)
331
+ ? `supported ${SUPPORTED_NODE_RANGE}`
332
+ : `unsupported, requires ${SUPPORTED_NODE_RANGE}`;
333
+ }
334
+ class SetupCancelledError extends Error {
335
+ }
336
+ function checkSqliteNative() {
337
+ try {
338
+ const Database = require("better-sqlite3");
339
+ const db = new Database(":memory:");
340
+ db.close();
341
+ return "ok";
342
+ }
343
+ catch (error) {
344
+ return error instanceof Error ? error.message : String(error);
345
+ }
346
+ }
347
+ function checkGitAvailable() {
348
+ try {
349
+ const { execFileSync } = require("node:child_process");
350
+ return execFileSync("git", ["--version"], { encoding: "utf8" }).trim();
351
+ }
352
+ catch (error) {
353
+ const message = error instanceof Error ? error.message : String(error);
354
+ return `unavailable (${message})`;
355
+ }
356
+ }
357
+ function checkBashShell() {
358
+ try {
359
+ const { shell, args } = getShellConfig();
360
+ return `${shell} ${args.join(" ")}`;
361
+ }
362
+ catch (error) {
363
+ const message = error instanceof Error ? error.message : String(error);
364
+ return `unavailable (${message})`;
365
+ }
366
+ }
367
+ main(process.argv.slice(2)).catch((error) => {
368
+ console.error(error instanceof Error ? error.message : String(error));
369
+ process.exitCode = 1;
370
+ });
package/dist/config.js ADDED
@@ -0,0 +1,211 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { expandHomePath } from "./roots.js";
4
+ import { loadAuvryntFiles } from "./user-config.js";
5
+ const DEFAULT_OAUTH_ACCESS_TOKEN_TTL_SECONDS = 60 * 60;
6
+ const DEFAULT_OAUTH_REFRESH_TOKEN_TTL_SECONDS = 30 * 24 * 60 * 60;
7
+ function parsePort(value) {
8
+ if (value === undefined || value === "")
9
+ return 49321;
10
+ const port = Number(value);
11
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
12
+ throw new Error(`Invalid PORT: ${value}`);
13
+ }
14
+ return port;
15
+ }
16
+ function parseAllowedRoots(value) {
17
+ if (Array.isArray(value)) {
18
+ const roots = value.map((entry) => entry.trim()).filter(Boolean);
19
+ return (roots.length > 0 ? roots : [process.cwd()]).map((root) => resolve(expandHomePath(root)));
20
+ }
21
+ const rawRoots = value
22
+ ?.split(",")
23
+ .map((entry) => entry.trim())
24
+ .filter(Boolean) ?? [];
25
+ const roots = rawRoots.length > 0 ? rawRoots : [process.cwd()];
26
+ return roots.map((root) => resolve(expandHomePath(root)));
27
+ }
28
+ function parseAllowedHosts(value, derivedHosts) {
29
+ if (Array.isArray(value)) {
30
+ return normalizeAllowedHosts(value, derivedHosts);
31
+ }
32
+ const rawHosts = value
33
+ ?.split(",")
34
+ .map((entry) => entry.trim())
35
+ .filter(Boolean) ?? [];
36
+ return normalizeAllowedHosts(rawHosts, derivedHosts);
37
+ }
38
+ function normalizeAllowedHosts(rawHosts, derivedHosts) {
39
+ const hosts = rawHosts.length > 0 ? rawHosts : derivedHosts;
40
+ if (hosts.includes("*"))
41
+ return ["*"];
42
+ return Array.from(new Set(hosts.map((host) => host.trim()).filter(Boolean)));
43
+ }
44
+ function parseBoolean(value) {
45
+ return ["1", "true", "yes", "on"].includes(value?.toLowerCase() ?? "");
46
+ }
47
+ function parseMinimalTools(env) {
48
+ if (env.AUVRYNT_TOOL_MODE === "minimal")
49
+ return true;
50
+ if (env.AUVRYNT_TOOL_MODE === "full")
51
+ return false;
52
+ if (env.AUVRYNT_TOOL_MODE) {
53
+ throw new Error(`Invalid AUVRYNT_TOOL_MODE: ${env.AUVRYNT_TOOL_MODE}`);
54
+ }
55
+ if (env.AUVRYNT_MINIMAL_TOOLS !== undefined)
56
+ return parseBoolean(env.AUVRYNT_MINIMAL_TOOLS);
57
+ return true;
58
+ }
59
+ function parseLogLevel(value) {
60
+ if (!value || value === "info")
61
+ return "info";
62
+ if (["silent", "error", "warn", "debug"].includes(value))
63
+ return value;
64
+ throw new Error(`Invalid AUVRYNT_LOG_LEVEL: ${value}`);
65
+ }
66
+ function parseLogFormat(value) {
67
+ if (!value || value === "json")
68
+ return "json";
69
+ if (value === "pretty")
70
+ return "pretty";
71
+ throw new Error(`Invalid AUVRYNT_LOG_FORMAT: ${value}`);
72
+ }
73
+ function parsePathList(value) {
74
+ return (value
75
+ ?.split(",")
76
+ .map((entry) => entry.trim())
77
+ .filter(Boolean)
78
+ .map((entry) => resolve(expandHomePath(entry))) ?? []);
79
+ }
80
+ function parseStringList(value, fallback) {
81
+ const entries = value
82
+ ?.split(",")
83
+ .map((entry) => entry.trim())
84
+ .filter(Boolean);
85
+ return entries && entries.length > 0 ? entries : fallback;
86
+ }
87
+ function parsePositiveInteger(value, fallback, name) {
88
+ if (!value)
89
+ return fallback;
90
+ const parsed = Number(value);
91
+ if (!Number.isInteger(parsed) || parsed < 1) {
92
+ throw new Error(`Invalid ${name}: ${value}`);
93
+ }
94
+ return parsed;
95
+ }
96
+ function parseToolNaming(value) {
97
+ if (!value || value === "short")
98
+ return "short";
99
+ if (value === "legacy")
100
+ return "legacy";
101
+ throw new Error(`Invalid AUVRYNT_TOOL_NAMING: ${value}`);
102
+ }
103
+ function parseLoggingConfig(env) {
104
+ return {
105
+ level: parseLogLevel(env.AUVRYNT_LOG_LEVEL),
106
+ format: parseLogFormat(env.AUVRYNT_LOG_FORMAT),
107
+ requests: env.AUVRYNT_LOG_REQUESTS === undefined ? true : parseBoolean(env.AUVRYNT_LOG_REQUESTS),
108
+ assets: parseBoolean(env.AUVRYNT_LOG_ASSETS),
109
+ toolCalls: env.AUVRYNT_LOG_TOOL_CALLS === undefined ? true : parseBoolean(env.AUVRYNT_LOG_TOOL_CALLS),
110
+ shellCommands: parseBoolean(env.AUVRYNT_LOG_SHELL_COMMANDS),
111
+ trustProxy: parseBoolean(env.AUVRYNT_TRUST_PROXY),
112
+ };
113
+ }
114
+ function parseWidgetMode(value) {
115
+ if (!value || value === "full")
116
+ return "full";
117
+ if (value === "off" || value === "changes")
118
+ return value;
119
+ throw new Error(`Invalid AUVRYNT_WIDGETS: ${value}`);
120
+ }
121
+ function parseRequiredSecret(value, name) {
122
+ const secret = value?.trim();
123
+ if (!secret) {
124
+ throw new Error(`${name} is required for Auvrynt OAuth. Run: auvrynt init`);
125
+ }
126
+ if (secret.length < 16) {
127
+ throw new Error(`${name} must be at least 16 characters long.`);
128
+ }
129
+ return secret;
130
+ }
131
+ function parseOAuthConfig(env, ownerToken) {
132
+ return {
133
+ ownerToken: parseRequiredSecret(env.AUVRYNT_OAUTH_OWNER_TOKEN ?? ownerToken, "AUVRYNT_OAUTH_OWNER_TOKEN"),
134
+ accessTokenTtlSeconds: parsePositiveInteger(env.AUVRYNT_OAUTH_ACCESS_TOKEN_TTL_SECONDS, DEFAULT_OAUTH_ACCESS_TOKEN_TTL_SECONDS, "AUVRYNT_OAUTH_ACCESS_TOKEN_TTL_SECONDS"),
135
+ refreshTokenTtlSeconds: parsePositiveInteger(env.AUVRYNT_OAUTH_REFRESH_TOKEN_TTL_SECONDS, DEFAULT_OAUTH_REFRESH_TOKEN_TTL_SECONDS, "AUVRYNT_OAUTH_REFRESH_TOKEN_TTL_SECONDS"),
136
+ scopes: parseStringList(env.AUVRYNT_OAUTH_SCOPES, ["auvrynt"]),
137
+ allowedRedirectHosts: parseStringList(env.AUVRYNT_OAUTH_ALLOWED_REDIRECT_HOSTS, [
138
+ "chatgpt.com",
139
+ "localhost",
140
+ "127.0.0.1",
141
+ ]),
142
+ };
143
+ }
144
+ function defaultStateDir() {
145
+ return join(homedir(), ".local", "share", "auvrynt");
146
+ }
147
+ function defaultWorktreeRoot() {
148
+ return join(homedir(), ".auvrynt", "worktrees");
149
+ }
150
+ function defaultAgentDir() {
151
+ return join(homedir(), ".codex");
152
+ }
153
+ function parseSerenaConfig(env, filesConfig) {
154
+ const filesSerena = filesConfig.serena ?? {};
155
+ return {
156
+ enabled: parseBoolean(env.AUVRYNT_SERENA_ENABLED ?? filesSerena.enabled),
157
+ executable: env.AUVRYNT_SERENA_EXECUTABLE ?? filesSerena.executable ?? "serena",
158
+ backend: (env.AUVRYNT_SERENA_BACKEND ?? filesSerena.backend ?? "LSP"),
159
+ context: env.AUVRYNT_SERENA_CONTEXT ?? filesSerena.context ?? "desktop-app",
160
+ startupTimeoutMs: parsePositiveInteger(env.AUVRYNT_SERENA_STARTUP_TIMEOUT ?? filesSerena.startupTimeoutMs, 30_000, "AUVRYNT_SERENA_STARTUP_TIMEOUT"),
161
+ requestTimeoutMs: parsePositiveInteger(env.AUVRYNT_SERENA_REQUEST_TIMEOUT ?? filesSerena.requestTimeoutMs, 60_000, "AUVRYNT_SERENA_REQUEST_TIMEOUT"),
162
+ idleTimeoutMinutes: parsePositiveInteger(env.AUVRYNT_SERENA_IDLE_TIMEOUT ?? filesSerena.idleTimeoutMinutes, 30, "AUVRYNT_SERENA_IDLE_TIMEOUT"),
163
+ maxInstances: parsePositiveInteger(env.AUVRYNT_SERENA_MAX_INSTANCES ?? filesSerena.maxInstances, 3, "AUVRYNT_SERENA_MAX_INSTANCES"),
164
+ };
165
+ }
166
+ export function loadConfig(env = process.env) {
167
+ const files = loadAuvryntFiles(env);
168
+ const host = env.HOST ?? files.config.host ?? "127.0.0.1";
169
+ const port = parsePort(env.PORT ?? files.config.port);
170
+ const publicBaseUrl = parsePublicBaseUrl(env.AUVRYNT_PUBLIC_BASE_URL ?? files.config.publicBaseUrl ?? localPublicBaseUrl(host, port));
171
+ const derivedAllowedHosts = [
172
+ "localhost",
173
+ "127.0.0.1",
174
+ "::1",
175
+ host,
176
+ new URL(publicBaseUrl).hostname,
177
+ ...(files.config.allowedHosts ?? []),
178
+ ];
179
+ return {
180
+ host,
181
+ port,
182
+ oauth: parseOAuthConfig(env, files.auth.ownerToken),
183
+ allowedRoots: parseAllowedRoots(env.AUVRYNT_ALLOWED_ROOTS ?? files.config.allowedRoots),
184
+ allowedHosts: parseAllowedHosts(env.AUVRYNT_ALLOWED_HOSTS, derivedAllowedHosts),
185
+ publicBaseUrl,
186
+ minimalTools: parseMinimalTools(env),
187
+ toolNaming: parseToolNaming(env.AUVRYNT_TOOL_NAMING),
188
+ widgets: parseWidgetMode(env.AUVRYNT_WIDGETS),
189
+ stateDir: resolve(expandHomePath(env.AUVRYNT_STATE_DIR ?? files.config.stateDir ?? defaultStateDir())),
190
+ worktreeRoot: resolve(expandHomePath(env.AUVRYNT_WORKTREE_ROOT ?? files.config.worktreeRoot ?? defaultWorktreeRoot())),
191
+ skillsEnabled: env.AUVRYNT_SKILLS === undefined ? true : parseBoolean(env.AUVRYNT_SKILLS),
192
+ skillPaths: parsePathList(env.AUVRYNT_SKILL_PATHS),
193
+ agentDir: resolve(expandHomePath(env.AUVRYNT_AGENT_DIR ?? files.config.agentDir ?? defaultAgentDir())),
194
+ logging: parseLoggingConfig(env),
195
+ serena: parseSerenaConfig(env, files.config),
196
+ };
197
+ }
198
+ function parsePublicBaseUrl(value) {
199
+ const parsed = new URL(value);
200
+ parsed.hash = "";
201
+ parsed.search = "";
202
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
203
+ return parsed.toString().replace(/\/$/, "");
204
+ }
205
+ function localPublicBaseUrl(host, port) {
206
+ const publicHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
207
+ const formattedHost = publicHost.includes(":") && !publicHost.startsWith("[")
208
+ ? `[${publicHost}]`
209
+ : publicHost;
210
+ return `http://${formattedHost}:${port}`;
211
+ }
@@ -0,0 +1,91 @@
1
+ import { createRequire } from "node:module";
2
+ import { getBlenderClient } from "./blender-client.js";
3
+ import { godotEditorStatus } from "./godot-editor-bridge.js";
4
+ const require = createRequire(import.meta.url);
5
+ function checkedAt() {
6
+ return new Date().toISOString();
7
+ }
8
+ function browserStatus() {
9
+ const timestamp = checkedAt();
10
+ for (const packageName of ["playwright", "playwright-core"]) {
11
+ try {
12
+ require.resolve(packageName);
13
+ return {
14
+ state: "available",
15
+ provider: "Playwright",
16
+ detail: "Browser support is installed and will connect on demand per request.",
17
+ checkedAt: timestamp,
18
+ };
19
+ }
20
+ catch { }
21
+ }
22
+ return {
23
+ state: "unavailable",
24
+ provider: "Playwright",
25
+ detail: "Install Playwright to enable browser inspection and screenshots.",
26
+ checkedAt: timestamp,
27
+ };
28
+ }
29
+ export async function getConnectionStatus(registry, processManager, workspaceId) {
30
+ const workspace = registry.getWorkspace(workspaceId);
31
+ const timestamp = checkedAt();
32
+ const blender = {
33
+ state: "disconnected",
34
+ provider: "Auvrynt Blender bridge",
35
+ endpoint: "127.0.0.1:49323",
36
+ detail: "No response from the local Blender bridge.",
37
+ checkedAt: timestamp,
38
+ };
39
+ try {
40
+ const response = await getBlenderClient(workspaceId).sendExecute("import bpy\nresult = {'version': bpy.app.version_string, 'scene': bpy.context.scene.name}\n");
41
+ blender.state = "connected";
42
+ blender.detail = "Blender bridge responded.";
43
+ blender.metadata = response;
44
+ }
45
+ catch (error) {
46
+ blender.detail = error instanceof Error ? error.message : String(error);
47
+ }
48
+ let godot;
49
+ try {
50
+ const response = await godotEditorStatus({ workspaceId });
51
+ godot = {
52
+ state: response.connected ? "connected" : "disconnected",
53
+ provider: "Auvrynt Godot editor bridge",
54
+ endpoint: "127.0.0.1:49322",
55
+ detail: response.connected ? "Godot editor bridge responded." : "Godot editor bridge is not connected.",
56
+ checkedAt: timestamp,
57
+ metadata: response.connected ? response : undefined,
58
+ };
59
+ }
60
+ catch (error) {
61
+ godot = {
62
+ state: "error",
63
+ provider: "Auvrynt Godot editor bridge",
64
+ endpoint: "127.0.0.1:49322",
65
+ detail: error instanceof Error ? error.message : String(error),
66
+ checkedAt: timestamp,
67
+ };
68
+ }
69
+ return {
70
+ checkedAt: timestamp,
71
+ workspace: { id: workspace.id, root: workspace.root, mode: workspace.mode },
72
+ connections: {
73
+ mcp: {
74
+ state: "connected",
75
+ provider: "Auvrynt MCP server",
76
+ detail: "This status request was received through the authenticated MCP connection.",
77
+ checkedAt: timestamp,
78
+ },
79
+ blender,
80
+ godot,
81
+ browser: browserStatus(),
82
+ chrome_mcp: {
83
+ state: "not_configured",
84
+ provider: "Chrome MCP",
85
+ detail: "No Chrome MCP adapter is registered in this Auvrynt build.",
86
+ checkedAt: timestamp,
87
+ },
88
+ },
89
+ processes: processManager.listProcesses({ workspaceId }),
90
+ };
91
+ }
@@ -0,0 +1,22 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import Database from "better-sqlite3";
4
+ import { drizzle } from "drizzle-orm/better-sqlite3";
5
+ import * as schema from "./schema.js";
6
+ export function databasePath(stateDir) {
7
+ return join(stateDir, "auvrynt.sqlite");
8
+ }
9
+ export function openDatabase(stateDir) {
10
+ mkdirSync(stateDir, { recursive: true });
11
+ const sqlite = new Database(databasePath(stateDir));
12
+ sqlite.pragma("journal_mode = WAL");
13
+ sqlite.pragma("foreign_keys = ON");
14
+ return {
15
+ sqlite,
16
+ db: createDrizzleDatabase(sqlite),
17
+ close: () => sqlite.close(),
18
+ };
19
+ }
20
+ function createDrizzleDatabase(sqlite) {
21
+ return drizzle(sqlite, { schema });
22
+ }