@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 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/voice/providers/google.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whisper STT provider (OpenAI Audio Transcriptions endpoint).
|
|
3
|
+
*
|
|
4
|
+
* Reads the OpenAI key from the vault slot `openai`. Uses the
|
|
5
|
+
* /v1/audio/transcriptions endpoint with multipart/form-data:
|
|
6
|
+
* `file` (audio bytes) + `model` (whisper-1 by default) + `language`
|
|
7
|
+
* (BCP-47 short code when supplied).
|
|
8
|
+
*
|
|
9
|
+
* DI seam: a `fetchImpl` can be injected so tests never hit the
|
|
10
|
+
* network. The vault is also injectable for the same reason.
|
|
11
|
+
*
|
|
12
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
13
|
+
* - Missing vault slot `openai` -> readyToRun returns false +
|
|
14
|
+
* transcribe throws with the exact vault slot name.
|
|
15
|
+
* - HTTP non-2xx -> throws with the status + body snippet.
|
|
16
|
+
* - Response missing `text` field -> contract error.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import { Vault } from '../../vault/store.js';
|
|
21
|
+
import type { SttProvider, SttRequest, SttResponse } from '../types.js';
|
|
22
|
+
declare const VAULT_SLOT = "openai";
|
|
23
|
+
export interface WhisperProviderOptions {
|
|
24
|
+
/** Test seam: lets the suite stub the network. Defaults to
|
|
25
|
+
* globalThis.fetch. */
|
|
26
|
+
fetchImpl?: typeof fetch;
|
|
27
|
+
/** Test seam: lets the suite inject a fake Vault. Defaults to
|
|
28
|
+
* Vault.open under the user's configDir. */
|
|
29
|
+
vaultOpener?: () => Promise<Vault>;
|
|
30
|
+
}
|
|
31
|
+
/** BCP-47 language codes are richer than what Whisper accepts on
|
|
32
|
+
* its `language` field. Whisper wants ISO 639-1 short codes
|
|
33
|
+
* ("es", "en"). Map common BCP-47 forms down. */
|
|
34
|
+
declare function bcp47ToWhisperLanguage(bcp47?: string): string | undefined;
|
|
35
|
+
export declare class WhisperProvider implements SttProvider {
|
|
36
|
+
readonly id = "whisper";
|
|
37
|
+
private readonly fetchImpl;
|
|
38
|
+
private readonly vaultOpener;
|
|
39
|
+
constructor(opts?: WhisperProviderOptions);
|
|
40
|
+
readyToRun(): Promise<boolean>;
|
|
41
|
+
transcribe(req: SttRequest): Promise<SttResponse>;
|
|
42
|
+
}
|
|
43
|
+
export { bcp47ToWhisperLanguage, VAULT_SLOT };
|
|
44
|
+
//# sourceMappingURL=whisper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/whisper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,aAAa,CAAC;AAIrB,QAAA,MAAM,UAAU,WAAW,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC;4BACwB;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;iDAC6C;IAC7C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACpC;AAED;;kDAEkD;AAClD,iBAAS,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOlE;AA4BD,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,EAAE,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,sBAA2B;IAKvC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAsGxD;AAOD,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whisper STT provider (OpenAI Audio Transcriptions endpoint).
|
|
3
|
+
*
|
|
4
|
+
* Reads the OpenAI key from the vault slot `openai`. Uses the
|
|
5
|
+
* /v1/audio/transcriptions endpoint with multipart/form-data:
|
|
6
|
+
* `file` (audio bytes) + `model` (whisper-1 by default) + `language`
|
|
7
|
+
* (BCP-47 short code when supplied).
|
|
8
|
+
*
|
|
9
|
+
* DI seam: a `fetchImpl` can be injected so tests never hit the
|
|
10
|
+
* network. The vault is also injectable for the same reason.
|
|
11
|
+
*
|
|
12
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
13
|
+
* - Missing vault slot `openai` -> readyToRun returns false +
|
|
14
|
+
* transcribe throws with the exact vault slot name.
|
|
15
|
+
* - HTTP non-2xx -> throws with the status + body snippet.
|
|
16
|
+
* - Response missing `text` field -> contract error.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import { Vault } from '../../vault/store.js';
|
|
21
|
+
import { configDir } from '../../license/index.js';
|
|
22
|
+
const ENDPOINT = 'https://api.openai.com/v1/audio/transcriptions';
|
|
23
|
+
const DEFAULT_MODEL = 'whisper-1';
|
|
24
|
+
const VAULT_SLOT = 'openai';
|
|
25
|
+
/** BCP-47 language codes are richer than what Whisper accepts on
|
|
26
|
+
* its `language` field. Whisper wants ISO 639-1 short codes
|
|
27
|
+
* ("es", "en"). Map common BCP-47 forms down. */
|
|
28
|
+
function bcp47ToWhisperLanguage(bcp47) {
|
|
29
|
+
if (!bcp47)
|
|
30
|
+
return undefined;
|
|
31
|
+
const lower = bcp47.toLowerCase().trim();
|
|
32
|
+
if (!lower)
|
|
33
|
+
return undefined;
|
|
34
|
+
/* "es-AR" -> "es". "en-US" -> "en". Already-short codes pass. */
|
|
35
|
+
const dash = lower.indexOf('-');
|
|
36
|
+
return dash > 0 ? lower.slice(0, dash) : lower;
|
|
37
|
+
}
|
|
38
|
+
function audioMimeType(format) {
|
|
39
|
+
switch (format) {
|
|
40
|
+
case 'webm': return 'audio/webm';
|
|
41
|
+
case 'ogg': return 'audio/ogg';
|
|
42
|
+
case 'wav': return 'audio/wav';
|
|
43
|
+
case 'mp3': return 'audio/mpeg';
|
|
44
|
+
case 'flac': return 'audio/flac';
|
|
45
|
+
case 'mp4': return 'audio/mp4';
|
|
46
|
+
default: return 'application/octet-stream';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function audioFilename(format) {
|
|
50
|
+
/* OpenAI rejects the request when the filename has no extension
|
|
51
|
+
it recognises. Map each supported format to a stable name. */
|
|
52
|
+
switch (format) {
|
|
53
|
+
case 'webm': return 'audio.webm';
|
|
54
|
+
case 'ogg': return 'audio.ogg';
|
|
55
|
+
case 'wav': return 'audio.wav';
|
|
56
|
+
case 'mp3': return 'audio.mp3';
|
|
57
|
+
case 'flac': return 'audio.flac';
|
|
58
|
+
case 'mp4': return 'audio.mp4';
|
|
59
|
+
default: return 'audio.bin';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class WhisperProvider {
|
|
63
|
+
id = 'whisper';
|
|
64
|
+
fetchImpl;
|
|
65
|
+
vaultOpener;
|
|
66
|
+
constructor(opts = {}) {
|
|
67
|
+
this.fetchImpl = opts.fetchImpl ?? ((u, init) => globalThis.fetch(u, init));
|
|
68
|
+
this.vaultOpener = opts.vaultOpener ?? (() => Vault.open({ configDir: configDir() }));
|
|
69
|
+
}
|
|
70
|
+
async readyToRun() {
|
|
71
|
+
try {
|
|
72
|
+
const vault = await this.vaultOpener();
|
|
73
|
+
return vault.has(VAULT_SLOT);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async transcribe(req) {
|
|
80
|
+
if (!req.audio || req.audio.length === 0) {
|
|
81
|
+
throw new Error('whisper.transcribe: audio buffer is empty');
|
|
82
|
+
}
|
|
83
|
+
let apiKey;
|
|
84
|
+
try {
|
|
85
|
+
const vault = await this.vaultOpener();
|
|
86
|
+
if (!vault.has(VAULT_SLOT)) {
|
|
87
|
+
throw new Error('whisper: vault slot "' + VAULT_SLOT + '" not set. '
|
|
88
|
+
+ 'Run `yf vault set ' + VAULT_SLOT + '` to configure your OpenAI key.');
|
|
89
|
+
}
|
|
90
|
+
apiKey = vault.get(VAULT_SLOT);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
throw new Error('whisper: failed to read vault slot "' + VAULT_SLOT + '": ' + (err instanceof Error ? err.message : String(err)));
|
|
94
|
+
}
|
|
95
|
+
const model = req.model ?? DEFAULT_MODEL;
|
|
96
|
+
const language = bcp47ToWhisperLanguage(req.languageHint);
|
|
97
|
+
/* Build multipart/form-data manually. Native FormData in Node 18+
|
|
98
|
+
works with fetch via the undici body, but constructing the
|
|
99
|
+
form keeps the test stub trivial -- we just inspect the body. */
|
|
100
|
+
const boundary = '----yujin-' + Math.random().toString(16).slice(2);
|
|
101
|
+
const parts = [];
|
|
102
|
+
function addField(name, value) {
|
|
103
|
+
parts.push(Buffer.from('--' + boundary + '\r\n'
|
|
104
|
+
+ 'Content-Disposition: form-data; name="' + name + '"\r\n\r\n'
|
|
105
|
+
+ value + '\r\n', 'utf-8'));
|
|
106
|
+
}
|
|
107
|
+
function addFile(name, filename, mime, body) {
|
|
108
|
+
parts.push(Buffer.from('--' + boundary + '\r\n'
|
|
109
|
+
+ 'Content-Disposition: form-data; name="' + name + '"; filename="' + filename + '"\r\n'
|
|
110
|
+
+ 'Content-Type: ' + mime + '\r\n\r\n', 'utf-8'));
|
|
111
|
+
parts.push(body);
|
|
112
|
+
parts.push(Buffer.from('\r\n', 'utf-8'));
|
|
113
|
+
}
|
|
114
|
+
addField('model', model);
|
|
115
|
+
if (language)
|
|
116
|
+
addField('language', language);
|
|
117
|
+
/* Force verbose_json so we can capture confidence / language
|
|
118
|
+
when the model returns them. The fallback parser tolerates
|
|
119
|
+
the simple-text response shape too. */
|
|
120
|
+
addField('response_format', 'verbose_json');
|
|
121
|
+
addFile('file', audioFilename(req.format), audioMimeType(req.format), req.audio);
|
|
122
|
+
parts.push(Buffer.from('--' + boundary + '--\r\n', 'utf-8'));
|
|
123
|
+
const body = Buffer.concat(parts);
|
|
124
|
+
const t0 = Date.now();
|
|
125
|
+
const resp = await this.fetchImpl(ENDPOINT, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Authorization': 'Bearer ' + apiKey,
|
|
129
|
+
'Content-Type': 'multipart/form-data; boundary=' + boundary,
|
|
130
|
+
'Content-Length': String(body.length),
|
|
131
|
+
},
|
|
132
|
+
body,
|
|
133
|
+
});
|
|
134
|
+
const latency_ms = Date.now() - t0;
|
|
135
|
+
if (!resp.ok) {
|
|
136
|
+
const detail = await safeText(resp);
|
|
137
|
+
throw new Error('whisper API ' + resp.status + ' ' + resp.statusText + ': '
|
|
138
|
+
+ detail.slice(0, 400));
|
|
139
|
+
}
|
|
140
|
+
let parsed;
|
|
141
|
+
try {
|
|
142
|
+
parsed = await resp.json();
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
throw new Error('whisper: response body is not JSON: ' + (err instanceof Error ? err.message : String(err)));
|
|
146
|
+
}
|
|
147
|
+
const text = typeof parsed?.text === 'string' ? parsed.text.trim() : '';
|
|
148
|
+
if (text === '') {
|
|
149
|
+
/* Whisper occasionally returns empty text on noise; that is
|
|
150
|
+
not an error condition for the API itself but the caller
|
|
151
|
+
can decide what to do. Surface clearly. */
|
|
152
|
+
return {
|
|
153
|
+
text: '',
|
|
154
|
+
latency_ms,
|
|
155
|
+
provider: this.id,
|
|
156
|
+
model,
|
|
157
|
+
...(typeof parsed?.language === 'string' ? { language: parsed.language } : {}),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
text,
|
|
162
|
+
latency_ms,
|
|
163
|
+
provider: this.id,
|
|
164
|
+
model,
|
|
165
|
+
...(typeof parsed?.language === 'string' ? { language: parsed.language } : {}),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function safeText(r) {
|
|
170
|
+
try {
|
|
171
|
+
return await r.text();
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return '(no body)';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/* Exported for tests + reuse by the CLI when wiring the registry. */
|
|
178
|
+
export { bcp47ToWhisperLanguage, VAULT_SLOT };
|
|
179
|
+
//# sourceMappingURL=whisper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.js","sourceRoot":"","sources":["../../../src/voice/providers/whisper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production provider registry for the voice subsystem.
|
|
3
|
+
*
|
|
4
|
+
* The router (V1.1) takes a registry; this module builds the
|
|
5
|
+
* default one with the three providers shipped through V1.4:
|
|
6
|
+
*
|
|
7
|
+
* STT: 'whisper' -> WhisperProvider (OpenAI)
|
|
8
|
+
* STT: 'google' -> GoogleSttProvider
|
|
9
|
+
* TTS: 'google' -> GoogleTtsProvider
|
|
10
|
+
* TTS: 'elevenlabs' -> ElevenLabsProvider
|
|
11
|
+
*
|
|
12
|
+
* Factories are lazy: provider instances are created on each
|
|
13
|
+
* router call. That avoids leaking long-lived state across
|
|
14
|
+
* requests + lets the vault read happen at dispatch time so
|
|
15
|
+
* a freshly-set key works without a server restart.
|
|
16
|
+
*
|
|
17
|
+
* The registry is also extensible: callers can pass a partial
|
|
18
|
+
* override to swap providers in tests or for adopter-specific
|
|
19
|
+
* deployments.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { type ProviderRegistry } from './router.js';
|
|
24
|
+
import type { SttProvider, TtsProvider } from './types.js';
|
|
25
|
+
export interface BuildRegistryOptions {
|
|
26
|
+
/** Per-id overrides for tests + bespoke deployments. */
|
|
27
|
+
stt?: Record<string, () => SttProvider>;
|
|
28
|
+
tts?: Record<string, () => TtsProvider>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the default registry. Pass overrides to swap individual
|
|
32
|
+
* providers (mainly for tests; production passes no opts).
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildDefaultRegistry(opts?: BuildRegistryOptions): ProviderRegistry;
|
|
35
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/voice/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,oBAAyB,GAAG,gBAAgB,CAoBtF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production provider registry for the voice subsystem.
|
|
3
|
+
*
|
|
4
|
+
* The router (V1.1) takes a registry; this module builds the
|
|
5
|
+
* default one with the three providers shipped through V1.4:
|
|
6
|
+
*
|
|
7
|
+
* STT: 'whisper' -> WhisperProvider (OpenAI)
|
|
8
|
+
* STT: 'google' -> GoogleSttProvider
|
|
9
|
+
* TTS: 'google' -> GoogleTtsProvider
|
|
10
|
+
* TTS: 'elevenlabs' -> ElevenLabsProvider
|
|
11
|
+
*
|
|
12
|
+
* Factories are lazy: provider instances are created on each
|
|
13
|
+
* router call. That avoids leaking long-lived state across
|
|
14
|
+
* requests + lets the vault read happen at dispatch time so
|
|
15
|
+
* a freshly-set key works without a server restart.
|
|
16
|
+
*
|
|
17
|
+
* The registry is also extensible: callers can pass a partial
|
|
18
|
+
* override to swap providers in tests or for adopter-specific
|
|
19
|
+
* deployments.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { WhisperProvider } from './providers/whisper.js';
|
|
24
|
+
import { GoogleSttProvider, GoogleTtsProvider } from './providers/google.js';
|
|
25
|
+
import { ElevenLabsProvider } from './providers/elevenlabs.js';
|
|
26
|
+
import { emptyRegistry } from './router.js';
|
|
27
|
+
/**
|
|
28
|
+
* Build the default registry. Pass overrides to swap individual
|
|
29
|
+
* providers (mainly for tests; production passes no opts).
|
|
30
|
+
*/
|
|
31
|
+
export function buildDefaultRegistry(opts = {}) {
|
|
32
|
+
const reg = emptyRegistry();
|
|
33
|
+
/* STT */
|
|
34
|
+
reg.stt.set('whisper', () => new WhisperProvider());
|
|
35
|
+
reg.stt.set('google', () => new GoogleSttProvider());
|
|
36
|
+
/* TTS */
|
|
37
|
+
reg.tts.set('google', () => new GoogleTtsProvider());
|
|
38
|
+
reg.tts.set('elevenlabs', () => new ElevenLabsProvider());
|
|
39
|
+
/* Apply overrides last so a test stub wins over the default. */
|
|
40
|
+
for (const [id, factory] of Object.entries(opts.stt ?? {})) {
|
|
41
|
+
reg.stt.set(id, factory);
|
|
42
|
+
}
|
|
43
|
+
for (const [id, factory] of Object.entries(opts.tts ?? {})) {
|
|
44
|
+
reg.tts.set(id, factory);
|
|
45
|
+
}
|
|
46
|
+
return reg;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/voice/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAyB,MAAM,aAAa,CAAC;AASnE;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA6B,EAAE;IAClE,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,SAAS;IACT,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAG,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAEtD,SAAS;IACT,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAM,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IACzD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAE1D,gEAAgE;IAChE,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice router.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Load and persist the user's VoiceConfig from
|
|
6
|
+
* ~/.yujin-forge/voice-config.json.
|
|
7
|
+
* - Resolve a concrete SttProvider / TtsProvider per request
|
|
8
|
+
* based on the active config.
|
|
9
|
+
* - Surface a single async entry point each for STT + TTS that
|
|
10
|
+
* the server routes call.
|
|
11
|
+
*
|
|
12
|
+
* Provider instantiation is delegated to a registry passed into
|
|
13
|
+
* the router at construction time. This keeps the router pure
|
|
14
|
+
* (no IO besides config) and lets tests stub the providers.
|
|
15
|
+
*
|
|
16
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
17
|
+
* - Unknown provider in config -> hard error listing valid IDs.
|
|
18
|
+
* - Provider not ready (missing vault key, etc) -> hard error
|
|
19
|
+
* with the exact slot name the user needs to populate.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { type SttProvider, type SttProviderId, type SttRequest, type SttResponse, type TtsProvider, type TtsProviderId, type TtsRequest, type TtsResponse, type VoiceConfig } from './types.js';
|
|
24
|
+
/** Factory functions registered by the host process. Tests pass
|
|
25
|
+
* stubs; production passes the real provider constructors. */
|
|
26
|
+
export interface ProviderRegistry {
|
|
27
|
+
stt: Map<SttProviderId, () => SttProvider>;
|
|
28
|
+
tts: Map<TtsProviderId, () => TtsProvider>;
|
|
29
|
+
}
|
|
30
|
+
export interface VoiceRouterOptions {
|
|
31
|
+
configDir: string;
|
|
32
|
+
registry: ProviderRegistry;
|
|
33
|
+
}
|
|
34
|
+
export declare class VoiceRouter {
|
|
35
|
+
private readonly configDir;
|
|
36
|
+
private readonly registry;
|
|
37
|
+
private cachedConfig;
|
|
38
|
+
constructor(opts: VoiceRouterOptions);
|
|
39
|
+
/** Load the persisted config, or seed defaults on first use.
|
|
40
|
+
* Subsequent calls return the cached value until invalidate()
|
|
41
|
+
* is called. */
|
|
42
|
+
loadConfig(): Promise<VoiceConfig>;
|
|
43
|
+
/** Update the persisted config. Validates the provider ids
|
|
44
|
+
* against the registry. */
|
|
45
|
+
saveConfig(next: VoiceConfig): Promise<void>;
|
|
46
|
+
/** Force-reload from disk on the next call. */
|
|
47
|
+
invalidate(): void;
|
|
48
|
+
/** Resolve the active STT provider and pass the request to it. */
|
|
49
|
+
transcribe(req: SttRequest): Promise<SttResponse>;
|
|
50
|
+
/** Resolve the active TTS provider and synthesize. */
|
|
51
|
+
synthesize(req: TtsRequest): Promise<TtsResponse>;
|
|
52
|
+
/** Names of every STT/TTS provider registered. Used by the CLI
|
|
53
|
+
* to print "available providers" lists. */
|
|
54
|
+
registeredProviders(): {
|
|
55
|
+
stt: SttProviderId[];
|
|
56
|
+
tts: TtsProviderId[];
|
|
57
|
+
};
|
|
58
|
+
private persist;
|
|
59
|
+
}
|
|
60
|
+
/** Convenience builder: empty registry the host can populate. */
|
|
61
|
+
export declare function emptyRegistry(): ProviderRegistry;
|
|
62
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/voice/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAKpB;+DAC+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,WAAW,CAAC,CAAC;IAC3C,GAAG,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,WAAW,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAOD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,YAAY,CAA4B;gBAEpC,IAAI,EAAE,kBAAkB;IAQpC;;qBAEiB;IACX,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IA+BxC;gCAC4B;IACtB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD,+CAA+C;IAC/C,UAAU,IAAI,IAAI;IAIlB,kEAAkE;IAC5D,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BvD,sDAAsD;IAChD,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAkCvD;gDAC4C;IAC5C,mBAAmB,IAAI;QAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QAAC,GAAG,EAAE,aAAa,EAAE,CAAA;KAAE;YAOvD,OAAO;CAUtB;AAED,iEAAiE;AACjE,wBAAgB,aAAa,IAAI,gBAAgB,CAEhD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice router.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Load and persist the user's VoiceConfig from
|
|
6
|
+
* ~/.yujin-forge/voice-config.json.
|
|
7
|
+
* - Resolve a concrete SttProvider / TtsProvider per request
|
|
8
|
+
* based on the active config.
|
|
9
|
+
* - Surface a single async entry point each for STT + TTS that
|
|
10
|
+
* the server routes call.
|
|
11
|
+
*
|
|
12
|
+
* Provider instantiation is delegated to a registry passed into
|
|
13
|
+
* the router at construction time. This keeps the router pure
|
|
14
|
+
* (no IO besides config) and lets tests stub the providers.
|
|
15
|
+
*
|
|
16
|
+
* Loud failures (per ROADMAP sec 12.2):
|
|
17
|
+
* - Unknown provider in config -> hard error listing valid IDs.
|
|
18
|
+
* - Provider not ready (missing vault key, etc) -> hard error
|
|
19
|
+
* with the exact slot name the user needs to populate.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { promises as fs } from 'node:fs';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { DEFAULT_VOICE_CONFIG, } from './types.js';
|
|
26
|
+
const VOICE_CONFIG_FILENAME = 'voice-config.json';
|
|
27
|
+
const VOICE_CONFIG_VERSION = 1;
|
|
28
|
+
export class VoiceRouter {
|
|
29
|
+
configDir;
|
|
30
|
+
registry;
|
|
31
|
+
cachedConfig = null;
|
|
32
|
+
constructor(opts) {
|
|
33
|
+
if (!path.isAbsolute(opts.configDir)) {
|
|
34
|
+
throw new Error('VoiceRouter: configDir must be absolute (got ' + JSON.stringify(opts.configDir) + ')');
|
|
35
|
+
}
|
|
36
|
+
this.configDir = opts.configDir;
|
|
37
|
+
this.registry = opts.registry;
|
|
38
|
+
}
|
|
39
|
+
/** Load the persisted config, or seed defaults on first use.
|
|
40
|
+
* Subsequent calls return the cached value until invalidate()
|
|
41
|
+
* is called. */
|
|
42
|
+
async loadConfig() {
|
|
43
|
+
if (this.cachedConfig)
|
|
44
|
+
return this.cachedConfig;
|
|
45
|
+
const file = path.join(this.configDir, VOICE_CONFIG_FILENAME);
|
|
46
|
+
try {
|
|
47
|
+
const raw = await fs.readFile(file, 'utf-8');
|
|
48
|
+
const parsed = JSON.parse(raw);
|
|
49
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
50
|
+
throw new Error('voice-config.json is not an object');
|
|
51
|
+
}
|
|
52
|
+
if (parsed.version !== VOICE_CONFIG_VERSION) {
|
|
53
|
+
throw new Error('voice-config.json version mismatch (got ' + parsed.version
|
|
54
|
+
+ ', expected ' + VOICE_CONFIG_VERSION + ')');
|
|
55
|
+
}
|
|
56
|
+
if (!parsed.config || typeof parsed.config !== 'object') {
|
|
57
|
+
throw new Error('voice-config.json missing config map');
|
|
58
|
+
}
|
|
59
|
+
this.cachedConfig = parsed.config;
|
|
60
|
+
return this.cachedConfig;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.code === 'ENOENT') {
|
|
64
|
+
/* First use -- seed defaults, persist, return. */
|
|
65
|
+
this.cachedConfig = JSON.parse(JSON.stringify(DEFAULT_VOICE_CONFIG));
|
|
66
|
+
await this.persist(this.cachedConfig);
|
|
67
|
+
return this.cachedConfig;
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Update the persisted config. Validates the provider ids
|
|
73
|
+
* against the registry. */
|
|
74
|
+
async saveConfig(next) {
|
|
75
|
+
if (!next || typeof next !== 'object' || !next.stt || !next.tts) {
|
|
76
|
+
throw new Error('VoiceRouter.saveConfig: config must have stt + tts blocks');
|
|
77
|
+
}
|
|
78
|
+
if (!this.registry.stt.has(next.stt.provider)) {
|
|
79
|
+
throw new Error('VoiceRouter.saveConfig: unknown STT provider "' + next.stt.provider
|
|
80
|
+
+ '". Known providers: ' + Array.from(this.registry.stt.keys()).join(', '));
|
|
81
|
+
}
|
|
82
|
+
if (!this.registry.tts.has(next.tts.provider)) {
|
|
83
|
+
throw new Error('VoiceRouter.saveConfig: unknown TTS provider "' + next.tts.provider
|
|
84
|
+
+ '". Known providers: ' + Array.from(this.registry.tts.keys()).join(', '));
|
|
85
|
+
}
|
|
86
|
+
await this.persist(next);
|
|
87
|
+
this.cachedConfig = next;
|
|
88
|
+
}
|
|
89
|
+
/** Force-reload from disk on the next call. */
|
|
90
|
+
invalidate() {
|
|
91
|
+
this.cachedConfig = null;
|
|
92
|
+
}
|
|
93
|
+
/** Resolve the active STT provider and pass the request to it. */
|
|
94
|
+
async transcribe(req) {
|
|
95
|
+
const config = await this.loadConfig();
|
|
96
|
+
const factory = this.registry.stt.get(config.stt.provider);
|
|
97
|
+
if (!factory) {
|
|
98
|
+
throw new Error('No STT provider registered for "' + config.stt.provider
|
|
99
|
+
+ '". Run `yf voice config` to pick a different one.');
|
|
100
|
+
}
|
|
101
|
+
const provider = factory();
|
|
102
|
+
if (!(await provider.readyToRun())) {
|
|
103
|
+
throw new Error('STT provider "' + provider.id + '" is not ready. '
|
|
104
|
+
+ 'Missing credentials? Check `yf vault list` and ensure the slot for this provider is set.');
|
|
105
|
+
}
|
|
106
|
+
const enriched = {
|
|
107
|
+
...req,
|
|
108
|
+
...(req.languageHint || config.stt.language
|
|
109
|
+
? { languageHint: req.languageHint ?? config.stt.language }
|
|
110
|
+
: {}),
|
|
111
|
+
...(req.model || config.stt.model
|
|
112
|
+
? { model: req.model ?? config.stt.model }
|
|
113
|
+
: {}),
|
|
114
|
+
};
|
|
115
|
+
return provider.transcribe(enriched);
|
|
116
|
+
}
|
|
117
|
+
/** Resolve the active TTS provider and synthesize. */
|
|
118
|
+
async synthesize(req) {
|
|
119
|
+
const config = await this.loadConfig();
|
|
120
|
+
const factory = this.registry.tts.get(config.tts.provider);
|
|
121
|
+
if (!factory) {
|
|
122
|
+
throw new Error('No TTS provider registered for "' + config.tts.provider
|
|
123
|
+
+ '". Run `yf voice config` to pick a different one.');
|
|
124
|
+
}
|
|
125
|
+
const provider = factory();
|
|
126
|
+
if (!(await provider.readyToRun())) {
|
|
127
|
+
throw new Error('TTS provider "' + provider.id + '" is not ready. '
|
|
128
|
+
+ 'Missing credentials? Check `yf vault list` and ensure the slot for this provider is set.');
|
|
129
|
+
}
|
|
130
|
+
const enriched = {
|
|
131
|
+
...req,
|
|
132
|
+
...(req.voice || config.tts.voice
|
|
133
|
+
? { voice: req.voice ?? config.tts.voice }
|
|
134
|
+
: {}),
|
|
135
|
+
...(req.speed !== undefined || config.tts.speed !== undefined
|
|
136
|
+
? { speed: req.speed ?? config.tts.speed }
|
|
137
|
+
: {}),
|
|
138
|
+
...(req.language || config.tts.language
|
|
139
|
+
? { language: req.language ?? config.tts.language }
|
|
140
|
+
: {}),
|
|
141
|
+
...(req.format || config.tts.format
|
|
142
|
+
? { format: req.format ?? config.tts.format }
|
|
143
|
+
: {}),
|
|
144
|
+
};
|
|
145
|
+
return provider.synthesize(enriched);
|
|
146
|
+
}
|
|
147
|
+
/** Names of every STT/TTS provider registered. Used by the CLI
|
|
148
|
+
* to print "available providers" lists. */
|
|
149
|
+
registeredProviders() {
|
|
150
|
+
return {
|
|
151
|
+
stt: Array.from(this.registry.stt.keys()).sort(),
|
|
152
|
+
tts: Array.from(this.registry.tts.keys()).sort(),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async persist(cfg) {
|
|
156
|
+
await fs.mkdir(this.configDir, { recursive: true });
|
|
157
|
+
const file = path.join(this.configDir, VOICE_CONFIG_FILENAME);
|
|
158
|
+
const payload = { version: VOICE_CONFIG_VERSION, config: cfg };
|
|
159
|
+
const tmp = file + '.tmp';
|
|
160
|
+
await fs.writeFile(tmp, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
161
|
+
const fh = await fs.open(tmp, 'r+');
|
|
162
|
+
try {
|
|
163
|
+
await fh.sync();
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
await fh.close();
|
|
167
|
+
}
|
|
168
|
+
await fs.rename(tmp, file);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Convenience builder: empty registry the host can populate. */
|
|
172
|
+
export function emptyRegistry() {
|
|
173
|
+
return { stt: new Map(), tts: new Map() };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/voice/router.ts"],"names":[],"mappings":"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"}
|