modular-voice-agent-sdk 1.0.0

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 (125) hide show
  1. package/README.md +102 -0
  2. package/USAGE.md +567 -0
  3. package/dist/backends/cloud/index.d.ts +7 -0
  4. package/dist/backends/cloud/index.d.ts.map +1 -0
  5. package/dist/backends/cloud/index.js +6 -0
  6. package/dist/backends/cloud/index.js.map +1 -0
  7. package/dist/backends/cloud/llm.d.ts +22 -0
  8. package/dist/backends/cloud/llm.d.ts.map +1 -0
  9. package/dist/backends/cloud/llm.js +234 -0
  10. package/dist/backends/cloud/llm.js.map +1 -0
  11. package/dist/backends/index.d.ts +2 -0
  12. package/dist/backends/index.d.ts.map +1 -0
  13. package/dist/backends/index.js +6 -0
  14. package/dist/backends/index.js.map +1 -0
  15. package/dist/backends/native/index.d.ts +5 -0
  16. package/dist/backends/native/index.d.ts.map +1 -0
  17. package/dist/backends/native/index.js +6 -0
  18. package/dist/backends/native/index.js.map +1 -0
  19. package/dist/backends/native/llm.d.ts +71 -0
  20. package/dist/backends/native/llm.d.ts.map +1 -0
  21. package/dist/backends/native/llm.js +435 -0
  22. package/dist/backends/native/llm.js.map +1 -0
  23. package/dist/backends/native/stt.d.ts +15 -0
  24. package/dist/backends/native/stt.d.ts.map +1 -0
  25. package/dist/backends/native/stt.js +94 -0
  26. package/dist/backends/native/stt.js.map +1 -0
  27. package/dist/backends/native/tts.d.ts +21 -0
  28. package/dist/backends/native/tts.d.ts.map +1 -0
  29. package/dist/backends/native/tts.js +105 -0
  30. package/dist/backends/native/tts.js.map +1 -0
  31. package/dist/backends/transformers/index.d.ts +4 -0
  32. package/dist/backends/transformers/index.d.ts.map +1 -0
  33. package/dist/backends/transformers/index.js +4 -0
  34. package/dist/backends/transformers/index.js.map +1 -0
  35. package/dist/backends/transformers/llm.d.ts +29 -0
  36. package/dist/backends/transformers/llm.d.ts.map +1 -0
  37. package/dist/backends/transformers/llm.js +117 -0
  38. package/dist/backends/transformers/llm.js.map +1 -0
  39. package/dist/backends/transformers/stt.d.ts +17 -0
  40. package/dist/backends/transformers/stt.d.ts.map +1 -0
  41. package/dist/backends/transformers/stt.js +43 -0
  42. package/dist/backends/transformers/stt.js.map +1 -0
  43. package/dist/backends/transformers/tts.d.ts +17 -0
  44. package/dist/backends/transformers/tts.d.ts.map +1 -0
  45. package/dist/backends/transformers/tts.js +40 -0
  46. package/dist/backends/transformers/tts.js.map +1 -0
  47. package/dist/cache.d.ts +37 -0
  48. package/dist/cache.d.ts.map +1 -0
  49. package/dist/cache.js +49 -0
  50. package/dist/cache.js.map +1 -0
  51. package/dist/cli.d.ts +11 -0
  52. package/dist/cli.d.ts.map +1 -0
  53. package/dist/cli.js +392 -0
  54. package/dist/cli.js.map +1 -0
  55. package/dist/client/audio-player.d.ts +45 -0
  56. package/dist/client/audio-player.d.ts.map +1 -0
  57. package/dist/client/audio-player.js +90 -0
  58. package/dist/client/audio-player.js.map +1 -0
  59. package/dist/client/audio-recorder.d.ts +42 -0
  60. package/dist/client/audio-recorder.d.ts.map +1 -0
  61. package/dist/client/audio-recorder.js +128 -0
  62. package/dist/client/audio-recorder.js.map +1 -0
  63. package/dist/client/index.d.ts +34 -0
  64. package/dist/client/index.d.ts.map +1 -0
  65. package/dist/client/index.js +33 -0
  66. package/dist/client/index.js.map +1 -0
  67. package/dist/client/protocol.d.ts +80 -0
  68. package/dist/client/protocol.d.ts.map +1 -0
  69. package/dist/client/protocol.js +29 -0
  70. package/dist/client/protocol.js.map +1 -0
  71. package/dist/client/voice-client.d.ts +249 -0
  72. package/dist/client/voice-client.d.ts.map +1 -0
  73. package/dist/client/voice-client.js +826 -0
  74. package/dist/client/voice-client.js.map +1 -0
  75. package/dist/client/web-speech-stt.d.ts +65 -0
  76. package/dist/client/web-speech-stt.d.ts.map +1 -0
  77. package/dist/client/web-speech-stt.js +122 -0
  78. package/dist/client/web-speech-stt.js.map +1 -0
  79. package/dist/client/web-speech-tts.d.ts +59 -0
  80. package/dist/client/web-speech-tts.d.ts.map +1 -0
  81. package/dist/client/web-speech-tts.js +145 -0
  82. package/dist/client/web-speech-tts.js.map +1 -0
  83. package/dist/index.d.ts +10 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +13 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/server/encoding.d.ts +18 -0
  88. package/dist/server/encoding.d.ts.map +1 -0
  89. package/dist/server/encoding.js +41 -0
  90. package/dist/server/encoding.js.map +1 -0
  91. package/dist/server/handler.d.ts +86 -0
  92. package/dist/server/handler.d.ts.map +1 -0
  93. package/dist/server/handler.js +224 -0
  94. package/dist/server/handler.js.map +1 -0
  95. package/dist/server/index.d.ts +31 -0
  96. package/dist/server/index.d.ts.map +1 -0
  97. package/dist/server/index.js +32 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/services/function-service.d.ts +17 -0
  100. package/dist/services/function-service.d.ts.map +1 -0
  101. package/dist/services/function-service.js +82 -0
  102. package/dist/services/function-service.js.map +1 -0
  103. package/dist/services/index.d.ts +4 -0
  104. package/dist/services/index.d.ts.map +1 -0
  105. package/dist/services/index.js +3 -0
  106. package/dist/services/index.js.map +1 -0
  107. package/dist/services/llm-logger.d.ts +136 -0
  108. package/dist/services/llm-logger.d.ts.map +1 -0
  109. package/dist/services/llm-logger.js +275 -0
  110. package/dist/services/llm-logger.js.map +1 -0
  111. package/dist/services/text-normalizer.d.ts +17 -0
  112. package/dist/services/text-normalizer.d.ts.map +1 -0
  113. package/dist/services/text-normalizer.js +100 -0
  114. package/dist/services/text-normalizer.js.map +1 -0
  115. package/dist/types.d.ts +195 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +48 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/voice-pipeline.d.ts +125 -0
  120. package/dist/voice-pipeline.d.ts.map +1 -0
  121. package/dist/voice-pipeline.js +390 -0
  122. package/dist/voice-pipeline.js.map +1 -0
  123. package/package.json +96 -0
  124. package/scripts/setup-binaries.sh +159 -0
  125. package/scripts/setup.sh +201 -0
