@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
package/LICENSE
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
YUJIN FORGE -- COMMERCIAL SOFTWARE LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pablo Kuschnirof / Yujin (rpaforce.com).
|
|
4
|
+
|
|
5
|
+
PRELIMINARY LICENSE NOTICE -- DAY 0
|
|
6
|
+
====================================
|
|
7
|
+
|
|
8
|
+
This repository is the day-0 planning anchor for Yujin Forge.
|
|
9
|
+
Source code shipped here today (this LICENSE, README.md, the
|
|
10
|
+
SPEC.md draft) is published under the Apache License, Version
|
|
11
|
+
2.0, the same as the rest of the Yujin open-source surface.
|
|
12
|
+
|
|
13
|
+
When Yujin Forge ships its commercial features (test corpus
|
|
14
|
+
generator, mock generator, embedded Claude Code with NAC-aware
|
|
15
|
+
tools, migration EXECUTION, voice-driven scaffolder, `yf ship`
|
|
16
|
+
deploy gate), those features will ship under a separate
|
|
17
|
+
COMMERCIAL LICENSE issued by Yujin (rpaforce.com) on a per-seat
|
|
18
|
+
or per-organisation basis. The commercial license will be
|
|
19
|
+
incorporated by reference into this file at that time.
|
|
20
|
+
|
|
21
|
+
The migration AUDIT tool, the chat-panel-without-Forge-tools
|
|
22
|
+
(vanilla Claude Code), and the empty-project scaffolder will
|
|
23
|
+
remain Apache-2.0 even after commercial features ship.
|
|
24
|
+
|
|
25
|
+
THIS LICENSING REGIME IS PRELIMINARY. The final shape may
|
|
26
|
+
adjust based on community feedback during the v1.0 development
|
|
27
|
+
cycle (2026-Q2 through 2026-Q4). Any change will be announced
|
|
28
|
+
on the project's GitHub Discussions before taking effect.
|
|
29
|
+
|
|
30
|
+
UNTIL THE COMMERCIAL LICENSE LANDS, THIS REPOSITORY'S CONTENTS
|
|
31
|
+
ARE LICENSED UNDER APACHE-2.0:
|
|
32
|
+
|
|
33
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
34
|
+
you may not use this file except in compliance with the License.
|
|
35
|
+
You may obtain a copy of the License at
|
|
36
|
+
|
|
37
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
38
|
+
|
|
39
|
+
Unless required by applicable law or agreed to in writing, software
|
|
40
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
41
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
42
|
+
implied. See the License for the specific language governing
|
|
43
|
+
permissions and limitations under the License.
|
|
44
|
+
|
|
45
|
+
Full Apache-2.0 text: see http://www.apache.org/licenses/LICENSE-2.0
|
package/README.md
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
# Yujin Forge
|
|
2
|
+
|
|
3
|
+
**A voice-first NAC-3 development framework + build tool.** Forge
|
|
4
|
+
gives a developer (or an institution like ADIP teaching kids to
|
|
5
|
+
code) a single CLI + chat panel that covers the full app-creation
|
|
6
|
+
loop: read design specs by voice, generate code scaffolds from
|
|
7
|
+
those specs, decorate vanilla HTML into NAC-3, drive existing apps
|
|
8
|
+
via voice + chat.
|
|
9
|
+
|
|
10
|
+
> Status: **v0.2.0-alpha (HITO 0 + HITO 1 closed)**, 2026-05-23.
|
|
11
|
+
>
|
|
12
|
+
> **HITO 0 -- credentials vault.** AES-256-GCM at-rest encryption
|
|
13
|
+
> with machine fingerprint binding, atomic writes (0o600), one-shot
|
|
14
|
+
> reveal, vault modal in chat panel. Slots: anthropic / openai /
|
|
15
|
+
> google_voice / elevenlabs / github_token.
|
|
16
|
+
>
|
|
17
|
+
> **HITO 1 -- voice + reader + spec ingest.** Bidirectional voice
|
|
18
|
+
> (Whisper + Google STT, ElevenLabs + Google + Yujin Cloud TTS) with
|
|
19
|
+
> chunked pipelined playback (~600 ms first audio on long sections).
|
|
20
|
+
> Voiceprint enrolment + 5-layer trust model + liveness challenge on
|
|
21
|
+
> irreversible ops. Document reader for **txt / md / source / html /
|
|
22
|
+
> rtf / csv / epub / pdf / docx / xlsx** (10 formats) with voice-
|
|
23
|
+
> driven navigation (open / next / search / bookmark / recap). Spec
|
|
24
|
+
> drag-drop: drop a PDF/DOCX/etc into chat -> Forge parses ->
|
|
25
|
+
> Claude extracts requirements/entities/endpoints/components ->
|
|
26
|
+
> generates a file plan -> writes the scaffold after explicit
|
|
27
|
+
> approval -> rollback on demand.
|
|
28
|
+
>
|
|
29
|
+
> **Fase F -- 10-language i18n + manuals.** Panel UI + voice intent
|
|
30
|
+
> matcher + HTML user manuals all available in
|
|
31
|
+
> **es / en / pt / fr / ja / zh / hi / ar / de / it**. Globe button
|
|
32
|
+
> in the chat panel swaps the active language; the new
|
|
33
|
+
> `forge.manual.open` tool routes "abrime el manual" / "open the
|
|
34
|
+
> manual" / "マニュアルを開いて" / etc to the right HTML manual
|
|
35
|
+
> served through the reader pipeline. Catalog-lint refuses to
|
|
36
|
+
> publish if any locale is missing keys.
|
|
37
|
+
>
|
|
38
|
+
> Earlier work still shipping: G1 (AST migrator robustness) + G2
|
|
39
|
+
> (LLM retry loop) + G3 (multi-page HTML) + G4 (--dry-run for ai
|
|
40
|
+
> modes) + G5 (SPEC sync) + G6 (Figma scaffolder alpha) + the v0.3.0
|
|
41
|
+
> chat tool-use loop (`forge.read_manifest`,
|
|
42
|
+
> `forge.consult_nac_spec`, plus the V1.11..V1.13 github/git/
|
|
43
|
+
> lifecycle tools and the V1.28 + V1.32 reader tools).
|
|
44
|
+
>
|
|
45
|
+
> **988 vitest cases green** across 63 suites (Linux + macOS +
|
|
46
|
+
> Windows CI). AI decorator validated on calc fixture (15/15
|
|
47
|
+
> dispatch tasks OK) + Conduit-NAC3 (178/180 cross-lang at N=3).
|
|
48
|
+
> See [yujin.app/nac-spec/migration/](https://yujin.app/nac-spec/migration/)
|
|
49
|
+
> for the migration paper, `docs/HITO_1_ARCHITECTURE.md` for the
|
|
50
|
+
> voice+reader internals, and `docs/EVOLUTION_PLAN.md` for what is
|
|
51
|
+
> next.
|
|
52
|
+
|
|
53
|
+
## What it is
|
|
54
|
+
|
|
55
|
+
Four things in one:
|
|
56
|
+
|
|
57
|
+
1. **An AI-powered NAC-3 decorator.** `yf migrate <dir> --ai-silent`
|
|
58
|
+
calls Claude Sonnet 4.6 with the HTML + JS source, gets back a
|
|
59
|
+
fully-decorated HTML + JSON manifest, post-processes the output to
|
|
60
|
+
bake in the NAC3 runtime + contract bridge + inline `NAC.register`.
|
|
61
|
+
Takes ~25 s and ~$0.05 per app.
|
|
62
|
+
|
|
63
|
+
2. **A Pilot installer.** `yf pilot install <dir>` injects the
|
|
64
|
+
embedded chat + voice + multi-model bundle into any
|
|
65
|
+
Forge-decorated app. The same UI works against any NAC-3-compliant
|
|
66
|
+
page, regardless of how it was decorated.
|
|
67
|
+
|
|
68
|
+
3. **A React/AST migration scaffold (planned).** `yf migrate
|
|
69
|
+
<existing-react-repo>` audits the codebase, proposes the migration
|
|
70
|
+
path screen-by-screen, executes the diff. The audit + apply flow
|
|
71
|
+
is in place; the React-specific AST migrator is in flight.
|
|
72
|
+
|
|
73
|
+
4. **A voice-first developer assistant (HITO 1).** `yf chat`
|
|
74
|
+
launches a local panel with bidirectional voice, a 10-format
|
|
75
|
+
document reader, and drag-drop spec ingest. Drop a PDF / DOCX /
|
|
76
|
+
HTML spec into chat -> Forge extracts requirements via Claude ->
|
|
77
|
+
generates a file scaffold plan -> writes the project after you
|
|
78
|
+
approve. Reverse the scaffold with one click. Aimed at solo
|
|
79
|
+
developers + institutional teams (ADIP) who want the full
|
|
80
|
+
"read spec out loud, then write the code" cycle without leaving
|
|
81
|
+
the keyboard or the headset. See "Voice cockpit + spec ingest"
|
|
82
|
+
below.
|
|
83
|
+
|
|
84
|
+
## Quick start
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Install
|
|
88
|
+
npm install -g @yujin/forge
|
|
89
|
+
|
|
90
|
+
# Decorate a vanilla HTML app (one shot, no human input)
|
|
91
|
+
yf migrate ./my-app --ai-silent --ai-out ./my-app-decorated
|
|
92
|
+
|
|
93
|
+
# Same, but include Yujin Pilot (the embedded chat + voice cockpit)
|
|
94
|
+
yf migrate ./my-app --ai-silent --with-pilot --ai-out ./my-app-decorated
|
|
95
|
+
|
|
96
|
+
# Install Pilot into an already-decorated app
|
|
97
|
+
yf pilot install ./my-app-decorated
|
|
98
|
+
|
|
99
|
+
# Open it
|
|
100
|
+
xdg-open ./my-app-decorated/index.html
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The decorated output is **drop-in NAC3-ready**: no CDN dependencies
|
|
104
|
+
at runtime, the manifest is registered inline at boot, every action
|
|
105
|
+
button is wired through `NAC.bindAction`, the floating Pilot button
|
|
106
|
+
appears bottom-right. Click it, paste an API key (Anthropic / OpenAI
|
|
107
|
+
/ Google / DeepSeek / Groq), and drive the page by voice or text.
|
|
108
|
+
|
|
109
|
+
## Commands
|
|
110
|
+
|
|
111
|
+
| Command | What it does |
|
|
112
|
+
|---|---|
|
|
113
|
+
| `yf new <slug>` | Bootstrap a new Yujin Forge React app from `templates/react-app/`. |
|
|
114
|
+
| `yf migrate <repo>` | Default mode: audit a project for NAC migration without writing. |
|
|
115
|
+
| `yf migrate <repo> --apply` | Execute the proposed React/AST migration on `.tsx`/`.jsx`. |
|
|
116
|
+
| `yf migrate <repo> --html` | Silent HTML walker -- auto-apply on `.html` files (rule-based, no LLM). |
|
|
117
|
+
| `yf migrate <repo> --assisted` | HTML walker with CLI prompts for ambiguous elements (rule-based, no LLM). |
|
|
118
|
+
| `yf migrate <repo> --ai-silent` | **AI-powered.** Claude one-shot decoration of an HTML file (paid seat). |
|
|
119
|
+
| `yf migrate <repo> --ai-assisted` | AI-powered with ambiguity-resolution round. |
|
|
120
|
+
| `yf migrate <repo> --with-pilot` | Inject Yujin Pilot bundle into the decorated output. |
|
|
121
|
+
| `yf pilot install <dir>` | Inject Pilot into an already-decorated NAC-3 app. |
|
|
122
|
+
| `yf chat` | Launch the embedded Claude Code voice+text panel hooked to the current project. |
|
|
123
|
+
| `yf test` | Run the auto-generated test corpus + mocks + report coverage by NAC pipeline stage. |
|
|
124
|
+
| `yf ship` | Gate: tests green + NAC-3 validate clean + LLM review pass + license valid -> deploy hook. |
|
|
125
|
+
| `yf doctor` | Diagnose the local Forge install + license + dependencies. |
|
|
126
|
+
| `yf validate` | Validate a NAC manifest against the spec schema. |
|
|
127
|
+
| `yf license` | Manage license tokens. |
|
|
128
|
+
|
|
129
|
+
See [docs/USAGE.md](docs/USAGE.md) for every flag and worked examples.
|
|
130
|
+
|
|
131
|
+
## How decoration works
|
|
132
|
+
|
|
133
|
+
A vanilla HTML/JS app starts like:
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<button onclick="digit('7')">7</button>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
After `yf migrate --ai-silent`:
|
|
140
|
+
|
|
141
|
+
```html
|
|
142
|
+
<body data-nac-plugin="calc">
|
|
143
|
+
...
|
|
144
|
+
<button onclick="digit('7')"
|
|
145
|
+
data-nac-id="calc.action.digit_7"
|
|
146
|
+
data-nac-role="action"
|
|
147
|
+
data-nac-action="digit_7">7</button>
|
|
148
|
+
...
|
|
149
|
+
<script src="nac.browser.js"></script>
|
|
150
|
+
<script src="calc.js"></script>
|
|
151
|
+
<script src="nac-bridge.js"></script>
|
|
152
|
+
<script>
|
|
153
|
+
(function () {
|
|
154
|
+
var manifest = { "plugin_slug": "calc", ... };
|
|
155
|
+
window.NAC.register(manifest);
|
|
156
|
+
})();
|
|
157
|
+
</script>
|
|
158
|
+
</body>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Any LLM driver can now call:
|
|
162
|
+
|
|
163
|
+
```js
|
|
164
|
+
await NAC.click_by_verb('calc', 'digit_7');
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
and the host's existing `digit('7')` handler runs **plus** the
|
|
168
|
+
`nac:action:succeeded` contract event fires (because `nac-bridge.js`
|
|
169
|
+
re-wired the inline onclick via `NAC.bindAction`).
|
|
170
|
+
|
|
171
|
+
## How Pilot works
|
|
172
|
+
|
|
173
|
+
Pilot is a single-file IIFE bundle + companion stylesheet that lives
|
|
174
|
+
in `yujin-pilot/dist/`. `yf pilot install` (or `yf migrate
|
|
175
|
+
--with-pilot`) copies both into the target directory and inserts the
|
|
176
|
+
script tags before `</body>`.
|
|
177
|
+
|
|
178
|
+
At runtime, Pilot mounts a floating sumi-e branch button at
|
|
179
|
+
bottom-right. Click it: chat panel opens. Click again: switches to
|
|
180
|
+
the "pizarra" mode (chat + voice + action trace). Configure: paste
|
|
181
|
+
API keys for any subset of {Anthropic, OpenAI, Google, DeepSeek,
|
|
182
|
+
Groq}. Each provider supports all the models the
|
|
183
|
+
[NAC3 v2.3 benchmark](https://yujin.app/nac-spec/benchmark/) exercised.
|
|
184
|
+
|
|
185
|
+
Pilot reads `window.NAC.list_registered_plugins()` to get the active
|
|
186
|
+
manifest, sends it to the selected LLM with the user's utterance,
|
|
187
|
+
parses the JSON action chain, dispatches each via
|
|
188
|
+
`NAC.click_by_verb`, reads back any configured status probe, then
|
|
189
|
+
speaks the result via Web Speech / ElevenLabs / Google Cloud TTS.
|
|
190
|
+
|
|
191
|
+
Config persists in `localStorage` under `yujin_pilot.config`. Keys
|
|
192
|
+
never leave the browser. (Production deployments belong behind a
|
|
193
|
+
server proxy.)
|
|
194
|
+
|
|
195
|
+
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full
|
|
196
|
+
internal architecture.
|
|
197
|
+
|
|
198
|
+
## Voice cockpit + spec ingest (HITO 1)
|
|
199
|
+
|
|
200
|
+
`yf chat` opens a local panel with three views (globito / mini /
|
|
201
|
+
full). The full view has a chat stream on the left and a "pizarra"
|
|
202
|
+
trace on the right that shows every tool the system invoked to
|
|
203
|
+
answer.
|
|
204
|
+
|
|
205
|
+
What it covers end-to-end:
|
|
206
|
+
|
|
207
|
+
- **Vault** -- modal accessible via the Keys button. Slots for
|
|
208
|
+
`anthropic`, `openai`, `google_voice`, `elevenlabs`,
|
|
209
|
+
`github_token`. Values are encrypted at rest with the machine
|
|
210
|
+
fingerprint; shown once on entry, never again.
|
|
211
|
+
|
|
212
|
+
- **Voice in / voice out.** Press the mic, speak; the panel
|
|
213
|
+
records via `MediaRecorder`, ships the audio to the configured
|
|
214
|
+
STT provider, and either dispatches a recognised reader command
|
|
215
|
+
directly or feeds the transcript to the chat loop. Replies are
|
|
216
|
+
spoken back via the configured TTS provider with chunked
|
|
217
|
+
prefetch (first audio in ~600 ms even on long answers).
|
|
218
|
+
|
|
219
|
+
- **Voiceprint trust.** Enroll your voice once -- subsequent voice
|
|
220
|
+
commands are gated by a 5-layer trust model
|
|
221
|
+
(unknown / heard / recognised / trusted / authorised). Irreversible
|
|
222
|
+
actions (force push, branch delete, deploy) ALWAYS require a
|
|
223
|
+
liveness challenge regardless of trust level: a random Spanish/
|
|
224
|
+
English phrase plus a random number you have to read back.
|
|
225
|
+
|
|
226
|
+
- **Document reader.** Open any file in the project root and
|
|
227
|
+
navigate by voice: "abrime el readme", "siguiente", "buscar
|
|
228
|
+
pricing", "marcame aqui como inicio", "volver a marca inicio",
|
|
229
|
+
"recap". Supports **10 formats**: txt, md, source code (.ts / .py
|
|
230
|
+
/ .rs / 80+ extensions), HTML, RTF, CSV/TSV, EPUB, **PDF**
|
|
231
|
+
(via pdfjs-dist), **DOCX** (via mammoth), **XLSX** (via sheetjs).
|
|
232
|
+
All format detection happens automatically.
|
|
233
|
+
|
|
234
|
+
- **Spec drag-drop.** Drag a spec file onto the chat panel; an
|
|
235
|
+
overlay appears + the file uploads. Forge parses it through the
|
|
236
|
+
same reader pipeline, then a Claude call extracts structured
|
|
237
|
+
requirements, entities, endpoints, and UI components. A second
|
|
238
|
+
Claude call turns the extraction into a concrete file scaffold
|
|
239
|
+
plan (which files to create + where + what kind + which
|
|
240
|
+
requirement each serves + open questions for clarification).
|
|
241
|
+
Nothing is written until you POST `{approve: true}`. On approve,
|
|
242
|
+
the scaffolder writes the planned files with hand-rolled
|
|
243
|
+
templates per kind (model / api / component / test / doc) and
|
|
244
|
+
records a rollback log -- one click undoes the whole scaffold.
|
|
245
|
+
|
|
246
|
+
- **Reader recap modes.** Default `literal` mode joins recent
|
|
247
|
+
spoken blocks into a TTS-friendly narrative for "que dijiste".
|
|
248
|
+
Optional `summary` mode calls Claude for a 1-2 sentence
|
|
249
|
+
compression; gated by env var `YF_ENABLE_CLAUDE_RECAP=1` so it
|
|
250
|
+
cannot fire by accident and charge tokens. Cost model in
|
|
251
|
+
`docs/RECAP_CLAUDE_COSTS.md`.
|
|
252
|
+
|
|
253
|
+
### ADIP voice-first demo loop
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
User: (mic) "abrime el plan.md"
|
|
257
|
+
-> reader.open -> TTS "El Plan"
|
|
258
|
+
User: (mic) "siguiente"
|
|
259
|
+
-> reader.next -> TTS "Primer paso"
|
|
260
|
+
User: (mic) "buscar pricing"
|
|
261
|
+
-> reader.search -> TTS top snippet
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Drag a spec PDF onto the panel:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
panel -> spec ingested. Title: ADIP Spec. 4 sections.
|
|
268
|
+
First lines:
|
|
269
|
+
- The system MUST register patients.
|
|
270
|
+
- ...
|
|
271
|
+
panel (via Claude)-> extraction: 1 requirement, 1 entity (Paciente),
|
|
272
|
+
1 endpoint (POST /patients), 1 component
|
|
273
|
+
(PatientCard).
|
|
274
|
+
panel (via Claude)-> plan: src/models/Paciente.ts +
|
|
275
|
+
src/api/patients.ts +
|
|
276
|
+
src/components/PatientCard.tsx + README.md.
|
|
277
|
+
Open question: authentication unspecified.
|
|
278
|
+
user clicks -> approve.
|
|
279
|
+
scaffolder -> 4 files written, rollback log captured.
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
If anything looks off: one `POST /api/forge/ingest/rollback` and
|
|
283
|
+
the project is back to its prior state.
|
|
284
|
+
|
|
285
|
+
### Architecture pointer
|
|
286
|
+
|
|
287
|
+
The full step-by-step voice loop, reader pipeline, voiceprint
|
|
288
|
+
state machine, and "how to add a parser / intent / trust class"
|
|
289
|
+
recipes live in [docs/HITO_1_ARCHITECTURE.md](docs/HITO_1_ARCHITECTURE.md).
|
|
290
|
+
|
|
291
|
+
## Why a separate product
|
|
292
|
+
|
|
293
|
+
NAC (the spec) is Apache-2.0 free forever. The reference runtime
|
|
294
|
+
`nac-spec` on npm is Apache-2.0 free forever. **Yujin Forge is the
|
|
295
|
+
commercial build layer:**
|
|
296
|
+
|
|
297
|
+
- The AI decorator (`--ai-silent` / `--ai-assisted`) burns Anthropic
|
|
298
|
+
tokens on your behalf; the seat license is what funds that.
|
|
299
|
+
- The chat panel, React scaffolder, test corpus generator, and mock
|
|
300
|
+
generator are all license-gated.
|
|
301
|
+
- The static-rule HTML walker (`--html`, `--assisted`) is open and
|
|
302
|
+
works offline.
|
|
303
|
+
|
|
304
|
+
The Apache spec attracts the ecosystem; Forge monetises the delivery
|
|
305
|
+
experience for teams that want to skip the per-app plumbing.
|
|
306
|
+
|
|
307
|
+
## What Forge gives an app (under the hood)
|
|
308
|
+
|
|
309
|
+
Every decorated output ships:
|
|
310
|
+
|
|
311
|
+
1. `index.html` -- decorated, drop-in NAC3-ready
|
|
312
|
+
2. `manifest.json` -- the NAC3 manifest, version-pinnable
|
|
313
|
+
3. `nac.browser.js` -- the NAC3 runtime (copied locally, no CDN dep)
|
|
314
|
+
4. `nac-bridge.js` -- ~50 lines, wires `NAC.bindAction` for every
|
|
315
|
+
action element so the host's existing handlers stay intact AND the
|
|
316
|
+
contract events fire
|
|
317
|
+
5. **With `--with-pilot`:** `pilot.bundle.js` + `pilot.css` -- the
|
|
318
|
+
embedded chat + voice cockpit
|
|
319
|
+
|
|
320
|
+
After running Forge, your app is ready to be driven by any LLM agent
|
|
321
|
+
that understands NAC-3. Pilot is one such driver; the
|
|
322
|
+
[600-run benchmark](https://yujin.app/nac-spec/benchmark/) was driven
|
|
323
|
+
by a custom harness; the React SDK in
|
|
324
|
+
[`@yujin/nac-react`](https://www.npmjs.com/package/nac-spec) is
|
|
325
|
+
another.
|
|
326
|
+
|
|
327
|
+
## Where this lives in the Yujin ecosystem
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
NAC (Apache-2.0) -- pkuschnirof/rpaforce-crm + yujin.app/nac-spec
|
|
331
|
+
spec + reference runtime + nac-spec NPM package
|
|
332
|
+
|
|
|
333
|
+
| depends on
|
|
334
|
+
v
|
|
335
|
+
Yujin Forge (closed core) -- yujinapp/yujin-forge (build NAC apps)
|
|
336
|
+
AI decorator, React scaffolder, license gating, this repo
|
|
337
|
+
| sibling product
|
|
338
|
+
v
|
|
339
|
+
Yujin Pilot (closed core) -- yujinapp/yujin-pilot (drive NAC apps)
|
|
340
|
+
Embedded chat + voice + multi-model cockpit
|
|
341
|
+
|
|
|
342
|
+
| downstream adopter
|
|
343
|
+
v
|
|
344
|
+
Customer apps
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Documentation
|
|
348
|
+
|
|
349
|
+
- [README.md](README.md) -- this file
|
|
350
|
+
- [PROJECT.md](PROJECT.md) -- topology + governance + slice/HITO process (mandatory read before touching code)
|
|
351
|
+
- [docs/SQ.md](docs/SQ.md) -- quality standards + deliverables + pre-development checklist (Spanish, mandatory)
|
|
352
|
+
- [docs/QUICKSTART_ADIP.md](docs/QUICKSTART_ADIP.md) -- step-by-step setup guide for the ADIP institutional rollout (Spanish)
|
|
353
|
+
- [docs/USAGE.md](docs/USAGE.md) -- every command + flag + worked examples
|
|
354
|
+
- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) -- internals of the AI decorator + wiring + Pilot integration
|
|
355
|
+
- [docs/HITO_1_ARCHITECTURE.md](docs/HITO_1_ARCHITECTURE.md) -- HITO 1 voice + reader + spec ingest reference
|
|
356
|
+
- [docs/LANGUAGE_POLICY.md](docs/LANGUAGE_POLICY.md) -- the 10-canonical-languages rule + catalog-lint mechanism
|
|
357
|
+
- [docs/manuals/manual.es.html](docs/manuals/manual.es.html) -- end-user manual (10 languages: es/en/pt/fr/ja/zh/hi/ar/de/it)
|
|
358
|
+
- [docs/RECAP_CLAUDE_COSTS.md](docs/RECAP_CLAUDE_COSTS.md) -- cost model + lock mechanism for the Claude recap mode
|
|
359
|
+
- [docs/ROADMAP_VOICE_FORGE_2026_05_23.md](docs/ROADMAP_VOICE_FORGE_2026_05_23.md) -- HITO 0/1/2/3 roadmap with decisions taken
|
|
360
|
+
- [docs/TECHNICAL_MANUAL.md](docs/TECHNICAL_MANUAL.md) -- living manual updated at each slice close
|
|
361
|
+
- [docs/SPEC.md](docs/SPEC.md) -- the contract Forge makes with adopting teams
|
|
362
|
+
- [docs/COMMERCIAL_PLAN.md](docs/COMMERCIAL_PLAN.md) -- pricing + licensing model
|
|
363
|
+
- [docs/SESSION_HANDOFF_2026_05_23_AT_DOCTOR.md](docs/SESSION_HANDOFF_2026_05_23_AT_DOCTOR.md) -- state at last session boundary
|
|
364
|
+
|
|
365
|
+
## See also
|
|
366
|
+
|
|
367
|
+
- [NAC spec](https://yujin.app/nac-spec/SPEC.html)
|
|
368
|
+
- [NAC3 v2.3 benchmark](https://yujin.app/nac-spec/benchmark/) -- 600 runs across 5 models + 3 protocols
|
|
369
|
+
- [Migration paper](https://yujin.app/nac-spec/migration/) -- Forge silent vs assisted vs Sumi manual on a calculator
|
|
370
|
+
- [Yujin Pilot](https://github.com/yujinapp/yujin-pilot) -- the sibling driver product
|
|
371
|
+
- [Yujin CRM](https://github.com/pkuschnirof/rpaforce-crm) -- the first adopter of the full stack
|
package/dist/bin/yf.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yf.d.ts","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":";AAUA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,wBAAgB,YAAY,IAAI,OAAO,CAmCtC"}
|
package/dist/bin/yf.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Yujin Forge CLI -- entry point.
|
|
4
|
+
*
|
|
5
|
+
* Each command lives in src/commands/<verb>.ts and exports a
|
|
6
|
+
* `register(program)` function that attaches itself to the
|
|
7
|
+
* Commander program. The entry point is intentionally thin so
|
|
8
|
+
* tests can load individual commands without bootstrapping the
|
|
9
|
+
* whole CLI.
|
|
10
|
+
*/
|
|
11
|
+
import 'dotenv/config';
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
import { registerNewCommand } from '../commands/new.js';
|
|
14
|
+
import { registerMigrateCommand } from '../commands/migrate.js';
|
|
15
|
+
import { registerChatCommand } from '../commands/chat.js';
|
|
16
|
+
import { registerTestCommand } from '../commands/test.js';
|
|
17
|
+
import { registerShipCommand } from '../commands/ship.js';
|
|
18
|
+
import { registerLicenseCommand } from '../commands/license.js';
|
|
19
|
+
import { registerDoctorCommand } from '../commands/doctor.js';
|
|
20
|
+
import { registerValidateCommand } from '../commands/validate.js';
|
|
21
|
+
import { registerPilotCommand } from '../commands/pilot.js';
|
|
22
|
+
import { registerGenTestsCommand } from '../commands/gen-tests.js';
|
|
23
|
+
import { registerGenFlowTestsCommand } from '../commands/gen-flow-tests.js';
|
|
24
|
+
import { registerFigmaCommand } from '../commands/figma.js';
|
|
25
|
+
import { registerVaultCommand } from '../commands/vault.js';
|
|
26
|
+
import { registerScenariosCommand } from '../commands/scenarios.js';
|
|
27
|
+
import { registerReviewScreensCommand } from '../commands/review-screens.js';
|
|
28
|
+
import { registerPublishCommand } from '../commands/publish.js';
|
|
29
|
+
import { registerProjectsCommand } from '../commands/projects.js';
|
|
30
|
+
import { registerTunnelCommand } from '../commands/tunnel.js';
|
|
31
|
+
import { registerDeployCommand } from '../commands/deploy.js';
|
|
32
|
+
import { registerAppCommand } from '../commands/app.js';
|
|
33
|
+
import { registerVoiceCommand } from '../commands/voice.js';
|
|
34
|
+
import { registerRepoCommand } from '../commands/repo.js';
|
|
35
|
+
import { registerMobileCommand } from '../commands/mobile.js';
|
|
36
|
+
import { registerLogCommand } from '../commands/log.js';
|
|
37
|
+
import { VERSION } from '../version.js';
|
|
38
|
+
export function buildProgram() {
|
|
39
|
+
const program = new Command();
|
|
40
|
+
program
|
|
41
|
+
.name('yf')
|
|
42
|
+
.description('Yujin Forge -- commercial NAC-3 React development framework.')
|
|
43
|
+
.version(VERSION, '-v, --version', 'print the Forge CLI version')
|
|
44
|
+
.helpOption('-h, --help', 'show help')
|
|
45
|
+
.showHelpAfterError('(run "yf --help" for available commands)');
|
|
46
|
+
registerNewCommand(program);
|
|
47
|
+
registerMigrateCommand(program);
|
|
48
|
+
registerChatCommand(program);
|
|
49
|
+
registerTestCommand(program);
|
|
50
|
+
registerShipCommand(program);
|
|
51
|
+
registerLicenseCommand(program);
|
|
52
|
+
registerDoctorCommand(program);
|
|
53
|
+
registerValidateCommand(program);
|
|
54
|
+
registerPilotCommand(program);
|
|
55
|
+
registerGenTestsCommand(program);
|
|
56
|
+
registerGenFlowTestsCommand(program);
|
|
57
|
+
registerFigmaCommand(program);
|
|
58
|
+
registerVaultCommand(program);
|
|
59
|
+
registerScenariosCommand(program);
|
|
60
|
+
registerReviewScreensCommand(program);
|
|
61
|
+
registerPublishCommand(program);
|
|
62
|
+
registerProjectsCommand(program);
|
|
63
|
+
registerTunnelCommand(program);
|
|
64
|
+
registerDeployCommand(program);
|
|
65
|
+
registerAppCommand(program);
|
|
66
|
+
registerVoiceCommand(program);
|
|
67
|
+
registerRepoCommand(program);
|
|
68
|
+
registerMobileCommand(program);
|
|
69
|
+
registerLogCommand(program);
|
|
70
|
+
return program;
|
|
71
|
+
}
|
|
72
|
+
async function main() {
|
|
73
|
+
const program = buildProgram();
|
|
74
|
+
await program.parseAsync(process.argv);
|
|
75
|
+
}
|
|
76
|
+
// ESM module-detection: only invoke main when executed directly,
|
|
77
|
+
// not when imported by tests.
|
|
78
|
+
const isDirect = import.meta.url === `file://${process.argv[1]}`
|
|
79
|
+
|| (process.argv[1] !== undefined && import.meta.url.endsWith('/' + process.argv[1].split(/[/\\]/).pop()));
|
|
80
|
+
if (isDirect) {
|
|
81
|
+
main().catch((err) => {
|
|
82
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=yf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yf.js","sourceRoot":"","sources":["../../src/bin/yf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { ToolSpec } from './tools.js';
|
|
2
|
+
export declare class ConfigurationError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class ClaudeApiError extends Error {
|
|
6
|
+
status: number;
|
|
7
|
+
constructor(message: string, status: number);
|
|
8
|
+
}
|
|
9
|
+
export interface ChatMessage {
|
|
10
|
+
role: 'user' | 'assistant';
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
/** One round of tool dispatch recorded for the chat panel's action
|
|
14
|
+
* trace. The caller serialises these into the response so the UI
|
|
15
|
+
* can render the steps Claude took. */
|
|
16
|
+
export interface ToolRound {
|
|
17
|
+
tool: string;
|
|
18
|
+
/** The args block the model emitted. */
|
|
19
|
+
input: Record<string, unknown>;
|
|
20
|
+
/** What runTool returned (passed back to Claude as tool_result). */
|
|
21
|
+
result: unknown;
|
|
22
|
+
/** True when the tool reported a graceful failure. */
|
|
23
|
+
is_error?: boolean;
|
|
24
|
+
/** Anthropic-side id, kept so the audit can match assistant
|
|
25
|
+
blocks against the corresponding tool_result. */
|
|
26
|
+
tool_use_id: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ClaudeChatRequest {
|
|
29
|
+
/** Conversation history, oldest first. Tool turns are not part
|
|
30
|
+
of this -- the loop manages them internally. */
|
|
31
|
+
messages: ChatMessage[];
|
|
32
|
+
/** System prompt. */
|
|
33
|
+
system?: string;
|
|
34
|
+
/** Hard cap on output tokens per round. */
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
/** Override the default model. */
|
|
37
|
+
model?: string;
|
|
38
|
+
/** Tool catalog the model can call. When present, the response
|
|
39
|
+
may contain tool_use blocks that this client dispatches
|
|
40
|
+
automatically. */
|
|
41
|
+
tools?: ToolSpec[];
|
|
42
|
+
/** Callback the client invokes when the model emits a tool_use.
|
|
43
|
+
Required when `tools` is set. */
|
|
44
|
+
runTool?: (name: string, input: Record<string, unknown>) => Promise<{
|
|
45
|
+
result: unknown;
|
|
46
|
+
is_error?: boolean;
|
|
47
|
+
}>;
|
|
48
|
+
/** Maximum tool-use loop iterations. Default 5. Stops with a
|
|
49
|
+
`tool_loop_exhausted` ClaudeApiError when reached. */
|
|
50
|
+
maxToolRounds?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ClaudeChatResponse {
|
|
53
|
+
text: string;
|
|
54
|
+
tokensIn: number;
|
|
55
|
+
tokensOut: number;
|
|
56
|
+
model: string;
|
|
57
|
+
/** Per-round audit of tool dispatches. Empty when no tools were
|
|
58
|
+
provided or the model did not call any. */
|
|
59
|
+
toolRounds: ToolRound[];
|
|
60
|
+
}
|
|
61
|
+
export interface ClaudeClientOptions {
|
|
62
|
+
apiKey?: string;
|
|
63
|
+
/** Default model. */
|
|
64
|
+
defaultModel?: string;
|
|
65
|
+
/** Test injection for fetch (Node 18+ has global fetch). */
|
|
66
|
+
fetchImpl?: typeof fetch;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the Anthropic API key.
|
|
70
|
+
*
|
|
71
|
+
* Priority order (first match wins):
|
|
72
|
+
* 1. Explicitly injected key (test seam).
|
|
73
|
+
* 2. Vault slot `anthropic` -- the canonical path going
|
|
74
|
+
* forward.
|
|
75
|
+
* 3. process.env.YUJIN_ANTHROPIC_API_KEY -- legacy env var.
|
|
76
|
+
* 4. process.env.ANTHROPIC_API_KEY -- standard Anthropic env.
|
|
77
|
+
* 5. ~/.yujin-forge/api-key.txt -- legacy file path.
|
|
78
|
+
*
|
|
79
|
+
* Throws ConfigurationError when nothing is found. The error
|
|
80
|
+
* message lists all the options so the user has a single place
|
|
81
|
+
* to read where to put the key.
|
|
82
|
+
*
|
|
83
|
+
* The vault check is short-circuiting: if the slot exists, the
|
|
84
|
+
* env vars and the file are ignored. This makes vault-configured
|
|
85
|
+
* setups deterministic and unaffected by stray env vars.
|
|
86
|
+
*
|
|
87
|
+
* The other three paths stay as back-compat for existing users
|
|
88
|
+
* who already configured Forge via env or file before V0.4
|
|
89
|
+
* landed. They are NOT deprecated -- they keep working
|
|
90
|
+
* indefinitely. The vault is just the recommended path.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveApiKey(injected?: string): Promise<string>;
|
|
93
|
+
export declare class ClaudeClient {
|
|
94
|
+
private apiKey;
|
|
95
|
+
private fetchImpl;
|
|
96
|
+
private defaultModel;
|
|
97
|
+
constructor(opts?: ClaudeClientOptions);
|
|
98
|
+
chat(req: ClaudeChatRequest): Promise<ClaudeChatResponse>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/chat/claude.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,MAAM,EAAE,MAAM,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;wCAEwC;AACxC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,oEAAoE;IACpE,MAAM,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;wDACoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;yBAEqB;IACrB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB;wCACoC;IACpC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH;6DACyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd;kDAC8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCtE;AAmBD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,GAAE,mBAAwB;IAMpC,IAAI,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAuHhE"}
|