@atomic-chat/core 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/dist/app-daemon.d.ts +2 -0
- package/dist/app-daemon.js +72 -0
- package/dist/app-daemon.js.map +1 -0
- package/dist/backend/catalog/archive.d.ts +70 -0
- package/dist/backend/catalog/archive.js +138 -0
- package/dist/backend/catalog/archive.js.map +1 -0
- package/dist/backend/catalog/bundled-manifest-baseline.d.ts +2 -0
- package/dist/backend/catalog/bundled-manifest-baseline.js +49 -0
- package/dist/backend/catalog/bundled-manifest-baseline.js.map +1 -0
- package/dist/backend/catalog/cuda-family.d.ts +54 -0
- package/dist/backend/catalog/cuda-family.js +93 -0
- package/dist/backend/catalog/cuda-family.js.map +1 -0
- package/dist/backend/catalog/index.d.ts +6 -0
- package/dist/backend/catalog/index.js +7 -0
- package/dist/backend/catalog/index.js.map +1 -0
- package/dist/backend/catalog/manifest.d.ts +102 -0
- package/dist/backend/catalog/manifest.js +233 -0
- package/dist/backend/catalog/manifest.js.map +1 -0
- package/dist/backend/catalog/migrate.d.ts +40 -0
- package/dist/backend/catalog/migrate.js +135 -0
- package/dist/backend/catalog/migrate.js.map +1 -0
- package/dist/backend/index.d.ts +18 -0
- package/dist/backend/index.js +19 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/install/index.d.ts +3 -0
- package/dist/backend/install/index.js +4 -0
- package/dist/backend/install/index.js.map +1 -0
- package/dist/backend/install/runtime-backend.d.ts +22 -0
- package/dist/backend/install/runtime-backend.js +95 -0
- package/dist/backend/install/runtime-backend.js.map +1 -0
- package/dist/backend/install/service.d.ts +119 -0
- package/dist/backend/install/service.js +218 -0
- package/dist/backend/install/service.js.map +1 -0
- package/dist/backend/installed/index.d.ts +3 -0
- package/dist/backend/installed/index.js +4 -0
- package/dist/backend/installed/index.js.map +1 -0
- package/dist/backend/installed/installed.d.ts +93 -0
- package/dist/backend/installed/installed.js +209 -0
- package/dist/backend/installed/installed.js.map +1 -0
- package/dist/backend/installed/scan.d.ts +39 -0
- package/dist/backend/installed/scan.js +105 -0
- package/dist/backend/installed/scan.js.map +1 -0
- package/dist/backend/optimal/index.d.ts +3 -0
- package/dist/backend/optimal/index.js +4 -0
- package/dist/backend/optimal/index.js.map +1 -0
- package/dist/backend/optimal/optimal-cache.d.ts +90 -0
- package/dist/backend/optimal/optimal-cache.js +198 -0
- package/dist/backend/optimal/optimal-cache.js.map +1 -0
- package/dist/backend/optimal/optimal-store.d.ts +24 -0
- package/dist/backend/optimal/optimal-store.js +103 -0
- package/dist/backend/optimal/optimal-store.js.map +1 -0
- package/dist/backend/select/amd-rocm-pci-ids.d.ts +3 -0
- package/dist/backend/select/amd-rocm-pci-ids.js +57 -0
- package/dist/backend/select/amd-rocm-pci-ids.js.map +1 -0
- package/dist/backend/select/categories.d.ts +49 -0
- package/dist/backend/select/categories.js +178 -0
- package/dist/backend/select/categories.js.map +1 -0
- package/dist/backend/select/features.d.ts +81 -0
- package/dist/backend/select/features.js +221 -0
- package/dist/backend/select/features.js.map +1 -0
- package/dist/backend/select/index.d.ts +9 -0
- package/dist/backend/select/index.js +10 -0
- package/dist/backend/select/index.js.map +1 -0
- package/dist/backend/select/recovery.d.ts +51 -0
- package/dist/backend/select/recovery.js +108 -0
- package/dist/backend/select/recovery.js.map +1 -0
- package/dist/backend/select/tiers.d.ts +76 -0
- package/dist/backend/select/tiers.js +179 -0
- package/dist/backend/select/tiers.js.map +1 -0
- package/dist/backend/turboquant.d.ts +134 -0
- package/dist/backend/turboquant.js +587 -0
- package/dist/backend/turboquant.js.map +1 -0
- package/dist/backend/types.d.ts +139 -0
- package/dist/backend/types.js +13 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/backend/version.d.ts +59 -0
- package/dist/backend/version.js +168 -0
- package/dist/backend/version.js.map +1 -0
- package/dist/cli/bin.d.ts +2 -0
- package/dist/cli/bin.js +10 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/cloud.d.ts +13 -0
- package/dist/cli/cloud.js +146 -0
- package/dist/cli/cloud.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +4 -0
- package/dist/cli/commands/daemon.js +88 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/index.d.ts +16 -0
- package/dist/cli/commands/index.js +17 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/models.d.ts +4 -0
- package/dist/cli/commands/models.js +52 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +16 -0
- package/dist/cli/commands/serve.js +263 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/server.d.ts +4 -0
- package/dist/cli/commands/server.js +126 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +10 -0
- package/dist/cli/commands/shared.js +34 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/shutdown.d.ts +4 -0
- package/dist/cli/commands/shutdown.js +32 -0
- package/dist/cli/commands/shutdown.js.map +1 -0
- package/dist/cli/commands/telemetry.d.ts +8 -0
- package/dist/cli/commands/telemetry.js +50 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/io.d.ts +46 -0
- package/dist/cli/io.js +101 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/launch.d.ts +50 -0
- package/dist/cli/launch.js +327 -0
- package/dist/cli/launch.js.map +1 -0
- package/dist/cli/main.d.ts +10 -0
- package/dist/cli/main.js +109 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/owner.d.ts +39 -0
- package/dist/cli/owner.js +179 -0
- package/dist/cli/owner.js.map +1 -0
- package/dist/client/control-client.d.ts +213 -0
- package/dist/client/control-client.js +368 -0
- package/dist/client/control-client.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/cloud/chatgpt.d.ts +63 -0
- package/dist/cloud/chatgpt.js +233 -0
- package/dist/cloud/chatgpt.js.map +1 -0
- package/dist/cloud/index.d.ts +8 -0
- package/dist/cloud/index.js +9 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/registry.d.ts +51 -0
- package/dist/cloud/registry.js +148 -0
- package/dist/cloud/registry.js.map +1 -0
- package/dist/config/data-folder.d.ts +57 -0
- package/dist/config/data-folder.js +150 -0
- package/dist/config/data-folder.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/paths.d.ts +98 -0
- package/dist/config/paths.js +109 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/contracts/control-api.d.ts +61 -0
- package/dist/contracts/control-api.js +7 -0
- package/dist/contracts/control-api.js.map +1 -0
- package/dist/contracts/diffusion.d.ts +477 -0
- package/dist/contracts/diffusion.js +10 -0
- package/dist/contracts/diffusion.js.map +1 -0
- package/dist/contracts/errors.d.ts +61 -0
- package/dist/contracts/errors.js +70 -0
- package/dist/contracts/errors.js.map +1 -0
- package/dist/contracts/events.d.ts +270 -0
- package/dist/contracts/events.js +7 -0
- package/dist/contracts/events.js.map +1 -0
- package/dist/contracts/hardware.d.ts +53 -0
- package/dist/contracts/hardware.js +12 -0
- package/dist/contracts/hardware.js.map +1 -0
- package/dist/contracts/index.d.ts +12 -0
- package/dist/contracts/index.js +13 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/model-yml.d.ts +28 -0
- package/dist/contracts/model-yml.js +23 -0
- package/dist/contracts/model-yml.js.map +1 -0
- package/dist/contracts/remote-access.d.ts +43 -0
- package/dist/contracts/remote-access.js +12 -0
- package/dist/contracts/remote-access.js.map +1 -0
- package/dist/contracts/session.d.ts +39 -0
- package/dist/contracts/session.js +7 -0
- package/dist/contracts/session.js.map +1 -0
- package/dist/contracts/settings.d.ts +106 -0
- package/dist/contracts/settings.js +17 -0
- package/dist/contracts/settings.js.map +1 -0
- package/dist/core/atomic-core.d.ts +149 -0
- package/dist/core/atomic-core.js +289 -0
- package/dist/core/atomic-core.js.map +1 -0
- package/dist/core/create.d.ts +12 -0
- package/dist/core/create.js +393 -0
- package/dist/core/create.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/public-server.d.ts +76 -0
- package/dist/core/public-server.js +143 -0
- package/dist/core/public-server.js.map +1 -0
- package/dist/core/reap-orphans.d.ts +7 -0
- package/dist/core/reap-orphans.js +40 -0
- package/dist/core/reap-orphans.js.map +1 -0
- package/dist/core/sessions.d.ts +60 -0
- package/dist/core/sessions.js +180 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/types.d.ts +61 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/credentials/api-keys.d.ts +41 -0
- package/dist/credentials/api-keys.js +156 -0
- package/dist/credentials/api-keys.js.map +1 -0
- package/dist/credentials/chatgpt-auth.d.ts +73 -0
- package/dist/credentials/chatgpt-auth.js +167 -0
- package/dist/credentials/chatgpt-auth.js.map +1 -0
- package/dist/credentials/chatgpt-oauth.d.ts +97 -0
- package/dist/credentials/chatgpt-oauth.js +329 -0
- package/dist/credentials/chatgpt-oauth.js.map +1 -0
- package/dist/credentials/chatgpt-store.d.ts +33 -0
- package/dist/credentials/chatgpt-store.js +110 -0
- package/dist/credentials/chatgpt-store.js.map +1 -0
- package/dist/credentials/index.d.ts +11 -0
- package/dist/credentials/index.js +12 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/diffusion/args.d.ts +102 -0
- package/dist/diffusion/args.js +291 -0
- package/dist/diffusion/args.js.map +1 -0
- package/dist/diffusion/compat.d.ts +20 -0
- package/dist/diffusion/compat.js +58 -0
- package/dist/diffusion/compat.js.map +1 -0
- package/dist/diffusion/containment.d.ts +15 -0
- package/dist/diffusion/containment.js +32 -0
- package/dist/diffusion/containment.js.map +1 -0
- package/dist/diffusion/errors.d.ts +28 -0
- package/dist/diffusion/errors.js +63 -0
- package/dist/diffusion/errors.js.map +1 -0
- package/dist/diffusion/gallery.d.ts +76 -0
- package/dist/diffusion/gallery.js +307 -0
- package/dist/diffusion/gallery.js.map +1 -0
- package/dist/diffusion/http.d.ts +16 -0
- package/dist/diffusion/http.js +41 -0
- package/dist/diffusion/http.js.map +1 -0
- package/dist/diffusion/idle.d.ts +23 -0
- package/dist/diffusion/idle.js +45 -0
- package/dist/diffusion/idle.js.map +1 -0
- package/dist/diffusion/image-job.d.ts +25 -0
- package/dist/diffusion/image-job.js +176 -0
- package/dist/diffusion/image-job.js.map +1 -0
- package/dist/diffusion/index.d.ts +35 -0
- package/dist/diffusion/index.js +36 -0
- package/dist/diffusion/index.js.map +1 -0
- package/dist/diffusion/install.d.ts +61 -0
- package/dist/diffusion/install.js +287 -0
- package/dist/diffusion/install.js.map +1 -0
- package/dist/diffusion/job-kind.d.ts +74 -0
- package/dist/diffusion/job-kind.js +7 -0
- package/dist/diffusion/job-kind.js.map +1 -0
- package/dist/diffusion/jobs.d.ts +90 -0
- package/dist/diffusion/jobs.js +433 -0
- package/dist/diffusion/jobs.js.map +1 -0
- package/dist/diffusion/mutex.d.ts +16 -0
- package/dist/diffusion/mutex.js +46 -0
- package/dist/diffusion/mutex.js.map +1 -0
- package/dist/diffusion/parse.d.ts +19 -0
- package/dist/diffusion/parse.js +274 -0
- package/dist/diffusion/parse.js.map +1 -0
- package/dist/diffusion/png.d.ts +77 -0
- package/dist/diffusion/png.js +335 -0
- package/dist/diffusion/png.js.map +1 -0
- package/dist/diffusion/progress.d.ts +74 -0
- package/dist/diffusion/progress.js +223 -0
- package/dist/diffusion/progress.js.map +1 -0
- package/dist/diffusion/recipe.d.ts +26 -0
- package/dist/diffusion/recipe.js +206 -0
- package/dist/diffusion/recipe.js.map +1 -0
- package/dist/diffusion/server-process.d.ts +59 -0
- package/dist/diffusion/server-process.js +235 -0
- package/dist/diffusion/server-process.js.map +1 -0
- package/dist/diffusion/service.d.ts +107 -0
- package/dist/diffusion/service.js +431 -0
- package/dist/diffusion/service.js.map +1 -0
- package/dist/diffusion/session.d.ts +58 -0
- package/dist/diffusion/session.js +226 -0
- package/dist/diffusion/session.js.map +1 -0
- package/dist/diffusion/state.d.ts +90 -0
- package/dist/diffusion/state.js +122 -0
- package/dist/diffusion/state.js.map +1 -0
- package/dist/diffusion/tracker.d.ts +46 -0
- package/dist/diffusion/tracker.js +153 -0
- package/dist/diffusion/tracker.js.map +1 -0
- package/dist/diffusion/types.d.ts +62 -0
- package/dist/diffusion/types.js +10 -0
- package/dist/diffusion/types.js.map +1 -0
- package/dist/diffusion/validate.d.ts +36 -0
- package/dist/diffusion/validate.js +166 -0
- package/dist/diffusion/validate.js.map +1 -0
- package/dist/diffusion/video-gallery.d.ts +56 -0
- package/dist/diffusion/video-gallery.js +252 -0
- package/dist/diffusion/video-gallery.js.map +1 -0
- package/dist/diffusion/video-job.d.ts +33 -0
- package/dist/diffusion/video-job.js +150 -0
- package/dist/diffusion/video-job.js.map +1 -0
- package/dist/diffusion/video-recipe.d.ts +12 -0
- package/dist/diffusion/video-recipe.js +141 -0
- package/dist/diffusion/video-recipe.js.map +1 -0
- package/dist/diffusion/wiring.d.ts +24 -0
- package/dist/diffusion/wiring.js +38 -0
- package/dist/diffusion/wiring.js.map +1 -0
- package/dist/diffusion/workflow.d.ts +33 -0
- package/dist/diffusion/workflow.js +78 -0
- package/dist/diffusion/workflow.js.map +1 -0
- package/dist/downloads/archive.d.ts +15 -0
- package/dist/downloads/archive.js +121 -0
- package/dist/downloads/archive.js.map +1 -0
- package/dist/downloads/disk-space.d.ts +18 -0
- package/dist/downloads/disk-space.js +32 -0
- package/dist/downloads/disk-space.js.map +1 -0
- package/dist/downloads/disk.d.ts +38 -0
- package/dist/downloads/disk.js +88 -0
- package/dist/downloads/disk.js.map +1 -0
- package/dist/downloads/downloader.d.ts +75 -0
- package/dist/downloads/downloader.js +479 -0
- package/dist/downloads/downloader.js.map +1 -0
- package/dist/downloads/index.d.ts +14 -0
- package/dist/downloads/index.js +15 -0
- package/dist/downloads/index.js.map +1 -0
- package/dist/downloads/protocol.d.ts +52 -0
- package/dist/downloads/protocol.js +153 -0
- package/dist/downloads/protocol.js.map +1 -0
- package/dist/downloads/proxy-fetch.d.ts +45 -0
- package/dist/downloads/proxy-fetch.js +571 -0
- package/dist/downloads/proxy-fetch.js.map +1 -0
- package/dist/downloads/verify.d.ts +22 -0
- package/dist/downloads/verify.js +74 -0
- package/dist/downloads/verify.js.map +1 -0
- package/dist/events/emitter.d.ts +44 -0
- package/dist/events/emitter.js +104 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.js +6 -0
- package/dist/events/index.js.map +1 -0
- package/dist/hardware/index.d.ts +7 -0
- package/dist/hardware/index.js +8 -0
- package/dist/hardware/index.js.map +1 -0
- package/dist/hardware/override.d.ts +46 -0
- package/dist/hardware/override.js +81 -0
- package/dist/hardware/override.js.map +1 -0
- package/dist/host/index.d.ts +15 -0
- package/dist/host/index.js +16 -0
- package/dist/host/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/catalog.d.ts +67 -0
- package/dist/integrations/catalog.js +385 -0
- package/dist/integrations/catalog.js.map +1 -0
- package/dist/integrations/config-io.d.ts +86 -0
- package/dist/integrations/config-io.js +229 -0
- package/dist/integrations/config-io.js.map +1 -0
- package/dist/integrations/configure/atomic-agent.d.ts +33 -0
- package/dist/integrations/configure/atomic-agent.js +127 -0
- package/dist/integrations/configure/atomic-agent.js.map +1 -0
- package/dist/integrations/configure/claude-code.d.ts +16 -0
- package/dist/integrations/configure/claude-code.js +45 -0
- package/dist/integrations/configure/claude-code.js.map +1 -0
- package/dist/integrations/configure/cline.d.ts +28 -0
- package/dist/integrations/configure/cline.js +70 -0
- package/dist/integrations/configure/cline.js.map +1 -0
- package/dist/integrations/configure/codex.d.ts +17 -0
- package/dist/integrations/configure/codex.js +43 -0
- package/dist/integrations/configure/codex.js.map +1 -0
- package/dist/integrations/configure/copilot.d.ts +10 -0
- package/dist/integrations/configure/copilot.js +14 -0
- package/dist/integrations/configure/copilot.js.map +1 -0
- package/dist/integrations/configure/droid.d.ts +12 -0
- package/dist/integrations/configure/droid.js +47 -0
- package/dist/integrations/configure/droid.js.map +1 -0
- package/dist/integrations/configure/dsh.d.ts +34 -0
- package/dist/integrations/configure/dsh.js +146 -0
- package/dist/integrations/configure/dsh.js.map +1 -0
- package/dist/integrations/configure/env-agent.d.ts +26 -0
- package/dist/integrations/configure/env-agent.js +41 -0
- package/dist/integrations/configure/env-agent.js.map +1 -0
- package/dist/integrations/configure/goose.d.ts +12 -0
- package/dist/integrations/configure/goose.js +16 -0
- package/dist/integrations/configure/goose.js.map +1 -0
- package/dist/integrations/configure/hermes.d.ts +41 -0
- package/dist/integrations/configure/hermes.js +247 -0
- package/dist/integrations/configure/hermes.js.map +1 -0
- package/dist/integrations/configure/index.d.ts +25 -0
- package/dist/integrations/configure/index.js +26 -0
- package/dist/integrations/configure/index.js.map +1 -0
- package/dist/integrations/configure/json-tree.d.ts +16 -0
- package/dist/integrations/configure/json-tree.js +19 -0
- package/dist/integrations/configure/json-tree.js.map +1 -0
- package/dist/integrations/configure/kilo.d.ts +9 -0
- package/dist/integrations/configure/kilo.js +19 -0
- package/dist/integrations/configure/kilo.js.map +1 -0
- package/dist/integrations/configure/mimo.d.ts +9 -0
- package/dist/integrations/configure/mimo.js +19 -0
- package/dist/integrations/configure/mimo.js.map +1 -0
- package/dist/integrations/configure/muse.d.ts +9 -0
- package/dist/integrations/configure/muse.js +13 -0
- package/dist/integrations/configure/muse.js.map +1 -0
- package/dist/integrations/configure/openclaude.d.ts +13 -0
- package/dist/integrations/configure/openclaude.js +56 -0
- package/dist/integrations/configure/openclaude.js.map +1 -0
- package/dist/integrations/configure/openclaw.d.ts +24 -0
- package/dist/integrations/configure/openclaw.js +99 -0
- package/dist/integrations/configure/openclaw.js.map +1 -0
- package/dist/integrations/configure/opencode-style.d.ts +25 -0
- package/dist/integrations/configure/opencode-style.js +43 -0
- package/dist/integrations/configure/opencode-style.js.map +1 -0
- package/dist/integrations/configure/opencode.d.ts +9 -0
- package/dist/integrations/configure/opencode.js +19 -0
- package/dist/integrations/configure/opencode.js.map +1 -0
- package/dist/integrations/configure/openhands.d.ts +8 -0
- package/dist/integrations/configure/openhands.js +12 -0
- package/dist/integrations/configure/openhands.js.map +1 -0
- package/dist/integrations/configure/pi.d.ts +14 -0
- package/dist/integrations/configure/pi.js +49 -0
- package/dist/integrations/configure/pi.js.map +1 -0
- package/dist/integrations/configure/poolside.d.ts +8 -0
- package/dist/integrations/configure/poolside.js +12 -0
- package/dist/integrations/configure/poolside.js.map +1 -0
- package/dist/integrations/configure/registry.d.ts +41 -0
- package/dist/integrations/configure/registry.js +50 -0
- package/dist/integrations/configure/registry.js.map +1 -0
- package/dist/integrations/configure/zcode.d.ts +59 -0
- package/dist/integrations/configure/zcode.js +260 -0
- package/dist/integrations/configure/zcode.js.map +1 -0
- package/dist/integrations/configure/zed.d.ts +16 -0
- package/dist/integrations/configure/zed.js +61 -0
- package/dist/integrations/configure/zed.js.map +1 -0
- package/dist/integrations/detect.d.ts +29 -0
- package/dist/integrations/detect.js +43 -0
- package/dist/integrations/detect.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.js +10 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/lock/control-token.d.ts +19 -0
- package/dist/lock/control-token.js +58 -0
- package/dist/lock/control-token.js.map +1 -0
- package/dist/lock/index.d.ts +10 -0
- package/dist/lock/index.js +11 -0
- package/dist/lock/index.js.map +1 -0
- package/dist/lock/instance-lock.d.ts +93 -0
- package/dist/lock/instance-lock.js +244 -0
- package/dist/lock/instance-lock.js.map +1 -0
- package/dist/lock/legacy-guard.d.ts +46 -0
- package/dist/lock/legacy-guard.js +87 -0
- package/dist/lock/legacy-guard.js.map +1 -0
- package/dist/lock/model-claim.d.ts +20 -0
- package/dist/lock/model-claim.js +84 -0
- package/dist/lock/model-claim.js.map +1 -0
- package/dist/lock/process-identity.d.ts +48 -0
- package/dist/lock/process-identity.js +180 -0
- package/dist/lock/process-identity.js.map +1 -0
- package/dist/lock/process-journal.d.ts +56 -0
- package/dist/lock/process-journal.js +113 -0
- package/dist/lock/process-journal.js.map +1 -0
- package/dist/models/capabilities.d.ts +73 -0
- package/dist/models/capabilities.js +123 -0
- package/dist/models/capabilities.js.map +1 -0
- package/dist/models/embed.d.ts +30 -0
- package/dist/models/embed.js +83 -0
- package/dist/models/embed.js.map +1 -0
- package/dist/models/gguf/classify.d.ts +29 -0
- package/dist/models/gguf/classify.js +89 -0
- package/dist/models/gguf/classify.js.map +1 -0
- package/dist/models/gguf/index.d.ts +5 -0
- package/dist/models/gguf/index.js +6 -0
- package/dist/models/gguf/index.js.map +1 -0
- package/dist/models/gguf/kv-cache.d.ts +27 -0
- package/dist/models/gguf/kv-cache.js +101 -0
- package/dist/models/gguf/kv-cache.js.map +1 -0
- package/dist/models/gguf/read-file.d.ts +11 -0
- package/dist/models/gguf/read-file.js +21 -0
- package/dist/models/gguf/read-file.js.map +1 -0
- package/dist/models/gguf/reader.d.ts +40 -0
- package/dist/models/gguf/reader.js +271 -0
- package/dist/models/gguf/reader.js.map +1 -0
- package/dist/models/gguf/support.d.ts +47 -0
- package/dist/models/gguf/support.js +48 -0
- package/dist/models/gguf/support.js.map +1 -0
- package/dist/models/hf.d.ts +35 -0
- package/dist/models/hf.js +140 -0
- package/dist/models/hf.js.map +1 -0
- package/dist/models/index.d.ts +14 -0
- package/dist/models/index.js +15 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/model-yml.d.ts +22 -0
- package/dist/models/model-yml.js +63 -0
- package/dist/models/model-yml.js.map +1 -0
- package/dist/models/registry.d.ts +51 -0
- package/dist/models/registry.js +102 -0
- package/dist/models/registry.js.map +1 -0
- package/dist/models/shards.d.ts +20 -0
- package/dist/models/shards.js +46 -0
- package/dist/models/shards.js.map +1 -0
- package/dist/remote-access/cloudflared-args.d.ts +41 -0
- package/dist/remote-access/cloudflared-args.js +59 -0
- package/dist/remote-access/cloudflared-args.js.map +1 -0
- package/dist/remote-access/cloudflared-output.d.ts +26 -0
- package/dist/remote-access/cloudflared-output.js +51 -0
- package/dist/remote-access/cloudflared-output.js.map +1 -0
- package/dist/remote-access/index.d.ts +16 -0
- package/dist/remote-access/index.js +17 -0
- package/dist/remote-access/index.js.map +1 -0
- package/dist/remote-access/journal.d.ts +63 -0
- package/dist/remote-access/journal.js +140 -0
- package/dist/remote-access/journal.js.map +1 -0
- package/dist/remote-access/lan-probe.d.ts +28 -0
- package/dist/remote-access/lan-probe.js +63 -0
- package/dist/remote-access/lan-probe.js.map +1 -0
- package/dist/remote-access/lan.d.ts +31 -0
- package/dist/remote-access/lan.js +90 -0
- package/dist/remote-access/lan.js.map +1 -0
- package/dist/remote-access/manager.d.ts +111 -0
- package/dist/remote-access/manager.js +316 -0
- package/dist/remote-access/manager.js.map +1 -0
- package/dist/remote-access/probe.d.ts +92 -0
- package/dist/remote-access/probe.js +186 -0
- package/dist/remote-access/probe.js.map +1 -0
- package/dist/remote-access/process.d.ts +66 -0
- package/dist/remote-access/process.js +160 -0
- package/dist/remote-access/process.js.map +1 -0
- package/dist/remote-access/spawner.d.ts +25 -0
- package/dist/remote-access/spawner.js +49 -0
- package/dist/remote-access/spawner.js.map +1 -0
- package/dist/remote-access/status.d.ts +39 -0
- package/dist/remote-access/status.js +49 -0
- package/dist/remote-access/status.js.map +1 -0
- package/dist/remote-access/wiring.d.ts +34 -0
- package/dist/remote-access/wiring.js +47 -0
- package/dist/remote-access/wiring.js.map +1 -0
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.js +8 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/resolve.d.ts +41 -0
- package/dist/router/resolve.js +53 -0
- package/dist/router/resolve.js.map +1 -0
- package/dist/runtime/foundation-models/errors.d.ts +28 -0
- package/dist/runtime/foundation-models/errors.js +48 -0
- package/dist/runtime/foundation-models/errors.js.map +1 -0
- package/dist/runtime/foundation-models/index.d.ts +8 -0
- package/dist/runtime/foundation-models/index.js +9 -0
- package/dist/runtime/foundation-models/index.js.map +1 -0
- package/dist/runtime/foundation-models/runtime.d.ts +73 -0
- package/dist/runtime/foundation-models/runtime.js +186 -0
- package/dist/runtime/foundation-models/runtime.js.map +1 -0
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/llamacpp/args.d.ts +90 -0
- package/dist/runtime/llamacpp/args.js +379 -0
- package/dist/runtime/llamacpp/args.js.map +1 -0
- package/dist/runtime/llamacpp/ctx-ladder.d.ts +16 -0
- package/dist/runtime/llamacpp/ctx-ladder.js +28 -0
- package/dist/runtime/llamacpp/ctx-ladder.js.map +1 -0
- package/dist/runtime/llamacpp/devices.d.ts +26 -0
- package/dist/runtime/llamacpp/devices.js +86 -0
- package/dist/runtime/llamacpp/devices.js.map +1 -0
- package/dist/runtime/llamacpp/errors.d.ts +34 -0
- package/dist/runtime/llamacpp/errors.js +137 -0
- package/dist/runtime/llamacpp/errors.js.map +1 -0
- package/dist/runtime/llamacpp/index.d.ts +14 -0
- package/dist/runtime/llamacpp/index.js +15 -0
- package/dist/runtime/llamacpp/index.js.map +1 -0
- package/dist/runtime/llamacpp/load-plan.d.ts +113 -0
- package/dist/runtime/llamacpp/load-plan.js +259 -0
- package/dist/runtime/llamacpp/load-plan.js.map +1 -0
- package/dist/runtime/llamacpp/policy.d.ts +70 -0
- package/dist/runtime/llamacpp/policy.js +191 -0
- package/dist/runtime/llamacpp/policy.js.map +1 -0
- package/dist/runtime/llamacpp/probe.d.ts +13 -0
- package/dist/runtime/llamacpp/probe.js +35 -0
- package/dist/runtime/llamacpp/probe.js.map +1 -0
- package/dist/runtime/llamacpp/runtime-device.d.ts +33 -0
- package/dist/runtime/llamacpp/runtime-device.js +169 -0
- package/dist/runtime/llamacpp/runtime-device.js.map +1 -0
- package/dist/runtime/llamacpp/runtime.d.ts +151 -0
- package/dist/runtime/llamacpp/runtime.js +535 -0
- package/dist/runtime/llamacpp/runtime.js.map +1 -0
- package/dist/runtime/mlx/args.d.ts +10 -0
- package/dist/runtime/mlx/args.js +44 -0
- package/dist/runtime/mlx/args.js.map +1 -0
- package/dist/runtime/mlx/config.d.ts +71 -0
- package/dist/runtime/mlx/config.js +91 -0
- package/dist/runtime/mlx/config.js.map +1 -0
- package/dist/runtime/mlx/errors.d.ts +21 -0
- package/dist/runtime/mlx/errors.js +73 -0
- package/dist/runtime/mlx/errors.js.map +1 -0
- package/dist/runtime/mlx/index.d.ts +12 -0
- package/dist/runtime/mlx/index.js +13 -0
- package/dist/runtime/mlx/index.js.map +1 -0
- package/dist/runtime/mlx/model-files.d.ts +29 -0
- package/dist/runtime/mlx/model-files.js +82 -0
- package/dist/runtime/mlx/model-files.js.map +1 -0
- package/dist/runtime/mlx/runtime.d.ts +77 -0
- package/dist/runtime/mlx/runtime.js +223 -0
- package/dist/runtime/mlx/runtime.js.map +1 -0
- package/dist/runtime/mlx/shard-repair.d.ts +25 -0
- package/dist/runtime/mlx/shard-repair.js +44 -0
- package/dist/runtime/mlx/shard-repair.js.map +1 -0
- package/dist/runtime/shared/env.d.ts +49 -0
- package/dist/runtime/shared/env.js +155 -0
- package/dist/runtime/shared/env.js.map +1 -0
- package/dist/runtime/shared/external-sessions.d.ts +67 -0
- package/dist/runtime/shared/external-sessions.js +155 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -0
- package/dist/runtime/shared/index.d.ts +17 -0
- package/dist/runtime/shared/index.js +18 -0
- package/dist/runtime/shared/index.js.map +1 -0
- package/dist/runtime/shared/load-cancel.d.ts +45 -0
- package/dist/runtime/shared/load-cancel.js +95 -0
- package/dist/runtime/shared/load-cancel.js.map +1 -0
- package/dist/runtime/shared/local-runtime.d.ts +68 -0
- package/dist/runtime/shared/local-runtime.js +12 -0
- package/dist/runtime/shared/local-runtime.js.map +1 -0
- package/dist/runtime/shared/log-stream.d.ts +4 -0
- package/dist/runtime/shared/log-stream.js +28 -0
- package/dist/runtime/shared/log-stream.js.map +1 -0
- package/dist/runtime/shared/paths.d.ts +21 -0
- package/dist/runtime/shared/paths.js +63 -0
- package/dist/runtime/shared/paths.js.map +1 -0
- package/dist/runtime/shared/ports.d.ts +26 -0
- package/dist/runtime/shared/ports.js +45 -0
- package/dist/runtime/shared/ports.js.map +1 -0
- package/dist/runtime/shared/process.d.ts +95 -0
- package/dist/runtime/shared/process.js +224 -0
- package/dist/runtime/shared/process.js.map +1 -0
- package/dist/runtime/shared/sidecar.d.ts +86 -0
- package/dist/runtime/shared/sidecar.js +214 -0
- package/dist/runtime/shared/sidecar.js.map +1 -0
- package/dist/server/clients.d.ts +40 -0
- package/dist/server/clients.js +74 -0
- package/dist/server/clients.js.map +1 -0
- package/dist/server/control/index.d.ts +12 -0
- package/dist/server/control/index.js +12 -0
- package/dist/server/control/index.js.map +1 -0
- package/dist/server/control/router.d.ts +9 -0
- package/dist/server/control/router.js +61 -0
- package/dist/server/control/router.js.map +1 -0
- package/dist/server/control/routes/backends.d.ts +4 -0
- package/dist/server/control/routes/backends.js +47 -0
- package/dist/server/control/routes/backends.js.map +1 -0
- package/dist/server/control/routes/clients.d.ts +4 -0
- package/dist/server/control/routes/clients.js +30 -0
- package/dist/server/control/routes/clients.js.map +1 -0
- package/dist/server/control/routes/cloud.d.ts +4 -0
- package/dist/server/control/routes/cloud.js +32 -0
- package/dist/server/control/routes/cloud.js.map +1 -0
- package/dist/server/control/routes/diffusion-video.d.ts +10 -0
- package/dist/server/control/routes/diffusion-video.js +33 -0
- package/dist/server/control/routes/diffusion-video.js.map +1 -0
- package/dist/server/control/routes/diffusion.d.ts +15 -0
- package/dist/server/control/routes/diffusion.js +71 -0
- package/dist/server/control/routes/diffusion.js.map +1 -0
- package/dist/server/control/routes/disk.d.ts +4 -0
- package/dist/server/control/routes/disk.js +11 -0
- package/dist/server/control/routes/disk.js.map +1 -0
- package/dist/server/control/routes/external-sessions.d.ts +4 -0
- package/dist/server/control/routes/external-sessions.js +27 -0
- package/dist/server/control/routes/external-sessions.js.map +1 -0
- package/dist/server/control/routes/hardware.d.ts +4 -0
- package/dist/server/control/routes/hardware.js +14 -0
- package/dist/server/control/routes/hardware.js.map +1 -0
- package/dist/server/control/routes/lifecycle.d.ts +12 -0
- package/dist/server/control/routes/lifecycle.js +67 -0
- package/dist/server/control/routes/lifecycle.js.map +1 -0
- package/dist/server/control/routes/models.d.ts +7 -0
- package/dist/server/control/routes/models.js +59 -0
- package/dist/server/control/routes/models.js.map +1 -0
- package/dist/server/control/routes/public-server.d.ts +4 -0
- package/dist/server/control/routes/public-server.js +30 -0
- package/dist/server/control/routes/public-server.js.map +1 -0
- package/dist/server/control/routes/remote-access.d.ts +7 -0
- package/dist/server/control/routes/remote-access.js +16 -0
- package/dist/server/control/routes/remote-access.js.map +1 -0
- package/dist/server/control/routes/settings.d.ts +4 -0
- package/dist/server/control/routes/settings.js +58 -0
- package/dist/server/control/routes/settings.js.map +1 -0
- package/dist/server/control/routes/telemetry.d.ts +7 -0
- package/dist/server/control/routes/telemetry.js +46 -0
- package/dist/server/control/routes/telemetry.js.map +1 -0
- package/dist/server/control/server.d.ts +26 -0
- package/dist/server/control/server.js +111 -0
- package/dist/server/control/server.js.map +1 -0
- package/dist/server/control/types.d.ts +271 -0
- package/dist/server/control/types.js +6 -0
- package/dist/server/control/types.js.map +1 -0
- package/dist/server/http.d.ts +62 -0
- package/dist/server/http.js +220 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/public/ctx.d.ts +23 -0
- package/dist/server/public/ctx.js +42 -0
- package/dist/server/public/ctx.js.map +1 -0
- package/dist/server/public/dynamic-hosts.d.ts +40 -0
- package/dist/server/public/dynamic-hosts.js +117 -0
- package/dist/server/public/dynamic-hosts.js.map +1 -0
- package/dist/server/public/errors.d.ts +36 -0
- package/dist/server/public/errors.js +120 -0
- package/dist/server/public/errors.js.map +1 -0
- package/dist/server/public/exchange.d.ts +42 -0
- package/dist/server/public/exchange.js +85 -0
- package/dist/server/public/exchange.js.map +1 -0
- package/dist/server/public/forward.d.ts +53 -0
- package/dist/server/public/forward.js +448 -0
- package/dist/server/public/forward.js.map +1 -0
- package/dist/server/public/gates.d.ts +49 -0
- package/dist/server/public/gates.js +181 -0
- package/dist/server/public/gates.js.map +1 -0
- package/dist/server/public/images-params.d.ts +50 -0
- package/dist/server/public/images-params.js +162 -0
- package/dist/server/public/images-params.js.map +1 -0
- package/dist/server/public/images.d.ts +12 -0
- package/dist/server/public/images.js +96 -0
- package/dist/server/public/images.js.map +1 -0
- package/dist/server/public/index.d.ts +58 -0
- package/dist/server/public/index.js +253 -0
- package/dist/server/public/index.js.map +1 -0
- package/dist/server/public/listing.d.ts +27 -0
- package/dist/server/public/listing.js +116 -0
- package/dist/server/public/listing.js.map +1 -0
- package/dist/server/public/responses.d.ts +11 -0
- package/dist/server/public/responses.js +158 -0
- package/dist/server/public/responses.js.map +1 -0
- package/dist/server/public/sse.d.ts +33 -0
- package/dist/server/public/sse.js +48 -0
- package/dist/server/public/sse.js.map +1 -0
- package/dist/server/public/static-assets.generated.d.ts +3 -0
- package/dist/server/public/static-assets.generated.js +6 -0
- package/dist/server/public/static-assets.generated.js.map +1 -0
- package/dist/server/public/static.d.ts +13 -0
- package/dist/server/public/static.js +75 -0
- package/dist/server/public/static.js.map +1 -0
- package/dist/server/public/subscription.d.ts +14 -0
- package/dist/server/public/subscription.js +56 -0
- package/dist/server/public/subscription.js.map +1 -0
- package/dist/server/public/telemetry.d.ts +65 -0
- package/dist/server/public/telemetry.js +284 -0
- package/dist/server/public/telemetry.js.map +1 -0
- package/dist/server/public/trace.d.ts +66 -0
- package/dist/server/public/trace.js +223 -0
- package/dist/server/public/trace.js.map +1 -0
- package/dist/server/public/types.d.ts +131 -0
- package/dist/server/public/types.js +9 -0
- package/dist/server/public/types.js.map +1 -0
- package/dist/server/public/videos-params.d.ts +95 -0
- package/dist/server/public/videos-params.js +220 -0
- package/dist/server/public/videos-params.js.map +1 -0
- package/dist/server/public/videos.d.ts +16 -0
- package/dist/server/public/videos.js +188 -0
- package/dist/server/public/videos.js.map +1 -0
- package/dist/server/public/wire.d.ts +53 -0
- package/dist/server/public/wire.js +174 -0
- package/dist/server/public/wire.js.map +1 -0
- package/dist/server/shims/anthropic.d.ts +52 -0
- package/dist/server/shims/anthropic.js +519 -0
- package/dist/server/shims/anthropic.js.map +1 -0
- package/dist/server/shims/chat-to-responses.d.ts +113 -0
- package/dist/server/shims/chat-to-responses.js +557 -0
- package/dist/server/shims/chat-to-responses.js.map +1 -0
- package/dist/server/shims/index.d.ts +8 -0
- package/dist/server/shims/index.js +9 -0
- package/dist/server/shims/index.js.map +1 -0
- package/dist/server/shims/json.d.ts +10 -0
- package/dist/server/shims/json.js +78 -0
- package/dist/server/shims/json.js.map +1 -0
- package/dist/server/shims/responses.d.ts +79 -0
- package/dist/server/shims/responses.js +543 -0
- package/dist/server/shims/responses.js.map +1 -0
- package/dist/server/state-file.d.ts +44 -0
- package/dist/server/state-file.js +107 -0
- package/dist/server/state-file.js.map +1 -0
- package/dist/settings/import.d.ts +61 -0
- package/dist/settings/import.js +104 -0
- package/dist/settings/import.js.map +1 -0
- package/dist/settings/index.d.ts +11 -0
- package/dist/settings/index.js +12 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/schema/foundation-models.json +1 -0
- package/dist/settings/schema/llamacpp-upstream.json +489 -0
- package/dist/settings/schema/llamacpp.json +475 -0
- package/dist/settings/schema/mlx.json +136 -0
- package/dist/settings/schema.d.ts +35 -0
- package/dist/settings/schema.js +196 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/settings/store.d.ts +168 -0
- package/dist/settings/store.js +350 -0
- package/dist/settings/store.js.map +1 -0
- package/dist/speculative/chat-template-overrides.d.ts +35 -0
- package/dist/speculative/chat-template-overrides.js +142 -0
- package/dist/speculative/chat-template-overrides.js.map +1 -0
- package/dist/speculative/dflash-registry.d.ts +50 -0
- package/dist/speculative/dflash-registry.js +258 -0
- package/dist/speculative/dflash-registry.js.map +1 -0
- package/dist/speculative/gemma-mtp-registry.d.ts +48 -0
- package/dist/speculative/gemma-mtp-registry.js +79 -0
- package/dist/speculative/gemma-mtp-registry.js.map +1 -0
- package/dist/speculative/index.d.ts +18 -0
- package/dist/speculative/index.js +19 -0
- package/dist/speculative/index.js.map +1 -0
- package/dist/speculative/mlx-dflash-registry.d.ts +39 -0
- package/dist/speculative/mlx-dflash-registry.js +230 -0
- package/dist/speculative/mlx-dflash-registry.js.map +1 -0
- package/dist/speculative/mlx-eagle3-registry.d.ts +24 -0
- package/dist/speculative/mlx-eagle3-registry.js +81 -0
- package/dist/speculative/mlx-eagle3-registry.js.map +1 -0
- package/dist/speculative/mlx-mtp-registry.d.ts +31 -0
- package/dist/speculative/mlx-mtp-registry.js +139 -0
- package/dist/speculative/mlx-mtp-registry.js.map +1 -0
- package/dist/speculative/transcription-registry.d.ts +72 -0
- package/dist/speculative/transcription-registry.js +94 -0
- package/dist/speculative/transcription-registry.js.map +1 -0
- package/dist/telemetry/config.d.ts +38 -0
- package/dist/telemetry/config.js +44 -0
- package/dist/telemetry/config.js.map +1 -0
- package/dist/telemetry/consent.d.ts +21 -0
- package/dist/telemetry/consent.js +35 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/core-reporter.d.ts +47 -0
- package/dist/telemetry/core-reporter.js +72 -0
- package/dist/telemetry/core-reporter.js.map +1 -0
- package/dist/telemetry/daemon.d.ts +40 -0
- package/dist/telemetry/daemon.js +67 -0
- package/dist/telemetry/daemon.js.map +1 -0
- package/dist/telemetry/dsn.d.ts +15 -0
- package/dist/telemetry/dsn.js +32 -0
- package/dist/telemetry/dsn.js.map +1 -0
- package/dist/telemetry/envelope.d.ts +97 -0
- package/dist/telemetry/envelope.js +95 -0
- package/dist/telemetry/envelope.js.map +1 -0
- package/dist/telemetry/index.d.ts +18 -0
- package/dist/telemetry/index.js +19 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/policy.d.ts +39 -0
- package/dist/telemetry/policy.js +142 -0
- package/dist/telemetry/policy.js.map +1 -0
- package/dist/telemetry/reporter.d.ts +80 -0
- package/dist/telemetry/reporter.js +0 -0
- package/dist/telemetry/reporter.js.map +1 -0
- package/dist/telemetry/reports.d.ts +68 -0
- package/dist/telemetry/reports.js +212 -0
- package/dist/telemetry/reports.js.map +1 -0
- package/dist/telemetry/scrub.d.ts +19 -0
- package/dist/telemetry/scrub.js +75 -0
- package/dist/telemetry/scrub.js.map +1 -0
- package/dist/telemetry/stack.d.ts +21 -0
- package/dist/telemetry/stack.js +68 -0
- package/dist/telemetry/stack.js.map +1 -0
- package/dist/telemetry/store.d.ts +17 -0
- package/dist/telemetry/store.js +51 -0
- package/dist/telemetry/store.js.map +1 -0
- package/dist/telemetry/subscribe.d.ts +13 -0
- package/dist/telemetry/subscribe.js +19 -0
- package/dist/telemetry/subscribe.js.map +1 -0
- package/dist/telemetry/types.d.ts +40 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/util/index.d.ts +5 -0
- package/dist/util/index.js +6 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/rust-number.d.ts +27 -0
- package/dist/util/rust-number.js +101 -0
- package/dist/util/rust-number.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +86 -0
- package/src/settings/schema/foundation-models.json +1 -0
- package/src/settings/schema/llamacpp-upstream.json +489 -0
- package/src/settings/schema/llamacpp.json +475 -0
- package/src/settings/schema/mlx.json +136 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote access: a Cloudflare quick tunnel in front of the Local API Server.
|
|
3
|
+
*
|
|
4
|
+
* `cloudflared` gives the OpenAI-compatible API a temporary public `https://<words>.trycloudflare.com`
|
|
5
|
+
* address, so another Atomic Chat, an SDK or a coding agent can use this machine's models from
|
|
6
|
+
* anywhere. No account, no domain, a new URL on every start.
|
|
7
|
+
*
|
|
8
|
+
* Shape of the code:
|
|
9
|
+
*
|
|
10
|
+
* - `RemoteAccessManager` is the state machine the control routes talk to. JavaScript gives it what
|
|
11
|
+
* the Rust original needed a mutex for: nothing here awaits between reading the state and writing
|
|
12
|
+
* it, so `start` and `stop` decide on a consistent view.
|
|
13
|
+
* - One *supervisor* per run owns the child process. It waits for the tunnel to register, proves the
|
|
14
|
+
* URL reaches this server before anybody sees it, then watches for the process to exit. A `run`
|
|
15
|
+
* counter makes a supervisor that was overtaken (a stop timed out, the core is shutting down)
|
|
16
|
+
* unable to write state any more.
|
|
17
|
+
* - Every transition is pushed to clients as `remote-access:status`, because the URL arrives seconds
|
|
18
|
+
* after the request that asked for it has answered.
|
|
19
|
+
*
|
|
20
|
+
* The API key is deliberately not a precondition: exposing the server without one is the user's
|
|
21
|
+
* call, made explicit by the frontend.
|
|
22
|
+
*
|
|
23
|
+
* PRIVACY: the tunnel URL is never logged.
|
|
24
|
+
*
|
|
25
|
+
* Ported from: src-tauri/src/core/server/remote_access/mod.rs (image-generation line, `767ff6350`).
|
|
26
|
+
* ADR 2026-09-17-the-core-owns-the-cloudflare-quick-tunnel.
|
|
27
|
+
*/
|
|
28
|
+
import { AtomicCoreError } from '../contracts/index.js';
|
|
29
|
+
import { DEFAULT_TUNNEL_TIMINGS } from './process.js';
|
|
30
|
+
import { OFF, deriveStatus, failed, hostOf } from './status.js';
|
|
31
|
+
/**
|
|
32
|
+
* cloudflared picks QUIC (UDP) by itself. Networks that drop UDP still let the HTTP/2 (TCP)
|
|
33
|
+
* transport through, on the same port 7844, so that is the one retry worth making.
|
|
34
|
+
*/
|
|
35
|
+
const PROTOCOL_ATTEMPTS = [undefined, 'http2'];
|
|
36
|
+
/** How long `stop` waits for the supervisor beyond its own grace periods. */
|
|
37
|
+
const STOP_SUPERVISOR_MARGIN_MS = 2_000;
|
|
38
|
+
const REFUSAL_CODES = {
|
|
39
|
+
server_stopped: 'REMOTE_ACCESS_SERVER_STOPPED',
|
|
40
|
+
operation_in_progress: 'REMOTE_ACCESS_OPERATION_IN_PROGRESS',
|
|
41
|
+
stop_failed: 'REMOTE_ACCESS_STOP_FAILED',
|
|
42
|
+
};
|
|
43
|
+
const REFUSAL_MESSAGES = {
|
|
44
|
+
server_stopped: 'Start the Local API Server before opening a tunnel to it.',
|
|
45
|
+
operation_in_progress: 'The tunnel is being stopped; try again once it is down.',
|
|
46
|
+
stop_failed: 'The previous tunnel may still be running; stop it first.',
|
|
47
|
+
};
|
|
48
|
+
/** The refusal of a start. `details` is the app's machine-readable reason, which its parser reads. */
|
|
49
|
+
export function remoteAccessRefusal(reason) {
|
|
50
|
+
return new AtomicCoreError(REFUSAL_CODES[reason], REFUSAL_MESSAGES[reason], reason);
|
|
51
|
+
}
|
|
52
|
+
const defaultExitHook = (hook) => {
|
|
53
|
+
process.once('exit', hook);
|
|
54
|
+
return () => process.off('exit', hook);
|
|
55
|
+
};
|
|
56
|
+
export class RemoteAccessManager {
|
|
57
|
+
deps;
|
|
58
|
+
phase = OFF;
|
|
59
|
+
url;
|
|
60
|
+
/** Identifies the supervisor allowed to write this state. */
|
|
61
|
+
run = 0;
|
|
62
|
+
/** Kept while the process may still be alive: for shutdown, and to retry a stop that was not confirmed. */
|
|
63
|
+
tunnel;
|
|
64
|
+
signalStop;
|
|
65
|
+
supervisor;
|
|
66
|
+
stopping;
|
|
67
|
+
probe;
|
|
68
|
+
removeExitHook;
|
|
69
|
+
timings;
|
|
70
|
+
constructor(deps) {
|
|
71
|
+
this.deps = deps;
|
|
72
|
+
this.timings = { ...DEFAULT_TUNNEL_TIMINGS, ...deps.timings };
|
|
73
|
+
}
|
|
74
|
+
status() {
|
|
75
|
+
return deriveStatus({ phase: this.phase, url: this.url }, this.deps.server());
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Computes the status and pushes it to clients. Also called when the public server starts or
|
|
79
|
+
* stops: `blockReason` and `canStart` follow the server, not only the tunnel.
|
|
80
|
+
*/
|
|
81
|
+
announce() {
|
|
82
|
+
const status = this.status();
|
|
83
|
+
this.deps.emit(status);
|
|
84
|
+
return status;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Starts a tunnel and answers at once with `starting`; the rest is reported through events.
|
|
88
|
+
* Refuses with a machine-readable reason. Synchronous on purpose: the endpoint is read and the
|
|
89
|
+
* phase flipped with nothing in between.
|
|
90
|
+
*/
|
|
91
|
+
start() {
|
|
92
|
+
const server = this.deps.server();
|
|
93
|
+
if (!server)
|
|
94
|
+
throw remoteAccessRefusal('server_stopped');
|
|
95
|
+
const phase = this.phase;
|
|
96
|
+
if (phase.kind === 'stopping')
|
|
97
|
+
throw remoteAccessRefusal('operation_in_progress');
|
|
98
|
+
if (phase.kind === 'failed' && phase.error === 'stop_failed')
|
|
99
|
+
throw remoteAccessRefusal('stop_failed');
|
|
100
|
+
// `starting` and `online` are already on their way or up: asking again changes nothing. A failed
|
|
101
|
+
// attempt is simply dismissed by the next one.
|
|
102
|
+
if (phase.kind === 'off' || phase.kind === 'failed') {
|
|
103
|
+
const run = ++this.run;
|
|
104
|
+
this.phase = { kind: 'starting' };
|
|
105
|
+
this.url = undefined;
|
|
106
|
+
this.tunnel = undefined;
|
|
107
|
+
const stopped = new Promise((resolve) => (this.signalStop = resolve));
|
|
108
|
+
// The endpoint carries the *bound* port (a fallback can change it) and a host that listens.
|
|
109
|
+
this.supervisor = this.supervise(run, server.origin, stopped).catch((error) => {
|
|
110
|
+
this.deps.log?.('warn', `remote access: the tunnel supervisor failed: ${error.message}`);
|
|
111
|
+
if (this.isCurrent(run))
|
|
112
|
+
return this.endRun(run, this.tunnel, failed('exited'));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return this.announce();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stops the tunnel and answers once it is down (normally well under a second; up to the two
|
|
119
|
+
* grace periods when the process does not react). A stop already under way is joined, so whoever
|
|
120
|
+
* needs the tunnel gone — the public server, above all — can rely on the answer.
|
|
121
|
+
*/
|
|
122
|
+
stop() {
|
|
123
|
+
if (this.stopping)
|
|
124
|
+
return this.stopping;
|
|
125
|
+
const stopping = this.stopNow().finally(() => {
|
|
126
|
+
if (this.stopping === stopping)
|
|
127
|
+
this.stopping = undefined;
|
|
128
|
+
});
|
|
129
|
+
this.stopping = stopping;
|
|
130
|
+
return stopping;
|
|
131
|
+
}
|
|
132
|
+
async stopNow() {
|
|
133
|
+
const phase = this.phase;
|
|
134
|
+
if (phase.kind === 'failed' && phase.error === 'stop_failed') {
|
|
135
|
+
// The retry goes through the handle that was kept for it.
|
|
136
|
+
const confirmed = this.tunnel ? await this.tunnel.terminate(this.timings) : true;
|
|
137
|
+
if (confirmed)
|
|
138
|
+
await this.settleStopped();
|
|
139
|
+
}
|
|
140
|
+
else if (phase.kind === 'failed') {
|
|
141
|
+
this.phase = OFF;
|
|
142
|
+
this.url = undefined;
|
|
143
|
+
}
|
|
144
|
+
else if (phase.kind === 'starting' || phase.kind === 'online') {
|
|
145
|
+
const run = this.run;
|
|
146
|
+
this.phase = { kind: 'stopping' };
|
|
147
|
+
this.announce();
|
|
148
|
+
this.signalStop?.();
|
|
149
|
+
this.signalStop = undefined;
|
|
150
|
+
const limit = this.timings.termGraceMs + this.timings.killGraceMs + STOP_SUPERVISOR_MARGIN_MS;
|
|
151
|
+
const finished = await this.within(this.supervisor, limit);
|
|
152
|
+
if (!finished && this.run === run && this.phase.kind === 'stopping') {
|
|
153
|
+
// The supervisor is stuck. Take the state away from it so it cannot write later, and say
|
|
154
|
+
// what is true: a tunnel may still be running.
|
|
155
|
+
this.run++;
|
|
156
|
+
this.phase = failed('stop_failed');
|
|
157
|
+
this.url = undefined;
|
|
158
|
+
this.probe?.abort();
|
|
159
|
+
this.deps.hosts.clearTunnelHost();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return this.announce();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Synchronous teardown for a shutdown that cannot wait: signals only. Whatever the supervisor
|
|
166
|
+
* still does, it no longer owns the state.
|
|
167
|
+
*/
|
|
168
|
+
killNow() {
|
|
169
|
+
this.run++;
|
|
170
|
+
this.phase = OFF;
|
|
171
|
+
this.url = undefined;
|
|
172
|
+
this.signalStop = undefined;
|
|
173
|
+
this.probe?.abort();
|
|
174
|
+
this.deps.hosts.clearTunnelHost();
|
|
175
|
+
this.tunnel?.killNow();
|
|
176
|
+
this.tunnel = undefined;
|
|
177
|
+
this.removeExitHook?.();
|
|
178
|
+
this.removeExitHook = undefined;
|
|
179
|
+
void this.deps.journal?.clear().catch(() => { });
|
|
180
|
+
}
|
|
181
|
+
isCurrent(run) {
|
|
182
|
+
return this.run === run;
|
|
183
|
+
}
|
|
184
|
+
within(work, ms) {
|
|
185
|
+
if (!work)
|
|
186
|
+
return Promise.resolve(true);
|
|
187
|
+
return new Promise((resolve) => {
|
|
188
|
+
const timer = setTimeout(() => resolve(false), ms);
|
|
189
|
+
timer.unref?.();
|
|
190
|
+
void work.then(() => {
|
|
191
|
+
clearTimeout(timer);
|
|
192
|
+
resolve(true);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async settleStopped() {
|
|
197
|
+
this.deps.hosts.clearTunnelHost();
|
|
198
|
+
this.phase = OFF;
|
|
199
|
+
this.url = undefined;
|
|
200
|
+
this.tunnel = undefined;
|
|
201
|
+
this.removeExitHook?.();
|
|
202
|
+
this.removeExitHook = undefined;
|
|
203
|
+
await this.deps.journal?.clear().catch(() => { });
|
|
204
|
+
}
|
|
205
|
+
recordChild(run, tunnel) {
|
|
206
|
+
if (!this.isCurrent(run))
|
|
207
|
+
return;
|
|
208
|
+
this.tunnel = tunnel;
|
|
209
|
+
this.removeExitHook?.();
|
|
210
|
+
this.removeExitHook = (this.deps.onProcessExit ?? defaultExitHook)(() => tunnel.killNow());
|
|
211
|
+
if (tunnel.pid !== undefined)
|
|
212
|
+
void this.deps.journal?.record(tunnel.pid, tunnel.exe).catch(() => { });
|
|
213
|
+
}
|
|
214
|
+
/** Flips `starting` to `online`. `false` means a stop got there first. */
|
|
215
|
+
goOnline(run, url) {
|
|
216
|
+
if (!this.isCurrent(run) || this.phase.kind !== 'starting')
|
|
217
|
+
return false;
|
|
218
|
+
this.phase = { kind: 'online' };
|
|
219
|
+
this.url = url;
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Ends the process and records how the run ended. An exit that cannot be confirmed overrides
|
|
224
|
+
* `outcome`: the truth is then "may still be running".
|
|
225
|
+
*/
|
|
226
|
+
async endRun(run, tunnel, outcome) {
|
|
227
|
+
const confirmed = tunnel ? await tunnel.terminate(this.timings) : true;
|
|
228
|
+
// Overtaken (a stop timed out, or the core is shutting down): whoever took over has already
|
|
229
|
+
// written the state and cleared the host.
|
|
230
|
+
if (!this.isCurrent(run))
|
|
231
|
+
return;
|
|
232
|
+
this.deps.hosts.clearTunnelHost();
|
|
233
|
+
this.url = undefined;
|
|
234
|
+
this.signalStop = undefined;
|
|
235
|
+
if (confirmed) {
|
|
236
|
+
// A stop that raced with a failure still ends in `off`: the user asked for nothing to be
|
|
237
|
+
// running, and nothing is.
|
|
238
|
+
this.phase = this.phase.kind === 'stopping' ? OFF : outcome;
|
|
239
|
+
this.tunnel = undefined;
|
|
240
|
+
this.removeExitHook?.();
|
|
241
|
+
this.removeExitHook = undefined;
|
|
242
|
+
await this.deps.journal?.clear().catch(() => { });
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
this.phase = failed('stop_failed');
|
|
246
|
+
}
|
|
247
|
+
if (outcome.kind === 'failed')
|
|
248
|
+
this.deps.log?.('warn', `remote access: the tunnel ended: ${outcome.error}`);
|
|
249
|
+
this.announce();
|
|
250
|
+
}
|
|
251
|
+
async supervise(run, origin, stopped) {
|
|
252
|
+
const timings = this.timings;
|
|
253
|
+
for (const [attempt, protocol] of PROTOCOL_ATTEMPTS.entries()) {
|
|
254
|
+
const tunnel = await this.deps.spawner(origin, protocol);
|
|
255
|
+
if (!tunnel)
|
|
256
|
+
return this.endRun(run, undefined, failed('cloudflared_unavailable'));
|
|
257
|
+
if (!this.isCurrent(run)) {
|
|
258
|
+
// Shut down while the binary was being located: this process was never ours to keep.
|
|
259
|
+
tunnel.killNow();
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
this.recordChild(run, tunnel);
|
|
263
|
+
const ready = await Promise.race([stopped.then(() => undefined), tunnel.waitReady(timings.readyMs)]);
|
|
264
|
+
if (ready === undefined)
|
|
265
|
+
return this.endRun(run, tunnel, OFF);
|
|
266
|
+
if (ready.kind === 'spawn-failed')
|
|
267
|
+
return this.endRun(run, tunnel, failed('cloudflared_unavailable'));
|
|
268
|
+
if (ready.kind !== 'url') {
|
|
269
|
+
const isLastAttempt = attempt + 1 === PROTOCOL_ATTEMPTS.length;
|
|
270
|
+
// A URL without a registered connection is what a network that drops QUIC looks like; no
|
|
271
|
+
// URL at all means Cloudflare was not reached, and another transport will not help.
|
|
272
|
+
if (ready.sawUrl && !isLastAttempt) {
|
|
273
|
+
if (!(await tunnel.terminate(timings)))
|
|
274
|
+
return this.endRun(run, tunnel, failed('stop_failed'));
|
|
275
|
+
this.deps.log?.('info', 'remote access: no edge connection registered; retrying over HTTP/2');
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
return this.endRun(run, tunnel, failed(ready.sawUrl ? 'not_registered' : 'no_url'));
|
|
279
|
+
}
|
|
280
|
+
const host = hostOf(ready.url);
|
|
281
|
+
if (host === undefined)
|
|
282
|
+
return this.endRun(run, tunnel, failed('no_url'));
|
|
283
|
+
// Before the probe, not after it: the probe path is exempt from Host validation, the first
|
|
284
|
+
// real request is not.
|
|
285
|
+
if (this.isCurrent(run))
|
|
286
|
+
this.deps.hosts.setTunnelHost(host);
|
|
287
|
+
const probe = new AbortController();
|
|
288
|
+
this.probe = probe;
|
|
289
|
+
const verified = await Promise.race([
|
|
290
|
+
stopped.then(() => 'stopped'),
|
|
291
|
+
tunnel.waitExit().then(() => 'exited'),
|
|
292
|
+
this.deps.prober
|
|
293
|
+
.verify(ready.url, timings.probeTotalMs, probe.signal)
|
|
294
|
+
.then((reachable) => (reachable ? 'reachable' : 'unreachable')),
|
|
295
|
+
]);
|
|
296
|
+
probe.abort();
|
|
297
|
+
if (verified === 'stopped')
|
|
298
|
+
return this.endRun(run, tunnel, OFF);
|
|
299
|
+
if (verified === 'exited')
|
|
300
|
+
return this.endRun(run, tunnel, failed('exited'));
|
|
301
|
+
if (verified === 'unreachable')
|
|
302
|
+
return this.endRun(run, tunnel, failed('not_reachable'));
|
|
303
|
+
// A stop arrived between the probe and here.
|
|
304
|
+
if (!this.goOnline(run, ready.url))
|
|
305
|
+
return this.endRun(run, tunnel, OFF);
|
|
306
|
+
this.deps.log?.('info', 'remote access: the tunnel is online');
|
|
307
|
+
this.announce();
|
|
308
|
+
const outcome = await Promise.race([
|
|
309
|
+
stopped.then(() => OFF),
|
|
310
|
+
tunnel.waitExit().then(() => failed('exited')),
|
|
311
|
+
]);
|
|
312
|
+
return this.endRun(run, tunnel, outcome);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/remote-access/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proves a freshly minted tunnel URL reaches *this* server before it is shown to the user.
|
|
3
|
+
*
|
|
4
|
+
* "Registered" only means cloudflared has an edge connection. The public name still has to
|
|
5
|
+
* propagate, and until it does a visitor gets Cloudflare's own error page. A QR code that opens an
|
|
6
|
+
* error page is worse than a few more seconds of "Starting…", so the URL is fetched once from the
|
|
7
|
+
* outside first.
|
|
8
|
+
*
|
|
9
|
+
* The probe goes through Cloudflare's edge *by SNI* before it ever asks DNS for the new name: the
|
|
10
|
+
* edge routes on the TLS server name, so it serves the tunnel before the hostname resolves anywhere,
|
|
11
|
+
* and an early OS lookup would negative-cache the NXDOMAIN (for up to half an hour on some
|
|
12
|
+
* resolvers) and blind every later attempt. Only when the edge path gives nothing does the probe
|
|
13
|
+
* fall back to the hostname, inside the same overall budget.
|
|
14
|
+
*
|
|
15
|
+
* Through the raw-socket client, not `node:https`: an agent or `lookup` override is what Bun ignores
|
|
16
|
+
* silently (ADR 2026-09-17-probe-the-tunnel-through-the-raw-socket-client-with-an-address-pin).
|
|
17
|
+
*
|
|
18
|
+
* Ported from: src-tauri/src/core/server/remote_access/probe.rs (image-generation line, `767ff6350`).
|
|
19
|
+
*/
|
|
20
|
+
import type { ProxyPolicy } from '../downloads/index.js';
|
|
21
|
+
/**
|
|
22
|
+
* Served without an API key and exempt from Host validation (it is the Swagger document), so it
|
|
23
|
+
* answers the same whatever the user configured.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PROBE_PATH = "/openapi.json";
|
|
26
|
+
/**
|
|
27
|
+
* `info.title` of the server's OpenAPI document. A Cloudflare error page, a captive portal or
|
|
28
|
+
* somebody else's server is an *answer*, but not this one.
|
|
29
|
+
*/
|
|
30
|
+
export declare const PROBE_MARKER = "Atomic Chat API Server Endpoints";
|
|
31
|
+
/** The real document is ~33 KB; anything far larger is not ours. */
|
|
32
|
+
export declare const PROBE_BODY_CAP: number;
|
|
33
|
+
export interface ProbeTimings {
|
|
34
|
+
/** Leaves most of the budget to the hostname fallback. */
|
|
35
|
+
edgeWaitMaxMs: number;
|
|
36
|
+
edgeRetryDelayMs: number;
|
|
37
|
+
hostnameRetryDelayMs: number;
|
|
38
|
+
attemptTimeoutMs: number;
|
|
39
|
+
}
|
|
40
|
+
export declare const DEFAULT_PROBE_TIMINGS: ProbeTimings;
|
|
41
|
+
export interface EdgeAddress {
|
|
42
|
+
host: string;
|
|
43
|
+
port: number;
|
|
44
|
+
}
|
|
45
|
+
/** What one fetch established. */
|
|
46
|
+
export type ProbeAnswer =
|
|
47
|
+
/** Our document came back. */
|
|
48
|
+
'ours'
|
|
49
|
+
/** Something answered, but not this server (yet). */
|
|
50
|
+
| 'foreign'
|
|
51
|
+
/** Nothing answered at all. */
|
|
52
|
+
| 'unreachable';
|
|
53
|
+
export interface Prober {
|
|
54
|
+
/**
|
|
55
|
+
* `true` once `url` answers as this core's public server, `false` if it never does within
|
|
56
|
+
* `budgetMs` or `signal` aborts first.
|
|
57
|
+
*/
|
|
58
|
+
verify(url: string, budgetMs: number, signal?: AbortSignal): Promise<boolean>;
|
|
59
|
+
}
|
|
60
|
+
export declare function bodyIsOurs(body: string): boolean;
|
|
61
|
+
/** One fetch of the probe document from `baseUrl`, on its own connection. */
|
|
62
|
+
export declare function probeOnce(fetchImpl: typeof fetch, baseUrl: string, timeoutMs: number, signal?: AbortSignal): Promise<ProbeAnswer>;
|
|
63
|
+
export interface PublicProberDeps {
|
|
64
|
+
/** Cloudflare's edge addresses; at most two are tried, IPv4 first. */
|
|
65
|
+
edgeAddresses?: () => Promise<EdgeAddress[]>;
|
|
66
|
+
/** The client for one attempt; the seam that lets a test stand in for the edge. */
|
|
67
|
+
fetchFor?: (policy: ProxyPolicy) => typeof fetch;
|
|
68
|
+
timings?: Partial<ProbeTimings>;
|
|
69
|
+
/** Extra trusted CA certificates, PEM — a test hook, as for the ChatGPT endpoints. */
|
|
70
|
+
ca?: ProxyPolicy['ca'];
|
|
71
|
+
now?: () => number;
|
|
72
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
/** Cloudflare's edge addresses, IPv4 first, at most two distinct ones. */
|
|
75
|
+
export declare function resolveEdgeAddresses(resolve?: (host: string) => Promise<Array<{
|
|
76
|
+
address: string;
|
|
77
|
+
family: number;
|
|
78
|
+
}>>): Promise<EdgeAddress[]>;
|
|
79
|
+
/** The production prober: edge-by-SNI first, then the hostname. */
|
|
80
|
+
export declare class PublicProber implements Prober {
|
|
81
|
+
private readonly deps;
|
|
82
|
+
private readonly timings;
|
|
83
|
+
private readonly edgeAddresses;
|
|
84
|
+
private readonly fetchFor;
|
|
85
|
+
private readonly now;
|
|
86
|
+
private readonly sleep;
|
|
87
|
+
constructor(deps?: PublicProberDeps);
|
|
88
|
+
verify(url: string, budgetMs: number, signal?: AbortSignal): Promise<boolean>;
|
|
89
|
+
private policy;
|
|
90
|
+
private verifyThroughEdge;
|
|
91
|
+
private verifyThroughHostname;
|
|
92
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proves a freshly minted tunnel URL reaches *this* server before it is shown to the user.
|
|
3
|
+
*
|
|
4
|
+
* "Registered" only means cloudflared has an edge connection. The public name still has to
|
|
5
|
+
* propagate, and until it does a visitor gets Cloudflare's own error page. A QR code that opens an
|
|
6
|
+
* error page is worse than a few more seconds of "Starting…", so the URL is fetched once from the
|
|
7
|
+
* outside first.
|
|
8
|
+
*
|
|
9
|
+
* The probe goes through Cloudflare's edge *by SNI* before it ever asks DNS for the new name: the
|
|
10
|
+
* edge routes on the TLS server name, so it serves the tunnel before the hostname resolves anywhere,
|
|
11
|
+
* and an early OS lookup would negative-cache the NXDOMAIN (for up to half an hour on some
|
|
12
|
+
* resolvers) and blind every later attempt. Only when the edge path gives nothing does the probe
|
|
13
|
+
* fall back to the hostname, inside the same overall budget.
|
|
14
|
+
*
|
|
15
|
+
* Through the raw-socket client, not `node:https`: an agent or `lookup` override is what Bun ignores
|
|
16
|
+
* silently (ADR 2026-09-17-probe-the-tunnel-through-the-raw-socket-client-with-an-address-pin).
|
|
17
|
+
*
|
|
18
|
+
* Ported from: src-tauri/src/core/server/remote_access/probe.rs (image-generation line, `767ff6350`).
|
|
19
|
+
*/
|
|
20
|
+
import { lookup } from 'node:dns/promises';
|
|
21
|
+
import { createPolicyFetch } from '../downloads/index.js';
|
|
22
|
+
import { hostOf } from './status.js';
|
|
23
|
+
/**
|
|
24
|
+
* Served without an API key and exempt from Host validation (it is the Swagger document), so it
|
|
25
|
+
* answers the same whatever the user configured.
|
|
26
|
+
*/
|
|
27
|
+
export const PROBE_PATH = '/openapi.json';
|
|
28
|
+
/**
|
|
29
|
+
* `info.title` of the server's OpenAPI document. A Cloudflare error page, a captive portal or
|
|
30
|
+
* somebody else's server is an *answer*, but not this one.
|
|
31
|
+
*/
|
|
32
|
+
export const PROBE_MARKER = 'Atomic Chat API Server Endpoints';
|
|
33
|
+
/** The real document is ~33 KB; anything far larger is not ours. */
|
|
34
|
+
export const PROBE_BODY_CAP = 256 * 1024;
|
|
35
|
+
const EDGE_HOST = 'trycloudflare.com';
|
|
36
|
+
const EDGE_PORT = 443;
|
|
37
|
+
export const DEFAULT_PROBE_TIMINGS = {
|
|
38
|
+
edgeWaitMaxMs: 15_000,
|
|
39
|
+
edgeRetryDelayMs: 500,
|
|
40
|
+
hostnameRetryDelayMs: 1_000,
|
|
41
|
+
attemptTimeoutMs: 5_000,
|
|
42
|
+
};
|
|
43
|
+
/** A network that blocks the edge blocks every attempt; stop paying for it. */
|
|
44
|
+
const EDGE_MAX_UNREACHABLE_ROUNDS = 2;
|
|
45
|
+
export function bodyIsOurs(body) {
|
|
46
|
+
try {
|
|
47
|
+
const json = JSON.parse(body);
|
|
48
|
+
return json?.info?.title === PROBE_MARKER;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** One fetch of the probe document from `baseUrl`, on its own connection. */
|
|
55
|
+
export async function probeOnce(fetchImpl, baseUrl, timeoutMs, signal) {
|
|
56
|
+
const limit = AbortSignal.timeout(timeoutMs);
|
|
57
|
+
const combined = signal ? AbortSignal.any([signal, limit]) : limit;
|
|
58
|
+
let response;
|
|
59
|
+
try {
|
|
60
|
+
response = await fetchImpl(`${baseUrl.replace(/\/+$/, '')}${PROBE_PATH}`, {
|
|
61
|
+
signal: combined,
|
|
62
|
+
headers: { 'user-agent': 'atomic-chat-remote-access-probe', 'accept': 'application/json' },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return 'unreachable';
|
|
67
|
+
}
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
await response.body?.cancel().catch(() => { });
|
|
70
|
+
return 'foreign';
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const reader = (response.body ?? new ReadableStream({ start: (c) => c.close() })).getReader();
|
|
74
|
+
const decoder = new TextDecoder();
|
|
75
|
+
let body = '';
|
|
76
|
+
let size = 0;
|
|
77
|
+
for (;;) {
|
|
78
|
+
const { done, value } = await reader.read();
|
|
79
|
+
if (done)
|
|
80
|
+
break;
|
|
81
|
+
size += value.byteLength;
|
|
82
|
+
if (size > PROBE_BODY_CAP) {
|
|
83
|
+
await reader.cancel().catch(() => { });
|
|
84
|
+
return 'foreign';
|
|
85
|
+
}
|
|
86
|
+
body += decoder.decode(value, { stream: true });
|
|
87
|
+
}
|
|
88
|
+
return bodyIsOurs(body + decoder.decode()) ? 'ours' : 'foreign';
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return 'foreign';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Cloudflare's edge addresses, IPv4 first, at most two distinct ones. */
|
|
95
|
+
export async function resolveEdgeAddresses(resolve = (host) => lookup(host, { all: true })) {
|
|
96
|
+
let resolved;
|
|
97
|
+
try {
|
|
98
|
+
resolved = await resolve(EDGE_HOST);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
const distinct = resolved.filter((entry, index) => resolved.findIndex((other) => other.address === entry.address) === index);
|
|
104
|
+
return [...distinct]
|
|
105
|
+
.sort((left, right) => Number(left.family !== 4) - Number(right.family !== 4))
|
|
106
|
+
.slice(0, 2)
|
|
107
|
+
.map((entry) => ({ host: entry.address, port: EDGE_PORT }));
|
|
108
|
+
}
|
|
109
|
+
function defaultSleep(ms, signal) {
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
if (signal?.aborted)
|
|
112
|
+
return resolve();
|
|
113
|
+
const timer = setTimeout(done, ms);
|
|
114
|
+
timer.unref?.();
|
|
115
|
+
function done() {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
signal?.removeEventListener('abort', done);
|
|
118
|
+
resolve();
|
|
119
|
+
}
|
|
120
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** The production prober: edge-by-SNI first, then the hostname. */
|
|
124
|
+
export class PublicProber {
|
|
125
|
+
deps;
|
|
126
|
+
timings;
|
|
127
|
+
edgeAddresses;
|
|
128
|
+
fetchFor;
|
|
129
|
+
now;
|
|
130
|
+
sleep;
|
|
131
|
+
constructor(deps = {}) {
|
|
132
|
+
this.deps = deps;
|
|
133
|
+
this.timings = { ...DEFAULT_PROBE_TIMINGS, ...deps.timings };
|
|
134
|
+
this.edgeAddresses = deps.edgeAddresses ?? (() => resolveEdgeAddresses());
|
|
135
|
+
this.fetchFor = deps.fetchFor ?? createPolicyFetch;
|
|
136
|
+
this.now = deps.now ?? Date.now;
|
|
137
|
+
this.sleep = deps.sleep ?? defaultSleep;
|
|
138
|
+
}
|
|
139
|
+
async verify(url, budgetMs, signal) {
|
|
140
|
+
if (hostOf(url) === undefined)
|
|
141
|
+
return false;
|
|
142
|
+
const deadline = this.now() + budgetMs;
|
|
143
|
+
if (await this.verifyThroughEdge(url, deadline, signal))
|
|
144
|
+
return true;
|
|
145
|
+
return this.verifyThroughHostname(url, deadline, signal);
|
|
146
|
+
}
|
|
147
|
+
policy(extra = {}) {
|
|
148
|
+
return this.deps.ca === undefined ? extra : { ...extra, ca: this.deps.ca };
|
|
149
|
+
}
|
|
150
|
+
async verifyThroughEdge(url, deadline, signal) {
|
|
151
|
+
const edgeDeadline = Math.min(deadline, this.now() + this.timings.edgeWaitMaxMs);
|
|
152
|
+
const addresses = await this.edgeAddresses();
|
|
153
|
+
if (addresses.length === 0)
|
|
154
|
+
return false;
|
|
155
|
+
let unreachableRounds = 0;
|
|
156
|
+
while (this.now() < edgeDeadline && !signal?.aborted) {
|
|
157
|
+
let anyAnswer = false;
|
|
158
|
+
for (const address of addresses) {
|
|
159
|
+
// The pin keeps the connection on the edge address while the TLS server name and `Host`
|
|
160
|
+
// stay the tunnel's: the SNI route. A fresh client per attempt means a fresh connection.
|
|
161
|
+
const pinned = this.fetchFor(this.policy({ connectTo: address }));
|
|
162
|
+
const answer = await probeOnce(pinned, url, this.timings.attemptTimeoutMs, signal);
|
|
163
|
+
if (answer === 'ours')
|
|
164
|
+
return true;
|
|
165
|
+
if (answer === 'foreign')
|
|
166
|
+
anyAnswer = true;
|
|
167
|
+
}
|
|
168
|
+
if (anyAnswer)
|
|
169
|
+
unreachableRounds = 0;
|
|
170
|
+
else if (++unreachableRounds >= EDGE_MAX_UNREACHABLE_ROUNDS)
|
|
171
|
+
return false;
|
|
172
|
+
await this.sleep(this.timings.edgeRetryDelayMs, signal);
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
async verifyThroughHostname(url, deadline, signal) {
|
|
177
|
+
while (this.now() < deadline && !signal?.aborted) {
|
|
178
|
+
const direct = this.fetchFor(this.policy());
|
|
179
|
+
if ((await probeOnce(direct, url, this.timings.attemptTimeoutMs, signal)) === 'ours')
|
|
180
|
+
return true;
|
|
181
|
+
await this.sleep(this.timings.hostnameRetryDelayMs, signal);
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/remote-access/probe.ts"],"names":[],"mappings":"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"}
|