agentvibes 5.11.2 → 5.12.0-alpha.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 (97) hide show
  1. package/.agentvibes/config.json +1 -15
  2. package/.claude/activation-instructions +54 -54
  3. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  4. package/.claude/commands/agent-vibes-rdp.md +24 -24
  5. package/.claude/config/audio-effects.cfg +5 -5
  6. package/.claude/config/background-music-enabled.txt +1 -1
  7. package/.claude/docs/TERMUX_SETUP.md +408 -408
  8. package/.claude/github-star-reminder.txt +1 -1
  9. package/.claude/hooks/audio-processor.sh +1 -1
  10. package/.claude/hooks/background-music-manager.sh +2 -1
  11. package/.claude/hooks/bmad-speak-enhanced.sh +37 -22
  12. package/.claude/hooks/bmad-speak.sh +26 -8
  13. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +1 -1
  14. package/.claude/hooks/play-tts-kokoro.sh +9 -0
  15. package/.claude/hooks/play-tts-piper.sh +13 -1
  16. package/.claude/hooks/play-tts-ssh-remote.sh +78 -5
  17. package/.claude/hooks/play-tts-termux-ssh.sh +1 -1
  18. package/.claude/hooks/play-tts.sh +85 -4
  19. package/.claude/hooks-windows/background-music-manager.ps1 +2 -1
  20. package/.claude/hooks-windows/play-tts-kokoro.ps1 +14 -0
  21. package/.claude/hooks-windows/play-tts.ps1 +163 -30
  22. package/.claude/hooks-windows/voice-manager-windows.ps1 +101 -1
  23. package/.clawdbot/README.md +105 -105
  24. package/LICENSE +190 -190
  25. package/RELEASE_NOTES.md +29 -0
  26. package/WINDOWS-SETUP.md +208 -208
  27. package/bin/agent-vibes +39 -39
  28. package/bin/mcp-server.js +121 -121
  29. package/bin/mcp-server.sh +6 -19
  30. package/bin/resolve-utterance.js +137 -0
  31. package/bin/test-bmad-pr +78 -78
  32. package/mcp-server/QUICK_START.md +203 -203
  33. package/mcp-server/README.md +345 -345
  34. package/mcp-server/examples/claude_desktop_config.json +11 -11
  35. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  36. package/mcp-server/examples/custom_instructions.md +169 -169
  37. package/mcp-server/pyproject.toml +52 -52
  38. package/mcp-server/requirements.txt +2 -2
  39. package/mcp-server/server.py +280 -99
  40. package/mcp-server/test_mcp_correctness.py +486 -0
  41. package/mcp-server/test_server.py +395 -395
  42. package/mcp-server/test_windows_script_parity.py +341 -336
  43. package/package.json +3 -2
  44. package/setup-windows.ps1 +867 -815
  45. package/src/cli/list-personalities.js +110 -110
  46. package/src/cli/list-voices.js +114 -114
  47. package/src/commands/bmad-voices.js +394 -394
  48. package/src/console/app.js +13 -2
  49. package/src/console/brand-colors.js +13 -13
  50. package/src/console/constants/personalities.js +44 -44
  51. package/src/console/tabs/agents-tab.js +82 -9
  52. package/src/console/tabs/help-tab.js +314 -314
  53. package/src/console/tabs/music-tab.js +7 -1
  54. package/src/console/tabs/readme-tab.js +272 -272
  55. package/src/console/tabs/settings-tab.js +29 -1
  56. package/src/console/tabs/setup-tab.js +4 -4
  57. package/src/console/widgets/destroy-list.js +25 -25
  58. package/src/console/widgets/notice.js +55 -55
  59. package/src/console/widgets/track-picker.js +3 -3
  60. package/src/i18n/de.js +0 -1
  61. package/src/i18n/en.js +0 -1
  62. package/src/i18n/es.js +0 -1
  63. package/src/i18n/fr.js +0 -1
  64. package/src/i18n/hi.js +0 -1
  65. package/src/i18n/ja.js +0 -1
  66. package/src/i18n/ko.js +0 -1
  67. package/src/i18n/pt.js +0 -1
  68. package/src/i18n/zh-CN.js +0 -1
  69. package/src/installer/language-screen.js +31 -31
  70. package/src/installer/music-file-input.js +304 -304
  71. package/src/installer.js +205 -15
  72. package/src/services/config-service.js +264 -264
  73. package/src/services/language-service.js +47 -47
  74. package/src/services/llm-provider-service.js +7 -7
  75. package/src/services/utterance-loader.js +280 -0
  76. package/src/services/utterance-resolver.js +526 -0
  77. package/src/utils/audio-format-validator.js +277 -277
  78. package/src/utils/dependency-checker.js +469 -469
  79. package/src/utils/file-ownership-verifier.js +358 -358
  80. package/src/utils/music-file-validator.js +285 -285
  81. package/src/utils/preview-list-prompt.js +144 -144
  82. package/src/utils/secure-music-storage.js +412 -412
  83. package/templates/agentvibes-receiver.sh +74 -12
  84. package/voice-assignments.json +8245 -0
  85. package/.agentvibes/install-manifest.json +0 -342
  86. package/.claude/config/background-music-position.txt +0 -27
  87. package/.claude/config/background-music-volume.txt +0 -1
  88. package/.claude/config/background-music.cfg +0 -1
  89. package/.claude/config/background-music.txt +0 -1
  90. package/.claude/config/language.txt +0 -1
  91. package/.claude/config/personality.txt +0 -1
  92. package/.claude/config/tts-speech-rate.txt +0 -1
  93. package/.claude/config/tts-verbosity.txt +0 -1
  94. package/.claude/hooks-windows/audio-cache-utils.ps1.user.bak +0 -119
  95. package/.claude/hooks-windows/soprano-gradio-synth.py.user.bak +0 -153
  96. package/.claude/piper-voices-dir.txt +0 -1
  97. package/.mcp.json +0 -22
