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
@@ -0,0 +1,218 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { spawn } from "node:child_process";
3
+ import { execFile } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ const SECRET_KEYWORD_REGEX = /(TOKEN|SECRET|PASSWORD|KEY|CONNECTION_STRING)/i;
7
+ const URL_REGEX = /https?:\/\/(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)(:\d+)?(\/[^\s]*)?/gi;
8
+ function secretValues(environment) {
9
+ return Object.entries({ ...process.env, ...(environment ?? {}) })
10
+ .filter(([key, value]) => SECRET_KEYWORD_REGEX.test(key) && Boolean(value) && value.length >= 4)
11
+ .map(([, value]) => value)
12
+ .sort((a, b) => b.length - a.length);
13
+ }
14
+ export function redactProcessText(text, environment) {
15
+ return secretValues(environment).reduce((result, secret) => result.split(secret).join("[REDACTED]"), text);
16
+ }
17
+ export function sanitizeEnv(env) {
18
+ if (!env)
19
+ return {};
20
+ const sanitized = {};
21
+ for (const [key, value] of Object.entries(env)) {
22
+ if (SECRET_KEYWORD_REGEX.test(key)) {
23
+ sanitized[key] = "[REDACTED]";
24
+ }
25
+ else {
26
+ sanitized[key] = value;
27
+ }
28
+ }
29
+ return sanitized;
30
+ }
31
+ export class ProcessManager {
32
+ registry;
33
+ processes = new Map();
34
+ constructor(registry) {
35
+ this.registry = registry;
36
+ }
37
+ startProcess(input) {
38
+ const workspace = this.registry.getWorkspace(input.workspaceId);
39
+ const cwd = this.registry.resolveWorkingDirectory(workspace, input.workingDirectory);
40
+ const processId = `proc_${randomUUID()}`;
41
+ const maxLogLines = 1000;
42
+ const childEnv = { ...process.env, ...(input.environment ?? {}) };
43
+ const redactionEnvironment = input.environment;
44
+ const useShell = input.useShell ?? true;
45
+ const child = spawn(input.command, {
46
+ cwd,
47
+ env: childEnv,
48
+ shell: useShell,
49
+ detached: false,
50
+ });
51
+ const tracked = {
52
+ id: processId,
53
+ workspaceId: input.workspaceId,
54
+ command: input.command,
55
+ workingDirectory: cwd,
56
+ startTime: new Date().toISOString(),
57
+ child,
58
+ pid: child.pid,
59
+ status: "running",
60
+ stdoutLogs: [],
61
+ stderrLogs: [],
62
+ combinedLogs: [],
63
+ detectedUrls: new Set(),
64
+ maxLogLines,
65
+ };
66
+ const appendLog = (line, stream) => {
67
+ const trimmed = redactProcessText(line.trimEnd(), redactionEnvironment);
68
+ if (!trimmed)
69
+ return;
70
+ const matches = trimmed.match(URL_REGEX);
71
+ if (matches) {
72
+ for (const match of matches) {
73
+ tracked.detectedUrls.add(match);
74
+ }
75
+ }
76
+ const formatted = `[${stream}] ${trimmed}`;
77
+ tracked.combinedLogs.push(formatted);
78
+ if (stream === "stdout")
79
+ tracked.stdoutLogs.push(trimmed);
80
+ if (stream === "stderr")
81
+ tracked.stderrLogs.push(trimmed);
82
+ if (tracked.combinedLogs.length > maxLogLines) {
83
+ tracked.combinedLogs.shift();
84
+ }
85
+ if (tracked.stdoutLogs.length > maxLogLines) {
86
+ tracked.stdoutLogs.shift();
87
+ }
88
+ if (tracked.stderrLogs.length > maxLogLines) {
89
+ tracked.stderrLogs.shift();
90
+ }
91
+ };
92
+ child.stdout?.on("data", (data) => {
93
+ const text = data.toString("utf8");
94
+ for (const line of text.split(/\r?\n/)) {
95
+ appendLog(line, "stdout");
96
+ }
97
+ });
98
+ child.stderr?.on("data", (data) => {
99
+ const text = data.toString("utf8");
100
+ for (const line of text.split(/\r?\n/)) {
101
+ appendLog(line, "stderr");
102
+ }
103
+ });
104
+ child.on("exit", (code) => {
105
+ tracked.status = "exited";
106
+ tracked.exitCode = code ?? undefined;
107
+ });
108
+ child.on("error", (err) => {
109
+ appendLog(`Process error: ${err.message}`, "stderr");
110
+ tracked.status = "exited";
111
+ tracked.exitCode = 1;
112
+ });
113
+ this.processes.set(processId, tracked);
114
+ return {
115
+ processId,
116
+ status: tracked.status,
117
+ exitCode: tracked.exitCode,
118
+ detectedUrls: Array.from(tracked.detectedUrls),
119
+ recentOutput: tracked.combinedLogs.slice(-20),
120
+ };
121
+ }
122
+ getProcessLogs(input) {
123
+ const tracked = this.getTrackedProcess(input.workspaceId, input.processId);
124
+ const stream = input.stream ?? "both";
125
+ let sourceLogs;
126
+ if (stream === "stdout")
127
+ sourceLogs = tracked.stdoutLogs;
128
+ else if (stream === "stderr")
129
+ sourceLogs = tracked.stderrLogs;
130
+ else
131
+ sourceLogs = tracked.combinedLogs;
132
+ const limit = Math.min(Math.max(input.lines ?? 100, 1), 500);
133
+ const recent = sourceLogs.slice(-limit);
134
+ return {
135
+ processId: tracked.id,
136
+ lines: recent,
137
+ totalLinesAvailable: sourceLogs.length,
138
+ };
139
+ }
140
+ listProcesses(input) {
141
+ const list = [];
142
+ for (const tracked of this.processes.values()) {
143
+ if (tracked.workspaceId === input.workspaceId) {
144
+ list.push({
145
+ processId: tracked.id,
146
+ command: tracked.command,
147
+ workingDirectory: tracked.workingDirectory,
148
+ startTime: tracked.startTime,
149
+ status: tracked.status,
150
+ exitCode: tracked.exitCode,
151
+ detectedUrls: Array.from(tracked.detectedUrls),
152
+ });
153
+ }
154
+ }
155
+ return list;
156
+ }
157
+ async stopProcess(input) {
158
+ const tracked = this.getTrackedProcess(input.workspaceId, input.processId);
159
+ if (tracked.status === "exited") {
160
+ return { processId: tracked.id, stopped: true, exitCode: tracked.exitCode };
161
+ }
162
+ const pid = tracked.pid;
163
+ if (!pid) {
164
+ tracked.child.kill("SIGKILL");
165
+ tracked.status = "exited";
166
+ return { processId: tracked.id, stopped: true };
167
+ }
168
+ if (input.force) {
169
+ await this.killProcessTree(pid);
170
+ tracked.status = "exited";
171
+ return { processId: tracked.id, stopped: true };
172
+ }
173
+ // Try graceful kill first
174
+ tracked.child.kill("SIGTERM");
175
+ // Wait up to 1.5 seconds for graceful exit
176
+ const exited = await this.waitForExit(tracked, 1500);
177
+ if (!exited) {
178
+ await this.killProcessTree(pid);
179
+ tracked.status = "exited";
180
+ }
181
+ return { processId: tracked.id, stopped: true, exitCode: tracked.exitCode };
182
+ }
183
+ getTrackedProcess(workspaceId, processId) {
184
+ const tracked = this.processes.get(processId);
185
+ if (!tracked || tracked.workspaceId !== workspaceId) {
186
+ throw new Error(`Process ${processId} not found in workspace ${workspaceId}`);
187
+ }
188
+ return tracked;
189
+ }
190
+ async waitForExit(tracked, timeoutMs) {
191
+ const start = Date.now();
192
+ while (Date.now() - start < timeoutMs) {
193
+ if (tracked.status === "exited")
194
+ return true;
195
+ await new Promise((resolve) => setTimeout(resolve, 100));
196
+ }
197
+ return tracked.status === "exited";
198
+ }
199
+ async killProcessTree(pid) {
200
+ if (process.platform === "win32") {
201
+ try {
202
+ await execFileAsync("taskkill", ["/F", "/T", "/PID", String(pid)]);
203
+ }
204
+ catch { }
205
+ }
206
+ else {
207
+ try {
208
+ process.kill(-pid, "SIGKILL");
209
+ }
210
+ catch {
211
+ try {
212
+ process.kill(pid, "SIGKILL");
213
+ }
214
+ catch { }
215
+ }
216
+ }
217
+ }
218
+ }
@@ -0,0 +1,142 @@
1
+ import { mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { git, getGitEligibility, safeWorkspaceRefSegment } from "./git.js";
5
+ const REVIEW_REF_PREFIX = "refs/auvrynt/review";
6
+ export function createReviewCheckpointManager() {
7
+ const states = new Map();
8
+ return {
9
+ async initializeWorkspace({ workspaceId, root }) {
10
+ const refs = reviewRefs(workspaceId);
11
+ const state = { root, ...refs };
12
+ states.set(workspaceId, state);
13
+ try {
14
+ const eligibility = await getGitEligibility(root);
15
+ if (!eligibility.ok || !eligibility.gitRoot) {
16
+ state.diagnostic = eligibility.message ?? "show_changes requires a Git workspace in this version.";
17
+ return;
18
+ }
19
+ state.gitRoot = eligibility.gitRoot;
20
+ const commit = await createWorkingTreeSnapshot(eligibility.gitRoot);
21
+ await git(eligibility.gitRoot, ["update-ref", state.openRef, commit]);
22
+ await git(eligibility.gitRoot, ["update-ref", state.baselineRef, commit]);
23
+ }
24
+ catch (error) {
25
+ state.diagnostic = error instanceof Error ? error.message : String(error);
26
+ }
27
+ },
28
+ async reviewChanges({ workspaceId, root, since = "last_shown", markReviewed = true }) {
29
+ let state = states.get(workspaceId);
30
+ if (!state) {
31
+ await this.initializeWorkspace({ workspaceId, root });
32
+ state = states.get(workspaceId);
33
+ }
34
+ if (!state?.gitRoot) {
35
+ throw new Error(state?.diagnostic ?? "show_changes requires a Git workspace in this version.");
36
+ }
37
+ const baselineRef = since === "workspace_open" ? state.openRef : state.baselineRef;
38
+ const baseline = (await git(state.gitRoot, ["rev-parse", "--verify", `${baselineRef}^{commit}`])).stdout.trim();
39
+ const current = await createWorkingTreeSnapshot(state.gitRoot);
40
+ const patch = (await git(state.gitRoot, ["diff", "--binary", "--no-color", baseline, current], {
41
+ maxBuffer: 50 * 1024 * 1024,
42
+ })).stdout;
43
+ const numstat = (await git(state.gitRoot, ["diff", "--numstat", "-z", baseline, current], {
44
+ maxBuffer: 50 * 1024 * 1024,
45
+ })).stdout;
46
+ const files = parseNumstat(numstat);
47
+ const summary = summarizeFiles(files);
48
+ if (markReviewed) {
49
+ await git(state.gitRoot, ["update-ref", state.baselineRef, current]);
50
+ }
51
+ return {
52
+ result: summary.files === 0
53
+ ? `No changes since ${since === "workspace_open" ? "workspace open" : "last shown changes"}.`
54
+ : `Changed ${summary.files} ${summary.files === 1 ? "file" : "files"} (+${summary.additions} -${summary.removals}).`,
55
+ summary,
56
+ files,
57
+ patch,
58
+ };
59
+ },
60
+ };
61
+ }
62
+ function reviewRefs(workspaceId) {
63
+ const segment = safeWorkspaceRefSegment(workspaceId);
64
+ return {
65
+ openRef: `${REVIEW_REF_PREFIX}/${segment}/open`,
66
+ baselineRef: `${REVIEW_REF_PREFIX}/${segment}/baseline`,
67
+ };
68
+ }
69
+ async function createWorkingTreeSnapshot(gitRoot) {
70
+ const tempDir = await mkdtemp(join(tmpdir(), "auvrynt-review-index-"));
71
+ const indexPath = join(tempDir, "index");
72
+ const env = checkpointEnv(indexPath);
73
+ try {
74
+ await git(gitRoot, ["read-tree", "HEAD"], { env });
75
+ await git(gitRoot, ["add", "-A", "--", "."], { env });
76
+ const tree = (await git(gitRoot, ["write-tree"], { env })).stdout.trim();
77
+ const parent = (await git(gitRoot, ["rev-parse", "--verify", "HEAD^{commit}"])).stdout.trim();
78
+ return (await git(gitRoot, ["commit-tree", tree, "-p", parent, "-m", "Auvrynt review snapshot"], { env })).stdout.trim();
79
+ }
80
+ finally {
81
+ await rm(tempDir, { recursive: true, force: true });
82
+ }
83
+ }
84
+ function checkpointEnv(indexPath) {
85
+ return {
86
+ GIT_INDEX_FILE: indexPath,
87
+ GIT_AUTHOR_NAME: "Auvrynt",
88
+ GIT_AUTHOR_EMAIL: "auvrynt@users.noreply.local",
89
+ GIT_COMMITTER_NAME: "Auvrynt",
90
+ GIT_COMMITTER_EMAIL: "auvrynt@users.noreply.local",
91
+ };
92
+ }
93
+ function parseNumstat(output) {
94
+ const fields = output.split("\0").filter((field) => field.length > 0);
95
+ const files = [];
96
+ for (let index = 0; index < fields.length;) {
97
+ const header = fields[index++] ?? "";
98
+ const parts = header.split("\t");
99
+ const additions = parseStatNumber(parts[0]);
100
+ const removals = parseStatNumber(parts[1]);
101
+ if (parts.length >= 3) {
102
+ const path = parts[2] ?? "";
103
+ if (path)
104
+ files.push({ path, type: fileType(path, undefined, additions, removals), additions, removals });
105
+ continue;
106
+ }
107
+ const previousPath = fields[index++];
108
+ const path = fields[index++];
109
+ if (!path)
110
+ continue;
111
+ files.push({
112
+ path,
113
+ previousPath,
114
+ type: fileType(path, previousPath, additions, removals),
115
+ additions,
116
+ removals,
117
+ });
118
+ }
119
+ return files;
120
+ }
121
+ function parseStatNumber(value) {
122
+ if (!value || value === "-")
123
+ return 0;
124
+ const parsed = Number(value);
125
+ return Number.isFinite(parsed) ? parsed : 0;
126
+ }
127
+ function fileType(path, previousPath, additions, removals) {
128
+ if (previousPath)
129
+ return additions === 0 && removals === 0 ? "rename-pure" : "rename-changed";
130
+ if (additions > 0 && removals === 0)
131
+ return "new";
132
+ if (additions === 0 && removals > 0)
133
+ return "deleted";
134
+ return "change";
135
+ }
136
+ function summarizeFiles(files) {
137
+ return files.reduce((summary, file) => ({
138
+ files: summary.files + 1,
139
+ additions: summary.additions + file.additions,
140
+ removals: summary.removals + file.removals,
141
+ }), { files: 0, additions: 0, removals: 0 });
142
+ }
package/dist/roots.js ADDED
@@ -0,0 +1,53 @@
1
+ import { homedir } from "node:os";
2
+ import { basename, dirname, relative, resolve, sep } from "node:path";
3
+ import { existsSync, realpathSync } from "node:fs";
4
+ export class AccessDeniedError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "AccessDeniedError";
8
+ }
9
+ }
10
+ export function expandHomePath(path) {
11
+ if (path === "~")
12
+ return homedir();
13
+ if (path.startsWith("~/") || path.startsWith("~\\")) {
14
+ return resolve(homedir(), path.slice(2));
15
+ }
16
+ return path;
17
+ }
18
+ export function isPathInsideRoot(path, root) {
19
+ const resolvedPath = canonicalizePath(path);
20
+ const resolvedRoot = canonicalizePath(root);
21
+ const relationship = relative(resolvedRoot, resolvedPath);
22
+ return (relationship === "" ||
23
+ (!relationship.startsWith("..") && relationship !== ".." && !relationship.includes(`..${sep}`)));
24
+ }
25
+ export function assertAllowedPath(path, allowedRoots) {
26
+ const resolvedPath = canonicalizePath(path);
27
+ if (allowedRoots.some((root) => isPathInsideRoot(resolvedPath, root))) {
28
+ return resolve(expandHomePath(path));
29
+ }
30
+ throw new AccessDeniedError(`Path is outside allowed roots: ${path}`);
31
+ }
32
+ export function resolveAllowedPath(inputPath, cwd, allowedRoots) {
33
+ const absolutePath = resolve(cwd, inputPath);
34
+ return assertAllowedPath(absolutePath, allowedRoots);
35
+ }
36
+ /**
37
+ * Resolve the existing portion of a path through symlinks/junctions before
38
+ * applying workspace boundaries. This also handles new files whose parent
39
+ * directory already exists behind a link.
40
+ */
41
+ function canonicalizePath(path) {
42
+ const resolved = resolve(expandHomePath(path));
43
+ const missing = [];
44
+ let existing = resolved;
45
+ while (!existsSync(existing)) {
46
+ const parent = dirname(existing);
47
+ if (parent === existing)
48
+ return resolved;
49
+ missing.unshift(basename(existing));
50
+ existing = parent;
51
+ }
52
+ return resolve(realpathSync.native(existing), ...missing);
53
+ }
@@ -0,0 +1,271 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { join, relative } from "node:path";
3
+ const DEFAULT_IGNORED_DIRS = new Set([
4
+ ".git",
5
+ ".auvrynt-run",
6
+ "node_modules",
7
+ "dist",
8
+ "build",
9
+ "bin",
10
+ "obj",
11
+ ".next",
12
+ ".godot",
13
+ "__pycache__",
14
+ ]);
15
+ export async function globFiles(registry, input) {
16
+ const workspace = registry.getWorkspace(input.workspaceId);
17
+ const baseDir = input.basePath
18
+ ? registry.resolvePath(workspace, input.basePath)
19
+ : workspace.root;
20
+ const maxResults = Math.min(Math.max(input.maxResults ?? 100, 1), 1000);
21
+ const matchedFiles = [];
22
+ let truncated = false;
23
+ // Convert glob pattern to simple Regex
24
+ const regexPattern = input.pattern
25
+ .replace(/\./g, "\\.")
26
+ .replace(/\*\*/g, ".*")
27
+ .replace(/\*/g, "[^/\\\\]*")
28
+ .replace(/\?/g, ".");
29
+ const patternRegex = new RegExp(`^${regexPattern}$`, "i");
30
+ async function walk(dir) {
31
+ if (matchedFiles.length >= maxResults) {
32
+ truncated = true;
33
+ return;
34
+ }
35
+ let entries;
36
+ try {
37
+ entries = await readdir(dir, { withFileTypes: true });
38
+ }
39
+ catch {
40
+ return;
41
+ }
42
+ for (const entry of entries) {
43
+ if (matchedFiles.length >= maxResults) {
44
+ truncated = true;
45
+ return;
46
+ }
47
+ if (entry.isDirectory()) {
48
+ if (DEFAULT_IGNORED_DIRS.has(entry.name))
49
+ continue;
50
+ await walk(join(dir, entry.name));
51
+ }
52
+ else if (entry.isFile()) {
53
+ const fullPath = join(dir, entry.name);
54
+ const relPath = relative(workspace.root, fullPath).replace(/\\/g, "/");
55
+ if (patternRegex.test(entry.name) || patternRegex.test(relPath)) {
56
+ matchedFiles.push(relPath);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ await walk(baseDir);
62
+ return {
63
+ files: matchedFiles,
64
+ total: matchedFiles.length,
65
+ truncated,
66
+ };
67
+ }
68
+ export async function searchText(registry, input) {
69
+ const workspace = registry.getWorkspace(input.workspaceId);
70
+ const searchRoot = workspace.root;
71
+ const maxResults = Math.min(Math.max(input.maxResults ?? 50, 1), 500);
72
+ const caseSensitive = input.caseSensitive ?? false;
73
+ const flags = caseSensitive ? "g" : "gi";
74
+ const searchRegex = new RegExp(input.query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), flags);
75
+ const fileFilterRegex = input.filePattern
76
+ ? new RegExp(input.filePattern
77
+ .replace(/\./g, "\\.")
78
+ .replace(/\*/g, ".*"), "i")
79
+ : null;
80
+ const matches = [];
81
+ let truncated = false;
82
+ async function searchInFile(fullPath) {
83
+ if (matches.length >= maxResults) {
84
+ truncated = true;
85
+ return;
86
+ }
87
+ let text;
88
+ try {
89
+ const stats = await stat(fullPath);
90
+ // Skip binary/huge files > 2 MB
91
+ if (stats.size > 2 * 1024 * 1024)
92
+ return;
93
+ text = await readFile(fullPath, "utf8");
94
+ }
95
+ catch {
96
+ return;
97
+ }
98
+ const lines = text.split(/\r?\n/);
99
+ const relPath = relative(workspace.root, fullPath).replace(/\\/g, "/");
100
+ for (let i = 0; i < lines.length; i++) {
101
+ if (matches.length >= maxResults) {
102
+ truncated = true;
103
+ return;
104
+ }
105
+ const lineText = lines[i];
106
+ searchRegex.lastIndex = 0;
107
+ const matchExec = searchRegex.exec(lineText);
108
+ if (matchExec) {
109
+ const startCtx = Math.max(0, i - 1);
110
+ const endCtx = Math.min(lines.length - 1, i + 1);
111
+ const context = lines.slice(startCtx, endCtx + 1);
112
+ matches.push({
113
+ path: relPath,
114
+ line: i + 1,
115
+ column: matchExec.index + 1,
116
+ match: lineText.trim(),
117
+ context,
118
+ });
119
+ }
120
+ }
121
+ }
122
+ async function walk(dir) {
123
+ if (matches.length >= maxResults) {
124
+ truncated = true;
125
+ return;
126
+ }
127
+ let entries;
128
+ try {
129
+ entries = await readdir(dir, { withFileTypes: true });
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ for (const entry of entries) {
135
+ if (matches.length >= maxResults) {
136
+ truncated = true;
137
+ return;
138
+ }
139
+ if (entry.isDirectory()) {
140
+ if (DEFAULT_IGNORED_DIRS.has(entry.name))
141
+ continue;
142
+ await walk(join(dir, entry.name));
143
+ }
144
+ else if (entry.isFile()) {
145
+ if (fileFilterRegex && !fileFilterRegex.test(entry.name))
146
+ continue;
147
+ await searchInFile(join(dir, entry.name));
148
+ }
149
+ }
150
+ }
151
+ const targetDirs = input.paths?.length
152
+ ? input.paths.map((p) => registry.resolvePath(workspace, p))
153
+ : [searchRoot];
154
+ for (const dir of targetDirs) {
155
+ const s = await stat(dir).catch(() => null);
156
+ if (s?.isDirectory()) {
157
+ await walk(dir);
158
+ }
159
+ else if (s?.isFile()) {
160
+ await searchInFile(dir);
161
+ }
162
+ }
163
+ return {
164
+ matches,
165
+ total: matches.length,
166
+ truncated,
167
+ };
168
+ }
169
+ export async function inspectProject(registry, input) {
170
+ const workspace = registry.getWorkspace(input.workspaceId);
171
+ const targetDir = input.path
172
+ ? registry.resolvePath(workspace, input.path)
173
+ : workspace.root;
174
+ const projectTypes = [];
175
+ const packageManagers = [];
176
+ const frameworks = [];
177
+ const configFiles = [];
178
+ const recommendedCommands = {};
179
+ const details = {};
180
+ let entries = [];
181
+ try {
182
+ entries = await readdir(targetDir);
183
+ }
184
+ catch { }
185
+ const entrySet = new Set(entries);
186
+ // Check Node.js / TypeScript
187
+ if (entrySet.has("package.json")) {
188
+ projectTypes.push("nodejs");
189
+ configFiles.push("package.json");
190
+ try {
191
+ const pkgContent = await readFile(join(targetDir, "package.json"), "utf8");
192
+ const pkgJson = JSON.parse(pkgContent);
193
+ details.packageName = pkgJson.name;
194
+ details.scripts = pkgJson.scripts ?? {};
195
+ if (pkgJson.scripts?.build)
196
+ recommendedCommands.build = "npm run build";
197
+ if (pkgJson.scripts?.dev)
198
+ recommendedCommands.run = "npm run dev";
199
+ else if (pkgJson.scripts?.start)
200
+ recommendedCommands.run = "npm start";
201
+ if (pkgJson.scripts?.test)
202
+ recommendedCommands.test = "npm test";
203
+ if (pkgJson.scripts?.lint)
204
+ recommendedCommands.lint = "npm run lint";
205
+ const allDeps = { ...(pkgJson.dependencies ?? {}), ...(pkgJson.devDependencies ?? {}) };
206
+ if (allDeps.next)
207
+ frameworks.push("nextjs");
208
+ if (allDeps.vite)
209
+ frameworks.push("vite");
210
+ if (allDeps.react)
211
+ frameworks.push("react");
212
+ if (allDeps.express)
213
+ frameworks.push("express");
214
+ }
215
+ catch { }
216
+ }
217
+ if (entrySet.has("package-lock.json"))
218
+ packageManagers.push("npm");
219
+ if (entrySet.has("pnpm-lock.yaml"))
220
+ packageManagers.push("pnpm");
221
+ if (entrySet.has("yarn.lock"))
222
+ packageManagers.push("yarn");
223
+ if (entrySet.has("bun.lockb") || entrySet.has("bun.lock"))
224
+ packageManagers.push("bun");
225
+ if (entrySet.has("tsconfig.json")) {
226
+ projectTypes.push("typescript");
227
+ configFiles.push("tsconfig.json");
228
+ }
229
+ // Check .NET
230
+ const dotnetFiles = entries.filter((e) => e.endsWith(".csproj") || e.endsWith(".fsproj") || e.endsWith(".sln"));
231
+ if (dotnetFiles.length > 0) {
232
+ projectTypes.push("dotnet");
233
+ configFiles.push(...dotnetFiles);
234
+ recommendedCommands.build = recommendedCommands.build ?? "dotnet build";
235
+ recommendedCommands.run = recommendedCommands.run ?? "dotnet run";
236
+ recommendedCommands.test = recommendedCommands.test ?? "dotnet test";
237
+ recommendedCommands.format = recommendedCommands.format ?? "dotnet format";
238
+ details.dotnetFiles = dotnetFiles;
239
+ }
240
+ // Check Godot
241
+ if (entrySet.has("project.godot")) {
242
+ projectTypes.push("godot");
243
+ configFiles.push("project.godot");
244
+ recommendedCommands.run = recommendedCommands.run ?? "godot --path .";
245
+ details.godotProject = true;
246
+ }
247
+ // Check Python
248
+ if (entrySet.has("pyproject.toml") || entrySet.has("requirements.txt") || entrySet.has("setup.py")) {
249
+ projectTypes.push("python");
250
+ if (entrySet.has("pyproject.toml"))
251
+ configFiles.push("pyproject.toml");
252
+ if (entrySet.has("requirements.txt"))
253
+ configFiles.push("requirements.txt");
254
+ recommendedCommands.run = recommendedCommands.run ?? "python main.py";
255
+ }
256
+ // Check Git
257
+ if (entrySet.has(".git")) {
258
+ configFiles.push(".git");
259
+ details.gitRepository = true;
260
+ }
261
+ return {
262
+ workspaceId: input.workspaceId,
263
+ root: targetDir,
264
+ projectTypes,
265
+ packageManagers,
266
+ frameworks,
267
+ configFiles,
268
+ recommendedCommands,
269
+ details,
270
+ };
271
+ }