@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,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal mDNS / DNS-over-UDP packet primitives (RFC 6762).
|
|
3
|
+
*
|
|
4
|
+
* Forge announces a `_yujin-forge._tcp.local.` service on the
|
|
5
|
+
* LAN so mobile + sibling laptops can discover the local brain
|
|
6
|
+
* with zero configuration.
|
|
7
|
+
*
|
|
8
|
+
* Scope kept small: we encode/decode the record types we
|
|
9
|
+
* actually use -- PTR (service browse), SRV (host:port), TXT
|
|
10
|
+
* (free-form metadata), A (IPv4). Name compression is NOT
|
|
11
|
+
* applied on encode (waste bytes, simpler code), but IS
|
|
12
|
+
* accepted on decode (the spec requires it).
|
|
13
|
+
*
|
|
14
|
+
* ASCII-only.
|
|
15
|
+
*/
|
|
16
|
+
/* DNS record types. */
|
|
17
|
+
export const TYPE_A = 1;
|
|
18
|
+
export const TYPE_PTR = 12;
|
|
19
|
+
export const TYPE_TXT = 16;
|
|
20
|
+
export const TYPE_SRV = 33;
|
|
21
|
+
export const TYPE_ANY = 255;
|
|
22
|
+
export const CLASS_IN = 1;
|
|
23
|
+
/* RFC 6762 - cache flush bit set on responses we own. */
|
|
24
|
+
export const CLASS_IN_FLUSH = 0x8001;
|
|
25
|
+
export function isPtr(d) {
|
|
26
|
+
return typeof d.ptr === 'string';
|
|
27
|
+
}
|
|
28
|
+
export function isSrv(d) {
|
|
29
|
+
return typeof d.port === 'number';
|
|
30
|
+
}
|
|
31
|
+
export function isTxt(d) {
|
|
32
|
+
return Array.isArray(d.txt);
|
|
33
|
+
}
|
|
34
|
+
export function isA(d) {
|
|
35
|
+
return typeof d.ip === 'string';
|
|
36
|
+
}
|
|
37
|
+
/* ----- encoding ----- */
|
|
38
|
+
function encodeName(name) {
|
|
39
|
+
const labels = name.replace(/\.$/, '').split('.');
|
|
40
|
+
const chunks = [];
|
|
41
|
+
for (const label of labels) {
|
|
42
|
+
if (label.length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
if (label.length > 63)
|
|
45
|
+
throw new Error('mDNS: label exceeds 63 chars: ' + label);
|
|
46
|
+
const buf = Buffer.alloc(1 + label.length);
|
|
47
|
+
buf.writeUInt8(label.length, 0);
|
|
48
|
+
buf.write(label, 1, 'utf8');
|
|
49
|
+
chunks.push(buf);
|
|
50
|
+
}
|
|
51
|
+
chunks.push(Buffer.from([0]));
|
|
52
|
+
return Buffer.concat(chunks);
|
|
53
|
+
}
|
|
54
|
+
export function encodeQuestion(q) {
|
|
55
|
+
const n = encodeName(q.name);
|
|
56
|
+
const tail = Buffer.alloc(4);
|
|
57
|
+
tail.writeUInt16BE(q.type, 0);
|
|
58
|
+
tail.writeUInt16BE(q.klass, 2);
|
|
59
|
+
return Buffer.concat([n, tail]);
|
|
60
|
+
}
|
|
61
|
+
function encodeRdata(answer) {
|
|
62
|
+
if (answer.type === TYPE_PTR && isPtr(answer.data)) {
|
|
63
|
+
return encodeName(answer.data.ptr);
|
|
64
|
+
}
|
|
65
|
+
if (answer.type === TYPE_TXT && isTxt(answer.data)) {
|
|
66
|
+
const chunks = [];
|
|
67
|
+
for (const item of answer.data.txt) {
|
|
68
|
+
if (item.length > 255)
|
|
69
|
+
throw new Error('mDNS: TXT segment exceeds 255 chars');
|
|
70
|
+
const buf = Buffer.alloc(1 + item.length);
|
|
71
|
+
buf.writeUInt8(item.length, 0);
|
|
72
|
+
buf.write(item, 1, 'utf8');
|
|
73
|
+
chunks.push(buf);
|
|
74
|
+
}
|
|
75
|
+
return Buffer.concat(chunks);
|
|
76
|
+
}
|
|
77
|
+
if (answer.type === TYPE_SRV && isSrv(answer.data)) {
|
|
78
|
+
const head = Buffer.alloc(6);
|
|
79
|
+
head.writeUInt16BE(answer.data.priority, 0);
|
|
80
|
+
head.writeUInt16BE(answer.data.weight, 2);
|
|
81
|
+
head.writeUInt16BE(answer.data.port, 4);
|
|
82
|
+
return Buffer.concat([head, encodeName(answer.data.target)]);
|
|
83
|
+
}
|
|
84
|
+
if (answer.type === TYPE_A && isA(answer.data)) {
|
|
85
|
+
const parts = answer.data.ip.split('.').map((s) => Number.parseInt(s, 10));
|
|
86
|
+
if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n) || n < 0 || n > 255)) {
|
|
87
|
+
throw new Error('mDNS: invalid IPv4: ' + answer.data.ip);
|
|
88
|
+
}
|
|
89
|
+
return Buffer.from(parts);
|
|
90
|
+
}
|
|
91
|
+
if (answer.data instanceof Buffer)
|
|
92
|
+
return answer.data;
|
|
93
|
+
throw new Error('mDNS: cannot encode record type ' + answer.type);
|
|
94
|
+
}
|
|
95
|
+
export function encodeAnswer(a) {
|
|
96
|
+
const n = encodeName(a.name);
|
|
97
|
+
const rdata = encodeRdata(a);
|
|
98
|
+
const head = Buffer.alloc(10);
|
|
99
|
+
head.writeUInt16BE(a.type, 0);
|
|
100
|
+
head.writeUInt16BE(a.klass, 2);
|
|
101
|
+
head.writeUInt32BE(a.ttl, 4);
|
|
102
|
+
head.writeUInt16BE(rdata.length, 8);
|
|
103
|
+
return Buffer.concat([n, head, rdata]);
|
|
104
|
+
}
|
|
105
|
+
export function encodePacket(pkt) {
|
|
106
|
+
const head = Buffer.alloc(12);
|
|
107
|
+
head.writeUInt16BE(pkt.header.id, 0);
|
|
108
|
+
head.writeUInt16BE(pkt.header.flags, 2);
|
|
109
|
+
head.writeUInt16BE(pkt.questions.length, 4);
|
|
110
|
+
head.writeUInt16BE(pkt.answers.length, 6);
|
|
111
|
+
head.writeUInt16BE(pkt.authorities.length, 8);
|
|
112
|
+
head.writeUInt16BE(pkt.additionals.length, 10);
|
|
113
|
+
const parts = [head];
|
|
114
|
+
for (const q of pkt.questions)
|
|
115
|
+
parts.push(encodeQuestion(q));
|
|
116
|
+
for (const a of pkt.answers)
|
|
117
|
+
parts.push(encodeAnswer(a));
|
|
118
|
+
for (const a of pkt.authorities)
|
|
119
|
+
parts.push(encodeAnswer(a));
|
|
120
|
+
for (const a of pkt.additionals)
|
|
121
|
+
parts.push(encodeAnswer(a));
|
|
122
|
+
return Buffer.concat(parts);
|
|
123
|
+
}
|
|
124
|
+
function readName(c) {
|
|
125
|
+
const labels = [];
|
|
126
|
+
let pos = c.pos;
|
|
127
|
+
let jumped = false;
|
|
128
|
+
let safety = 256; /* anti-loop on malformed compression */
|
|
129
|
+
while (safety-- > 0) {
|
|
130
|
+
if (pos >= c.buf.length)
|
|
131
|
+
throw new Error('mDNS: name truncated');
|
|
132
|
+
const len = c.buf[pos];
|
|
133
|
+
if (len === 0) {
|
|
134
|
+
pos += 1;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
if ((len & 0xc0) === 0xc0) {
|
|
138
|
+
if (pos + 1 >= c.buf.length)
|
|
139
|
+
throw new Error('mDNS: compressed name truncated');
|
|
140
|
+
const ptr = ((len & 0x3f) << 8) | c.buf[pos + 1];
|
|
141
|
+
if (!jumped)
|
|
142
|
+
c.pos = pos + 2;
|
|
143
|
+
pos = ptr;
|
|
144
|
+
jumped = true;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (len > 63)
|
|
148
|
+
throw new Error('mDNS: invalid label length ' + len);
|
|
149
|
+
labels.push(c.buf.slice(pos + 1, pos + 1 + len).toString('utf8'));
|
|
150
|
+
pos += 1 + len;
|
|
151
|
+
}
|
|
152
|
+
if (!jumped)
|
|
153
|
+
c.pos = pos;
|
|
154
|
+
return labels.join('.');
|
|
155
|
+
}
|
|
156
|
+
function readUint16(c) {
|
|
157
|
+
if (c.pos + 2 > c.buf.length)
|
|
158
|
+
throw new Error('mDNS: uint16 truncated');
|
|
159
|
+
const v = c.buf.readUInt16BE(c.pos);
|
|
160
|
+
c.pos += 2;
|
|
161
|
+
return v;
|
|
162
|
+
}
|
|
163
|
+
function readUint32(c) {
|
|
164
|
+
if (c.pos + 4 > c.buf.length)
|
|
165
|
+
throw new Error('mDNS: uint32 truncated');
|
|
166
|
+
const v = c.buf.readUInt32BE(c.pos);
|
|
167
|
+
c.pos += 4;
|
|
168
|
+
return v;
|
|
169
|
+
}
|
|
170
|
+
function readRdata(type, c, rdataLen) {
|
|
171
|
+
const end = c.pos + rdataLen;
|
|
172
|
+
if (type === TYPE_PTR) {
|
|
173
|
+
const ptr = readName(c);
|
|
174
|
+
c.pos = end;
|
|
175
|
+
return { ptr };
|
|
176
|
+
}
|
|
177
|
+
if (type === TYPE_TXT) {
|
|
178
|
+
const txt = [];
|
|
179
|
+
while (c.pos < end) {
|
|
180
|
+
const len = c.buf[c.pos];
|
|
181
|
+
c.pos += 1;
|
|
182
|
+
txt.push(c.buf.slice(c.pos, c.pos + len).toString('utf8'));
|
|
183
|
+
c.pos += len;
|
|
184
|
+
}
|
|
185
|
+
return { txt };
|
|
186
|
+
}
|
|
187
|
+
if (type === TYPE_SRV) {
|
|
188
|
+
const priority = readUint16(c);
|
|
189
|
+
const weight = readUint16(c);
|
|
190
|
+
const port = readUint16(c);
|
|
191
|
+
const target = readName(c);
|
|
192
|
+
c.pos = end;
|
|
193
|
+
return { priority, weight, port, target };
|
|
194
|
+
}
|
|
195
|
+
if (type === TYPE_A) {
|
|
196
|
+
if (rdataLen !== 4)
|
|
197
|
+
throw new Error('mDNS: A record rdata must be 4 bytes');
|
|
198
|
+
const ip = [c.buf[c.pos], c.buf[c.pos + 1], c.buf[c.pos + 2], c.buf[c.pos + 3]].join('.');
|
|
199
|
+
c.pos = end;
|
|
200
|
+
return { ip };
|
|
201
|
+
}
|
|
202
|
+
/* Unknown -- return the raw buffer. */
|
|
203
|
+
const raw = c.buf.slice(c.pos, end);
|
|
204
|
+
c.pos = end;
|
|
205
|
+
return raw;
|
|
206
|
+
}
|
|
207
|
+
function readAnswer(c) {
|
|
208
|
+
const name = readName(c);
|
|
209
|
+
const type = readUint16(c);
|
|
210
|
+
const klass = readUint16(c);
|
|
211
|
+
const ttl = readUint32(c);
|
|
212
|
+
const len = readUint16(c);
|
|
213
|
+
const data = readRdata(type, c, len);
|
|
214
|
+
return { name, type, klass, ttl, data };
|
|
215
|
+
}
|
|
216
|
+
export function decodePacket(buf) {
|
|
217
|
+
const c = { buf, pos: 0 };
|
|
218
|
+
if (buf.length < 12)
|
|
219
|
+
throw new Error('mDNS: packet < 12 bytes');
|
|
220
|
+
const header = {
|
|
221
|
+
id: buf.readUInt16BE(0),
|
|
222
|
+
flags: buf.readUInt16BE(2),
|
|
223
|
+
qdCount: buf.readUInt16BE(4),
|
|
224
|
+
anCount: buf.readUInt16BE(6),
|
|
225
|
+
nsCount: buf.readUInt16BE(8),
|
|
226
|
+
arCount: buf.readUInt16BE(10),
|
|
227
|
+
};
|
|
228
|
+
c.pos = 12;
|
|
229
|
+
const questions = [];
|
|
230
|
+
for (let i = 0; i < header.qdCount; i++) {
|
|
231
|
+
const name = readName(c);
|
|
232
|
+
const type = readUint16(c);
|
|
233
|
+
const klass = readUint16(c);
|
|
234
|
+
questions.push({ name, type, klass });
|
|
235
|
+
}
|
|
236
|
+
const answers = [];
|
|
237
|
+
for (let i = 0; i < header.anCount; i++)
|
|
238
|
+
answers.push(readAnswer(c));
|
|
239
|
+
const authorities = [];
|
|
240
|
+
for (let i = 0; i < header.nsCount; i++)
|
|
241
|
+
authorities.push(readAnswer(c));
|
|
242
|
+
const additionals = [];
|
|
243
|
+
for (let i = 0; i < header.arCount; i++)
|
|
244
|
+
additionals.push(readAnswer(c));
|
|
245
|
+
return { header, questions, answers, authorities, additionals };
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=mdns_packet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdns_packet.js","sourceRoot":"","sources":["../../src/lan/mdns_packet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mDNS service announce + browse for `_yujin-forge._tcp.local.`.
|
|
3
|
+
*
|
|
4
|
+
* Forge laptop side: announceService spins up a UDP socket bound
|
|
5
|
+
* to multicast group 224.0.0.251 / port 5353 + joins the
|
|
6
|
+
* multicast group + listens for PTR queries against the Forge
|
|
7
|
+
* service name. On match it responds with PTR + SRV + TXT + A
|
|
8
|
+
* records.
|
|
9
|
+
*
|
|
10
|
+
* Mobile / sibling laptop side: browseServices fires a PTR
|
|
11
|
+
* query + collects matching SRV/TXT/A records into a typed
|
|
12
|
+
* Discovery object for `forgeCallerTimeout` ms.
|
|
13
|
+
*
|
|
14
|
+
* Both halves are framework-agnostic -- they accept any object
|
|
15
|
+
* satisfying the SocketLike interface so unit tests can drive
|
|
16
|
+
* them without touching the network.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import { type DnsAnswer } from './mdns_packet.js';
|
|
21
|
+
export declare const MDNS_PORT = 5353;
|
|
22
|
+
export declare const MDNS_GROUP_IPV4 = "224.0.0.251";
|
|
23
|
+
export declare const SERVICE_TYPE = "_yujin-forge._tcp.local.";
|
|
24
|
+
export interface ServiceConfig {
|
|
25
|
+
/** Instance name, e.g. "pablos-laptop". */
|
|
26
|
+
instanceName: string;
|
|
27
|
+
/** Hostname for the A record, e.g. "pablos-laptop.local.". */
|
|
28
|
+
hostName: string;
|
|
29
|
+
/** Service port (Forge chat panel port, default 4847). */
|
|
30
|
+
port: number;
|
|
31
|
+
/** IPv4 to advertise in the A record. */
|
|
32
|
+
ipv4: string;
|
|
33
|
+
/** TXT key=value entries (URL slug, panel build, etc). */
|
|
34
|
+
txt?: Record<string, string>;
|
|
35
|
+
/** TTL in seconds (default 120). */
|
|
36
|
+
ttl?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface SocketLike {
|
|
39
|
+
on(event: 'message', cb: (msg: Buffer, rinfo: {
|
|
40
|
+
address: string;
|
|
41
|
+
port: number;
|
|
42
|
+
}) => void): void;
|
|
43
|
+
on(event: 'error', cb: (err: Error) => void): void;
|
|
44
|
+
send(msg: Buffer, port: number, address: string, cb?: (err: Error | null) => void): void;
|
|
45
|
+
close(cb?: () => void): void;
|
|
46
|
+
}
|
|
47
|
+
/** Build the PTR/SRV/TXT/A answer set for a query against the
|
|
48
|
+
* service type. Used by the announce path. */
|
|
49
|
+
export declare function buildAnnounceAnswers(cfg: ServiceConfig): DnsAnswer[];
|
|
50
|
+
/** Build the unsolicited announcement packet (sent at startup
|
|
51
|
+
* per RFC 6762 sec. 8: send the answer set as if responding to
|
|
52
|
+
* a query for the service type). */
|
|
53
|
+
export declare function buildUnsolicitedAnnouncement(cfg: ServiceConfig): Buffer;
|
|
54
|
+
/** Build a PTR query for the service type. Used by browse. */
|
|
55
|
+
export declare function buildBrowseQuery(): Buffer;
|
|
56
|
+
/** True if the inbound message is a PTR query targeting our
|
|
57
|
+
* service type. */
|
|
58
|
+
export declare function isQueryForOurService(rawMessage: Buffer): boolean;
|
|
59
|
+
/** Build the response we send back when isQueryForOurService
|
|
60
|
+
* is true. Same shape as the unsolicited announcement plus an
|
|
61
|
+
* echoed question. */
|
|
62
|
+
export declare function buildQueryResponse(cfg: ServiceConfig): Buffer;
|
|
63
|
+
export interface Discovery {
|
|
64
|
+
instance: string;
|
|
65
|
+
host: string;
|
|
66
|
+
port: number;
|
|
67
|
+
ipv4: string | null;
|
|
68
|
+
txt: Record<string, string>;
|
|
69
|
+
}
|
|
70
|
+
/** Merge a response packet into the rolling discovery map.
|
|
71
|
+
* Keyed by the instance label so multiple announces from the
|
|
72
|
+
* same host collapse into one record. */
|
|
73
|
+
export declare function ingestResponse(raw: Buffer, current: Map<string, Discovery>): Map<string, Discovery>;
|
|
74
|
+
/** High-level browse loop: open a socket, fire the PTR query,
|
|
75
|
+
* ingest responses for `timeoutMs`, resolve to the discovery
|
|
76
|
+
* map. Caller supplies the socket + clock so tests can drive
|
|
77
|
+
* this synchronously. */
|
|
78
|
+
export interface BrowseOpts {
|
|
79
|
+
socket: SocketLike;
|
|
80
|
+
timeoutMs: number;
|
|
81
|
+
setTimeoutImpl?: typeof setTimeout;
|
|
82
|
+
multicast?: {
|
|
83
|
+
address: string;
|
|
84
|
+
port: number;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export declare function browseServices(opts: BrowseOpts): Promise<Discovery[]>;
|
|
88
|
+
/** Bind a passive announcer: listen for queries against our
|
|
89
|
+
* service type + respond. Caller is responsible for setting
|
|
90
|
+
* up the multicast socket + invoking close() on shutdown. */
|
|
91
|
+
export interface AnnounceOpts {
|
|
92
|
+
socket: SocketLike;
|
|
93
|
+
cfg: ServiceConfig;
|
|
94
|
+
multicast?: {
|
|
95
|
+
address: string;
|
|
96
|
+
port: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export declare function attachAnnouncer(opts: AnnounceOpts): {
|
|
100
|
+
unsolicited: Buffer;
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=mdns_service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdns_service.d.ts","sourceRoot":"","sources":["../../src/lan/mdns_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mDNS service announce + browse for `_yujin-forge._tcp.local.`.
|
|
3
|
+
*
|
|
4
|
+
* Forge laptop side: announceService spins up a UDP socket bound
|
|
5
|
+
* to multicast group 224.0.0.251 / port 5353 + joins the
|
|
6
|
+
* multicast group + listens for PTR queries against the Forge
|
|
7
|
+
* service name. On match it responds with PTR + SRV + TXT + A
|
|
8
|
+
* records.
|
|
9
|
+
*
|
|
10
|
+
* Mobile / sibling laptop side: browseServices fires a PTR
|
|
11
|
+
* query + collects matching SRV/TXT/A records into a typed
|
|
12
|
+
* Discovery object for `forgeCallerTimeout` ms.
|
|
13
|
+
*
|
|
14
|
+
* Both halves are framework-agnostic -- they accept any object
|
|
15
|
+
* satisfying the SocketLike interface so unit tests can drive
|
|
16
|
+
* them without touching the network.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import { encodePacket, decodePacket, TYPE_PTR, TYPE_SRV, TYPE_TXT, TYPE_A, CLASS_IN, CLASS_IN_FLUSH, isPtr, isSrv, isTxt, isA, } from './mdns_packet.js';
|
|
21
|
+
export const MDNS_PORT = 5353;
|
|
22
|
+
export const MDNS_GROUP_IPV4 = '224.0.0.251';
|
|
23
|
+
export const SERVICE_TYPE = '_yujin-forge._tcp.local.';
|
|
24
|
+
/** Names from the wire come back without trailing dot. Strip
|
|
25
|
+
* on both sides before comparing. */
|
|
26
|
+
function nameMatches(a, b) {
|
|
27
|
+
return a.replace(/\.$/, '') === b.replace(/\.$/, '');
|
|
28
|
+
}
|
|
29
|
+
function fullInstanceName(cfg) {
|
|
30
|
+
return cfg.instanceName + '.' + SERVICE_TYPE;
|
|
31
|
+
}
|
|
32
|
+
function txtPayload(txt) {
|
|
33
|
+
if (!txt)
|
|
34
|
+
return [];
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const [k, v] of Object.entries(txt))
|
|
37
|
+
out.push(k + '=' + v);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
/** Build the PTR/SRV/TXT/A answer set for a query against the
|
|
41
|
+
* service type. Used by the announce path. */
|
|
42
|
+
export function buildAnnounceAnswers(cfg) {
|
|
43
|
+
const ttl = cfg.ttl ?? 120;
|
|
44
|
+
const instance = fullInstanceName(cfg);
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
name: SERVICE_TYPE, type: TYPE_PTR, klass: CLASS_IN, ttl,
|
|
48
|
+
data: { ptr: instance },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: instance, type: TYPE_SRV, klass: CLASS_IN_FLUSH, ttl,
|
|
52
|
+
data: { priority: 0, weight: 0, port: cfg.port, target: cfg.hostName },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: instance, type: TYPE_TXT, klass: CLASS_IN_FLUSH, ttl,
|
|
56
|
+
data: { txt: txtPayload(cfg.txt) },
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: cfg.hostName, type: TYPE_A, klass: CLASS_IN_FLUSH, ttl,
|
|
60
|
+
data: { ip: cfg.ipv4 },
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
/** Build the unsolicited announcement packet (sent at startup
|
|
65
|
+
* per RFC 6762 sec. 8: send the answer set as if responding to
|
|
66
|
+
* a query for the service type). */
|
|
67
|
+
export function buildUnsolicitedAnnouncement(cfg) {
|
|
68
|
+
return encodePacket({
|
|
69
|
+
header: {
|
|
70
|
+
id: 0,
|
|
71
|
+
/* QR=1 (response), AA=1. */
|
|
72
|
+
flags: 0x8400,
|
|
73
|
+
qdCount: 0,
|
|
74
|
+
anCount: 4, nsCount: 0, arCount: 0,
|
|
75
|
+
},
|
|
76
|
+
questions: [],
|
|
77
|
+
answers: buildAnnounceAnswers(cfg),
|
|
78
|
+
authorities: [], additionals: [],
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Build a PTR query for the service type. Used by browse. */
|
|
82
|
+
export function buildBrowseQuery() {
|
|
83
|
+
return encodePacket({
|
|
84
|
+
header: { id: 0, flags: 0, qdCount: 1, anCount: 0, nsCount: 0, arCount: 0 },
|
|
85
|
+
questions: [{ name: SERVICE_TYPE, type: TYPE_PTR, klass: CLASS_IN }],
|
|
86
|
+
answers: [], authorities: [], additionals: [],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/** True if the inbound message is a PTR query targeting our
|
|
90
|
+
* service type. */
|
|
91
|
+
export function isQueryForOurService(rawMessage) {
|
|
92
|
+
let pkt;
|
|
93
|
+
try {
|
|
94
|
+
pkt = decodePacket(rawMessage);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (pkt.header.qdCount === 0)
|
|
100
|
+
return false;
|
|
101
|
+
for (const q of pkt.questions) {
|
|
102
|
+
if (!nameMatches(q.name, SERVICE_TYPE))
|
|
103
|
+
continue;
|
|
104
|
+
if (q.type !== TYPE_PTR && q.type !== 0xff /* ANY */)
|
|
105
|
+
continue;
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
/** Build the response we send back when isQueryForOurService
|
|
111
|
+
* is true. Same shape as the unsolicited announcement plus an
|
|
112
|
+
* echoed question. */
|
|
113
|
+
export function buildQueryResponse(cfg) {
|
|
114
|
+
return encodePacket({
|
|
115
|
+
header: {
|
|
116
|
+
id: 0, flags: 0x8400,
|
|
117
|
+
qdCount: 0,
|
|
118
|
+
anCount: 4, nsCount: 0, arCount: 0,
|
|
119
|
+
},
|
|
120
|
+
questions: [],
|
|
121
|
+
answers: buildAnnounceAnswers(cfg),
|
|
122
|
+
authorities: [], additionals: [],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** Merge a response packet into the rolling discovery map.
|
|
126
|
+
* Keyed by the instance label so multiple announces from the
|
|
127
|
+
* same host collapse into one record. */
|
|
128
|
+
export function ingestResponse(raw, current) {
|
|
129
|
+
let pkt;
|
|
130
|
+
try {
|
|
131
|
+
pkt = decodePacket(raw);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return current;
|
|
135
|
+
}
|
|
136
|
+
/* Walk answers + additionals as one. */
|
|
137
|
+
const records = [...pkt.answers, ...pkt.additionals];
|
|
138
|
+
/* Step 1: collect PTRs into the map skeleton. */
|
|
139
|
+
for (const r of records) {
|
|
140
|
+
if (r.type === TYPE_PTR && isPtr(r.data) && nameMatches(r.name, SERVICE_TYPE)) {
|
|
141
|
+
const instance = r.data.ptr.split('.')[0];
|
|
142
|
+
if (!current.has(instance)) {
|
|
143
|
+
current.set(instance, {
|
|
144
|
+
instance, host: '', port: 0, ipv4: null, txt: {},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/* Step 2: fill SRV/TXT/A. We bind by name = `${instance}.${SERVICE_TYPE}`. */
|
|
150
|
+
for (const r of records) {
|
|
151
|
+
const labels = r.name.split('.');
|
|
152
|
+
const instance = labels[0];
|
|
153
|
+
const d = current.get(instance);
|
|
154
|
+
if (!d)
|
|
155
|
+
continue;
|
|
156
|
+
if (r.type === TYPE_SRV && isSrv(r.data)) {
|
|
157
|
+
d.port = r.data.port;
|
|
158
|
+
d.host = r.data.target;
|
|
159
|
+
}
|
|
160
|
+
else if (r.type === TYPE_TXT && isTxt(r.data)) {
|
|
161
|
+
for (const entry of r.data.txt) {
|
|
162
|
+
const eq = entry.indexOf('=');
|
|
163
|
+
if (eq < 0)
|
|
164
|
+
continue;
|
|
165
|
+
d.txt[entry.slice(0, eq)] = entry.slice(eq + 1);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else if (r.type === TYPE_A && isA(r.data)) {
|
|
169
|
+
d.ipv4 = r.data.ip;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return current;
|
|
173
|
+
}
|
|
174
|
+
export function browseServices(opts) {
|
|
175
|
+
const target = opts.multicast ?? { address: MDNS_GROUP_IPV4, port: MDNS_PORT };
|
|
176
|
+
const discoveries = new Map();
|
|
177
|
+
return new Promise((resolve) => {
|
|
178
|
+
opts.socket.on('message', (msg) => { ingestResponse(msg, discoveries); });
|
|
179
|
+
opts.socket.send(buildBrowseQuery(), target.port, target.address);
|
|
180
|
+
const t = (opts.setTimeoutImpl ?? setTimeout)(() => {
|
|
181
|
+
opts.socket.close();
|
|
182
|
+
/* Drop incomplete records (missing port -- no SRV arrived). */
|
|
183
|
+
const out = [];
|
|
184
|
+
for (const d of discoveries.values()) {
|
|
185
|
+
if (d.port > 0)
|
|
186
|
+
out.push(d);
|
|
187
|
+
}
|
|
188
|
+
resolve(out);
|
|
189
|
+
}, opts.timeoutMs);
|
|
190
|
+
/* setTimeout returns a handle; avoid blocking process exit. */
|
|
191
|
+
if (typeof t.unref === 'function') {
|
|
192
|
+
t.unref();
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
export function attachAnnouncer(opts) {
|
|
197
|
+
const target = opts.multicast ?? { address: MDNS_GROUP_IPV4, port: MDNS_PORT };
|
|
198
|
+
opts.socket.on('message', (msg) => {
|
|
199
|
+
if (!isQueryForOurService(msg))
|
|
200
|
+
return;
|
|
201
|
+
const response = buildQueryResponse(opts.cfg);
|
|
202
|
+
opts.socket.send(response, target.port, target.address);
|
|
203
|
+
});
|
|
204
|
+
return { unsolicited: buildUnsolicitedAnnouncement(opts.cfg) };
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=mdns_service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdns_service.js","sourceRoot":"","sources":["../../src/lan/mdns_service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EACL,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EACpC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAEzB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAC9B,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEvD;sCACsC;AACtC,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAwBD,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,OAAO,GAAG,CAAC,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU,CAAC,GAAuC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;+CAC+C;AAC/C,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO;QACL;YACE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG;YACxD,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;SACxB;QACD;YACE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG;YAC1D,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;SACvE;QACD;YACE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG;YAC1D,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;SACnC;QACD;YACE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG;YAC5D,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE;SACvB;KACF,CAAC;AACJ,CAAC;AAED;;qCAEqC;AACrC,MAAM,UAAU,4BAA4B,CAAC,GAAkB;IAC7D,OAAO,YAAY,CAAC;QAClB,MAAM,EAAE;YACN,EAAE,EAAE,CAAC;YACL,4BAA4B;YAC5B,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;SACnC;QACD,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC;QAClC,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;KACjC,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,YAAY,CAAC;QAClB,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3E,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACpE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC;AAED;oBACoB;AACpB,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QAAC,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC;YAAE,SAAS;QACjD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS;YAAE,SAAS;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;uBAEuB;AACvB,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,OAAO,YAAY,CAAC;QAClB,MAAM,EAAE;YACN,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM;YACpB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;SACnC;QACD,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC;QAClC,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;KACjC,CAAC,CAAC;AACL,CAAC;AAYD;;0CAE0C;AAC1C,MAAM,UAAU,cAAc,CAC5B,GAAW,EAAE,OAA+B;IAE5C,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;IAC1D,wCAAwC;IACxC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IACrD,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;YAC9E,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACpB,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,8EAA8E;IAC9E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACrB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,EAAE,GAAG,CAAC;oBAAE,SAAS;gBACrB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAYD,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,GAAG,EAAE;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,+DAA+D;YAC/D,MAAM,GAAG,GAAgB,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,+DAA+D;QAC/D,IAAI,OAAQ,CAA4B,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC7D,CAA2B,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAUD,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;QAChC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAAE,OAAO;QACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,WAAW,EAAE,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SeatToken } from './types.js';
|
|
2
|
+
export interface ParsedJwt {
|
|
3
|
+
header: Record<string, unknown>;
|
|
4
|
+
payload: Record<string, unknown>;
|
|
5
|
+
raw: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class InvalidLicenseKeyError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse a JWT without verifying the signature. Throws
|
|
12
|
+
* InvalidLicenseKeyError on any shape error so the caller can
|
|
13
|
+
* print a precise hint instead of a stack trace.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseJwt(raw: string): ParsedJwt;
|
|
16
|
+
export interface ActivateResult {
|
|
17
|
+
seat: SeatToken;
|
|
18
|
+
path: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Activate a license key on this machine. Writes
|
|
22
|
+
* ~/.yujin-forge/license.json after extracting the relevant claims.
|
|
23
|
+
*
|
|
24
|
+
* Throws InvalidLicenseKeyError on shape / freshness errors.
|
|
25
|
+
* Throws plain Error on filesystem issues.
|
|
26
|
+
*/
|
|
27
|
+
export declare function activate(rawKey: string): Promise<ActivateResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Remove the local license cache. Returns true if a file was
|
|
30
|
+
* deleted, false if no license was installed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function revoke(): Promise<boolean>;
|
|
33
|
+
//# sourceMappingURL=activate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/license/activate.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,EAAM,MAAM,CAAC;CACjB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA0B/C;AAYD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAsCtE;AAED;;;GAGG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAS/C"}
|