@sirenodeck/sirenodeck 0.1.1-alpha.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/LICENSE +21 -0
- package/README.md +69 -0
- package/bin/_wrapper-shared.js +42 -0
- package/bin/dev.js +95 -0
- package/bin/sirenodeck.js +42 -0
- package/config/default-config.yml +117 -0
- package/config/starter-config.yml +54 -0
- package/dist/main.mjs +64702 -0
- package/package.json +140 -0
- package/src/action/executor.ts +156 -0
- package/src/action/index.ts +7 -0
- package/src/addon/api-types.ts +15 -0
- package/src/addon/api.ts +461 -0
- package/src/addon/check-runner.ts +84 -0
- package/src/addon/index.ts +5 -0
- package/src/addon/loader.ts +441 -0
- package/src/addon/registry.ts +230 -0
- package/src/addon/spec.ts +69 -0
- package/src/api/addon.ts +33 -0
- package/src/api/asset-url.ts +24 -0
- package/src/api/index.ts +50 -0
- package/src/api/protocol-internal.ts +656 -0
- package/src/api/protocol.ts +2 -0
- package/src/api/react/index.ts +11 -0
- package/src/api/react/registry.ts +91 -0
- package/src/api/react/use-addon-channel.ts +26 -0
- package/src/api/react/use-button-state.tsx +23 -0
- package/src/api/react/use-deck.ts +24 -0
- package/src/assets/logo.png +0 -0
- package/src/assets/logo72x72.png +0 -0
- package/src/assets/logoFull.png +0 -0
- package/src/builtin-addons/brightness/README.md +51 -0
- package/src/builtin-addons/brightness/buttons/brightness/backend.ts +13 -0
- package/src/builtin-addons/brightness/buttons/brightness/config.ts +10 -0
- package/src/builtin-addons/brightness/buttons/brightness/frontend.tsx +50 -0
- package/src/builtin-addons/brightness/domain/macos.ts +46 -0
- package/src/builtin-addons/brightness/index.d.ts +5 -0
- package/src/builtin-addons/brightness/index.ts +20 -0
- package/src/builtin-addons/brightness/poller.ts +27 -0
- package/src/builtin-addons/brightness/providers/darwin.ts +107 -0
- package/src/builtin-addons/brightness/providers/index.ts +81 -0
- package/src/builtin-addons/brightness/providers/linux.ts +108 -0
- package/src/builtin-addons/brightness/providers/windows.ts +77 -0
- package/src/builtin-addons/brightness/sirenodeck.json +6 -0
- package/src/builtin-addons/coding-agents/assets/claude-code.svg +1 -0
- package/src/builtin-addons/coding-agents/assets/opencode-dark-square.svg +1 -0
- package/src/builtin-addons/coding-agents/buttons/agent/backend.ts +82 -0
- package/src/builtin-addons/coding-agents/buttons/agent/config.ts +13 -0
- package/src/builtin-addons/coding-agents/buttons/agent/frontend.tsx +130 -0
- package/src/builtin-addons/coding-agents/buttons/agent/pages.tsx +150 -0
- package/src/builtin-addons/coding-agents/buttons/summary/backend.ts +48 -0
- package/src/builtin-addons/coding-agents/buttons/summary/config.ts +11 -0
- package/src/builtin-addons/coding-agents/buttons/summary/frontend.tsx +254 -0
- package/src/builtin-addons/coding-agents/decks/agents.ts +69 -0
- package/src/builtin-addons/coding-agents/global/backend.ts +402 -0
- package/src/builtin-addons/coding-agents/global-entry.ts +7 -0
- package/src/builtin-addons/coding-agents/hook/script.ts +123 -0
- package/src/builtin-addons/coding-agents/index.ts +15 -0
- package/src/builtin-addons/coding-agents/manifest.ts +115 -0
- package/src/builtin-addons/coding-agents/providers/claude-code.ts +470 -0
- package/src/builtin-addons/coding-agents/providers/claude-instances.ts +184 -0
- package/src/builtin-addons/coding-agents/providers/opencode-instances.ts +108 -0
- package/src/builtin-addons/coding-agents/providers/opencode.ts +636 -0
- package/src/builtin-addons/coding-agents/providers/registry.ts +120 -0
- package/src/builtin-addons/coding-agents/providers/spawn.ts +112 -0
- package/src/builtin-addons/coding-agents/shared/claude-hook-events.ts +55 -0
- package/src/builtin-addons/coding-agents/shared/claude-status.ts +236 -0
- package/src/builtin-addons/coding-agents/shared/live-count.ts +39 -0
- package/src/builtin-addons/coding-agents/shared/notifier.ts +58 -0
- package/src/builtin-addons/coding-agents/shared/opencode-status.ts +82 -0
- package/src/builtin-addons/coding-agents/shared/snapshot.ts +66 -0
- package/src/builtin-addons/coding-agents/shared/state.ts +72 -0
- package/src/builtin-addons/coding-agents/sirenodeck.json +6 -0
- package/src/builtin-addons/coding-agents/types/types.ts +33 -0
- package/src/builtin-addons/core/README.md +89 -0
- package/src/builtin-addons/core/buttons/action/backend.ts +7 -0
- package/src/builtin-addons/core/buttons/action/config.ts +13 -0
- package/src/builtin-addons/core/buttons/action/frontend.tsx +16 -0
- package/src/builtin-addons/core/buttons/change-deck/backend.ts +18 -0
- package/src/builtin-addons/core/buttons/change-deck/config.ts +15 -0
- package/src/builtin-addons/core/buttons/change-deck/frontend.tsx +18 -0
- package/src/builtin-addons/core/buttons/media-sample/backend.ts +8 -0
- package/src/builtin-addons/core/buttons/media-sample/config.ts +7 -0
- package/src/builtin-addons/core/buttons/media-sample/frontend.tsx +2 -0
- package/src/builtin-addons/core/buttons/page-nav/backend.ts +28 -0
- package/src/builtin-addons/core/buttons/page-nav/config.ts +9 -0
- package/src/builtin-addons/core/buttons/page-nav/frontend.tsx +68 -0
- package/src/builtin-addons/core/buttons/toggle/backend.ts +119 -0
- package/src/builtin-addons/core/buttons/toggle/config.ts +57 -0
- package/src/builtin-addons/core/buttons/toggle/frontend.tsx +57 -0
- package/src/builtin-addons/core/buttons/toggle/global-service.ts +174 -0
- package/src/builtin-addons/core/index.ts +120 -0
- package/src/builtin-addons/core/sirenodeck.json +6 -0
- package/src/builtin-addons/date-time/README.md +73 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/config.ts +4 -0
- package/src/builtin-addons/date-time/buttons/analog-clock/frontend.tsx +88 -0
- package/src/builtin-addons/date-time/buttons/custom/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/custom/config.ts +9 -0
- package/src/builtin-addons/date-time/buttons/custom/frontend.tsx +26 -0
- package/src/builtin-addons/date-time/buttons/date/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/date/config.ts +10 -0
- package/src/builtin-addons/date-time/buttons/date/frontend.tsx +42 -0
- package/src/builtin-addons/date-time/buttons/time/backend.ts +10 -0
- package/src/builtin-addons/date-time/buttons/time/config.ts +9 -0
- package/src/builtin-addons/date-time/buttons/time/frontend.tsx +29 -0
- package/src/builtin-addons/date-time/index.d.ts +5 -0
- package/src/builtin-addons/date-time/index.ts +30 -0
- package/src/builtin-addons/date-time/poller.ts +11 -0
- package/src/builtin-addons/date-time/shared/format-date.ts +36 -0
- package/src/builtin-addons/date-time/shared/format.ts +105 -0
- package/src/builtin-addons/date-time/shared/use-now.ts +10 -0
- package/src/builtin-addons/date-time/sirenodeck.json +6 -0
- package/src/builtin-addons/emoji-selector/README.md +45 -0
- package/src/builtin-addons/emoji-selector/assets/launcher.svg +10 -0
- package/src/builtin-addons/emoji-selector/assets/smileys.svg +8 -0
- package/src/builtin-addons/emoji-selector/buttons/category/backend.ts +14 -0
- package/src/builtin-addons/emoji-selector/buttons/category/config.ts +8 -0
- package/src/builtin-addons/emoji-selector/buttons/category/frontend.tsx +19 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/backend.ts +7 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/config.ts +9 -0
- package/src/builtin-addons/emoji-selector/buttons/emoji/frontend.tsx +11 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/backend.ts +13 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/config.ts +6 -0
- package/src/builtin-addons/emoji-selector/buttons/launcher/frontend.tsx +31 -0
- package/src/builtin-addons/emoji-selector/data/categories.ts +1084 -0
- package/src/builtin-addons/emoji-selector/decks/index.ts +137 -0
- package/src/builtin-addons/emoji-selector/index.d.ts +5 -0
- package/src/builtin-addons/emoji-selector/index.ts +29 -0
- package/src/builtin-addons/emoji-selector/sirenodeck.json +6 -0
- package/src/builtin-addons/emoji-selector/support.ts +49 -0
- package/src/builtin-addons/index.ts +13 -0
- package/src/builtin-addons/internal-settings/README.md +26 -0
- package/src/builtin-addons/internal-settings/backend.ts +58 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/backend.ts +7 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/config.ts +13 -0
- package/src/builtin-addons/internal-settings/buttons/app-info/frontend.tsx +18 -0
- package/src/builtin-addons/internal-settings/buttons/brightness/common/frontend.tsx +50 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/backend.ts +16 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/config.ts +6 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-down/frontend.tsx +8 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/backend.ts +16 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/config.ts +6 -0
- package/src/builtin-addons/internal-settings/buttons/brightness-up/frontend.tsx +8 -0
- package/src/builtin-addons/internal-settings/decks/settings.ts +25 -0
- package/src/builtin-addons/internal-settings/index.d.ts +4 -0
- package/src/builtin-addons/internal-settings/index.ts +53 -0
- package/src/builtin-addons/internal-settings/logo72x72.png +0 -0
- package/src/builtin-addons/internal-settings/sirenodeck.json +6 -0
- package/src/builtin-addons/media/README.md +45 -0
- package/src/builtin-addons/media/backend.ts +143 -0
- package/src/builtin-addons/media/buttons/media-player/backend.ts +19 -0
- package/src/builtin-addons/media/buttons/media-player/components/MediaStatus.tsx +25 -0
- package/src/builtin-addons/media/buttons/media-player/components/MediaSurface.tsx +52 -0
- package/src/builtin-addons/media/buttons/media-player/components/ProgressBar.tsx +21 -0
- package/src/builtin-addons/media/buttons/media-player/components/status-meta.ts +36 -0
- package/src/builtin-addons/media/buttons/media-player/config.ts +4 -0
- package/src/builtin-addons/media/buttons/media-player/frontend.tsx +29 -0
- package/src/builtin-addons/media/buttons/volume/common/frontend.tsx +52 -0
- package/src/builtin-addons/media/buttons/volume/mute/backend.ts +13 -0
- package/src/builtin-addons/media/buttons/volume/mute/config.ts +4 -0
- package/src/builtin-addons/media/buttons/volume/mute/frontend.tsx +26 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/backend.ts +14 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/config.ts +6 -0
- package/src/builtin-addons/media/buttons/volume/volume-down/frontend.tsx +10 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/backend.ts +14 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/config.ts +6 -0
- package/src/builtin-addons/media/buttons/volume/volume-up/frontend.tsx +8 -0
- package/src/builtin-addons/media/checks.ts +104 -0
- package/src/builtin-addons/media/executor.ts +36 -0
- package/src/builtin-addons/media/index.d.ts +5 -0
- package/src/builtin-addons/media/index.ts +53 -0
- package/src/builtin-addons/media/progress.ts +16 -0
- package/src/builtin-addons/media/providers/darwin.ts +391 -0
- package/src/builtin-addons/media/providers/index.ts +27 -0
- package/src/builtin-addons/media/providers/linux.ts +196 -0
- package/src/builtin-addons/media/providers/types.ts +48 -0
- package/src/builtin-addons/media/providers/windows.ts +121 -0
- package/src/builtin-addons/media/sirenodeck.json +6 -0
- package/src/builtin-addons/media/state.ts +19 -0
- package/src/builtin-addons/register-builtins.ts +65 -0
- package/src/builtin-addons/session/README.md +14 -0
- package/src/builtin-addons/session/buttons/session-info/backend.ts +8 -0
- package/src/builtin-addons/session/buttons/session-info/config.ts +4 -0
- package/src/builtin-addons/session/buttons/session-info/frontend.tsx +2 -0
- package/src/builtin-addons/session/buttons/time/backend.ts +7 -0
- package/src/builtin-addons/session/buttons/time/config.ts +6 -0
- package/src/builtin-addons/session/buttons/time/frontend.tsx +2 -0
- package/src/builtin-addons/session/index.d.ts +5 -0
- package/src/builtin-addons/session/index.ts +18 -0
- package/src/builtin-addons/session/sirenodeck.json +6 -0
- package/src/builtin-addons/system-status/README.md +169 -0
- package/src/builtin-addons/system-status/buttons/_shared.ts +131 -0
- package/src/builtin-addons/system-status/buttons/system-status/frontend.tsx +224 -0
- package/src/builtin-addons/system-status/buttons/system-status/schemas.ts +67 -0
- package/src/builtin-addons/system-status/domain/catalog.ts +53 -0
- package/src/builtin-addons/system-status/domain/chart-sampler.ts +58 -0
- package/src/builtin-addons/system-status/domain/display-metrics.ts +128 -0
- package/src/builtin-addons/system-status/domain/index.ts +10 -0
- package/src/builtin-addons/system-status/domain/live-metrics.ts +1021 -0
- package/src/builtin-addons/system-status/domain/metric-ids.ts +0 -0
- package/src/builtin-addons/system-status/index.ts +16 -0
- package/src/builtin-addons/system-status/manifest.ts +105 -0
- package/src/builtin-addons/system-status/shared/metrics-catalog.ts +316 -0
- package/src/builtin-addons/system-status/sirenodeck.json +6 -0
- package/src/builtin-addons/test-buildin/decks/action-buttons-test.ts +56 -0
- package/src/builtin-addons/test-buildin/index.d.ts +5 -0
- package/src/builtin-addons/test-buildin/index.ts +16 -0
- package/src/builtin-addons/value-display/README.md +59 -0
- package/src/builtin-addons/value-display/backend.ts +86 -0
- package/src/builtin-addons/value-display/buttons/value-display/backend.ts +17 -0
- package/src/builtin-addons/value-display/buttons/value-display/config.ts +36 -0
- package/src/builtin-addons/value-display/buttons/value-display/frontend.tsx +54 -0
- package/src/builtin-addons/value-display/index.d.ts +5 -0
- package/src/builtin-addons/value-display/index.ts +23 -0
- package/src/builtin-addons/value-display/sirenodeck.json +6 -0
- package/src/builtin-addons/weather/README.md +46 -0
- package/src/builtin-addons/weather/backend.ts +121 -0
- package/src/builtin-addons/weather/buttons/weather/backend.ts +27 -0
- package/src/builtin-addons/weather/buttons/weather/config.ts +29 -0
- package/src/builtin-addons/weather/buttons/weather/frontend.tsx +63 -0
- package/src/builtin-addons/weather/buttons/weather/icons.tsx +88 -0
- package/src/builtin-addons/weather/buttons/weather/pages.tsx +109 -0
- package/src/builtin-addons/weather/domain/codes.ts +35 -0
- package/src/builtin-addons/weather/domain/fetch.ts +47 -0
- package/src/builtin-addons/weather/index.d.ts +5 -0
- package/src/builtin-addons/weather/index.ts +23 -0
- package/src/builtin-addons/weather/poller.ts +70 -0
- package/src/builtin-addons/weather/provider/city-key.ts +9 -0
- package/src/builtin-addons/weather/provider/codes.ts +35 -0
- package/src/builtin-addons/weather/provider/fetch.ts +97 -0
- package/src/builtin-addons/weather/provider/geocode.ts +67 -0
- package/src/builtin-addons/weather/provider/types.ts +42 -0
- package/src/builtin-addons/weather/sirenodeck.json +6 -0
- package/src/cli/coding-agents-onboarding.ts +434 -0
- package/src/cli/commands/addon-decks.ts +441 -0
- package/src/cli/commands/addon-registry.ts +639 -0
- package/src/cli/commands/emulator-mode.ts +289 -0
- package/src/cli/commands/install.ts +128 -0
- package/src/cli/commands/logs.ts +74 -0
- package/src/cli/commands/network-bind.ts +111 -0
- package/src/cli/commands/pipeline/helpers.ts +75 -0
- package/src/cli/commands/pipeline/preflight.ts +20 -0
- package/src/cli/commands/port-identity.ts +152 -0
- package/src/cli/commands/reload.ts +37 -0
- package/src/cli/commands/restart.ts +139 -0
- package/src/cli/commands/run.ts +2270 -0
- package/src/cli/commands/service/install.ts +121 -0
- package/src/cli/commands/service/render-template.ts +158 -0
- package/src/cli/commands/service-manager.ts +184 -0
- package/src/cli/commands/spawn-daemon.ts +251 -0
- package/src/cli/commands/start.ts +1061 -0
- package/src/cli/commands/status.ts +110 -0
- package/src/cli/commands/stop.ts +121 -0
- package/src/cli/commands/subprocess-supervisor.ts +203 -0
- package/src/cli/commands/system-requirements.ts +699 -0
- package/src/cli/cwd.ts +28 -0
- package/src/cli/first-run.ts +149 -0
- package/src/cli/http-server.ts +244 -0
- package/src/cli/index.ts +355 -0
- package/src/cli/install-root.ts +26 -0
- package/src/cli/main.ts +194 -0
- package/src/cli/package-manager.ts +175 -0
- package/src/cli/probe-deps.ts +45 -0
- package/src/cli/prompt.ts +22 -0
- package/src/cli/startup-display.ts +452 -0
- package/src/config/builtin-icons.ts +57 -0
- package/src/config/config-diff.ts +54 -0
- package/src/config/discovery.ts +64 -0
- package/src/config/icon-resolver.ts +90 -0
- package/src/config/include-resolver.ts +202 -0
- package/src/config/index.ts +9 -0
- package/src/config/loader.ts +187 -0
- package/src/config/mutation.ts +514 -0
- package/src/config/reference-expander.ts +84 -0
- package/src/config/schemas.ts +223 -0
- package/src/config/validation.ts +254 -0
- package/src/core/asset-id.ts +21 -0
- package/src/core/gesture-state.ts +344 -0
- package/src/core/icon-asset-registry.ts +127 -0
- package/src/core/icon-source.ts +86 -0
- package/src/core/index.ts +30 -0
- package/src/core/mime.ts +16 -0
- package/src/core/pagination.ts +90 -0
- package/src/core/pub-sub.ts +126 -0
- package/src/core/settings.ts +153 -0
- package/src/core/store.ts +88 -0
- package/src/core/watcher.ts +73 -0
- package/src/deck/addon-handler-bridge.ts +516 -0
- package/src/deck/deck-config.ts +271 -0
- package/src/deck/editor-surfaces.ts +87 -0
- package/src/deck/host-context.ts +18 -0
- package/src/deck/index.ts +102 -0
- package/src/deck/macro-parse.ts +182 -0
- package/src/deck/methods.ts +348 -0
- package/src/deck/paginate-deck.ts +98 -0
- package/src/deck/position-buttons.ts +57 -0
- package/src/deck/runtime/index.ts +5 -0
- package/src/deck/runtime/runtime.ts +1060 -0
- package/src/deck/runtime-subscriptions.ts +45 -0
- package/src/deck/system-back-injection.ts +62 -0
- package/src/deck/system-buttons/registry.tsx +97 -0
- package/src/deck/system-buttons/types.ts +14 -0
- package/src/device/black-frame.ts +73 -0
- package/src/device/index.ts +13 -0
- package/src/device/linux-udev.ts +36 -0
- package/src/device/models.ts +89 -0
- package/src/device/reconnecting.ts +193 -0
- package/src/device/registry.ts +38 -0
- package/src/device/stream-deck.ts +155 -0
- package/src/index.ts +74 -0
- package/src/outputClient/emulator.ts +357 -0
- package/src/outputClient/index.ts +26 -0
- package/src/outputClient/open-browser.ts +26 -0
- package/src/outputClient/real.ts +393 -0
- package/src/outputClient/types.ts +83 -0
- package/src/render/browser-renderer.ts +240 -0
- package/src/render/buffer-hash.ts +20 -0
- package/src/render/editor-handler.ts +197 -0
- package/src/render/emulator-server.ts +128 -0
- package/src/render/icon-source-resolver.ts +69 -0
- package/src/render/index.ts +16 -0
- package/src/render/protocol.ts +61 -0
- package/src/render/push-raw-image.ts +100 -0
- package/src/render/screenshot-cadence.ts +87 -0
- package/src/render/state-publisher.ts +110 -0
- package/src/render/vite-server.ts +138 -0
- package/src/render/ws-bridge.ts +315 -0
- package/src/system/device-selection.ts +80 -0
- package/src/system/glob-match.ts +74 -0
- package/src/system/providers/active-app/darwin.ts +117 -0
- package/src/system/providers/active-app/linux.ts +245 -0
- package/src/system/providers/active-app/wayland-gnome.ts +303 -0
- package/src/system/providers/active-app/windows.ts +94 -0
- package/src/system/providers/active-app.ts +97 -0
- package/src/system/providers/clipboard/darwin.ts +65 -0
- package/src/system/providers/clipboard/linux.ts +163 -0
- package/src/system/providers/clipboard/windows.ts +94 -0
- package/src/system/providers/clipboard.ts +84 -0
- package/src/system/providers/error.ts +16 -0
- package/src/system/providers/key-macro/darwin.ts +221 -0
- package/src/system/providers/key-macro/linux.ts +651 -0
- package/src/system/providers/key-macro/parser.ts +215 -0
- package/src/system/providers/key-macro/windows.ts +476 -0
- package/src/system/providers/key-macro.ts +79 -0
- package/src/system/providers/notification/darwin.ts +36 -0
- package/src/system/providers/notification/linux.ts +115 -0
- package/src/system/providers/notification/windows.ts +72 -0
- package/src/system/providers/notification.ts +75 -0
- package/src/system/providers/session/darwin.ts +82 -0
- package/src/system/providers/session/linux.ts +175 -0
- package/src/system/providers/session/windows.ts +73 -0
- package/src/system/providers/session.ts +89 -0
- package/src/system/providers/shared.ts +65 -0
- package/src/system/requirements.ts +235 -0
- package/src/system/setup-wizard/config-seed.ts +30 -0
- package/src/system/setup-wizard/format.ts +275 -0
- package/src/system/setup-wizard/index.ts +45 -0
- package/src/system/setup-wizard/open-settings.ts +26 -0
- package/src/system/setup-wizard/plan.ts +230 -0
- package/src/system/setup-wizard/probe-cache.ts +34 -0
- package/src/system/setup-wizard/probe.ts +486 -0
- package/src/system/setup-wizard/runtime-features.ts +85 -0
- package/src/system/setup-wizard/sudo.ts +178 -0
- package/src/system/setup-wizard/types.ts +133 -0
- package/src/system/virtual-stream-deck.ts +67 -0
- package/src/themes/css.ts +210 -0
- package/src/themes/default/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/default/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Italic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Light.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-LightItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-Thin.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/IBMPlexMono-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/IBM_Plex_Mono/OFL.txt +93 -0
- package/src/themes/default/assets/OFL.txt +93 -0
- package/src/themes/default/assets/README.txt +106 -0
- package/src/themes/default/assets/static/IBMPlexSans-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_Condensed-ThinItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Bold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-BoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLight.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ExtraLightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Italic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Light.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-LightItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Medium.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-MediumItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Regular.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBold.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-Thin.ttf +0 -0
- package/src/themes/default/assets/static/IBMPlexSans_SemiCondensed-ThinItalic.ttf +0 -0
- package/src/themes/default/components.css +81 -0
- package/src/themes/default/sirenodeck.json +170 -0
- package/src/themes/index.ts +14 -0
- package/src/themes/light/assets/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/light/assets/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Bold.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Medium.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/IBMPlexMono-Regular.ttf +0 -0
- package/src/themes/light/assets/IBM_Plex_Mono/OFL.txt +93 -0
- package/src/themes/light/assets/OFL.txt +93 -0
- package/src/themes/light/assets/README.txt +106 -0
- package/src/themes/light/assets/static/IBMPlexSans-Light.ttf +0 -0
- package/src/themes/light/assets/static/IBMPlexSans-LightItalic.ttf +0 -0
- package/src/themes/light/assets/static/IBMPlexSans-Thin.ttf +0 -0
- package/src/themes/light/components.css +70 -0
- package/src/themes/light/sirenodeck.json +170 -0
- package/src/themes/loader.ts +343 -0
- package/src/themes/manifest.ts +164 -0
- package/src/themes/use-resolved-theme.tsx +32 -0
- package/src/ui/ButtonFrame.tsx +230 -0
- package/src/ui/contexts/AssetCacheContext.tsx +43 -0
- package/src/ui/index.ts +20 -0
- package/src/ui/primitives/Chip.tsx +53 -0
- package/src/ui/primitives/Icon.tsx +209 -0
- package/src/ui/primitives/Label.tsx +82 -0
- package/src/ui/primitives/ProgressBar.tsx +38 -0
- package/src/ui/primitives/TapIndicator.tsx +67 -0
- package/src/ui/primitives/Text.tsx +810 -0
- package/src/ui/primitives/index.ts +6 -0
- package/src/ui/surfaces/BarsSurface.tsx +211 -0
- package/src/ui/surfaces/IconLabelProgressSurface.tsx +133 -0
- package/src/ui/surfaces/IconLabelSurface.tsx +59 -0
- package/src/ui/surfaces/LabelValueListSurface.tsx +202 -0
- package/src/ui/surfaces/PaginatedSurface.tsx +164 -0
- package/src/ui/surfaces/SplitActionSurface.tsx +98 -0
- package/src/ui/surfaces/TemporaryErrorSurface.tsx +68 -0
- package/src/ui/surfaces/ValueChart.tsx +218 -0
- package/src/ui/surfaces/index.ts +32 -0
- package/src/ui/surfaces/paginated-schema.ts +22 -0
- package/src/ui/theme-presentation-builder.ts +184 -0
- package/src/ui/theme-presentation.tsx +146 -0
- package/src/ui/utils/cn.ts +12 -0
- package/src/util/cache-paths.ts +38 -0
- package/src/util/config-diff.ts +16 -0
- package/src/util/daemon-control.ts +85 -0
- package/src/util/daemon.ts +575 -0
- package/src/util/device-config.ts +56 -0
- package/src/util/errors.ts +13 -0
- package/src/util/log-reader.ts +114 -0
- package/src/util/log-tail.ts +103 -0
- package/src/util/logger.ts +417 -0
- package/src/util/process-title.ts +79 -0
- package/src/util/single-instance.ts +202 -0
- package/src/version.ts +10 -0
- package/src/vite/index.ts +6 -0
- package/src/vite/virtual-modules.ts +631 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { platform } from "node:process"
|
|
2
|
+
import { readFileSync } from "node:fs"
|
|
3
|
+
|
|
4
|
+
import type pino from "pino"
|
|
5
|
+
|
|
6
|
+
export const PROCESS_TITLE_MAX = 15
|
|
7
|
+
|
|
8
|
+
// ponytail: Vite/Node show as `MainThread` in `ps`/`top` by default. Setting
|
|
9
|
+
// `process.title` makes the daemon + wrappers recognisable in process lists
|
|
10
|
+
// so operators can correlate a held port / hung vite with the right role.
|
|
11
|
+
// The Linux `comm` field is 15 chars, so titles are truncated there. macOS
|
|
12
|
+
// and Windows have larger limits; we still cap at 15 to keep the column
|
|
13
|
+
// readable everywhere. Titles are diagnostic only — the kill identity gate
|
|
14
|
+
// still relies on `cmdlineMentionsCliRoot` + port + tracked PIDs.
|
|
15
|
+
export const setProcessTitle = (title: string): string => {
|
|
16
|
+
const capped =
|
|
17
|
+
platform === "linux" && title.length > PROCESS_TITLE_MAX
|
|
18
|
+
? title.slice(0, PROCESS_TITLE_MAX)
|
|
19
|
+
: title
|
|
20
|
+
process.title = capped
|
|
21
|
+
return capped
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const DAEMON_TITLE = "sirenodeck:dm"
|
|
25
|
+
export const FOREGROUND_TITLE = "sirenodeck:cli"
|
|
26
|
+
|
|
27
|
+
// ponytail: read /proc/self/stat to learn our parent pid without spawning
|
|
28
|
+
// `ps`. Linux-only; returns null on every other platform. Used by the
|
|
29
|
+
// parent-death watchdog to detect when the dev wrapper (our wrapper) dies
|
|
30
|
+
// and reparent us to init. POSIX recycles pids quickly so the check tolerates
|
|
31
|
+
// a reparent-to-init (ppid === 1) plus a small grace window before triggering.
|
|
32
|
+
export const readParentPid = (): number | null => {
|
|
33
|
+
if (platform !== "linux") return null
|
|
34
|
+
try {
|
|
35
|
+
const stat = readFileSync("/proc/self/stat", "utf8")
|
|
36
|
+
const closeParen = stat.lastIndexOf(")")
|
|
37
|
+
const tail = stat.slice(closeParen + 2)
|
|
38
|
+
const ppid = Number.parseInt(tail.split(" ")[1] ?? "", 10)
|
|
39
|
+
return Number.isFinite(ppid) && ppid > 0 ? ppid : null
|
|
40
|
+
} catch {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ponytail: POSIX doesn't cascade signals — when the dev wrapper (tsx watcher
|
|
46
|
+
// or `bin/dev.js`) dies, the daemon keeps running, its vite descendants keep
|
|
47
|
+
// their ports, and the next `start` finds them as orphans. The recommended
|
|
48
|
+
// fix is for the kernel to notify us via SIGCHLD/SIGHUP, but child processes
|
|
49
|
+
// only get SIGCHLD on their OWN children's state changes. The pragmatic
|
|
50
|
+
// workaround is a 1s ppid poll: when our boot ppid disappears and we get
|
|
51
|
+
// reparented to init (ppid=1), we exit cleanly. False positive: a ppid
|
|
52
|
+
// collision after the original parent dies and another process reuses the
|
|
53
|
+
// pid before it's reaped. Tolerated via grace window (1 poll cycle ≈ 1s).
|
|
54
|
+
// This is Linux-only; on other platforms the watchdog is a no-op.
|
|
55
|
+
export const startParentDeathWatchdog = (deps: {
|
|
56
|
+
readonly logger: pino.Logger
|
|
57
|
+
readonly onOrphan: () => void
|
|
58
|
+
readonly intervalMs?: number
|
|
59
|
+
readonly bootPpid?: number
|
|
60
|
+
}): (() => void) | null => {
|
|
61
|
+
if (platform !== "linux") return null
|
|
62
|
+
const bootPpid = deps.bootPpid ?? readParentPid()
|
|
63
|
+
if (bootPpid === null || bootPpid === 1) return null
|
|
64
|
+
const intervalMs = deps.intervalMs ?? 1_000
|
|
65
|
+
const timer = setInterval(() => {
|
|
66
|
+
const current = readParentPid()
|
|
67
|
+
if (current !== bootPpid) {
|
|
68
|
+
deps.logger.warn(
|
|
69
|
+
{ bootPpid, currentPpid: current },
|
|
70
|
+
"parent-death watchdog: parent disappeared, exiting",
|
|
71
|
+
)
|
|
72
|
+
clearInterval(timer)
|
|
73
|
+
deps.onOrphan()
|
|
74
|
+
}
|
|
75
|
+
}, intervalMs)
|
|
76
|
+
// unref so the watchdog never keeps the event loop alive on its own.
|
|
77
|
+
timer.unref?.()
|
|
78
|
+
return () => clearInterval(timer)
|
|
79
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { existsSync, unlinkSync } from "node:fs"
|
|
2
|
+
import { createServer, connect, type Server } from "node:net"
|
|
3
|
+
|
|
4
|
+
import type pino from "pino"
|
|
5
|
+
|
|
6
|
+
import { readPid, resolveDaemonPaths, resolveSocketPath } from "./daemon"
|
|
7
|
+
import type { DaemonPaths } from "./daemon"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ponytail: the daemon's single-instance guarantee.
|
|
11
|
+
*
|
|
12
|
+
* Every check that used to stand between two daemons was advisory, and each
|
|
13
|
+
* one failed in its own way:
|
|
14
|
+
*
|
|
15
|
+
* - the pid file is read-then-act. Two starts racing past the read both find
|
|
16
|
+
* no daemon and both proceed.
|
|
17
|
+
* - `isRunning` reported a live daemon as dead, so `stopExisting` took the
|
|
18
|
+
* "stale pid file" branch: it deleted the file and returned WITHOUT killing
|
|
19
|
+
* anything, and start carried on into a second daemon.
|
|
20
|
+
* - the control socket was unlinked unconditionally before binding, so a
|
|
21
|
+
* second daemon took it from the first instead of being refused.
|
|
22
|
+
*
|
|
23
|
+
* A listening socket has none of those problems. The bind is atomic and
|
|
24
|
+
* arbitrated by the kernel, so of two simultaneous starts exactly one wins;
|
|
25
|
+
* and the kernel drops the binding when the holder dies, however it dies, so
|
|
26
|
+
* there is no stale state to time out or second-guess. SIGKILL, a panic and a
|
|
27
|
+
* power cut all release it. That makes "is another daemon running?" a question
|
|
28
|
+
* with an authoritative answer rather than an inference from a file.
|
|
29
|
+
*
|
|
30
|
+
* The lock is deliberately separate from the control socket: it has to be
|
|
31
|
+
* taken at the very top of startup, before preflight kills anything that looks
|
|
32
|
+
* like an orphan, whereas the control socket cannot exist until there is a
|
|
33
|
+
* token to serve. A stale socket *file* left by a crash is not a held lock —
|
|
34
|
+
* we probe it with a connect first and only clear it when nothing answers.
|
|
35
|
+
*/
|
|
36
|
+
const LOCK_BASENAME = ".lock"
|
|
37
|
+
|
|
38
|
+
const PROBE_TIMEOUT_MS = 1_000
|
|
39
|
+
|
|
40
|
+
export const instanceLockPath = (paths: DaemonPaths): string =>
|
|
41
|
+
resolveSocketPath(paths.runtimeDir, LOCK_BASENAME)
|
|
42
|
+
|
|
43
|
+
export interface InstanceLock {
|
|
44
|
+
readonly release: () => void
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Does THIS process hold the lock — i.e. is it the daemon that owns the ports,
|
|
49
|
+
* the children and the pid file?
|
|
50
|
+
*
|
|
51
|
+
* The children file is shared by every process that can see the runtime dir,
|
|
52
|
+
* so "terminate the tracked children" is only ever a safe thing for the daemon
|
|
53
|
+
* that spawned them to say. A CLI whose start was refused used to run the same
|
|
54
|
+
* cleanup on its way out and take a healthy daemon's frontend down with it —
|
|
55
|
+
* the deck flickered because a start that changed nothing had just killed its
|
|
56
|
+
* vite. Ownership, not mere presence in the process table, decides that.
|
|
57
|
+
*/
|
|
58
|
+
let held = false
|
|
59
|
+
|
|
60
|
+
export const holdsInstanceLock = (): boolean => held
|
|
61
|
+
|
|
62
|
+
export type AcquireInstanceResult =
|
|
63
|
+
| { readonly kind: "acquired"; readonly lock: InstanceLock }
|
|
64
|
+
| { readonly kind: "busy"; readonly holderPid: number | null }
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Does something answer on the lock socket? A successful connect proves a live
|
|
68
|
+
* holder. ECONNREFUSED (or ENOENT) means the path is a leftover file from a
|
|
69
|
+
* daemon that died without cleaning up, which is safe to remove and rebind.
|
|
70
|
+
*
|
|
71
|
+
* Anything else — a timeout, EACCES — is treated as "occupied", because the
|
|
72
|
+
* one outcome worth avoiding is deleting a socket a live daemon is serving.
|
|
73
|
+
*/
|
|
74
|
+
export const isSocketLive = (socketPath: string): Promise<boolean> =>
|
|
75
|
+
new Promise((resolve) => {
|
|
76
|
+
if (process.platform !== "win32" && !existsSync(socketPath)) {
|
|
77
|
+
resolve(false)
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
const socket = connect(socketPath)
|
|
81
|
+
let settled = false
|
|
82
|
+
const finish = (live: boolean): void => {
|
|
83
|
+
if (settled) return
|
|
84
|
+
settled = true
|
|
85
|
+
socket.destroy()
|
|
86
|
+
resolve(live)
|
|
87
|
+
}
|
|
88
|
+
const timer = setTimeout(() => finish(true), PROBE_TIMEOUT_MS)
|
|
89
|
+
socket.once("connect", () => {
|
|
90
|
+
clearTimeout(timer)
|
|
91
|
+
finish(true)
|
|
92
|
+
})
|
|
93
|
+
socket.once("error", (err) => {
|
|
94
|
+
clearTimeout(timer)
|
|
95
|
+
const code = (err as NodeJS.ErrnoException).code
|
|
96
|
+
finish(
|
|
97
|
+
code !== "ECONNREFUSED" && code !== "ENOENT" && code !== "ENOTSOCK",
|
|
98
|
+
)
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
type ListenOutcome =
|
|
103
|
+
| { readonly kind: "listening"; readonly server: Server }
|
|
104
|
+
| { readonly kind: "in-use" }
|
|
105
|
+
| { readonly kind: "failed" }
|
|
106
|
+
|
|
107
|
+
const tryListen = (socketPath: string): Promise<ListenOutcome> =>
|
|
108
|
+
new Promise((resolve) => {
|
|
109
|
+
const server = createServer((socket) => socket.destroy())
|
|
110
|
+
const onError = (err: NodeJS.ErrnoException): void => {
|
|
111
|
+
resolve(
|
|
112
|
+
err.code === "EADDRINUSE" || err.code === "EEXIST"
|
|
113
|
+
? { kind: "in-use" }
|
|
114
|
+
: { kind: "failed" },
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
server.once("error", onError)
|
|
118
|
+
server.listen(socketPath, () => {
|
|
119
|
+
server.off("error", onError)
|
|
120
|
+
// Never let the lock hold the event loop open by itself.
|
|
121
|
+
server.unref()
|
|
122
|
+
resolve({ kind: "listening", server })
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
const releaseServer = (server: Server, socketPath: string) => (): void => {
|
|
127
|
+
held = false
|
|
128
|
+
try {
|
|
129
|
+
server.close()
|
|
130
|
+
} catch {
|
|
131
|
+
// already closed
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
if (process.platform !== "win32" && existsSync(socketPath))
|
|
135
|
+
unlinkSync(socketPath)
|
|
136
|
+
} catch {
|
|
137
|
+
// best-effort: the kernel has already released the binding
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Take the single-instance lock, or report who already holds it.
|
|
143
|
+
*
|
|
144
|
+
* Call this before any destructive startup work. A daemon that cannot take the
|
|
145
|
+
* lock must not clean up ports, children or pid files: those belong to the
|
|
146
|
+
* daemon that holds it.
|
|
147
|
+
*/
|
|
148
|
+
export const acquireInstanceLock = async (
|
|
149
|
+
paths: DaemonPaths = resolveDaemonPaths(),
|
|
150
|
+
logger?: pino.Logger,
|
|
151
|
+
): Promise<AcquireInstanceResult> => {
|
|
152
|
+
const socketPath = instanceLockPath(paths)
|
|
153
|
+
const holderPid = readPid(paths)
|
|
154
|
+
|
|
155
|
+
// ponytail: bind FIRST, ask questions second. An earlier draft probed for a
|
|
156
|
+
// live holder and then unlinked the path before binding, which loses a race
|
|
157
|
+
// it was written to win: with several starts in flight, each one unlinks the
|
|
158
|
+
// socket the winner has just bound and then binds its own, and they all
|
|
159
|
+
// believe they hold the lock. Going straight for the bind keeps the kernel
|
|
160
|
+
// as the only arbiter, and the destructive unlink happens only on the path
|
|
161
|
+
// where the bind has already told us the address is taken.
|
|
162
|
+
const first = await tryListen(socketPath)
|
|
163
|
+
if (first.kind === "listening") {
|
|
164
|
+
held = true
|
|
165
|
+
logger?.debug({ socketPath }, "instance lock: acquired")
|
|
166
|
+
return {
|
|
167
|
+
kind: "acquired",
|
|
168
|
+
lock: { release: releaseServer(first.server, socketPath) },
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (first.kind === "failed") return { kind: "busy", holderPid }
|
|
172
|
+
|
|
173
|
+
// The address is taken — but by a daemon, or by the socket file a dead one
|
|
174
|
+
// left behind? Only a connect can tell.
|
|
175
|
+
if (await isSocketLive(socketPath)) {
|
|
176
|
+
logger?.debug(
|
|
177
|
+
{ socketPath, holderPid },
|
|
178
|
+
"instance lock: held by a live daemon",
|
|
179
|
+
)
|
|
180
|
+
return { kind: "busy", holderPid }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
if (process.platform !== "win32") unlinkSync(socketPath)
|
|
185
|
+
logger?.debug({ socketPath }, "instance lock: cleared a stale socket")
|
|
186
|
+
} catch {
|
|
187
|
+
return { kind: "busy", holderPid }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const second = await tryListen(socketPath)
|
|
191
|
+
if (second.kind !== "listening") return { kind: "busy", holderPid }
|
|
192
|
+
|
|
193
|
+
held = true
|
|
194
|
+
logger?.debug(
|
|
195
|
+
{ socketPath },
|
|
196
|
+
"instance lock: acquired after clearing a stale socket",
|
|
197
|
+
)
|
|
198
|
+
return {
|
|
199
|
+
kind: "acquired",
|
|
200
|
+
lock: { release: releaseServer(second.server, socketPath) },
|
|
201
|
+
}
|
|
202
|
+
}
|
package/src/version.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const PACKAGE_NAME = "@sirenodeck/sirenodeck"
|
|
2
|
+
/**
|
|
3
|
+
* The name users actually type. `PACKAGE_NAME` is the npm package, which is
|
|
4
|
+
* what yargs rendered in every help line ("@sirenodeck/sirenodeck start") —
|
|
5
|
+
* a string that is not a runnable command. Keep the two separate.
|
|
6
|
+
*/
|
|
7
|
+
export const BIN_NAME = "sirenodeck"
|
|
8
|
+
export const VERSION = "0.1.0"
|
|
9
|
+
export const SIRENO_ADDON_API_VERSION = 3
|
|
10
|
+
export const PROTOCOL_VERSION = 3
|