@@ -0,0 +1,159 @@
1
+ #!/bin/bash
2
+ #
3
+ # Setup native binaries for modular-voice-agent-sdk
4
+ # Binaries are stored in ~/.cache/mvas/bin/
5
+ #
6
+ # Usage: npx mvas setup --binaries-only
7
+ #
8
+
9
+ set -e
10
+
11
+ # Use global cache directory
12
+ CACHE_DIR="${MVAS_CACHE:-$HOME/.cache/mvas}"
13
+ BIN_DIR="$CACHE_DIR/bin"
14
+
15
+ echo "Modular Voice Agent SDK - Binary Setup"
16
+ echo "======================================="
17
+ echo "Binary directory: $BIN_DIR"
18
+ echo ""
19
+
20
+ mkdir -p "$BIN_DIR"
21
+
22
+ cd "$BIN_DIR"
23
+
24
+ # Detect platform
25
+ OS="$(uname -s)"
26
+ ARCH="$(uname -m)"
27
+
28
+ # --- whisper.cpp ---
29
+ echo "==> Setting up whisper-cli..."
30
+ if [ -L "whisper-cli" ] || [ -f "whisper-cli" ]; then
31
+ echo " Already exists, skipping."
32
+ else
33
+ # Try to find whisper-cli from Homebrew or PATH
34
+ if command -v whisper-cli &> /dev/null; then
35
+ WHISPER_PATH="$(command -v whisper-cli)"
36
+ ln -s "$WHISPER_PATH" whisper-cli
37
+ echo " Linked to $WHISPER_PATH"
38
+ elif [ -f "/opt/homebrew/bin/whisper-cli" ]; then
39
+ ln -s /opt/homebrew/bin/whisper-cli whisper-cli
40
+ echo " Linked to /opt/homebrew/bin/whisper-cli"
41
+ elif [ -f "/usr/local/bin/whisper-cli" ]; then
42
+ ln -s /usr/local/bin/whisper-cli whisper-cli
43
+ echo " Linked to /usr/local/bin/whisper-cli"
44
+ else
45
+ echo " ⚠️ whisper-cli not found. Install with: brew install whisper-cpp"
46
+ fi
47
+ fi
48
+
49
+ # --- llama.cpp (llama-completion) ---
50
+ echo ""
51
+ echo "==> Setting up llama-completion..."
52
+ if [ -L "llama-completion" ] || [ -f "llama-completion" ]; then
53
+ echo " Already exists, skipping."
54
+ else
55
+ # Try to find llama-completion from PATH or common locations
56
+ if command -v llama-completion &> /dev/null; then
57
+ LLAMA_PATH="$(command -v llama-completion)"
58
+ ln -s "$LLAMA_PATH" llama-completion
59
+ echo " Linked to $LLAMA_PATH"
60
+ elif [ -f "/opt/homebrew/bin/llama-completion" ]; then
61
+ ln -s /opt/homebrew/bin/llama-completion llama-completion
62
+ echo " Linked to /opt/homebrew/bin/llama-completion"
63
+ elif [ -f "/usr/local/bin/llama-completion" ]; then
64
+ ln -s /usr/local/bin/llama-completion llama-completion
65
+ echo " Linked to /usr/local/bin/llama-completion"
66
+ else
67
+ echo " ⚠️ llama-completion not found."
68
+ echo " Install with: brew install llama.cpp"
69
+ echo " Or build from source: git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp && make"
70
+ fi
71
+ fi
72
+
73
+ # --- sherpa-onnx (TTS) ---
74
+ echo ""
75
+ echo "==> Setting up sherpa-onnx for $OS/$ARCH..."
76
+
77
+ if [ -f "sherpa-onnx-offline-tts" ]; then
78
+ echo " Already exists, skipping."
79
+ else
80
+ case "$OS" in
81
+ Darwin)
82
+ # macOS - universal binary (arm64 + x86_64)
83
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-osx-universal2-shared.tar.bz2"
84
+ SHERPA_DIR="sherpa-onnx-v1.12.20-osx-universal2-shared"
85
+ ;;
86
+ Linux)
87
+ if [ "$ARCH" = "x86_64" ]; then
88
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-linux-x64-shared.tar.bz2"
89
+ SHERPA_DIR="sherpa-onnx-v1.12.20-linux-x64-shared"
90
+ elif [ "$ARCH" = "aarch64" ]; then
91
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-linux-aarch64-shared.tar.bz2"
92
+ SHERPA_DIR="sherpa-onnx-v1.12.20-linux-aarch64-shared"
93
+ else
94
+ echo " Unsupported Linux architecture: $ARCH"
95
+ exit 1
96
+ fi
97
+ ;;
98
+ *)
99
+ echo " Unsupported OS: $OS"
100
+ echo " Download manually from: https://github.com/k2-fsa/sherpa-onnx/releases"
101
+ exit 1
102
+ ;;
103
+ esac
104
+
105
+ echo " Downloading from $SHERPA_URL..."
106
+ curl -L --progress-bar -o sherpa-onnx.tar.bz2 "$SHERPA_URL"
107
+ tar -xjf sherpa-onnx.tar.bz2
108
+
109
+ # Only copy the TTS binary we need (not all the extras)
110
+ cp "$SHERPA_DIR/bin/sherpa-onnx-offline-tts" .
111
+ mkdir -p lib
112
+ mv "$SHERPA_DIR/lib/"* lib/
113
+
114
+ # Fix library paths on macOS so binary can find libs in ./lib/
115
+ if [ "$OS" = "Darwin" ]; then
116
+ echo " Fixing library paths..."
117
+ for lib in lib/*.dylib; do
118
+ libname=$(basename "$lib")
119
+ install_name_tool -change "@rpath/$libname" "@executable_path/lib/$libname" sherpa-onnx-offline-tts 2>/dev/null || true
120
+ done
121
+ fi
122
+
123
+ # Cleanup
124
+ rm -rf "$SHERPA_DIR" sherpa-onnx.tar.bz2
125
+
126
+ echo " Done!"
127
+ fi
128
+
129
+ # ============ Summary ============
130
+
131
+ echo ""
132
+ echo "============================================================"
133
+ echo "Binary setup complete!"
134
+ echo "============================================================"
135
+ echo ""
136
+ echo "Binaries location: $BIN_DIR"
137
+ echo ""
138
+ ls -lh "$BIN_DIR" 2>/dev/null || true
139
+
140
+ # Check for missing dependencies
141
+ MISSING_BREW=""
142
+ [ ! -L "$BIN_DIR/whisper-cli" ] && [ ! -f "$BIN_DIR/whisper-cli" ] && MISSING_BREW="$MISSING_BREW whisper-cpp"
143
+ [ ! -L "$BIN_DIR/llama-completion" ] && [ ! -f "$BIN_DIR/llama-completion" ] && MISSING_BREW="$MISSING_BREW llama.cpp"
144
+
145
+ if [ -n "$MISSING_BREW" ]; then
146
+ echo ""
147
+ echo "⚠️ Missing dependencies:"
148
+ echo " brew install$MISSING_BREW"
149
+ echo ""
150
+ echo "Then re-run: npx mvas setup --binaries-only"
151
+ else
152
+ echo ""
153
+ echo "✅ All binaries set up!"
154
+ fi
155
+
156
+ echo ""
157
+ echo "You can customize the cache location with:"
158
+ echo " export MVAS_CACHE=/path/to/cache"
159
+
@@ -0,0 +1,201 @@
1
+ #!/bin/bash
2
+ #
3
+ # Setup script - downloads models and binaries for native backends
4
+ # Files are stored in ~/.cache/mvas/
5
+ #
6
+ # Usage: npx mvas setup
7
+ #
8
+
9
+ set -e
10
+
11
+ # Use global cache directory
12
+ CACHE_DIR="${MVAS_CACHE:-$HOME/.cache/mvas}"
13
+ MODELS_DIR="$CACHE_DIR/models"
14
+ BIN_DIR="$CACHE_DIR/bin"
15
+
16
+ echo "Modular Voice Agent SDK Setup"
17
+ echo "=============================="
18
+ echo "Cache directory: $CACHE_DIR"
19
+ echo ""
20
+
21
+ mkdir -p "$MODELS_DIR"
22
+ mkdir -p "$BIN_DIR"
23
+
24
+ # ============ Models ============
25
+
26
+ cd "$MODELS_DIR"
27
+
28
+ # Whisper model (whisper.cpp format - Large V3 Turbo quantized)
29
+ echo "==> Downloading Whisper model (~850MB)..."
30
+ if [ -f "whisper-large-v3-turbo-q8.bin" ]; then
31
+ echo " Already exists, skipping."
32
+ else
33
+ curl -L --progress-bar -o whisper-large-v3-turbo-q8.bin \
34
+ "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo-q8_0.bin"
35
+ fi
36
+
37
+ # LLM model (GGUF format)
38
+ echo ""
39
+ echo "==> Downloading SmolLM2 model (~1GB)..."
40
+ if [ -f "smollm2-1.7b-instruct-q4_k_m.gguf" ]; then
41
+ echo " Already exists, skipping."
42
+ else
43
+ curl -L --progress-bar -o smollm2-1.7b-instruct-q4_k_m.gguf \
44
+ "https://huggingface.co/HuggingFaceTB/SmolLM2-1.7B-Instruct-GGUF/resolve/main/smollm2-1.7b-instruct-q4_k_m.gguf"
45
+ fi
46
+
47
+ # TTS model (sherpa-onnx compatible Piper model)
48
+ echo ""
49
+ echo "==> Downloading TTS model (~60MB)..."
50
+ if [ -d "vits-piper-en_US-lessac-medium" ]; then
51
+ echo " Already exists, skipping."
52
+ else
53
+ curl -L --progress-bar -o vits-piper-en_US-lessac-medium.tar.bz2 \
54
+ "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-piper-en_US-lessac-medium.tar.bz2"
55
+ tar -xjf vits-piper-en_US-lessac-medium.tar.bz2
56
+ rm vits-piper-en_US-lessac-medium.tar.bz2
57
+ fi
58
+
59
+ # ============ Binaries ============
60
+
61
+ cd "$BIN_DIR"
62
+
63
+ # Detect platform
64
+ OS="$(uname -s)"
65
+ ARCH="$(uname -m)"
66
+
67
+ # --- whisper.cpp ---
68
+ echo ""
69
+ echo "==> Setting up whisper-cli..."
70
+ if [ -L "whisper-cli" ] || [ -f "whisper-cli" ]; then
71
+ echo " Already exists, skipping."
72
+ else
73
+ # Try to find whisper-cli from Homebrew or PATH
74
+ if command -v whisper-cli &> /dev/null; then
75
+ WHISPER_PATH="$(command -v whisper-cli)"
76
+ ln -s "$WHISPER_PATH" whisper-cli
77
+ echo " Linked to $WHISPER_PATH"
78
+ elif [ -f "/opt/homebrew/bin/whisper-cli" ]; then
79
+ ln -s /opt/homebrew/bin/whisper-cli whisper-cli
80
+ echo " Linked to /opt/homebrew/bin/whisper-cli"
81
+ elif [ -f "/usr/local/bin/whisper-cli" ]; then
82
+ ln -s /usr/local/bin/whisper-cli whisper-cli
83
+ echo " Linked to /usr/local/bin/whisper-cli"
84
+ else
85
+ echo " ⚠️ whisper-cli not found. Install with: brew install whisper-cpp"
86
+ fi
87
+ fi
88
+
89
+ # --- llama.cpp (llama-completion) ---
90
+ echo ""
91
+ echo "==> Setting up llama-completion..."
92
+ if [ -L "llama-completion" ] || [ -f "llama-completion" ]; then
93
+ echo " Already exists, skipping."
94
+ else
95
+ # Try to find llama-completion from PATH or common locations
96
+ if command -v llama-completion &> /dev/null; then
97
+ LLAMA_PATH="$(command -v llama-completion)"
98
+ ln -s "$LLAMA_PATH" llama-completion
99
+ echo " Linked to $LLAMA_PATH"
100
+ elif [ -f "/opt/homebrew/bin/llama-completion" ]; then
101
+ ln -s /opt/homebrew/bin/llama-completion llama-completion
102
+ echo " Linked to /opt/homebrew/bin/llama-completion"
103
+ elif [ -f "/usr/local/bin/llama-completion" ]; then
104
+ ln -s /usr/local/bin/llama-completion llama-completion
105
+ echo " Linked to /usr/local/bin/llama-completion"
106
+ else
107
+ echo " ⚠️ llama-completion not found."
108
+ echo " Install with: brew install llama.cpp"
109
+ echo " Or build from source: git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp && make"
110
+ fi
111
+ fi
112
+
113
+ # --- sherpa-onnx (TTS) ---
114
+ echo ""
115
+ echo "==> Setting up sherpa-onnx for $OS/$ARCH..."
116
+
117
+ if [ -f "sherpa-onnx-offline-tts" ]; then
118
+ echo " Already exists, skipping."
119
+ else
120
+ case "$OS" in
121
+ Darwin)
122
+ # macOS - universal binary (arm64 + x86_64)
123
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-osx-universal2-shared.tar.bz2"
124
+ SHERPA_DIR="sherpa-onnx-v1.12.20-osx-universal2-shared"
125
+ ;;
126
+ Linux)
127
+ if [ "$ARCH" = "x86_64" ]; then
128
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-linux-x64-shared.tar.bz2"
129
+ SHERPA_DIR="sherpa-onnx-v1.12.20-linux-x64-shared"
130
+ elif [ "$ARCH" = "aarch64" ]; then
131
+ SHERPA_URL="https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.12.20/sherpa-onnx-v1.12.20-linux-aarch64-shared.tar.bz2"
132
+ SHERPA_DIR="sherpa-onnx-v1.12.20-linux-aarch64-shared"
133
+ else
134
+ echo " Unsupported Linux architecture: $ARCH"
135
+ exit 1
136
+ fi
137
+ ;;
138
+ *)
139
+ echo " Unsupported OS: $OS"
140
+ echo " Download manually from: https://github.com/k2-fsa/sherpa-onnx/releases"
141
+ exit 1
142
+ ;;
143
+ esac
144
+
145
+ echo " Downloading from $SHERPA_URL..."
146
+ curl -L --progress-bar -o sherpa-onnx.tar.bz2 "$SHERPA_URL"
147
+ tar -xjf sherpa-onnx.tar.bz2
148
+
149
+ # Only copy the TTS binary we need (not all the extras)
150
+ cp "$SHERPA_DIR/bin/sherpa-onnx-offline-tts" .
151
+ mkdir -p lib
152
+ mv "$SHERPA_DIR/lib/"* lib/
153
+
154
+ # Fix library paths on macOS so binary can find libs in ./lib/
155
+ if [ "$OS" = "Darwin" ]; then
156
+ echo " Fixing library paths..."
157
+ for lib in lib/*.dylib; do
158
+ libname=$(basename "$lib")
159
+ install_name_tool -change "@rpath/$libname" "@executable_path/lib/$libname" sherpa-onnx-offline-tts 2>/dev/null || true
160
+ done
161
+ fi
162
+
163
+ # Cleanup
164
+ rm -rf "$SHERPA_DIR" sherpa-onnx.tar.bz2
165
+
166
+ echo " Done!"
167
+ fi
168
+
169
+ # ============ Summary ============
170
+
171
+ echo ""
172
+ echo "============================================================"
173
+ echo "Setup complete!"
174
+ echo "============================================================"
175
+ echo ""
176
+ echo "Cache location: $CACHE_DIR"
177
+ echo ""
178
+ echo "Models:"
179
+ ls -lh "$MODELS_DIR"
180
+ echo ""
181
+ echo "Binaries:"
182
+ ls -lh "$BIN_DIR"
183
+
184
+ # Check for missing dependencies
185
+ MISSING_BREW=""
186
+ [ ! -L "$BIN_DIR/whisper-cli" ] && [ ! -f "$BIN_DIR/whisper-cli" ] && MISSING_BREW="$MISSING_BREW whisper-cpp"
187
+ [ ! -L "$BIN_DIR/llama-completion" ] && [ ! -f "$BIN_DIR/llama-completion" ] && MISSING_BREW="$MISSING_BREW llama.cpp"
188
+
189
+ if [ -n "$MISSING_BREW" ]; then
190
+ echo ""
191
+ echo "⚠️ Missing dependencies:"
192
+ echo " brew install$MISSING_BREW"
193
+ echo ""
194
+ echo "Then re-run: npx mvas setup"
195
+ else
196
+ echo ""
197
+ echo "✅ All dependencies installed!"
198
+ echo ""
199
+ echo "You can customize the cache location with:"
200
+ echo " export MVAS_CACHE=/path/to/cache"
201
+ fi