@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":"liveness.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint matcher.
|
|
3
|
+
*
|
|
4
|
+
* Cosine similarity between a target embedding and each
|
|
5
|
+
* enrolled identity's embedding. Returns the ranked list for
|
|
6
|
+
* transparency + the best match if it exceeds the threshold.
|
|
7
|
+
*
|
|
8
|
+
* Two cross-provider safety nets:
|
|
9
|
+
* - The target's `source` is compared against each enrolled
|
|
10
|
+
* embedding's `source`. Mismatches DO NOT crash -- they get
|
|
11
|
+
* a warning + are excluded from the match. Reason:
|
|
12
|
+
* embeddings from different providers live in different
|
|
13
|
+
* vector spaces; the cosine is meaningless across them.
|
|
14
|
+
* - Dimensionality mismatch between target and enrolled
|
|
15
|
+
* embedding also excludes that pair with a warning.
|
|
16
|
+
*
|
|
17
|
+
* Pure math. No IO, no audio decoding.
|
|
18
|
+
*
|
|
19
|
+
* ASCII-only.
|
|
20
|
+
*/
|
|
21
|
+
import type { EnrolledIdentity, MatchResult, VoiceprintEmbedding } from './types.js';
|
|
22
|
+
/** Cosine similarity in [-1, 1]. Exported for tests. */
|
|
23
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
24
|
+
export interface MatchOptions {
|
|
25
|
+
/** Cosine score above which a match counts as the enrolled
|
|
26
|
+
* speaker. Default 0.75 per G-VOICE-2 (2026-05-23). */
|
|
27
|
+
threshold?: number;
|
|
28
|
+
/** When true, the matcher includes cross-provider pairs with
|
|
29
|
+
* the provider mismatch noted on the rank entry. Default
|
|
30
|
+
* false -- safer to skip them. */
|
|
31
|
+
allowCrossProvider?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface MatchSkipNote {
|
|
34
|
+
name: string;
|
|
35
|
+
reason: 'provider_mismatch' | 'dimensionality_mismatch';
|
|
36
|
+
target_source: string;
|
|
37
|
+
enrolled_source: string;
|
|
38
|
+
target_length: number;
|
|
39
|
+
enrolled_length: number;
|
|
40
|
+
}
|
|
41
|
+
export interface MatchOutput extends MatchResult {
|
|
42
|
+
/** Identities skipped during matching, with the reason.
|
|
43
|
+
* Visible for debugging + helpful for upgrading from the
|
|
44
|
+
* stub to a real provider (provider mismatch happens when
|
|
45
|
+
* the user re-enrolls with a different backend). */
|
|
46
|
+
skipped: MatchSkipNote[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compare a target embedding against every enrolled identity.
|
|
50
|
+
* Returns the ranked list + the best name above the threshold,
|
|
51
|
+
* or null if no match qualifies.
|
|
52
|
+
*/
|
|
53
|
+
export declare function matchEmbedding(target: VoiceprintEmbedding, enrolled: EnrolledIdentity[], opts?: MatchOptions): MatchOutput;
|
|
54
|
+
//# sourceMappingURL=match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBjE;AAED,MAAM,WAAW,YAAY;IAC3B;4DACwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;uCAEmC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C;;;yDAGqD;IACrD,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,IAAI,GAAE,YAAiB,GACtB,WAAW,CA6Cb"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint matcher.
|
|
3
|
+
*
|
|
4
|
+
* Cosine similarity between a target embedding and each
|
|
5
|
+
* enrolled identity's embedding. Returns the ranked list for
|
|
6
|
+
* transparency + the best match if it exceeds the threshold.
|
|
7
|
+
*
|
|
8
|
+
* Two cross-provider safety nets:
|
|
9
|
+
* - The target's `source` is compared against each enrolled
|
|
10
|
+
* embedding's `source`. Mismatches DO NOT crash -- they get
|
|
11
|
+
* a warning + are excluded from the match. Reason:
|
|
12
|
+
* embeddings from different providers live in different
|
|
13
|
+
* vector spaces; the cosine is meaningless across them.
|
|
14
|
+
* - Dimensionality mismatch between target and enrolled
|
|
15
|
+
* embedding also excludes that pair with a warning.
|
|
16
|
+
*
|
|
17
|
+
* Pure math. No IO, no audio decoding.
|
|
18
|
+
*
|
|
19
|
+
* ASCII-only.
|
|
20
|
+
*/
|
|
21
|
+
/** Cosine similarity in [-1, 1]. Exported for tests. */
|
|
22
|
+
export function cosineSimilarity(a, b) {
|
|
23
|
+
if (a.length !== b.length) {
|
|
24
|
+
throw new Error('cosineSimilarity: dimensionality mismatch (' + a.length + ' vs ' + b.length + ')');
|
|
25
|
+
}
|
|
26
|
+
let dot = 0;
|
|
27
|
+
let aNorm = 0;
|
|
28
|
+
let bNorm = 0;
|
|
29
|
+
for (let i = 0; i < a.length; i++) {
|
|
30
|
+
const av = a[i] ?? 0;
|
|
31
|
+
const bv = b[i] ?? 0;
|
|
32
|
+
dot += av * bv;
|
|
33
|
+
aNorm += av * av;
|
|
34
|
+
bNorm += bv * bv;
|
|
35
|
+
}
|
|
36
|
+
if (aNorm === 0 || bNorm === 0)
|
|
37
|
+
return 0;
|
|
38
|
+
return dot / (Math.sqrt(aNorm) * Math.sqrt(bNorm));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compare a target embedding against every enrolled identity.
|
|
42
|
+
* Returns the ranked list + the best name above the threshold,
|
|
43
|
+
* or null if no match qualifies.
|
|
44
|
+
*/
|
|
45
|
+
export function matchEmbedding(target, enrolled, opts = {}) {
|
|
46
|
+
const threshold = opts.threshold ?? 0.75;
|
|
47
|
+
const allowCross = !!opts.allowCrossProvider;
|
|
48
|
+
const ranked = [];
|
|
49
|
+
const skipped = [];
|
|
50
|
+
for (const id of enrolled) {
|
|
51
|
+
const tgt = target;
|
|
52
|
+
const ref = id.embedding;
|
|
53
|
+
if (!allowCross && tgt.source !== ref.source) {
|
|
54
|
+
skipped.push({
|
|
55
|
+
name: id.name,
|
|
56
|
+
reason: 'provider_mismatch',
|
|
57
|
+
target_source: tgt.source,
|
|
58
|
+
enrolled_source: ref.source,
|
|
59
|
+
target_length: tgt.length,
|
|
60
|
+
enrolled_length: ref.length,
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (tgt.vector.length !== ref.vector.length) {
|
|
65
|
+
skipped.push({
|
|
66
|
+
name: id.name,
|
|
67
|
+
reason: 'dimensionality_mismatch',
|
|
68
|
+
target_source: tgt.source,
|
|
69
|
+
enrolled_source: ref.source,
|
|
70
|
+
target_length: tgt.length,
|
|
71
|
+
enrolled_length: ref.length,
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const score = cosineSimilarity(tgt.vector, ref.vector);
|
|
76
|
+
ranked.push({ name: id.name, score });
|
|
77
|
+
}
|
|
78
|
+
ranked.sort((a, b) => b.score - a.score);
|
|
79
|
+
const best = ranked[0];
|
|
80
|
+
const matched = best && best.score >= threshold ? best.name : null;
|
|
81
|
+
return {
|
|
82
|
+
matched,
|
|
83
|
+
score: best ? best.score : 0,
|
|
84
|
+
ranked,
|
|
85
|
+
skipped,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local MFCC-ish voiceprint provider -- ALPHA STUB.
|
|
3
|
+
*
|
|
4
|
+
* This provider is a PLACEHOLDER for the alpha. It extracts a
|
|
5
|
+
* fixed-size embedding from audio bytes using simple
|
|
6
|
+
* deterministic hashing + byte-level statistics. It is good
|
|
7
|
+
* enough to:
|
|
8
|
+
*
|
|
9
|
+
* - Exercise the state machine + types of the voiceprint
|
|
10
|
+
* subsystem.
|
|
11
|
+
* - Discriminate between two clearly-different audio
|
|
12
|
+
* samples in unit tests.
|
|
13
|
+
*
|
|
14
|
+
* It is NOT production quality. Specifically:
|
|
15
|
+
* - It does not decode webm / mp4 / mp3. It hashes the raw
|
|
16
|
+
* bytes as they arrive.
|
|
17
|
+
* - Two recordings of the same voice with different
|
|
18
|
+
* microphones or codecs will hash to different embeddings.
|
|
19
|
+
* - The matcher works against bytes, not speech features.
|
|
20
|
+
*
|
|
21
|
+
* Replace with `speechbrain-py` (Python sidecar + x-vector
|
|
22
|
+
* model) or `google` (Speaker Recognition cloud) before the
|
|
23
|
+
* v1.0 release.
|
|
24
|
+
*
|
|
25
|
+
* The interface this stub implements is the same one the real
|
|
26
|
+
* providers will fulfil, so the state machine, store, and
|
|
27
|
+
* trust layer never change.
|
|
28
|
+
*
|
|
29
|
+
* Loud about its limitations -- the constructor logs once per
|
|
30
|
+
* process so the developer cannot ship it accidentally.
|
|
31
|
+
*
|
|
32
|
+
* ASCII-only.
|
|
33
|
+
*/
|
|
34
|
+
import type { VoiceprintEmbedding, VoiceprintExtractRequest, VoiceprintProvider } from '../types.js';
|
|
35
|
+
declare const EMBEDDING_SIZE = 256;
|
|
36
|
+
export declare class LocalMfccStubProvider implements VoiceprintProvider {
|
|
37
|
+
readonly id = "local-mfcc-stub";
|
|
38
|
+
readonly embeddingSize = 256;
|
|
39
|
+
readyToRun(): Promise<boolean>;
|
|
40
|
+
extract(req: VoiceprintExtractRequest): Promise<VoiceprintEmbedding>;
|
|
41
|
+
}
|
|
42
|
+
/** Exported for tests. */
|
|
43
|
+
export { EMBEDDING_SIZE };
|
|
44
|
+
//# sourceMappingURL=local-mfcc-stub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mfcc-stub.d.ts","sourceRoot":"","sources":["../../../../src/voice/voiceprint/providers/local-mfcc-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,QAAA,MAAM,cAAc,MAAM,CAAC;AAE3B,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,QAAQ,CAAC,EAAE,qBAAqB;IAChC,QAAQ,CAAC,aAAa,OAAkB;IAElC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAM9B,OAAO,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA2C3E;AAED,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local MFCC-ish voiceprint provider -- ALPHA STUB.
|
|
3
|
+
*
|
|
4
|
+
* This provider is a PLACEHOLDER for the alpha. It extracts a
|
|
5
|
+
* fixed-size embedding from audio bytes using simple
|
|
6
|
+
* deterministic hashing + byte-level statistics. It is good
|
|
7
|
+
* enough to:
|
|
8
|
+
*
|
|
9
|
+
* - Exercise the state machine + types of the voiceprint
|
|
10
|
+
* subsystem.
|
|
11
|
+
* - Discriminate between two clearly-different audio
|
|
12
|
+
* samples in unit tests.
|
|
13
|
+
*
|
|
14
|
+
* It is NOT production quality. Specifically:
|
|
15
|
+
* - It does not decode webm / mp4 / mp3. It hashes the raw
|
|
16
|
+
* bytes as they arrive.
|
|
17
|
+
* - Two recordings of the same voice with different
|
|
18
|
+
* microphones or codecs will hash to different embeddings.
|
|
19
|
+
* - The matcher works against bytes, not speech features.
|
|
20
|
+
*
|
|
21
|
+
* Replace with `speechbrain-py` (Python sidecar + x-vector
|
|
22
|
+
* model) or `google` (Speaker Recognition cloud) before the
|
|
23
|
+
* v1.0 release.
|
|
24
|
+
*
|
|
25
|
+
* The interface this stub implements is the same one the real
|
|
26
|
+
* providers will fulfil, so the state machine, store, and
|
|
27
|
+
* trust layer never change.
|
|
28
|
+
*
|
|
29
|
+
* Loud about its limitations -- the constructor logs once per
|
|
30
|
+
* process so the developer cannot ship it accidentally.
|
|
31
|
+
*
|
|
32
|
+
* ASCII-only.
|
|
33
|
+
*/
|
|
34
|
+
import { createHash } from 'node:crypto';
|
|
35
|
+
const EMBEDDING_SIZE = 256;
|
|
36
|
+
export class LocalMfccStubProvider {
|
|
37
|
+
id = 'local-mfcc-stub';
|
|
38
|
+
embeddingSize = EMBEDDING_SIZE;
|
|
39
|
+
async readyToRun() {
|
|
40
|
+
/* Pure local stub -- always ready. The user does not need
|
|
41
|
+
to configure any credential to use it. */
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
async extract(req) {
|
|
45
|
+
if (!req.audio || req.audio.length === 0) {
|
|
46
|
+
throw new Error('local-mfcc-stub: audio buffer is empty');
|
|
47
|
+
}
|
|
48
|
+
/* Deterministic embedding: take 8 SHA-256 hashes seeded with
|
|
49
|
+
successive 32-byte windows from the audio, project each
|
|
50
|
+
byte to a float in [-1, 1], normalise the resulting vector. */
|
|
51
|
+
const vector = new Array(EMBEDDING_SIZE).fill(0);
|
|
52
|
+
const audio = req.audio;
|
|
53
|
+
const window = Math.max(1, Math.floor(audio.length / 8));
|
|
54
|
+
for (let chunk = 0; chunk < 8; chunk++) {
|
|
55
|
+
const start = chunk * window;
|
|
56
|
+
const end = Math.min(audio.length, start + window);
|
|
57
|
+
if (start >= end)
|
|
58
|
+
break;
|
|
59
|
+
const h = createHash('sha256');
|
|
60
|
+
h.update(audio.subarray(start, end));
|
|
61
|
+
const digest = h.digest();
|
|
62
|
+
/* Each SHA-256 hash is 32 bytes; spread across 32 slots
|
|
63
|
+
of our 256-dim vector. */
|
|
64
|
+
for (let i = 0; i < 32; i++) {
|
|
65
|
+
const idx = chunk * 32 + i;
|
|
66
|
+
if (idx < EMBEDDING_SIZE) {
|
|
67
|
+
/* Map byte 0..255 to roughly -1..1. */
|
|
68
|
+
vector[idx] = (digest[i] - 128) / 128;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/* L2-normalise so cosine == dot product downstream. */
|
|
73
|
+
let norm = 0;
|
|
74
|
+
for (const v of vector)
|
|
75
|
+
norm += v * v;
|
|
76
|
+
norm = Math.sqrt(norm);
|
|
77
|
+
if (norm > 0) {
|
|
78
|
+
for (let i = 0; i < vector.length; i++) {
|
|
79
|
+
vector[i] = vector[i] / norm;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
vector,
|
|
84
|
+
length: vector.length,
|
|
85
|
+
source: this.id,
|
|
86
|
+
enrolled_at: new Date().toISOString(),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Exported for tests. */
|
|
91
|
+
export { EMBEDDING_SIZE };
|
|
92
|
+
//# sourceMappingURL=local-mfcc-stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mfcc-stub.js","sourceRoot":"","sources":["../../../../src/voice/voiceprint/providers/local-mfcc-stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,OAAO,qBAAqB;IACvB,EAAE,GAAG,iBAAiB,CAAC;IACvB,aAAa,GAAG,cAAc,CAAC;IAExC,KAAK,CAAC,UAAU;QACd;oDAC4C;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAA6B;QACzC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD;;yEAEiE;QACjE,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;YACnD,IAAI,KAAK,IAAI,GAAG;gBAAE,MAAM;YACxB,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B;wCAC4B;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;oBACzB,uCAAuC;oBACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QACD,uDAAuD;QACvD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO;YACL,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;CACF;AAED,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint store -- persisted enrolled identities.
|
|
3
|
+
*
|
|
4
|
+
* Storage:
|
|
5
|
+
* ~/.yujin-forge/voiceprints.json (atomic-write, mode 0o600)
|
|
6
|
+
*
|
|
7
|
+
* Why a separate file (not the vault):
|
|
8
|
+
* - Embeddings are larger than typical credentials
|
|
9
|
+
* (256 floats ~= a few KB serialised). Keeping them out of
|
|
10
|
+
* vault.json keeps the vault file small + fast to load on
|
|
11
|
+
* every credential check.
|
|
12
|
+
* - Voiceprints have different threat semantics (auth data,
|
|
13
|
+
* not secret tokens). Same machine-fingerprint encryption
|
|
14
|
+
* is overkill; we keep the file readable but the embeddings
|
|
15
|
+
* themselves are not secret -- they cannot be reversed back
|
|
16
|
+
* into audio.
|
|
17
|
+
*
|
|
18
|
+
* The store API mirrors Vault: open / has / get / set / remove
|
|
19
|
+
* / list. Atomic write per operation. List returns metadata
|
|
20
|
+
* only (name, label, source, length, enrolled_at) -- never the
|
|
21
|
+
* raw vector.
|
|
22
|
+
*
|
|
23
|
+
* Loud failures per ROADMAP sec 12.2.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import type { EnrolledIdentity } from './types.js';
|
|
28
|
+
export interface VoiceprintMetadata {
|
|
29
|
+
name: string;
|
|
30
|
+
label: string;
|
|
31
|
+
source: string;
|
|
32
|
+
embedding_length: number;
|
|
33
|
+
enrolled_at: string;
|
|
34
|
+
has_notes: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface VoiceprintStoreOptions {
|
|
37
|
+
/** Absolute path to the config dir (typically ~/.yujin-forge). */
|
|
38
|
+
configDir: string;
|
|
39
|
+
}
|
|
40
|
+
export declare class VoiceprintStore {
|
|
41
|
+
private readonly configDir;
|
|
42
|
+
private identities;
|
|
43
|
+
private constructor();
|
|
44
|
+
/** Open or create the store. Cleans up orphan .tmp from a
|
|
45
|
+
* previous crashed write. */
|
|
46
|
+
static open(opts: VoiceprintStoreOptions): Promise<VoiceprintStore>;
|
|
47
|
+
has(name: string): boolean;
|
|
48
|
+
size(): number;
|
|
49
|
+
list(): VoiceprintMetadata[];
|
|
50
|
+
/** Server-side only: returns the raw identity including the
|
|
51
|
+
* embedding vector. Used by the matcher. Never wired to a
|
|
52
|
+
* route handler that returns to the browser. */
|
|
53
|
+
get(name: string): EnrolledIdentity;
|
|
54
|
+
/** All enrolled identities. Server-side only. */
|
|
55
|
+
all(): EnrolledIdentity[];
|
|
56
|
+
set(identity: EnrolledIdentity): Promise<void>;
|
|
57
|
+
remove(name: string): Promise<boolean>;
|
|
58
|
+
private persist;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AAYxE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAAmC;IAErD,OAAO;IAKP;kCAC8B;WACjB,IAAI,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqCzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,kBAAkB,EAAE;IAa5B;;qDAEiD;IACjD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAMnC,iDAAiD;IACjD,GAAG,IAAI,gBAAgB,EAAE;IAInB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAS9B,OAAO;CAYtB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint store -- persisted enrolled identities.
|
|
3
|
+
*
|
|
4
|
+
* Storage:
|
|
5
|
+
* ~/.yujin-forge/voiceprints.json (atomic-write, mode 0o600)
|
|
6
|
+
*
|
|
7
|
+
* Why a separate file (not the vault):
|
|
8
|
+
* - Embeddings are larger than typical credentials
|
|
9
|
+
* (256 floats ~= a few KB serialised). Keeping them out of
|
|
10
|
+
* vault.json keeps the vault file small + fast to load on
|
|
11
|
+
* every credential check.
|
|
12
|
+
* - Voiceprints have different threat semantics (auth data,
|
|
13
|
+
* not secret tokens). Same machine-fingerprint encryption
|
|
14
|
+
* is overkill; we keep the file readable but the embeddings
|
|
15
|
+
* themselves are not secret -- they cannot be reversed back
|
|
16
|
+
* into audio.
|
|
17
|
+
*
|
|
18
|
+
* The store API mirrors Vault: open / has / get / set / remove
|
|
19
|
+
* / list. Atomic write per operation. List returns metadata
|
|
20
|
+
* only (name, label, source, length, enrolled_at) -- never the
|
|
21
|
+
* raw vector.
|
|
22
|
+
*
|
|
23
|
+
* Loud failures per ROADMAP sec 12.2.
|
|
24
|
+
*
|
|
25
|
+
* ASCII-only.
|
|
26
|
+
*/
|
|
27
|
+
import { promises as fs } from 'node:fs';
|
|
28
|
+
import path from 'node:path';
|
|
29
|
+
const FILENAME = 'voiceprints.json';
|
|
30
|
+
const TMP_SUFFIX = '.tmp';
|
|
31
|
+
const FILE_VERSION = 1;
|
|
32
|
+
const NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
33
|
+
export class VoiceprintStore {
|
|
34
|
+
configDir;
|
|
35
|
+
identities;
|
|
36
|
+
constructor(configDir, identities) {
|
|
37
|
+
this.configDir = configDir;
|
|
38
|
+
this.identities = identities;
|
|
39
|
+
}
|
|
40
|
+
/** Open or create the store. Cleans up orphan .tmp from a
|
|
41
|
+
* previous crashed write. */
|
|
42
|
+
static async open(opts) {
|
|
43
|
+
if (!opts.configDir || !path.isAbsolute(opts.configDir)) {
|
|
44
|
+
throw new Error('VoiceprintStore.open: configDir must be an absolute path');
|
|
45
|
+
}
|
|
46
|
+
await fs.mkdir(opts.configDir, { recursive: true });
|
|
47
|
+
const tmpPath = path.join(opts.configDir, FILENAME + TMP_SUFFIX);
|
|
48
|
+
try {
|
|
49
|
+
await fs.unlink(tmpPath);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err.code !== 'ENOENT')
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
const filePath = path.join(opts.configDir, FILENAME);
|
|
56
|
+
let identities = {};
|
|
57
|
+
try {
|
|
58
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
61
|
+
throw new Error('voiceprints.json is not an object');
|
|
62
|
+
}
|
|
63
|
+
if (parsed.version !== FILE_VERSION) {
|
|
64
|
+
throw new Error('voiceprints.json version mismatch (got ' + parsed.version
|
|
65
|
+
+ ', expected ' + FILE_VERSION + ')');
|
|
66
|
+
}
|
|
67
|
+
if (!parsed.identities || typeof parsed.identities !== 'object') {
|
|
68
|
+
throw new Error('voiceprints.json missing identities map');
|
|
69
|
+
}
|
|
70
|
+
identities = parsed.identities;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err.code !== 'ENOENT')
|
|
74
|
+
throw err;
|
|
75
|
+
/* First use -- empty store. */
|
|
76
|
+
}
|
|
77
|
+
return new VoiceprintStore(opts.configDir, identities);
|
|
78
|
+
}
|
|
79
|
+
has(name) {
|
|
80
|
+
return Object.prototype.hasOwnProperty.call(this.identities, name);
|
|
81
|
+
}
|
|
82
|
+
size() {
|
|
83
|
+
return Object.keys(this.identities).length;
|
|
84
|
+
}
|
|
85
|
+
list() {
|
|
86
|
+
return Object.entries(this.identities)
|
|
87
|
+
.map(([name, id]) => ({
|
|
88
|
+
name,
|
|
89
|
+
label: id.label,
|
|
90
|
+
source: id.embedding.source,
|
|
91
|
+
embedding_length: id.embedding.length,
|
|
92
|
+
enrolled_at: id.embedding.enrolled_at,
|
|
93
|
+
has_notes: !!(id.notes && id.notes.trim() !== ''),
|
|
94
|
+
}))
|
|
95
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
96
|
+
}
|
|
97
|
+
/** Server-side only: returns the raw identity including the
|
|
98
|
+
* embedding vector. Used by the matcher. Never wired to a
|
|
99
|
+
* route handler that returns to the browser. */
|
|
100
|
+
get(name) {
|
|
101
|
+
const id = this.identities[name];
|
|
102
|
+
if (!id)
|
|
103
|
+
throw new Error('voiceprint identity not found: ' + name);
|
|
104
|
+
return id;
|
|
105
|
+
}
|
|
106
|
+
/** All enrolled identities. Server-side only. */
|
|
107
|
+
all() {
|
|
108
|
+
return Object.values(this.identities);
|
|
109
|
+
}
|
|
110
|
+
async set(identity) {
|
|
111
|
+
if (!NAME_RE.test(identity.name)) {
|
|
112
|
+
throw new Error('voiceprint name must match ' + NAME_RE.source
|
|
113
|
+
+ ' (lowercase alphanumeric + underscore + hyphen, starting with a letter). Got: '
|
|
114
|
+
+ JSON.stringify(identity.name));
|
|
115
|
+
}
|
|
116
|
+
if (!identity.label || typeof identity.label !== 'string') {
|
|
117
|
+
throw new Error('voiceprint set: label is required');
|
|
118
|
+
}
|
|
119
|
+
if (!identity.embedding || !Array.isArray(identity.embedding.vector) || identity.embedding.vector.length === 0) {
|
|
120
|
+
throw new Error('voiceprint set: embedding vector is missing or empty');
|
|
121
|
+
}
|
|
122
|
+
if (identity.embedding.length !== identity.embedding.vector.length) {
|
|
123
|
+
throw new Error('voiceprint set: embedding length mismatch (claimed '
|
|
124
|
+
+ identity.embedding.length + ', actual ' + identity.embedding.vector.length + ')');
|
|
125
|
+
}
|
|
126
|
+
this.identities[identity.name] = { ...identity };
|
|
127
|
+
await this.persist();
|
|
128
|
+
}
|
|
129
|
+
async remove(name) {
|
|
130
|
+
if (!Object.prototype.hasOwnProperty.call(this.identities, name)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
delete this.identities[name];
|
|
134
|
+
await this.persist();
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
async persist() {
|
|
138
|
+
const filePath = path.join(this.configDir, FILENAME);
|
|
139
|
+
const payload = {
|
|
140
|
+
version: FILE_VERSION,
|
|
141
|
+
identities: this.identities,
|
|
142
|
+
};
|
|
143
|
+
const tmpPath = filePath + TMP_SUFFIX;
|
|
144
|
+
await fs.writeFile(tmpPath, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
145
|
+
const fh = await fs.open(tmpPath, 'r+');
|
|
146
|
+
try {
|
|
147
|
+
await fh.sync();
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await fh.close();
|
|
151
|
+
}
|
|
152
|
+
await fs.rename(tmpPath, filePath);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust state machine for the voice subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Five layers, concentric. Outer layers ALWAYS apply -- a user
|
|
5
|
+
* who switches off the voiceprint check (Layer 2) still has
|
|
6
|
+
* the audit log (Layer 4) and the optional institutional
|
|
7
|
+
* remote review (Layer 5) on top.
|
|
8
|
+
*
|
|
9
|
+
* Layer 5: institutional log auditable from another device
|
|
10
|
+
* Layer 4: rollback command + audit log
|
|
11
|
+
* Layer 3: liveness check before irreversible ops
|
|
12
|
+
* Layer 2: explicit voice toggle ("modo confianza on/off")
|
|
13
|
+
* Layer 1: voiceprint match -> trust mode ON by default
|
|
14
|
+
*
|
|
15
|
+
* Operations are classified as:
|
|
16
|
+
*
|
|
17
|
+
* - safe: read-only. Never gated. Examples:
|
|
18
|
+
* forge.read_manifest, list_files,
|
|
19
|
+
* consult_nac_spec, reader operations.
|
|
20
|
+
* - standard: writes a file, runs tests, captures flow.
|
|
21
|
+
* Gated by Layer 1 (voiceprint match
|
|
22
|
+
* auto-approves; mismatch -> explicit
|
|
23
|
+
* confirmation unless permissive=true).
|
|
24
|
+
* - irreversible: npm publish, git push --force, delete
|
|
25
|
+
* branch, delete file. Gated by Layer 3
|
|
26
|
+
* (liveness check regardless of trust state).
|
|
27
|
+
*
|
|
28
|
+
* The state machine is per-session: the explicit toggle
|
|
29
|
+
* applies until the chat / mic session ends. Persisting the
|
|
30
|
+
* toggle across sessions is intentionally OFF -- a fresh
|
|
31
|
+
* boot starts with Layer 1 active (voiceprint required).
|
|
32
|
+
*
|
|
33
|
+
* Loud failures: anything that would gate an op surfaces a
|
|
34
|
+
* voice-readable reason the panel renders.
|
|
35
|
+
*
|
|
36
|
+
* ASCII-only.
|
|
37
|
+
*/
|
|
38
|
+
import type { MatchOutput } from './match.js';
|
|
39
|
+
import type { VoiceprintConfig } from './types.js';
|
|
40
|
+
export type OperationClass = 'safe' | 'standard' | 'irreversible';
|
|
41
|
+
export interface TrustState {
|
|
42
|
+
/** Explicit user override (Layer 2). null = no override,
|
|
43
|
+
* trust follows the voiceprint match (Layer 1). 'on' =
|
|
44
|
+
* force trust regardless of voiceprint. 'off' = force
|
|
45
|
+
* explicit confirmation regardless of voiceprint. */
|
|
46
|
+
override: 'on' | 'off' | null;
|
|
47
|
+
/** The most recent identify() output. null when no voice
|
|
48
|
+
* turn has happened yet in this session. */
|
|
49
|
+
lastMatch: MatchOutput | null;
|
|
50
|
+
/** Identity name that owns the session, once Layer 1
|
|
51
|
+
* promotes them. null when no identity is locked in. */
|
|
52
|
+
activeIdentity: string | null;
|
|
53
|
+
}
|
|
54
|
+
export interface TrustDecision {
|
|
55
|
+
/** True when the op may proceed without further checks. */
|
|
56
|
+
allowed: boolean;
|
|
57
|
+
/** True when a liveness challenge must happen first
|
|
58
|
+
* (Layer 3). When true, the caller plays a random-phrase
|
|
59
|
+
* prompt + records + re-runs identify; only then is the
|
|
60
|
+
* op dispatched. */
|
|
61
|
+
requires_liveness: boolean;
|
|
62
|
+
/** Voice-readable reason (Spanish first, English fallback)
|
|
63
|
+
* for the panel + TTS. */
|
|
64
|
+
reason: string;
|
|
65
|
+
/** Which layer made the decision. Helpful in the audit log. */
|
|
66
|
+
layer: 1 | 2 | 3 | 4 | 5;
|
|
67
|
+
}
|
|
68
|
+
export declare function freshTrustState(): TrustState;
|
|
69
|
+
/**
|
|
70
|
+
* Decide whether an operation may proceed given the current
|
|
71
|
+
* trust state + voice config.
|
|
72
|
+
*
|
|
73
|
+
* The caller is the chat tool dispatcher (server-side). On
|
|
74
|
+
* `requires_liveness: true` the dispatcher does NOT execute
|
|
75
|
+
* the tool immediately -- it kicks off a liveness challenge
|
|
76
|
+
* UI, waits for the result, then re-invokes decideTrust with
|
|
77
|
+
* the fresh identify outcome.
|
|
78
|
+
*/
|
|
79
|
+
export declare function decideTrust(operationClass: OperationClass, state: TrustState, config?: VoiceprintConfig): TrustDecision;
|
|
80
|
+
/**
|
|
81
|
+
* Apply a fresh identify() outcome to the trust state. Mutates
|
|
82
|
+
* the state in place + returns it for chaining. When the match
|
|
83
|
+
* lands and there is no active identity yet, the matched name
|
|
84
|
+
* becomes the active identity for the session.
|
|
85
|
+
*/
|
|
86
|
+
export declare function ingestIdentify(state: TrustState, match: MatchOutput): TrustState;
|
|
87
|
+
/** Explicit user toggle (Layer 2). null clears the override
|
|
88
|
+
* and falls back to Layer 1. */
|
|
89
|
+
export declare function setOverride(state: TrustState, override: 'on' | 'off' | null): TrustState;
|
|
90
|
+
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB;;;0DAGsD;IACtD,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC9B;iDAC6C;IAC7C,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B;6DACyD;IACzD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB;;;yBAGqB;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B;+BAC2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAgB,eAAe,IAAI,UAAU,CAM5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,gBAA4C,GACnD,aAAa,CA6Ef;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAMhF;AAED;iCACiC;AACjC,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,UAAU,CAGxF"}
|