@nac3/forge-cli 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +45 -0
- package/README.md +371 -0
- package/dist/bin/yf.d.ts +5 -0
- package/dist/bin/yf.d.ts.map +1 -0
- package/dist/bin/yf.js +86 -0
- package/dist/bin/yf.js.map +1 -0
- package/dist/chat/claude.d.ts +100 -0
- package/dist/chat/claude.d.ts.map +1 -0
- package/dist/chat/claude.js +228 -0
- package/dist/chat/claude.js.map +1 -0
- package/dist/chat/ingest_session.d.ts +97 -0
- package/dist/chat/ingest_session.d.ts.map +1 -0
- package/dist/chat/ingest_session.js +99 -0
- package/dist/chat/ingest_session.js.map +1 -0
- package/dist/chat/panel.d.ts +15 -0
- package/dist/chat/panel.d.ts.map +1 -0
- package/dist/chat/panel.js +1526 -0
- package/dist/chat/panel.js.map +1 -0
- package/dist/chat/persistence.d.ts +37 -0
- package/dist/chat/persistence.d.ts.map +1 -0
- package/dist/chat/persistence.js +91 -0
- package/dist/chat/persistence.js.map +1 -0
- package/dist/chat/server.d.ts +34 -0
- package/dist/chat/server.d.ts.map +1 -0
- package/dist/chat/server.js +1540 -0
- package/dist/chat/server.js.map +1 -0
- package/dist/chat/spec_extract.d.ts +35 -0
- package/dist/chat/spec_extract.d.ts.map +1 -0
- package/dist/chat/spec_extract.js +152 -0
- package/dist/chat/spec_extract.js.map +1 -0
- package/dist/chat/spec_plan.d.ts +65 -0
- package/dist/chat/spec_plan.d.ts.map +1 -0
- package/dist/chat/spec_plan.js +160 -0
- package/dist/chat/spec_plan.js.map +1 -0
- package/dist/chat/spec_scaffold.d.ts +95 -0
- package/dist/chat/spec_scaffold.d.ts.map +1 -0
- package/dist/chat/spec_scaffold.js +220 -0
- package/dist/chat/spec_scaffold.js.map +1 -0
- package/dist/chat/tools/git.d.ts +59 -0
- package/dist/chat/tools/git.d.ts.map +1 -0
- package/dist/chat/tools/git.js +313 -0
- package/dist/chat/tools/git.js.map +1 -0
- package/dist/chat/tools/github.d.ts +59 -0
- package/dist/chat/tools/github.d.ts.map +1 -0
- package/dist/chat/tools/github.js +310 -0
- package/dist/chat/tools/github.js.map +1 -0
- package/dist/chat/tools/lifecycle.d.ts +82 -0
- package/dist/chat/tools/lifecycle.d.ts.map +1 -0
- package/dist/chat/tools/lifecycle.js +295 -0
- package/dist/chat/tools/lifecycle.js.map +1 -0
- package/dist/chat/tools/manual.d.ts +26 -0
- package/dist/chat/tools/manual.d.ts.map +1 -0
- package/dist/chat/tools/manual.js +164 -0
- package/dist/chat/tools/manual.js.map +1 -0
- package/dist/chat/tools/reader.d.ts +80 -0
- package/dist/chat/tools/reader.d.ts.map +1 -0
- package/dist/chat/tools/reader.js +471 -0
- package/dist/chat/tools/reader.js.map +1 -0
- package/dist/chat/tools.d.ts +106 -0
- package/dist/chat/tools.d.ts.map +1 -0
- package/dist/chat/tools.js +587 -0
- package/dist/chat/tools.js.map +1 -0
- package/dist/codegen/e2e.d.ts +106 -0
- package/dist/codegen/e2e.d.ts.map +1 -0
- package/dist/codegen/e2e.js +931 -0
- package/dist/codegen/e2e.js.map +1 -0
- package/dist/codegen/v3_flow_emit.d.ts +70 -0
- package/dist/codegen/v3_flow_emit.d.ts.map +1 -0
- package/dist/codegen/v3_flow_emit.js +225 -0
- package/dist/codegen/v3_flow_emit.js.map +1 -0
- package/dist/commands/_stub.d.ts +2 -0
- package/dist/commands/_stub.d.ts.map +1 -0
- package/dist/commands/_stub.js +21 -0
- package/dist/commands/_stub.js.map +1 -0
- package/dist/commands/app.d.ts +31 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +331 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/chat.d.ts +18 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +76 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/deploy.d.ts +21 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +121 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +14 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +280 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/figma.d.ts +32 -0
- package/dist/commands/figma.d.ts.map +1 -0
- package/dist/commands/figma.js +141 -0
- package/dist/commands/figma.js.map +1 -0
- package/dist/commands/gen-flow-tests.d.ts +8 -0
- package/dist/commands/gen-flow-tests.d.ts.map +1 -0
- package/dist/commands/gen-flow-tests.js +78 -0
- package/dist/commands/gen-flow-tests.js.map +1 -0
- package/dist/commands/gen-tests.d.ts +9 -0
- package/dist/commands/gen-tests.d.ts.map +1 -0
- package/dist/commands/gen-tests.js +118 -0
- package/dist/commands/gen-tests.js.map +1 -0
- package/dist/commands/license.d.ts +14 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +182 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/log.d.ts +19 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +101 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/migrate.d.ts +118 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +1410 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mobile.d.ts +27 -0
- package/dist/commands/mobile.d.ts.map +1 -0
- package/dist/commands/mobile.js +90 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/new.d.ts +32 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +107 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/pilot.d.ts +8 -0
- package/dist/commands/pilot.d.ts.map +1 -0
- package/dist/commands/pilot.js +104 -0
- package/dist/commands/pilot.js.map +1 -0
- package/dist/commands/projects.d.ts +21 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +238 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/publish.d.ts +35 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +194 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/repo.d.ts +59 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +178 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/review-screens.d.ts +28 -0
- package/dist/commands/review-screens.d.ts.map +1 -0
- package/dist/commands/review-screens.js +345 -0
- package/dist/commands/review-screens.js.map +1 -0
- package/dist/commands/scenarios.d.ts +23 -0
- package/dist/commands/scenarios.d.ts.map +1 -0
- package/dist/commands/scenarios.js +304 -0
- package/dist/commands/scenarios.js.map +1 -0
- package/dist/commands/ship.d.ts +18 -0
- package/dist/commands/ship.d.ts.map +1 -0
- package/dist/commands/ship.js +41 -0
- package/dist/commands/ship.js.map +1 -0
- package/dist/commands/test.d.ts +29 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +62 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tunnel.d.ts +22 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +77 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/validate.d.ts +14 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +51 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/vault.d.ts +32 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +489 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/voice.d.ts +16 -0
- package/dist/commands/voice.d.ts.map +1 -0
- package/dist/commands/voice.js +69 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/core/cascade_router.d.ts +90 -0
- package/dist/core/cascade_router.d.ts.map +1 -0
- package/dist/core/cascade_router.js +131 -0
- package/dist/core/cascade_router.js.map +1 -0
- package/dist/core/cf_tunnel.d.ts +52 -0
- package/dist/core/cf_tunnel.d.ts.map +1 -0
- package/dist/core/cf_tunnel.js +134 -0
- package/dist/core/cf_tunnel.js.map +1 -0
- package/dist/core/gha_dispatcher.d.ts +48 -0
- package/dist/core/gha_dispatcher.d.ts.map +1 -0
- package/dist/core/gha_dispatcher.js +198 -0
- package/dist/core/gha_dispatcher.js.map +1 -0
- package/dist/core/logger.d.ts +89 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +245 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mode.d.ts +26 -0
- package/dist/core/mode.d.ts.map +1 -0
- package/dist/core/mode.js +122 -0
- package/dist/core/mode.js.map +1 -0
- package/dist/core/pairing.d.ts +40 -0
- package/dist/core/pairing.d.ts.map +1 -0
- package/dist/core/pairing.js +145 -0
- package/dist/core/pairing.js.map +1 -0
- package/dist/core/pilot_setup.d.ts +29 -0
- package/dist/core/pilot_setup.d.ts.map +1 -0
- package/dist/core/pilot_setup.js +119 -0
- package/dist/core/pilot_setup.js.map +1 -0
- package/dist/core/polar.d.ts +81 -0
- package/dist/core/polar.d.ts.map +1 -0
- package/dist/core/polar.js +175 -0
- package/dist/core/polar.js.map +1 -0
- package/dist/core/project_picker.d.ts +56 -0
- package/dist/core/project_picker.d.ts.map +1 -0
- package/dist/core/project_picker.js +86 -0
- package/dist/core/project_picker.js.map +1 -0
- package/dist/core/projects.d.ts +58 -0
- package/dist/core/projects.d.ts.map +1 -0
- package/dist/core/projects.js +146 -0
- package/dist/core/projects.js.map +1 -0
- package/dist/core/projects_sync.d.ts +80 -0
- package/dist/core/projects_sync.d.ts.map +1 -0
- package/dist/core/projects_sync.js +278 -0
- package/dist/core/projects_sync.js.map +1 -0
- package/dist/core/remote_runner.d.ts +70 -0
- package/dist/core/remote_runner.d.ts.map +1 -0
- package/dist/core/remote_runner.js +133 -0
- package/dist/core/remote_runner.js.map +1 -0
- package/dist/core/repo_state.d.ts +24 -0
- package/dist/core/repo_state.d.ts.map +1 -0
- package/dist/core/repo_state.js +109 -0
- package/dist/core/repo_state.js.map +1 -0
- package/dist/core/target.d.ts +31 -0
- package/dist/core/target.d.ts.map +1 -0
- package/dist/core/target.js +121 -0
- package/dist/core/target.js.map +1 -0
- package/dist/deploy/aws.d.ts +43 -0
- package/dist/deploy/aws.d.ts.map +1 -0
- package/dist/deploy/aws.js +173 -0
- package/dist/deploy/aws.js.map +1 -0
- package/dist/figma/api.d.ts +35 -0
- package/dist/figma/api.d.ts.map +1 -0
- package/dist/figma/api.js +40 -0
- package/dist/figma/api.js.map +1 -0
- package/dist/figma/decorator.d.ts +74 -0
- package/dist/figma/decorator.d.ts.map +1 -0
- package/dist/figma/decorator.js +210 -0
- package/dist/figma/decorator.js.map +1 -0
- package/dist/figma/heuristics.d.ts +29 -0
- package/dist/figma/heuristics.d.ts.map +1 -0
- package/dist/figma/heuristics.js +110 -0
- package/dist/figma/heuristics.js.map +1 -0
- package/dist/figma/normalize.d.ts +33 -0
- package/dist/figma/normalize.d.ts.map +1 -0
- package/dist/figma/normalize.js +101 -0
- package/dist/figma/normalize.js.map +1 -0
- package/dist/figma/tokens.d.ts +23 -0
- package/dist/figma/tokens.d.ts.map +1 -0
- package/dist/figma/tokens.js +111 -0
- package/dist/figma/tokens.js.map +1 -0
- package/dist/figma/types.d.ts +118 -0
- package/dist/figma/types.d.ts.map +1 -0
- package/dist/figma/types.js +12 -0
- package/dist/figma/types.js.map +1 -0
- package/dist/i18n/index.d.ts +48 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +135 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +52 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +85 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/lan/mdns_packet.d.ts +74 -0
- package/dist/lan/mdns_packet.d.ts.map +1 -0
- package/dist/lan/mdns_packet.js +247 -0
- package/dist/lan/mdns_packet.js.map +1 -0
- package/dist/lan/mdns_service.d.ts +102 -0
- package/dist/lan/mdns_service.d.ts.map +1 -0
- package/dist/lan/mdns_service.js +206 -0
- package/dist/lan/mdns_service.js.map +1 -0
- package/dist/license/activate.d.ts +33 -0
- package/dist/license/activate.d.ts.map +1 -0
- package/dist/license/activate.js +135 -0
- package/dist/license/activate.js.map +1 -0
- package/dist/license/fingerprint.d.ts +2 -0
- package/dist/license/fingerprint.d.ts.map +1 -0
- package/dist/license/fingerprint.js +29 -0
- package/dist/license/fingerprint.js.map +1 -0
- package/dist/license/hito4_client.d.ts +24 -0
- package/dist/license/hito4_client.d.ts.map +1 -0
- package/dist/license/hito4_client.js +103 -0
- package/dist/license/hito4_client.js.map +1 -0
- package/dist/license/index.d.ts +22 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +125 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/types.d.ts +38 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +9 -0
- package/dist/license/types.js.map +1 -0
- package/dist/migrate/ai-apply.d.ts +198 -0
- package/dist/migrate/ai-apply.d.ts.map +1 -0
- package/dist/migrate/ai-apply.js +833 -0
- package/dist/migrate/ai-apply.js.map +1 -0
- package/dist/migrate/ai-decorator.d.ts +87 -0
- package/dist/migrate/ai-decorator.d.ts.map +1 -0
- package/dist/migrate/ai-decorator.js +203 -0
- package/dist/migrate/ai-decorator.js.map +1 -0
- package/dist/migrate/apply.d.ts +28 -0
- package/dist/migrate/apply.d.ts.map +1 -0
- package/dist/migrate/apply.js +119 -0
- package/dist/migrate/apply.js.map +1 -0
- package/dist/migrate/audit.d.ts +9 -0
- package/dist/migrate/audit.d.ts.map +1 -0
- package/dist/migrate/audit.js +197 -0
- package/dist/migrate/audit.js.map +1 -0
- package/dist/migrate/diff.d.ts +28 -0
- package/dist/migrate/diff.d.ts.map +1 -0
- package/dist/migrate/diff.js +154 -0
- package/dist/migrate/diff.js.map +1 -0
- package/dist/migrate/html-orchestrator.d.ts +81 -0
- package/dist/migrate/html-orchestrator.d.ts.map +1 -0
- package/dist/migrate/html-orchestrator.js +233 -0
- package/dist/migrate/html-orchestrator.js.map +1 -0
- package/dist/migrate/html-walker.d.ts +93 -0
- package/dist/migrate/html-walker.d.ts.map +1 -0
- package/dist/migrate/html-walker.js +288 -0
- package/dist/migrate/html-walker.js.map +1 -0
- package/dist/migrate/js-template-walker.d.ts +118 -0
- package/dist/migrate/js-template-walker.d.ts.map +1 -0
- package/dist/migrate/js-template-walker.js +644 -0
- package/dist/migrate/js-template-walker.js.map +1 -0
- package/dist/migrate/manifest-validator.d.ts +30 -0
- package/dist/migrate/manifest-validator.d.ts.map +1 -0
- package/dist/migrate/manifest-validator.js +261 -0
- package/dist/migrate/manifest-validator.js.map +1 -0
- package/dist/migrate/overrides.d.ts +58 -0
- package/dist/migrate/overrides.d.ts.map +1 -0
- package/dist/migrate/overrides.js +193 -0
- package/dist/migrate/overrides.js.map +1 -0
- package/dist/migrate/plugin-scope.d.ts +42 -0
- package/dist/migrate/plugin-scope.d.ts.map +1 -0
- package/dist/migrate/plugin-scope.js +94 -0
- package/dist/migrate/plugin-scope.js.map +1 -0
- package/dist/migrate/types.d.ts +45 -0
- package/dist/migrate/types.d.ts.map +1 -0
- package/dist/migrate/types.js +9 -0
- package/dist/migrate/types.js.map +1 -0
- package/dist/migrate/verb-inference.d.ts +37 -0
- package/dist/migrate/verb-inference.d.ts.map +1 -0
- package/dist/migrate/verb-inference.js +274 -0
- package/dist/migrate/verb-inference.js.map +1 -0
- package/dist/nac3/attrs.d.ts +87 -0
- package/dist/nac3/attrs.d.ts.map +1 -0
- package/dist/nac3/attrs.js +134 -0
- package/dist/nac3/attrs.js.map +1 -0
- package/dist/nac3/scenario_dsl.d.ts +71 -0
- package/dist/nac3/scenario_dsl.d.ts.map +1 -0
- package/dist/nac3/scenario_dsl.js +191 -0
- package/dist/nac3/scenario_dsl.js.map +1 -0
- package/dist/nac3/tokens.d.ts +126 -0
- package/dist/nac3/tokens.d.ts.map +1 -0
- package/dist/nac3/tokens.js +138 -0
- package/dist/nac3/tokens.js.map +1 -0
- package/dist/reader/parsers/csv.d.ts +42 -0
- package/dist/reader/parsers/csv.d.ts.map +1 -0
- package/dist/reader/parsers/csv.js +221 -0
- package/dist/reader/parsers/csv.js.map +1 -0
- package/dist/reader/parsers/docx.d.ts +31 -0
- package/dist/reader/parsers/docx.d.ts.map +1 -0
- package/dist/reader/parsers/docx.js +51 -0
- package/dist/reader/parsers/docx.js.map +1 -0
- package/dist/reader/parsers/epub.d.ts +39 -0
- package/dist/reader/parsers/epub.d.ts.map +1 -0
- package/dist/reader/parsers/epub.js +265 -0
- package/dist/reader/parsers/epub.js.map +1 -0
- package/dist/reader/parsers/html.d.ts +40 -0
- package/dist/reader/parsers/html.d.ts.map +1 -0
- package/dist/reader/parsers/html.js +386 -0
- package/dist/reader/parsers/html.js.map +1 -0
- package/dist/reader/parsers/md.d.ts +30 -0
- package/dist/reader/parsers/md.d.ts.map +1 -0
- package/dist/reader/parsers/md.js +199 -0
- package/dist/reader/parsers/md.js.map +1 -0
- package/dist/reader/parsers/pdf.d.ts +39 -0
- package/dist/reader/parsers/pdf.d.ts.map +1 -0
- package/dist/reader/parsers/pdf.js +220 -0
- package/dist/reader/parsers/pdf.js.map +1 -0
- package/dist/reader/parsers/rtf.d.ts +37 -0
- package/dist/reader/parsers/rtf.d.ts.map +1 -0
- package/dist/reader/parsers/rtf.js +347 -0
- package/dist/reader/parsers/rtf.js.map +1 -0
- package/dist/reader/parsers/source.d.ts +32 -0
- package/dist/reader/parsers/source.d.ts.map +1 -0
- package/dist/reader/parsers/source.js +122 -0
- package/dist/reader/parsers/source.js.map +1 -0
- package/dist/reader/parsers/txt.d.ts +25 -0
- package/dist/reader/parsers/txt.d.ts.map +1 -0
- package/dist/reader/parsers/txt.js +56 -0
- package/dist/reader/parsers/txt.js.map +1 -0
- package/dist/reader/parsers/xlsx.d.ts +33 -0
- package/dist/reader/parsers/xlsx.d.ts.map +1 -0
- package/dist/reader/parsers/xlsx.js +143 -0
- package/dist/reader/parsers/xlsx.js.map +1 -0
- package/dist/reader/registry.d.ts +39 -0
- package/dist/reader/registry.d.ts.map +1 -0
- package/dist/reader/registry.js +172 -0
- package/dist/reader/registry.js.map +1 -0
- package/dist/reader/search.d.ts +27 -0
- package/dist/reader/search.d.ts.map +1 -0
- package/dist/reader/search.js +77 -0
- package/dist/reader/search.js.map +1 -0
- package/dist/reader/state.d.ts +56 -0
- package/dist/reader/state.d.ts.map +1 -0
- package/dist/reader/state.js +179 -0
- package/dist/reader/state.js.map +1 -0
- package/dist/reader/types.d.ts +119 -0
- package/dist/reader/types.d.ts.map +1 -0
- package/dist/reader/types.js +23 -0
- package/dist/reader/types.js.map +1 -0
- package/dist/ship/run.d.ts +26 -0
- package/dist/ship/run.d.ts.map +1 -0
- package/dist/ship/run.js +123 -0
- package/dist/ship/run.js.map +1 -0
- package/dist/template/index.d.ts +50 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +140 -0
- package/dist/template/index.js.map +1 -0
- package/dist/ui/colors.d.ts +13 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +26 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/validate/index.d.ts +19 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +181 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/vault/catalog.d.ts +55 -0
- package/dist/vault/catalog.d.ts.map +1 -0
- package/dist/vault/catalog.js +424 -0
- package/dist/vault/catalog.js.map +1 -0
- package/dist/vault/crypto.d.ts +82 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +173 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/git_askpass.d.ts +26 -0
- package/dist/vault/git_askpass.d.ts.map +1 -0
- package/dist/vault/git_askpass.js +104 -0
- package/dist/vault/git_askpass.js.map +1 -0
- package/dist/vault/migrator.d.ts +57 -0
- package/dist/vault/migrator.d.ts.map +1 -0
- package/dist/vault/migrator.js +204 -0
- package/dist/vault/migrator.js.map +1 -0
- package/dist/vault/redactor.d.ts +73 -0
- package/dist/vault/redactor.d.ts.map +1 -0
- package/dist/vault/redactor.js +182 -0
- package/dist/vault/redactor.js.map +1 -0
- package/dist/vault/store.d.ts +132 -0
- package/dist/vault/store.d.ts.map +1 -0
- package/dist/vault/store.js +335 -0
- package/dist/vault/store.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/voice/chunker.d.ts +43 -0
- package/dist/voice/chunker.d.ts.map +1 -0
- package/dist/voice/chunker.js +133 -0
- package/dist/voice/chunker.js.map +1 -0
- package/dist/voice/config.d.ts +14 -0
- package/dist/voice/config.d.ts.map +1 -0
- package/dist/voice/config.js +51 -0
- package/dist/voice/config.js.map +1 -0
- package/dist/voice/intents.d.ts +71 -0
- package/dist/voice/intents.d.ts.map +1 -0
- package/dist/voice/intents.js +0 -0
- package/dist/voice/intents.js.map +1 -0
- package/dist/voice/providers/elevenlabs.d.ts +53 -0
- package/dist/voice/providers/elevenlabs.d.ts.map +1 -0
- package/dist/voice/providers/elevenlabs.js +159 -0
- package/dist/voice/providers/elevenlabs.js.map +1 -0
- package/dist/voice/providers/google.d.ts +56 -0
- package/dist/voice/providers/google.d.ts.map +1 -0
- package/dist/voice/providers/google.js +253 -0
- package/dist/voice/providers/google.js.map +1 -0
- package/dist/voice/providers/whisper.d.ts +44 -0
- package/dist/voice/providers/whisper.d.ts.map +1 -0
- package/dist/voice/providers/whisper.js +179 -0
- package/dist/voice/providers/whisper.js.map +1 -0
- package/dist/voice/registry.d.ts +35 -0
- package/dist/voice/registry.d.ts.map +1 -0
- package/dist/voice/registry.js +48 -0
- package/dist/voice/registry.js.map +1 -0
- package/dist/voice/router.d.ts +62 -0
- package/dist/voice/router.d.ts.map +1 -0
- package/dist/voice/router.js +175 -0
- package/dist/voice/router.js.map +1 -0
- package/dist/voice/types.d.ts +116 -0
- package/dist/voice/types.d.ts.map +1 -0
- package/dist/voice/types.js +22 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/voice/voiceprint/enrollment.d.ts +36 -0
- package/dist/voice/voiceprint/enrollment.d.ts.map +1 -0
- package/dist/voice/voiceprint/enrollment.js +71 -0
- package/dist/voice/voiceprint/enrollment.js.map +1 -0
- package/dist/voice/voiceprint/identify.d.ts +16 -0
- package/dist/voice/voiceprint/identify.d.ts.map +1 -0
- package/dist/voice/voiceprint/identify.js +20 -0
- package/dist/voice/voiceprint/identify.js.map +1 -0
- package/dist/voice/voiceprint/liveness.d.ts +90 -0
- package/dist/voice/voiceprint/liveness.d.ts.map +1 -0
- package/dist/voice/voiceprint/liveness.js +251 -0
- package/dist/voice/voiceprint/liveness.js.map +1 -0
- package/dist/voice/voiceprint/match.d.ts +54 -0
- package/dist/voice/voiceprint/match.d.ts.map +1 -0
- package/dist/voice/voiceprint/match.js +88 -0
- package/dist/voice/voiceprint/match.js.map +1 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts +44 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts.map +1 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.js +92 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.js.map +1 -0
- package/dist/voice/voiceprint/store.d.ts +60 -0
- package/dist/voice/voiceprint/store.d.ts.map +1 -0
- package/dist/voice/voiceprint/store.js +155 -0
- package/dist/voice/voiceprint/store.js.map +1 -0
- package/dist/voice/voiceprint/trust.d.ts +90 -0
- package/dist/voice/voiceprint/trust.d.ts.map +1 -0
- package/dist/voice/voiceprint/trust.js +150 -0
- package/dist/voice/voiceprint/trust.js.map +1 -0
- package/dist/voice/voiceprint/types.d.ts +100 -0
- package/dist/voice/voiceprint/types.d.ts.map +1 -0
- package/dist/voice/voiceprint/types.js +23 -0
- package/dist/voice/voiceprint/types.js.map +1 -0
- package/dist/voice/wake.d.ts +64 -0
- package/dist/voice/wake.d.ts.map +1 -0
- package/dist/voice/wake.js +143 -0
- package/dist/voice/wake.js.map +1 -0
- package/docs/manuals/manual.ar.html +91 -0
- package/docs/manuals/manual.de.html +100 -0
- package/docs/manuals/manual.en.html +118 -0
- package/docs/manuals/manual.es.html +120 -0
- package/docs/manuals/manual.fr.html +102 -0
- package/docs/manuals/manual.hi.html +93 -0
- package/docs/manuals/manual.it.html +93 -0
- package/docs/manuals/manual.ja.html +97 -0
- package/docs/manuals/manual.pt.html +103 -0
- package/docs/manuals/manual.zh.html +89 -0
- package/package.json +94 -0
- package/src/i18n/catalogs/ar.json +86 -0
- package/src/i18n/catalogs/de.json +86 -0
- package/src/i18n/catalogs/en.json +86 -0
- package/src/i18n/catalogs/es.json +86 -0
- package/src/i18n/catalogs/fr.json +86 -0
- package/src/i18n/catalogs/hi.json +86 -0
- package/src/i18n/catalogs/it.json +86 -0
- package/src/i18n/catalogs/ja.json +86 -0
- package/src/i18n/catalogs/pt.json +86 -0
- package/src/i18n/catalogs/zh.json +86 -0
- package/templates/react-app/README.md +43 -0
- package/templates/react-app/index.html +12 -0
- package/templates/react-app/package.json +35 -0
- package/templates/react-app/src/App.tsx +106 -0
- package/templates/react-app/src/main.tsx +21 -0
- package/templates/react-app/src/nac/manifest.ts +46 -0
- package/templates/react-app/src/styles.css +68 -0
- package/templates/react-app/tsconfig.json +19 -0
- package/templates/react-app/vite.config.ts +12 -0
- package/templates/react-app/yujin.forge.json +15 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice intent matcher for reader commands (V1.29 of HITO 1).
|
|
3
|
+
*
|
|
4
|
+
* Pure function. Given a STT transcript, returns a tool invocation
|
|
5
|
+
* (tool name + args) if the utterance is a recognised reader
|
|
6
|
+
* command, or null if it should fall through to the Claude
|
|
7
|
+
* chat tool-use loop.
|
|
8
|
+
*
|
|
9
|
+
* Hand-rolled matcher. No LLM round-trip for these common phrases
|
|
10
|
+
* -- low latency matters for the ADIP usability target.
|
|
11
|
+
*
|
|
12
|
+
* Patterns recognised (Spanish first, then English):
|
|
13
|
+
*
|
|
14
|
+
* open -> forge.reader.open
|
|
15
|
+
* list documents -> forge.reader.list_documents
|
|
16
|
+
* next block -> forge.reader.next_block
|
|
17
|
+
* read section -> forge.reader.read_section
|
|
18
|
+
* search "X" -> forge.reader.search
|
|
19
|
+
* bookmark set "X" -> forge.reader.bookmark_set
|
|
20
|
+
* bookmark jump "X" -> forge.reader.bookmark_jump
|
|
21
|
+
* recap -> forge.reader.recap
|
|
22
|
+
*
|
|
23
|
+
* Each pattern is intentionally permissive so that natural
|
|
24
|
+
* phrasing -- "leeme el readme.md", "que sigue", "marca aqui
|
|
25
|
+
* como inicio" -- maps cleanly. False positives degrade by
|
|
26
|
+
* falling through to Claude, which is the safe default.
|
|
27
|
+
*
|
|
28
|
+
* ASCII only. No accents in patterns (we strip diacritics from
|
|
29
|
+
* the utterance before matching, so the user CAN dictate with
|
|
30
|
+
* accents and still match).
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Reader tool names this matcher can resolve to. Kept local
|
|
34
|
+
* (not imported) because tools.ts does not export a union;
|
|
35
|
+
* the contract is the literal string the chat dispatcher
|
|
36
|
+
* accepts. If a tool is renamed there, this list must follow.
|
|
37
|
+
*/
|
|
38
|
+
export type ReaderToolName = 'forge.reader.open' | 'forge.reader.list_documents' | 'forge.reader.read_section' | 'forge.reader.next_block' | 'forge.reader.search' | 'forge.reader.bookmark_set' | 'forge.reader.bookmark_jump' | 'forge.reader.recap' | 'forge.manual.open';
|
|
39
|
+
export interface MatchedIntent {
|
|
40
|
+
tool: ReaderToolName;
|
|
41
|
+
args: Record<string, unknown>;
|
|
42
|
+
utterance_normalised: string;
|
|
43
|
+
pattern: string;
|
|
44
|
+
}
|
|
45
|
+
export interface IntentMatchContext {
|
|
46
|
+
/** doc_id of the most recently opened document, if any. Used
|
|
47
|
+
* to default args.doc_id for commands that need a target. */
|
|
48
|
+
active_doc_id?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Strip diacritics + lowercase + collapse whitespace. Keeps
|
|
52
|
+
* apostrophes and quotes (they survive as content markers).
|
|
53
|
+
*
|
|
54
|
+
* The NFD + combining-mark strip is safe for non-Latin scripts:
|
|
55
|
+
* Hindi (Devanagari), Arabic, Japanese, Chinese all keep their
|
|
56
|
+
* code points intact; only Latin diacritics (a-acute, n-tilde,
|
|
57
|
+
* etc) get folded. toLowerCase is also safe across these
|
|
58
|
+
* scripts (CJK ideographs have no case; Arabic + Devanagari
|
|
59
|
+
* letters are case-less).
|
|
60
|
+
*/
|
|
61
|
+
export declare function normaliseUtterance(text: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Match a transcribed utterance against the reader-intent
|
|
64
|
+
* catalogue. Returns the first matching tool invocation, or
|
|
65
|
+
* null to fall through to the chat tool-use loop.
|
|
66
|
+
*/
|
|
67
|
+
export declare function matchReaderIntent(utterance: string, ctx?: IntentMatchContext): MatchedIntent | null;
|
|
68
|
+
/** Internal -- exposed for unit tests so we can enumerate
|
|
69
|
+
* the catalogue without coupling to its order. */
|
|
70
|
+
export declare function _listReaderIntentPatterns(): string[];
|
|
71
|
+
//# sourceMappingURL=intents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intents.d.ts","sourceRoot":"","sources":["../../src/voice/intents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,6BAA6B,GAC7B,2BAA2B,GAC3B,yBAAyB,GACzB,qBAAqB,GACrB,2BAA2B,GAC3B,4BAA4B,GAC5B,oBAAoB,GACpB,mBAAmB,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG9B,oBAAoB,EAAE,MAAM,CAAC;IAG7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC;kEAC8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASvD;AAiVD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,kBAAuB,GAC3B,aAAa,GAAG,IAAI,CAiBtB;AAED;mDACmD;AACnD,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intents.js","sourceRoot":"","sources":["../../src/voice/intents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ElevenLabs TTS provider.
|
|
3
|
+
*
|
|
4
|
+
* Premium TTS quality, multilingual model. TTS-only -- ElevenLabs
|
|
5
|
+
* does not offer STT.
|
|
6
|
+
*
|
|
7
|
+
* Endpoint: POST https://api.elevenlabs.io/v1/text-to-speech/<voice_id>
|
|
8
|
+
* Auth: xi-api-key header.
|
|
9
|
+
* Body: { text, model_id, voice_settings: { stability,
|
|
10
|
+
* similarity_boost,
|
|
11
|
+
* style,
|
|
12
|
+
* use_speaker_boost } }
|
|
13
|
+
* Response: raw audio bytes (NOT JSON).
|
|
14
|
+
*
|
|
15
|
+
* Vault slot: `elevenlabs`.
|
|
16
|
+
*
|
|
17
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
18
|
+
* - Empty text -> hard error.
|
|
19
|
+
* - Missing vault slot -> hard error with the slot name +
|
|
20
|
+
* the `yf vault set elevenlabs` command.
|
|
21
|
+
* - HTTP non-2xx -> hard error with status + body snippet.
|
|
22
|
+
* - Empty response body -> hard error.
|
|
23
|
+
*
|
|
24
|
+
* ASCII-only.
|
|
25
|
+
*/
|
|
26
|
+
import { Vault } from '../../vault/store.js';
|
|
27
|
+
import type { TtsProvider, TtsRequest, TtsResponse, TtsAudioFormat } from '../types.js';
|
|
28
|
+
declare const VAULT_SLOT = "elevenlabs";
|
|
29
|
+
/** "Rachel" -- ElevenLabs's stock English voice, used as a sensible
|
|
30
|
+
* baseline when the caller does not specify a voice. */
|
|
31
|
+
declare const DEFAULT_VOICE = "21m00Tcm4TlvDq8ikWAM";
|
|
32
|
+
declare const DEFAULT_MODEL = "eleven_multilingual_v2";
|
|
33
|
+
/** Map our format enum to ElevenLabs's `output_format` query param. */
|
|
34
|
+
declare function ttsFormatToElevenOutput(format: TtsAudioFormat): string;
|
|
35
|
+
/** When the API returns an opaque MIME other than the format we
|
|
36
|
+
* expected, label what we actually got. ElevenLabs returns
|
|
37
|
+
* audio/mpeg for mp3_* / audio/wav for pcm_* / audio/basic for
|
|
38
|
+
* ulaw_* per its docs. */
|
|
39
|
+
declare function detectFormatFromMime(mime: string | null): TtsAudioFormat;
|
|
40
|
+
export interface ElevenLabsProviderOptions {
|
|
41
|
+
fetchImpl?: typeof fetch;
|
|
42
|
+
vaultOpener?: () => Promise<Vault>;
|
|
43
|
+
}
|
|
44
|
+
export declare class ElevenLabsProvider implements TtsProvider {
|
|
45
|
+
readonly id = "elevenlabs";
|
|
46
|
+
private readonly fetchImpl;
|
|
47
|
+
private readonly vaultOpener;
|
|
48
|
+
constructor(opts?: ElevenLabsProviderOptions);
|
|
49
|
+
readyToRun(): Promise<boolean>;
|
|
50
|
+
synthesize(req: TtsRequest): Promise<TtsResponse>;
|
|
51
|
+
}
|
|
52
|
+
export { ttsFormatToElevenOutput, detectFormatFromMime, VAULT_SLOT, DEFAULT_VOICE, DEFAULT_MODEL, };
|
|
53
|
+
//# sourceMappingURL=elevenlabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/elevenlabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,QAAA,MAAM,UAAU,eAAe,CAAC;AAEhC;yDACyD;AACzD,QAAA,MAAM,aAAa,yBAAyB,CAAC;AAC7C,QAAA,MAAM,aAAa,2BAA2B,CAAC;AAG/C,uEAAuE;AACvE,iBAAS,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAQ/D;AAED;;;2BAG2B;AAC3B,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAMjE;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACpC;AAMD,qBAAa,kBAAmB,YAAW,WAAW;IACpD,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,yBAA8B;IAK1C,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAuFxD;AAGD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,aAAa,GACd,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ElevenLabs TTS provider.
|
|
3
|
+
*
|
|
4
|
+
* Premium TTS quality, multilingual model. TTS-only -- ElevenLabs
|
|
5
|
+
* does not offer STT.
|
|
6
|
+
*
|
|
7
|
+
* Endpoint: POST https://api.elevenlabs.io/v1/text-to-speech/<voice_id>
|
|
8
|
+
* Auth: xi-api-key header.
|
|
9
|
+
* Body: { text, model_id, voice_settings: { stability,
|
|
10
|
+
* similarity_boost,
|
|
11
|
+
* style,
|
|
12
|
+
* use_speaker_boost } }
|
|
13
|
+
* Response: raw audio bytes (NOT JSON).
|
|
14
|
+
*
|
|
15
|
+
* Vault slot: `elevenlabs`.
|
|
16
|
+
*
|
|
17
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
18
|
+
* - Empty text -> hard error.
|
|
19
|
+
* - Missing vault slot -> hard error with the slot name +
|
|
20
|
+
* the `yf vault set elevenlabs` command.
|
|
21
|
+
* - HTTP non-2xx -> hard error with status + body snippet.
|
|
22
|
+
* - Empty response body -> hard error.
|
|
23
|
+
*
|
|
24
|
+
* ASCII-only.
|
|
25
|
+
*/
|
|
26
|
+
import { Vault } from '../../vault/store.js';
|
|
27
|
+
import { configDir } from '../../license/index.js';
|
|
28
|
+
const VAULT_SLOT = 'elevenlabs';
|
|
29
|
+
const ENDPOINT_BASE = 'https://api.elevenlabs.io/v1/text-to-speech/';
|
|
30
|
+
/** "Rachel" -- ElevenLabs's stock English voice, used as a sensible
|
|
31
|
+
* baseline when the caller does not specify a voice. */
|
|
32
|
+
const DEFAULT_VOICE = '21m00Tcm4TlvDq8ikWAM';
|
|
33
|
+
const DEFAULT_MODEL = 'eleven_multilingual_v2';
|
|
34
|
+
const DEFAULT_FORMAT = 'mp3';
|
|
35
|
+
/** Map our format enum to ElevenLabs's `output_format` query param. */
|
|
36
|
+
function ttsFormatToElevenOutput(format) {
|
|
37
|
+
switch (format) {
|
|
38
|
+
case 'mp3': return 'mp3_44100_128';
|
|
39
|
+
case 'wav': return 'pcm_44100';
|
|
40
|
+
case 'ogg':
|
|
41
|
+
case 'opus': return 'ulaw_8000'; /* closest open-codec available */
|
|
42
|
+
default: return 'mp3_44100_128';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** When the API returns an opaque MIME other than the format we
|
|
46
|
+
* expected, label what we actually got. ElevenLabs returns
|
|
47
|
+
* audio/mpeg for mp3_* / audio/wav for pcm_* / audio/basic for
|
|
48
|
+
* ulaw_* per its docs. */
|
|
49
|
+
function detectFormatFromMime(mime) {
|
|
50
|
+
if (!mime)
|
|
51
|
+
return 'mp3';
|
|
52
|
+
if (mime.includes('mpeg'))
|
|
53
|
+
return 'mp3';
|
|
54
|
+
if (mime.includes('wav') || mime.includes('x-wav'))
|
|
55
|
+
return 'wav';
|
|
56
|
+
if (mime.includes('basic') || mime.includes('mulaw'))
|
|
57
|
+
return 'opus';
|
|
58
|
+
return 'mp3';
|
|
59
|
+
}
|
|
60
|
+
async function safeText(r) {
|
|
61
|
+
try {
|
|
62
|
+
return await r.text();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return '(no body)';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class ElevenLabsProvider {
|
|
69
|
+
id = 'elevenlabs';
|
|
70
|
+
fetchImpl;
|
|
71
|
+
vaultOpener;
|
|
72
|
+
constructor(opts = {}) {
|
|
73
|
+
this.fetchImpl = opts.fetchImpl ?? ((u, init) => globalThis.fetch(u, init));
|
|
74
|
+
this.vaultOpener = opts.vaultOpener ?? (() => Vault.open({ configDir: configDir() }));
|
|
75
|
+
}
|
|
76
|
+
async readyToRun() {
|
|
77
|
+
try {
|
|
78
|
+
const vault = await this.vaultOpener();
|
|
79
|
+
return vault.has(VAULT_SLOT);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async synthesize(req) {
|
|
86
|
+
if (!req.text || req.text.trim() === '') {
|
|
87
|
+
throw new Error('elevenlabs TTS: text is empty');
|
|
88
|
+
}
|
|
89
|
+
/* ElevenLabs charges per character + caps at 5000 per request
|
|
90
|
+
on most plans. Refuse loudly above that so the cost is
|
|
91
|
+
visible at the call site, not buried in an API rejection. */
|
|
92
|
+
if (req.text.length > 5000) {
|
|
93
|
+
throw new Error('elevenlabs TTS: text exceeds 5000 characters ('
|
|
94
|
+
+ req.text.length + '). Split into multiple calls or '
|
|
95
|
+
+ 'use a different provider for long-form content.');
|
|
96
|
+
}
|
|
97
|
+
const vault = await this.vaultOpener();
|
|
98
|
+
if (!vault.has(VAULT_SLOT)) {
|
|
99
|
+
throw new Error('elevenlabs: vault slot "' + VAULT_SLOT + '" not set. '
|
|
100
|
+
+ 'Run `yf vault set ' + VAULT_SLOT + '` to configure your ElevenLabs key.');
|
|
101
|
+
}
|
|
102
|
+
const apiKey = vault.get(VAULT_SLOT);
|
|
103
|
+
const voiceId = req.voice ?? DEFAULT_VOICE;
|
|
104
|
+
const format = req.format ?? DEFAULT_FORMAT;
|
|
105
|
+
const outputFormat = ttsFormatToElevenOutput(format);
|
|
106
|
+
/* ElevenLabs ignores SSML in v1; we surface the text as-is.
|
|
107
|
+
The caller can document what works in voice tests. */
|
|
108
|
+
const body = {
|
|
109
|
+
text: req.text,
|
|
110
|
+
model_id: DEFAULT_MODEL,
|
|
111
|
+
voice_settings: {
|
|
112
|
+
stability: 0.5,
|
|
113
|
+
similarity_boost: 0.75,
|
|
114
|
+
style: 0.0,
|
|
115
|
+
use_speaker_boost: true,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
const t0 = Date.now();
|
|
119
|
+
const resp = await this.fetchImpl(ENDPOINT_BASE + encodeURIComponent(voiceId) + '?output_format=' + outputFormat, {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
headers: {
|
|
122
|
+
'xi-api-key': apiKey,
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'Accept': 'audio/mpeg, audio/wav, audio/basic, application/json',
|
|
125
|
+
},
|
|
126
|
+
body: JSON.stringify(body),
|
|
127
|
+
});
|
|
128
|
+
const latency_ms = Date.now() - t0;
|
|
129
|
+
if (!resp.ok) {
|
|
130
|
+
const detail = await safeText(resp);
|
|
131
|
+
throw new Error('elevenlabs TTS API ' + resp.status + ' ' + resp.statusText + ': '
|
|
132
|
+
+ detail.slice(0, 400));
|
|
133
|
+
}
|
|
134
|
+
/* The body is binary audio, NOT JSON. Read as ArrayBuffer + Buffer. */
|
|
135
|
+
let audioBuf;
|
|
136
|
+
try {
|
|
137
|
+
const ab = await resp.arrayBuffer();
|
|
138
|
+
audioBuf = Buffer.from(ab);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
throw new Error('elevenlabs TTS: failed to read audio body: ' + (err instanceof Error ? err.message : String(err)));
|
|
142
|
+
}
|
|
143
|
+
if (audioBuf.length === 0) {
|
|
144
|
+
throw new Error('elevenlabs TTS: response body is empty');
|
|
145
|
+
}
|
|
146
|
+
const observedMime = typeof resp.headers?.get === 'function' ? resp.headers.get('content-type') : null;
|
|
147
|
+
const observedFormat = detectFormatFromMime(observedMime);
|
|
148
|
+
return {
|
|
149
|
+
audio: audioBuf,
|
|
150
|
+
format: observedFormat,
|
|
151
|
+
latency_ms,
|
|
152
|
+
provider: this.id,
|
|
153
|
+
voice: voiceId,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/* Exported for tests + the host registry. */
|
|
158
|
+
export { ttsFormatToElevenOutput, detectFormatFromMime, VAULT_SLOT, DEFAULT_VOICE, DEFAULT_MODEL, };
|
|
159
|
+
//# sourceMappingURL=elevenlabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.js","sourceRoot":"","sources":["../../../src/voice/providers/elevenlabs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Cloud Speech-to-Text + Text-to-Speech providers.
|
|
3
|
+
*
|
|
4
|
+
* Both consume the same vault slot `google_voice` (a Google
|
|
5
|
+
* Cloud API key restricted to the Speech and TextToSpeech APIs).
|
|
6
|
+
* The key is passed as the `?key=` query parameter on each
|
|
7
|
+
* request -- the simplest cloud-auth flow Google supports and
|
|
8
|
+
* the one most adopters will use for personal accounts.
|
|
9
|
+
*
|
|
10
|
+
* Endpoints:
|
|
11
|
+
* STT: POST https://speech.googleapis.com/v1/speech:recognize
|
|
12
|
+
* TTS: POST https://texttospeech.googleapis.com/v1/text:synthesize
|
|
13
|
+
*
|
|
14
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
15
|
+
* - Missing vault slot -> readyToRun=false, transcribe/
|
|
16
|
+
* synthesize throw with the slot name.
|
|
17
|
+
* - HTTP non-2xx -> throw with status + body snippet.
|
|
18
|
+
* - Contract mismatch in response -> throw with what was
|
|
19
|
+
* expected.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { Vault } from '../../vault/store.js';
|
|
24
|
+
import type { SttProvider, SttRequest, SttResponse, SttAudioFormat, TtsProvider, TtsRequest, TtsResponse, TtsAudioFormat } from '../types.js';
|
|
25
|
+
declare const VAULT_SLOT = "google_voice";
|
|
26
|
+
export interface GoogleProviderOptions {
|
|
27
|
+
fetchImpl?: typeof fetch;
|
|
28
|
+
vaultOpener?: () => Promise<Vault>;
|
|
29
|
+
}
|
|
30
|
+
/** Map our SttAudioFormat to Google's encoding enum. */
|
|
31
|
+
declare function sttFormatToGoogleEncoding(format: SttAudioFormat): string;
|
|
32
|
+
/** Map our TtsAudioFormat to Google's audio encoding enum. */
|
|
33
|
+
declare function ttsFormatToGoogleEncoding(format: TtsAudioFormat): string;
|
|
34
|
+
export declare class GoogleSttProvider implements SttProvider {
|
|
35
|
+
readonly id = "google";
|
|
36
|
+
private readonly fetchImpl;
|
|
37
|
+
private readonly vaultOpener;
|
|
38
|
+
constructor(opts?: GoogleProviderOptions);
|
|
39
|
+
readyToRun(): Promise<boolean>;
|
|
40
|
+
transcribe(req: SttRequest): Promise<SttResponse>;
|
|
41
|
+
}
|
|
42
|
+
export declare class GoogleTtsProvider implements TtsProvider {
|
|
43
|
+
readonly id = "google";
|
|
44
|
+
private readonly fetchImpl;
|
|
45
|
+
private readonly vaultOpener;
|
|
46
|
+
constructor(opts?: GoogleProviderOptions);
|
|
47
|
+
readyToRun(): Promise<boolean>;
|
|
48
|
+
synthesize(req: TtsRequest): Promise<TtsResponse>;
|
|
49
|
+
/** Voice names are shaped like "es-AR-Neural2-A" -- the first
|
|
50
|
+
* two segments are the BCP-47 language code. */
|
|
51
|
+
private inferLanguageFromVoice;
|
|
52
|
+
/** Google TTS accepts 0.25..4.0 for speakingRate. */
|
|
53
|
+
private clampSpeed;
|
|
54
|
+
}
|
|
55
|
+
export { sttFormatToGoogleEncoding, ttsFormatToGoogleEncoding, VAULT_SLOT };
|
|
56
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAQrB,QAAA,MAAM,UAAU,iBAAiB,CAAC;AAElC,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACpC;AAED,wDAAwD;AACxD,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUjE;AAED,8DAA8D;AAC9D,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAQjE;AAqBD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAwExD;AAMD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAiEvD;qDACiD;IACjD,OAAO,CAAC,sBAAsB;IAQ9B,qDAAqD;IACrD,OAAO,CAAC,UAAU;CAMnB;AAGD,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Cloud Speech-to-Text + Text-to-Speech providers.
|
|
3
|
+
*
|
|
4
|
+
* Both consume the same vault slot `google_voice` (a Google
|
|
5
|
+
* Cloud API key restricted to the Speech and TextToSpeech APIs).
|
|
6
|
+
* The key is passed as the `?key=` query parameter on each
|
|
7
|
+
* request -- the simplest cloud-auth flow Google supports and
|
|
8
|
+
* the one most adopters will use for personal accounts.
|
|
9
|
+
*
|
|
10
|
+
* Endpoints:
|
|
11
|
+
* STT: POST https://speech.googleapis.com/v1/speech:recognize
|
|
12
|
+
* TTS: POST https://texttospeech.googleapis.com/v1/text:synthesize
|
|
13
|
+
*
|
|
14
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
15
|
+
* - Missing vault slot -> readyToRun=false, transcribe/
|
|
16
|
+
* synthesize throw with the slot name.
|
|
17
|
+
* - HTTP non-2xx -> throw with status + body snippet.
|
|
18
|
+
* - Contract mismatch in response -> throw with what was
|
|
19
|
+
* expected.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { Vault } from '../../vault/store.js';
|
|
24
|
+
import { configDir } from '../../license/index.js';
|
|
25
|
+
const STT_ENDPOINT = 'https://speech.googleapis.com/v1/speech:recognize';
|
|
26
|
+
const TTS_ENDPOINT = 'https://texttospeech.googleapis.com/v1/text:synthesize';
|
|
27
|
+
const DEFAULT_STT_LANGUAGE = 'en-US';
|
|
28
|
+
const DEFAULT_TTS_LANGUAGE = 'en-US';
|
|
29
|
+
const DEFAULT_TTS_VOICE = 'en-US-Neural2-C';
|
|
30
|
+
const DEFAULT_TTS_FORMAT = 'mp3';
|
|
31
|
+
const VAULT_SLOT = 'google_voice';
|
|
32
|
+
/** Map our SttAudioFormat to Google's encoding enum. */
|
|
33
|
+
function sttFormatToGoogleEncoding(format) {
|
|
34
|
+
switch (format) {
|
|
35
|
+
case 'webm': return 'WEBM_OPUS';
|
|
36
|
+
case 'ogg': return 'OGG_OPUS';
|
|
37
|
+
case 'wav': return 'LINEAR16';
|
|
38
|
+
case 'mp3': return 'MP3';
|
|
39
|
+
case 'flac': return 'FLAC';
|
|
40
|
+
case 'mp4': return 'MP4_AAC';
|
|
41
|
+
default: return 'ENCODING_UNSPECIFIED';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Map our TtsAudioFormat to Google's audio encoding enum. */
|
|
45
|
+
function ttsFormatToGoogleEncoding(format) {
|
|
46
|
+
switch (format) {
|
|
47
|
+
case 'mp3': return 'MP3';
|
|
48
|
+
case 'wav': return 'LINEAR16';
|
|
49
|
+
case 'ogg': return 'OGG_OPUS';
|
|
50
|
+
case 'opus': return 'OGG_OPUS';
|
|
51
|
+
default: return 'MP3';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function readKey(opener) {
|
|
55
|
+
const vault = await opener();
|
|
56
|
+
if (!vault.has(VAULT_SLOT)) {
|
|
57
|
+
throw new Error('google voice: vault slot "' + VAULT_SLOT + '" not set. '
|
|
58
|
+
+ 'Run `yf vault set ' + VAULT_SLOT + '` to configure your Google Cloud API key.');
|
|
59
|
+
}
|
|
60
|
+
return vault.get(VAULT_SLOT);
|
|
61
|
+
}
|
|
62
|
+
async function safeText(r) {
|
|
63
|
+
try {
|
|
64
|
+
return await r.text();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return '(no body)';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/* ============================================================
|
|
71
|
+
* GoogleSttProvider
|
|
72
|
+
* ============================================================ */
|
|
73
|
+
export class GoogleSttProvider {
|
|
74
|
+
id = 'google';
|
|
75
|
+
fetchImpl;
|
|
76
|
+
vaultOpener;
|
|
77
|
+
constructor(opts = {}) {
|
|
78
|
+
this.fetchImpl = opts.fetchImpl ?? ((u, init) => globalThis.fetch(u, init));
|
|
79
|
+
this.vaultOpener = opts.vaultOpener ?? (() => Vault.open({ configDir: configDir() }));
|
|
80
|
+
}
|
|
81
|
+
async readyToRun() {
|
|
82
|
+
try {
|
|
83
|
+
const vault = await this.vaultOpener();
|
|
84
|
+
return vault.has(VAULT_SLOT);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async transcribe(req) {
|
|
91
|
+
if (!req.audio || req.audio.length === 0) {
|
|
92
|
+
throw new Error('google STT: audio buffer is empty');
|
|
93
|
+
}
|
|
94
|
+
let apiKey;
|
|
95
|
+
try {
|
|
96
|
+
apiKey = await readKey(this.vaultOpener);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
const language = req.languageHint || DEFAULT_STT_LANGUAGE;
|
|
102
|
+
const encoding = sttFormatToGoogleEncoding(req.format);
|
|
103
|
+
const model = req.model ?? 'latest_short';
|
|
104
|
+
const body = {
|
|
105
|
+
config: {
|
|
106
|
+
encoding,
|
|
107
|
+
languageCode: language,
|
|
108
|
+
model,
|
|
109
|
+
enableAutomaticPunctuation: true,
|
|
110
|
+
},
|
|
111
|
+
audio: {
|
|
112
|
+
content: req.audio.toString('base64'),
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const t0 = Date.now();
|
|
116
|
+
const resp = await this.fetchImpl(STT_ENDPOINT + '?key=' + encodeURIComponent(apiKey), {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: { 'Content-Type': 'application/json' },
|
|
119
|
+
body: JSON.stringify(body),
|
|
120
|
+
});
|
|
121
|
+
const latency_ms = Date.now() - t0;
|
|
122
|
+
if (!resp.ok) {
|
|
123
|
+
const detail = await safeText(resp);
|
|
124
|
+
throw new Error('google STT API ' + resp.status + ' ' + resp.statusText + ': '
|
|
125
|
+
+ detail.slice(0, 400));
|
|
126
|
+
}
|
|
127
|
+
let parsed;
|
|
128
|
+
try {
|
|
129
|
+
parsed = await resp.json();
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
throw new Error('google STT: response body is not JSON: ' + (err instanceof Error ? err.message : String(err)));
|
|
133
|
+
}
|
|
134
|
+
/* Google returns { results: [{ alternatives: [{ transcript,
|
|
135
|
+
confidence }], languageCode }] } -- or an empty `results`
|
|
136
|
+
array on silence. */
|
|
137
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
138
|
+
throw new Error('google STT: response is not an object');
|
|
139
|
+
}
|
|
140
|
+
const results = Array.isArray(parsed.results) ? parsed.results : [];
|
|
141
|
+
const first = results[0];
|
|
142
|
+
const alt = first && Array.isArray(first.alternatives) ? first.alternatives[0] : undefined;
|
|
143
|
+
const text = (alt && typeof alt.transcript === 'string') ? alt.transcript.trim() : '';
|
|
144
|
+
const confidence = (alt && typeof alt.confidence === 'number') ? alt.confidence : undefined;
|
|
145
|
+
const detectedLang = (first && typeof first.languageCode === 'string') ? first.languageCode : undefined;
|
|
146
|
+
return {
|
|
147
|
+
text,
|
|
148
|
+
latency_ms,
|
|
149
|
+
provider: this.id,
|
|
150
|
+
model,
|
|
151
|
+
...(confidence !== undefined ? { confidence } : {}),
|
|
152
|
+
...(detectedLang ? { language: detectedLang } : {}),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/* ============================================================
|
|
157
|
+
* GoogleTtsProvider
|
|
158
|
+
* ============================================================ */
|
|
159
|
+
export class GoogleTtsProvider {
|
|
160
|
+
id = 'google';
|
|
161
|
+
fetchImpl;
|
|
162
|
+
vaultOpener;
|
|
163
|
+
constructor(opts = {}) {
|
|
164
|
+
this.fetchImpl = opts.fetchImpl ?? ((u, init) => globalThis.fetch(u, init));
|
|
165
|
+
this.vaultOpener = opts.vaultOpener ?? (() => Vault.open({ configDir: configDir() }));
|
|
166
|
+
}
|
|
167
|
+
async readyToRun() {
|
|
168
|
+
try {
|
|
169
|
+
const vault = await this.vaultOpener();
|
|
170
|
+
return vault.has(VAULT_SLOT);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async synthesize(req) {
|
|
177
|
+
if (!req.text || req.text.trim() === '') {
|
|
178
|
+
throw new Error('google TTS: text is empty');
|
|
179
|
+
}
|
|
180
|
+
const apiKey = await readKey(this.vaultOpener);
|
|
181
|
+
const voice = req.voice ?? DEFAULT_TTS_VOICE;
|
|
182
|
+
const language = req.language ?? this.inferLanguageFromVoice(voice) ?? DEFAULT_TTS_LANGUAGE;
|
|
183
|
+
const format = req.format ?? DEFAULT_TTS_FORMAT;
|
|
184
|
+
const encoding = ttsFormatToGoogleEncoding(format);
|
|
185
|
+
const speakingRate = this.clampSpeed(req.speed);
|
|
186
|
+
const body = {
|
|
187
|
+
input: req.ssml ? { ssml: req.text } : { text: req.text },
|
|
188
|
+
voice: {
|
|
189
|
+
languageCode: language,
|
|
190
|
+
name: voice,
|
|
191
|
+
},
|
|
192
|
+
audioConfig: {
|
|
193
|
+
audioEncoding: encoding,
|
|
194
|
+
speakingRate,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
const t0 = Date.now();
|
|
198
|
+
const resp = await this.fetchImpl(TTS_ENDPOINT + '?key=' + encodeURIComponent(apiKey), {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: { 'Content-Type': 'application/json' },
|
|
201
|
+
body: JSON.stringify(body),
|
|
202
|
+
});
|
|
203
|
+
const latency_ms = Date.now() - t0;
|
|
204
|
+
if (!resp.ok) {
|
|
205
|
+
const detail = await safeText(resp);
|
|
206
|
+
throw new Error('google TTS API ' + resp.status + ' ' + resp.statusText + ': '
|
|
207
|
+
+ detail.slice(0, 400));
|
|
208
|
+
}
|
|
209
|
+
let parsed;
|
|
210
|
+
try {
|
|
211
|
+
parsed = await resp.json();
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
throw new Error('google TTS: response body is not JSON: ' + (err instanceof Error ? err.message : String(err)));
|
|
215
|
+
}
|
|
216
|
+
if (!parsed || typeof parsed !== 'object' || typeof parsed.audioContent !== 'string') {
|
|
217
|
+
throw new Error('google TTS: response missing audioContent (got: ' + JSON.stringify(parsed).slice(0, 200) + ')');
|
|
218
|
+
}
|
|
219
|
+
const audio = Buffer.from(parsed.audioContent, 'base64');
|
|
220
|
+
if (audio.length === 0) {
|
|
221
|
+
throw new Error('google TTS: decoded audio is empty');
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
audio,
|
|
225
|
+
format,
|
|
226
|
+
latency_ms,
|
|
227
|
+
provider: this.id,
|
|
228
|
+
voice,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/** Voice names are shaped like "es-AR-Neural2-A" -- the first
|
|
232
|
+
* two segments are the BCP-47 language code. */
|
|
233
|
+
inferLanguageFromVoice(voice) {
|
|
234
|
+
const parts = voice.split('-');
|
|
235
|
+
if (parts.length >= 2 && parts[0].length === 2 && parts[1].length === 2) {
|
|
236
|
+
return parts[0] + '-' + parts[1];
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
/** Google TTS accepts 0.25..4.0 for speakingRate. */
|
|
241
|
+
clampSpeed(speed) {
|
|
242
|
+
if (typeof speed !== 'number' || !Number.isFinite(speed))
|
|
243
|
+
return 1.0;
|
|
244
|
+
if (speed < 0.25)
|
|
245
|
+
return 0.25;
|
|
246
|
+
if (speed > 4.0)
|
|
247
|
+
return 4.0;
|
|
248
|
+
return speed;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/* Exported for tests + the host registry. */
|
|
252
|
+
export { sttFormatToGoogleEncoding, ttsFormatToGoogleEncoding, VAULT_SLOT };
|
|
253
|
+
//# sourceMappingURL=google.js.map
|