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.
- package/LICENSE +21 -21
- package/README.md +366 -233
- package/addons/auvrynt_bridge/auvrynt_bridge.gd +500 -0
- package/addons/auvrynt_bridge/plugin.cfg +7 -0
- package/bin/auvrynt-launcher.cjs +77 -0
- package/dist/artifact-registry.js +1 -0
- package/dist/aseprite-tools.js +1 -0
- package/dist/auth/connection-registry.js +145 -0
- package/dist/auth/connection-status.js +176 -0
- package/dist/auth/oauth-provider.js +617 -0
- package/dist/auth/room-registry.js +131 -0
- package/dist/auth/session-registry.js +531 -0
- package/dist/background-lifecycle.js +1 -0
- package/dist/blender-client.js +1 -109
- package/dist/blender-tools.js +1 -930
- package/dist/browser-stability.js +1 -0
- package/dist/cli/commands/help-command.js +10 -0
- package/dist/cli/commands/init-command.js +190 -0
- package/dist/cli/commands/integration-commands.js +88 -0
- package/dist/cli/commands/serve-command.js +83 -0
- package/dist/cli/commands/setup-command.js +81 -0
- package/dist/cli/commands/status-commands.js +166 -0
- package/dist/cli/commands/tunnel-command.js +127 -0
- package/dist/cli/commands/user-config-commands.js +105 -0
- package/dist/cli/dashboard-actions.js +516 -0
- package/dist/cli/dashboard-native-actions.js +282 -0
- package/dist/cli/foreground-server.js +270 -0
- package/dist/cli/instance-control.js +21 -0
- package/dist/cli/instance-lock.js +123 -0
- package/dist/cli/integration-bootstrap.js +206 -0
- package/dist/cli/lifecycle-manager.js +493 -0
- package/dist/cli/runtime-support.js +74 -0
- package/dist/cli/serena-detected-default.js +27 -0
- package/dist/cli/tunnel-health-monitor.js +182 -0
- package/dist/cli.js +82 -739
- package/dist/config.js +1 -243
- package/dist/connection-registry.js +1 -73
- package/dist/connection-status.js +1 -139
- package/dist/control-retry.js +1 -0
- package/dist/crash-recovery.js +1 -0
- package/dist/db/client.js +16 -3
- package/dist/db/schema.js +30 -0
- package/dist/dotnet-tools.js +1 -223
- package/dist/git-worktrees.js +1 -134
- package/dist/git.js +1 -41
- package/dist/godot-animation-tilemap.js +1 -82
- package/dist/godot-csharp-build.js +1 -93
- package/dist/godot-csharp-project.js +1 -157
- package/dist/godot-csharp-runner.js +1 -146
- package/dist/godot-csharp-semantic.js +1 -161
- package/dist/godot-csharp-validate.js +1 -71
- package/dist/godot-dotnet-env.js +1 -169
- package/dist/godot-editor-bridge.js +1 -140
- package/dist/godot-gdscript.js +1 -824
- package/dist/godot-project-settings.js +1 -223
- package/dist/godot-runtime-testing.js +1 -249
- package/dist/godot-tools.js +1 -183
- package/dist/http-rate-limit.js +1 -0
- package/dist/http-server-hardening.js +1 -0
- package/dist/image-tools.js +1 -157
- package/dist/infrastructure/command-reference.js +32 -0
- package/dist/infrastructure/config.js +424 -0
- package/dist/infrastructure/context7-auth.js +55 -0
- package/dist/infrastructure/http-rate-limit.js +42 -0
- package/dist/infrastructure/http-server-hardening.js +23 -0
- package/dist/infrastructure/integration-queue.js +46 -0
- package/dist/infrastructure/logger.js +129 -0
- package/dist/infrastructure/mcp-event-store.js +103 -0
- package/dist/infrastructure/ngrok-auth-pool.js +208 -0
- package/dist/infrastructure/request-context.js +14 -0
- package/dist/infrastructure/shutdown.js +37 -0
- package/dist/infrastructure/sse-heartbeat.js +47 -0
- package/dist/infrastructure/tool-capabilities.js +67 -0
- package/dist/infrastructure/tool-result-budget.js +175 -0
- package/dist/infrastructure/user-config.js +167 -0
- package/dist/integration-discovery.js +1 -98
- package/dist/integration-queue.js +1 -0
- package/dist/integrations/agent-reach/agent-reach-tools.js +196 -0
- package/dist/integrations/agent-reach/native-channels.js +468 -0
- package/dist/integrations/aseprite/aseprite-analysis-tools.js +368 -0
- package/dist/integrations/aseprite/aseprite-editing-tools.js +647 -0
- package/dist/integrations/aseprite/aseprite-live-tools.js +297 -0
- package/dist/integrations/aseprite/aseprite-safety-tools.js +594 -0
- package/dist/integrations/aseprite/aseprite-specialized-tools.js +289 -0
- package/dist/integrations/aseprite/aseprite-tools.js +837 -0
- package/dist/integrations/blender/blender-catalog-mesh.js +593 -0
- package/dist/integrations/blender/blender-catalog-object.js +906 -0
- package/dist/integrations/blender/blender-catalog-scene.js +266 -0
- package/dist/integrations/blender/blender-catalog-select.js +581 -0
- package/dist/integrations/blender/blender-catalog-stubs.js +7512 -0
- package/dist/integrations/blender/blender-catalog.js +165 -0
- package/dist/integrations/blender/blender-client.js +105 -0
- package/dist/integrations/blender/blender-tools.js +2243 -0
- package/dist/integrations/context7/context7-tools.js +106 -0
- package/dist/integrations/dotnet/dotnet-tools.js +195 -0
- package/dist/integrations/godot/godot-animation-tilemap.js +74 -0
- package/dist/integrations/godot/godot-csharp-build.js +91 -0
- package/dist/integrations/godot/godot-csharp-project.js +155 -0
- package/dist/integrations/godot/godot-csharp-runner.js +118 -0
- package/dist/integrations/godot/godot-csharp-semantic.js +146 -0
- package/dist/integrations/godot/godot-csharp-validate.js +71 -0
- package/dist/integrations/godot/godot-dotnet-env.js +134 -0
- package/dist/integrations/godot/godot-editor-bridge.js +328 -0
- package/dist/integrations/godot/godot-gdscript.js +536 -0
- package/dist/integrations/godot/godot-project-settings.js +178 -0
- package/dist/integrations/godot/godot-runtime-testing.js +263 -0
- package/dist/integrations/godot/godot-tools.js +193 -0
- package/dist/integrations/images/image-tools.js +414 -0
- package/dist/integrations/images/png-codec.js +251 -0
- package/dist/integrations/images/view-image.js +99 -0
- package/dist/integrations/images/window-capture.js +148 -0
- package/dist/integrations/integration-discovery.js +185 -0
- package/dist/integrations/obsidian/obsidian-tools.js +205 -0
- package/dist/integrations/playwright/browser-session.js +516 -0
- package/dist/integrations/playwright/browser-stability.js +36 -0
- package/dist/integrations/playwright/playwright-runtime.js +105 -0
- package/dist/integrations/playwright/web-tools.js +504 -0
- package/dist/integrations/roblox/roblox-helpers.js +381 -0
- package/dist/integrations/roblox/roblox-studio-client.js +112 -0
- package/dist/integrations/roblox/roblox-tools.js +106 -0
- package/dist/integrations/serena/serena-manager.js +464 -0
- package/dist/integrations/serena/serena-tools.js +411 -0
- package/dist/logger.js +1 -76
- package/dist/mcp-event-store.js +1 -0
- package/dist/oauth-provider.js +1 -377
- package/dist/pi-tools.js +1 -81
- package/dist/playwright-runtime.js +1 -0
- package/dist/process/background-lifecycle.js +189 -0
- package/dist/process/control-retry.js +42 -0
- package/dist/process/crash-recovery.js +23 -0
- package/dist/process/processes.js +456 -0
- package/dist/processes.js +1 -218
- package/dist/request-context.js +1 -0
- package/dist/review-checkpoints.js +1 -142
- package/dist/room-registry.js +1 -0
- package/dist/roots.js +1 -53
- package/dist/search-discovery.js +1 -271
- package/dist/serena-manager.js +1 -443
- package/dist/serena-tools.js +1 -411
- package/dist/server/dashboard-page-styles.js +331 -0
- package/dist/server/dashboard-page.js +1509 -0
- package/dist/server/dashboard-routes.js +46 -0
- package/dist/server/dashboard.js +240 -0
- package/dist/server/http-helpers.js +30 -0
- package/dist/server/integration-profile-update.js +37 -0
- package/dist/server/mcp-policy.js +169 -0
- package/dist/server/mcp-server-factory.js +127 -0
- package/dist/server/mcp-tool-registrar.js +182 -0
- package/dist/server/openai-session-hint.js +14 -0
- package/dist/server/tool-groups.js +29 -0
- package/dist/server/tool-logging.js +33 -0
- package/dist/server/tool-registration-shared.js +59 -0
- package/dist/server/tools/aseprite-advanced-tools-registration.js +547 -0
- package/dist/server/tools/aseprite-tools-registration.js +213 -0
- package/dist/server/tools/blender-tools-registration.js +690 -0
- package/dist/server/tools/core-file-tools-registration.js +459 -0
- package/dist/server/tools/dotnet-godot-window-tools-registration.js +120 -0
- package/dist/server/tools/godot-csharp-tools-registration.js +252 -0
- package/dist/server/tools/godot-gdscript-tools-registration.js +189 -0
- package/dist/server/tools/process-project-tools-registration.js +155 -0
- package/dist/server/tools/roblox-tools-registration.js +514 -0
- package/dist/server/tools/web-image-tools-registration.js +326 -0
- package/dist/server/tools/workspace-lifecycle-tools-registration.js +130 -0
- package/dist/server/ui-assets.js +97 -0
- package/dist/server/workspace-analytics.js +92 -0
- package/dist/server.js +453 -2713
- package/dist/session-registry.js +1 -0
- package/dist/shutdown.js +1 -0
- package/dist/skills.js +1 -45
- package/dist/sse-heartbeat.js +1 -0
- package/dist/tool-capabilities.js +1 -0
- package/dist/tool-result-budget.js +1 -0
- package/dist/tools/pi-tools.js +81 -0
- package/dist/tunnels/cloudflare-tunnel.js +217 -0
- package/dist/tunnels/cloudflared-service.js +174 -0
- package/dist/tunnels/ngrok-tunnel.js +220 -0
- package/dist/tunnels/tunnel-manager.js +186 -0
- package/dist/tunnels/tunnel-types.js +1 -0
- package/dist/tunnels/tunnel-utils.js +62 -0
- package/dist/ui/.vite/manifest.json +9 -2487
- package/dist/ui/assets/heavy-payload-D42A9ceL.js +1 -0
- package/dist/ui/assets/lightweight-diff-Cv4g9Hdr.js +13 -0
- package/dist/ui/assets/review-payload-DKIg1cKF.js +1 -0
- package/dist/ui/assets/workspace-app-CeK3NhmB.css +1 -0
- package/dist/ui/assets/{workspace-app-C5QsE314.js → workspace-app-CkUXnpl4.js} +6 -6
- package/dist/ui/brand-theme.js +23 -0
- package/dist/ui/workspace-app.html +15 -15
- package/dist/user-config.js +1 -57
- package/dist/view-image.js +1 -104
- package/dist/web-tools.js +1 -200
- package/dist/window-capture.js +1 -74
- package/dist/workspace/artifact-registry.js +69 -0
- package/dist/workspace/git-worktrees.js +141 -0
- package/dist/workspace/git.js +42 -0
- package/dist/workspace/review-checkpoints.js +142 -0
- package/dist/workspace/roots.js +56 -0
- package/dist/workspace/search-discovery.js +264 -0
- package/dist/workspace/skills.js +45 -0
- package/dist/workspace/workspace-store.js +219 -0
- package/dist/workspace/workspaces.js +314 -0
- package/dist/workspace-store.js +1 -125
- package/dist/workspaces.js +1 -226
- package/docs/CREATOR_STORE_FREE_ASSETS.md +162 -0
- package/docs/DEVELOPMENT_TOOLS.md +136 -93
- package/docs/assets/auvrynt-icon.png +0 -0
- package/docs/assets/auvrynt-icon.svg +20 -0
- package/docs/chatgpt-coding-workflow.md +143 -143
- package/docs/configuration.md +156 -124
- package/docs/diagnostics.md +79 -0
- package/docs/gotchas.md +244 -202
- package/docs/multi-agent-and-long-projects.md +91 -0
- package/docs/security.md +138 -100
- package/docs/setup.md +171 -131
- package/docs/source-layout.md +60 -0
- package/extensions/auvrynt_bridge/auvrynt_bridge.lua +594 -0
- package/extensions/auvrynt_bridge/live_analysis.lua +181 -0
- package/extensions/auvrynt_bridge/live_animation.lua +134 -0
- package/extensions/auvrynt_bridge/live_commands.lua +24 -0
- package/extensions/auvrynt_bridge/live_common.lua +130 -0
- package/extensions/auvrynt_bridge/live_document.lua +78 -0
- package/extensions/auvrynt_bridge/live_drawing.lua +125 -0
- package/extensions/auvrynt_bridge/live_effects.lua +91 -0
- package/extensions/auvrynt_bridge/live_palette_template.lua +167 -0
- package/extensions/auvrynt_bridge/live_selection.lua +110 -0
- package/extensions/auvrynt_bridge/live_structure.lua +129 -0
- package/extensions/auvrynt_bridge/package.json +17 -0
- package/guides/ASEPRITE_AGENT_GUIDE.md +133 -0
- package/guides/BLENDER_AGENT_GUIDE.md +472 -0
- package/guides/GODOT_AGENT_GUIDE.md +298 -0
- package/guides/PROJECT_ROUTER.md +165 -0
- package/guides/ROBLOX_AGENT_GUIDE.md +75 -0
- package/guides/SOFTWARE_AGENT_GUIDE.md +104 -0
- package/guides/WEB_AGENT_GUIDE.md +287 -0
- package/package.json +78 -70
- package/scripts/dev-server.mjs +121 -120
- package/scripts/live-tunnel-smoke.mjs +538 -0
- package/scripts/repo-hygiene.mjs +74 -0
- package/scripts/restart-after-crash.mjs +49 -0
- package/scripts/run-tests.mjs +166 -0
- package/dist/ui/assets/abap-CLvhMVsD.js +0 -1
- package/dist/ui/assets/actionscript-3--17pq3dv.js +0 -1
- package/dist/ui/assets/ada-C5qYipkI.js +0 -1
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +0 -1
- package/dist/ui/assets/angular-html-BJqQFYI6.js +0 -1
- package/dist/ui/assets/angular-ts-CMJECO0Y.js +0 -1
- package/dist/ui/assets/apache-U0d_L8uA.js +0 -1
- package/dist/ui/assets/apex-CGTLDQj6.js +0 -1
- package/dist/ui/assets/apl-DWeXpBBr.js +0 -1
- package/dist/ui/assets/applescript-CCn79oCD.js +0 -1
- package/dist/ui/assets/ara-4CJ0cIlV.js +0 -1
- package/dist/ui/assets/asciidoc-DE70LPWp.js +0 -1
- package/dist/ui/assets/asm-Cmm7eHzH.js +0 -1
- package/dist/ui/assets/astro-CLbttLOq.js +0 -1
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +0 -1
- package/dist/ui/assets/awk-BWXHIvNe.js +0 -1
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +0 -1
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +0 -1
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +0 -1
- package/dist/ui/assets/ballerina-B7ZEbQpA.js +0 -1
- package/dist/ui/assets/bat-Bo4NYOV-.js +0 -1
- package/dist/ui/assets/beancount-D-usSTwE.js +0 -1
- package/dist/ui/assets/berry-DKpUyyne.js +0 -1
- package/dist/ui/assets/bibtex-Ci_nEsc7.js +0 -1
- package/dist/ui/assets/bicep-CUHmPFLl.js +0 -1
- package/dist/ui/assets/bird2-C2hNVINV.js +0 -1
- package/dist/ui/assets/blade-BOzY0P2V.js +0 -1
- package/dist/ui/assets/bsl-BkkzgIyY.js +0 -1
- package/dist/ui/assets/c-BG-8uJvh.js +0 -1
- package/dist/ui/assets/c3-CnJL0r0V.js +0 -1
- package/dist/ui/assets/cadence-CQ2zXKGN.js +0 -1
- package/dist/ui/assets/cairo-DLTphjLi.js +0 -1
- package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +0 -1
- package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +0 -1
- package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +0 -1
- package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +0 -1
- package/dist/ui/assets/clarity-SemFz856.js +0 -1
- package/dist/ui/assets/clojure-DqKBuwfJ.js +0 -1
- package/dist/ui/assets/cmake-Bj61d0ZC.js +0 -1
- package/dist/ui/assets/cobol-I_17IuGe.js +0 -1
- package/dist/ui/assets/codeowners-C8r90Shi.js +0 -1
- package/dist/ui/assets/codeql-oeQT6MSM.js +0 -1
- package/dist/ui/assets/coffee-C0B8hmok.js +0 -1
- package/dist/ui/assets/common-lisp-Cv5bFMCO.js +0 -1
- package/dist/ui/assets/coq-BrsZFFmf.js +0 -1
- package/dist/ui/assets/cpp-DDJXt6Vs.js +0 -1
- package/dist/ui/assets/crystal-Bexqace6.js +0 -1
- package/dist/ui/assets/csharp-Ct8U2NOr.js +0 -1
- package/dist/ui/assets/css-DSQhw_9R.js +0 -1
- package/dist/ui/assets/csv-Dx-8-gkx.js +0 -1
- package/dist/ui/assets/cue-CE9AQfxI.js +0 -1
- package/dist/ui/assets/cypher-ClKdZ_lG.js +0 -1
- package/dist/ui/assets/d-qD-0Kul2.js +0 -1
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +0 -1
- package/dist/ui/assets/dart-DkHntEIa.js +0 -1
- package/dist/ui/assets/dax-BkyTk9wS.js +0 -1
- package/dist/ui/assets/desktop-Dlh5hvp9.js +0 -1
- package/dist/ui/assets/diff-woXpYk--.js +0 -1
- package/dist/ui/assets/docker-IyjqRm3v.js +0 -1
- package/dist/ui/assets/dotenv-_5a1GRtc.js +0 -1
- package/dist/ui/assets/dracula-BHWKrbxM.js +0 -1
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +0 -1
- package/dist/ui/assets/dream-maker-DW3nJb8Q.js +0 -1
- package/dist/ui/assets/edge-Z8YYkHOr.js +0 -1
- package/dist/ui/assets/elixir-CG9uKtAF.js +0 -1
- package/dist/ui/assets/elm-GfWG2IfT.js +0 -1
- package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +0 -1
- package/dist/ui/assets/erb-xe89e73J.js +0 -1
- package/dist/ui/assets/erlang-Cphh6RMH.js +0 -1
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +0 -1
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +0 -1
- package/dist/ui/assets/fennel-DQxkIbk2.js +0 -1
- package/dist/ui/assets/fish-BJitypiv.js +0 -1
- package/dist/ui/assets/fluent-C03EYrpw.js +0 -1
- package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +0 -1
- package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +0 -1
- package/dist/ui/assets/fsharp-D13ZGOAj.js +0 -1
- package/dist/ui/assets/gdresource-C0sCabJj.js +0 -1
- package/dist/ui/assets/gdscript-Cp2uCuqX.js +0 -1
- package/dist/ui/assets/gdshader-CBce3t8t.js +0 -1
- package/dist/ui/assets/genie-CV2tkWYe.js +0 -1
- package/dist/ui/assets/gherkin-DExj1W_8.js +0 -1
- package/dist/ui/assets/git-commit-BSykSTBG.js +0 -1
- package/dist/ui/assets/git-rebase-CoTL_uSE.js +0 -1
- package/dist/ui/assets/github-dark-C-LZuMrd.js +0 -1
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +0 -1
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +0 -1
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +0 -1
- package/dist/ui/assets/github-light-EUqPIrTm.js +0 -1
- package/dist/ui/assets/github-light-default-BXViO-2h.js +0 -1
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +0 -1
- package/dist/ui/assets/gleam-CSRkHgEL.js +0 -1
- package/dist/ui/assets/glimmer-js-DAn4UCSu.js +0 -1
- package/dist/ui/assets/glimmer-ts-Tjyi6Gh5.js +0 -1
- package/dist/ui/assets/glsl-CtTDZoqR.js +0 -1
- package/dist/ui/assets/gn-ilITqXS6.js +0 -1
- package/dist/ui/assets/gnuplot-7GGW24-e.js +0 -1
- package/dist/ui/assets/go-BJwz_mda.js +0 -1
- package/dist/ui/assets/graphql-D5gcC_Jk.js +0 -1
- package/dist/ui/assets/groovy-CacY0gHj.js +0 -1
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +0 -1
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +0 -1
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -1
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +0 -1
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +0 -1
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +0 -1
- package/dist/ui/assets/hack-BJXY27dt.js +0 -1
- package/dist/ui/assets/haml-BLfFoZf7.js +0 -1
- package/dist/ui/assets/handlebars-Dw6CWkvN.js +0 -1
- package/dist/ui/assets/haskell-D8IpX4py.js +0 -1
- package/dist/ui/assets/haxe-OTjmBuCE.js +0 -1
- package/dist/ui/assets/hcl-Dh228itO.js +0 -1
- package/dist/ui/assets/heavy-payload-Dcg0-F-S.js +0 -4
- package/dist/ui/assets/hjson-CxZEssPk.js +0 -1
- package/dist/ui/assets/hlsl-Cvrh5tZx.js +0 -1
- package/dist/ui/assets/horizon-CE9ld1lL.js +0 -1
- package/dist/ui/assets/horizon-bright-Br1oVSNq.js +0 -1
- package/dist/ui/assets/houston-CsvMBhTu.js +0 -1
- package/dist/ui/assets/html-CAcAWvoN.js +0 -1
- package/dist/ui/assets/html-derivative-8aSW2E_7.js +0 -1
- package/dist/ui/assets/http-B2YR_3V1.js +0 -1
- package/dist/ui/assets/hurl-BnDJ9Zhf.js +0 -1
- package/dist/ui/assets/hxml-B0Qn7Nwc.js +0 -1
- package/dist/ui/assets/hy-CZbG8q4J.js +0 -1
- package/dist/ui/assets/imba-DsUTQ-LC.js +0 -1
- package/dist/ui/assets/ini-B5eOa1yu.js +0 -1
- package/dist/ui/assets/java-Doxi4W8u.js +0 -1
- package/dist/ui/assets/javascript-BbRdEqti.js +0 -1
- package/dist/ui/assets/jinja-CS3Tpv_Q.js +0 -1
- package/dist/ui/assets/jison-BkPGYVHR.js +0 -1
- package/dist/ui/assets/json-BMt1m3m8.js +0 -1
- package/dist/ui/assets/json5-BR5RXkoi.js +0 -1
- package/dist/ui/assets/jsonc-CYpm1nAK.js +0 -1
- package/dist/ui/assets/jsonl-CmCQp5Yx.js +0 -1
- package/dist/ui/assets/jsonnet-CJTPZ8u_.js +0 -1
- package/dist/ui/assets/jssm-DXw9l8Rf.js +0 -1
- package/dist/ui/assets/jsx-CQKrJXXY.js +0 -1
- package/dist/ui/assets/julia-BuN7i2du.js +0 -1
- package/dist/ui/assets/just-BswEPFPu.js +0 -1
- package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +0 -1
- package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +0 -1
- package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +0 -1
- package/dist/ui/assets/kdl-CsD5j6eV.js +0 -1
- package/dist/ui/assets/kotlin-DhhofPvG.js +0 -1
- package/dist/ui/assets/kusto-BUv0MjJC.js +0 -1
- package/dist/ui/assets/laserwave-C_8bwKvT.js +0 -1
- package/dist/ui/assets/latex-DU2VyFfA.js +0 -1
- package/dist/ui/assets/lean-CewbzKMR.js +0 -1
- package/dist/ui/assets/less-DVTAwKKz.js +0 -1
- package/dist/ui/assets/light-plus-DVQuIRkW.js +0 -1
- package/dist/ui/assets/liquid-Cmz1L3dq.js +0 -1
- package/dist/ui/assets/llvm-Cm23YOpf.js +0 -1
- package/dist/ui/assets/log-BNLmms1o.js +0 -1
- package/dist/ui/assets/logo-Cluzi2Zq.js +0 -1
- package/dist/ui/assets/lua-CfVXhkaJ.js +0 -1
- package/dist/ui/assets/luau-CNKltnaQ.js +0 -1
- package/dist/ui/assets/make-Dixweg8N.js +0 -1
- package/dist/ui/assets/markdown-BYOwaDjH.js +0 -1
- package/dist/ui/assets/marko-C5bfqGiA.js +0 -1
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +0 -1
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +0 -1
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +0 -1
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +0 -1
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +0 -1
- package/dist/ui/assets/matlab-D7qyCx1q.js +0 -1
- package/dist/ui/assets/mdc-CVBXYfyq.js +0 -1
- package/dist/ui/assets/mdx-DQZ5AkYe.js +0 -1
- package/dist/ui/assets/mermaid-Bk4SNUv9.js +0 -1
- package/dist/ui/assets/min-dark-BSWPekZh.js +0 -1
- package/dist/ui/assets/min-light-DDpmG2fV.js +0 -1
- package/dist/ui/assets/mipsasm-BMqwQI7S.js +0 -1
- package/dist/ui/assets/mojo-BgCJLMeH.js +0 -1
- package/dist/ui/assets/monokai-CdkpiU2Y.js +0 -1
- package/dist/ui/assets/moonbit-CaWjb8XO.js +0 -1
- package/dist/ui/assets/move-B1IS1UjX.js +0 -1
- package/dist/ui/assets/narrat-_X_XdTYD.js +0 -1
- package/dist/ui/assets/nextflow-Bbiyy34d.js +0 -1
- package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +0 -1
- package/dist/ui/assets/nginx-CzJafxLa.js +0 -1
- package/dist/ui/assets/night-owl-DhmEMT88.js +0 -1
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +0 -1
- package/dist/ui/assets/nim-DABKtHtM.js +0 -1
- package/dist/ui/assets/nix-IvuFDN5E.js +0 -1
- package/dist/ui/assets/nord-Cb4Vim4T.js +0 -1
- package/dist/ui/assets/nushell-DcLAeLz5.js +0 -1
- package/dist/ui/assets/objective-c-D1A_Heim.js +0 -1
- package/dist/ui/assets/objective-cpp-BsSzOQcm.js +0 -1
- package/dist/ui/assets/ocaml-O90oeIOV.js +0 -1
- package/dist/ui/assets/odin-B1RWQWA5.js +0 -1
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +0 -1
- package/dist/ui/assets/one-light-D7Lr4KcI.js +0 -1
- package/dist/ui/assets/openscad-BUDT5pXO.js +0 -1
- package/dist/ui/assets/pascal-4ZHwLPI5.js +0 -1
- package/dist/ui/assets/perl-CBh7L3lZ.js +0 -1
- package/dist/ui/assets/php-DFbI9q5p.js +0 -1
- package/dist/ui/assets/pierre-dark-sU4Zdns8.js +0 -1
- package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +0 -1
- package/dist/ui/assets/pierre-light-DWBk51d8.js +0 -1
- package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +0 -1
- package/dist/ui/assets/pkl-ot-7Btpt.js +0 -1
- package/dist/ui/assets/plastic-DQwYfKfQ.js +0 -1
- package/dist/ui/assets/plsql-DGHpHOYJ.js +0 -1
- package/dist/ui/assets/po-BiJDBrnU.js +0 -1
- package/dist/ui/assets/poimandres-DRFjx7u4.js +0 -1
- package/dist/ui/assets/polar-C7UOKdEL.js +0 -1
- package/dist/ui/assets/postcss-BXeXVLqQ.js +0 -1
- package/dist/ui/assets/powerquery-DNMTfnFr.js +0 -1
- package/dist/ui/assets/powershell-DshXNtvi.js +0 -1
- package/dist/ui/assets/prisma-BsRQq5mF.js +0 -1
- package/dist/ui/assets/prolog-iXnhIJG7.js +0 -1
- package/dist/ui/assets/proto-DB4EqR-F.js +0 -1
- package/dist/ui/assets/pug-C_PxC7gO.js +0 -1
- package/dist/ui/assets/puppet-CDv2pdJW.js +0 -1
- package/dist/ui/assets/purescript-9MfHhQsQ.js +0 -1
- package/dist/ui/assets/python-gzcpVVnB.js +0 -1
- package/dist/ui/assets/qml-DtngoFFK.js +0 -1
- package/dist/ui/assets/qmldir-DCQb3MpD.js +0 -1
- package/dist/ui/assets/qss-Fe1Jh2GI.js +0 -1
- package/dist/ui/assets/r-DohkcevW.js +0 -1
- package/dist/ui/assets/racket-DcIDlBhZ.js +0 -1
- package/dist/ui/assets/raku-B3gFvitq.js +0 -1
- package/dist/ui/assets/razor-C4t8J0_E.js +0 -1
- package/dist/ui/assets/red-CJ3rzSJv.js +0 -1
- package/dist/ui/assets/reg-CRGYupPL.js +0 -1
- package/dist/ui/assets/regexp-OGbTbjgY.js +0 -1
- package/dist/ui/assets/rel-BtDbiS_P.js +0 -1
- package/dist/ui/assets/review-payload-C5Qz60Kq.js +0 -1
- package/dist/ui/assets/riscv-Ckw8ddFX.js +0 -1
- package/dist/ui/assets/ron-VUp2lXgN.js +0 -1
- package/dist/ui/assets/rose-pine-BthvhNj6.js +0 -1
- package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +0 -1
- package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +0 -1
- package/dist/ui/assets/rosmsg-CAekHB0j.js +0 -1
- package/dist/ui/assets/rst-CfBbbcvC.js +0 -1
- package/dist/ui/assets/ruby-Bw0mpxHY.js +0 -1
- package/dist/ui/assets/rust-Cfkwpbl8.js +0 -1
- package/dist/ui/assets/sas-Cs3s9JOf.js +0 -1
- package/dist/ui/assets/sass-DXrisJhu.js +0 -1
- package/dist/ui/assets/scala-DKOlJaKm.js +0 -1
- package/dist/ui/assets/scheme-DQCgrYNe.js +0 -1
- package/dist/ui/assets/scss-sRxNJS54.js +0 -1
- package/dist/ui/assets/sdbl-bTVj8UrX.js +0 -1
- package/dist/ui/assets/shaderlab-TOUzSsQk.js +0 -1
- package/dist/ui/assets/shellscript-B0X6wh0R.js +0 -1
- package/dist/ui/assets/shellsession-D2FdOioR.js +0 -1
- package/dist/ui/assets/slack-dark-DnToyrRv.js +0 -1
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +0 -1
- package/dist/ui/assets/smalltalk-B16xEiuN.js +0 -1
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +0 -1
- package/dist/ui/assets/solarized-dark-DV17i1UV.js +0 -1
- package/dist/ui/assets/solarized-light-DSh2HLQt.js +0 -1
- package/dist/ui/assets/solidity-CKzVLygQ.js +0 -1
- package/dist/ui/assets/soy-s6g9OjJ1.js +0 -1
- package/dist/ui/assets/sparql-D_iOobhT.js +0 -1
- package/dist/ui/assets/splunk-BC2Px7Mm.js +0 -1
- package/dist/ui/assets/sql-DVTnh5V-.js +0 -1
- package/dist/ui/assets/ssh-config-BgfXC-Er.js +0 -1
- package/dist/ui/assets/stata-DFIDiXF9.js +0 -1
- package/dist/ui/assets/stylus-B6D30XZt.js +0 -1
- package/dist/ui/assets/surrealql-DVfrsLyg.js +0 -1
- package/dist/ui/assets/svelte-D5GsxESq.js +0 -1
- package/dist/ui/assets/swift-DonLKvLd.js +0 -1
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +0 -1
- package/dist/ui/assets/system-verilog-DJ5XKQeo.js +0 -1
- package/dist/ui/assets/systemd-BxMlprV5.js +0 -1
- package/dist/ui/assets/talonscript-CohzipZa.js +0 -1
- package/dist/ui/assets/tasl-DMoTqEGO.js +0 -1
- package/dist/ui/assets/tcl-CZd0xW_V.js +0 -1
- package/dist/ui/assets/templ-DI-Zyqzd.js +0 -1
- package/dist/ui/assets/terraform-DswuEJGm.js +0 -1
- package/dist/ui/assets/tex-WHHmlbJI.js +0 -1
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +0 -1
- package/dist/ui/assets/toml-CcmNWLt0.js +0 -1
- package/dist/ui/assets/ts-tags-Dwpo2RFJ.js +0 -1
- package/dist/ui/assets/tsv-sltzmVWM.js +0 -1
- package/dist/ui/assets/tsx-ph_idaAW.js +0 -1
- package/dist/ui/assets/turtle-ByJddavk.js +0 -1
- package/dist/ui/assets/twig-YO17jFjR.js +0 -1
- package/dist/ui/assets/typescript-CbAxjhkl.js +0 -1
- package/dist/ui/assets/typespec-B88KGewJ.js +0 -1
- package/dist/ui/assets/typst-DI99ib-x.js +0 -1
- package/dist/ui/assets/useFileDiffInstance-B2DLX3Vg.js +0 -244
- package/dist/ui/assets/v-DETTlOr0.js +0 -1
- package/dist/ui/assets/vala-zf12oZj6.js +0 -1
- package/dist/ui/assets/vb-Djn5o6TS.js +0 -1
- package/dist/ui/assets/verilog-CiiDBU1e.js +0 -1
- package/dist/ui/assets/vesper-D5bVUKB1.js +0 -1
- package/dist/ui/assets/vhdl-BroJfC0k.js +0 -1
- package/dist/ui/assets/viml-DvXPmvsu.js +0 -1
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +0 -1
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +0 -1
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +0 -1
- package/dist/ui/assets/vue-CraHL-Ps.js +0 -1
- package/dist/ui/assets/vue-html-e9tyZNtS.js +0 -1
- package/dist/ui/assets/vue-vine-CofmxaUb.js +0 -1
- package/dist/ui/assets/vyper-CgoNMtux.js +0 -1
- package/dist/ui/assets/wasm-BnjxR4X6.js +0 -1
- package/dist/ui/assets/wasm-ByWQv1Qj.js +0 -1
- package/dist/ui/assets/wenyan-C8pVoKbM.js +0 -1
- package/dist/ui/assets/wgsl-BsKzXJz4.js +0 -1
- package/dist/ui/assets/wikitext-ClFFjSW2.js +0 -1
- package/dist/ui/assets/wit-DdvCle-K.js +0 -1
- package/dist/ui/assets/wolfram-DLL8P-h_.js +0 -1
- package/dist/ui/assets/workspace-app-8--oTbCd.css +0 -1
- package/dist/ui/assets/xml-BWSdPZHm.js +0 -1
- package/dist/ui/assets/xsl-BtCt7Hx8.js +0 -1
- package/dist/ui/assets/yaml-BZiTw7cQ.js +0 -1
- package/dist/ui/assets/zenscript-BnlCZFoB.js +0 -1
- package/dist/ui/assets/zig-CMLA9XwU.js +0 -1
- package/docs/assets/auvrynt-logo-light.png +0 -0
- package/docs/assets/auvrynt-screenshot.png +0 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
const MAX_COMMAND_LENGTH = 512;
|
|
3
|
+
const MAX_OUTPUT_BYTES = 64 * 1024;
|
|
4
|
+
const COMMAND_TIMEOUT_MS = 30_000;
|
|
5
|
+
export async function selectNativeWorkspaceFolder(initialPath) {
|
|
6
|
+
if (process.platform === "win32")
|
|
7
|
+
return selectWindowsFolder(initialPath);
|
|
8
|
+
if (process.platform === "darwin") {
|
|
9
|
+
const script = 'POSIX path of (choose folder with prompt "Choose Auvrynt workspace")';
|
|
10
|
+
return cleanSelectedPath(await runPicker("osascript", ["-e", script], initialPath));
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const zenity = await runPicker("zenity", ["--file-selection", "--directory", "--title=Choose Auvrynt workspace", `--filename=${withTrailingSeparator(initialPath)}`], initialPath);
|
|
14
|
+
return cleanSelectedPath(zenity);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (!isMissingExecutable(error))
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const kdialog = await runPicker("kdialog", ["--getexistingdirectory", initialPath, "--title", "Choose Auvrynt workspace"], initialPath);
|
|
22
|
+
return cleanSelectedPath(kdialog);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (!isMissingExecutable(error))
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
throw new Error("No native folder picker is available. Install zenity or kdialog.");
|
|
29
|
+
}
|
|
30
|
+
export function parseAuvryntDashboardCommand(command) {
|
|
31
|
+
const trimmed = command.trim();
|
|
32
|
+
if (!trimmed)
|
|
33
|
+
throw new Error("Enter an Auvrynt command.");
|
|
34
|
+
if (trimmed.length > MAX_COMMAND_LENGTH)
|
|
35
|
+
throw new Error(`Command exceeds ${MAX_COMMAND_LENGTH} characters.`);
|
|
36
|
+
const tokens = [];
|
|
37
|
+
let current = "";
|
|
38
|
+
let quote;
|
|
39
|
+
for (let index = 0; index < trimmed.length; index++) {
|
|
40
|
+
const char = trimmed[index];
|
|
41
|
+
const next = trimmed[index + 1];
|
|
42
|
+
if (char === "\\" && quote !== "'" && next) {
|
|
43
|
+
const escapable = next === "\\"
|
|
44
|
+
|| next === '"'
|
|
45
|
+
|| (!quote && (next === "'" || /\s/.test(next)));
|
|
46
|
+
if (escapable) {
|
|
47
|
+
current += next;
|
|
48
|
+
index++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (quote) {
|
|
53
|
+
if (char === quote)
|
|
54
|
+
quote = undefined;
|
|
55
|
+
else
|
|
56
|
+
current += char;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (char === "'" || char === '"') {
|
|
60
|
+
quote = char;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (/\s/.test(char)) {
|
|
64
|
+
if (current)
|
|
65
|
+
tokens.push(current);
|
|
66
|
+
current = "";
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
current += char;
|
|
70
|
+
}
|
|
71
|
+
if (quote)
|
|
72
|
+
throw new Error("Command contains an unclosed quote.");
|
|
73
|
+
if (current)
|
|
74
|
+
tokens.push(current);
|
|
75
|
+
const auvryntIndex = tokens.findIndex((token) => token.toLowerCase() === "auvrynt");
|
|
76
|
+
if (auvryntIndex < 0) {
|
|
77
|
+
throw new Error("Only Auvrynt CLI commands are allowed here. Include `auvrynt` after any AUVRYNT_ environment assignments.");
|
|
78
|
+
}
|
|
79
|
+
const commandEnv = {};
|
|
80
|
+
for (const assignment of tokens.slice(0, auvryntIndex)) {
|
|
81
|
+
const match = assignment.match(/^(AUVRYNT_[A-Z0-9_]+)=(.*)$/);
|
|
82
|
+
if (!match)
|
|
83
|
+
throw new Error("Only AUVRYNT_ environment assignments may appear before `auvrynt`.");
|
|
84
|
+
if (isSensitiveName(match[1])) {
|
|
85
|
+
throw new Error("Sensitive token, authentication, and password environment values are not allowed in the dashboard terminal.");
|
|
86
|
+
}
|
|
87
|
+
commandEnv[match[1]] = match[2];
|
|
88
|
+
}
|
|
89
|
+
return { args: tokens.slice(auvryntIndex + 1), env: commandEnv };
|
|
90
|
+
}
|
|
91
|
+
export function assertDashboardCommandSupported(args) {
|
|
92
|
+
const command = args[0]?.toLowerCase() ?? "";
|
|
93
|
+
if (!command)
|
|
94
|
+
throw new Error("Choose a specific non-interactive Auvrynt subcommand, such as `auvrynt status`.");
|
|
95
|
+
const blocked = new Map([
|
|
96
|
+
["serve", "`auvrynt serve` cannot run inside the already-running dashboard server."],
|
|
97
|
+
["token", "Token commands are hidden from the dashboard for security. Run them in a local terminal."],
|
|
98
|
+
["uninstall", "Uninstall is not available from the dashboard terminal."],
|
|
99
|
+
["init", "Interactive setup commands must run in a local terminal."],
|
|
100
|
+
["setup", "Interactive setup commands must run in a local terminal."],
|
|
101
|
+
["enable", "Use the Connectivity tab or a local terminal for interactive integration selection."],
|
|
102
|
+
["disable", "Use the Connectivity tab or a local terminal for interactive integration selection."],
|
|
103
|
+
["tunnel", "Interactive tunnel selection must run in a local terminal."],
|
|
104
|
+
["change", "Use the Connectivity workspace picker so the selected folder is applied safely."],
|
|
105
|
+
["restart", "Use the dashboard Restart button so reconnection is handled correctly."],
|
|
106
|
+
["stop", "Use the dashboard Stop button so shutdown is handled correctly."],
|
|
107
|
+
]);
|
|
108
|
+
const reason = blocked.get(command);
|
|
109
|
+
if (reason)
|
|
110
|
+
throw new Error(reason);
|
|
111
|
+
if (command === "config" && args[1]?.toLowerCase() === "get") {
|
|
112
|
+
throw new Error("Configuration output may contain local secrets. Run `auvrynt config get` in a local terminal.");
|
|
113
|
+
}
|
|
114
|
+
if (command === "config" && args[1]?.toLowerCase() === "set" && isSensitiveName(args[2] ?? "")) {
|
|
115
|
+
throw new Error("Sensitive configuration values must be changed from a local terminal.");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export async function runAuvryntDashboardCommand(command, cwd, entrypoint = process.argv[1]) {
|
|
119
|
+
if (!entrypoint)
|
|
120
|
+
throw new Error("Auvrynt CLI entrypoint is unavailable.");
|
|
121
|
+
const parsed = parseAuvryntDashboardCommand(command);
|
|
122
|
+
assertDashboardCommandSupported(parsed.args);
|
|
123
|
+
return new Promise((resolve, reject) => {
|
|
124
|
+
const child = spawn(process.execPath, [entrypoint, ...parsed.args], {
|
|
125
|
+
cwd,
|
|
126
|
+
env: { ...process.env, ...parsed.env, NO_COLOR: "1", FORCE_COLOR: "0" },
|
|
127
|
+
windowsHide: true,
|
|
128
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
129
|
+
});
|
|
130
|
+
let output = "";
|
|
131
|
+
let timedOut = false;
|
|
132
|
+
const append = (chunk) => {
|
|
133
|
+
if (Buffer.byteLength(output) >= MAX_OUTPUT_BYTES)
|
|
134
|
+
return;
|
|
135
|
+
output += String(chunk);
|
|
136
|
+
if (Buffer.byteLength(output) > MAX_OUTPUT_BYTES) {
|
|
137
|
+
output = Buffer.from(output).subarray(0, MAX_OUTPUT_BYTES).toString("utf8") + "\n… output truncated …\n";
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
child.stdout?.on("data", append);
|
|
141
|
+
child.stderr?.on("data", append);
|
|
142
|
+
const timer = setTimeout(() => {
|
|
143
|
+
timedOut = true;
|
|
144
|
+
child.kill();
|
|
145
|
+
}, COMMAND_TIMEOUT_MS);
|
|
146
|
+
timer.unref();
|
|
147
|
+
child.once("error", (error) => {
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
reject(error);
|
|
150
|
+
});
|
|
151
|
+
child.once("close", (exitCode) => {
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
resolve({
|
|
154
|
+
command: command.trim(),
|
|
155
|
+
output: output.trimEnd() || (timedOut ? "Command timed out." : "Command completed with no output."),
|
|
156
|
+
exitCode,
|
|
157
|
+
timedOut,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async function selectWindowsFolder(initialPath) {
|
|
163
|
+
// Modern Vista+ folder picker (IFileOpenDialog + FOS_PICKFOLDERS).
|
|
164
|
+
// Avoids the classic tree-style FolderBrowserDialog ("Browse For Folder").
|
|
165
|
+
const csharp = [
|
|
166
|
+
"using System;",
|
|
167
|
+
"using System.Runtime.InteropServices;",
|
|
168
|
+
"public static class AuvryntFolderPicker {",
|
|
169
|
+
" [DllImport(\"shell32.dll\", CharSet = CharSet.Unicode)]",
|
|
170
|
+
" static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string path, IntPtr pbc, ref Guid riid, out IShellItem item);",
|
|
171
|
+
" [ComImport, Guid(\"DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7\")] class FileOpenDialogRCW {}",
|
|
172
|
+
" [ComImport, Guid(\"42f85136-db7e-439e-9acc-46061d997987\"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]",
|
|
173
|
+
" interface IFileOpenDialog {",
|
|
174
|
+
" [PreserveSig] int Show(IntPtr parent); void SetFileTypes(uint c, IntPtr rg); void SetFileTypeIndex(uint i);",
|
|
175
|
+
" void GetFileTypeIndex(out uint i); void Advise(IntPtr pfde, out uint cookie); void Unadvise(uint cookie);",
|
|
176
|
+
" void SetOptions(uint fos); void GetOptions(out uint fos); void SetDefaultFolder(IShellItem psi);",
|
|
177
|
+
" void SetFolder(IShellItem psi); void GetFolder(out IShellItem psi); void GetCurrentSelection(out IShellItem psi);",
|
|
178
|
+
" void SetFileName([MarshalAs(UnmanagedType.LPWStr)] string name); void GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string name);",
|
|
179
|
+
" void SetTitle([MarshalAs(UnmanagedType.LPWStr)] string title); void SetOkButtonLabel([MarshalAs(UnmanagedType.LPWStr)] string label);",
|
|
180
|
+
" void SetFileNameLabel([MarshalAs(UnmanagedType.LPWStr)] string label); void GetResult(out IShellItem psi);",
|
|
181
|
+
" void AddPlace(IShellItem psi, int fdap); void SetDefaultExtension([MarshalAs(UnmanagedType.LPWStr)] string ext);",
|
|
182
|
+
" void Close(int hr); void SetClientGuid(ref Guid guid); void ClearClientData(); void SetFilter(IntPtr pFilter);",
|
|
183
|
+
" void GetResults(out IntPtr ppenum); void GetSelectedItems(out IntPtr ppsai);",
|
|
184
|
+
" }",
|
|
185
|
+
" [ComImport, Guid(\"43826D1E-E718-42EE-BC55-A1E261C37BFE\"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]",
|
|
186
|
+
" interface IShellItem {",
|
|
187
|
+
" void BindToHandler(IntPtr pbc, ref Guid bhid, ref Guid riid, out IntPtr ppv);",
|
|
188
|
+
" void GetParent(out IShellItem ppsi);",
|
|
189
|
+
" void GetDisplayName(uint sigdn, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName);",
|
|
190
|
+
" void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs);",
|
|
191
|
+
" void Compare(IShellItem psi, uint hint, out int piOrder);",
|
|
192
|
+
" }",
|
|
193
|
+
" const uint FOS_PICKFOLDERS = 0x20; const uint FOS_FORCEFILESYSTEM = 0x40; const uint FOS_PATHMUSTEXIST = 0x1000; const uint SIGDN_FILESYSPATH = 0x80058000;",
|
|
194
|
+
" public static string Select(string title, string initial) {",
|
|
195
|
+
" var dialog = (IFileOpenDialog)new FileOpenDialogRCW();",
|
|
196
|
+
" uint options; dialog.GetOptions(out options);",
|
|
197
|
+
" dialog.SetOptions(options | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST);",
|
|
198
|
+
" dialog.SetTitle(title ?? \"Choose Auvrynt workspace\");",
|
|
199
|
+
" if (!string.IsNullOrWhiteSpace(initial)) {",
|
|
200
|
+
" try {",
|
|
201
|
+
" Guid iid = typeof(IShellItem).GUID; IShellItem folder;",
|
|
202
|
+
" if (SHCreateItemFromParsingName(initial, IntPtr.Zero, ref iid, out folder) == 0) dialog.SetFolder(folder);",
|
|
203
|
+
" } catch {}",
|
|
204
|
+
" }",
|
|
205
|
+
" if (dialog.Show(IntPtr.Zero) != 0) return null;",
|
|
206
|
+
" IShellItem result; dialog.GetResult(out result); string path; result.GetDisplayName(SIGDN_FILESYSPATH, out path); return path;",
|
|
207
|
+
" }",
|
|
208
|
+
"}",
|
|
209
|
+
].join("\n");
|
|
210
|
+
const script = [
|
|
211
|
+
`$code = @'\n${csharp}\n'@`,
|
|
212
|
+
"Add-Type -TypeDefinition $code -Language CSharp",
|
|
213
|
+
"$initial = $env:AUVRYNT_PICKER_INITIAL",
|
|
214
|
+
"if (-not $initial -or -not (Test-Path -LiteralPath $initial)) { $initial = [Environment]::GetFolderPath('Desktop') }",
|
|
215
|
+
"$path = [AuvryntFolderPicker]::Select('Choose Auvrynt workspace', $initial)",
|
|
216
|
+
"if ($path) { [Console]::Out.Write($path) }",
|
|
217
|
+
].join("; ");
|
|
218
|
+
try {
|
|
219
|
+
return cleanSelectedPath(await runPicker("powershell.exe", ["-NoProfile", "-STA", "-Command", script], initialPath));
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (isMissingExecutable(error)) {
|
|
223
|
+
throw new Error("Windows PowerShell is unavailable, so the native workspace picker cannot be opened.");
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function runPicker(executable, args, initialPath) {
|
|
229
|
+
return new Promise((resolve, reject) => {
|
|
230
|
+
const child = spawn(executable, args, {
|
|
231
|
+
env: { ...process.env, AUVRYNT_PICKER_INITIAL: initialPath },
|
|
232
|
+
windowsHide: true,
|
|
233
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
234
|
+
});
|
|
235
|
+
let stdout = "";
|
|
236
|
+
let stderr = "";
|
|
237
|
+
child.stdout?.on("data", (chunk) => { stdout += String(chunk); });
|
|
238
|
+
child.stderr?.on("data", (chunk) => { stderr += String(chunk); });
|
|
239
|
+
let settled = false;
|
|
240
|
+
const finish = (result, error) => {
|
|
241
|
+
if (settled)
|
|
242
|
+
return;
|
|
243
|
+
settled = true;
|
|
244
|
+
if (error)
|
|
245
|
+
reject(error);
|
|
246
|
+
else
|
|
247
|
+
resolve(result);
|
|
248
|
+
};
|
|
249
|
+
child.once("error", (error) => finish(undefined, error));
|
|
250
|
+
child.once("close", (code) => {
|
|
251
|
+
if (code === 0) {
|
|
252
|
+
finish(stdout);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (pickerWasCanceled(code, stdout, stderr)) {
|
|
256
|
+
finish(undefined);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
finish(undefined, new Error(stderr.trim() || `${executable} exited with code ${code}.`));
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function cleanSelectedPath(value) {
|
|
264
|
+
const path = value?.trim();
|
|
265
|
+
return path || undefined;
|
|
266
|
+
}
|
|
267
|
+
function pickerWasCanceled(code, stdout, stderr) {
|
|
268
|
+
if (stdout.trim())
|
|
269
|
+
return false;
|
|
270
|
+
if (code === 1 && !stderr.trim())
|
|
271
|
+
return true;
|
|
272
|
+
return /user canceled|user cancelled|\(-128\)/i.test(stderr);
|
|
273
|
+
}
|
|
274
|
+
function isMissingExecutable(error) {
|
|
275
|
+
return error?.code === "ENOENT";
|
|
276
|
+
}
|
|
277
|
+
function withTrailingSeparator(path) {
|
|
278
|
+
return /[\\/]$/.test(path) ? path : `${path}/`;
|
|
279
|
+
}
|
|
280
|
+
function isSensitiveName(value) {
|
|
281
|
+
return /(TOKEN|SECRET|PASSWORD|OWNER|AUTH|PRIVATE|CREDENTIAL)/i.test(value);
|
|
282
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
import { hardenHttpServer } from "../http-server-hardening.js";
|
|
4
|
+
import { isLoopbackRequest, logEvent } from "../logger.js";
|
|
5
|
+
import { discoverLocalIntegrations, processDetected, } from "../integration-discovery.js";
|
|
6
|
+
import { getGlobalGodotPluginStatus } from "../godot-tools.js";
|
|
7
|
+
import { getPlaywrightRuntimeStatus } from "../playwright-runtime.js";
|
|
8
|
+
import { loadAuvryntFiles } from "../user-config.js";
|
|
9
|
+
import { INTEGRATION_KEYS, } from "../background-lifecycle.js";
|
|
10
|
+
import { tunnelProviderLabel } from "../tunnels/tunnel-manager.js";
|
|
11
|
+
import { dashboardUrl, httpUrl, RUNNING_COMMAND_HINTS, scheduleCrashRecovery, writeFatalLog, } from "./runtime-support.js";
|
|
12
|
+
import { checkSqliteNative } from "./commands/status-commands.js";
|
|
13
|
+
import { registerDashboardActions } from "./dashboard-actions.js";
|
|
14
|
+
import { applyDetectedSerenaDefault } from "./serena-detected-default.js";
|
|
15
|
+
import { startTunnelHealthMonitor } from "./tunnel-health-monitor.js";
|
|
16
|
+
export async function serveForegroundServer() {
|
|
17
|
+
const sqliteStatus = checkSqliteNative();
|
|
18
|
+
if (sqliteStatus !== "ok") {
|
|
19
|
+
throw new Error([
|
|
20
|
+
"better-sqlite3 could not load for this Node runtime.",
|
|
21
|
+
sqliteStatus,
|
|
22
|
+
"",
|
|
23
|
+
"Try reinstalling or rebuilding dependencies under the active Node version:",
|
|
24
|
+
" npm rebuild better-sqlite3",
|
|
25
|
+
].join("\n"));
|
|
26
|
+
}
|
|
27
|
+
const { createServer } = await import("../server.js");
|
|
28
|
+
const config = loadConfig();
|
|
29
|
+
const integrationStatus = await discoverLocalIntegrations().catch(() => ({
|
|
30
|
+
processes: [], executables: {}, ports: {},
|
|
31
|
+
}));
|
|
32
|
+
applyDetectedSerenaDefault(config, integrationStatus, loadAuvryntFiles().config);
|
|
33
|
+
const runningServer = createServer(config);
|
|
34
|
+
const { app } = runningServer;
|
|
35
|
+
const startMode = process.env.AUVRYNT_START_MODE === "true";
|
|
36
|
+
let fatalExitStarted = false;
|
|
37
|
+
const exitAfterFatalError = (type, error) => {
|
|
38
|
+
if (fatalExitStarted)
|
|
39
|
+
return;
|
|
40
|
+
fatalExitStarted = true;
|
|
41
|
+
writeFatalLog(config.stateDir, type, error);
|
|
42
|
+
scheduleCrashRecovery(config.stateDir, type);
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
setImmediate(() => process.exit(1));
|
|
45
|
+
};
|
|
46
|
+
process.once("uncaughtException", (error, origin) => {
|
|
47
|
+
exitAfterFatalError(`uncaughtException:${origin}`, error);
|
|
48
|
+
});
|
|
49
|
+
process.once("unhandledRejection", (reason) => {
|
|
50
|
+
exitAfterFatalError("unhandledRejection", reason);
|
|
51
|
+
});
|
|
52
|
+
const publicMcpUrl = config.publicBaseUrl
|
|
53
|
+
? `${config.publicBaseUrl.replace(/\/$/, "")}/mcp`
|
|
54
|
+
: httpUrl(config.host, config.port, "/mcp");
|
|
55
|
+
const godotPlugin = getGlobalGodotPluginStatus();
|
|
56
|
+
const godotIsSetup = Boolean(config.executables.godot || config.executables.godotCsharp);
|
|
57
|
+
const controlToken = process.env.AUVRYNT_CONTROL_TOKEN;
|
|
58
|
+
let requestShutdown;
|
|
59
|
+
const controlAuthorized = (authorization) => {
|
|
60
|
+
if (!controlToken || !authorization?.startsWith("Bearer "))
|
|
61
|
+
return false;
|
|
62
|
+
const provided = Buffer.from(authorization.slice("Bearer ".length));
|
|
63
|
+
const expected = Buffer.from(controlToken);
|
|
64
|
+
return provided.length === expected.length
|
|
65
|
+
&& timingSafeEqual(provided, expected);
|
|
66
|
+
};
|
|
67
|
+
registerDashboardActions({
|
|
68
|
+
runningServer,
|
|
69
|
+
config,
|
|
70
|
+
requestShutdown: () => { void requestShutdown?.(); },
|
|
71
|
+
});
|
|
72
|
+
if (controlToken) {
|
|
73
|
+
app.post("/__auvrynt/control/profiles", async (req, res) => {
|
|
74
|
+
if (!isLoopbackRequest(req)
|
|
75
|
+
|| !controlAuthorized(req.header("authorization"))) {
|
|
76
|
+
res.status(404).end();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const body = req.body;
|
|
80
|
+
const integrations = body?.integrations;
|
|
81
|
+
if (!integrations
|
|
82
|
+
|| typeof integrations !== "object"
|
|
83
|
+
|| !INTEGRATION_KEYS.every((key) => typeof integrations[key] === "boolean")) {
|
|
84
|
+
res.status(400).json({ error: "Invalid integration profile." });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const result = await runningServer.updateIntegrations(integrations, typeof body.serenaExecutable === "string"
|
|
88
|
+
? { serenaExecutable: body.serenaExecutable }
|
|
89
|
+
: undefined);
|
|
90
|
+
if (!result.updated) {
|
|
91
|
+
res.status(409).json({
|
|
92
|
+
error: "An MCP request is active; retry after it finishes.",
|
|
93
|
+
...result,
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
res.json(result);
|
|
98
|
+
});
|
|
99
|
+
app.post("/__auvrynt/control/shutdown", (req, res) => {
|
|
100
|
+
if (!isLoopbackRequest(req)
|
|
101
|
+
|| !controlAuthorized(req.header("authorization"))) {
|
|
102
|
+
res.status(404).end();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
res.status(202).json({ stopping: true });
|
|
106
|
+
setImmediate(() => void requestShutdown?.());
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
await new Promise((resolveServer, rejectServer) => {
|
|
110
|
+
const httpServer = app.listen(config.port, config.host, () => {
|
|
111
|
+
if (startMode) {
|
|
112
|
+
printManagedStartBanner(config, publicMcpUrl, godotPlugin.installed, godotIsSetup, integrationStatus);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
printForegroundStartBanner(config);
|
|
116
|
+
}
|
|
117
|
+
hardenHttpServer(httpServer);
|
|
118
|
+
startTunnelHealthMonitor(config);
|
|
119
|
+
logEvent(config.logging, "info", "server_started", {
|
|
120
|
+
pid: process.pid,
|
|
121
|
+
host: config.host,
|
|
122
|
+
port: config.port,
|
|
123
|
+
publicMcpUrl,
|
|
124
|
+
integrations: config.integrations,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
let shutdownPromise;
|
|
128
|
+
const removeSignalHandlers = () => {
|
|
129
|
+
process.removeListener("SIGINT", shutdown);
|
|
130
|
+
process.removeListener("SIGTERM", shutdown);
|
|
131
|
+
};
|
|
132
|
+
const shutdown = () => {
|
|
133
|
+
if (shutdownPromise)
|
|
134
|
+
return shutdownPromise;
|
|
135
|
+
clearRuntimeIndicators();
|
|
136
|
+
shutdownPromise = new Promise((resolveShutdown, rejectShutdown) => {
|
|
137
|
+
const forceClose = setTimeout(() => httpServer.closeAllConnections(), 15_000);
|
|
138
|
+
forceClose.unref();
|
|
139
|
+
httpServer.close((error) => {
|
|
140
|
+
clearTimeout(forceClose);
|
|
141
|
+
if (error) {
|
|
142
|
+
rejectShutdown(error);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
void runningServer.close().then(() => {
|
|
146
|
+
removeSignalHandlers();
|
|
147
|
+
resolveServer();
|
|
148
|
+
resolveShutdown();
|
|
149
|
+
}, rejectShutdown);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
return shutdownPromise;
|
|
153
|
+
};
|
|
154
|
+
requestShutdown = shutdown;
|
|
155
|
+
httpServer.once("error", (error) => {
|
|
156
|
+
removeSignalHandlers();
|
|
157
|
+
void runningServer.close()
|
|
158
|
+
.catch((closeError) => {
|
|
159
|
+
writeFatalLog(config.stateDir, "serverErrorCleanup", closeError);
|
|
160
|
+
})
|
|
161
|
+
.finally(() => rejectServer(error));
|
|
162
|
+
});
|
|
163
|
+
process.once("SIGINT", () => {
|
|
164
|
+
void shutdown().catch(() => {
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
process.once("SIGTERM", () => {
|
|
169
|
+
void shutdown().catch(() => {
|
|
170
|
+
process.exitCode = 1;
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function printManagedStartBanner(config, publicMcpUrl, godotPluginInstalled, godotIsSetup, integrationStatus) {
|
|
176
|
+
console.clear();
|
|
177
|
+
console.log("");
|
|
178
|
+
console.log(" \x1b[36m\x1b[1mAuvrynt: Webkit Arsenal is ready\x1b[0m");
|
|
179
|
+
console.log("");
|
|
180
|
+
const godotBridgeUp = integrationStatus.ports.auvrynt_godot_bridge;
|
|
181
|
+
const blenderBridgeUp = integrationStatus.ports.auvrynt_blender_bridge
|
|
182
|
+
|| integrationStatus.ports.blender_lab_mcp;
|
|
183
|
+
const godotConfigured = godotIsSetup || godotPluginInstalled;
|
|
184
|
+
const godotCsharpConfigured = Boolean(config.executables.godotCsharp);
|
|
185
|
+
const serenaConfigured = Boolean(process.env.AUVRYNT_SERENA_EXECUTABLE
|
|
186
|
+
|| integrationStatus.executables.serena
|
|
187
|
+
|| processDetected(integrationStatus, "serena"));
|
|
188
|
+
const playwrightReady = getPlaywrightRuntimeStatus().chromiumInstalled;
|
|
189
|
+
console.log(integrationLine("Godot GDScript:", godotBridgeUp, godotConfigured, config.integrations.godotGdscript));
|
|
190
|
+
console.log(integrationLine("Godot C#:", godotBridgeUp, godotCsharpConfigured, config.integrations.godotCsharp));
|
|
191
|
+
console.log(integrationLine("Blender:", blenderBridgeUp, true, config.integrations.blender));
|
|
192
|
+
console.log(integrationLine("Serena:", serenaConfigured, serenaConfigured, config.integrations.serena));
|
|
193
|
+
console.log(integrationLine("Playwright:", playwrightReady, playwrightReady, config.integrations.playwright));
|
|
194
|
+
console.log("");
|
|
195
|
+
console.log(" \x1b[90mDashboard:\x1b[0m");
|
|
196
|
+
console.log(` \x1b[36m${dashboardUrl(config.host, config.port)}\x1b[0m`);
|
|
197
|
+
console.log(" \x1b[90mWeb Agent connector URL:\x1b[0m");
|
|
198
|
+
console.log(` \x1b[36m${publicMcpUrl}\x1b[0m`);
|
|
199
|
+
console.log(" \x1b[90mAuthorization page:\x1b[0m");
|
|
200
|
+
console.log(` \x1b[36m${config.publicBaseUrl.replace(/\/$/, "")}/authorize\x1b[0m`);
|
|
201
|
+
console.log(" \x1b[90mOwner token:\x1b[0m");
|
|
202
|
+
console.log(" \x1b[33mhidden — run `auvrynt token` locally to view\x1b[0m");
|
|
203
|
+
console.log("");
|
|
204
|
+
console.log(" \x1b[90mNote:\x1b[0m");
|
|
205
|
+
console.log(` Web-agent workspace: ${config.allowedRoots.join(", ")}`);
|
|
206
|
+
if (config.tunnelProvider === "ngrok" && config.ngrokUrl) {
|
|
207
|
+
console.log(` Stable ngrok URL: ${config.ngrokUrl}`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
console.log(` The ${tunnelProviderLabel(config.tunnelProvider)} URL is temporary.`);
|
|
211
|
+
console.log(" Server restarts preserve this URL while the managed tunnel remains healthy.");
|
|
212
|
+
}
|
|
213
|
+
console.log("");
|
|
214
|
+
for (const hint of RUNNING_COMMAND_HINTS)
|
|
215
|
+
console.log(` \x1b[90m${hint}\x1b[0m`);
|
|
216
|
+
console.log("");
|
|
217
|
+
if (!process.stdout.isTTY) {
|
|
218
|
+
console.log("[auvrynt] Background logging active.");
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
222
|
+
let frameIndex = 0;
|
|
223
|
+
let mcpEventsCount = 0;
|
|
224
|
+
let lastEvent = "Started successfully";
|
|
225
|
+
global.auvryntLogEmitter = (level, event) => {
|
|
226
|
+
mcpEventsCount++;
|
|
227
|
+
lastEvent = `${event} (${level})`;
|
|
228
|
+
};
|
|
229
|
+
const interval = setInterval(() => {
|
|
230
|
+
const frame = frames[frameIndex];
|
|
231
|
+
frameIndex = (frameIndex + 1) % frames.length;
|
|
232
|
+
process.stdout.write(`\r\x1b[K \x1b[32m${frame}\x1b[0m Logs active... (${mcpEventsCount} requests handled | Last: ${lastEvent})`);
|
|
233
|
+
}, 100);
|
|
234
|
+
global.auvryntStartInterval = interval;
|
|
235
|
+
}
|
|
236
|
+
function printForegroundStartBanner(config) {
|
|
237
|
+
console.log(`auvrynt listening on ${httpUrl(config.host, config.port, "/mcp")}`);
|
|
238
|
+
console.log(`public base url: ${config.publicBaseUrl}`);
|
|
239
|
+
console.log(`allowed roots: ${config.allowedRoots.join(", ")}`);
|
|
240
|
+
console.log(`allowed hosts: ${config.allowedHosts.join(", ")}`);
|
|
241
|
+
if (config.allowedHosts.includes("*")) {
|
|
242
|
+
console.warn("warning: Host header allowlist is disabled because AUVRYNT_ALLOWED_HOSTS=*");
|
|
243
|
+
}
|
|
244
|
+
console.log("auth: Owner token approval required");
|
|
245
|
+
console.log(`logging: ${config.logging.level} ${config.logging.format}`);
|
|
246
|
+
}
|
|
247
|
+
function integrationLine(label, reachable, configured, enabled = true) {
|
|
248
|
+
const padded = label.padEnd(20);
|
|
249
|
+
if (!enabled) {
|
|
250
|
+
return ` \x1b[90m${padded}\x1b[0m \x1b[90mdisabled\x1b[0m`;
|
|
251
|
+
}
|
|
252
|
+
if (reachable) {
|
|
253
|
+
return ` \x1b[90m${padded}\x1b[0m \x1b[32m200 OK\x1b[0m`;
|
|
254
|
+
}
|
|
255
|
+
if (configured) {
|
|
256
|
+
return ` \x1b[90m${padded}\x1b[0m \x1b[33moffline\x1b[0m`;
|
|
257
|
+
}
|
|
258
|
+
return ` \x1b[90m${padded}\x1b[0m \x1b[90mnot configured\x1b[0m`;
|
|
259
|
+
}
|
|
260
|
+
function clearRuntimeIndicators() {
|
|
261
|
+
if (global.auvryntStartInterval) {
|
|
262
|
+
clearInterval(global.auvryntStartInterval);
|
|
263
|
+
delete global.auvryntStartInterval;
|
|
264
|
+
}
|
|
265
|
+
if (global.auvryntTunnelCheckInterval) {
|
|
266
|
+
clearInterval(global.auvryntTunnelCheckInterval);
|
|
267
|
+
delete global.auvryntTunnelCheckInterval;
|
|
268
|
+
}
|
|
269
|
+
delete global.auvryntLogEmitter;
|
|
270
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { retryControlRequest } from "../control-retry.js";
|
|
2
|
+
import { INTEGRATION_KEYS, } from "../background-lifecycle.js";
|
|
3
|
+
import { httpUrl, localProbeHost } from "./runtime-support.js";
|
|
4
|
+
export function integrationsForProfiles(profiles) {
|
|
5
|
+
const enabled = new Set(profiles);
|
|
6
|
+
return Object.fromEntries(INTEGRATION_KEYS.map((key) => [key, enabled.has(key)]));
|
|
7
|
+
}
|
|
8
|
+
export async function postInstanceControl(active, path, body) {
|
|
9
|
+
if (!active.record.controlToken) {
|
|
10
|
+
throw new Error("The running Auvrynt instance predates live management. Run `auvrynt stop`, then start it again.");
|
|
11
|
+
}
|
|
12
|
+
return retryControlRequest(() => fetch(httpUrl(localProbeHost(active.record.host), active.record.port, path), {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: {
|
|
15
|
+
authorization: `Bearer ${active.record.controlToken}`,
|
|
16
|
+
...(body === undefined ? {} : { "content-type": "application/json" }),
|
|
17
|
+
},
|
|
18
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
19
|
+
signal: AbortSignal.timeout(10_000),
|
|
20
|
+
}), { maxAttempts: 20, maxDelayMs: 2_000 });
|
|
21
|
+
}
|