@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,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault store: persistent, atomic, slot-based credential storage.
|
|
3
|
+
*
|
|
4
|
+
* File layout under the configured config directory (typically
|
|
5
|
+
* ~/.yujin-forge/):
|
|
6
|
+
*
|
|
7
|
+
* vault.salt 16 bytes of CSPRNG, written once per install
|
|
8
|
+
* vault.json JSON metadata + per-slot ciphertexts (base64)
|
|
9
|
+
*
|
|
10
|
+
* The salt is in its own file so it survives any corruption of
|
|
11
|
+
* vault.json -- worst case, the user re-enters their keys but does
|
|
12
|
+
* not need to regenerate the salt.
|
|
13
|
+
*
|
|
14
|
+
* Atomic writes: every persist writes to a `.tmp` sibling, fsyncs,
|
|
15
|
+
* then renames. Process death between write and rename leaves the
|
|
16
|
+
* old file intact; the orphan tmp is cleaned up on next open.
|
|
17
|
+
*
|
|
18
|
+
* Slot names: lowercase alphanumeric + underscore + hyphen,
|
|
19
|
+
* starting with a letter. Hard-rejected loudly otherwise.
|
|
20
|
+
*
|
|
21
|
+
* The list() surface returns metadata only: name, the first 4
|
|
22
|
+
* characters of the plaintext (so the user can confirm
|
|
23
|
+
* "yes, this is my key"), the plaintext length, and timestamps.
|
|
24
|
+
* Never returns ciphertext or plaintext beyond the prefix.
|
|
25
|
+
*
|
|
26
|
+
* Loud failures (per ROADMAP sec 12.2): every error path throws
|
|
27
|
+
* with a message explaining what went wrong.
|
|
28
|
+
*
|
|
29
|
+
* ASCII-only.
|
|
30
|
+
*/
|
|
31
|
+
import { promises as fs } from 'node:fs';
|
|
32
|
+
import path from 'node:path';
|
|
33
|
+
import { computeMachineFingerprint, deriveVaultKey, encrypt, decrypt, generateSalt, } from './crypto.js';
|
|
34
|
+
import { inferKind, lookupCatalog, } from './catalog.js';
|
|
35
|
+
/* Bump on every schema change. v1 = baseline (initial release).
|
|
36
|
+
* v2 = adds typed slots: { kind, expiry, last_test_at, last_test_ok }.
|
|
37
|
+
* Read-side accepts v1 and migrates in-place to v2 on next
|
|
38
|
+
* write. Write-side always emits v2. */
|
|
39
|
+
export const VAULT_STORE_VERSION = 2;
|
|
40
|
+
const VAULT_FILENAME = 'vault.json';
|
|
41
|
+
const SALT_FILENAME = 'vault.salt';
|
|
42
|
+
const TMP_SUFFIX = '.tmp';
|
|
43
|
+
const SLOT_NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
44
|
+
export class Vault {
|
|
45
|
+
configDir;
|
|
46
|
+
salt;
|
|
47
|
+
key;
|
|
48
|
+
fingerprint;
|
|
49
|
+
slots;
|
|
50
|
+
constructor(configDir, salt, key, fingerprint, slots) {
|
|
51
|
+
this.configDir = configDir;
|
|
52
|
+
this.salt = salt;
|
|
53
|
+
this.key = key;
|
|
54
|
+
this.fingerprint = fingerprint;
|
|
55
|
+
this.slots = slots;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Open or create the vault at configDir.
|
|
59
|
+
* - Creates configDir if missing.
|
|
60
|
+
* - Reads or generates vault.salt.
|
|
61
|
+
* - Derives the master key.
|
|
62
|
+
* - Reads vault.json or starts with an empty slot set.
|
|
63
|
+
* - Cleans up any orphan vault.json.tmp from a previous crashed write.
|
|
64
|
+
*/
|
|
65
|
+
static async open(opts) {
|
|
66
|
+
if (!opts.configDir || !path.isAbsolute(opts.configDir)) {
|
|
67
|
+
throw new Error('Vault.open: configDir must be an absolute path (got ' + JSON.stringify(opts.configDir) + ')');
|
|
68
|
+
}
|
|
69
|
+
await fs.mkdir(opts.configDir, { recursive: true });
|
|
70
|
+
/* Clean up any orphan tmp file from a previous crashed write. */
|
|
71
|
+
const tmpPath = path.join(opts.configDir, VAULT_FILENAME + TMP_SUFFIX);
|
|
72
|
+
try {
|
|
73
|
+
await fs.unlink(tmpPath);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err.code !== 'ENOENT')
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
const fingerprint = opts.fingerprint ?? computeMachineFingerprint();
|
|
80
|
+
/* Load or create salt. */
|
|
81
|
+
const saltPath = path.join(opts.configDir, SALT_FILENAME);
|
|
82
|
+
let salt;
|
|
83
|
+
try {
|
|
84
|
+
salt = await fs.readFile(saltPath);
|
|
85
|
+
if (salt.length < 16) {
|
|
86
|
+
throw new Error('vault.salt is corrupted (only ' + salt.length + ' bytes -- expected at least 16). '
|
|
87
|
+
+ 'Delete ' + saltPath + ' to reset the vault. Existing slots will be unreadable.');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (err.code !== 'ENOENT')
|
|
92
|
+
throw err;
|
|
93
|
+
salt = generateSalt();
|
|
94
|
+
await atomicWrite(saltPath, salt);
|
|
95
|
+
}
|
|
96
|
+
const key = deriveVaultKey(fingerprint, salt);
|
|
97
|
+
/* Load slots or start empty. Accept v1 and v2 on read; the
|
|
98
|
+
* write path always emits the current VAULT_STORE_VERSION
|
|
99
|
+
* (v2 today). On v1 -> v2 read, slot kinds are inferred from
|
|
100
|
+
* the catalog and the file is rewritten on the next set/remove. */
|
|
101
|
+
const vaultPath = path.join(opts.configDir, VAULT_FILENAME);
|
|
102
|
+
let slots = {};
|
|
103
|
+
let needsMigrationRewrite = false;
|
|
104
|
+
try {
|
|
105
|
+
const raw = await fs.readFile(vaultPath, 'utf-8');
|
|
106
|
+
const parsedAny = JSON.parse(raw);
|
|
107
|
+
if (!parsedAny || typeof parsedAny !== 'object') {
|
|
108
|
+
throw new Error('vault.json is not a JSON object');
|
|
109
|
+
}
|
|
110
|
+
const ver = parsedAny.version;
|
|
111
|
+
if (ver !== 1 && ver !== VAULT_STORE_VERSION) {
|
|
112
|
+
throw new Error('vault.json version mismatch (got ' + String(ver) + ', expected '
|
|
113
|
+
+ VAULT_STORE_VERSION + ' or 1). The vault may have been written by a future Forge.');
|
|
114
|
+
}
|
|
115
|
+
if (!parsedAny.slots || typeof parsedAny.slots !== 'object') {
|
|
116
|
+
throw new Error('vault.json missing slots map');
|
|
117
|
+
}
|
|
118
|
+
const parsed = parsedAny;
|
|
119
|
+
slots = parsed.slots;
|
|
120
|
+
if (parsed.version === 1) {
|
|
121
|
+
/* Migrate v1 -> v2 by enriching each slot with its
|
|
122
|
+
* inferred kind. The actual file rewrite happens on
|
|
123
|
+
* the next write (lazy migration -- avoids touching
|
|
124
|
+
* the file just by opening read-only paths). */
|
|
125
|
+
needsMigrationRewrite = true;
|
|
126
|
+
for (const name of Object.keys(slots)) {
|
|
127
|
+
const slot = slots[name];
|
|
128
|
+
if (!slot.kind)
|
|
129
|
+
slot.kind = inferKind(name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
const code = err.code;
|
|
135
|
+
if (code !== 'ENOENT')
|
|
136
|
+
throw err;
|
|
137
|
+
/* First install -- empty slots. Persist immediately so the
|
|
138
|
+
file exists and subsequent opens take the happy path. */
|
|
139
|
+
}
|
|
140
|
+
const vault = new Vault(opts.configDir, salt, key, fingerprint, slots);
|
|
141
|
+
/* Persist on first creation so vault.json exists from the start.
|
|
142
|
+
* Also persist on v1 -> v2 migration so the file is upgraded
|
|
143
|
+
* even when no slot write happens. */
|
|
144
|
+
if (!(await fileExists(vaultPath))) {
|
|
145
|
+
await vault.persist();
|
|
146
|
+
}
|
|
147
|
+
else if (needsMigrationRewrite) {
|
|
148
|
+
await vault.persist();
|
|
149
|
+
}
|
|
150
|
+
return vault;
|
|
151
|
+
}
|
|
152
|
+
/** True when the slot has a stored value. */
|
|
153
|
+
has(slotName) {
|
|
154
|
+
return Object.prototype.hasOwnProperty.call(this.slots, slotName);
|
|
155
|
+
}
|
|
156
|
+
/** Slot metadata for every slot, sorted by name. Never returns
|
|
157
|
+
* ciphertext or plaintext beyond the 4-char prefix. */
|
|
158
|
+
list() {
|
|
159
|
+
return Object.entries(this.slots)
|
|
160
|
+
.map(([name, slot]) => ({
|
|
161
|
+
name,
|
|
162
|
+
prefix: slot.prefix,
|
|
163
|
+
length: slot.length,
|
|
164
|
+
created_at: slot.created_at,
|
|
165
|
+
updated_at: slot.updated_at,
|
|
166
|
+
kind: slot.kind ?? inferKind(name),
|
|
167
|
+
...(slot.expiry ? { expiry: slot.expiry } : {}),
|
|
168
|
+
...(slot.last_test_at ? { last_test_at: slot.last_test_at } : {}),
|
|
169
|
+
...(typeof slot.last_test_ok === 'boolean' ? { last_test_ok: slot.last_test_ok } : {}),
|
|
170
|
+
in_catalog: lookupCatalog(name) !== undefined,
|
|
171
|
+
}))
|
|
172
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
173
|
+
}
|
|
174
|
+
/** Encrypt + persist a plaintext into the named slot. Overwrites
|
|
175
|
+
* if the slot already existed; the original created_at is
|
|
176
|
+
* preserved while updated_at is bumped.
|
|
177
|
+
*
|
|
178
|
+
* Options (all optional):
|
|
179
|
+
* - kind: override the kind (default = inferKind(slotName)).
|
|
180
|
+
* - expiry: ISO 8601 expiry. When omitted, the existing
|
|
181
|
+
* expiry is preserved (or cleared if you pass null).
|
|
182
|
+
*/
|
|
183
|
+
async set(slotName, plaintext, opts = {}) {
|
|
184
|
+
if (!SLOT_NAME_RE.test(slotName)) {
|
|
185
|
+
throw new Error('vault slot name must match ' + SLOT_NAME_RE.source
|
|
186
|
+
+ ' (lowercase alphanumeric + underscore + hyphen, starting with a letter). Got: '
|
|
187
|
+
+ JSON.stringify(slotName));
|
|
188
|
+
}
|
|
189
|
+
if (typeof plaintext !== 'string' || plaintext.length === 0) {
|
|
190
|
+
throw new Error('vault.set requires a non-empty plaintext string for slot ' + slotName);
|
|
191
|
+
}
|
|
192
|
+
const blob = encrypt(plaintext, this.key);
|
|
193
|
+
const now = new Date().toISOString();
|
|
194
|
+
const previous = this.slots[slotName];
|
|
195
|
+
const kind = opts.kind ?? previous?.kind ?? inferKind(slotName);
|
|
196
|
+
let expiry;
|
|
197
|
+
if (opts.expiry === null)
|
|
198
|
+
expiry = undefined;
|
|
199
|
+
else if (opts.expiry !== undefined)
|
|
200
|
+
expiry = opts.expiry;
|
|
201
|
+
else
|
|
202
|
+
expiry = previous?.expiry;
|
|
203
|
+
this.slots[slotName] = {
|
|
204
|
+
ciphertext_b64: blob.toString('base64'),
|
|
205
|
+
prefix: plaintext.slice(0, 4),
|
|
206
|
+
length: plaintext.length,
|
|
207
|
+
created_at: previous?.created_at ?? now,
|
|
208
|
+
updated_at: now,
|
|
209
|
+
kind,
|
|
210
|
+
...(expiry ? { expiry } : {}),
|
|
211
|
+
/* Reset last_test_* on set; a new value invalidates the
|
|
212
|
+
old test outcome. */
|
|
213
|
+
};
|
|
214
|
+
await this.persist();
|
|
215
|
+
}
|
|
216
|
+
/** Decrypt and return the plaintext for a slot. Throws if the
|
|
217
|
+
* slot is missing or the ciphertext is corrupted. This is the
|
|
218
|
+
* ONLY path that surfaces plaintext, and it is server-side only
|
|
219
|
+
* -- never called from a route handler that returns to the
|
|
220
|
+
* browser. */
|
|
221
|
+
get(slotName) {
|
|
222
|
+
const slot = this.slots[slotName];
|
|
223
|
+
if (!slot) {
|
|
224
|
+
throw new Error('vault slot not found: ' + slotName);
|
|
225
|
+
}
|
|
226
|
+
const blob = Buffer.from(slot.ciphertext_b64, 'base64');
|
|
227
|
+
return decrypt(blob, this.key);
|
|
228
|
+
}
|
|
229
|
+
/** Remove a slot. Returns true if the slot existed, false
|
|
230
|
+
* otherwise. Persists on success. */
|
|
231
|
+
async remove(slotName) {
|
|
232
|
+
if (!Object.prototype.hasOwnProperty.call(this.slots, slotName)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
delete this.slots[slotName];
|
|
236
|
+
await this.persist();
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
/** Rotate a slot: replace its plaintext with a new one. Equivalent
|
|
240
|
+
* to set() but expresses intent ("the old value is gone") in
|
|
241
|
+
* CLI surfaces. Same created_at preservation behaviour as set. */
|
|
242
|
+
async rotate(slotName, newPlaintext) {
|
|
243
|
+
await this.set(slotName, newPlaintext);
|
|
244
|
+
}
|
|
245
|
+
/** Probe the stored credential against the external service.
|
|
246
|
+
* Looks up the catalog entry for `slotName`. When no test
|
|
247
|
+
* function is defined, returns ok=true with detail "no probe
|
|
248
|
+
* registered" so the UI can still report something. Persists
|
|
249
|
+
* last_test_at + last_test_ok on the slot. */
|
|
250
|
+
async test(slotName, opts = {}) {
|
|
251
|
+
const slot = this.slots[slotName];
|
|
252
|
+
if (!slot)
|
|
253
|
+
throw new Error('vault slot not found: ' + slotName);
|
|
254
|
+
const entry = lookupCatalog(slotName);
|
|
255
|
+
const timeoutMs = opts.timeoutMs ?? 5000;
|
|
256
|
+
let result;
|
|
257
|
+
if (!entry || !entry.test) {
|
|
258
|
+
result = { ok: true, status: 0, latency_ms: 0,
|
|
259
|
+
detail: entry ? 'no probe registered for this slot' : 'custom slot -- no probe' };
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const plaintext = this.get(slotName);
|
|
263
|
+
try {
|
|
264
|
+
result = await entry.test(plaintext, { timeoutMs });
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
result = {
|
|
268
|
+
ok: false, status: 0, latency_ms: 0,
|
|
269
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
slot.last_test_at = new Date().toISOString();
|
|
274
|
+
slot.last_test_ok = result.ok;
|
|
275
|
+
await this.persist();
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
/** Total number of slots currently stored. */
|
|
279
|
+
size() {
|
|
280
|
+
return Object.keys(this.slots).length;
|
|
281
|
+
}
|
|
282
|
+
/** Read-only view of the directory where this vault lives. */
|
|
283
|
+
configDirPath() {
|
|
284
|
+
return this.configDir;
|
|
285
|
+
}
|
|
286
|
+
async persist() {
|
|
287
|
+
const vaultPath = path.join(this.configDir, VAULT_FILENAME);
|
|
288
|
+
/* Ensure every slot has a kind before persisting; legacy
|
|
289
|
+
v1 slots loaded just now may lack it. */
|
|
290
|
+
for (const name of Object.keys(this.slots)) {
|
|
291
|
+
const s = this.slots[name];
|
|
292
|
+
if (!s.kind)
|
|
293
|
+
s.kind = inferKind(name);
|
|
294
|
+
}
|
|
295
|
+
const payload = {
|
|
296
|
+
version: VAULT_STORE_VERSION,
|
|
297
|
+
slots: this.slots,
|
|
298
|
+
};
|
|
299
|
+
const body = Buffer.from(JSON.stringify(payload, null, 2), 'utf-8');
|
|
300
|
+
await atomicWrite(vaultPath, body);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Write data to targetPath atomically. Layout: write to
|
|
305
|
+
* `<targetPath>.tmp`, fsync, rename. A crash between fsync and
|
|
306
|
+
* rename leaves the original intact and orphans the tmp; Vault.open
|
|
307
|
+
* cleans the orphan up on next launch.
|
|
308
|
+
*/
|
|
309
|
+
async function atomicWrite(targetPath, data) {
|
|
310
|
+
const tmpPath = targetPath + TMP_SUFFIX;
|
|
311
|
+
await fs.writeFile(tmpPath, data, { mode: 0o600 });
|
|
312
|
+
/* fsync to make sure the bytes hit the disk before we rename --
|
|
313
|
+
otherwise a power loss between write and rename could leave the
|
|
314
|
+
"renamed" file pointing to an empty inode on some filesystems. */
|
|
315
|
+
const fh = await fs.open(tmpPath, 'r+');
|
|
316
|
+
try {
|
|
317
|
+
await fh.sync();
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
await fh.close();
|
|
321
|
+
}
|
|
322
|
+
await fs.rename(tmpPath, targetPath);
|
|
323
|
+
}
|
|
324
|
+
async function fileExists(p) {
|
|
325
|
+
try {
|
|
326
|
+
await fs.stat(p);
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
if (err.code === 'ENOENT')
|
|
331
|
+
return false;
|
|
332
|
+
throw err;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/vault/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge CLI version. Single source of truth -- package.json
|
|
3
|
+
* reads from this at publish time (the publish script copies it
|
|
4
|
+
* into the npm metadata) so we don't end up with two versions
|
|
5
|
+
* drifting.
|
|
6
|
+
*/
|
|
7
|
+
export declare const VERSION = "0.2.0-alpha.1";
|
|
8
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,kBAAkB,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge CLI version. Single source of truth -- package.json
|
|
3
|
+
* reads from this at publish time (the publish script copies it
|
|
4
|
+
* into the npm metadata) so we don't end up with two versions
|
|
5
|
+
* drifting.
|
|
6
|
+
*/
|
|
7
|
+
export const VERSION = '0.2.0-alpha.1';
|
|
8
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS chunker (V1.24 of HITO 1).
|
|
3
|
+
*
|
|
4
|
+
* Splits a paragraph or section of spoken text into TTS-friendly
|
|
5
|
+
* chunks so the panel can pipeline fetches and start playing the
|
|
6
|
+
* first chunk while later chunks are still being synthesised by
|
|
7
|
+
* the provider. End-to-end voice latency on a 500-word section
|
|
8
|
+
* drops from ~3s (single round-trip) to ~600ms (first sentence
|
|
9
|
+
* arrives + plays while the rest streams in).
|
|
10
|
+
*
|
|
11
|
+
* Sentence boundary detection is regex-based + conservative:
|
|
12
|
+
*
|
|
13
|
+
* - '.', '!', '?' followed by whitespace (and not preceded by
|
|
14
|
+
* a single uppercase letter or common abbreviation) end a
|
|
15
|
+
* sentence.
|
|
16
|
+
* - ';' ends a clause-level break only when the buffered
|
|
17
|
+
* chunk is already longer than ~120 chars (so we don't
|
|
18
|
+
* over-fragment short sentences).
|
|
19
|
+
* - Double newline always ends a chunk (paragraph boundary).
|
|
20
|
+
*
|
|
21
|
+
* After sentence splitting, we still cap each chunk at
|
|
22
|
+
* `maxLen` chars (default 300). Anything over that gets
|
|
23
|
+
* subdivided on the nearest whitespace.
|
|
24
|
+
*
|
|
25
|
+
* Pure function. No node / no DOM. Easy to unit-test.
|
|
26
|
+
*
|
|
27
|
+
* ASCII-only.
|
|
28
|
+
*/
|
|
29
|
+
export interface ChunkOptions {
|
|
30
|
+
/** Maximum characters per chunk after sentence splitting.
|
|
31
|
+
* Default 300. Anything between 200 and 500 is sensible:
|
|
32
|
+
* too short and the provider per-call overhead dominates;
|
|
33
|
+
* too long and the first-audio latency we are trying to
|
|
34
|
+
* hide reappears. */
|
|
35
|
+
maxLen?: number;
|
|
36
|
+
/** When a clause-level break (;) appears, only honour it if
|
|
37
|
+
* the buffered chunk is already longer than this. Default
|
|
38
|
+
* 120. */
|
|
39
|
+
semicolonBreakAtLen?: number;
|
|
40
|
+
}
|
|
41
|
+
/** Split `text` into sentence-aware chunks. */
|
|
42
|
+
export declare function splitIntoTtsChunks(text: string, opts?: ChunkOptions): string[];
|
|
43
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/voice/chunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;;0BAIsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;eAEW;IACX,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAmCD,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,EAAE,CAqElF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS chunker (V1.24 of HITO 1).
|
|
3
|
+
*
|
|
4
|
+
* Splits a paragraph or section of spoken text into TTS-friendly
|
|
5
|
+
* chunks so the panel can pipeline fetches and start playing the
|
|
6
|
+
* first chunk while later chunks are still being synthesised by
|
|
7
|
+
* the provider. End-to-end voice latency on a 500-word section
|
|
8
|
+
* drops from ~3s (single round-trip) to ~600ms (first sentence
|
|
9
|
+
* arrives + plays while the rest streams in).
|
|
10
|
+
*
|
|
11
|
+
* Sentence boundary detection is regex-based + conservative:
|
|
12
|
+
*
|
|
13
|
+
* - '.', '!', '?' followed by whitespace (and not preceded by
|
|
14
|
+
* a single uppercase letter or common abbreviation) end a
|
|
15
|
+
* sentence.
|
|
16
|
+
* - ';' ends a clause-level break only when the buffered
|
|
17
|
+
* chunk is already longer than ~120 chars (so we don't
|
|
18
|
+
* over-fragment short sentences).
|
|
19
|
+
* - Double newline always ends a chunk (paragraph boundary).
|
|
20
|
+
*
|
|
21
|
+
* After sentence splitting, we still cap each chunk at
|
|
22
|
+
* `maxLen` chars (default 300). Anything over that gets
|
|
23
|
+
* subdivided on the nearest whitespace.
|
|
24
|
+
*
|
|
25
|
+
* Pure function. No node / no DOM. Easy to unit-test.
|
|
26
|
+
*
|
|
27
|
+
* ASCII-only.
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_MAX_LEN = 300;
|
|
30
|
+
/** Lowered from 120 to 80 after V1.24 testing -- 120 was too
|
|
31
|
+
* aggressive at keeping long compound sentences together;
|
|
32
|
+
* 80 splits on semicolons in real spec prose. */
|
|
33
|
+
const DEFAULT_SEMICOLON_BREAK = 80;
|
|
34
|
+
/** Multi-letter abbreviations whose trailing period must NOT
|
|
35
|
+
* split a sentence. Case-insensitive. */
|
|
36
|
+
const MULTI_LETTER_ABBREVIATIONS = new Set([
|
|
37
|
+
'sr', 'sra', 'srta', 'dr', 'dra', 'prof', 'mr', 'mrs', 'ms',
|
|
38
|
+
'st', 'ave', 'av', 'no', 'num', 'pag', 'pg', 'vol', 'ed',
|
|
39
|
+
'cap', 'fig', 'ej', 'etc', 'aprox', 'lic',
|
|
40
|
+
/* Common in spec / dev docs. */
|
|
41
|
+
'js', 'ts', 'py', 'sh', 'md', 'html', 'css', 'cli',
|
|
42
|
+
'api', 'rfc', 'iso', 'utc', 'utf', 'cpu', 'gpu', 'ram',
|
|
43
|
+
]);
|
|
44
|
+
/** True when the character(s) immediately before the boundary
|
|
45
|
+
* position belong to a known abbreviation. Single-letter
|
|
46
|
+
* abbreviations only count when the letter is uppercase
|
|
47
|
+
* (e.g. "T. S. Eliot" -- but NOT "a. b. c."). */
|
|
48
|
+
function isAbbreviationBefore(text, dotPos) {
|
|
49
|
+
let start = dotPos - 1;
|
|
50
|
+
while (start >= 0 && /[a-zA-Z]/.test(text.charAt(start)))
|
|
51
|
+
start -= 1;
|
|
52
|
+
start += 1;
|
|
53
|
+
if (start >= dotPos)
|
|
54
|
+
return false;
|
|
55
|
+
const word = text.slice(start, dotPos);
|
|
56
|
+
if (word.length === 1) {
|
|
57
|
+
return /[A-Z]/.test(word);
|
|
58
|
+
}
|
|
59
|
+
return MULTI_LETTER_ABBREVIATIONS.has(word.toLowerCase());
|
|
60
|
+
}
|
|
61
|
+
/** Split `text` into sentence-aware chunks. */
|
|
62
|
+
export function splitIntoTtsChunks(text, opts = {}) {
|
|
63
|
+
const maxLen = Math.max(40, opts.maxLen ?? DEFAULT_MAX_LEN);
|
|
64
|
+
const semiBreak = Math.max(40, opts.semicolonBreakAtLen ?? DEFAULT_SEMICOLON_BREAK);
|
|
65
|
+
const trimmed = text.replace(/\s+/g, ' ').trim();
|
|
66
|
+
if (!trimmed)
|
|
67
|
+
return [];
|
|
68
|
+
const chunks = [];
|
|
69
|
+
let buf = '';
|
|
70
|
+
let i = 0;
|
|
71
|
+
function flush() {
|
|
72
|
+
const t = buf.trim();
|
|
73
|
+
if (t)
|
|
74
|
+
chunks.push(t);
|
|
75
|
+
buf = '';
|
|
76
|
+
}
|
|
77
|
+
function flushAtMaxLen() {
|
|
78
|
+
/* Long chunk without a natural break -- subdivide on the
|
|
79
|
+
nearest whitespace before maxLen. */
|
|
80
|
+
while (buf.length > maxLen) {
|
|
81
|
+
let cut = buf.lastIndexOf(' ', maxLen);
|
|
82
|
+
if (cut < maxLen / 2)
|
|
83
|
+
cut = maxLen;
|
|
84
|
+
const piece = buf.slice(0, cut).trim();
|
|
85
|
+
if (piece)
|
|
86
|
+
chunks.push(piece);
|
|
87
|
+
buf = buf.slice(cut).trimStart();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
while (i < trimmed.length) {
|
|
91
|
+
const ch = trimmed.charAt(i);
|
|
92
|
+
buf += ch;
|
|
93
|
+
/* Hard paragraph break already collapsed by the initial
|
|
94
|
+
/\s+/ replace; we therefore only see single spaces +
|
|
95
|
+
sentence punctuation as natural cut points. */
|
|
96
|
+
const isSentencePunct = ch === '.' || ch === '!' || ch === '?';
|
|
97
|
+
const isSemicolon = ch === ';';
|
|
98
|
+
if (isSentencePunct) {
|
|
99
|
+
const next = trimmed.charAt(i + 1);
|
|
100
|
+
if (next === '' || next === ' ') {
|
|
101
|
+
/* Period of abbreviation? Then do not split. */
|
|
102
|
+
if (ch === '.' && isAbbreviationBefore(trimmed, i)) {
|
|
103
|
+
i += 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
/* Decimal in the middle of digits ("1.23")? No split. */
|
|
107
|
+
if (ch === '.' && /\d/.test(trimmed.charAt(i - 1) || '')
|
|
108
|
+
&& /\d/.test(trimmed.charAt(i + 1) || '')) {
|
|
109
|
+
i += 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
i += 1;
|
|
113
|
+
if (trimmed.charAt(i) === ' ')
|
|
114
|
+
i += 1;
|
|
115
|
+
flush();
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (isSemicolon && buf.length >= semiBreak) {
|
|
120
|
+
i += 1;
|
|
121
|
+
if (trimmed.charAt(i) === ' ')
|
|
122
|
+
i += 1;
|
|
123
|
+
flush();
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
i += 1;
|
|
127
|
+
if (buf.length > maxLen)
|
|
128
|
+
flushAtMaxLen();
|
|
129
|
+
}
|
|
130
|
+
flush();
|
|
131
|
+
return chunks;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/voice/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type WakeMatchResult } from './wake.js';
|
|
2
|
+
export declare const VOICE_CONFIG_VERSION = 1;
|
|
3
|
+
export interface VoiceConfig {
|
|
4
|
+
version: 1;
|
|
5
|
+
/** Extra aliases the user wants matched (e.g. "koe", "yoo-jin"). */
|
|
6
|
+
wake_aliases_extra: string[];
|
|
7
|
+
/** Levenshtein cap. 0 = exact-only. 2 = default. */
|
|
8
|
+
wake_max_distance: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function readVoiceConfig(): Promise<VoiceConfig>;
|
|
11
|
+
export declare function writeVoiceConfig(cfg: VoiceConfig): Promise<void>;
|
|
12
|
+
/** Match a wake-word against the user's configured alias set. */
|
|
13
|
+
export declare function matchConfiguredWakeWord(input: string): Promise<WakeMatchResult>;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/voice/config.ts"],"names":[],"mappings":"AAYA,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAE9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAWD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAe5D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,iEAAiE;AACjE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice configuration -- per-device, plain JSON (not a secret).
|
|
3
|
+
*
|
|
4
|
+
* Lives at ~/.yujin-forge/voice.json. Holds the user's extra
|
|
5
|
+
* wake-word aliases + max Levenshtein distance. Defaults are
|
|
6
|
+
* applied at read time; an absent file is fine.
|
|
7
|
+
*
|
|
8
|
+
* ASCII-only.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import os from 'node:os';
|
|
13
|
+
import { mergeAliases, matchWakeWord } from './wake.js';
|
|
14
|
+
export const VOICE_CONFIG_VERSION = 1;
|
|
15
|
+
function voiceConfigPath() {
|
|
16
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
17
|
+
return path.join(home, '.yujin-forge', 'voice.json');
|
|
18
|
+
}
|
|
19
|
+
function defaultConfig() {
|
|
20
|
+
return { version: 1, wake_aliases_extra: [], wake_max_distance: 2 };
|
|
21
|
+
}
|
|
22
|
+
export async function readVoiceConfig() {
|
|
23
|
+
const p = voiceConfigPath();
|
|
24
|
+
try {
|
|
25
|
+
const buf = await fs.readFile(p, 'utf8');
|
|
26
|
+
const obj = JSON.parse(buf);
|
|
27
|
+
return {
|
|
28
|
+
version: 1,
|
|
29
|
+
wake_aliases_extra: Array.isArray(obj.wake_aliases_extra) ? obj.wake_aliases_extra : [],
|
|
30
|
+
wake_max_distance: typeof obj.wake_max_distance === 'number' ? obj.wake_max_distance : 2,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const code = err.code;
|
|
35
|
+
if (code === 'ENOENT')
|
|
36
|
+
return defaultConfig();
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function writeVoiceConfig(cfg) {
|
|
41
|
+
const p = voiceConfigPath();
|
|
42
|
+
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
43
|
+
await fs.writeFile(p, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
44
|
+
}
|
|
45
|
+
/** Match a wake-word against the user's configured alias set. */
|
|
46
|
+
export async function matchConfiguredWakeWord(input) {
|
|
47
|
+
const cfg = await readVoiceConfig();
|
|
48
|
+
const aliases = mergeAliases(cfg.wake_aliases_extra);
|
|
49
|
+
return matchWakeWord(input, { aliases, maxDistance: cfg.wake_max_distance });
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/voice/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAwB,MAAM,WAAW,CAAC;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAUtC,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;YACvF,iBAAiB,EAAE,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;SACzF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,aAAa,EAAE,CAAC;QAC9C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAgB;IACrD,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAa;IACzD,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC/E,CAAC"}
|