@wasmsoft/fantastic 1.0.0
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/README.md +65 -0
- package/bin/run.js +27 -0
- package/bin/supervisor.js +65 -0
- package/dist/acquire/central-url.d.ts +9 -0
- package/dist/acquire/central-url.d.ts.map +1 -0
- package/dist/acquire/central-url.js +74 -0
- package/dist/acquire/central-url.js.map +1 -0
- package/dist/acquire/code.d.ts +21 -0
- package/dist/acquire/code.d.ts.map +1 -0
- package/dist/acquire/code.js +66 -0
- package/dist/acquire/code.js.map +1 -0
- package/dist/acquire/compatibility.d.ts +18 -0
- package/dist/acquire/compatibility.d.ts.map +1 -0
- package/dist/acquire/compatibility.js +36 -0
- package/dist/acquire/compatibility.js.map +1 -0
- package/dist/acquire/fetch.d.ts +26 -0
- package/dist/acquire/fetch.d.ts.map +1 -0
- package/dist/acquire/fetch.js +72 -0
- package/dist/acquire/fetch.js.map +1 -0
- package/dist/acquire/latest.d.ts +24 -0
- package/dist/acquire/latest.d.ts.map +1 -0
- package/dist/acquire/latest.js +95 -0
- package/dist/acquire/latest.js.map +1 -0
- package/dist/backup/archive.d.ts +26 -0
- package/dist/backup/archive.d.ts.map +1 -0
- package/dist/backup/archive.js +123 -0
- package/dist/backup/archive.js.map +1 -0
- package/dist/backup/restore.d.ts +46 -0
- package/dist/backup/restore.d.ts.map +1 -0
- package/dist/backup/restore.js +164 -0
- package/dist/backup/restore.js.map +1 -0
- package/dist/base-command.d.ts +54 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +120 -0
- package/dist/base-command.js.map +1 -0
- package/dist/bundle-format/index.d.ts +6 -0
- package/dist/bundle-format/index.d.ts.map +1 -0
- package/dist/bundle-format/index.js +36 -0
- package/dist/bundle-format/index.js.map +1 -0
- package/dist/commands/activate.d.ts +15 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +139 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +75 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config/get.d.ts +10 -0
- package/dist/commands/config/get.d.ts.map +1 -0
- package/dist/commands/config/get.js +33 -0
- package/dist/commands/config/get.js.map +1 -0
- package/dist/commands/config/list.d.ts +7 -0
- package/dist/commands/config/list.d.ts.map +1 -0
- package/dist/commands/config/list.js +43 -0
- package/dist/commands/config/list.js.map +1 -0
- package/dist/commands/config/set.d.ts +11 -0
- package/dist/commands/config/set.d.ts.map +1 -0
- package/dist/commands/config/set.js +56 -0
- package/dist/commands/config/set.js.map +1 -0
- package/dist/commands/db/migrate.d.ts +10 -0
- package/dist/commands/db/migrate.d.ts.map +1 -0
- package/dist/commands/db/migrate.js +67 -0
- package/dist/commands/db/migrate.js.map +1 -0
- package/dist/commands/dev.d.ts +19 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +149 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +75 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/health.d.ts +12 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +109 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/install.d.ts +60 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +486 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/iptv/snapshot.d.ts +10 -0
- package/dist/commands/iptv/snapshot.d.ts.map +1 -0
- package/dist/commands/iptv/snapshot.js +55 -0
- package/dist/commands/iptv/snapshot.js.map +1 -0
- package/dist/commands/library/drives.d.ts +7 -0
- package/dist/commands/library/drives.d.ts.map +1 -0
- package/dist/commands/library/drives.js +71 -0
- package/dist/commands/library/drives.js.map +1 -0
- package/dist/commands/library/relink.d.ts +10 -0
- package/dist/commands/library/relink.d.ts.map +1 -0
- package/dist/commands/library/relink.js +72 -0
- package/dist/commands/library/relink.js.map +1 -0
- package/dist/commands/library/scan.d.ts +16 -0
- package/dist/commands/library/scan.d.ts.map +1 -0
- package/dist/commands/library/scan.js +87 -0
- package/dist/commands/library/scan.js.map +1 -0
- package/dist/commands/library/sections.d.ts +7 -0
- package/dist/commands/library/sections.d.ts.map +1 -0
- package/dist/commands/library/sections.js +33 -0
- package/dist/commands/library/sections.js.map +1 -0
- package/dist/commands/library/status.d.ts +7 -0
- package/dist/commands/library/status.d.ts.map +1 -0
- package/dist/commands/library/status.js +37 -0
- package/dist/commands/library/status.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +73 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/live/channels.d.ts +10 -0
- package/dist/commands/live/channels.d.ts.map +1 -0
- package/dist/commands/live/channels.js +55 -0
- package/dist/commands/live/channels.js.map +1 -0
- package/dist/commands/live/test.d.ts +15 -0
- package/dist/commands/live/test.d.ts.map +1 -0
- package/dist/commands/live/test.js +116 -0
- package/dist/commands/live/test.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +77 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate-cli.d.ts +11 -0
- package/dist/commands/migrate-cli.d.ts.map +1 -0
- package/dist/commands/migrate-cli.js +116 -0
- package/dist/commands/migrate-cli.js.map +1 -0
- package/dist/commands/owner/reset.d.ts +7 -0
- package/dist/commands/owner/reset.d.ts.map +1 -0
- package/dist/commands/owner/reset.js +74 -0
- package/dist/commands/owner/reset.js.map +1 -0
- package/dist/commands/restart.d.ts +11 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +53 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/restore.d.ts +17 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +148 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/self-update.d.ts +10 -0
- package/dist/commands/self-update.d.ts.map +1 -0
- package/dist/commands/self-update.js +98 -0
- package/dist/commands/self-update.js.map +1 -0
- package/dist/commands/setup.d.ts +19 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +111 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/shell.d.ts +118 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +415 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/commands/start.d.ts +12 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +108 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +115 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +45 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/stream/cancel.d.ts +13 -0
- package/dist/commands/stream/cancel.d.ts.map +1 -0
- package/dist/commands/stream/cancel.js +31 -0
- package/dist/commands/stream/cancel.js.map +1 -0
- package/dist/commands/stream/encoders.d.ts +7 -0
- package/dist/commands/stream/encoders.d.ts.map +1 -0
- package/dist/commands/stream/encoders.js +42 -0
- package/dist/commands/stream/encoders.js.map +1 -0
- package/dist/commands/stream/queue.d.ts +7 -0
- package/dist/commands/stream/queue.d.ts.map +1 -0
- package/dist/commands/stream/queue.js +52 -0
- package/dist/commands/stream/queue.js.map +1 -0
- package/dist/commands/stream/sessions.d.ts +7 -0
- package/dist/commands/stream/sessions.d.ts.map +1 -0
- package/dist/commands/stream/sessions.js +44 -0
- package/dist/commands/stream/sessions.js.map +1 -0
- package/dist/commands/uninstall.d.ts +23 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +290 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +21 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +290 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/watch.d.ts +10 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +38 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/local-config.d.ts +22 -0
- package/dist/config/local-config.d.ts.map +1 -0
- package/dist/config/local-config.js +79 -0
- package/dist/config/local-config.js.map +1 -0
- package/dist/core-scripts/run.d.ts +22 -0
- package/dist/core-scripts/run.d.ts.map +1 -0
- package/dist/core-scripts/run.js +65 -0
- package/dist/core-scripts/run.js.map +1 -0
- package/dist/doctor/check.types.d.ts +51 -0
- package/dist/doctor/check.types.d.ts.map +1 -0
- package/dist/doctor/check.types.js +14 -0
- package/dist/doctor/check.types.js.map +1 -0
- package/dist/doctor/checks/core.check.d.ts +11 -0
- package/dist/doctor/checks/core.check.d.ts.map +1 -0
- package/dist/doctor/checks/core.check.js +104 -0
- package/dist/doctor/checks/core.check.js.map +1 -0
- package/dist/doctor/checks/data.check.d.ts +11 -0
- package/dist/doctor/checks/data.check.d.ts.map +1 -0
- package/dist/doctor/checks/data.check.js +70 -0
- package/dist/doctor/checks/data.check.js.map +1 -0
- package/dist/doctor/checks/environment.check.d.ts +6 -0
- package/dist/doctor/checks/environment.check.d.ts.map +1 -0
- package/dist/doctor/checks/environment.check.js +70 -0
- package/dist/doctor/checks/environment.check.js.map +1 -0
- package/dist/doctor/checks/integrity.check.d.ts +4 -0
- package/dist/doctor/checks/integrity.check.d.ts.map +1 -0
- package/dist/doctor/checks/integrity.check.js +89 -0
- package/dist/doctor/checks/integrity.check.js.map +1 -0
- package/dist/doctor/checks/isolation.check.d.ts +49 -0
- package/dist/doctor/checks/isolation.check.d.ts.map +1 -0
- package/dist/doctor/checks/isolation.check.js +220 -0
- package/dist/doctor/checks/isolation.check.js.map +1 -0
- package/dist/doctor/checks/licence.check.d.ts +8 -0
- package/dist/doctor/checks/licence.check.d.ts.map +1 -0
- package/dist/doctor/checks/licence.check.js +172 -0
- package/dist/doctor/checks/licence.check.js.map +1 -0
- package/dist/doctor/checks/ports.check.d.ts +4 -0
- package/dist/doctor/checks/ports.check.d.ts.map +1 -0
- package/dist/doctor/checks/ports.check.js +52 -0
- package/dist/doctor/checks/ports.check.js.map +1 -0
- package/dist/doctor/checks/supervisor.check.d.ts +19 -0
- package/dist/doctor/checks/supervisor.check.d.ts.map +1 -0
- package/dist/doctor/checks/supervisor.check.js +152 -0
- package/dist/doctor/checks/supervisor.check.js.map +1 -0
- package/dist/doctor/checks/tooling.check.d.ts +3 -0
- package/dist/doctor/checks/tooling.check.d.ts.map +1 -0
- package/dist/doctor/checks/tooling.check.js +43 -0
- package/dist/doctor/checks/tooling.check.js.map +1 -0
- package/dist/doctor/registry.d.ts +15 -0
- package/dist/doctor/registry.d.ts.map +1 -0
- package/dist/doctor/registry.js +53 -0
- package/dist/doctor/registry.js.map +1 -0
- package/dist/exit-codes.d.ts +18 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +23 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/logs/sink.d.ts +11 -0
- package/dist/logs/sink.d.ts.map +1 -0
- package/dist/logs/sink.js +73 -0
- package/dist/logs/sink.js.map +1 -0
- package/dist/logs/tail.d.ts +17 -0
- package/dist/logs/tail.d.ts.map +1 -0
- package/dist/logs/tail.js +98 -0
- package/dist/logs/tail.js.map +1 -0
- package/dist/packaging/boot-task.d.ts +56 -0
- package/dist/packaging/boot-task.d.ts.map +1 -0
- package/dist/packaging/boot-task.js +151 -0
- package/dist/packaging/boot-task.js.map +1 -0
- package/dist/packaging/install.d.ts +154 -0
- package/dist/packaging/install.d.ts.map +1 -0
- package/dist/packaging/install.js +381 -0
- package/dist/packaging/install.js.map +1 -0
- package/dist/packaging/layout.d.ts +153 -0
- package/dist/packaging/layout.d.ts.map +1 -0
- package/dist/packaging/layout.js +168 -0
- package/dist/packaging/layout.js.map +1 -0
- package/dist/packaging/machine-path.d.ts +52 -0
- package/dist/packaging/machine-path.d.ts.map +1 -0
- package/dist/packaging/machine-path.js +237 -0
- package/dist/packaging/machine-path.js.map +1 -0
- package/dist/packaging/manifest.d.ts +37 -0
- package/dist/packaging/manifest.d.ts.map +1 -0
- package/dist/packaging/manifest.js +115 -0
- package/dist/packaging/manifest.js.map +1 -0
- package/dist/packaging/shims.d.ts +31 -0
- package/dist/packaging/shims.d.ts.map +1 -0
- package/dist/packaging/shims.js +165 -0
- package/dist/packaging/shims.js.map +1 -0
- package/dist/probes/internal-paths.d.ts +35 -0
- package/dist/probes/internal-paths.d.ts.map +1 -0
- package/dist/probes/internal-paths.js +58 -0
- package/dist/probes/internal-paths.js.map +1 -0
- package/dist/probes/internal.client.d.ts +54 -0
- package/dist/probes/internal.client.d.ts.map +1 -0
- package/dist/probes/internal.client.js +123 -0
- package/dist/probes/internal.client.js.map +1 -0
- package/dist/probes/port.probe.d.ts +21 -0
- package/dist/probes/port.probe.d.ts.map +1 -0
- package/dist/probes/port.probe.js +42 -0
- package/dist/probes/port.probe.js.map +1 -0
- package/dist/probes/service.probe.d.ts +29 -0
- package/dist/probes/service.probe.d.ts.map +1 -0
- package/dist/probes/service.probe.js +65 -0
- package/dist/probes/service.probe.js.map +1 -0
- package/dist/profiles/appliance.profile.d.ts +20 -0
- package/dist/profiles/appliance.profile.d.ts.map +1 -0
- package/dist/profiles/appliance.profile.js +137 -0
- package/dist/profiles/appliance.profile.js.map +1 -0
- package/dist/profiles/dev.profile.d.ts +22 -0
- package/dist/profiles/dev.profile.d.ts.map +1 -0
- package/dist/profiles/dev.profile.js +104 -0
- package/dist/profiles/dev.profile.js.map +1 -0
- package/dist/profiles/resolve.d.ts +37 -0
- package/dist/profiles/resolve.d.ts.map +1 -0
- package/dist/profiles/resolve.js +198 -0
- package/dist/profiles/resolve.js.map +1 -0
- package/dist/profiles/types.d.ts +57 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +15 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/registry/local-registry.d.ts +79 -0
- package/dist/registry/local-registry.d.ts.map +1 -0
- package/dist/registry/local-registry.js +252 -0
- package/dist/registry/local-registry.js.map +1 -0
- package/dist/render/banner.d.ts +13 -0
- package/dist/render/banner.d.ts.map +1 -0
- package/dist/render/banner.js +83 -0
- package/dist/render/banner.js.map +1 -0
- package/dist/render/boot.render.d.ts +123 -0
- package/dist/render/boot.render.d.ts.map +1 -0
- package/dist/render/boot.render.js +288 -0
- package/dist/render/boot.render.js.map +1 -0
- package/dist/render/brand.d.ts +16 -0
- package/dist/render/brand.d.ts.map +1 -0
- package/dist/render/brand.js +22 -0
- package/dist/render/brand.js.map +1 -0
- package/dist/render/doctor.render.d.ts +12 -0
- package/dist/render/doctor.render.d.ts.map +1 -0
- package/dist/render/doctor.render.js +95 -0
- package/dist/render/doctor.render.js.map +1 -0
- package/dist/render/json.d.ts +29 -0
- package/dist/render/json.d.ts.map +1 -0
- package/dist/render/json.js +19 -0
- package/dist/render/json.js.map +1 -0
- package/dist/render/licence.render.d.ts +10 -0
- package/dist/render/licence.render.d.ts.map +1 -0
- package/dist/render/licence.render.js +167 -0
- package/dist/render/licence.render.js.map +1 -0
- package/dist/render/status.render.d.ts +6 -0
- package/dist/render/status.render.d.ts.map +1 -0
- package/dist/render/status.render.js +52 -0
- package/dist/render/status.render.js.map +1 -0
- package/dist/render/theme.d.ts +66 -0
- package/dist/render/theme.d.ts.map +1 -0
- package/dist/render/theme.js +89 -0
- package/dist/render/theme.js.map +1 -0
- package/dist/runtime-guard.d.ts +19 -0
- package/dist/runtime-guard.d.ts.map +1 -0
- package/dist/runtime-guard.js +57 -0
- package/dist/runtime-guard.js.map +1 -0
- package/dist/shell/input-mode.d.ts +25 -0
- package/dist/shell/input-mode.d.ts.map +1 -0
- package/dist/shell/input-mode.js +17 -0
- package/dist/shell/input-mode.js.map +1 -0
- package/dist/shell/parse-line.d.ts +6 -0
- package/dist/shell/parse-line.d.ts.map +1 -0
- package/dist/shell/parse-line.js +62 -0
- package/dist/shell/parse-line.js.map +1 -0
- package/dist/shell/suggestions.d.ts +14 -0
- package/dist/shell/suggestions.d.ts.map +1 -0
- package/dist/shell/suggestions.js +35 -0
- package/dist/shell/suggestions.js.map +1 -0
- package/dist/supervisor/dependencies.d.ts +2 -0
- package/dist/supervisor/dependencies.d.ts.map +1 -0
- package/dist/supervisor/dependencies.js +38 -0
- package/dist/supervisor/dependencies.js.map +1 -0
- package/dist/supervisor/entry.d.ts +36 -0
- package/dist/supervisor/entry.d.ts.map +1 -0
- package/dist/supervisor/entry.js +171 -0
- package/dist/supervisor/entry.js.map +1 -0
- package/dist/supervisor/inspect.d.ts +17 -0
- package/dist/supervisor/inspect.d.ts.map +1 -0
- package/dist/supervisor/inspect.js +39 -0
- package/dist/supervisor/inspect.js.map +1 -0
- package/dist/supervisor/invocation.d.ts +27 -0
- package/dist/supervisor/invocation.d.ts.map +1 -0
- package/dist/supervisor/invocation.js +33 -0
- package/dist/supervisor/invocation.js.map +1 -0
- package/dist/supervisor/monitor.d.ts +63 -0
- package/dist/supervisor/monitor.d.ts.map +1 -0
- package/dist/supervisor/monitor.js +141 -0
- package/dist/supervisor/monitor.js.map +1 -0
- package/dist/supervisor/orchestrator.d.ts +52 -0
- package/dist/supervisor/orchestrator.d.ts.map +1 -0
- package/dist/supervisor/orchestrator.js +154 -0
- package/dist/supervisor/orchestrator.js.map +1 -0
- package/dist/supervisor/pidfile.d.ts +21 -0
- package/dist/supervisor/pidfile.d.ts.map +1 -0
- package/dist/supervisor/pidfile.js +39 -0
- package/dist/supervisor/pidfile.js.map +1 -0
- package/dist/supervisor/process-identity.d.ts +19 -0
- package/dist/supervisor/process-identity.d.ts.map +1 -0
- package/dist/supervisor/process-identity.js +51 -0
- package/dist/supervisor/process-identity.js.map +1 -0
- package/dist/supervisor/readiness.d.ts +17 -0
- package/dist/supervisor/readiness.d.ts.map +1 -0
- package/dist/supervisor/readiness.js +52 -0
- package/dist/supervisor/readiness.js.map +1 -0
- package/dist/supervisor/restart-consumer.d.ts +37 -0
- package/dist/supervisor/restart-consumer.d.ts.map +1 -0
- package/dist/supervisor/restart-consumer.js +119 -0
- package/dist/supervisor/restart-consumer.js.map +1 -0
- package/dist/supervisor/runner.d.ts +2 -0
- package/dist/supervisor/runner.d.ts.map +1 -0
- package/dist/supervisor/runner.js +118 -0
- package/dist/supervisor/runner.js.map +1 -0
- package/dist/supervisor/schedule-timer.d.ts +38 -0
- package/dist/supervisor/schedule-timer.d.ts.map +1 -0
- package/dist/supervisor/schedule-timer.js +148 -0
- package/dist/supervisor/schedule-timer.js.map +1 -0
- package/dist/supervisor/spawn.d.ts +18 -0
- package/dist/supervisor/spawn.d.ts.map +1 -0
- package/dist/supervisor/spawn.js +119 -0
- package/dist/supervisor/spawn.js.map +1 -0
- package/dist/supervisor/state-files.d.ts +33 -0
- package/dist/supervisor/state-files.d.ts.map +1 -0
- package/dist/supervisor/state-files.js +110 -0
- package/dist/supervisor/state-files.js.map +1 -0
- package/dist/supervisor/tree-kill.d.ts +14 -0
- package/dist/supervisor/tree-kill.d.ts.map +1 -0
- package/dist/supervisor/tree-kill.js +82 -0
- package/dist/supervisor/tree-kill.js.map +1 -0
- package/dist/ui/health-panel.d.ts +8 -0
- package/dist/ui/health-panel.d.ts.map +1 -0
- package/dist/ui/health-panel.js +91 -0
- package/dist/ui/health-panel.js.map +1 -0
- package/dist/updating/apply.d.ts +50 -0
- package/dist/updating/apply.d.ts.map +1 -0
- package/dist/updating/apply.js +172 -0
- package/dist/updating/apply.js.map +1 -0
- package/dist/updating/download.d.ts +44 -0
- package/dist/updating/download.d.ts.map +1 -0
- package/dist/updating/download.js +144 -0
- package/dist/updating/download.js.map +1 -0
- package/dist/updating/rollback.d.ts +33 -0
- package/dist/updating/rollback.d.ts.map +1 -0
- package/dist/updating/rollback.js +54 -0
- package/dist/updating/rollback.js.map +1 -0
- package/dist/updating/self.d.ts +16 -0
- package/dist/updating/self.d.ts.map +1 -0
- package/dist/updating/self.js +50 -0
- package/dist/updating/self.js.map +1 -0
- package/dist/updating/verify.d.ts +25 -0
- package/dist/updating/verify.d.ts.map +1 -0
- package/dist/updating/verify.js +51 -0
- package/dist/updating/verify.js.map +1 -0
- package/dist/updating/versions.d.ts +31 -0
- package/dist/updating/versions.d.ts.map +1 -0
- package/dist/updating/versions.js +78 -0
- package/dist/updating/versions.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readManifest } from "../packaging/manifest.js";
|
|
4
|
+
import { MANIFEST_FILE } from "../packaging/layout.js";
|
|
5
|
+
import { installerStamp } from "../version.js";
|
|
6
|
+
// AR: سجلّ ما هو مثبَّت على هذه الآلة (٠٢٦).
|
|
7
|
+
//
|
|
8
|
+
// **لماذا وُجد أصلًا:** profiles/resolve.ts كان يستنتج جذرًا واحدًا — إمّا مستودعٌ تحت المسار
|
|
9
|
+
// الحاليّ أو تثبيتٌ في المكان المعتاد. وهذا يكفي أداةً تخدم منتجًا واحدًا، ولا يكفي **مدير
|
|
10
|
+
// حزم**: من يدير أكثر من منتجٍ يحتاج أن يعرف ماذا رُكِّب، وأين، وبأيّ إصدار، وعلى أيّ منافذ —
|
|
11
|
+
// وأن يعرفه من أيّ مجلدٍ يقف فيه المستخدم.
|
|
12
|
+
//
|
|
13
|
+
// **ProgramData لا مجلد المستخدم**، وللسبب الذي جعل PATH يُسجَّل على مستوى الآلة في
|
|
14
|
+
// packaging/machine-path.ts: جهاز العميل يُستعمل بحساباتٍ مختلفة، وفنّيٌّ يدخل بحسابٍ آخر يجب
|
|
15
|
+
// أن يجد ما ثُبِّت. سجلٌّ في %AppData% يعني نظامًا يعمل أمام عينَي فنّيٍّ ولا تراه أداته.
|
|
16
|
+
//
|
|
17
|
+
// **ومرجعٌ مساعد لا مصدر حقيقة (FR-015).** مصدر الحقيقة شجرة التثبيت وبيانها؛ وهذا الملفّ
|
|
18
|
+
// اختصارُ بحث. فقدانه أو تلفه لا يجوز أن يعطّل نظامًا يعمل — يُعاد بناؤه بالمسح ويُكتب من
|
|
19
|
+
// جديد. هذه هي قاعدة «الفهرس ذاكرةٌ مؤقّتة» من المبدأ الثاني، مطبَّقةً على سجلّ الواجهة.
|
|
20
|
+
// EN: The registry of what is installed on this machine (026).
|
|
21
|
+
//
|
|
22
|
+
// **Why it exists at all:** `profiles/resolve.ts` used to infer a single root — either a
|
|
23
|
+
// repository under the current path or an installation in the usual place. That suffices for a
|
|
24
|
+
// tool serving one product; it does not suffice for a **package manager**: managing more than
|
|
25
|
+
// one product means knowing what was installed, where, at which version and on which ports —
|
|
26
|
+
// and knowing it from whatever directory the user happens to stand in.
|
|
27
|
+
//
|
|
28
|
+
// **`ProgramData`, not the user's folder**, for the reason that put PATH at machine level in
|
|
29
|
+
// `packaging/machine-path.ts`: a customer's appliance is used from different accounts, and a
|
|
30
|
+
// technician signing in as someone else must still find what was installed. A registry under
|
|
31
|
+
// `%AppData%` means a running system in front of a technician that their own tool cannot see.
|
|
32
|
+
//
|
|
33
|
+
// **And a helper index, never a source of truth (FR-015).** The truth is the install tree and
|
|
34
|
+
// its manifest; this file is a shortcut past a search. Losing or corrupting it must never
|
|
35
|
+
// disable a working system — it is rebuilt by scanning and written afresh. This is principle
|
|
36
|
+
// II's "the index is a cache" rule, applied to the CLI's own bookkeeping.
|
|
37
|
+
/** ما نعرف كيف نقرؤه. رقمٌ أعلى يعني ملفًّا كتبته واجهةٌ أحدث — نتوقّف ولا نخمّن. */
|
|
38
|
+
export const REGISTRY_SCHEMA_VERSION = 1;
|
|
39
|
+
export const REGISTRY_DIR = join(process.env.ProgramData ?? "C:\\ProgramData", "Fantastic");
|
|
40
|
+
export const REGISTRY_FILE = join(REGISTRY_DIR, "registry.json");
|
|
41
|
+
/**
|
|
42
|
+
* AR: المواضع التي يُبحَث فيها عند إعادة البناء. **قائمة قصيرة مقصودة**: لا نمسح أقراص العميل
|
|
43
|
+
* بحثًا عن تثبيتاتنا — مسحُ D:\ كاملًا على جهازٍ فيه عشرة تيرابايت وسائط يستغرق دقائق ويبدو
|
|
44
|
+
* للمستخدم تعليقًا. نبحث حيث نُثبِّت، ومن ثبّت في غير ذلك يمرّر --root.
|
|
45
|
+
* EN: Where a rebuild looks. **A deliberately short list**: we do not sweep the customer's disks
|
|
46
|
+
* hunting for our own installations — scanning all of `D:\` on a machine holding ten terabytes
|
|
47
|
+
* of media takes minutes and reads to the user as a hang. We look where we install, and whoever
|
|
48
|
+
* installed elsewhere passes `--root`.
|
|
49
|
+
*/
|
|
50
|
+
const SEARCH_ROOTS = [
|
|
51
|
+
join(process.env.SystemDrive ?? "C:", "\\Fantastic"),
|
|
52
|
+
join(process.env.ProgramFiles ?? "C:\\Program Files", "Fantastic"),
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* AR: قراءة الملفّ الخام. **كل فشلٍ هنا يُقرأ «لا سجلّ» لا «عطل»** — إلّا إصدار مخطّطٍ أحدث.
|
|
56
|
+
*
|
|
57
|
+
* ملفٌّ غير موجود، أو نصفه مكتوب لأن الكهرباء انقطعت أثناء الكتابة، أو JSON تالف: كلّها تعني
|
|
58
|
+
* أن الاختصار ضاع، والجواب إعادةُ بنائه لا إيقافُ المستخدم. أمّا schemaVersion أعلى ممّا
|
|
59
|
+
* نعرف فحالةٌ أخرى تمامًا: **الملفّ سليم ونحن القديمون**، وتخمينُ محتواه قد يمحو تسجيل منتجٍ
|
|
60
|
+
* كتبته واجهةٌ أحدث.
|
|
61
|
+
* EN: Reading the raw file. **Every failure here reads as "no registry", not as "a fault"** — with
|
|
62
|
+
* one exception: a newer schema.
|
|
63
|
+
*
|
|
64
|
+
* A missing file, a half-written one because the power went out mid-write, or corrupt JSON all
|
|
65
|
+
* mean the shortcut is gone, and the answer is to rebuild it rather than to stop the user. A
|
|
66
|
+
* `schemaVersion` higher than we know is an entirely different case: **the file is sound and we
|
|
67
|
+
* are the old ones**, and guessing at its contents could erase a product a newer CLI recorded.
|
|
68
|
+
*/
|
|
69
|
+
function readRaw() {
|
|
70
|
+
if (!existsSync(REGISTRY_FILE))
|
|
71
|
+
return "unreadable";
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(readFileSync(REGISTRY_FILE, "utf8"));
|
|
74
|
+
if (typeof parsed.schemaVersion !== "number")
|
|
75
|
+
return "unreadable";
|
|
76
|
+
if (parsed.schemaVersion > REGISTRY_SCHEMA_VERSION)
|
|
77
|
+
return "newer";
|
|
78
|
+
if (!Array.isArray(parsed.products))
|
|
79
|
+
return "unreadable";
|
|
80
|
+
return { schemaVersion: parsed.schemaVersion, products: parsed.products.filter(isProduct) };
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return "unreadable";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function isProduct(value) {
|
|
87
|
+
if (!value || typeof value !== "object")
|
|
88
|
+
return false;
|
|
89
|
+
const row = value;
|
|
90
|
+
return typeof row.id === "string" && typeof row.root === "string" && typeof row.version === "string";
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* AR: الكتابة **ذرّية**: ملفٌّ مؤقّت ثم إحلال. انقطاع الكهرباء لحظة الكتابة يترك الملفّ القديم
|
|
94
|
+
* كاملًا أو الجديد كاملًا، ولا يترك نصفه — ونصفُ JSON يُقرأ تلفًا فيُعاد البناء بلا داعٍ.
|
|
95
|
+
* نفس ما تفعله supervisor/state-files.ts ولنفس السبب.
|
|
96
|
+
* EN: Writing is **atomic**: a temporary file, then a rename. A power cut mid-write leaves either
|
|
97
|
+
* the whole old file or the whole new one, never half — and half a JSON file reads as corruption
|
|
98
|
+
* and triggers a rebuild for nothing. The same thing `supervisor/state-files.ts` does, for the
|
|
99
|
+
* same reason.
|
|
100
|
+
*/
|
|
101
|
+
function writeRaw(file) {
|
|
102
|
+
mkdirSync(REGISTRY_DIR, { recursive: true });
|
|
103
|
+
const temporary = `${REGISTRY_FILE}.tmp`;
|
|
104
|
+
writeFileSync(temporary, `${JSON.stringify(file, null, 2)}\n`, "utf8");
|
|
105
|
+
rmSync(REGISTRY_FILE, { force: true });
|
|
106
|
+
renameSync(temporary, REGISTRY_FILE);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* AR: يقرأ شجرة تثبيتٍ ويستنتج ما يعرفه عنها. **البيان هو الدليل**: مجلدٌ بلا versions.json
|
|
110
|
+
* صالح ليس تثبيتًا لنا مهما كان اسمه، وقبولُه يُدرِج في السجلّ مجلدًا عشوائيًّا.
|
|
111
|
+
* EN: Reads an install tree and infers what it can. **The manifest is the proof**: a directory
|
|
112
|
+
* without a valid `versions.json` is not one of our installations whatever it is called, and
|
|
113
|
+
* accepting it would list a random folder in the registry.
|
|
114
|
+
*/
|
|
115
|
+
export function inspectRoot(root, id = "estraha") {
|
|
116
|
+
if (!existsSync(join(root, MANIFEST_FILE)))
|
|
117
|
+
return undefined;
|
|
118
|
+
const manifest = readManifest(root);
|
|
119
|
+
if (!manifest)
|
|
120
|
+
return undefined;
|
|
121
|
+
let ports = { core: 80, live: 8081 };
|
|
122
|
+
try {
|
|
123
|
+
const config = JSON.parse(readFileSync(join(root, "config.json"), "utf8"));
|
|
124
|
+
ports = { core: config.corePort ?? ports.core, live: config.livePort ?? ports.live };
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// إعداداتٌ غير مقروءة لا تُسقط تثبيتًا موجودًا؛ المنافذ الافتراضية تُعرَض ويصحّحها doctor.
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
id,
|
|
131
|
+
version: manifest.bundle.version,
|
|
132
|
+
root,
|
|
133
|
+
ports,
|
|
134
|
+
installedAt: manifest.bundle.builtAt,
|
|
135
|
+
installedBy: installerStamp(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* AR: يعيد بناء السجلّ من الأنظمة نفسها. يُستدعى حين يضيع الملفّ أو يتلف، **ولا يُستدعى في كل
|
|
140
|
+
* أمر**: المسح أبطأ من قراءة ملفّ، والاختصار الذي يُحسَب في كل مرّة ليس اختصارًا.
|
|
141
|
+
* EN: Rebuilds the registry from the installations themselves. Called when the file is lost or
|
|
142
|
+
* corrupt, **not on every command**: scanning is slower than reading a file, and a shortcut
|
|
143
|
+
* recomputed every time is not a shortcut.
|
|
144
|
+
*/
|
|
145
|
+
export function rebuild(extraRoots = []) {
|
|
146
|
+
const found = [];
|
|
147
|
+
for (const root of [...SEARCH_ROOTS, ...extraRoots]) {
|
|
148
|
+
const product = inspectRoot(root);
|
|
149
|
+
if (product && !found.some((row) => row.root.toLowerCase() === product.root.toLowerCase())) {
|
|
150
|
+
found.push(product);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return found;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* AR: **القراءة الوحيدة التي تُستعمل في الأوامر.** تقرأ، وتُسقط ما لم يعد موجودًا على القرص،
|
|
157
|
+
* وتعيد البناء عند الحاجة.
|
|
158
|
+
*
|
|
159
|
+
* وإسقاطُ الجذر المفقود مقصود: قرصٌ نُزع أو مجلدٌ حُذف بيد أحدهم يترك قيدًا يشير إلى لا شيء،
|
|
160
|
+
* وأمرُ حالةٍ يقرؤه يُبلّغ عن نظامٍ لا وجود له. ولا يُحذف القيد من الملفّ في القراءة — القراءة
|
|
161
|
+
* لا تكتب؛ يسقط من الجواب، ويُكتب الملفّ عند أول تسجيلٍ أو إزالة.
|
|
162
|
+
* EN: **The only read the commands use.** It reads, drops what no longer exists on disk, and
|
|
163
|
+
* rebuilds when it must.
|
|
164
|
+
*
|
|
165
|
+
* Dropping a missing root is deliberate: an unplugged disk or a folder somebody deleted leaves
|
|
166
|
+
* an entry pointing at nothing, and a status command reading it reports an appliance that does
|
|
167
|
+
* not exist. The entry is not deleted from the file during a read — reads do not write; it is
|
|
168
|
+
* dropped from the answer, and the file is rewritten at the next record or removal.
|
|
169
|
+
*/
|
|
170
|
+
export function readRegistry() {
|
|
171
|
+
const raw = readRaw();
|
|
172
|
+
if (raw === "newer")
|
|
173
|
+
return { products: [], rebuilt: false, newerSchema: true };
|
|
174
|
+
if (raw === "unreadable") {
|
|
175
|
+
const products = rebuild();
|
|
176
|
+
// AR: **الكتابة قد تفشل، والفشل لا يجوز أن يُسقط أمرًا.**
|
|
177
|
+
//
|
|
178
|
+
// %ProgramData%\Fantastic تحتاج صلاحيات مسؤول للكتابة على أغلب الأجهزة، وهذه الدالّة
|
|
179
|
+
// تُنادى من استنتاج ملفّ التشغيل — أي من **كل أمر**. فحسابٌ عاديّ يكتب fantastic status
|
|
180
|
+
// على جهازٍ ضاع سجلّه كان سيرى EPERM خامًّا بدل حالة النظام.
|
|
181
|
+
//
|
|
182
|
+
// وهذا بالضبط ما ينقضه تعليق هذا الملفّ نفسه: «فقدانه أو تلفه لا يجوز أن يعطّل نظامًا
|
|
183
|
+
// يعمل». والفقدان كان محروسًا، وفشلُ **الكتابة** لم يكن — والقاعدة واحدة: الحفظ اختصارٌ،
|
|
184
|
+
// وتعذّرُه يعني إعادة المسح في المرّة القادمة لا توقّف الأمر الآن.
|
|
185
|
+
// EN: **The write can fail, and its failure must not bring down a command.**
|
|
186
|
+
//
|
|
187
|
+
// `%ProgramData%\Fantastic` needs administrator rights to write on most machines, and this
|
|
188
|
+
// function is called from profile resolution — that is, from **every command**. So an
|
|
189
|
+
// ordinary account typing `fantastic status` on a machine whose registry was lost would see a
|
|
190
|
+
// raw `EPERM` instead of the system's state.
|
|
191
|
+
//
|
|
192
|
+
// Which is precisely what this file's own comment forbids: "losing or corrupting it must
|
|
193
|
+
// never disable a working system". Loss was guarded; a failed **write** was not — and the
|
|
194
|
+
// rule is the same: saving is a shortcut, and being unable to means rescanning next time
|
|
195
|
+
// rather than stopping the command now.
|
|
196
|
+
if (products.length > 0) {
|
|
197
|
+
try {
|
|
198
|
+
writeRaw({ schemaVersion: REGISTRY_SCHEMA_VERSION, products });
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// لا شيء يُقال هنا: المسح أعطى الجواب، والحفظ وحده هو ما تعذّر.
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { products, rebuilt: true, newerSchema: false };
|
|
205
|
+
}
|
|
206
|
+
const alive = raw.products.filter((product) => existsSync(join(product.root, MANIFEST_FILE)));
|
|
207
|
+
return { products: alive, rebuilt: false, newerSchema: false };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* AR: يسجّل منتجًا بعد **نجاح** تثبيته. الموضع في install.ts مقصود: بعد PATH ومهمّة الإقلاع، مع
|
|
211
|
+
* بقيّة الآثار خارج مجلد التثبيت — فتثبيتٌ فشل وتراجع لا يترك قيدًا يشير إلى شجرةٍ حُذفت.
|
|
212
|
+
* EN: Records a product after its installation **succeeded**. Its placement in `install.ts` is
|
|
213
|
+
* deliberate: after PATH and the boot task, with the rest of the traces outside the install
|
|
214
|
+
* directory — so a failed, rolled-back install leaves no entry pointing at a deleted tree.
|
|
215
|
+
*/
|
|
216
|
+
export function recordInstall(product) {
|
|
217
|
+
const current = readRaw();
|
|
218
|
+
const products = current === "unreadable" || current === "newer" ? rebuild() : current.products;
|
|
219
|
+
const without = products.filter((row) => row.id !== product.id);
|
|
220
|
+
writeRaw({ schemaVersion: REGISTRY_SCHEMA_VERSION, products: [...without, product] });
|
|
221
|
+
}
|
|
222
|
+
/** يزيل قيد منتجٍ بعد نجاح إزالته. غيابه أصلًا ليس خطأً — الغاية بلوغ حالةٍ لا تنفيذ خطوة. */
|
|
223
|
+
export function forgetInstall(id) {
|
|
224
|
+
const current = readRaw();
|
|
225
|
+
if (current === "unreadable" || current === "newer")
|
|
226
|
+
return;
|
|
227
|
+
writeRaw({
|
|
228
|
+
schemaVersion: REGISTRY_SCHEMA_VERSION,
|
|
229
|
+
products: current.products.filter((row) => row.id !== id),
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* AR: منتجٌ واحد يُستنتَج، وأكثر يُطلب تحديده. **ولا يُخمَّن عند التعدّد**: أمرُ إيقافٍ يصيب
|
|
234
|
+
* الجهاز الخطأ في استراحةٍ تعمل أسوأ من أمرٍ يسأل.
|
|
235
|
+
* EN: One product is inferred; more than one must be named. **Never guessed when there are
|
|
236
|
+
* several**: a stop command hitting the wrong appliance in a working rest-house is worse than a
|
|
237
|
+
* command that asks.
|
|
238
|
+
*/
|
|
239
|
+
export function resolveProduct(products, requested) {
|
|
240
|
+
if (requested) {
|
|
241
|
+
const match = products.find((row) => row.id === requested);
|
|
242
|
+
return { product: match, ambiguous: false, unknown: !match };
|
|
243
|
+
}
|
|
244
|
+
if (products.length === 1)
|
|
245
|
+
return { product: products[0], ambiguous: false, unknown: false };
|
|
246
|
+
return { ambiguous: products.length > 1, unknown: products.length === 0 };
|
|
247
|
+
}
|
|
248
|
+
/** يُستعمل في الاختبارات وحدها: يمسح الملفّ. لا أمر ينادي هذه. */
|
|
249
|
+
export function forgetEverything() {
|
|
250
|
+
rmSync(REGISTRY_FILE, { force: true });
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=local-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-registry.js","sourceRoot":"","sources":["../../src/registry/local-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type BrandContext } from "./brand.js";
|
|
2
|
+
export type BannerContext = BrandContext & {
|
|
3
|
+
/** يُعرَض تحت الشعار حين يُعرَف: «Welcome back, …». غيابه يعني ترحيبًا عامًّا لا اسمًا مخترَعًا. */
|
|
4
|
+
ownerName?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* البانر الكامل: الشعار، ثم الاسم والوصف، ثم الترحيب والسياق.
|
|
8
|
+
*
|
|
9
|
+
* يُعيد نصًّا فارغًا خارج الطرفية — زخرفةٌ داخل أنبوب تُفسد المخرَج الذي يقرؤه سكربت، والصمت هناك
|
|
10
|
+
* أصدق من الجمال (نفس قاعدة renderBrand).
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderBanner(context?: BannerContext): string;
|
|
13
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/render/banner.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAyDhE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG;IACzC,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAoBhE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { c, isTty } from "./theme.js";
|
|
2
|
+
import { renderBrandLine } from "./brand.js";
|
|
3
|
+
// AR: بانر الافتتاح. الشعار مولَّد بـ figlet (خطّ ANSI Shadow) **مرّة واحدة وقت الكتابة، ومثبَّت
|
|
4
|
+
// هنا ثابتًا** — لا تُستدعى المكتبة وقت التشغيل. ثلاثة أسباب مقيسة لا تفضيل:
|
|
5
|
+
// ١. الكلمة واحدة لا تتغيّر. جلب مكتبة تقرأ ملفّ خطّ وتحلّله عند **كل** استدعاء لأمر يُكتب
|
|
6
|
+
// عشرات المرّات في اليوم ثمنٌ يُدفع دائمًا مقابل نتيجة ثابتة.
|
|
7
|
+
// ٢. حزمة الجهاز تُبنى لتُثبَّت بلا إنترنت؛ كل اعتمادية إضافية ملفّاتٌ تُشحن وتُقلَّم وتُدقَّق.
|
|
8
|
+
// ٣. claude code وgemini cli — وهما المرجعان المطلوبان — يشحنان رسمًا مُعدًّا سلفًا لا
|
|
9
|
+
// مولِّدًا وقت التشغيل، للسبب الأول نفسه.
|
|
10
|
+
// أي أن المكتبة عملت عملها مرّة، ونتيجتها هي ما شُحن.
|
|
11
|
+
//
|
|
12
|
+
// **وهذا يعكس قرارًا سابقًا مكتوبًا في brand.ts** («لا figlet، فهي تجعل كل CLI يشبه غيره»).
|
|
13
|
+
// ذاك القرار كان عن **الطابع**، وهو صحيح عن مولِّد عام يُستدعى بخطّ افتراضي؛ أما شعارٌ مُعدّ
|
|
14
|
+
// ومصوغ بألواننا فهو علامتنا لا علامةَ أداةٍ عامّة. سطر العلامة المضغوط باقٍ كما هو ويُستعمل
|
|
15
|
+
// حيث لا يتّسع البانر.
|
|
16
|
+
// EN: The opening banner. The wordmark is figlet-generated (ANSI Shadow) **once at authoring time and
|
|
17
|
+
// frozen here as a constant** — the library is never called at runtime. Three measured reasons,
|
|
18
|
+
// not a preference:
|
|
19
|
+
// 1. The word never changes. Pulling in a library that reads and parses a font file on **every**
|
|
20
|
+
// invocation of a command typed dozens of times a day is a permanent cost for a fixed result.
|
|
21
|
+
// 2. The appliance bundle is built to install with no internet; every extra dependency is files
|
|
22
|
+
// to ship, prune and audit.
|
|
23
|
+
// 3. claude code and gemini cli — the two references asked for — ship pre-rendered art rather
|
|
24
|
+
// than a runtime generator, for the same first reason.
|
|
25
|
+
// The library did its work once; what ships is its output.
|
|
26
|
+
//
|
|
27
|
+
// **This reverses an earlier decision written in brand.ts** ("no figlet, it makes every CLI look
|
|
28
|
+
// like every other"). That decision was about *character*, and it is right about a generic
|
|
29
|
+
// generator called with a default font; a wordmark that is authored and coloured in our own
|
|
30
|
+
// palette is our mark, not a generic tool's. The compact brand line stays and is used wherever
|
|
31
|
+
// the banner does not fit.
|
|
32
|
+
/**
|
|
33
|
+
* ANSI Shadow لكلمة Fantastic. عرضه 71 عمودًا، وهو ما تقيس عليه MIN_BANNER_COLUMNS أدناه.
|
|
34
|
+
* لا يُحرَّر بيد: يُعاد توليده بنفس الخطّ إن تغيّر الاسم.
|
|
35
|
+
*/
|
|
36
|
+
const WORDMARK_ART = [
|
|
37
|
+
"███████╗ █████╗ ███╗ ██╗████████╗ █████╗ ███████╗████████╗██╗ ██████╗",
|
|
38
|
+
"██╔════╝██╔══██╗████╗ ██║╚══██╔══╝██╔══██╗██╔════╝╚══██╔══╝██║██╔════╝",
|
|
39
|
+
"█████╗ ███████║██╔██╗ ██║ ██║ ███████║███████╗ ██║ ██║██║",
|
|
40
|
+
"██╔══╝ ██╔══██║██║╚██╗██║ ██║ ██╔══██║╚════██║ ██║ ██║██║",
|
|
41
|
+
"██║ ██║ ██║██║ ╚████║ ██║ ██║ ██║███████║ ██║ ██║╚██████╗",
|
|
42
|
+
"╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝",
|
|
43
|
+
];
|
|
44
|
+
const ART_COLUMNS = 71;
|
|
45
|
+
const GUTTER = " ";
|
|
46
|
+
/**
|
|
47
|
+
* أضيق طرفية يُرسَم فيها البانر. تحتها **يُستبدَل لا يُقصّ**: رسمٌ ملفوف على سطرين ركامُ رموز لا
|
|
48
|
+
* شعار، وسطر العلامة المضغوط يقول الشيء نفسه ويقرأ في أي عرض.
|
|
49
|
+
*/
|
|
50
|
+
const MIN_BANNER_COLUMNS = ART_COLUMNS + GUTTER.length + 1;
|
|
51
|
+
const PRODUCT_NAME = "Fantastic Media";
|
|
52
|
+
const TAGLINE = "Your rest house's own cinema — served from this machine, over your own network.";
|
|
53
|
+
function terminalColumns() {
|
|
54
|
+
return process.stdout.columns ?? 0;
|
|
55
|
+
}
|
|
56
|
+
function welcomeLine(ownerName) {
|
|
57
|
+
return ownerName ? `Welcome back, ${ownerName}.` : "Welcome.";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* البانر الكامل: الشعار، ثم الاسم والوصف، ثم الترحيب والسياق.
|
|
61
|
+
*
|
|
62
|
+
* يُعيد نصًّا فارغًا خارج الطرفية — زخرفةٌ داخل أنبوب تُفسد المخرَج الذي يقرؤه سكربت، والصمت هناك
|
|
63
|
+
* أصدق من الجمال (نفس قاعدة renderBrand).
|
|
64
|
+
*/
|
|
65
|
+
export function renderBanner(context = {}) {
|
|
66
|
+
if (!isTty)
|
|
67
|
+
return "";
|
|
68
|
+
const details = [context.profile, context.version, context.root].filter(Boolean).join(c.dim(" · "));
|
|
69
|
+
// طرفية ضيّقة: السطر المضغوط بدل رسمٍ ينكسر.
|
|
70
|
+
if (terminalColumns() < MIN_BANNER_COLUMNS) {
|
|
71
|
+
return ["", ` ${renderBrandLine(context)}`, ` ${c.dim(welcomeLine(context.ownerName))}`, ""].join("\n");
|
|
72
|
+
}
|
|
73
|
+
const art = WORDMARK_ART.map((row) => `${GUTTER}${c.accent(row)}`);
|
|
74
|
+
return [
|
|
75
|
+
"",
|
|
76
|
+
...art,
|
|
77
|
+
"",
|
|
78
|
+
` ${c.label(PRODUCT_NAME)} ${c.dim(TAGLINE)}`,
|
|
79
|
+
` ${welcomeLine(context.ownerName)}${details ? ` ${c.dim(details)}` : ""}`,
|
|
80
|
+
"",
|
|
81
|
+
].join("\n");
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/render/banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAEhE,qGAAqG;AACrG,iFAAiF;AACjF,iGAAiG;AACjG,uEAAuE;AACvE,sGAAsG;AACtG,iGAAiG;AACjG,mDAAmD;AACnD,0DAA0D;AAC1D,EAAE;AACF,kGAAkG;AAClG,iGAAiG;AACjG,iGAAiG;AACjG,2BAA2B;AAC3B,sGAAsG;AACtG,oGAAoG;AACpG,wBAAwB;AACxB,uGAAuG;AACvG,uGAAuG;AACvG,sGAAsG;AACtG,qCAAqC;AACrC,oGAAoG;AACpG,gEAAgE;AAChE,+DAA+D;AAC/D,EAAE;AACF,qGAAqG;AACrG,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,+BAA+B;AAE/B;;;GAGG;AACH,MAAM,YAAY,GAAG;IACnB,yEAAyE;IACzE,yEAAyE;IACzE,oEAAoE;IACpE,oEAAoE;IACpE,yEAAyE;IACzE,yEAAyE;CACjE,CAAC;AAEX,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,MAAM,GAAG,GAAG,CAAC;AAEnB;;;GAGG;AACH,MAAM,kBAAkB,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3D,MAAM,YAAY,GAAG,iBAAiB,CAAC;AACvC,MAAM,OAAO,GAAG,iFAAiF,CAAC;AAOlG,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,SAA6B;IAChD,OAAO,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpG,6CAA6C;IAC7C,IAAI,eAAe,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC3C,OAAO,CAAC,EAAE,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEnE,OAAO;QACL,EAAE;QACF,GAAG,GAAG;QACN,EAAE;QACF,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC/C,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5E,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { networkInterfaces } from "node:os";
|
|
2
|
+
import type { DeviceInfo } from "../contracts/core.js";
|
|
3
|
+
import type { Profile } from "../profiles/types.js";
|
|
4
|
+
import type { PortConflict } from "../probes/port.probe.js";
|
|
5
|
+
import type { StartOutcome, StopStep } from "../supervisor/orchestrator.js";
|
|
6
|
+
/**
|
|
7
|
+
* AR: عناوين هذه الآلة على الشبكة، **مرتّبةً بالأرجحية**.
|
|
8
|
+
*
|
|
9
|
+
* كانت الدالّة تُعيد «أوّل عنوان IPv4 غير محلّي» — وهو ترتيبُ ويندوز لبطاقاته لا ترتيبُ
|
|
10
|
+
* صلاحيتها. على آلة الاختبار كان الأوّل 192.168.56.1 (بطاقة VirtualBox المضيفة) بينما
|
|
11
|
+
* الشبكة الحقيقية 192.168.1.6 على الواي-فاي؛ فالسطر المعروض للمالك ليكتبه في هاتفه كان
|
|
12
|
+
* عنوانًا **لا يفتح شيئًا من أي هاتف** — وهو أسوأ من غياب السطر، لأن الفشل يُقرأ عطبًا في
|
|
13
|
+
* النظام لا خطأً في العنوان.
|
|
14
|
+
* EN: This machine's addresses on the network, **ordered by likelihood**.
|
|
15
|
+
*
|
|
16
|
+
* The function used to return "the first non-internal IPv4" — which is Windows' ordering of its
|
|
17
|
+
* cards, not an ordering of their usefulness. On the test machine the first was `192.168.56.1`
|
|
18
|
+
* (VirtualBox's host-only card) while the real network was `192.168.1.6` over Wi-Fi; so the line
|
|
19
|
+
* printed for the owner to type into his phone was an address that **opens nothing from any
|
|
20
|
+
* phone** — worse than no line at all, because the failure reads as a fault in the system rather
|
|
21
|
+
* than a wrong address.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lanAddresses(): string[];
|
|
24
|
+
/** نواة الترتيب، مفصولةً عن os لتُختبَر بواجهاتٍ مُصطنعة بدل شبكة آلة البناء. */
|
|
25
|
+
export declare function rankLanAddresses(interfaces: ReturnType<typeof networkInterfaces>): string[];
|
|
26
|
+
/** أرجح عنوان: هو ما يكتبه المالك في هاتفه للدخول على الجهاز من الشبكة. */
|
|
27
|
+
export declare function lanAddress(): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* AR: عنوان شاشة التفعيل على هذه الآلة. يُطبع كلّما كان الجهاز محجوبًا: **الرسالة التي تقول
|
|
30
|
+
* «غير مفعَّل» بلا عنوانٍ يُفتح تترك الفنّي يخمّن المسار.** undefined حين لا منفذ في
|
|
31
|
+
* ملفّ التشغيل أصلًا.
|
|
32
|
+
* EN: The activation screen's address on this machine. Printed whenever the appliance is blocked:
|
|
33
|
+
* **a message saying "not activated" without an address to open leaves the technician guessing
|
|
34
|
+
* the path.** `undefined` when the profile has no port at all.
|
|
35
|
+
*/
|
|
36
|
+
export declare function activationUrl(profile: Profile): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* AR: العناوين الأربعة التي يحتاجها من يقف أمام الجهاز — **وهي أربعة لا اثنان**.
|
|
39
|
+
*
|
|
40
|
+
* Portal ما يفتحه الضيف، وLogin باب المالك، وDashboard اللوحة نفسها بعد الدخول،
|
|
41
|
+
* وNetwork العنوان الذي يُكتب في هاتفٍ على شبكة الاستراحة. كان السطران الأخيران غائبين:
|
|
42
|
+
* المالك يعرف أن ثمّة لوحة ولا يعرف مسارها، ومن أراد الاختبار من جوّاله كان يقرأ
|
|
43
|
+
* localhost — وهو على جهازه هو، لا على الجهاز.
|
|
44
|
+
* EN: The four addresses whoever stands at the machine needs — **four rather than two**.
|
|
45
|
+
*
|
|
46
|
+
* `Portal` is what a guest opens, `Login` the owner's door, `Dashboard` the panel itself once
|
|
47
|
+
* signed in, and `Network` the address typed into a phone on the rest-house network. The last
|
|
48
|
+
* two were missing: the owner knew a dashboard existed without knowing its path, and anyone
|
|
49
|
+
* testing from a phone read `localhost` — which is their own device, not the appliance.
|
|
50
|
+
*/
|
|
51
|
+
export type PortalUrls = {
|
|
52
|
+
portal: string;
|
|
53
|
+
login: string;
|
|
54
|
+
dashboard: string;
|
|
55
|
+
/** null حين لا واجهة شبكة خارجية على هذه الآلة — لا عنوان يُكتب في هاتف. */
|
|
56
|
+
network: string | null;
|
|
57
|
+
/**
|
|
58
|
+
* AR: بقيّة عناوين الآلة، مرتّبةً. **الترتيب ترجيحٌ لا يقين**، فآلةٌ عليها بطاقتان حقيقيّتان
|
|
59
|
+
* (سلكية وواي-فاي) لا يعرف أحد أيّهما على شبكة الضيوف. طباعتها تجعل العنوان الخاطئ سطرًا
|
|
60
|
+
* يُجرَّب غيرُه، لا طريقًا مسدودًا يُقرأ عطبًا في النظام.
|
|
61
|
+
* EN: The machine's remaining addresses, in order. **The ranking is a guess, not a certainty**, and
|
|
62
|
+
* on a machine with two real cards (wired and Wi-Fi) nobody knows which one is on the guest
|
|
63
|
+
* network. Printing them turns a wrong address into a line with an alternative beside it,
|
|
64
|
+
* rather than a dead end that reads as a fault in the system.
|
|
65
|
+
*/
|
|
66
|
+
networkAlternates: string[];
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* AR: العناوين كبيانات لا كنصّ مرسوم. مصدرٌ واحد يقرأه الجدولُ في الطرفية و--json معًا، فلا
|
|
70
|
+
* يقول أحدهما /admin ويسكت الآخر عنه يوم يتغيّر مسار.
|
|
71
|
+
* EN: The addresses as data rather than drawn text. One source read by both the terminal table and
|
|
72
|
+
* `--json`, so one of them cannot say `/admin` while the other stays silent about it the day a
|
|
73
|
+
* path changes.
|
|
74
|
+
*/
|
|
75
|
+
export declare function portalUrls(profile: Profile): PortalUrls | null;
|
|
76
|
+
export declare function renderUrls(profile: Profile): string;
|
|
77
|
+
/**
|
|
78
|
+
* AR: تنبيه الجهاز المحجوب — يُطبع في start وstatus معًا، ويغيب تمامًا حين تكون الرخصة سارية.
|
|
79
|
+
*
|
|
80
|
+
* **هذا هو السطر الذي كان ناقصًا.** الخدمات تُقلع على جهاز بلا رخصة — وهذا مقصود: النواة
|
|
81
|
+
* يجب أن تعمل ليُفتَح المتصفّح على شاشة التفعيل أصلًا، وإيقاف الإقلاع كان سيمنع العلاج مع
|
|
82
|
+
* المرض. لكن الطرفية كانت تقول «كل شيء يعمل» وتنتهي، فيفتح المالك البوّابة ويجد واجهةً
|
|
83
|
+
* تنهار على كل نداء بلا كلمةٍ واحدة تشرح لماذا.
|
|
84
|
+
*
|
|
85
|
+
* null حين لا شيء يُقال: رخصةٌ سارية، أو نواةٌ لم تُسأل بعد (device === null) — والادّعاء
|
|
86
|
+
* بأن الجهاز غير مفعَّل لأننا لم نستطع السؤال كذبةٌ بنفس حجم إخفاء الحقيقة.
|
|
87
|
+
*
|
|
88
|
+
* EN: The blocked-appliance notice — printed by both `start` and `status`, and absent entirely when
|
|
89
|
+
* the licence is valid.
|
|
90
|
+
*
|
|
91
|
+
* **This is the line that was missing.** The services do start on an unlicensed machine, and
|
|
92
|
+
* that is deliberate: the core must run for a browser to reach the activation screen at all, and
|
|
93
|
+
* refusing to boot would withhold the cure along with the disease. But the terminal said
|
|
94
|
+
* "everything is running" and stopped there, so the owner opened the portal and found an
|
|
95
|
+
* interface collapsing on every call without one word explaining why.
|
|
96
|
+
*
|
|
97
|
+
* `null` when there is nothing to say: a valid licence, or a core that was never asked
|
|
98
|
+
* (`device === null`) — claiming the machine is unactivated because we could not ask is a lie of
|
|
99
|
+
* exactly the same size as hiding the truth.
|
|
100
|
+
*/
|
|
101
|
+
export declare function renderActivationNotice(profile: Profile, device: DeviceInfo | null): string | null;
|
|
102
|
+
/**
|
|
103
|
+
* AR: سطر الباقة عند الإقلاع — **يُطبع حين تكون هناك خدمةٌ غير مشمولة، ويُسكت حين تكون الباقة
|
|
104
|
+
* شاملة.** سطرٌ يقول «كل شيء مشمول» في كل إقلاع ضجيجٌ يُتعلَّم تجاهله، ثم يُتجاهَل معه السطر
|
|
105
|
+
* الذي كان يهمّ.
|
|
106
|
+
*
|
|
107
|
+
* ومن يقرأ مخرَج start ثم يبحث عن خدمةٍ لا تعمل يجب أن يجد السبب هنا لا بعد ساعة من
|
|
108
|
+
* التشخيص: خدمة البث المباشر التي «لا تستجيب» قد تكون ببساطة خارج الباقة، والفرق بين
|
|
109
|
+
* التشخيصين هو الفرق بين مكالمة مبيعات وليلةٍ ضائعة.
|
|
110
|
+
* EN: The package line at boot — **printed when some service is not included, and silent when the
|
|
111
|
+
* package covers everything.** A line saying "everything is included" on every boot is noise
|
|
112
|
+
* that gets learned and ignored, and the line that mattered gets ignored with it.
|
|
113
|
+
*
|
|
114
|
+
* And whoever reads `start`'s output and then goes looking for a service that is not running
|
|
115
|
+
* should find the reason here rather than an hour into diagnosis: a live service that "does not
|
|
116
|
+
* respond" may simply be outside the package, and the difference between those two diagnoses is
|
|
117
|
+
* the difference between a sales call and a lost night.
|
|
118
|
+
*/
|
|
119
|
+
export declare function renderPackageNotice(device: DeviceInfo | null): string | null;
|
|
120
|
+
export declare function renderConflicts(conflicts: PortConflict[]): string;
|
|
121
|
+
export declare function renderStartOutcome(outcome: StartOutcome): string;
|
|
122
|
+
export declare function renderStopOutcome(steps: StopStep[]): string;
|
|
123
|
+
//# sourceMappingURL=boot.render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.render.d.ts","sourceRoot":"","sources":["../../src/render/boot.render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAwD5E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM,EAAE,CAa3F;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAmBD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGlE;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAc9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqBnD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAcjG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAa5E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAajE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA2BhE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CA0B3D"}
|