@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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One core owner per data folder (PLAN.md §3.4, §3.6).
|
|
3
|
+
*
|
|
4
|
+
* `<data>/atomic-core/instance.lock` is created exclusively (`open` with `wx`); its record carries
|
|
5
|
+
* the owner's PID *and* start identity, so a client can tell a live owner from a recycled PID. The
|
|
6
|
+
* record is written twice: `starting` when the lock is taken and `ready` once the control listener
|
|
7
|
+
* is bound, so a client never dials a port that is not listening yet.
|
|
8
|
+
*
|
|
9
|
+
* Recovering a stale lock is itself serialised through a second exclusive file, otherwise two
|
|
10
|
+
* clients that start together both decide the lock is stale and both become owner. A lock whose
|
|
11
|
+
* owner is alive — or whose liveness cannot be disproven — is never taken over.
|
|
12
|
+
*/
|
|
13
|
+
import { AtomicCoreError } from '../contracts/index.js';
|
|
14
|
+
import type { DataLayout } from '../config/index.js';
|
|
15
|
+
import type { IdentityDeps, IdentityVerdict } from './process-identity.js';
|
|
16
|
+
export interface LockRecord {
|
|
17
|
+
instance_id: string;
|
|
18
|
+
owner_scope?: 'app' | 'cli' | undefined;
|
|
19
|
+
pid: number;
|
|
20
|
+
process_start_id: string | null;
|
|
21
|
+
owner_started_at?: string | null;
|
|
22
|
+
protocol: number;
|
|
23
|
+
version: string;
|
|
24
|
+
/** Canonical data folder: the lock's scope, so two paths to the same folder collide as they should. */
|
|
25
|
+
data_folder: string;
|
|
26
|
+
control_host: string;
|
|
27
|
+
control_port: number;
|
|
28
|
+
state: 'starting' | 'ready';
|
|
29
|
+
acquired_at: string;
|
|
30
|
+
}
|
|
31
|
+
export type LockState = {
|
|
32
|
+
kind: 'free';
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'owned';
|
|
35
|
+
record: LockRecord;
|
|
36
|
+
verdict: Extract<IdentityVerdict, 'match' | 'unknown'>;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'stale';
|
|
39
|
+
record: LockRecord;
|
|
40
|
+
verdict: Extract<IdentityVerdict, 'dead' | 'mismatch'>;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'corrupt';
|
|
43
|
+
};
|
|
44
|
+
/** How long a torn or unreadable lock is re-read before it counts as corrupt. */
|
|
45
|
+
export declare const CORRUPT_LOCK_GRACE_MS = 500;
|
|
46
|
+
/** A takeover mutex older than this belonged to a process that died mid-recovery. */
|
|
47
|
+
export declare const TAKEOVER_MUTEX_TTL_MS = 30000;
|
|
48
|
+
export declare const TAKEOVER_ATTEMPTS = 20;
|
|
49
|
+
export declare const TAKEOVER_RETRY_MS = 50;
|
|
50
|
+
export interface LockDeps extends IdentityDeps {
|
|
51
|
+
ownerScope?: 'app' | 'cli';
|
|
52
|
+
now?: () => number;
|
|
53
|
+
sleep?: (ms: number) => Promise<void>;
|
|
54
|
+
/** Own start identity; injected in tests. */
|
|
55
|
+
selfStartId?: () => Promise<string | undefined>;
|
|
56
|
+
}
|
|
57
|
+
/** Resolve symlinks so `/tmp/x` and `/private/tmp/x` are one scope; unresolvable paths stay as given. */
|
|
58
|
+
export declare function canonicalDataFolder(root: string): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Read the record. A record being written at this instant parses as garbage, so an unreadable file
|
|
61
|
+
* is re-read for `CORRUPT_LOCK_GRACE_MS` before the caller is told it is corrupt.
|
|
62
|
+
*/
|
|
63
|
+
export declare function readLockRecord(path: string, deps?: LockDeps): Promise<LockRecord | undefined | 'corrupt'>;
|
|
64
|
+
export declare function parseLockRecord(text: string): LockRecord | undefined;
|
|
65
|
+
export declare function inspectLock(layout: DataLayout, deps?: LockDeps): Promise<LockState>;
|
|
66
|
+
export declare class InstanceLock {
|
|
67
|
+
private readonly handle;
|
|
68
|
+
private readonly path;
|
|
69
|
+
private current;
|
|
70
|
+
private readonly deps;
|
|
71
|
+
private constructor();
|
|
72
|
+
get record(): LockRecord;
|
|
73
|
+
get instanceId(): string;
|
|
74
|
+
/**
|
|
75
|
+
* Become the owner, or fail with `CORE_ALREADY_RUNNING` describing who holds it. A stale lock is
|
|
76
|
+
* recovered under a mutex so concurrent starters produce exactly one owner.
|
|
77
|
+
*/
|
|
78
|
+
static acquire(layout: DataLayout, deps?: LockDeps): Promise<InstanceLock>;
|
|
79
|
+
/** Announce the bound control listener. Until this lands, clients see `state: "starting"`. */
|
|
80
|
+
publish(controlHost: string, controlPort: number): Promise<void>;
|
|
81
|
+
/** Release only what is still ours: a lock taken over by someone else is left alone. */
|
|
82
|
+
release(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export declare function alreadyRunning(record: LockRecord, verdict: 'match' | 'unknown'): AtomicCoreError;
|
|
85
|
+
export interface WaitForOwnerOptions extends LockDeps {
|
|
86
|
+
timeoutMs?: number;
|
|
87
|
+
pollMs?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Wait until an owner publishes its control endpoint. Used by a client that just launched a core:
|
|
91
|
+
* it must not dial before the listener is bound, and must give up when the launched process dies.
|
|
92
|
+
*/
|
|
93
|
+
export declare function waitForPublishedOwner(layout: DataLayout, options?: WaitForOwnerOptions): Promise<LockRecord>;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One core owner per data folder (PLAN.md §3.4, §3.6).
|
|
3
|
+
*
|
|
4
|
+
* `<data>/atomic-core/instance.lock` is created exclusively (`open` with `wx`); its record carries
|
|
5
|
+
* the owner's PID *and* start identity, so a client can tell a live owner from a recycled PID. The
|
|
6
|
+
* record is written twice: `starting` when the lock is taken and `ready` once the control listener
|
|
7
|
+
* is bound, so a client never dials a port that is not listening yet.
|
|
8
|
+
*
|
|
9
|
+
* Recovering a stale lock is itself serialised through a second exclusive file, otherwise two
|
|
10
|
+
* clients that start together both decide the lock is stale and both become owner. A lock whose
|
|
11
|
+
* owner is alive — or whose liveness cannot be disproven — is never taken over.
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { mkdir, open, readFile, rm, stat } from 'node:fs/promises';
|
|
15
|
+
import { realpath } from 'node:fs/promises';
|
|
16
|
+
import { AtomicCoreError, CONTROL_PROTOCOL_VERSION } from '../contracts/index.js';
|
|
17
|
+
import { CORE_VERSION } from '../version.js';
|
|
18
|
+
import { identityPermitsTakeover, processStartEpoch, processStartId, verifyProcessIdentity, } from './process-identity.js';
|
|
19
|
+
/** How long a torn or unreadable lock is re-read before it counts as corrupt. */
|
|
20
|
+
export const CORRUPT_LOCK_GRACE_MS = 500;
|
|
21
|
+
/** A takeover mutex older than this belonged to a process that died mid-recovery. */
|
|
22
|
+
export const TAKEOVER_MUTEX_TTL_MS = 30_000;
|
|
23
|
+
export const TAKEOVER_ATTEMPTS = 20;
|
|
24
|
+
export const TAKEOVER_RETRY_MS = 50;
|
|
25
|
+
const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
26
|
+
const isEnoent = (e) => e.code === 'ENOENT';
|
|
27
|
+
const isEexist = (e) => e.code === 'EEXIST';
|
|
28
|
+
/** Resolve symlinks so `/tmp/x` and `/private/tmp/x` are one scope; unresolvable paths stay as given. */
|
|
29
|
+
export async function canonicalDataFolder(root) {
|
|
30
|
+
return realpath(root).catch(() => root);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Read the record. A record being written at this instant parses as garbage, so an unreadable file
|
|
34
|
+
* is re-read for `CORRUPT_LOCK_GRACE_MS` before the caller is told it is corrupt.
|
|
35
|
+
*/
|
|
36
|
+
export async function readLockRecord(path, deps = {}) {
|
|
37
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
38
|
+
const now = deps.now ?? Date.now;
|
|
39
|
+
const deadline = now() + CORRUPT_LOCK_GRACE_MS;
|
|
40
|
+
for (;;) {
|
|
41
|
+
let text;
|
|
42
|
+
try {
|
|
43
|
+
text = await readFile(path, 'utf8');
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
if (isEnoent(e))
|
|
47
|
+
return undefined;
|
|
48
|
+
throw new AtomicCoreError('IO_ERROR', `Cannot read the instance lock at ${path}`, e.message);
|
|
49
|
+
}
|
|
50
|
+
const parsed = parseLockRecord(text);
|
|
51
|
+
if (parsed)
|
|
52
|
+
return parsed;
|
|
53
|
+
if (now() >= deadline)
|
|
54
|
+
return 'corrupt';
|
|
55
|
+
await sleep(25);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function parseLockRecord(text) {
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = JSON.parse(text);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (!raw || typeof raw !== 'object')
|
|
67
|
+
return undefined;
|
|
68
|
+
const r = raw;
|
|
69
|
+
if (typeof r['instance_id'] !== 'string' || typeof r['pid'] !== 'number')
|
|
70
|
+
return undefined;
|
|
71
|
+
return {
|
|
72
|
+
instance_id: r['instance_id'],
|
|
73
|
+
owner_scope: r['owner_scope'] === 'app' || r['owner_scope'] === 'cli' ? r['owner_scope'] : undefined,
|
|
74
|
+
pid: r['pid'],
|
|
75
|
+
process_start_id: typeof r['process_start_id'] === 'string' ? r['process_start_id'] : null,
|
|
76
|
+
owner_started_at: typeof r['owner_started_at'] === 'string' ? r['owner_started_at'] : null,
|
|
77
|
+
protocol: typeof r['protocol'] === 'number' ? r['protocol'] : 0,
|
|
78
|
+
version: typeof r['version'] === 'string' ? r['version'] : '',
|
|
79
|
+
data_folder: typeof r['data_folder'] === 'string' ? r['data_folder'] : '',
|
|
80
|
+
control_host: typeof r['control_host'] === 'string' ? r['control_host'] : '',
|
|
81
|
+
control_port: typeof r['control_port'] === 'number' ? r['control_port'] : 0,
|
|
82
|
+
state: r['state'] === 'ready' ? 'ready' : 'starting',
|
|
83
|
+
acquired_at: typeof r['acquired_at'] === 'string' ? r['acquired_at'] : '',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export async function inspectLock(layout, deps = {}) {
|
|
87
|
+
const record = await readLockRecord(layout.core.instanceLock, deps);
|
|
88
|
+
if (record === undefined)
|
|
89
|
+
return { kind: 'free' };
|
|
90
|
+
if (record === 'corrupt')
|
|
91
|
+
return { kind: 'corrupt' };
|
|
92
|
+
const verdict = await verifyProcessIdentity(record.pid, record.process_start_id, deps);
|
|
93
|
+
return identityPermitsTakeover(verdict)
|
|
94
|
+
? { kind: 'stale', record, verdict: verdict }
|
|
95
|
+
: { kind: 'owned', record, verdict: verdict };
|
|
96
|
+
}
|
|
97
|
+
export class InstanceLock {
|
|
98
|
+
handle;
|
|
99
|
+
path;
|
|
100
|
+
current;
|
|
101
|
+
deps;
|
|
102
|
+
constructor(handle, path, current, deps) {
|
|
103
|
+
this.handle = handle;
|
|
104
|
+
this.path = path;
|
|
105
|
+
this.current = current;
|
|
106
|
+
this.deps = deps;
|
|
107
|
+
}
|
|
108
|
+
get record() {
|
|
109
|
+
return { ...this.current };
|
|
110
|
+
}
|
|
111
|
+
get instanceId() {
|
|
112
|
+
return this.current.instance_id;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Become the owner, or fail with `CORE_ALREADY_RUNNING` describing who holds it. A stale lock is
|
|
116
|
+
* recovered under a mutex so concurrent starters produce exactly one owner.
|
|
117
|
+
*/
|
|
118
|
+
static async acquire(layout, deps = {}) {
|
|
119
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
120
|
+
const path = layout.core.instanceLock;
|
|
121
|
+
await mkdir(layout.core.dir, { recursive: true });
|
|
122
|
+
const dataFolder = await canonicalDataFolder(layout.root);
|
|
123
|
+
// Two probes of the same process; on Windows each is a PowerShell start, so they run together.
|
|
124
|
+
const [selfId, ownerStartedAt] = await Promise.all([
|
|
125
|
+
deps.selfStartId ? deps.selfStartId() : processStartId(process.pid, deps),
|
|
126
|
+
processStartEpoch(process.pid, deps),
|
|
127
|
+
]);
|
|
128
|
+
for (let attempt = 0; attempt < TAKEOVER_ATTEMPTS; attempt++) {
|
|
129
|
+
const handle = await open(path, 'wx').catch((e) => {
|
|
130
|
+
if (isEexist(e))
|
|
131
|
+
return undefined;
|
|
132
|
+
throw new AtomicCoreError('IO_ERROR', `Cannot create the instance lock at ${path}`, e.message);
|
|
133
|
+
});
|
|
134
|
+
if (handle) {
|
|
135
|
+
const record = {
|
|
136
|
+
instance_id: randomUUID(),
|
|
137
|
+
owner_scope: deps.ownerScope ?? 'cli',
|
|
138
|
+
pid: process.pid,
|
|
139
|
+
process_start_id: selfId ?? null,
|
|
140
|
+
owner_started_at: ownerStartedAt ?? null,
|
|
141
|
+
protocol: CONTROL_PROTOCOL_VERSION,
|
|
142
|
+
version: CORE_VERSION,
|
|
143
|
+
data_folder: dataFolder,
|
|
144
|
+
control_host: '',
|
|
145
|
+
control_port: 0,
|
|
146
|
+
state: 'starting',
|
|
147
|
+
acquired_at: new Date().toISOString(),
|
|
148
|
+
};
|
|
149
|
+
await writeRecord(handle, record).catch(async (e) => {
|
|
150
|
+
await handle.close().catch(() => { });
|
|
151
|
+
await rm(path, { force: true }).catch(() => { });
|
|
152
|
+
throw e;
|
|
153
|
+
});
|
|
154
|
+
return new InstanceLock(handle, path, record, deps);
|
|
155
|
+
}
|
|
156
|
+
const state = await inspectLock(layout, deps);
|
|
157
|
+
if (state.kind === 'owned')
|
|
158
|
+
throw alreadyRunning(state.record, state.verdict);
|
|
159
|
+
if (state.kind === 'free')
|
|
160
|
+
continue; // the holder released between our attempts
|
|
161
|
+
// stale or corrupt: recover, but only one starter at a time
|
|
162
|
+
const recovered = await tryRecoverStale(layout, deps);
|
|
163
|
+
if (!recovered)
|
|
164
|
+
await sleep(TAKEOVER_RETRY_MS);
|
|
165
|
+
}
|
|
166
|
+
throw new AtomicCoreError('CORE_START_FAILED', 'Could not acquire the core instance lock.', `${path} kept changing hands across ${TAKEOVER_ATTEMPTS} attempts`);
|
|
167
|
+
}
|
|
168
|
+
/** Announce the bound control listener. Until this lands, clients see `state: "starting"`. */
|
|
169
|
+
async publish(controlHost, controlPort) {
|
|
170
|
+
this.current = { ...this.current, control_host: controlHost, control_port: controlPort, state: 'ready' };
|
|
171
|
+
await writeRecord(this.handle, this.current);
|
|
172
|
+
}
|
|
173
|
+
/** Release only what is still ours: a lock taken over by someone else is left alone. */
|
|
174
|
+
async release() {
|
|
175
|
+
await this.handle.close().catch(() => { });
|
|
176
|
+
const onDisk = await readLockRecord(this.path, this.deps).catch(() => undefined);
|
|
177
|
+
if (onDisk && onDisk !== 'corrupt' && onDisk.instance_id !== this.current.instance_id)
|
|
178
|
+
return;
|
|
179
|
+
await rm(this.path, { force: true }).catch(() => { });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function writeRecord(handle, record) {
|
|
183
|
+
const bytes = Buffer.from(`${JSON.stringify(record, null, 2)}\n`);
|
|
184
|
+
await handle.truncate(0);
|
|
185
|
+
await handle.write(bytes, 0, bytes.length, 0);
|
|
186
|
+
await handle.sync().catch(() => { });
|
|
187
|
+
}
|
|
188
|
+
export function alreadyRunning(record, verdict) {
|
|
189
|
+
const where = record.control_port ? `${record.control_host}:${record.control_port}` : 'not yet published';
|
|
190
|
+
const proof = verdict === 'match' ? 'confirmed' : 'could not be disproven';
|
|
191
|
+
return new AtomicCoreError('CORE_ALREADY_RUNNING', 'Another Atomic Chat core already owns this data folder.', `pid ${record.pid} (${proof}), instance ${record.instance_id}, control ${where}`);
|
|
192
|
+
}
|
|
193
|
+
/** Returns true when this caller performed the recovery; false when someone else is doing it. */
|
|
194
|
+
async function tryRecoverStale(layout, deps) {
|
|
195
|
+
const now = deps.now ?? Date.now;
|
|
196
|
+
const mutexPath = `${layout.core.instanceLock}.takeover`;
|
|
197
|
+
const mutex = await open(mutexPath, 'wx').catch(async (e) => {
|
|
198
|
+
if (!isEexist(e))
|
|
199
|
+
throw new AtomicCoreError('IO_ERROR', `Cannot create ${mutexPath}`, e.message);
|
|
200
|
+
const age = await stat(mutexPath).then((s) => now() - s.mtimeMs, () => 0);
|
|
201
|
+
if (age > TAKEOVER_MUTEX_TTL_MS)
|
|
202
|
+
await rm(mutexPath, { force: true }).catch(() => { });
|
|
203
|
+
return undefined;
|
|
204
|
+
});
|
|
205
|
+
if (!mutex)
|
|
206
|
+
return false;
|
|
207
|
+
try {
|
|
208
|
+
await mutex.write(Buffer.from(`${process.pid}\n`));
|
|
209
|
+
// Re-check under the mutex: the previous reader's verdict may be out of date.
|
|
210
|
+
const state = await inspectLock(layout, deps);
|
|
211
|
+
if (state.kind === 'owned')
|
|
212
|
+
throw alreadyRunning(state.record, state.verdict);
|
|
213
|
+
if (state.kind === 'stale' || state.kind === 'corrupt') {
|
|
214
|
+
await rm(layout.core.instanceLock, { force: true });
|
|
215
|
+
}
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
await mutex.close().catch(() => { });
|
|
220
|
+
await rm(mutexPath, { force: true }).catch(() => { });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Wait until an owner publishes its control endpoint. Used by a client that just launched a core:
|
|
225
|
+
* it must not dial before the listener is bound, and must give up when the launched process dies.
|
|
226
|
+
*/
|
|
227
|
+
export async function waitForPublishedOwner(layout, options = {}) {
|
|
228
|
+
const now = options.now ?? Date.now;
|
|
229
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
230
|
+
const deadline = now() + (options.timeoutMs ?? 15_000);
|
|
231
|
+
for (;;) {
|
|
232
|
+
const state = await inspectLock(layout, options);
|
|
233
|
+
if (state.kind === 'owned' && state.record.state === 'ready')
|
|
234
|
+
return state.record;
|
|
235
|
+
if (now() >= deadline) {
|
|
236
|
+
const detail = state.kind === 'owned'
|
|
237
|
+
? `owner pid ${state.record.pid} did not publish a control port in time`
|
|
238
|
+
: `no live owner appeared (${state.kind})`;
|
|
239
|
+
throw new AtomicCoreError('CORE_START_FAILED', 'The Atomic Chat core did not become ready.', detail);
|
|
240
|
+
}
|
|
241
|
+
await sleep(options.pollMs ?? 25);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=instance-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../../src/lock/instance-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads what the desktop app's legacy runtime is holding, so the core does not load a model the app
|
|
3
|
+
* already has (PLAN.md §3.4, "Coexistence with legacy").
|
|
4
|
+
*
|
|
5
|
+
* Until the app becomes a core client, both runtimes can be live on one data folder. Two copies of
|
|
6
|
+
* one model double the VRAM and race for the GPU, and neither side can ask the other over IPC — so
|
|
7
|
+
* the app's llama.cpp plugin mirrors its session table to
|
|
8
|
+
* `<data>/atomic-core/legacy-runtime.json` and the core refuses before it mutates anything.
|
|
9
|
+
*
|
|
10
|
+
* Advisory by design: a file whose PID is gone is ignored (a crashed app holds nothing), an
|
|
11
|
+
* unreadable or malformed file means "nothing known", and the check never blocks on IO for long.
|
|
12
|
+
*/
|
|
13
|
+
import type { DataLayout } from '../config/index.js';
|
|
14
|
+
export declare const LEGACY_RUNTIME_FILE = "legacy-runtime.json";
|
|
15
|
+
export interface LegacySession {
|
|
16
|
+
model_id: string;
|
|
17
|
+
port: number;
|
|
18
|
+
pid: number;
|
|
19
|
+
is_embedding: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface LegacyRuntimeState {
|
|
22
|
+
/** The desktop app's PID. */
|
|
23
|
+
pid: number;
|
|
24
|
+
owner_start_id?: string;
|
|
25
|
+
updated_at: number;
|
|
26
|
+
provider: string;
|
|
27
|
+
sessions: LegacySession[];
|
|
28
|
+
}
|
|
29
|
+
export interface LegacyGuardDeps {
|
|
30
|
+
alive?: (pid: number) => boolean;
|
|
31
|
+
startId?: (pid: number) => Promise<string | undefined>;
|
|
32
|
+
read?: (path: string) => Promise<string | undefined>;
|
|
33
|
+
}
|
|
34
|
+
export declare function parseLegacyRuntimeState(text: string): LegacyRuntimeState | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* What the app holds right now, or `undefined` when it holds nothing we can prove: no file, a file
|
|
37
|
+
* we cannot parse, or one written by a process that is gone.
|
|
38
|
+
*/
|
|
39
|
+
export declare function readLegacyRuntime(layout: DataLayout, deps?: LegacyGuardDeps): Promise<LegacyRuntimeState | undefined>;
|
|
40
|
+
/** The live legacy session for a model, if the app has it loaded. */
|
|
41
|
+
export declare function legacySessionFor(state: LegacyRuntimeState | undefined, modelId: string): LegacySession | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Refuse a load the desktop app already owns. Called before anything is spawned, so the user gets a
|
|
44
|
+
* sentence they can act on instead of a second copy of the model competing for the GPU.
|
|
45
|
+
*/
|
|
46
|
+
export declare function assertNotLoadedByLegacy(layout: DataLayout, modelId: string, deps?: LegacyGuardDeps): Promise<void>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads what the desktop app's legacy runtime is holding, so the core does not load a model the app
|
|
3
|
+
* already has (PLAN.md §3.4, "Coexistence with legacy").
|
|
4
|
+
*
|
|
5
|
+
* Until the app becomes a core client, both runtimes can be live on one data folder. Two copies of
|
|
6
|
+
* one model double the VRAM and race for the GPU, and neither side can ask the other over IPC — so
|
|
7
|
+
* the app's llama.cpp plugin mirrors its session table to
|
|
8
|
+
* `<data>/atomic-core/legacy-runtime.json` and the core refuses before it mutates anything.
|
|
9
|
+
*
|
|
10
|
+
* Advisory by design: a file whose PID is gone is ignored (a crashed app holds nothing), an
|
|
11
|
+
* unreadable or malformed file means "nothing known", and the check never blocks on IO for long.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile } from 'node:fs/promises';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { AtomicCoreError } from '../contracts/index.js';
|
|
16
|
+
import { isProcessAlive, processStartEpoch } from './process-identity.js';
|
|
17
|
+
export const LEGACY_RUNTIME_FILE = 'legacy-runtime.json';
|
|
18
|
+
export function parseLegacyRuntimeState(text) {
|
|
19
|
+
let raw;
|
|
20
|
+
try {
|
|
21
|
+
raw = JSON.parse(text);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
if (!raw || typeof raw !== 'object')
|
|
27
|
+
return undefined;
|
|
28
|
+
const r = raw;
|
|
29
|
+
if (typeof r['pid'] !== 'number')
|
|
30
|
+
return undefined;
|
|
31
|
+
const sessions = Array.isArray(r['sessions']) ? r['sessions'] : [];
|
|
32
|
+
return {
|
|
33
|
+
pid: r['pid'],
|
|
34
|
+
...(typeof r['owner_start_id'] === 'string' ? { owner_start_id: r['owner_start_id'] } : {}),
|
|
35
|
+
updated_at: typeof r['updated_at'] === 'number' ? r['updated_at'] : 0,
|
|
36
|
+
provider: typeof r['provider'] === 'string' ? r['provider'] : 'llamacpp-upstream',
|
|
37
|
+
sessions: sessions.filter(isLegacySession),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function isLegacySession(value) {
|
|
41
|
+
if (!value || typeof value !== 'object')
|
|
42
|
+
return false;
|
|
43
|
+
const s = value;
|
|
44
|
+
return typeof s['model_id'] === 'string' && typeof s['pid'] === 'number';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* What the app holds right now, or `undefined` when it holds nothing we can prove: no file, a file
|
|
48
|
+
* we cannot parse, or one written by a process that is gone.
|
|
49
|
+
*/
|
|
50
|
+
export async function readLegacyRuntime(layout, deps = {}) {
|
|
51
|
+
const read = deps.read ??
|
|
52
|
+
((path) => readFile(path, 'utf8').then((t) => t, () => undefined));
|
|
53
|
+
const text = await read(join(layout.core.dir, LEGACY_RUNTIME_FILE));
|
|
54
|
+
if (text === undefined)
|
|
55
|
+
return undefined;
|
|
56
|
+
const state = parseLegacyRuntimeState(text);
|
|
57
|
+
if (!state)
|
|
58
|
+
return undefined;
|
|
59
|
+
const alive = deps.alive ?? isProcessAlive;
|
|
60
|
+
// A crashed app leaves a stale table behind; its backends are the reaper's problem, not a reason
|
|
61
|
+
// to refuse the user a model.
|
|
62
|
+
if (!alive(state.pid))
|
|
63
|
+
return undefined;
|
|
64
|
+
if (state.owner_start_id) {
|
|
65
|
+
const actual = await (deps.startId ?? processStartEpoch)(state.pid);
|
|
66
|
+
// Fail closed when the identity cannot be established; only a proven mismatch makes this stale.
|
|
67
|
+
if (actual && actual !== state.owner_start_id)
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return state;
|
|
71
|
+
}
|
|
72
|
+
/** The live legacy session for a model, if the app has it loaded. */
|
|
73
|
+
export function legacySessionFor(state, modelId) {
|
|
74
|
+
return state?.sessions.find((s) => s.model_id === modelId);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Refuse a load the desktop app already owns. Called before anything is spawned, so the user gets a
|
|
78
|
+
* sentence they can act on instead of a second copy of the model competing for the GPU.
|
|
79
|
+
*/
|
|
80
|
+
export async function assertNotLoadedByLegacy(layout, modelId, deps = {}) {
|
|
81
|
+
const state = await readLegacyRuntime(layout, deps);
|
|
82
|
+
const session = legacySessionFor(state, modelId);
|
|
83
|
+
if (!session)
|
|
84
|
+
return;
|
|
85
|
+
throw new AtomicCoreError('CORE_ALREADY_RUNNING', `The Atomic Chat app already has "${modelId}" loaded.`, `unload it in the app, or use it at http://127.0.0.1:${session.port} (app pid ${state.pid})`);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=legacy-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-guard.js","sourceRoot":"","sources":["../../src/lock/legacy-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DataLayout } from '../config/index.js';
|
|
2
|
+
export interface ModelClaim {
|
|
3
|
+
claim_id: string;
|
|
4
|
+
provider: string;
|
|
5
|
+
model_id: string;
|
|
6
|
+
owner_kind: 'core' | 'app';
|
|
7
|
+
owner_pid: number;
|
|
8
|
+
owner_started_at: string | null;
|
|
9
|
+
owner_instance_id: string;
|
|
10
|
+
state: 'loading' | 'ready';
|
|
11
|
+
updated_at: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ModelClaimHandle {
|
|
14
|
+
claim: ModelClaim;
|
|
15
|
+
path: string;
|
|
16
|
+
update(state: ModelClaim['state']): Promise<void>;
|
|
17
|
+
release(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export declare function modelClaimKey(provider: string, modelId: string): string;
|
|
20
|
+
export declare function acquireModelClaim(layout: DataLayout, provider: string, modelId: string, ownerInstanceId: string): Promise<ModelClaimHandle>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** Atomic cross-process ownership claim for a model shared by the app and the core. */
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { AtomicCoreError } from '../contracts/index.js';
|
|
6
|
+
import { isProcessAlive, processStartEpoch } from './process-identity.js';
|
|
7
|
+
export function modelClaimKey(provider, modelId) {
|
|
8
|
+
return createHash('sha256').update(provider).update('\0').update(modelId).digest('hex');
|
|
9
|
+
}
|
|
10
|
+
export async function acquireModelClaim(layout, provider, modelId, ownerInstanceId) {
|
|
11
|
+
await mkdir(layout.core.modelClaims, { recursive: true });
|
|
12
|
+
const path = join(layout.core.modelClaims, modelClaimKey(provider, modelId));
|
|
13
|
+
const claim = {
|
|
14
|
+
claim_id: randomUUID(),
|
|
15
|
+
provider,
|
|
16
|
+
model_id: modelId,
|
|
17
|
+
owner_kind: 'core',
|
|
18
|
+
owner_pid: process.pid,
|
|
19
|
+
owner_started_at: (await processStartEpoch(process.pid)) ?? null,
|
|
20
|
+
owner_instance_id: ownerInstanceId,
|
|
21
|
+
state: 'loading',
|
|
22
|
+
updated_at: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
25
|
+
try {
|
|
26
|
+
await mkdir(path);
|
|
27
|
+
await writeClaim(path, claim);
|
|
28
|
+
return handle(path, claim);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
if (e.code !== 'EEXIST')
|
|
32
|
+
throw e;
|
|
33
|
+
const existing = await readClaim(path);
|
|
34
|
+
if (existing?.owner_kind === 'core' && existing.owner_instance_id === ownerInstanceId)
|
|
35
|
+
return handle(path, existing);
|
|
36
|
+
if (!existing || !(await claimOwnerIsStale(existing))) {
|
|
37
|
+
throw new AtomicCoreError('CORE_ALREADY_RUNNING', `Another runtime already owns "${modelId}".`, existing ? `${existing.owner_kind} pid ${existing.owner_pid} (${existing.state})` : path);
|
|
38
|
+
}
|
|
39
|
+
const stale = `${path}.stale-${randomUUID()}`;
|
|
40
|
+
await rename(path, stale).catch(() => undefined);
|
|
41
|
+
await rm(stale, { recursive: true, force: true }).catch(() => undefined);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new AtomicCoreError('CORE_ALREADY_RUNNING', `Could not claim "${modelId}".`);
|
|
45
|
+
}
|
|
46
|
+
async function claimOwnerIsStale(claim) {
|
|
47
|
+
if (!isProcessAlive(claim.owner_pid))
|
|
48
|
+
return true;
|
|
49
|
+
if (!claim.owner_started_at)
|
|
50
|
+
return false;
|
|
51
|
+
const actual = await processStartEpoch(claim.owner_pid);
|
|
52
|
+
return actual !== undefined && actual !== claim.owner_started_at;
|
|
53
|
+
}
|
|
54
|
+
async function readClaim(path) {
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(await readFile(join(path, 'claim.json'), 'utf8'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function writeClaim(path, claim) {
|
|
63
|
+
const target = join(path, 'claim.json');
|
|
64
|
+
const temp = join(path, `claim.${claim.claim_id}.${randomUUID()}.tmp`);
|
|
65
|
+
await writeFile(temp, `${JSON.stringify(claim, null, 2)}\n`);
|
|
66
|
+
await rename(temp, target);
|
|
67
|
+
}
|
|
68
|
+
function handle(path, claim) {
|
|
69
|
+
return {
|
|
70
|
+
claim,
|
|
71
|
+
path,
|
|
72
|
+
async update(state) {
|
|
73
|
+
claim.state = state;
|
|
74
|
+
claim.updated_at = new Date().toISOString();
|
|
75
|
+
await writeClaim(path, claim);
|
|
76
|
+
},
|
|
77
|
+
async release() {
|
|
78
|
+
const current = await readClaim(path);
|
|
79
|
+
if (current?.claim_id === claim.claim_id)
|
|
80
|
+
await rm(path, { recursive: true, force: true });
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=model-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-claim.js","sourceRoot":"","sources":["../../src/lock/model-claim.ts"],"names":[],"mappings":"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"}
|