@mcptoolshop/voice-soundboard-core 1.0.0 → 1.1.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,172 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.2] - 2026-03-25
9
+
10
+ ### Added
11
+ - `--version` / `-V` flag to print version and exit
12
+ - `--help` / `-h` flag with full CLI usage documentation
13
+ - CHANGELOG.md and LICENSE included in npm tarballs
14
+
15
+ ### Fixed
16
+ - Health endpoint version was hardcoded at 0.1.2 — now reads from package.json
17
+ - SECURITY.md version table updated from 0.x to 1.0.x
18
+
19
+ ## [1.0.0] - 2026-02-27
20
+
21
+ ### Overview
22
+
23
+ **First stable release.** Structured error contract, Ship Gate audit (46/50), version alignment, and v1 README.
24
+
25
+ ### Added
26
+
27
+ - **Structured error contract** — all errors now carry `hint` (actionable guidance) and `retryable` (safe to retry?) fields
28
+ - `SoundboardError` base class in core — extends `Error` with `code`, `hint`, `retryable`, `cause`
29
+ - `fromError()` helper — converts any caught error into a `VoiceErrorResponse`, extracting hint + retryable from `SoundboardError` subclasses
30
+ - `toToolError()` pattern in MCP server — converts errors into MCP tool error responses with structured fields, never exposes stack traces
31
+ - `wrapError()` utility — wraps unknown thrown values into `SoundboardError`
32
+ - `pnpm verify` script (build + test in one command)
33
+ - Explicit "No telemetry" privacy statement in README
34
+ - SHIP_GATE.md and SCORECARD.md for product quality tracking
35
+
36
+ ### Changed
37
+
38
+ - All 11 error classes across core and server now extend `SoundboardError`
39
+ - `VoiceErrorResponse` schema now includes `hint: string` and `retryable: boolean`
40
+ - `voiceSpeak` and `voiceDialogue` handlers migrated from manual `instanceof` chains to `fromError()`
41
+ - Golden-contract tests now verify `hint` and `retryable` fields in error responses
42
+ - MCP server version string aligned with package version
43
+ - Repo description and topics updated (48 voices, 9 languages)
44
+
45
+ ### Fixed
46
+
47
+ - MCP handshake version was stuck at `0.2.1` — now aligned at `1.0.0`
48
+ - Error responses from `BusyError`, `RateLimitError`, `TimeoutError` now correctly report `retryable: true`
49
+ - Stale v2.x git tags deleted
50
+ - Dependabot cleaned (removed stale pip ecosystem entry)
51
+
52
+ ## [0.2.1] - 2026-02-18
53
+
54
+ ### Fixed
55
+
56
+ - README in `@mcptoolshop/voice-soundboard-core` npm tarball still showed 12 voices — corrected to 48 voices, 9 languages
57
+ - Broken Development section in root README (stray `> Part of MCP Tool Shop` line inside code block)
58
+
59
+ ## [0.2.0] - 2026-02-18
60
+
61
+ ### Overview
62
+
63
+ **Multilingual expansion** — 48 voices across 9 languages.
64
+
65
+ ### Added
66
+
67
+ - **48 voices** — expanded from 12 English-only to 48 across 9 languages
68
+ - **9 languages** — English US, English UK, Japanese, Mandarin Chinese, Spanish, French, Hindi, Italian, Brazilian Portuguese
69
+ - **`getVoicesByLanguage(language)`** — new helper in `@mcptoolshop/voice-soundboard-core` to filter voices by language code
70
+ - Language is auto-inferred by the synthesis backend from the voice ID prefix — no caller changes required
71
+
72
+ ### Changed
73
+
74
+ - `VoiceInfo.accent` field widened from `"american" | "british"` to `string` to accommodate new languages
75
+ - `VoiceInfo.language` values now use BCP-47 style codes (`"en-us"`, `"en-gb"`, `"ja"`, `"zh"`, etc.) instead of `"en"`
76
+ - Server version string updated to `0.2.0`
77
+ - Package descriptions updated to reflect 48 voices and 9 languages
78
+
79
+ ---
80
+
81
+ ## [0.1.0] - 2026-02-13
82
+
83
+ ### Overview
84
+
85
+ **Initial release** — Node.js/TypeScript MCP server for text-to-speech.
86
+
87
+ Complete rewrite from the original Python prototype into a pnpm monorepo with two
88
+ publishable npm packages: `@mcp-tool-shop/voice-soundboard-core` and
89
+ `@mcp-tool-shop/voice-soundboard-mcp`.
90
+
91
+ ### Packages
92
+
93
+ - **@mcp-tool-shop/voice-soundboard-core** (v0.1.0) — Backend-agnostic core library
94
+ - **@mcp-tool-shop/voice-soundboard-mcp** (v0.1.0) — MCP server with CLI
95
+
96
+ ### Added
97
+
98
+ #### MCP Tools
99
+ - `voice_speak` — Synthesize speech from text with voice, speed, format options
100
+ - `voice_dialogue` — Multi-speaker dialogue synthesis with cast mapping
101
+ - `voice_status` — Engine health, available voices, presets, backend info
102
+ - `voice_interrupt` — Stop/rollback active synthesis
103
+ - `voice_inner_monologue` — Ephemeral micro-utterances (ambient system, opt-in)
104
+
105
+ #### Core Features
106
+ - 12 approved voices (4 American female, 4 American male, 3 British female, 2 British male)
107
+ - 5 voice presets (narrator, announcer, whisper, storyteller, assistant)
108
+ - 8 emotion spans via `[happy]...[/happy]` inline markup
109
+ - SSML-lite parser (`<break>`, `<emphasis>`, `<prosody>`)
110
+ - SFX tags (`[ding]`, `[chime]`, `[whoosh]`, `[tada]`, `[error]`, `[click]`)
111
+ - Text chunking with sentence/paragraph boundaries
112
+ - WAV concatenation for multi-segment output
113
+ - Base64 and file-path artifact delivery modes
114
+ - Output directory sandboxing with path traversal protection
115
+
116
+ #### Security & Guardrails
117
+ - `SynthesisSemaphore` &mdash; configurable max concurrent synthesis (default 1)
118
+ - `ToolRateLimiter` &mdash; per-tool sliding window rate limit (30 calls/60s)
119
+ - `withTimeout` &mdash; per-request timeout (default 20s)
120
+ - Path traversal protection (resolveOutputDir with symlink checks)
121
+ - Secret/PII redaction in logs and error messages
122
+ - Synthesis result validation (WAV header, duration, file size)
123
+ - Output file retention cleanup (default 4 hours)
124
+
125
+ #### Backend System
126
+ - `Backend` interface with `synthesize()`, `voices()`, `health()`
127
+ - MockBackend (built-in, deterministic WAV generation)
128
+ - HTTP proxy backend (delegate to external TTS service)
129
+ - Python bridge backend (connect to Python Kokoro/Piper engines)
130
+
131
+ #### Developer Experience
132
+ - 342 tests (252 core + 90 server)
133
+ - Abuse battery (adversarial input testing)
134
+ - CI pipeline: Node.js 20+22 matrix, type-check, npm pack dry-run
135
+ - Dependabot for npm dependency updates
136
+ - Architecture invariant enforcement (engine never imports compiler)
137
+
138
+ ### Architecture
139
+
140
+ ```
141
+ @mcp-tool-shop/voice-soundboard-core
142
+ limits.ts SHIP_LIMITS consolidation
143
+ schemas.ts VoiceRequest, VoiceResponse, error codes
144
+ voices.ts Approved voice registry + presets
145
+ emotion.ts Emotion span parser
146
+ ssml/ SSML-lite parser
147
+ chunking/ Text chunker
148
+ sfx/ SFX tag parser
149
+ artifact.ts Output directory sandboxing
150
+ sandbox.ts Safe filenames, symlink checks
151
+ ambient.ts AmbientEmitter
152
+ redact.ts PII/secret redaction
153
+
154
+ @mcp-tool-shop/voice-soundboard-mcp
155
+ server.ts MCP tool registration + guardrails
156
+ cli.ts CLI entrypoint (stdio transport)
157
+ backend.ts Backend abstraction
158
+ concurrency.ts SynthesisSemaphore
159
+ rateLimit.ts ToolRateLimiter
160
+ timeout.ts withTimeout
161
+ retention.ts Output cleanup timer
162
+ validation.ts Result validation
163
+ redact.ts Server-level redaction
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Pre-0.1.0 (Python)
169
+
170
+ The original Python implementation (`voice_soundboard/`) with Compiler-Graph-Engine
171
+ architecture is preserved in the repository but is not part of the npm packages.
172
+ See git history for the full Python changelog.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 mcp-tool-shop
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  </p>
18
18
 
19
19
  <p align="center">
20
- 48 voices &bull; 9 languages &bull; 5 presets &bull; 8 emotions &bull; SSML-lite &bull; SFX tags &bull; multi-speaker dialogue<br>
20
+ 46 voices &bull; 9 languages &bull; 5 presets &bull; 8 emotions &bull; SSML-lite &bull; SFX tags &bull; multi-speaker dialogue<br>
21
21
  Swappable TTS backends. Guardrails built in. Ships as a single <code>npx</code> command.
22
22
  </p>
23
23
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  - **MCP native** &mdash; stdio transport, works with Claude Desktop, Cursor, and any MCP client
29
29
  - **5 tools** &mdash; `voice_speak`, `voice_dialogue`, `voice_status`, `voice_interrupt`, `voice_inner_monologue`
30
- - **48 approved voices, 9 languages** &mdash; English (American + British), Japanese, Mandarin, Spanish, French, Hindi, Italian, Brazilian Portuguese. Curated presets: `narrator`, `announcer`, `whisper`, `storyteller`, `assistant`
30
+ - **46 approved voices, 9 languages** &mdash; English (American + British), Japanese, Mandarin, Spanish, French, Hindi, Italian, Brazilian Portuguese. Curated presets: `narrator`, `announcer`, `whisper`, `storyteller`, `assistant`
31
31
  - **Emotion spans** &mdash; 8 emotions via `[happy]...[/happy]` inline markup
32
32
  - **SSML-lite** &mdash; `<break>`, `<emphasis>`, `<prosody>` without full SSML complexity
33
33
  - **SFX tags** &mdash; `[ding]`, `[chime]`, `[whoosh]`, `[tada]`, `[error]`, `[click]` inline sound effects
@@ -133,7 +133,7 @@ category?: "thinking" # general | thinking | observation | debug
133
133
 
134
134
  ## Voices
135
135
 
136
- 48 voices across 9 languages. Language is auto-inferred from the voice ID prefix — no configuration required.
136
+ 46 voices across 9 languages. Language is auto-inferred from the voice ID prefix — no configuration required.
137
137
 
138
138
  | Prefix | Language |
139
139
  |--------|----------|
@@ -147,7 +147,7 @@ category?: "thinking" # general | thinking | observation | debug
147
147
  | `if_` / `im_` | Italian |
148
148
  | `pf_` / `pm_` | Brazilian Portuguese |
149
149
 
150
- See the [full voice list](https://github.com/mcp-tool-shop-org/mcp-voice-soundboard#voices) for all 48 voices with names and styles.
150
+ See the [full voice list](https://github.com/mcp-tool-shop-org/mcp-voice-soundboard#voices) for all 46 voices with names and styles.
151
151
 
152
152
  ### Presets
153
153
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { SoundboardError, wrapError, } from "./errors.js";
2
2
  export { type VoiceInfo, DEFAULT_VOICE, VOICES, APPROVED_VOICE_IDS, getVoice, isApprovedVoice, } from "./voices.js";
3
- export { type PresetConfig, PRESETS, PRESET_NAMES, getPreset, } from "./presets.js";
3
+ export { type PresetConfig, type ProsodyConfig, type PiperProsodyConfig, type HumorMood, PRESETS, PRESET_NAMES, HUMOR_PRESETS, HUMOR_MOODS, getPreset, getHumorPreset, wrapWithProsody, } from "./presets.js";
4
4
  export { VoiceValidationError, type ResolvedVoice, assertApprovedVoice, resolveVoiceOrPreset, } from "./validate.js";
5
5
  export { type BackendInfo, type VoiceStatusResponse, type VoiceSpeakResponse, type ArtifactMode, type VoiceInterruptResponse, type VoiceStreamResponse, type VoiceErrorResponse, type VoiceErrorCode, } from "./schemas.js";
6
6
  export { LIMITS, SHIP_LIMITS, LimitError, validateText, validateSpeed, } from "./limits.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Backend-agnostic voice soundboard core library
3
3
  export { SoundboardError, wrapError, } from "./errors.js";
4
4
  export { DEFAULT_VOICE, VOICES, APPROVED_VOICE_IDS, getVoice, isApprovedVoice, } from "./voices.js";
5
- export { PRESETS, PRESET_NAMES, getPreset, } from "./presets.js";
5
+ export { PRESETS, PRESET_NAMES, HUMOR_PRESETS, HUMOR_MOODS, getPreset, getHumorPreset, wrapWithProsody, } from "./presets.js";
6
6
  export { VoiceValidationError, assertApprovedVoice, resolveVoiceOrPreset, } from "./validate.js";
7
7
  export { LIMITS, SHIP_LIMITS, LimitError, validateText, validateSpeed, } from "./limits.js";
8
8
  export { DEFAULT_ARTIFACT_MODE, DEFAULT_OUTPUT_FORMAT, buildArtifactConfig, OutputDirError, defaultOutputRoot, resolveOutputDir, } from "./artifact.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,iDAAiD;AAEjD,OAAO,EACL,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,aAAa,EACb,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,oBAAoB,EAEpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAavB,OAAO,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAGrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,qBAAqB,EACrB,aAAa,EACb,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAYL,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,YAAY,EACZ,SAAS,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAOL,OAAO,EAIP,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAOL,aAAa,EACb,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EAMf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,QAAQ,EAQR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAGhB,eAAe,EACf,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAOlB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,GACV,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,iDAAiD;AAEjD,OAAO,EACL,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,aAAa,EACb,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAKL,OAAO,EACP,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,oBAAoB,EAEpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAavB,OAAO,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EAGrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,qBAAqB,EACrB,aAAa,EACb,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAYL,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,YAAY,EACZ,SAAS,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAOL,OAAO,EAIP,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAOL,aAAa,EACb,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EAMf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,QAAQ,EAQR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAGhB,eAAe,EACf,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAOlB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,GACV,MAAM,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"concat.d.ts","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAK7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC/C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,aAAa,EAAE,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCjD;AAkCD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBxE"}
1
+ {"version":3,"file":"concat.d.ts","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAK7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA+ChD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAS/C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,aAAa,EAAE,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAKjD;AAuCD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBxE"}
@@ -3,14 +3,12 @@ import { readFile, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { randomUUID } from "node:crypto";
5
5
  /**
6
- * Concatenate multiple WAV chunk artifacts into a single WAV file.
7
- * All chunks must be the same sample rate and format (16-bit PCM mono).
8
- * Returns the path to the concatenated file.
6
+ * Extract raw WAV buffers from chunk artifacts, validating sample rate consistency.
7
+ * Shared logic for both file-based and base64 concatenation paths.
9
8
  */
10
- export async function concatWavFiles(chunks, outputDir) {
9
+ async function concatWavBuffers(chunks) {
11
10
  const buffers = [];
12
- let totalDataSize = 0;
13
- let sampleRate = 24000;
11
+ let sampleRate = null;
14
12
  for (const chunk of chunks) {
15
13
  let wav;
16
14
  if (chunk.audioPath) {
@@ -22,61 +20,45 @@ export async function concatWavFiles(chunks, outputDir) {
22
20
  else {
23
21
  continue;
24
22
  }
25
- // Parse WAV header to extract data portion
26
23
  const parsed = parseWavData(wav);
27
24
  if (parsed) {
25
+ if (sampleRate === null) {
26
+ sampleRate = parsed.sampleRate;
27
+ }
28
+ else if (parsed.sampleRate !== sampleRate) {
29
+ throw new Error(`Sample rate mismatch: expected ${sampleRate} Hz but got ${parsed.sampleRate} Hz`);
30
+ }
28
31
  buffers.push(parsed.data);
29
- totalDataSize += parsed.data.length;
30
- sampleRate = parsed.sampleRate;
31
32
  }
32
33
  }
33
- if (buffers.length === 0) {
34
+ if (buffers.length === 0 || sampleRate === null) {
34
35
  throw new Error("No valid WAV data to concatenate");
35
36
  }
36
- // Build new WAV file
37
37
  const dataChunk = Buffer.concat(buffers);
38
+ const bytesPerSample = 2; // 16-bit
39
+ const numSamples = dataChunk.length / bytesPerSample;
40
+ const durationMs = Math.round((numSamples / sampleRate) * 1000);
41
+ return { dataChunk, sampleRate, durationMs };
42
+ }
43
+ /**
44
+ * Concatenate multiple WAV chunk artifacts into a single WAV file.
45
+ * All chunks must be the same sample rate and format (16-bit PCM mono).
46
+ * Returns the path to the concatenated file.
47
+ */
48
+ export async function concatWavFiles(chunks, outputDir) {
49
+ const { dataChunk, sampleRate, durationMs } = await concatWavBuffers(chunks);
38
50
  const wavFile = buildWavFile(dataChunk, sampleRate);
39
51
  const filename = `vsmcp_concat_${randomUUID().slice(0, 8)}.wav`;
40
52
  const outPath = join(outputDir, filename);
41
53
  await writeFile(outPath, wavFile);
42
- const bytesPerSample = 2; // 16-bit
43
- const numSamples = dataChunk.length / bytesPerSample;
44
- const durationMs = Math.round((numSamples / sampleRate) * 1000);
45
54
  return { path: outPath, durationMs };
46
55
  }
47
56
  /**
48
57
  * Concatenate multiple WAV chunk artifacts into a single base64 string.
49
58
  */
50
59
  export async function concatWavBase64(chunks) {
51
- const buffers = [];
52
- let totalDataSize = 0;
53
- let sampleRate = 24000;
54
- for (const chunk of chunks) {
55
- let wav;
56
- if (chunk.audioPath) {
57
- wav = await readFile(chunk.audioPath);
58
- }
59
- else if (chunk.audioBytesBase64) {
60
- wav = Buffer.from(chunk.audioBytesBase64, "base64");
61
- }
62
- else {
63
- continue;
64
- }
65
- const parsed = parseWavData(wav);
66
- if (parsed) {
67
- buffers.push(parsed.data);
68
- totalDataSize += parsed.data.length;
69
- sampleRate = parsed.sampleRate;
70
- }
71
- }
72
- if (buffers.length === 0) {
73
- throw new Error("No valid WAV data to concatenate");
74
- }
75
- const dataChunk = Buffer.concat(buffers);
60
+ const { dataChunk, sampleRate, durationMs } = await concatWavBuffers(chunks);
76
61
  const wavFile = buildWavFile(dataChunk, sampleRate);
77
- const bytesPerSample = 2;
78
- const numSamples = dataChunk.length / bytesPerSample;
79
- const durationMs = Math.round((numSamples / sampleRate) * 1000);
80
62
  return { base64: wavFile.toString("base64"), durationMs };
81
63
  }
82
64
  function parseWavData(wav) {
@@ -86,20 +68,27 @@ function parseWavData(wav) {
86
68
  return null;
87
69
  if (wav.toString("ascii", 8, 12) !== "WAVE")
88
70
  return null;
89
- const sampleRate = wav.readUInt32LE(24);
90
- // Find data chunk
71
+ // Walk chunks iteratively to find 'fmt ' and 'data'
72
+ let sampleRate = null;
73
+ let dataBuffer = null;
91
74
  let offset = 12;
92
75
  while (offset < wav.length - 8) {
93
76
  const chunkId = wav.toString("ascii", offset, offset + 4);
94
77
  const chunkSize = wav.readUInt32LE(offset + 4);
95
- if (chunkId === "data") {
78
+ if (chunkId === "fmt " && chunkSize >= 16) {
79
+ sampleRate = wav.readUInt32LE(offset + 12); // bytes 4-7 of fmt payload
80
+ }
81
+ else if (chunkId === "data") {
96
82
  const dataStart = offset + 8;
97
83
  const dataEnd = Math.min(dataStart + chunkSize, wav.length);
98
- return { sampleRate, data: wav.subarray(dataStart, dataEnd) };
84
+ dataBuffer = wav.subarray(dataStart, dataEnd);
99
85
  }
100
- offset += 8 + chunkSize;
86
+ // RIFF spec: chunks are word-aligned (pad odd sizes to next even boundary)
87
+ offset += 8 + chunkSize + (chunkSize % 2);
101
88
  }
102
- return null;
89
+ if (sampleRate === null || dataBuffer === null)
90
+ return null;
91
+ return { sampleRate, data: dataBuffer };
103
92
  }
104
93
  export function buildWavFile(pcmData, sampleRate) {
105
94
  const bytesPerSample = 2;
@@ -1 +1 @@
1
- {"version":3,"file":"concat.js","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"concat.js","sourceRoot":"","sources":["../../src/orchestrator/concat.ts"],"names":[],"mappings":"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"}
package/dist/presets.d.ts CHANGED
@@ -1,10 +1,46 @@
1
1
  /** Voice presets — named configurations mapping to approved voices. */
2
+ /** Prosody configuration for fine-grained speech control (SSML-based backends). */
3
+ export interface ProsodyConfig {
4
+ /** Pitch adjustment (e.g. "+5%", "-8%", "0%"). Maps to SSML <prosody pitch="...">. */
5
+ readonly pitch?: string;
6
+ /** Rate multiplier as string (e.g. "0.92", "1.05"). Maps to SSML <prosody rate="...">. */
7
+ readonly rate?: string;
8
+ /** Volume level. Maps to SSML <prosody volume="...">. */
9
+ readonly volume?: "x-soft" | "soft" | "medium" | "loud" | "x-loud";
10
+ /** Emphasis level for punch words. Maps to SSML <emphasis level="...">. */
11
+ readonly emphasis?: "none" | "reduced" | "moderate" | "strong";
12
+ }
13
+ /**
14
+ * Piper-native prosody config — maps directly to Piper's SynthesisConfig params.
15
+ * Used when VOICE_SOUNDBOARD_ENGINE=piper for real prosody control
16
+ * (length_scale, noise_scale, noise_w_scale, volume).
17
+ */
18
+ export interface PiperProsodyConfig {
19
+ /** Phoneme length scale (>1 = slower, <1 = faster). Default 1.0. */
20
+ readonly length_scale: number;
21
+ /** Generator noise scale (lower = flatter/more monotone, higher = more expressive). 0–1. */
22
+ readonly noise_scale: number;
23
+ /** Phoneme width noise scale (lower = metronomic, higher = erratic timing). 0–1. */
24
+ readonly noise_w_scale: number;
25
+ /** Volume multiplier (0.5–1.5). Default 1.0. */
26
+ readonly volume: number;
27
+ /** Piper voice model name (e.g. "en_GB-alan-medium"). */
28
+ readonly piper_voice: string;
29
+ }
2
30
  export interface PresetConfig {
3
31
  readonly name: string;
4
32
  readonly voice: string;
5
33
  readonly speed: number;
6
34
  readonly description: string;
35
+ /** Optional prosody overrides for backends that support SSML. */
36
+ readonly prosody?: ProsodyConfig;
37
+ /** Optional Piper-native prosody config (used when engine=piper). */
38
+ readonly piperProsody?: PiperProsodyConfig;
7
39
  }
40
+ /** Humor mood identifiers for sensor-humor integration. */
41
+ export type HumorMood = "dry" | "roast" | "chaotic" | "cheeky" | "cynic" | "zoomer";
42
+ /** All valid humor mood names. */
43
+ export declare const HUMOR_MOODS: readonly HumorMood[];
8
44
  /**
9
45
  * Built-in presets. All voices reference the approved roster.
10
46
  *
@@ -13,8 +49,20 @@ export interface PresetConfig {
13
49
  * to the closest approved alternatives.
14
50
  */
15
51
  export declare const PRESETS: ReadonlyMap<string, PresetConfig>;
16
- /** All preset names as a set. */
52
+ /**
53
+ * Humor mood presets — voice + prosody tuned for comedic delivery styles.
54
+ * Used by sensor-humor MCP tool for spoken comedy integration.
55
+ */
56
+ export declare const HUMOR_PRESETS: ReadonlyMap<string, PresetConfig>;
57
+ /** All preset names as a set (includes humor presets). */
17
58
  export declare const PRESET_NAMES: ReadonlySet<string>;
18
- /** Get a preset by name, or undefined if not found. */
59
+ /** Get a preset by name, or undefined if not found. Searches both standard and humor presets. */
19
60
  export declare function getPreset(name: string): PresetConfig | undefined;
61
+ /** Get a humor preset by mood name (e.g. "dry" → humor_dry preset). */
62
+ export declare function getHumorPreset(mood: HumorMood): PresetConfig | undefined;
63
+ /**
64
+ * Wrap text in SSML prosody tags based on a ProsodyConfig.
65
+ * Returns the original text unchanged if no prosody is defined.
66
+ */
67
+ export declare function wrapWithProsody(text: string, prosody?: ProsodyConfig): string;
20
68
  //# sourceMappingURL=presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAMpD,CAAC;AAEH,iCAAiC;AACjC,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAA2B,CAAC;AAEzE,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEhE"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnE,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAChE;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CAC5C;AAED,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpF,kCAAkC;AAClC,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAElC,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAMpD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAiD1D,CAAC;AAQH,0DAA0D;AAC1D,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAA+B,CAAC;AAE7E,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEhE;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAExE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAe7E"}
package/dist/presets.js CHANGED
@@ -1,4 +1,8 @@
1
1
  /** Voice presets — named configurations mapping to approved voices. */
2
+ /** All valid humor mood names. */
3
+ export const HUMOR_MOODS = [
4
+ "dry", "roast", "chaotic", "cheeky", "cynic", "zoomer",
5
+ ];
2
6
  /**
3
7
  * Built-in presets. All voices reference the approved roster.
4
8
  *
@@ -13,10 +17,94 @@ export const PRESETS = new Map([
13
17
  ["storyteller", { name: "storyteller", voice: "bf_emma", speed: 0.9, description: "Expressive, varied pacing" }],
14
18
  ["whisper", { name: "whisper", voice: "af_sky", speed: 0.85, description: "Soft, intimate, gentle" }],
15
19
  ]);
16
- /** All preset names as a set. */
17
- export const PRESET_NAMES = new Set(PRESETS.keys());
18
- /** Get a preset by name, or undefined if not found. */
20
+ /**
21
+ * Humor mood presets — voice + prosody tuned for comedic delivery styles.
22
+ * Used by sensor-humor MCP tool for spoken comedy integration.
23
+ */
24
+ export const HUMOR_PRESETS = new Map([
25
+ ["humor_dry", {
26
+ name: "humor_dry",
27
+ voice: "bm_george",
28
+ speed: 0.92,
29
+ description: "Deadpan British flat — understated devastation",
30
+ prosody: { pitch: "-8%", rate: "0.92", volume: "medium", emphasis: "none" },
31
+ piperProsody: { piper_voice: "en_GB-alan-medium", length_scale: 1.15, noise_scale: 0.3, noise_w_scale: 0.3, volume: 0.9 },
32
+ }],
33
+ ["humor_roast", {
34
+ name: "humor_roast",
35
+ voice: "am_eric",
36
+ speed: 1.05,
37
+ description: "Warm sarcasm — slight energy on verdict labels",
38
+ prosody: { pitch: "+5%", rate: "1.05", volume: "medium", emphasis: "moderate" },
39
+ piperProsody: { piper_voice: "en_US-ryan-high", length_scale: 0.95, noise_scale: 0.667, noise_w_scale: 0.8, volume: 1.0 },
40
+ }],
41
+ ["humor_chaotic", {
42
+ name: "humor_chaotic",
43
+ voice: "am_liam",
44
+ speed: 1.05,
45
+ description: "News anchor goes off-script — grounded start, absurd pivot, total confidence",
46
+ prosody: { pitch: "+5%", rate: "1.05", volume: "medium", emphasis: "moderate" },
47
+ piperProsody: { piper_voice: "en_US-lessac-high", length_scale: 0.95, noise_scale: 0.7, noise_w_scale: 0.8, volume: 1.05 },
48
+ }],
49
+ ["humor_cheeky", {
50
+ name: "humor_cheeky",
51
+ voice: "af_jessica",
52
+ speed: 1.0,
53
+ description: "Playful teasing — warm opener, gentle mockery with a wink",
54
+ prosody: { pitch: "+3%", rate: "1.0", volume: "medium", emphasis: "moderate" },
55
+ piperProsody: { piper_voice: "en_GB-cori-high", length_scale: 1.0, noise_scale: 0.6, noise_w_scale: 0.65, volume: 1.0 },
56
+ }],
57
+ ["humor_cynic", {
58
+ name: "humor_cynic",
59
+ voice: "bm_george",
60
+ speed: 0.90,
61
+ description: "Bitter jaded realism — flat, cold, quietly vicious",
62
+ prosody: { pitch: "-5%", rate: "0.90", volume: "soft", emphasis: "none" },
63
+ piperProsody: { piper_voice: "en_GB-alan-medium", length_scale: 1.20, noise_scale: 0.25, noise_w_scale: 0.25, volume: 0.85 },
64
+ }],
65
+ ["humor_zoomer", {
66
+ name: "humor_zoomer",
67
+ voice: "am_fenrir",
68
+ speed: 1.12,
69
+ description: "Terminally online streamer — brisk, mocking, one caps hit",
70
+ prosody: { pitch: "+8%", rate: "1.12", volume: "loud", emphasis: "strong" },
71
+ piperProsody: { piper_voice: "en_US-ryan-high", length_scale: 0.90, noise_scale: 0.85, noise_w_scale: 0.9, volume: 1.15 },
72
+ }],
73
+ ]);
74
+ /** Combined map: standard presets + humor presets. */
75
+ const ALL_PRESETS = new Map([
76
+ ...PRESETS,
77
+ ...HUMOR_PRESETS,
78
+ ]);
79
+ /** All preset names as a set (includes humor presets). */
80
+ export const PRESET_NAMES = new Set(ALL_PRESETS.keys());
81
+ /** Get a preset by name, or undefined if not found. Searches both standard and humor presets. */
19
82
  export function getPreset(name) {
20
- return PRESETS.get(name);
83
+ return ALL_PRESETS.get(name);
84
+ }
85
+ /** Get a humor preset by mood name (e.g. "dry" → humor_dry preset). */
86
+ export function getHumorPreset(mood) {
87
+ return HUMOR_PRESETS.get(`humor_${mood}`);
88
+ }
89
+ /**
90
+ * Wrap text in SSML prosody tags based on a ProsodyConfig.
91
+ * Returns the original text unchanged if no prosody is defined.
92
+ */
93
+ export function wrapWithProsody(text, prosody) {
94
+ if (!prosody)
95
+ return text;
96
+ const attrs = [];
97
+ if (prosody.pitch)
98
+ attrs.push(`pitch="${prosody.pitch}"`);
99
+ if (prosody.rate)
100
+ attrs.push(`rate="${prosody.rate}"`);
101
+ if (prosody.volume)
102
+ attrs.push(`volume="${prosody.volume}"`);
103
+ if (attrs.length === 0)
104
+ return text;
105
+ const inner = prosody.emphasis && prosody.emphasis !== "none"
106
+ ? `<emphasis level="${prosody.emphasis}">${text}</emphasis>`
107
+ : text;
108
+ return `<speak><prosody ${attrs.join(" ")}>${inner}</prosody></speak>`;
21
109
  }
22
110
  //# sourceMappingURL=presets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,uEAAuE;AASvE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAsC,IAAI,GAAG,CAAC;IAChE,CAAC,WAAW,EAAI,EAAE,IAAI,EAAE,WAAW,EAAI,KAAK,EAAE,YAAY,EAAG,KAAK,EAAE,GAAG,EAAG,WAAW,EAAE,mCAAmC,EAAE,CAAC;IAC7H,CAAC,UAAU,EAAK,EAAE,IAAI,EAAE,UAAU,EAAK,KAAK,EAAE,WAAW,EAAI,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAC1H,CAAC,WAAW,EAAI,EAAE,IAAI,EAAE,WAAW,EAAI,KAAK,EAAE,SAAS,EAAM,KAAK,EAAE,GAAG,EAAG,WAAW,EAAE,kCAAkC,EAAE,CAAC;IAC5H,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAM,KAAK,EAAE,GAAG,EAAG,WAAW,EAAE,2BAA2B,EAAE,CAAC;IACrH,CAAC,SAAS,EAAM,EAAE,IAAI,EAAE,SAAS,EAAM,KAAK,EAAE,QAAQ,EAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;CACnH,CAAC,CAAC;AAEH,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAEzE,uDAAuD;AACvD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
package/dist/schemas.d.ts CHANGED
@@ -31,6 +31,7 @@ export interface VoiceInterruptResponse {
31
31
  readonly interrupted: boolean;
32
32
  readonly streamId?: string;
33
33
  readonly reason: string;
34
+ readonly message?: string;
34
35
  }
35
36
  export interface VoiceStreamResponse {
36
37
  readonly streamId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAI7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAID,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;CAC1D;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,uCAAuC;AACvC,MAAM,MAAM,cAAc,GACtB,oBAAoB,GACpB,2BAA2B,GAC3B,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,sBAAsB,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAEhB,gBAAgB,GAChB,MAAM,GACN,iBAAiB,GACjB,cAAc,GACd,mBAAmB,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAI7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;CAC1D;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,uCAAuC;AACvC,MAAM,MAAM,cAAc,GACtB,oBAAoB,GACpB,2BAA2B,GAC3B,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,sBAAsB,GACtB,qBAAqB,GACrB,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAEhB,gBAAgB,GAChB,MAAM,GACN,iBAAiB,GACjB,cAAc,GACd,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/sfx/parser.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAA2D,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAW1G,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,OAAe,GACvB,cAAc,CAkFhB"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/sfx/parser.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAA2D,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAW1G,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,OAAe,GACvB,cAAc,CAkFhB"}
@@ -9,6 +9,7 @@ const SFX_TAG_SET = new Set(SFX_TAGS);
9
9
  const SFX_TAG_RE = /\[(\w+)\]/g;
10
10
  /** Check whether text contains any potential SFX tags. */
11
11
  export function hasSfxTags(text) {
12
+ SFX_TAG_RE.lastIndex = 0;
12
13
  return SFX_TAG_RE.test(text);
13
14
  }
14
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/sfx/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/sfx/parser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,44 +1,50 @@
1
- {
2
- "name": "@mcptoolshop/voice-soundboard-core",
3
- "version": "1.0.0",
4
- "description": "Backend-agnostic core library for MCP Voice Soundboard — 48 voices, 9 languages, validation, SSML-lite, chunking, emotion spans, SFX tags, and schemas.",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "files": ["dist", "README.md"],
9
- "license": "MIT",
10
- "author": "mcp-tool-shop <64996768+mcp-tool-shop@users.noreply.github.com>",
11
- "repository": {
12
- "type": "git",
13
- "url": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard.git",
14
- "directory": "packages/core"
15
- },
16
- "homepage": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard/tree/main/packages/core#readme",
17
- "bugs": {
18
- "url": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard/issues"
19
- },
20
- "keywords": [
21
- "mcp",
22
- "voice",
23
- "tts",
24
- "text-to-speech",
25
- "soundboard",
26
- "ssml",
27
- "speech-synthesis",
28
- "ai-agent",
29
- "model-context-protocol"
30
- ],
31
- "engines": {
32
- "node": ">=20.0.0"
33
- },
34
- "scripts": {
35
- "build": "tsc",
36
- "test": "vitest run",
37
- "clean": "rm -rf dist"
38
- },
39
- "devDependencies": {
40
- "@types/node": "^22.0.0",
41
- "typescript": "^5.7.0",
42
- "vitest": "^3.0.0"
43
- }
44
- }
1
+ {
2
+ "name": "@mcptoolshop/voice-soundboard-core",
3
+ "version": "1.1.0",
4
+ "description": "Backend-agnostic core library for MCP Voice Soundboard — 48 voices, 9 languages, validation, SSML-lite, chunking, emotion spans, SFX tags, and schemas.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "CHANGELOG.md",
12
+ "LICENSE"
13
+ ],
14
+ "license": "MIT",
15
+ "author": "mcp-tool-shop <64996768+mcp-tool-shop@users.noreply.github.com>",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard.git",
19
+ "directory": "packages/core"
20
+ },
21
+ "homepage": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard/tree/main/packages/core#readme",
22
+ "bugs": {
23
+ "url": "https://github.com/mcp-tool-shop-org/mcp-voice-soundboard/issues"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "voice",
28
+ "tts",
29
+ "text-to-speech",
30
+ "soundboard",
31
+ "ssml",
32
+ "speech-synthesis",
33
+ "ai-agent",
34
+ "model-context-protocol"
35
+ ],
36
+ "engines": {
37
+ "node": ">=20.0.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc",
41
+ "test": "vitest run",
42
+ "clean": "rm -rf dist"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.0.0",
46
+ "@vitest/coverage-v8": "3",
47
+ "typescript": "^5.7.0",
48
+ "vitest": "^3.0.0"
49
+ }
50
+ }