@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,150 @@
|
|
|
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 { DEFAULT_VOICEPRINT_CONFIG } from './types.js';
|
|
39
|
+
export function freshTrustState() {
|
|
40
|
+
return {
|
|
41
|
+
override: null,
|
|
42
|
+
lastMatch: null,
|
|
43
|
+
activeIdentity: null,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Decide whether an operation may proceed given the current
|
|
48
|
+
* trust state + voice config.
|
|
49
|
+
*
|
|
50
|
+
* The caller is the chat tool dispatcher (server-side). On
|
|
51
|
+
* `requires_liveness: true` the dispatcher does NOT execute
|
|
52
|
+
* the tool immediately -- it kicks off a liveness challenge
|
|
53
|
+
* UI, waits for the result, then re-invokes decideTrust with
|
|
54
|
+
* the fresh identify outcome.
|
|
55
|
+
*/
|
|
56
|
+
export function decideTrust(operationClass, state, config = DEFAULT_VOICEPRINT_CONFIG) {
|
|
57
|
+
/* Safe ops are never gated. They land regardless of trust
|
|
58
|
+
state for a usable read-only experience. */
|
|
59
|
+
if (operationClass === 'safe') {
|
|
60
|
+
return {
|
|
61
|
+
allowed: true,
|
|
62
|
+
requires_liveness: false,
|
|
63
|
+
reason: 'safe operation -- read-only, no gating',
|
|
64
|
+
layer: 1,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/* Irreversible ops ALWAYS require liveness, regardless of
|
|
68
|
+
trust state. Layer 3 is non-overridable. */
|
|
69
|
+
if (operationClass === 'irreversible') {
|
|
70
|
+
return {
|
|
71
|
+
allowed: false,
|
|
72
|
+
requires_liveness: true,
|
|
73
|
+
reason: 'irreversible operation -- liveness check required',
|
|
74
|
+
layer: 3,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/* Standard ops: Layer 2 override wins, then Layer 1. */
|
|
78
|
+
if (state.override === 'off') {
|
|
79
|
+
return {
|
|
80
|
+
allowed: false,
|
|
81
|
+
requires_liveness: false,
|
|
82
|
+
reason: 'trust mode off -- explicit user confirmation required',
|
|
83
|
+
layer: 2,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (state.override === 'on') {
|
|
87
|
+
return {
|
|
88
|
+
allowed: true,
|
|
89
|
+
requires_liveness: false,
|
|
90
|
+
reason: 'trust mode forced on by user',
|
|
91
|
+
layer: 2,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/* Layer 1: voiceprint match. */
|
|
95
|
+
if (state.lastMatch === null) {
|
|
96
|
+
/* No identify() ran yet -- err on the side of explicit
|
|
97
|
+
confirmation. */
|
|
98
|
+
return {
|
|
99
|
+
allowed: false,
|
|
100
|
+
requires_liveness: false,
|
|
101
|
+
reason: 'no voiceprint match yet -- speak once to identify yourself',
|
|
102
|
+
layer: 1,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (state.lastMatch.matched === null) {
|
|
106
|
+
/* Speaker not recognised. */
|
|
107
|
+
if (config.permissive) {
|
|
108
|
+
return {
|
|
109
|
+
allowed: true,
|
|
110
|
+
requires_liveness: false,
|
|
111
|
+
reason: 'permissive mode -- unknown speaker allowed',
|
|
112
|
+
layer: 1,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
allowed: false,
|
|
117
|
+
requires_liveness: false,
|
|
118
|
+
reason: 'unknown speaker -- enroll first or toggle trust mode',
|
|
119
|
+
layer: 1,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/* Match found -- proceed. */
|
|
123
|
+
return {
|
|
124
|
+
allowed: true,
|
|
125
|
+
requires_liveness: false,
|
|
126
|
+
reason: 'voiceprint match: ' + state.lastMatch.matched
|
|
127
|
+
+ ' (score ' + state.lastMatch.score.toFixed(2) + ')',
|
|
128
|
+
layer: 1,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Apply a fresh identify() outcome to the trust state. Mutates
|
|
133
|
+
* the state in place + returns it for chaining. When the match
|
|
134
|
+
* lands and there is no active identity yet, the matched name
|
|
135
|
+
* becomes the active identity for the session.
|
|
136
|
+
*/
|
|
137
|
+
export function ingestIdentify(state, match) {
|
|
138
|
+
state.lastMatch = match;
|
|
139
|
+
if (state.activeIdentity === null && match.matched) {
|
|
140
|
+
state.activeIdentity = match.matched;
|
|
141
|
+
}
|
|
142
|
+
return state;
|
|
143
|
+
}
|
|
144
|
+
/** Explicit user toggle (Layer 2). null clears the override
|
|
145
|
+
* and falls back to Layer 1. */
|
|
146
|
+
export function setOverride(state, override) {
|
|
147
|
+
state.override = override;
|
|
148
|
+
return state;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint subsystem -- type surface.
|
|
3
|
+
*
|
|
4
|
+
* The voiceprint subsystem identifies who is speaking by
|
|
5
|
+
* computing a fixed-size embedding from an audio sample and
|
|
6
|
+
* comparing it against enrolled embeddings via cosine similarity.
|
|
7
|
+
*
|
|
8
|
+
* Provider pattern mirrors STT/TTS: an interface + multiple
|
|
9
|
+
* implementations registered with an ID. Default (alpha) is
|
|
10
|
+
* `local-mfcc-stub` -- a pure-Node placeholder good enough to
|
|
11
|
+
* exercise the state machine + types but NOT production
|
|
12
|
+
* quality. SpeechBrain via Python sidecar lands later;
|
|
13
|
+
* Google Speaker Recognition cloud is the configurable
|
|
14
|
+
* primary per Pablo's G-VOICE-1 decision (2026-05-23).
|
|
15
|
+
*
|
|
16
|
+
* ASCII-only.
|
|
17
|
+
*/
|
|
18
|
+
/** Identifiers for voiceprint providers. Open string union --
|
|
19
|
+
* same pattern as the STT/TTS provider ids. */
|
|
20
|
+
export type VoiceprintProviderId = 'local-mfcc-stub' | 'speechbrain-py' | 'google' | string;
|
|
21
|
+
/** A computed embedding. Vectors are typically 256-dimensional
|
|
22
|
+
* but the size is provider-specific; we store the length
|
|
23
|
+
* alongside for sanity checks. */
|
|
24
|
+
export interface VoiceprintEmbedding {
|
|
25
|
+
/** Embedding vector. Floats, typically L2-normalised by the
|
|
26
|
+
* provider so cosine == dot product. */
|
|
27
|
+
vector: number[];
|
|
28
|
+
/** Length of vector. Stored explicitly so a deserialised
|
|
29
|
+
* embedding can be validated cheaply. */
|
|
30
|
+
length: number;
|
|
31
|
+
/** Provider id that produced the embedding. Required so
|
|
32
|
+
* matches across providers can be flagged loudly. */
|
|
33
|
+
source: VoiceprintProviderId;
|
|
34
|
+
/** ISO 8601 timestamp of enrollment. Audit trail. */
|
|
35
|
+
enrolled_at: string;
|
|
36
|
+
}
|
|
37
|
+
/** A request to extract an embedding from audio bytes. */
|
|
38
|
+
export interface VoiceprintExtractRequest {
|
|
39
|
+
audio: Buffer;
|
|
40
|
+
/** Audio format. Same enum as the STT request. */
|
|
41
|
+
format: 'webm' | 'ogg' | 'wav' | 'mp3' | 'flac' | 'mp4';
|
|
42
|
+
}
|
|
43
|
+
/** Provider interface every voiceprint backend implements. */
|
|
44
|
+
export interface VoiceprintProvider {
|
|
45
|
+
readonly id: VoiceprintProviderId;
|
|
46
|
+
/** Embedding dimensionality this provider produces.
|
|
47
|
+
* Mismatches across providers fail the match step
|
|
48
|
+
* loudly. */
|
|
49
|
+
readonly embeddingSize: number;
|
|
50
|
+
/** True when the provider has everything it needs.
|
|
51
|
+
* Local stub is always ready; cloud providers check the
|
|
52
|
+
* vault for credentials. */
|
|
53
|
+
readyToRun(): Promise<boolean>;
|
|
54
|
+
/** Extract an embedding from the audio. */
|
|
55
|
+
extract(req: VoiceprintExtractRequest): Promise<VoiceprintEmbedding>;
|
|
56
|
+
}
|
|
57
|
+
/** User-facing voiceprint configuration. Persisted in the same
|
|
58
|
+
* ~/.yujin-forge/voice-config.json under the `voiceprint` key
|
|
59
|
+
* added in this slice. */
|
|
60
|
+
export interface VoiceprintConfig {
|
|
61
|
+
/** Active provider. */
|
|
62
|
+
provider: VoiceprintProviderId;
|
|
63
|
+
/** Cosine similarity threshold above which a match counts as
|
|
64
|
+
* the enrolled speaker. Default 0.75 (conservative). */
|
|
65
|
+
threshold: number;
|
|
66
|
+
/** When true, mismatches do NOT block tool dispatch -- they
|
|
67
|
+
* only annotate the audit log. Useful in development. */
|
|
68
|
+
permissive: boolean;
|
|
69
|
+
}
|
|
70
|
+
export declare const DEFAULT_VOICEPRINT_CONFIG: VoiceprintConfig;
|
|
71
|
+
/** A single enrolled identity. Multiple identities can be
|
|
72
|
+
* enrolled per install (parent + child + helper sharing a
|
|
73
|
+
* workstation). */
|
|
74
|
+
export interface EnrolledIdentity {
|
|
75
|
+
/** Stable identifier (snake_case). Used as a key in the
|
|
76
|
+
* enrollment store. */
|
|
77
|
+
name: string;
|
|
78
|
+
/** The embedding extracted during enrollment. */
|
|
79
|
+
embedding: VoiceprintEmbedding;
|
|
80
|
+
/** Human-readable label shown to the user
|
|
81
|
+
* ("Pablo", "Mama", "Helper"). */
|
|
82
|
+
label: string;
|
|
83
|
+
/** Free-form notes for the audit trail. */
|
|
84
|
+
notes?: string;
|
|
85
|
+
}
|
|
86
|
+
/** Result of a match against the enrolled set. */
|
|
87
|
+
export interface MatchResult {
|
|
88
|
+
/** Name of the best-matching enrolled identity, or null when
|
|
89
|
+
* no enrolled embedding exceeded the threshold. */
|
|
90
|
+
matched: string | null;
|
|
91
|
+
/** Cosine similarity score of the best match. */
|
|
92
|
+
score: number;
|
|
93
|
+
/** All scores for transparency / debugging. Map of name ->
|
|
94
|
+
* score, sorted descending. */
|
|
95
|
+
ranked: Array<{
|
|
96
|
+
name: string;
|
|
97
|
+
score: number;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/voice/voiceprint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;gDACgD;AAChD,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,gBAAgB,GAChB,QAAQ,GACR,MAAM,CAAC;AAEX;;mCAEmC;AACnC,MAAM,WAAW,mBAAmB;IAClC;6CACyC;IACzC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;8CAC0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf;0DACsD;IACtD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;CACzD;AAED,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC;IAClC;;kBAEc;IACd,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;iCAE6B;IAC7B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,2CAA2C;IAC3C,OAAO,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtE;AAED;;2BAE2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B;6DACyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB;8DAC0D;IAC1D,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAIvC,CAAC;AAEF;;oBAEoB;AACpB,MAAM,WAAW,gBAAgB;IAC/B;4BACwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,mBAAmB,CAAC;IAC/B;uCACmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B;wDACoD;IACpD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd;oCACgC;IAChC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voiceprint subsystem -- type surface.
|
|
3
|
+
*
|
|
4
|
+
* The voiceprint subsystem identifies who is speaking by
|
|
5
|
+
* computing a fixed-size embedding from an audio sample and
|
|
6
|
+
* comparing it against enrolled embeddings via cosine similarity.
|
|
7
|
+
*
|
|
8
|
+
* Provider pattern mirrors STT/TTS: an interface + multiple
|
|
9
|
+
* implementations registered with an ID. Default (alpha) is
|
|
10
|
+
* `local-mfcc-stub` -- a pure-Node placeholder good enough to
|
|
11
|
+
* exercise the state machine + types but NOT production
|
|
12
|
+
* quality. SpeechBrain via Python sidecar lands later;
|
|
13
|
+
* Google Speaker Recognition cloud is the configurable
|
|
14
|
+
* primary per Pablo's G-VOICE-1 decision (2026-05-23).
|
|
15
|
+
*
|
|
16
|
+
* ASCII-only.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_VOICEPRINT_CONFIG = {
|
|
19
|
+
provider: 'local-mfcc-stub',
|
|
20
|
+
threshold: 0.75,
|
|
21
|
+
permissive: false,
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/voice/voiceprint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA+DH,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,KAAK;CAClB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wake-word matcher (PLAN soft #8).
|
|
3
|
+
*
|
|
4
|
+
* Problem (Pablo 2026-05-26): "Yujin" pronounces as "yu-yin"
|
|
5
|
+
* in Japanese, but STT providers trained mostly on English
|
|
6
|
+
* write the audio back as a noisy set of variants:
|
|
7
|
+
* "yujin" / "yuyin" / "you jin" / "u jin" / "yujín" / etc.
|
|
8
|
+
*
|
|
9
|
+
* A literal match against "yujin" would miss most utterances.
|
|
10
|
+
*
|
|
11
|
+
* Strategy (A + C combined):
|
|
12
|
+
* A. Default alias list covers the variants we know STTs
|
|
13
|
+
* emit + Levenshtein distance ≤ 2 catches the rest.
|
|
14
|
+
* B. User can extend the alias list per-device via the
|
|
15
|
+
* vault slot `wake_aliases` (comma-separated). The
|
|
16
|
+
* `yf voice config --aliases X,Y,Z` CLI persists it.
|
|
17
|
+
*
|
|
18
|
+
* Pre-processing:
|
|
19
|
+
* - lowercase
|
|
20
|
+
* - strip accents (NFD + ASCII filter)
|
|
21
|
+
* - strip dashes, periods, commas
|
|
22
|
+
* - collapse whitespace
|
|
23
|
+
*
|
|
24
|
+
* Match algorithm:
|
|
25
|
+
* - exact alias match -> hit
|
|
26
|
+
* - fuzzy Levenshtein distance 0..2 against any alias -> hit
|
|
27
|
+
* - else miss
|
|
28
|
+
*
|
|
29
|
+
* The matcher is invoked on the FIRST window of every voice
|
|
30
|
+
* turn; once it fires, intents.ts takes over for the rest of
|
|
31
|
+
* the utterance.
|
|
32
|
+
*
|
|
33
|
+
* ASCII-only.
|
|
34
|
+
*/
|
|
35
|
+
export declare const DEFAULT_WAKE_ALIASES: readonly string[];
|
|
36
|
+
export interface WakeMatchResult {
|
|
37
|
+
hit: boolean;
|
|
38
|
+
/** Alias the matcher hit on (canonical form). */
|
|
39
|
+
matched_alias?: string;
|
|
40
|
+
/** Distance from the alias (0 = exact, 1-2 = fuzzy). */
|
|
41
|
+
distance?: number;
|
|
42
|
+
/** Normalised version of the input that the matcher saw. */
|
|
43
|
+
normalised: string;
|
|
44
|
+
}
|
|
45
|
+
export interface WakeMatchOptions {
|
|
46
|
+
/** Override or extend the default alias set. When provided,
|
|
47
|
+
* replaces DEFAULT_WAKE_ALIASES entirely (use mergeAliases
|
|
48
|
+
* to combine). */
|
|
49
|
+
aliases?: readonly string[];
|
|
50
|
+
/** Maximum Levenshtein distance accepted. Default 2. */
|
|
51
|
+
maxDistance?: number;
|
|
52
|
+
}
|
|
53
|
+
/** Normalise a transcript chunk so STT noise (accents,
|
|
54
|
+
* punctuation, casing) does not block the match. */
|
|
55
|
+
export declare function normaliseWakeInput(input: string): string;
|
|
56
|
+
/** Classic Levenshtein. O(n*m). For wake-word strings (< 20
|
|
57
|
+
* chars) the cost is trivial. */
|
|
58
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
59
|
+
/** Run the wake-word matcher against the input. */
|
|
60
|
+
export declare function matchWakeWord(input: string, opts?: WakeMatchOptions): WakeMatchResult;
|
|
61
|
+
/** Merge user-provided aliases with the defaults, dedup +
|
|
62
|
+
* normalised. */
|
|
63
|
+
export declare function mergeAliases(extra: readonly string[]): string[];
|
|
64
|
+
//# sourceMappingURL=wake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake.d.ts","sourceRoot":"","sources":["../../src/voice/wake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAMH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAcjD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,OAAO,CAAC;IACb,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;uBAEmB;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;qDACqD;AACrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;kCACkC;AAClC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBxD;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,gBAAqB,GAC1B,eAAe,CAsCjB;AAED;kBACkB;AAClB,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAW/D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wake-word matcher (PLAN soft #8).
|
|
3
|
+
*
|
|
4
|
+
* Problem (Pablo 2026-05-26): "Yujin" pronounces as "yu-yin"
|
|
5
|
+
* in Japanese, but STT providers trained mostly on English
|
|
6
|
+
* write the audio back as a noisy set of variants:
|
|
7
|
+
* "yujin" / "yuyin" / "you jin" / "u jin" / "yujín" / etc.
|
|
8
|
+
*
|
|
9
|
+
* A literal match against "yujin" would miss most utterances.
|
|
10
|
+
*
|
|
11
|
+
* Strategy (A + C combined):
|
|
12
|
+
* A. Default alias list covers the variants we know STTs
|
|
13
|
+
* emit + Levenshtein distance ≤ 2 catches the rest.
|
|
14
|
+
* B. User can extend the alias list per-device via the
|
|
15
|
+
* vault slot `wake_aliases` (comma-separated). The
|
|
16
|
+
* `yf voice config --aliases X,Y,Z` CLI persists it.
|
|
17
|
+
*
|
|
18
|
+
* Pre-processing:
|
|
19
|
+
* - lowercase
|
|
20
|
+
* - strip accents (NFD + ASCII filter)
|
|
21
|
+
* - strip dashes, periods, commas
|
|
22
|
+
* - collapse whitespace
|
|
23
|
+
*
|
|
24
|
+
* Match algorithm:
|
|
25
|
+
* - exact alias match -> hit
|
|
26
|
+
* - fuzzy Levenshtein distance 0..2 against any alias -> hit
|
|
27
|
+
* - else miss
|
|
28
|
+
*
|
|
29
|
+
* The matcher is invoked on the FIRST window of every voice
|
|
30
|
+
* turn; once it fires, intents.ts takes over for the rest of
|
|
31
|
+
* the utterance.
|
|
32
|
+
*
|
|
33
|
+
* ASCII-only.
|
|
34
|
+
*/
|
|
35
|
+
/* Default aliases we know STTs emit for "Yujin" / "yu-yin".
|
|
36
|
+
* Accented forms ("yujín", "yuyín") would normalise into the
|
|
37
|
+
* un-accented variants -- keep only the canonical post-normalise
|
|
38
|
+
* shapes here so mergeAliases dedup math stays predictable. */
|
|
39
|
+
export const DEFAULT_WAKE_ALIASES = [
|
|
40
|
+
'yujin',
|
|
41
|
+
'yuyin',
|
|
42
|
+
'you jin',
|
|
43
|
+
'you yin',
|
|
44
|
+
'u jin',
|
|
45
|
+
'yu jin',
|
|
46
|
+
'yu yin',
|
|
47
|
+
'yoo jin',
|
|
48
|
+
'yoo yin',
|
|
49
|
+
'yujim',
|
|
50
|
+
'yuyim',
|
|
51
|
+
'yu shin',
|
|
52
|
+
'you shin',
|
|
53
|
+
];
|
|
54
|
+
/** Normalise a transcript chunk so STT noise (accents,
|
|
55
|
+
* punctuation, casing) does not block the match. */
|
|
56
|
+
export function normaliseWakeInput(input) {
|
|
57
|
+
const lower = input.toLowerCase();
|
|
58
|
+
/* NFD decomposes accented chars into base + combining mark;
|
|
59
|
+
the [̀-ͯ] range covers all combining diacritics. */
|
|
60
|
+
const stripped = lower.normalize('NFD').replace(/[̀-ͯ]/g, '');
|
|
61
|
+
/* Strip punctuation that STTs sometimes insert. */
|
|
62
|
+
const noPunct = stripped.replace(/[.,;:!?\-_'"]/g, ' ');
|
|
63
|
+
/* Collapse whitespace. */
|
|
64
|
+
return noPunct.replace(/\s+/g, ' ').trim();
|
|
65
|
+
}
|
|
66
|
+
/** Classic Levenshtein. O(n*m). For wake-word strings (< 20
|
|
67
|
+
* chars) the cost is trivial. */
|
|
68
|
+
export function levenshtein(a, b) {
|
|
69
|
+
if (a === b)
|
|
70
|
+
return 0;
|
|
71
|
+
if (a.length === 0)
|
|
72
|
+
return b.length;
|
|
73
|
+
if (b.length === 0)
|
|
74
|
+
return a.length;
|
|
75
|
+
/* Rolling 2-row matrix to keep memory tight. */
|
|
76
|
+
let prev = new Array(b.length + 1);
|
|
77
|
+
let curr = new Array(b.length + 1);
|
|
78
|
+
for (let j = 0; j <= b.length; j++)
|
|
79
|
+
prev[j] = j;
|
|
80
|
+
for (let i = 1; i <= a.length; i++) {
|
|
81
|
+
curr[0] = i;
|
|
82
|
+
for (let j = 1; j <= b.length; j++) {
|
|
83
|
+
const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
|
|
84
|
+
curr[j] = Math.min(curr[j - 1] + 1, /* insert */ prev[j] + 1, /* delete */ prev[j - 1] + cost);
|
|
85
|
+
}
|
|
86
|
+
[prev, curr] = [curr, prev];
|
|
87
|
+
}
|
|
88
|
+
return prev[b.length];
|
|
89
|
+
}
|
|
90
|
+
/** Run the wake-word matcher against the input. */
|
|
91
|
+
export function matchWakeWord(input, opts = {}) {
|
|
92
|
+
const normalised = normaliseWakeInput(input);
|
|
93
|
+
if (normalised.length === 0) {
|
|
94
|
+
return { hit: false, normalised };
|
|
95
|
+
}
|
|
96
|
+
const aliases = (opts.aliases ?? DEFAULT_WAKE_ALIASES).map((a) => normaliseWakeInput(a));
|
|
97
|
+
const maxDist = opts.maxDistance ?? 2;
|
|
98
|
+
/* Build candidates: the full normalised string, every single
|
|
99
|
+
token, and every contiguous pair of tokens. This catches
|
|
100
|
+
filler-prefixed utterances like "hey yujin" / "ok yu jin"
|
|
101
|
+
plus single-word matches when STT misses spaces. */
|
|
102
|
+
const tokens = normalised.split(' ');
|
|
103
|
+
const candidates = [normalised];
|
|
104
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
105
|
+
candidates.push(tokens[i]);
|
|
106
|
+
if (i + 1 < tokens.length)
|
|
107
|
+
candidates.push(tokens[i] + ' ' + tokens[i + 1]);
|
|
108
|
+
}
|
|
109
|
+
let best = null;
|
|
110
|
+
for (const c of candidates) {
|
|
111
|
+
for (const a of aliases) {
|
|
112
|
+
const d = levenshtein(c, a);
|
|
113
|
+
if (d <= maxDist) {
|
|
114
|
+
if (!best || d < best.distance)
|
|
115
|
+
best = { alias: a, distance: d };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (best) {
|
|
120
|
+
return {
|
|
121
|
+
hit: true,
|
|
122
|
+
matched_alias: best.alias,
|
|
123
|
+
distance: best.distance,
|
|
124
|
+
normalised,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return { hit: false, normalised };
|
|
128
|
+
}
|
|
129
|
+
/** Merge user-provided aliases with the defaults, dedup +
|
|
130
|
+
* normalised. */
|
|
131
|
+
export function mergeAliases(extra) {
|
|
132
|
+
const seen = new Set();
|
|
133
|
+
const out = [];
|
|
134
|
+
for (const a of [...DEFAULT_WAKE_ALIASES, ...extra]) {
|
|
135
|
+
const norm = normaliseWakeInput(a);
|
|
136
|
+
if (norm.length > 0 && !seen.has(norm)) {
|
|
137
|
+
seen.add(norm);
|
|
138
|
+
out.push(norm);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=wake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake.js","sourceRoot":"","sources":["../../src/voice/wake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ar" dir="rtl">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Yujin Forge -- دليل المستخدم</title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
|
|
9
|
+
<h1>Yujin Forge -- دليل المستخدم</h1>
|
|
10
|
+
|
|
11
|
+
<p>مساعد تطوير صوتي أولاً لبناء تطبيقات React + NAC-3. مصمم
|
|
12
|
+
ليتمكن مرافق أو طفل يتعلم البرمجة من تشغيله دون الحاجة إلى
|
|
13
|
+
لمس الطرفية.</p>
|
|
14
|
+
|
|
15
|
+
<h2>مرحباً</h2>
|
|
16
|
+
|
|
17
|
+
<p>يقوم Yujin Forge بثلاثة أشياء بسيطة:</p>
|
|
18
|
+
<ul>
|
|
19
|
+
<li>يقرأ المستندات بصوت عالٍ (PDF، Word، HTML، MD، EPUB،
|
|
20
|
+
CSV، Excel، الكود المصدري، txt، RTF).</li>
|
|
21
|
+
<li>يأخذ مواصفات التصميم ويولد كود التطبيق تلقائياً.</li>
|
|
22
|
+
<li>يتحدث مع مساعد ذكاء اصطناعي يعرف مشروعك: قراءة البيان،
|
|
23
|
+
البحث في SPEC، تحرير المكونات، إجراء الالتزامات.</li>
|
|
24
|
+
</ul>
|
|
25
|
+
|
|
26
|
+
<h2>التثبيت</h2>
|
|
27
|
+
|
|
28
|
+
<ol>
|
|
29
|
+
<li>قم بتثبيت Node.js 18.17 أو أحدث من nodejs.org.</li>
|
|
30
|
+
<li>في الطرفية: <pre>npm install -g @yujin/forge-cli@alpha</pre></li>
|
|
31
|
+
<li>تحقق باستخدام <code>yf --version</code>.</li>
|
|
32
|
+
<li>قم بتشغيل <code>yf doctor</code>.</li>
|
|
33
|
+
</ol>
|
|
34
|
+
|
|
35
|
+
<h2>التشغيل الأول</h2>
|
|
36
|
+
|
|
37
|
+
<pre>yf chat</pre>
|
|
38
|
+
|
|
39
|
+
<p>يفتح المتصفح لوحة Yujin. انقر فوق زر <strong>المفاتيح</strong>
|
|
40
|
+
وحمّل مفاتيح API. يظهر كل مفتاح مرة واحدة فقط عند إدخاله.</p>
|
|
41
|
+
|
|
42
|
+
<h2>الأوامر الصوتية</h2>
|
|
43
|
+
|
|
44
|
+
<p>يفهم Yujin الإسبانية والإنجليزية والبرتغالية والفرنسية
|
|
45
|
+
والألمانية والإيطالية واليابانية والصينية والهندية والعربية.</p>
|
|
46
|
+
|
|
47
|
+
<table border="1">
|
|
48
|
+
<tr><th>تقول</th><th>ماذا يحدث</th></tr>
|
|
49
|
+
<tr><td>"افتح <em>الملف</em>"</td><td>يفتح المستند.</td></tr>
|
|
50
|
+
<tr><td>"التالي" / "استمر"</td><td>ينتقل إلى الكتلة التالية.</td></tr>
|
|
51
|
+
<tr><td>"ابحث عن <em>كلمة</em>"</td><td>يبحث ويقرأ أول تطابق.</td></tr>
|
|
52
|
+
<tr><td>"علامة هنا باسم <em>اسم</em>"</td><td>يضع علامة مرجعية.</td></tr>
|
|
53
|
+
<tr><td>"انتقل إلى العلامة <em>اسم</em>"</td><td>يعود إلى العلامة.</td></tr>
|
|
54
|
+
<tr><td>"تلخيص"</td><td>يعيد قراءة آخر الكتل.</td></tr>
|
|
55
|
+
<tr><td>"افتح الدليل"</td><td>يفتح هذا الدليل بلغتك.</td></tr>
|
|
56
|
+
</table>
|
|
57
|
+
|
|
58
|
+
<h2>استيعاب المواصفات</h2>
|
|
59
|
+
|
|
60
|
+
<p>اسحب ملف مواصفات إلى اللوحة. تظهر شاشة بنفسجية بها كانجي.
|
|
61
|
+
أفلت الملف عليها.</p>
|
|
62
|
+
|
|
63
|
+
<ol>
|
|
64
|
+
<li>يقرأ Yujin المستند.</li>
|
|
65
|
+
<li>يستخرج Claude المتطلبات والكيانات ونقاط النهاية والمكونات.</li>
|
|
66
|
+
<li>يقدم Claude خطة للملفات المراد إنشاؤها.</li>
|
|
67
|
+
<li>يعرض Yujin الخطة. قل "موافق".</li>
|
|
68
|
+
<li>ينشئ الملفات في مجلد مشروعك.</li>
|
|
69
|
+
<li>إذا حدث خطأ، قل "تراجع".</li>
|
|
70
|
+
</ol>
|
|
71
|
+
|
|
72
|
+
<h2>حل المشكلات</h2>
|
|
73
|
+
|
|
74
|
+
<dl>
|
|
75
|
+
<dt>الميكروفون لا يعمل</dt>
|
|
76
|
+
<dd>يطلب المتصفح الإذن لأول مرة. انقر فوق القفل بجانب URL.</dd>
|
|
77
|
+
<dt>لا يفهمني</dt>
|
|
78
|
+
<dd>حمّل مفتاح OpenAI في خانة <code>openai</code>.</dd>
|
|
79
|
+
<dt>الصوت سيء</dt>
|
|
80
|
+
<dd>حمّل مفتاح ElevenLabs للحصول على صوت أكثر طبيعية.</dd>
|
|
81
|
+
<dt>أريد البدء من جديد</dt>
|
|
82
|
+
<dd>أغلق Yujin. احذف <code>~/.yujin-forge/</code>.
|
|
83
|
+
قم بتشغيل <code>yf chat</code> مرة أخرى.</dd>
|
|
84
|
+
</dl>
|
|
85
|
+
|
|
86
|
+
<h2>الدعم</h2>
|
|
87
|
+
|
|
88
|
+
<p>الدعم: <a href="mailto:pablo@rpaforce.com">pablo@rpaforce.com</a></p>
|
|
89
|
+
|
|
90
|
+
</body>
|
|
91
|
+
</html>
|