@@ -78,7 +78,7 @@ _PARSE_OUT=$(python3 - "$DECODED" 2>&1 <<'PYEOF'
78
78
  import json, sys
79
79
  try:
80
80
  d = json.loads(sys.argv[1])
81
- for field in ("text","voice","music","volume","effects","pretext","speed","provider","llm"):
81
+ for field in ("text","voice","music","volume","effects","pretext","speed","provider","llm","mute","language"):
82
82
  print(d.get(field, ""))
83
83
  except json.JSONDecodeError as e:
84
84
  print(f"JSON_PARSE_ERROR: {e}", file=sys.stderr)
@@ -96,10 +96,13 @@ PRETEXT=$( sed -n '6p' <<< "$_PARSE_OUT")
96
96
  SPEED=$( sed -n '7p' <<< "$_PARSE_OUT")
97
97
  PROVIDER=$(sed -n '8p' <<< "$_PARSE_OUT")
98
98
  LLM=$( sed -n '9p' <<< "$_PARSE_OUT")
99
+ MUTE=$( sed -n '10p' <<< "$_PARSE_OUT")
100
+ LANGUAGE=$(sed -n '11p' <<< "$_PARSE_OUT")
99
101
 
100
102
  # Fall back to defaults
103
+ # TODO(AVI-S8.6): generate the volume constant from the shared JSON source of truth.
101
104
  [[ -z "$VOICE" ]] && VOICE="en_US-lessac-medium"
102
- [[ -z "$VOLUME" ]] && VOLUME="0.10"
105
+ [[ -z "$VOLUME" ]] && VOLUME="0.20"
103
106
  [[ -z "$PROVIDER" ]] && PROVIDER="piper"
104
107
 
105
108
  # Validate text
@@ -114,7 +117,7 @@ fi
114
117
 
115
118
  # Validate volume is numeric
116
119
  if [[ ! "$VOLUME" =~ ^[0-9]+\.?[0-9]*$ ]]; then
117
- VOLUME="0.10"
120
+ VOLUME="0.20"
118
121
  fi
119
122
 
120
123
  # Validate provider
@@ -128,6 +131,50 @@ if [[ -n "$PRETEXT" ]]; then
128
131
  TEXT="${PRETEXT}. ${TEXT}"
129
132
  fi
130
133
 
134
+ # ---------------------------------------------------------------------------
135
+ # RECEIVER-AUTHORITATIVE: mute safety-OR (map §C, R17)
136
+ # ---------------------------------------------------------------------------
137
+ # effective_mute = receiver_local_mute OR forwarded_mute.
138
+ # If EITHER the sender (forwarded MUTE=="true") or THIS receiver host is muted,
139
+ # we stay silent. A receiver-local mute can always veto; the forwarded mute is a
140
+ # subordinate DEFAULT that can also veto — we NEVER force-unmute a muted receiver.
141
+ # The receiver's own 3-level mute (project-unmute > project-mute > global-mute)
142
+ # is additionally enforced downstream by play-tts.sh; here we OR in its global
143
+ # mute file so the OR decision is visible/testable at this layer too.
144
+ receiver_local_muted() {
145
+ [[ -f "$HOME/.agentvibes-muted" ]] && return 0
146
+ return 1
147
+ }
148
+ EFFECTIVE_MUTE="false"
149
+ if [[ "$MUTE" == "true" ]] || receiver_local_muted; then
150
+ EFFECTIVE_MUTE="true"
151
+ fi
152
+
153
+ # ---------------------------------------------------------------------------
154
+ # RECEIVER-AUTHORITATIVE: language fallback (map §D, R18)
155
+ # ---------------------------------------------------------------------------
156
+ # The receiver's OWN language config wins; otherwise the forwarded language is
157
+ # used as the default. Only forward-as-default is applied here (we never
158
+ # overwrite the receiver's own config). tts-language.txt lives at the .claude/
159
+ # root (language-manager.sh) or the config/ subdir; check both, project-scope is
160
+ # irrelevant on the receiver so we use the receiver host's ~/.claude.
161
+ receiver_local_language() {
162
+ local f
163
+ for f in "$HOME/.claude/tts-language.txt" "$HOME/.claude/config/tts-language.txt"; do
164
+ if [[ -f "$f" ]]; then
165
+ local v
166
+ v=$(cat "$f" 2>/dev/null || true)
167
+ if [[ -n "$v" ]]; then echo "$v"; return 0; fi
168
+ fi
169
+ done
170
+ return 1
171
+ }
172
+ EFFECTIVE_LANGUAGE="$LANGUAGE"
173
+ _RECV_LANG=$(receiver_local_language || true)
174
+ if [[ -n "$_RECV_LANG" ]]; then
175
+ EFFECTIVE_LANGUAGE="$_RECV_LANG" # receiver's own language config wins
176
+ fi
177
+
131
178
  # ---------------------------------------------------------------------------
132
179
  # Test mode: dump what would be played without calling play-tts
133
180
  # ---------------------------------------------------------------------------
@@ -136,16 +183,25 @@ if [[ "${AGENTVIBES_TEST_MODE:-false}" == "true" ]]; then
136
183
  python3 -c "
137
184
  import json, sys
138
185
  print(json.dumps({
139
- 'text': sys.argv[1],
140
- 'voice': sys.argv[2],
141
- 'music': sys.argv[3],
142
- 'volume': sys.argv[4],
143
- 'effects': sys.argv[5],
144
- 'pretext': sys.argv[6],
145
- 'provider': sys.argv[7],
146
- 'llm': sys.argv[8],
186
+ 'text': sys.argv[1],
187
+ 'voice': sys.argv[2],
188
+ 'music': sys.argv[3],
189
+ 'volume': sys.argv[4],
190
+ 'effects': sys.argv[5],
191
+ 'pretext': sys.argv[6],
192
+ 'provider': sys.argv[7],
193
+ 'llm': sys.argv[8],
194
+ 'mute': sys.argv[9],
195
+ 'effective_mute': sys.argv[10],
196
+ 'language': sys.argv[11],
147
197
  }, ensure_ascii=False))
148
- " "$TEXT" "$VOICE" "$MUSIC" "$VOLUME" "$EFFECTS" "$PRETEXT" "$PROVIDER" "$LLM"
198
+ " "$TEXT" "$VOICE" "$MUSIC" "$VOLUME" "$EFFECTS" "$PRETEXT" "$PROVIDER" "$LLM" "$MUTE" "$EFFECTIVE_MUTE" "$EFFECTIVE_LANGUAGE"
199
+ exit 0
200
+ fi
201
+
202
+ # RECEIVER-AUTHORITATIVE mute veto: if either side muted, do not play.
203
+ if [[ "$EFFECTIVE_MUTE" == "true" ]]; then
204
+ echo "🔇 TTS muted (forwarded=$MUTE, receiver-local honored) — not playing" >&2
149
205
  exit 0
150
206
  fi
151
207
 
@@ -215,6 +271,10 @@ fi
215
271
  [[ -n "$VOLUME" ]] && export AGENTVIBES_OVERRIDE_VOLUME="$VOLUME"
216
272
  [[ -n "$EFFECTS" ]] && export AGENTVIBES_OVERRIDE_EFFECTS="$EFFECTS"
217
273
  [[ -n "$SPEED" ]] && export AGENTVIBES_OVERRIDE_SPEED="$SPEED"
274
+ # RECEIVER-AUTHORITATIVE language default: the receiver's own language config (if
275
+ # any) already won above; forward the effective language downstream so play-tts.sh
276
+ # uses it only when the receiver has no local opinion. Subordinate to receiver config.
277
+ [[ -n "$EFFECTIVE_LANGUAGE" ]] && export AGENTVIBES_OVERRIDE_LANGUAGE="$EFFECTIVE_LANGUAGE"
218
278
 
219
279
  if [[ "${AGENTVIBES_DEBUG:-0}" == "1" ]]; then
220
280
  echo "[DEBUG] Voice: $VOICE" >&2
@@ -223,6 +283,8 @@ if [[ "${AGENTVIBES_DEBUG:-0}" == "1" ]]; then
223
283
  echo "[DEBUG] Effects: ${EFFECTS:-none}" >&2
224
284
  echo "[DEBUG] Pretext: ${PRETEXT:-none}" >&2
225
285
  echo "[DEBUG] Provider: $PROVIDER" >&2
286
+ echo "[DEBUG] Mute: forwarded=$MUTE effective=$EFFECTIVE_MUTE" >&2
287
+ echo "[DEBUG] Language: forwarded=${LANGUAGE:-none} effective=${EFFECTIVE_LANGUAGE:-none}" >&2
226
288
  fi
227
289
 
228
290
  echo "🎵 Playing via AgentVibes: ${TEXT:0:50}..." >&2